Commit 09be9059971f6a972600a1b7966a79e58f99055e
1 parent
43babcff
冒险接口
Showing
8 changed files
with
191 additions
and
20 deletions
Show diff stats
src/GlobalVar.lua
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 | ... | ... |