Commit 09be9059971f6a972600a1b7966a79e58f99055e

Authored by zhouhaihai
1 parent 43babcff

冒险接口

src/GlobalVar.lua
... ... @@ -88,6 +88,7 @@ AdvEventType = {
88 88 Trap = 6, --陷阱
89 89 Click = 7, --点击生效
90 90 Layer = 8, --切换层的点
  91 + Task = 9, --任务
91 92 }
92 93  
93 94 AdvBackEventType = {
... ...
src/ProtocolCode.lua
... ... @@ -30,13 +30,15 @@ actionCodes = {
30 30 Role_openTimeBoxRpc = 116,
31 31  
32 32 Adv_startAdvRpc = 151,
33   - Adv_roleFormatRpc = 152,
  33 + Adv_startHangRpc = 152,
34 34 Adv_clickBlockRpc = 153,
35 35 Adv_useItemRpc = 154,
36 36 Adv_usePotionRpc = 155,
37 37 Adv_exitAdvRpc = 156,
38 38 Adv_startBattleRpc = 157,
39 39 Adv_endBattleRpc = 158,
  40 + Adv_endHangRpc = 159,
  41 + Adv_buyAdvCountRpc = 160,
40 42  
41 43 Hero_loadInfos = 201,
42 44 Hero_updateProperty = 202,
... ...
src/actions/AdvAction.lua
... ... @@ -16,38 +16,185 @@ local table_unpack = table.unpack
16 16  
17 17 local _M = {}
18 18  
  19 +
  20 +local function checkFormat(role, format, isHang)
  21 + local advHang = role:getProperty("advHang")
  22 + local hadHero = {}
  23 + for chapterId, info in pairs(advHang) do
  24 + if info.format then
  25 + for _, heroId in pairs(info.format.heros) do
  26 + hadHero[heroId] = true
  27 + end
  28 + end
  29 + end
  30 +
  31 + if isHang then
  32 + for _, heroId in pairs(role:getProperty("advTeam").heros or {}) do
  33 + hadHero[heroId] = true
  34 + end
  35 + end
  36 +
  37 + if not format.leader then return end
  38 + local hadLeader = false
  39 + for slot, heroId in pairs(format.heros) do
  40 + if not role.heros[heroId] or hadHero[heroId] then
  41 + return
  42 + end
  43 + if heroId == format.leader then
  44 + hadLeader = true
  45 + end
  46 + end
  47 + if not hadLeader then return end
  48 + return true
  49 +end
  50 +
19 51 --开始一个新的关卡
20 52 function _M.startAdvRpc( agent, data )
21 53 local role = agent.role
22 54 local msg = MsgPack.unpack(data)
23   - local chapterId = msg.chapterId
  55 + local chapterId = msg.chapterId --关卡id
  56 + local layer = msg.layer or 1 --选择层数
  57 + local format = msg.format --编队
  58 + local chapterData = csvdb["adv_chapterCsv"][chapterId]
  59 + if not chapterData then return end
  60 +
  61 + if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return end -- 是否有体力
  62 +
  63 + local oklayer = false --层是否合法
  64 + if layer ~= 1 then
  65 + for _, exLayer in ipairs(globalCsv.adv_can_out_layer) do
  66 + if exLayer + 1 == layer then
  67 + oklayer = true
  68 + break
  69 + end
  70 + end
  71 + end
  72 +
  73 + if not oklayer then return end
  74 + if layer > chapterData.limitlevel then return end
  75 + local advPass = role:getProperty("advPass")
  76 + for _, id in ipairs(chapterData.prepose:toArray(true, "=")) do
  77 + if advPass[id] ~= csvdb["adv_chapterCsv"][id].limitlevel then return end -- 前置
  78 + end
  79 +
  80 + if layer ~= 1 and (advPass[chapterId] or 0) < (layer - 1) then return end --中继
  81 +
  82 + if not checkFormat(role, format) then return end
24 83  
25 84 --上一个关卡结束才可以开始新的关卡
26 85 local advInfo = role:getProperty("advInfo")
27 86 if next(advInfo) then return end
28   - role:getAdvData():initByChapter(chapterId, 1)
  87 +
  88 + local advTeam = role:getProperty("advTeam")
  89 + table.clear(advTeam)
  90 +
  91 + advTeam.heros = {}
  92 + for slot, heroId in pairs(msg.heros) do
  93 + advTeam.heros[slot] = heroId
  94 + end
  95 + advTeam.leader = msg.leader
  96 + role:updateProperty({field = "advTeam", value = advTeam})
  97 + role.dailyData:updateProperty({field = "advC", delta = 1})
  98 +
  99 + role:getAdvData():initByChapter(chapterId, layer)
29 100  
30 101 SendPacket(actionCodes.Adv_startAdvRpc, '')
31 102 return true
32 103 end
33 104  
34   -function _M.roleFormatRpc(agent , data)
  105 +
  106 +function _M.startHangRpc(agent, data)
35 107 local role = agent.role
36 108 local msg = MsgPack.unpack(data)
37   - local advTeam = role:getProperty("advTeam")
38   - for slot, heroId in pairs(msg.heros) do
39   - if not role.heros[heroId] then
  109 + local chapterId = msg.chapterId --关卡id
  110 + local format = msg.format --编队
  111 +
  112 + local chapterData = csvdb["adv_chapterCsv"][chapterId]
  113 + if not chapterData then return end
  114 +
  115 + local advHang = role:getProperty("advHang")
  116 + if advHang[chapterId] then return end --正在挂机
  117 +
  118 + local advPass = role:getProperty("advPass")
  119 + if advPass[chapterId] ~= chapterData.limitlevel then return end -- 没有全通关
  120 +
  121 +
  122 + if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return end -- 是否有体力
  123 +
  124 + if not checkFormat(role, format, true) then return end --编队是否正确
  125 +
  126 + local battleV = 0
  127 + for _, heroId in pairs(format.heros) do
  128 + local hero = role.heros[heroId]
  129 + battleV = battleV + hero:getProperty("battleV")
  130 + end
  131 + if battleV < chapterData.idleValue then return end -- 战斗力是否满足
  132 +
  133 + local info = {}
  134 + info.format = {}
  135 + info.format.leader = format.leader
  136 + info.format.heros = {}
  137 + for slot, heroId in pairs(format.heros) do
  138 + info.format.heros[slot] = heroId
  139 + end
  140 + info.time = skynet.timex() + chapterData.idleTime --挂机时间
  141 +
  142 + role:changeUpdates({{type = "advHang", field = chapterId, value = info}})
  143 +
  144 + role.dailyData:updateProperty({field = "advC", delta = 1})
  145 +
  146 + SendPacket(actionCodes.Adv_startHangRpc, '')
  147 + return true
  148 +end
  149 +
  150 +function _M.endHangRpc(agent, data)
  151 + local role = agent.role
  152 + local msg = MsgPack.unpack(data)
  153 +
  154 + local chapterId = msg.chapterId --关卡id
  155 + local cancel = msg.cancel --是否是取消
  156 +
  157 + local advHang = role:getProperty("advHang")
  158 + local info = advHang[chapterId]
  159 + if not info then return end
  160 +
  161 + local chapterData = csvdb["adv_chapterCsv"][chapterId]
  162 + if not chapterData then return end
  163 +
  164 + local reward, isFull
  165 + if skynet.timex() >= info.time then
  166 + reward = role:award(chapterData.idleReward)
  167 + else
  168 + if cancel then
  169 + if role.dailyData:getProperty("advC") <= 0 then
  170 + isFull = true
  171 + else
  172 + role.dailyData:updateProperty({field = "advC", delta = -1})
  173 + end
  174 + else
40 175 return
41 176 end
42 177 end
43   - table.clear(advTeam)
44   - advTeam.heros = {}
45   - for slot, heroId in pairs(msg.heros) do
46   - advTeam.heros[slot] = heroId
47   - end
48   - advTeam.leader = msg.leader
49   - role:updateProperty({field = "advTeam", value = advTeam})
50   - SendPacket(actionCodes.Adv_roleFormatRpc, '')
  178 +
  179 + role:changeUpdates({{type = "advHang", field = chapterId, value = nil}})
  180 +
  181 + SendPacket(actionCodes.Adv_endHangRpc, MsgPack.pack({reward = reward, isFull = isFull}))
  182 + return true
  183 +end
  184 +
  185 +function _M.buyAdvCountRpc(agent , data)
  186 + local role = agent.role
  187 + local msg = MsgPack.unpack(data)
  188 +
  189 + local count = msg.count --购买次数
  190 + if math.illegalNum(count, 1, math.min(globalCsv.adv_daily_buy_count - role.dailyData:getProperty("advBC"), role.dailyData:getProperty("advC"))) then return end
  191 +
  192 + local cost = {[ItemId.Diamond] = count * globalCsv.adv_daily_buy_cost}
  193 + if not role:checkItemEnough(cost) then return end
  194 + role:costItems(cost)
  195 + role.dailyData:updateProperty({field = "advC", delta = -count})
  196 +
  197 + SendPacket(actionCodes.Adv_buyAdvCountRpc, '')
51 198 return true
52 199 end
53 200  
... ...
src/adv/Adv.lua
... ... @@ -139,9 +139,12 @@ function Adv:over(success)
139 139 local scoreInfo = self.score
140 140 local reward
141 141 if success then
142   - self.owner:updateProperty({field = "advPass", self.owner:getProperty("advPass"):setv(self.chapterId, score)})
143   - reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap())
  142 + local advPass = self.owner:getProperty("advPass")
  143 + if self.level > (advPass[self.chapterId] or 0) then
  144 + self.owner:changeUpdates({{type = "advPass", field = self.chapterId, value = self.level}})
  145 + end
144 146  
  147 + reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap())
