gitxsm 1 год назад
Родитель
Сommit
dcbeecb907

+ 1 - 0
script/common/LogDefine.lua

@@ -262,6 +262,7 @@ DEFINE = {
 	racialTrial				= 752,			-- 种族挑战
 	lotteryByDiamonds		= 753,			--古玉充能
 	talisman				= 754,			--秘宝
+	duobaoqibing			= 755,			--夺宝奇兵
 }
 
 

+ 9 - 0
script/common/ProtoID.lua

@@ -1308,3 +1308,12 @@ _ENV[1338]="CG_TALISMAN_QUERY"
 _ENV[1339]="GC_TALISMAN_QUERY"
 _ENV[1340]="CG_TALISMAN_UPGRADE"
 _ENV[1341]="GC_TALISMAN_UPGRADE"
+_ENV[1345]="GC_DBQB_QUERY"
+_ENV[1346]="CG_DBQB_LOTTERY"
+_ENV[1347]="GC_DBQB_LOTTERY"
+_ENV[1348]="CG_DBQB_RESET"
+_ENV[1349]="GC_DBQB_RESET"
+_ENV[1350]="CG_DBQB_START_GAME"
+_ENV[1351]="GC_DBQB_START_GAME"
+_ENV[1352]="CG_DBQB_TIPS"
+_ENV[1353]="GC_DBQB_TIPS"

+ 1 - 0
script/module/absAct/AbsActDefine.lua

@@ -29,6 +29,7 @@ ABS_ACT_TYPE_29 = 29  -- 古玉充能
 
 ABS_ACT_TYPE_30 = 30 -- 元宵双倍
 ABS_ACT_TYPE_31 = 31 -- 元宵新年卡
+ABS_ACT_TYPE_32 = 32 -- 限时夺宝/夺宝奇兵活动
 ABS_ACT_TYPE_33 = 33 -- 元宵喜庆来年
 ABS_ACT_TYPE_34 = 34 -- 魔兽双倍洗练
 ABS_ACT_TYPE_35 = 35 -- 新英雄抽卡

+ 3 - 0
script/module/absAct/AbsActLogic.lua

@@ -46,6 +46,7 @@ local DailyFixedTaskLogic = require("absAct.DailyFixedTaskLogic")
 local AbsSignGiftLogic = require("absAct.AbsSignGiftLogic")
 local NewHeroLogic = require("absAct.NewHeroLogic")
 local LotteryByDiamondLogic = require("absAct.LotteryByDiamondLogic")
+local DuoBaoQiBingLogic = require("absAct.DuoBaoQiBingLogic")
 
 ABS_ACT_TYPE_LIST = nil
 function initAfterHot()
@@ -291,6 +292,8 @@ function actDetailQuery(human, id)
         AbsSignGiftLogic.getAndSendMsg(human, id)
     elseif config.type == AbsActDefine.ABS_ACT_TYPE_31 then
         DailyFixedTaskLogic.getAndSendMsg(human, id)
+    elseif config.type == AbsActDefine.ABS_ACT_TYPE_32 then
+        DuoBaoQiBingLogic.Query(human, id)
     elseif config.type == AbsActDefine.ABS_ACT_TYPE_33 then
         FestivalSevenDayCardLogic.getAndSendMsg(human, id)
     elseif config.type == AbsActDefine.ABS_ACT_TYPE_35 then

+ 409 - 0
script/module/absAct/DuoBaoQiBingLogic.lua

