| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573 |
- local ZhanbuExcel = require("excel.zhanbu")
- local Msg = require("core.Msg")
- local BagLogic = require("bag.BagLogic")
- local HeroGrid = require("hero.HeroGrid")
- local Util = require("common.Util")
- local ObjHuman = require("core.ObjHuman")
- local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
- local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
- local Lang = require("common.Lang")
- local Broadcast = require("broadcast.Broadcast")
- local SysParameter = require("common.SysParameter")
- local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
- local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
- local HeroExcel = require("excel.hero")
- local HeroBook = require("hero.HeroBook")
- local DropExchangeLogic = require("absAct.DropExchangeLogic")
- local HeroGrowUp = require("absAct.HeroGrowUp")
- local MengxinLogic = require("present.MengxinLogic")
- local AbsZhanbuLunpanLogic = require("absAct.AbsZhanbuLunpanLogic")
- local YunYingLogic = require("yunying.YunYingLogic")
- --[[
- pool 卡池
- hand 手牌
- handCnt 手牌数量
- money 拥有道具数量
- lv 卡池等级
- refreshCnt 刷新次数
- ts 道具回复计时
- isGuide 是否新手引导
- handMaxCnt 手牌格子
- heartHero 心仪英雄
- ]]
- local CARD_POOL_MAX_CNT = 5 -- 卡池英雄数量
- local AUTO_GET_MONEY_MAX = 99 -- 自动回复最大道具数量
- local CARD_POOL_REFRESH = 2 -- 刷新卡池所需道具数
- local AUTO_GET_MONEY_TS = 300 -- 自动回复道具时间
- CARD_POOL = CARD_POOL or {}
- function initAfterStart()
- for i = 1,#ZhanbuExcel.pool do
- local grade = ZhanbuExcel.pool[i].grade
- local heroID = ZhanbuExcel.pool[i].heroID
- local weight = ZhanbuExcel.pool[i].weight
- CARD_POOL[grade] = CARD_POOL[grade] or {}
- CARD_POOL[grade].weight = CARD_POOL[grade].weight or 0
- CARD_POOL[grade].weight = CARD_POOL[grade].weight + ZhanbuExcel.pool[i].weight
- CARD_POOL[grade].pool = CARD_POOL[grade].pool or {}
- CARD_POOL[grade].pool[#CARD_POOL[grade].pool + 1] = {heroID,weight,i}
- end
- end
- local function initDB(human)
- if human.db.zhanbu == nil then
- human.db.zhanbu = {}
- local zhanbu = human.db.zhanbu
- zhanbu.hand = {}
- zhanbu.handCnt = 0
- zhanbu.handMaxCnt = 4 -- 最大手牌数为4张
- zhanbu.money = AUTO_GET_MONEY_MAX
- zhanbu.lv = 1
- zhanbu.isGuide = 1
- zhanbu.refreshCnt = 0
- zhanbu.heartHero = {}
- zhanbu.pool = {}
- refreshPool(human)
- end
- -- 老用户没有heartHero
- if human.db.zhanbu.heartHero == nil then
- human.db.zhanbu.heartHero = {}
- end
- local cjPrivilege = ChengjiuLogic.checkPrivilege(human, ChengjiuDefine.PRIVILEGE_TYPE_7)
- if cjPrivilege then
- -- 已激活宝具特权,改为5张
- human.db.zhanbu.handMaxCnt = 5
- else
- if human.db.zhanbu.hand[5] ~= nil then
- -- 线上玩家第五张手牌有牌者,默认激活
- human.db.zhanbu.handMaxCnt = 5
- else
- human.db.zhanbu.handMaxCnt = 4
- end
- end
- end
- function refreshPool(human)
- -- 初始化数据
- initDB(human)
- local totalWeight = 0
- local weightConfig = ZhanbuExcel.poolLv[human.db.zhanbu.lv]
- for i = 1,#weightConfig.weight do
- totalWeight = totalWeight + weightConfig.weight[i]
- end
- -- 另存一份
- local cardPoolTb = Util.copyTable(CARD_POOL)
- for i = 1,#cardPoolTb[3].pool do
- if cardPoolTb[3].pool[i][1] == human.db.zhanbu.heartHero[1] or
- cardPoolTb[3].pool[i][1] == human.db.zhanbu.heartHero[2] or
- cardPoolTb[3].pool[i][1] == human.db.zhanbu.heartHero[3] then
- local newWeight = math.floor(cardPoolTb[3].pool[i][2] * 20 / 100)
- cardPoolTb[3].weight = cardPoolTb[3].weight + newWeight
- cardPoolTb[3].pool[i][2] = cardPoolTb[3].pool[i][2] + newWeight
- end
- end
- -- 卡池五张卡
- for i = 1,CARD_POOL_MAX_CNT do
- local randomGrade = math.random(1,totalWeight)
- -- 抽取级别 R or SR or SSR
- for j = 1,#weightConfig.weight do
- if randomGrade <= weightConfig.weight[j] then
- local randomCard = math.random(1,cardPoolTb[j].weight)
- -- 抽取卡
- for k = 1,#cardPoolTb[j].pool do
- if randomCard <= cardPoolTb[j].pool[k][2] then
- human.db.zhanbu.pool[i] = cardPoolTb[j].pool[k][3]
- break
- end
- randomCard = randomCard - cardPoolTb[j].pool[k][2]
- end
- break
- end
- randomGrade = randomGrade - weightConfig.weight[j]
- end
- end
- end
- function zhanbuQuery(human)
- -- 初始化数据
- initDB(human)
- local msgRet = Msg.gc.GC_ZHANBU_QUERY
- local len = 0
- for i = 1,CARD_POOL_MAX_CNT do
- if human.db.zhanbu.pool[i] ~= nil then
- len = len + 1
- local index = human.db.zhanbu.pool[i]
- local config = ZhanbuExcel.pool[index]
- HeroGrid.makeHeroSimpleByID(msgRet.heroPool[len].heroInfo, config.heroID)
- msgRet.heroPool[len].price = config.price
- msgRet.heroPool[len].index = i
- end
- end
- msgRet.isGuide = human.db.zhanbu.isGuide or 0
- -- 新手引导,将配表中数据放到卡池中
- if human.db.zhanbu.isGuide == 1 then
- len = 0
- sysHeroList = SysParameter.getSysParameterTb(SysParameter.PARAMETER_16)
- for i = 1,#sysHeroList do
- len = len + 1
- local index = sysHeroList[i]
- local config = ZhanbuExcel.pool[index]
- human.db.zhanbu.pool[i] = index
- HeroGrid.makeHeroSimpleByID(msgRet.heroPool[len].heroInfo, config.heroID)
- msgRet.heroPool[len].price = config.price
- msgRet.heroPool[len].index = i
- end
- human.db.zhanbu.isGuide = 0
- end
- msgRet.heroPool[0] = len
- msgRet.isLock = 1
- if human.db.zhanbu.handMaxCnt == 5 then
- msgRet.isLock = 0
- end
- len = 0
- for i = 1,human.db.zhanbu.handMaxCnt do
- if human.db.zhanbu.hand[i] ~= nil then
- len = len + 1
- local index = human.db.zhanbu.hand[i]
- local config = ZhanbuExcel.pool[index]
- HeroGrid.makeHeroSimpleByID(msgRet.hand[len].heroInfo, config.heroID)
- msgRet.hand[len].price = config.price
- msgRet.hand[len].index = i
- end
- end
- msgRet.hand[0] = len
- msgRet.cardRate = Util.copyTable(ZhanbuExcel.poolLv[human.db.zhanbu.lv].weight)
- msgRet.cardRate[0] = 3
- msgRet.lv = human.db.zhanbu.lv
- msgRet.money = human.db.zhanbu.money
- msgRet.moneyMax = AUTO_GET_MONEY_MAX
- msgRet.moneyCost = 1
- msgRet.nextRecover = AUTO_GET_MONEY_TS
- msgRet.recoverTs = AUTO_GET_MONEY_TS
- if human.db.zhanbu.ts then
- local now = os.time()
- msgRet.nextRecover = human.db.zhanbu.ts + AUTO_GET_MONEY_TS - now
- end
- msgRet.hasRed = xinyiDot(human) and 1 or 0
- Msg.send(msgRet,human.fd)
- end
- function buyCard(human,index,heroID)
- -- 错误,数据都没有,乱搞
- if human.db.zhanbu == nil or human.db.zhanbu.pool == nil then
- return
- end
- local heroIndex = human.db.zhanbu.pool[index]
- -- 错误,数据对不上
- local config = ZhanbuExcel.pool[heroIndex]
- if not config or config.heroID ~= heroID then
- return
- end
-
- -- 判断是否可合成碎片
- local sameCnt = 0
- for i = 1,human.db.zhanbu.handMaxCnt do
- if human.db.zhanbu.hand[i] ~= nil and
- human.db.zhanbu.hand[i] == heroIndex then
- sameCnt = sameCnt + 1
- end
- end
-
- -- 判断消耗是否够
- if human.db.zhanbu.money < config.price then
- return Broadcast.sendErr(human,Lang.ABS_ITEM_ERR)
- end
-
- local msgRet = Msg.gc.GC_ZHANBU_BUY_CARD
- -- 可合成碎片
- if sameCnt >= 2 then
- -- 扣除消耗
- human.db.zhanbu.money = human.db.zhanbu.money - config.price
- RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
-
- -- 自动回复计时
- if human.db.zhanbu.money < AUTO_GET_MONEY_MAX then
- human.db.zhanbu.ts = human.db.zhanbu.ts or os.time()
- end
- -- 扣除手牌
- for i = 1,human.db.zhanbu.handMaxCnt do
- if human.db.zhanbu.hand[i] ~= nil and
- human.db.zhanbu.hand[i] == heroIndex then
- human.db.zhanbu.hand[i] = nil
- human.db.zhanbu.handCnt = human.db.zhanbu.handCnt - 1
- end
- end
- -- 从卡池中删除
- human.db.zhanbu.pool[index] = nil
- -- 增加碎片
- local randomCnt = math.random(config.chipCnt[1],config.chipCnt[2])
- local item = {}
- item[config.heroID] = randomCnt
- BagLogic.addItem(human, config.heroID, randomCnt, "zhanbu")
- if config.grade == 3 then
- DropExchangeLogic.drawSSR(human, item, 1)
- end
- local zhanbuActItemID,zhanbuActCnt = AbsZhanbuLunpanLogic.getZhanbuComposeCnt(human, config.grade)
- if zhanbuActCnt and zhanbuActCnt > 0 then
- item[zhanbuActItemID] = zhanbuActCnt
- BagLogic.addItem(human, zhanbuActItemID, zhanbuActCnt, "zhanbu")
- end
- BagLogic.sendItemGetList(human, item, "zhanbu")
-
- msgRet.index = 0
-
- HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE3, 1)
- MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_6,1)
- else
- -- 判断手牌是否已满
- if human.db.zhanbu.handCnt >= human.db.zhanbu.handMaxCnt then
- return Broadcast.sendErr(human,Lang.ZHANBU_HAND_CARD_FULL)
- end
- -- 扣除消耗
- human.db.zhanbu.money = human.db.zhanbu.money - config.price
- RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
-
- -- 自动回复计时
- if human.db.zhanbu.money < AUTO_GET_MONEY_MAX then
- human.db.zhanbu.ts = human.db.zhanbu.ts or os.time()
- end
- -- 从卡池中删除
- human.db.zhanbu.pool[index] = nil
- for i = 1,human.db.zhanbu.handMaxCnt do
- if human.db.zhanbu.hand[i] == nil then
- human.db.zhanbu.handCnt = human.db.zhanbu.handCnt + 1
- human.db.zhanbu.hand[i] = heroIndex
- msgRet.index = i
- break
- end
- end
- end
-
- -- 通知客户端购买成功
- Msg.send(msgRet,human.fd)
- -- 刷新界面
- zhanbuQuery(human)
- YunYingLogic.onCallBack(human, "onZhanBuBuyCard", config.price)
- end
- function sellCard(human,index,heroID)
- -- 错误,数据都没有,乱搞
- if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
- return
- end
- -- 校验卡的合法性
- local heroIndex = human.db.zhanbu.hand[index]
- local config = ZhanbuExcel.pool[heroIndex]
- if heroIndex == nil or config == nil then
- return
- end
-
- -- 删除手牌
- human.db.zhanbu.hand[index] = nil
- human.db.zhanbu.handCnt = human.db.zhanbu.handCnt - 1
- -- 增加道具
- human.db.zhanbu.money = human.db.zhanbu.money + config.price
- RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
- -- 自动回复计时
- if human.db.zhanbu.money >= AUTO_GET_MONEY_MAX then
- human.db.zhanbu.ts = nil
- end
- -- 通知客户端售出成功
- Msg.send(Msg.gc.GC_ZHANBU_SELL_CARD,human.fd)
- -- 刷新界面
- zhanbuQuery(human)
- YunYingLogic.onCallBack(human, "onZhanBuBuyCard", -config.price)
- end
- function changePos(human,posList)
- -- 错误,数据都没有,乱搞
- if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
- return
- end
- -- 检验所有位置是否合法
- local tb = Util.split(posList, "|")
- -- 长度不对,不合法
- if #tb > human.db.zhanbu.handMaxCnt then
- return
- end
- for i = 1,#tb do
- -- 不能将卡删除
- tb[i] = tonumber(tb[i])
- if tb[i] == 0 and human.db.zhanbu.hand[i] ~= nil then
- return
- end
- -- 新位置不合法
- if tb[i] > human.db.zhanbu.handMaxCnt then
- return
- end
- end
- -- 交换位置
- local dataList = Util.copyTable(human.db.zhanbu.hand)
- human.db.zhanbu.hand = {}
- for i = 1,human.db.zhanbu.handMaxCnt do
- if tb[i] ~= 0 then
- human.db.zhanbu.hand[tb[i]] = dataList[i]
- end
- end
-
- zhanbuQuery(human)
- end
- function refreshCardPool(human)
- -- 错误,数据都没有,乱搞
- if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
- return
- end
- -- 校验材料不够
- if human.db.zhanbu.money < CARD_POOL_REFRESH then
- return Broadcast.sendErr(human,Lang.ABS_ITEM_ERR)
- end
- -- 扣除材料
- human.db.zhanbu.money = human.db.zhanbu.money - CARD_POOL_REFRESH
-
- RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
-
- -- 自动回复计时
- if human.db.zhanbu.money < AUTO_GET_MONEY_MAX then
- human.db.zhanbu.ts = human.db.zhanbu.ts or os.time()
- end
- -- 刷新
- refreshPool(human)
-
- -- 刷新成功,次数+1
- onLv(human)
- -- 刷新界面
- zhanbuQuery(human)
- --占卜轮盘活动 刷新后回调
- AbsZhanbuLunpanLogic.onZhanbuRefresh(human)
- YunYingLogic.onCallBack(human, "onZhanBuBuyCard", CARD_POOL_REFRESH)
- end
- -- 心仪英雄
- function zhanbuHeartHeroQuery(human)
- -- 错误,数据都没有,乱搞
- if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
- return
- end
-
- local msgRet = Msg.gc.GC_ZHANBU_HEART_HERO_QUERY
- for i = 1,3 do
- local heroID = human.db.zhanbu.heartHero[i]
- msgRet.heroInfo[i] = heroID or 0
- end
- msgRet.heroInfo[0] = 3
- local len = 0
- for heroID,v in pairs(human.db.heroBook) do
- local heroConfig = HeroExcel.hero[heroID]
- if heroConfig and heroConfig.grade == 4 then
- len = len + 1
- msgRet.heroList[len] = heroID
- end
- end
- msgRet.heroList[0] = len
- Msg.send(msgRet,human.fd)
- end
- -- 设置心仪英雄
- function setHeartHero(human,heroList)
- -- 错误,数据都没有,乱搞
- if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
- return
- end
- -- 检验所有位置是否合法
- local tb = Util.split(heroList, "|")
- -- 长度不对,不合法
- local len = #tb
- if len > 3 then
- return
- end
- -- 校验英雄是否是图鉴中,是否是SSR
- for i = 1,len do
- tb[i] = tonumber(tb[i])
- local heroID = tb[i]
- if heroID ~= 0 then
- local heroConfig = HeroExcel.hero[heroID]
- -- 不是已激活图鉴中,返回
- if not HeroBook.isGet(human, heroID,heroConfig.star) then
- return
- end
- -- 不是SSR,返回
- if heroConfig.grade ~= 4 then
- return
- end
- end
- end
- -- 保存至玩家数据
- human.db.zhanbu.heartHero = {}
- for i = 1,len do
- if tb[i] ~= 0 then
- human.db.zhanbu.heartHero[i] = tb[i]
- end
- end
- -- 刷新心仪英雄数据
- zhanbuHeartHeroQuery(human)
- end
- function onLv(human)
- human.db.zhanbu.refreshCnt = human.db.zhanbu.refreshCnt + 1
- if human.db.zhanbu.refreshCnt >= ZhanbuExcel.poolLv[human.db.zhanbu.lv].cnt and
- human.db.zhanbu.lv < #ZhanbuExcel.poolLv then
- human.db.zhanbu.lv = human.db.zhanbu.lv + 1
- local msgRet = Msg.gc.GC_ZHANBU_LVUP
- msgRet.cardRate = Util.copyTable(ZhanbuExcel.poolLv[human.db.zhanbu.lv].weight)
- msgRet.cardRate[0] = 3
- msgRet.lv = human.db.zhanbu.lv
- Msg.send(msgRet,human.fd)
- end
- end
- function checkRecover()
- local now = os.time()
- for _,human in pairs(ObjHuman.onlineUuid) do
- if human.db.zhanbu and human.db.zhanbu.ts then
- local ts = now - human.db.zhanbu.ts
- local cnt = math.floor(ts/AUTO_GET_MONEY_TS)
- if cnt >= 1 and human.db.zhanbu.money < AUTO_GET_MONEY_MAX then
- human.db.zhanbu.money = human.db.zhanbu.money + cnt
- human.db.zhanbu.ts = human.db.zhanbu.ts + AUTO_GET_MONEY_TS * cnt
- if human.db.zhanbu.money >= AUTO_GET_MONEY_MAX then
- human.db.zhanbu.ts = nil
- human.db.zhanbu.money = AUTO_GET_MONEY_MAX
- end
- RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
- elseif human.db.zhanbu.money >= AUTO_GET_MONEY_MAX then
- human.db.zhanbu.ts = nil
- end
- end
- end
- end
- function isDot(human)
- if human.db.lv < 14 then
- return
- end
- initDB(human)
- if human.db.zhanbu and human.db.zhanbu.money >= 30 then
- return true
- end
- if xinyiDot(human) then
- return true
- end
- return
- end
- function updateDaily(human)
- if human.db.zhanbu == nil then
- return
- end
- human.db.zhanbu.lv = 1
- human.db.zhanbu.refreshCnt = 0
- end
- function addZhanbuItem(human,cnt)
- -- 初始化数据
- initDB(human)
- human.db.zhanbu.money = human.db.zhanbu.money + cnt
- end
- function xinyiDot(human)
- if human.db.heroBook == nil then return end
- local count = 0
- for k ,v in pairs(human.db.heroBook) do
- if type(k) == "number" then
- if HeroExcel.hero[k].grade == 4 then
- count = count + 1
- end
- end
- end
- local xinyiCount = 0
- for i = 1, 3 do
- if human.db.zhanbu.heartHero[i] ~= nil then
- xinyiCount = xinyiCount + 1
- end
- end
- if xinyiCount < count and xinyiCount < 3 then
- return true
- end
- end
|