145 148 self.owner:checkTaskEnter(self.owner.TaskType.AdvPass, {id = self.chapterId})
146 149 end
147 150 self:clear()
... ...
src/adv/AdvMap.lua
... ... @@ -211,6 +211,7 @@ createMap = function(mapId, chapterId, level)
211 211 end
212 212 haveBoss = true
213 213 end
  214 +
214 215 --怪物
215 216 randomFunc[AdvEventType.Monster] = function()
216 217 if randomCommon() == false then
... ... @@ -233,6 +234,8 @@ createMap = function(mapId, chapterId, level)
233 234 randomFunc[AdvEventType.Click] = randomCommon
234 235 --跨层点
235 236 randomFunc[AdvEventType.Layer] = randomCommon
  237 + --层级任务
  238 + randomFunc[AdvEventType.Task] = randomCommon
236 239  
237 240  
238 241 if randomFunc[etype] then
... ...
src/models/Daily.lua
... ... @@ -10,6 +10,8 @@ Daily.schema = {
10 10 commentHero = {"string", ""}, -- 单日评论食灵记录 type=1
11 11 hangQC = {"number", 0}, -- 挂机快速次数
12 12 dinerQC = {"number", 0}, -- 贩卖加速次数
  13 + advC = {"number", 0}, -- 冒险次数(消耗体力)
  14 + advBC = {"number", 0}, -- 冒险次数购买次数(冒险体力购买次数)
13 15 }
14 16  
15 17 function Daily:updateProperty(params)
... ... @@ -44,6 +46,8 @@ function Daily:data()
44 46 return {
45 47 hangQC = self:getProperty("hangQC"),
46 48 dinerQC = self:getProperty("dinerQC"),
  49 + advC = self:getProperty("advC"),
  50 + advBC = self:getProperty("advBC"),
47 51 }
48 52 end
49 53  
... ...
src/models/Role.lua
... ... @@ -12,6 +12,7 @@ RoleChangeStruct.bind(Role)
12 12 function Role:ctor( properties )
13 13 Role.super.ctor(self, properties)
14 14 self.ignoreHeartbeat = false
  15 + self.dailyData = nil