@@ -0,0 +1,409 @@
+--夺宝奇兵活动
+--玩法: 从四条配置中各随机一个奖励, 然后把这4个奖励按照一定数量组成一个奖池给玩家抽奖, 奖励抽到后就减少
+--注意事项:活动开启期间, 不能改4条配置中prizeData里各个奖励的顺序,因为服务器存储的是随机到的奖励的index
+--db
+--[=[
+        human.db.absAct[id] = {
+            awardData = {
+                [type] = {idx = 1, cnt = 1}, --key为奖池类型,idx为配置中随机到的奖励index,cnt表示当前奖励数量
+            },
+
+            isFreeReset = nil,    --免费重置标识, 1-免费
+
+            posData = {         --已经抽奖的位置, pos为位置
+                [pos] = {poolType = poolType, idx = idx}
+            },
+            isStart = nil,         --是否开始游戏
+            isTips = nil,          --提示, 为0时不提示,其他情况都提示
+            dailyFreeState = nil,  --每日单抽免费标识,为0时不免费,其他情况免费
+        }
+    }
+]=]--
+
+local Msg = require("core.Msg")
+local Grid = require("bag.Grid")
+local Util = require("common.Util")
+local BagLogic = require("bag.BagLogic")
+local ItemDefine = require("bag.ItemDefine")
+local AbsActLogic = require("absAct.AbsActLogic")
+local Broadcast = require("broadcast.Broadcast")
+local Lang = require("common.Lang")
+local duobaoCfg = require("excel.absAct").DuoBaoQiBing
+local YunYingLogic = require("yunying.YunYingLogic")
+local AbsActExcel = require("excel.absAct")
+
+local LOGTYPE = "duobaoqibing"      --日志标识
+local POOL1CNT = 30                 --从奖池1中抽取的奖励数量
+local POOL2CNT = 12                 --从奖池2中抽取的奖励数量
+local POOL3CNT = 2                  --从奖池3中抽取的奖励数量
+local POOL4CNT = 1                  --从奖池4中抽取的奖励数量
+local LOTTERYCOSTCNT = 400          --单抽消耗数量
+local RESETCOSTCNT = 1000           --重置消耗数量
+local COSTITEMID = ItemDefine.ITEM_ZUANSHI_ID  --单抽/重置消耗的道具id
+
+
+local function getAwardNumByType(poolType)
+    local num = 0
+    if not poolType then
+        return num
+    end
+    if poolType == 1 then
+        num = POOL1CNT
+    elseif poolType == 2 then
+        num = POOL2CNT
+    elseif poolType == 3 then
+        num = POOL3CNT
+    elseif poolType == 4 then
+        num = POOL4CNT
+    end
+    return num
+end
+
+
+
+--从配置中随机一个奖励,并返回奖励的index
+local function getAwardIdx(awardCfg)
+    local totalWeight = 0
+    for _, v in ipairs(awardCfg.prizeData) do
+        totalWeight = totalWeight + v[3]
+    end
+    local randWeight = math.random(0, totalWeight)
+
+    local weight, randIdx = 0, 0
+    for idx, data in ipairs(awardCfg.prizeData) do
+        weight = weight + data[3]
+        if randWeight <= weight then
+            randIdx = idx
+            break
+        end
+    end
+    return randIdx
+end
+
+--生成奖励数据
+local function generateAwardData(human, id)
+    human.db.absAct[id] = human.db.absAct[id] or {}
+    local actData = human.db.absAct[id]
+    actData.awardData = actData.awardData or {}
+    local awardData = actData.awardData
+
+    for type, cfg in ipairs(duobaoCfg) do
+        local awardIdx = getAwardIdx(cfg)
+        awardData[type] = {
+            idx = awardIdx,
+            cnt = getAwardNumByType(type),
+            --type = type
+        }
+    end
+end
+
+--填充协议数据
+local function populateMsg(actData, msgTb)
+    local awardData = actData.awardData
+    local posData = actData.posData
+
+    local awardNum, len = 0, 0
+    for i=1, 4 do
+        awardNum = getAwardNumByType(i)
+        local awardIdx = awardData[i].idx
+        local awardInfo = duobaoCfg[i].prizeData[awardIdx]
+
+        for j=1, awardNum do
+            len = len + 1
+            msgTb[len].isGet = 0
+            msgTb[len].poolType = i
+            msgTb[len].index = len
+            
+            Grid.makeItem(msgTb[len].item, awardInfo[1], awardInfo[2])
+
+            if posData and posData[len] then
+                msgTb[len].isGet = 1
+                local poolType = posData[len].poolType
+
+                --奖池类型不一样, 说明该位置抽到的是别的奖池的道具, 需要修改道具信息
+                if poolType ~= i then
+                    msgTb[len].poolType = poolType
+                    awardIdx = posData[len].idx
+                    local realAwardInfo = duobaoCfg[poolType].prizeData[awardIdx]
+                    Grid.makeItem(msgTb[len].item, realAwardInfo[1], realAwardInfo[2])
+                end
+            end
+        end
+    end
+    msgTb[0] = len
+end
+
+--生成抽奖数据
+local function generateLotteryData(actData)
+    local awardVec = {}
+    local len, totalWeight = 0,0
+    local awardData = actData.awardData
+    for type, data in ipairs(awardData) do
+        if data.cnt > 0 then
+            local awardInfo = duobaoCfg[type].prizeData[data.idx]
+            local itemId = awardInfo[1]
+            local itemNum = awardInfo[2]
+            local weight = awardInfo[3]
+            for i=1, data.cnt do
+                len = len + 1
+                totalWeight = totalWeight + weight
+                awardVec[len] = {itemId, itemNum, weight, type, data.idx}
+            end
+        end
+    end
+    return awardVec, totalWeight
+end
+
+--刷天处理
+function updateDaily(human, id)
+    local state = AbsActLogic.isStarted(human, id)
+    if not state then
+        return
+    end
+
+    local actData = human.db.absAct[id]
+    if not actData then
+        return
+    end
+    actData.isTips = 1
+
+    actData.dailyFreeState = 1
+end
+
+
+function isRed(human, YYInfo, absActConfig)
+    local id = absActConfig.funcID
+    local state = AbsActLogic.isStarted(human, id)
+    if not state then
+        return false
+    end
+
+    local actData = human.db.absAct[id]
+    if not actData then
+        return false
+    end
+
+    if actData.dailyFreeState and actData.dailyFreeState == 0 then
+        return false
+    end
+    return true
+end
+
+
+--查询
+function Query(human, id)
+    local state = AbsActLogic.isStarted(human, id)
+    if not state then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    local actData = human.db.absAct[id]
+    if not actData then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    local msgRet = Msg.gc.GC_DBQB_QUERY
+    msgRet.isFreeReset = actData.isFreeReset or 0
+    msgRet.isStart = actData.isStart or 0
+    msgRet.isTips = 1
+    if actData.isTips and actData.isTips == 0 then
+        msgRet.isTips = 0
+    end
+
+    msgRet.isFree = 0
+    if not actData.dailyFreeState or actData.dailyFreeState == 1 then
+        msgRet.isFree = 1
+    end
+
+    if not actData or not actData.awardData then
+        generateAwardData(human, id)
+    end
+
+    Grid.makeItem(msgRet.lotteryCost, COSTITEMID, LOTTERYCOSTCNT)
+    Grid.makeItem(msgRet.resetCost, COSTITEMID, RESETCOSTCNT)
+    populateMsg(actData, msgRet.awardPoolData)
+
+    Msg.send(msgRet, human.fd)
+end
+
+--奖池重置
+function ResetAwardPool(human, id, resetType)
+    if not id or not resetType then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local state = AbsActLogic.isStarted(human, id)
+    if not state then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    local actData = human.db.absAct[id]
+    if not actData then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    if resetType == 1 then
+        if not actData.isFreeReset or actData.isFreeReset <= 0 then
+            return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+        end
+        actData.isFreeReset = 0
+    elseif resetType == 2 then
+        if BagLogic.getItemCnt(human, COSTITEMID) < RESETCOSTCNT then
+            return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+        end
+        BagLogic.delItem(human, COSTITEMID, RESETCOSTCNT, LOGTYPE)
+    else
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    --重置数据
+    generateAwardData(human, id)
+    actData.posData = nil
+    actData.isStart = 0
+
+    --通知客户端
+    local msgRet = Msg.gc.GC_DBQB_RESET
+    msgRet.isFreeReset = actData.isFreeReset or 0
+    msgRet.isStart = actData.isStart or 0
+
+    populateMsg(actData, msgRet.awardPoolData)
+    Msg.send(msgRet, human.fd)
+end
+
+--抽奖
+function Lottery(human, id, pos)
+    if not id or not pos then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    if 1 > pos or pos > (POOL1CNT + POOL2CNT + POOL3CNT + POOL4CNT) then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local state = AbsActLogic.isStarted(human, id)
+    if not state then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    local actData = human.db.absAct[id]
+    if not actData then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    local posData = actData.posData
+    if posData and posData[pos] then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local itemCnt = LOTTERYCOSTCNT
+    if not actData.dailyFreeState or actData.dailyFreeState == 1 then
+        itemCnt = 0
+        actData.dailyFreeState = 0
+    end
+
+    --扣消耗
+    if itemCnt > 0 then
+        if BagLogic.getItemCnt(human, COSTITEMID) < itemCnt then
+            return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+        end
+        BagLogic.delItem(human, COSTITEMID, itemCnt, LOGTYPE)
+    end
+
+    --抽奖
+    local awardVec, totalWeight = generateLotteryData(actData)
+    if #awardVec <= 0 then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local itemId, itemCnt, weight, poolType, awardIdx = 0,0,0,0,0
+    local randWeight = math.random(0, totalWeight)
+    for _,v in ipairs(awardVec) do
+        weight = weight + v[3]
+        if randWeight <= weight then
+            itemId = v[1]
+            itemCnt = v[2]
+            poolType = v[4]
+            awardIdx = v[5]
+            break
+        end
+    end
+    --BagLogic.addItem(human, itemId, itemCnt, LOGTYPE)
+    BagLogic.addItemList(human, { {itemId, itemCnt}}, LOGTYPE)
+
+    --更新db
+    actData.posData = actData.posData or {}
+    actData.posData[pos] = { poolType = poolType, idx = awardIdx }
+    actData.awardData[poolType].cnt = actData.awardData[poolType].cnt - 1
+    if poolType == 4 then   --抽到特殊奖励, 获得免费刷新奖池一次
+        actData.isFreeReset = 1
+    end
+
+    --通知客户端
+    local msgRet = Msg.gc.GC_DBQB_LOTTERY
+    msgRet.isFreeReset = actData.isFreeReset or 0
+    msgRet.isFree = 0 --有免费次数会优先使用免费次数, 所以抽奖后,免费次数就没有了
+
+    --populateMsg(actData, msgRet.awardPoolData)
+    local posInfo = msgRet.posInfo
+    posInfo.isGet = 1
+    posInfo.poolType = poolType
+    posInfo.index = pos
+    Grid.makeItem(posInfo.item, itemId, itemCnt)
+    Msg.send(msgRet, human.fd)
+
+    --红点刷新
+    if itemCnt == 0 then
+        local config = AbsActExcel.absActivity[id]
+        YunYingLogic.sendGroupUpdate(YYInfo[id], human, config.panelID)
+    end
+end
+
+--点击开始游戏
+function StartGame(human, id)
+    if not id then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local state = AbsActLogic.isStarted(human, id)
+    if not state then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    local actData = human.db.absAct[id]
+    if not actData then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    --修改状态
+    actData.isStart = 1
+
+    --通知客户端
+    local msgRet = Msg.gc.GC_DBQB_START_GAME
+    msgRet.isStart = actData.isStart or 0
+    Msg.send(msgRet, human.fd)
+end
+
+--关闭提示
+function CloseTips(human, id)
+    if not id then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local state = AbsActLogic.isStarted(human, id)
+    if not state then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    local actData = human.db.absAct[id]
+    if not actData then
+        return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
+    end
+
+    --修改状态
+    actData.isTips = 0
+
+    --通知客户端
+    local msgRet = Msg.gc.GC_DBQB_TIPS
+    msgRet.isTips = actData.isTips or 0
+    Msg.send(msgRet, human.fd)
+end

