From 09be9059971f6a972600a1b7966a79e58f99055e Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Mon, 9 Sep 2019 14:51:59 +0800 Subject: [PATCH] 冒险接口 --- src/GlobalVar.lua | 1 + src/ProtocolCode.lua | 4 +++- src/actions/AdvAction.lua | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------- src/adv/Adv.lua | 7 +++++-- src/adv/AdvMap.lua | 3 +++ src/models/Daily.lua | 4 ++++ src/models/Role.lua | 12 +++++++++--- src/models/RolePlugin.lua | 5 +++++ 8 files changed, 191 insertions(+), 20 deletions(-) diff --git a/src/GlobalVar.lua b/src/GlobalVar.lua index 2f832d0..d61f41f 100644 --- a/src/GlobalVar.lua +++ b/src/GlobalVar.lua @@ -88,6 +88,7 @@ AdvEventType = { Trap = 6, --陷阱 Click = 7, --点击生效 Layer = 8, --切换层的点 + Task = 9, --任务 } AdvBackEventType = { diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index 904b48b..7f12deb 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -30,13 +30,15 @@ actionCodes = { Role_openTimeBoxRpc = 116, Adv_startAdvRpc = 151, - Adv_roleFormatRpc = 152, + Adv_startHangRpc = 152, Adv_clickBlockRpc = 153, Adv_useItemRpc = 154, Adv_usePotionRpc = 155, Adv_exitAdvRpc = 156, Adv_startBattleRpc = 157, Adv_endBattleRpc = 158, + Adv_endHangRpc = 159, + Adv_buyAdvCountRpc = 160, Hero_loadInfos = 201, Hero_updateProperty = 202, diff --git a/src/actions/AdvAction.lua b/src/actions/AdvAction.lua index d2be8ba..fca3dce 100644 --- a/src/actions/AdvAction.lua +++ b/src/actions/AdvAction.lua @@ -16,38 +16,185 @@ local table_unpack = table.unpack local _M = {} + +local function checkFormat(role, format, isHang) + local advHang = role:getProperty("advHang") + local hadHero = {} + for chapterId, info in pairs(advHang) do + if info.format then + for _, heroId in pairs(info.format.heros) do + hadHero[heroId] = true + end + end + end + + if isHang then + for _, heroId in pairs(role:getProperty("advTeam").heros or {}) do + hadHero[heroId] = true + end + end + + if not format.leader then return end + local hadLeader = false + for slot, heroId in pairs(format.heros) do + if not role.heros[heroId] or hadHero[heroId] then + return + end + if heroId == format.leader then + hadLeader = true + end + end + if not hadLeader then return end + return true +end + --开始一个新的关卡 function _M.startAdvRpc( agent, data ) local role = agent.role local msg = MsgPack.unpack(data) - local chapterId = msg.chapterId + local chapterId = msg.chapterId --关卡id + local layer = msg.layer or 1 --选择层数 + local format = msg.format --编队 + local chapterData = csvdb["adv_chapterCsv"][chapterId] + if not chapterData then return end + + if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return end -- 是否有体力 + + local oklayer = false --层是否合法 + if layer ~= 1 then + for _, exLayer in ipairs(globalCsv.adv_can_out_layer) do + if exLayer + 1 == layer then + oklayer = true + break + end + end + end + + if not oklayer then return end + if layer > chapterData.limitlevel then return end + local advPass = role:getProperty("advPass") + for _, id in ipairs(chapterData.prepose:toArray(true, "=")) do + if advPass[id] ~= csvdb["adv_chapterCsv"][id].limitlevel then return end -- 前置 + end + + if layer ~= 1 and (advPass[chapterId] or 0) < (layer - 1) then return end --中继 + + if not checkFormat(role, format) then return end --上一个关卡结束才可以开始新的关卡 local advInfo = role:getProperty("advInfo") if next(advInfo) then return end - role:getAdvData():initByChapter(chapterId, 1) + + local advTeam = role:getProperty("advTeam") + table.clear(advTeam) + + advTeam.heros = {} + for slot, heroId in pairs(msg.heros) do + advTeam.heros[slot] = heroId + end + advTeam.leader = msg.leader + role:updateProperty({field = "advTeam", value = advTeam}) + role.dailyData:updateProperty({field = "advC", delta = 1}) + + role:getAdvData():initByChapter(chapterId, layer) SendPacket(actionCodes.Adv_startAdvRpc, '') return true end -function _M.roleFormatRpc(agent , data) + +function _M.startHangRpc(agent, data) local role = agent.role local msg = MsgPack.unpack(data) - local advTeam = role:getProperty("advTeam") - for slot, heroId in pairs(msg.heros) do - if not role.heros[heroId] then + local chapterId = msg.chapterId --关卡id + local format = msg.format --编队 + + local chapterData = csvdb["adv_chapterCsv"][chapterId] + if not chapterData then return end + + local advHang = role:getProperty("advHang") + if advHang[chapterId] then return end --正在挂机 + + local advPass = role:getProperty("advPass") + if advPass[chapterId] ~= chapterData.limitlevel then return end -- 没有全通关 + + + if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return end -- 是否有体力 + + if not checkFormat(role, format, true) then return end --编队是否正确 + + local battleV = 0 + for _, heroId in pairs(format.heros) do + local hero = role.heros[heroId] + battleV = battleV + hero:getProperty("battleV") + end + if battleV < chapterData.idleValue then return end -- 战斗力是否满足 + + local info = {} + info.format = {} + info.format.leader = format.leader + info.format.heros = {} + for slot, heroId in pairs(format.heros) do + info.format.heros[slot] = heroId + end + info.time = skynet.timex() + chapterData.idleTime --挂机时间 + + role:changeUpdates({{type = "advHang", field = chapterId, value = info}}) + + role.dailyData:updateProperty({field = "advC", delta = 1}) + + SendPacket(actionCodes.Adv_startHangRpc, '') + return true +end + +function _M.endHangRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + + local chapterId = msg.chapterId --关卡id + local cancel = msg.cancel --是否是取消 + + local advHang = role:getProperty("advHang") + local info = advHang[chapterId] + if not info then return end + + local chapterData = csvdb["adv_chapterCsv"][chapterId] + if not chapterData then return end + + local reward, isFull + if skynet.timex() >= info.time then + reward = role:award(chapterData.idleReward) + else + if cancel then + if role.dailyData:getProperty("advC") <= 0 then + isFull = true + else + role.dailyData:updateProperty({field = "advC", delta = -1}) + end + else return end end - table.clear(advTeam) - advTeam.heros = {} - for slot, heroId in pairs(msg.heros) do - advTeam.heros[slot] = heroId - end - advTeam.leader = msg.leader - role:updateProperty({field = "advTeam", value = advTeam}) - SendPacket(actionCodes.Adv_roleFormatRpc, '') + + role:changeUpdates({{type = "advHang", field = chapterId, value = nil}}) + + SendPacket(actionCodes.Adv_endHangRpc, MsgPack.pack({reward = reward, isFull = isFull})) + return true +end + +function _M.buyAdvCountRpc(agent , data) + local role = agent.role + local msg = MsgPack.unpack(data) + + local count = msg.count --购买次数 + if math.illegalNum(count, 1, math.min(globalCsv.adv_daily_buy_count - role.dailyData:getProperty("advBC"), role.dailyData:getProperty("advC"))) then return end + + local cost = {[ItemId.Diamond] = count * globalCsv.adv_daily_buy_cost} + if not role:checkItemEnough(cost) then return end + role:costItems(cost) + role.dailyData:updateProperty({field = "advC", delta = -count}) + + SendPacket(actionCodes.Adv_buyAdvCountRpc, '') return true end diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index 798a333..6b51ad1 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -139,9 +139,12 @@ function Adv:over(success) local scoreInfo = self.score local reward if success then - self.owner:updateProperty({field = "advPass", self.owner:getProperty("advPass"):setv(self.chapterId, score)}) - reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap()) + local advPass = self.owner:getProperty("advPass") + if self.level > (advPass[self.chapterId] or 0) then + self.owner:changeUpdates({{type = "advPass", field = self.chapterId, value = self.level}}) + end + reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap()) self.owner:checkTaskEnter(self.owner.TaskType.AdvPass, {id = self.chapterId}) end self:clear() diff --git a/src/adv/AdvMap.lua b/src/adv/AdvMap.lua index 4e6ee4f..e4e6c46 100644 --- a/src/adv/AdvMap.lua +++ b/src/adv/AdvMap.lua @@ -211,6 +211,7 @@ createMap = function(mapId, chapterId, level) end haveBoss = true end + --怪物 randomFunc[AdvEventType.Monster] = function() if randomCommon() == false then @@ -233,6 +234,8 @@ createMap = function(mapId, chapterId, level) randomFunc[AdvEventType.Click] = randomCommon --跨层点 randomFunc[AdvEventType.Layer] = randomCommon + --层级任务 + randomFunc[AdvEventType.Task] = randomCommon if randomFunc[etype] then diff --git a/src/models/Daily.lua b/src/models/Daily.lua index e6a6eea..1385184 100644 --- a/src/models/Daily.lua +++ b/src/models/Daily.lua @@ -10,6 +10,8 @@ Daily.schema = { commentHero = {"string", ""}, -- 单日评论食灵记录 type=1 hangQC = {"number", 0}, -- 挂机快速次数 dinerQC = {"number", 0}, -- 贩卖加速次数 + advC = {"number", 0}, -- 冒险次数(消耗体力) + advBC = {"number", 0}, -- 冒险次数购买次数(冒险体力购买次数) } function Daily:updateProperty(params) @@ -44,6 +46,8 @@ function Daily:data() return { hangQC = self:getProperty("hangQC"), dinerQC = self:getProperty("dinerQC"), + advC = self:getProperty("advC"), + advBC = self:getProperty("advBC"), } end diff --git a/src/models/Role.lua b/src/models/Role.lua index d8ee453..8ec4ac1 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -12,6 +12,7 @@ RoleChangeStruct.bind(Role) function Role:ctor( properties ) Role.super.ctor(self, properties) self.ignoreHeartbeat = false + self.dailyData = nil self.heros = {} self.runeBag = {} self.advData = nil @@ -41,11 +42,14 @@ Role.schema = { bagLimit = {"table", globalCsv.store_limit_max}, --冒险相关 - advPass = {"string", ""}, -- 通关记录 + advPass = {"string", {}}, -- 通关记录 {chapterId = layer} advItems = {"string", ""}, -- 冒险临时背包 - advInfo = {"table", {}}, -- 冒险关卡信息 + advInfo = {"table", {}}, -- 冒险关卡信息 advTeam = {"table", {}}, -- 冒险玩家队伍信息 - + advHang = {"table", {}}, -- 挂机信息 -- {chapterId = info} + advTask = {"table", {l = {}, m = {}}}, -- 冒险已领取任务完成状态 -- l 层级任务, m 主线任务 {id = status} + advMTask = {"table", {}}, -- 冒险主线已经完成的任务[数组] --为了节省空间 服务器使用 + advAchiev = {"table", {}}, -- 冒险成就 {chapterId = {achievId = status}} --挂机相关 hangPass = {"table", {}}, -- 挂机通过的最大关卡 hangTeam = {"table", {}}, -- 挂机队伍 @@ -177,6 +181,8 @@ function Role:data() advInfo = self:getProperty("advInfo"), advItems = self:getProperty("advItems"):toNumMap(), advTeam = self:getProperty("advTeam"), + advHang = self:getProperty("advHang"), + advTask = self:getProperty("advTask"), hangPass = self:getProperty("hangPass"), hangTeam = self:getProperty("hangTeam"), diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index d0c2184..f5db5e5 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -580,6 +580,11 @@ function RolePlugin.bind(Role) end return battleValue end + + function Role:getAdvHangLimit() + -- todo + return globalCsv.adv_daily_cross_count + end end return RolePlugin \ No newline at end of file -- libgit2 0.21.2