15 16 self.heros = {}
16 17 self.runeBag = {}
17 18 self.advData = nil
... ... @@ -41,11 +42,14 @@ Role.schema = {
41 42 bagLimit = {"table", globalCsv.store_limit_max},
42 43  
43 44 --冒险相关
44   - advPass = {"string", ""}, -- 通关记录
  45 + advPass = {"string", {}}, -- 通关记录 {chapterId = layer}
45 46 advItems = {"string", ""}, -- 冒险临时背包
46   - advInfo = {"table", {}}, -- 冒险关卡信息
  47 + advInfo = {"table", {}}, -- 冒险关卡信息
47 48 advTeam = {"table", {}}, -- 冒险玩家队伍信息
48   -
  49 + advHang = {"table", {}}, -- 挂机信息 -- {chapterId = info}
  50 + advTask = {"table", {l = {}, m = {}}}, -- 冒险已领取任务完成状态 -- l 层级任务, m 主线任务 {id = status}
  51 + advMTask = {"table", {}}, -- 冒险主线已经完成的任务[数组] --为了节省空间 服务器使用
  52 + advAchiev = {"table", {}}, -- 冒险成就 {chapterId = {achievId = status}}
49 53 --挂机相关
50 54 hangPass = {"table", {}}, -- 挂机通过的最大关卡
51 55 hangTeam = {"table", {}}, -- 挂机队伍
... ... @@ -177,6 +181,8 @@ function Role:data()
177 181 advInfo = self:getProperty("advInfo"),
178 182 advItems = self:getProperty("advItems"):toNumMap(),
179 183 advTeam = self:getProperty("advTeam"),
  184 + advHang = self:getProperty("advHang"),
  185 + advTask = self:getProperty("advTask"),
180 186  
181 187 hangPass = self:getProperty("hangPass"),
182 188 hangTeam = self:getProperty("hangTeam"),
... ...
src/models/RolePlugin.lua
... ... @@ -580,6 +580,11 @@ function RolePlugin.bind(Role)
580 580 end
581 581 return battleValue
582 582 end
  583 +
  584 + function Role:getAdvHangLimit()
  585 + -- todo
  586 + return globalCsv.adv_daily_cross_count
  587 + end
583 588 end
584 589  
585 590 return RolePlugin
586 591 \ No newline at end of file
... ...