+ 18 - 0
script/module/absAct/Handler.lua

@@ -29,6 +29,7 @@ local FestivalSevenDayCardLogic = require("absAct.FestivalSevenDayCardLogic")
 local AbsSignGiftLogic = require("absAct.AbsSignGiftLogic")
 local NewHeroLogic = require("absAct.NewHeroLogic")
 local LotteryByDiamondLogic = require("absAct.LotteryByDiamondLogic")
+local DuoBaoQiBingLogic = require("absAct.DuoBaoQiBingLogic")
 
 function CG_ABS_ACT_DETAIL_QUERY(human, msg)
     AbsActLogic.actDetailQuery(human,msg.id)
@@ -242,4 +243,21 @@ end
 ------------------------古玉充能活动抽奖-----------------------
 function CG_LOTTERYBYDIAMONDS_LOTTERY(human, msg)
     LotteryByDiamondLogic.Lottery(human, msg.id, msg.type)
+end
+
+----------------------夺宝奇兵活动----------------------------
+function CG_DBQB_LOTTERY(human, msg)
+    DuoBaoQiBingLogic.Lottery(human, msg.id, msg.pos)
+end
+
+function CG_DBQB_RESET(human, msg)
+    DuoBaoQiBingLogic.ResetAwardPool(human, msg.id, msg.type)
+end
+
+function CG_DBQB_START_GAME(human, msg)
+    DuoBaoQiBingLogic.StartGame(human, msg.id)
+end
+
+function CG_DBQB_TIPS(human, msg)
+    DuoBaoQiBingLogic.CloseTips(human, msg.id)
 end

+ 67 - 1
script/module/absAct/Proto.lua

@@ -969,4 +969,70 @@ GC_LOTTERYBYDIAMONDS_LOTTERY = {
     {"points",                    1,  "int"},         -- 普通奖池累积积分
     {"lotteryTimes",              1,  "int"},         -- 稀有奖池可抽奖次数
     {"lottery1cost",              1,  ItemData},      -- 普通奖池抽奖一次消耗
-}
+}
+
+
+
+----------------------------夺宝奇兵--------------------------------------------
+AWARD_INFO = {
+    {"item",              1,  ItemData},        -- 道具数据
+    {"isGet",			  1,  "byte"},          -- 是否已经抽中, 0-未抽中, 1-已抽中
+    {"poolType",		  1,  "byte"},          -- 所属奖池,1-奖池1, 2-奖池2... 以此类推
+    {"index",		      1,  "byte"},          -- key
+}
+--查询返回协议
+GC_DBQB_QUERY = {
+    {"isFreeReset",             1,      "byte"},             -- 是否可以免费重置标识, 0-不可以,1-可以
+    {"isStart",                 1,      "byte"},             -- 是否开始游戏, 0-没有,1-已经开始
+    {"isTips",                 1,       "byte"},             -- 是否提示, 0-不提示,1-提示
+    {"isFree",                 1,       "byte"},             -- 是否免费, 0-不免费,1-免费
+    {"lotteryCost",             1,       ItemData},          -- 单抽消耗
+    {"resetCost",               1,       ItemData},          -- 重置消耗
+    {"awardPoolData",           45,      AWARD_INFO},        -- 奖池数据
+}
+
+--抽奖
+CG_DBQB_LOTTERY = {
+    {"id",			    1,  "int"},     -- 活动ID
+    {"pos",            1,  "byte"},    --位置
+}
+
+GC_DBQB_LOTTERY = {
+    {"isFreeReset",             1,      "byte"},             -- 是否可以免费重置标识, 0-不可以,1-可以
+    {"isFree",                 1,       "byte"},             -- 是否可以免费抽奖, 0-不免费,1-免费
+    {"posInfo",                 1,      AWARD_INFO},          -- 单个奖励数据
+}
+
+
+
+--重置奖池
+CG_DBQB_RESET = {
+    {"id",			    1,      "int"},         -- 活动ID
+    {"type",            1,      "byte"},        --重置类型, 1-免费重置, 2-消耗钻石重置
+}
+
+GC_DBQB_RESET = {
+    {"isFreeReset",             1,      "byte"},             -- 是否可以免费重置标识, 0-不可以,1-可以
+    {"isStart",                 1,      "byte"},             -- 是否开始游戏, 0-没有,1-已经开始
+    {"awardPoolData",           45,      AWARD_INFO},        -- 奖池数据
+}
+
+--点击开始游戏
+CG_DBQB_START_GAME = {
+    {"id",			    1,      "int"},         -- 活动ID
+}
+
+GC_DBQB_START_GAME = {
+    {"isStart",         1,      "byte"},        -- 是否开始游戏, 0-没有,1-已经开始
+}
+
+
+--提示
+CG_DBQB_TIPS = {
+    {"id",			    1,      "int"},         -- 活动ID
+}
+
+GC_DBQB_TIPS = {
+    {"isTips",                 1,       "byte"},             -- 是否提示, 0-不提示,1-提示
+}
+