Commit 4faef572d59a9a0dd795125987386e9c91b02ffc
1 parent
7104d350
冒险任务,冒险扫荡, 冒险中继
Showing
11 changed files
with
376 additions
and
40 deletions
Show diff stats
src/GlobalVar.lua
... | ... | @@ -43,6 +43,13 @@ ItemType = { |
43 | 43 | LunchBox = 12, -- 便当盒(料理合成,冒险系统消耗道具) |
44 | 44 | TimeBox = 13, -- 时间箱(开启需要时间,随机产出道具) |
45 | 45 | AdvItem = 14, -- 冒险道具 |
46 | + FuncOpen = 15, -- 管理功能开放 | |
47 | +} | |
48 | + | |
49 | +FuncOpenType = { | |
50 | + AdvEndless = 5919, -- 无尽模式 | |
51 | + AdvRelay = 5920, -- 中继开放 | |
52 | + AdvArtifact = 5921, -- 神器开放 | |
46 | 53 | } |
47 | 54 | |
48 | 55 | -- 物品起始id | ... | ... |
src/ProtocolCode.lua
src/actions/AdvAction.lua
... | ... | @@ -56,9 +56,9 @@ function _M.startAdvRpc( agent, data ) |
56 | 56 | local layer = msg.layer or 1 --选择层数 |
57 | 57 | local format = msg.format --编队 |
58 | 58 | local chapterData = csvdb["adv_chapterCsv"][chapterId] |
59 | - if not chapterData then return end | |
59 | + if not chapterData then return 1 end | |
60 | 60 | |
61 | - if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return end -- 是否有体力 | |
61 | + if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return 2 end -- 是否有体力 | |
62 | 62 | |
63 | 63 | local oklayer = false --层是否合法 |
64 | 64 | if layer ~= 1 then |
... | ... | @@ -68,30 +68,32 @@ function _M.startAdvRpc( agent, data ) |
68 | 68 | break |
69 | 69 | end |
70 | 70 | end |
71 | + else | |
72 | + oklayer = true | |
71 | 73 | end |
72 | 74 | |
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 | |
75 | + if not oklayer then return 3 end | |
76 | + if layer > chapterData.limitlevel then return 4 end | |
79 | 77 | |
80 | - if layer ~= 1 and (advPass[chapterId] or 0) < (layer - 1) then return end --中继 | |
78 | + -- 关卡开放判断 | |
79 | + if not role:advChapterIsOpen(chapterId, layer) then return 5 end | |
81 | 80 | |
82 | - if not checkFormat(role, format) then return end | |
81 | + --中继开放判断 | |
82 | + if layer ~= 1 and (not role:isFuncOpen(FuncOpenType.AdvRelay) or (advPass[chapterId] or 0) < (layer - 1)) then return 6 end | |
83 | + | |
84 | + if not checkFormat(role, format) then return 7 end | |
83 | 85 | |
84 | 86 | --上一个关卡结束才可以开始新的关卡 |
85 | - if next(role:getProperty("advInfo")) then return end | |
87 | + if next(role:getProperty("advInfo")) then return 8 end | |
86 | 88 | |
87 | 89 | local advTeam = role:getProperty("advTeam") |
88 | 90 | table.clear(advTeam) |
89 | 91 | |
90 | 92 | advTeam.heros = {} |
91 | - for slot, heroId in pairs(msg.heros) do | |
93 | + for slot, heroId in pairs(format.heros) do | |
92 | 94 | advTeam.heros[slot] = heroId |
93 | 95 | end |
94 | - advTeam.leader = msg.leader | |
96 | + advTeam.leader = format.leader | |
95 | 97 | role:updateProperty({field = "advTeam", value = advTeam}) |
96 | 98 | role.dailyData:updateProperty({field = "advC", delta = 1}) |
97 | 99 | |
... | ... | @@ -203,6 +205,23 @@ function _M.buyAdvCountRpc(agent , data) |
203 | 205 | return true |
204 | 206 | end |
205 | 207 | |
208 | +function _M.finishTaskRpc(agent, data) | |
209 | + local role = agent.role | |
210 | + local msg = MsgPack.unpack(data) | |
211 | + | |
212 | + local adv = role:getAdvData() | |
213 | + local taskId = msg.taskId -- -1 则是主线任务 | |
214 | + local status, reward | |
215 | + if taskId == -1 then | |
216 | + status, reward = adv:finishMTask() | |
217 | + else | |
218 | + status, reward = adv:finishTask(taskId) | |
219 | + end | |
220 | + if not status then return end | |
221 | + SendPacket(actionCodes.Adv_finishTaskRpc, MsgPack.pack({reward = reward})) | |
222 | + return true | |
223 | +end | |
224 | + | |
206 | 225 | -- 点击地块(解锁)(触发事件) |
207 | 226 | function _M.clickBlockRpc(agent, data) |
208 | 227 | local role = agent.role | ... | ... |
src/actions/GmAction.lua
... | ... | @@ -163,12 +163,45 @@ end |
163 | 163 | |
164 | 164 | function _M.advc(role, pms) |
165 | 165 | role:updateProperty({field = "advInfo", value = {}}) |
166 | + role:updateProperty({field = "advTask", value = {}}) | |
166 | 167 | role:updateProperty({field = "advItems", value = ""}) |
167 | 168 | role:updateProperty({field = "advTeam", value = {}}) |
168 | 169 | role.advData = nil |
169 | 170 | return "成功" |
170 | 171 | end |
171 | 172 | |
173 | +function _M.advf(role, pms) | |
174 | + role.dailyData:updateProperty({field = "advC", value = 0}) | |
175 | + return "成功" | |
176 | +end | |
177 | + | |
178 | +function _M.adv(role, pms) | |
179 | + local chapterId = tonum(pms.pm1) | |
180 | + local layer = tonum(pms.pm2) | |
181 | + | |
182 | + local advData = csvdb["adv_chapterCsv"][chapterId] | |
183 | + if not advData then return end | |
184 | + layer = math.min(layer, advData.limitlevel) | |
185 | + local advPass = role:getProperty("advPass") | |
186 | + local addPre | |
187 | + addPre = function(chapterId) | |
188 | + local advData = csvdb["adv_chapterCsv"][chapterId] | |
189 | + for pre, l in ipairs(advData.prepose:toNumMap()) do | |
190 | + if (advPass[pre] or 0) < l then | |
191 | + advPass[pre] = l | |
192 | + addPre(pre) | |
193 | + end | |
194 | + end | |
195 | + end | |
196 | + if (advPass[chapterId] or 0) < layer then | |
197 | + advPass[chapterId] = layer | |
198 | + addPre(chapterId) | |
199 | + role:updateProperty({field = "advPass", value = advPass}) | |
200 | + end | |
201 | + | |
202 | + return "成功" | |
203 | +end | |
204 | + | |
172 | 205 | function _M.idlec(role, pms) |
173 | 206 | role:updateProperty({field = "hangTeam", value = {}}) |
174 | 207 | role:updateProperty({field = "hangInfo", value = {}}) | ... | ... |
src/adv/Adv.lua
... | ... | @@ -4,12 +4,20 @@ local AdvCommon = require "adv.AdvCommon" |
4 | 4 | local AdvMap = require "adv.AdvMap" |
5 | 5 | |
6 | 6 | local Adv = class("Adv") |
7 | +local AdvTask = import(".AdvTask") --任务相关数据搞出去 | |
8 | +AdvTask.bind(Adv) | |
9 | + | |
7 | 10 | function Adv:ctor(owner) |
8 | 11 | assert(owner, "Adv instance must have owner(role)") |
9 | 12 | self.owner = owner |
10 | 13 | self.maps = {} |
11 | 14 | self.battle = nil |
12 | 15 | self.backEvents = {} --发给客户端的事件组 |
16 | + | |
17 | + self.advTask = self.owner:getProperty("advTask") | |
18 | + self.advMTask = self.owner:getProperty("advMTask") | |
19 | + self.advTaskChange = false -- 任务改变才更新 | |
20 | + | |
13 | 21 | self:initByInfo(self.owner:getProperty("advInfo")) |
14 | 22 | end |
15 | 23 | |
... | ... | @@ -19,6 +27,7 @@ function Adv:initByInfo(advInfo) |
19 | 27 | |
20 | 28 | self.chapterId = advInfo.chapterId |
21 | 29 | self.level = advInfo.level or 1 |
30 | + self.round = advInfo.round or 0 | |
22 | 31 | self.score = advInfo.score or {} |
23 | 32 | self.lastEnemyId = advInfo.lastEId or 1 |
24 | 33 | self.mapStack = advInfo.mstack or {} |
... | ... | @@ -35,6 +44,7 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify) |
35 | 44 | if self.chapterId and chapterId ~= self.chapterId then return end --新的关卡 或者 去到下一层 |
36 | 45 | self.chapterId = chapterId |
37 | 46 | self.level = level or 1 |
47 | + self.round = 0 | |
38 | 48 | self.score = self.score or {} |
39 | 49 | self.lastEnemyId = 1 |
40 | 50 | self.mapStack = {1} -- 最后一个为当前的地图 |
... | ... | @@ -50,6 +60,9 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify) |
50 | 60 | |
51 | 61 | self:initBattle() |
52 | 62 | |
63 | + self:initLayerTask() | |
64 | + | |
65 | + self:checkTask(Adv.TaskType.Arrive) | |
53 | 66 | if not notNotify then |
54 | 67 | self:saveDB(notNotify) |
55 | 68 | end |
... | ... | @@ -59,6 +72,7 @@ function Adv:clear() |
59 | 72 | self.chapterId = nil |
60 | 73 | self.level = nil |
61 | 74 | self.score = {} |
75 | + self.round = 0 | |
62 | 76 | self.lastEnemyId = 1 |
63 | 77 | self.mapStack = {} |
64 | 78 | self.maps = {} |
... | ... | @@ -71,6 +85,7 @@ function Adv:saveDB(notNotify) |
71 | 85 | |
72 | 86 | advInfo.chapterId = self.chapterId |
73 | 87 | advInfo.level = self.level |
88 | + advInfo.round = self.round | |
74 | 89 | advInfo.score = self.score |
75 | 90 | advInfo.lastEId = self.lastEnemyId |
76 | 91 | advInfo.mstack = self.mapStack |
... | ... | @@ -87,7 +102,8 @@ function Adv:saveDB(notNotify) |
87 | 102 | else |
88 | 103 | advTeam.player = nil |
89 | 104 | end |
90 | - | |
105 | + | |
106 | + self:updateTask(notNotify) | |
91 | 107 | self.owner:updateProperties({advInfo = advInfo, advTeam = advTeam}, notNotify) |
92 | 108 | end |
93 | 109 | |
... | ... | @@ -139,11 +155,6 @@ function Adv:over(success) |
139 | 155 | local scoreInfo = self.score |
140 | 156 | local reward |
141 | 157 | if success then |
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 | |
146 | - | |
147 | 158 | reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap()) |
148 | 159 | self.owner:checkTaskEnter(self.owner.TaskType.AdvPass, {id = self.chapterId}) |
149 | 160 | end |
... | ... | @@ -209,6 +220,7 @@ function Adv:award(gift, params) |
209 | 220 | for itemId, count in pairs(tgift) do |
210 | 221 | if count > 0 then |
211 | 222 | self:scoreChange(AdvScoreType.Item, {itemId, count}) |
223 | + self:checkTask(Adv.TaskType.Item, count, itemId) | |
212 | 224 | end |
213 | 225 | local origin = items:getv(itemId, 0) |
214 | 226 | local nums = origin + count |
... | ... | @@ -255,7 +267,22 @@ local function clickOut(self, room, block, params) |
255 | 267 | table.remove(self.mapStack) --退出夹层 |
256 | 268 | self:backLayer() |
257 | 269 | else --处于底层 |
258 | - if self.level >= csvdb["adv_chapterCsv"][self.chapterId].limitlevel then --关卡结束 | |
270 | + | |
271 | + local advPass = self.owner:getProperty("advPass") | |
272 | + if self.level > (advPass[self.chapterId] or 0) then | |
273 | + self.owner:changeUpdates({{type = "advPass", field = self.chapterId, value = self.level}}) | |
274 | + end | |
275 | + if params.relay then | |
276 | + local ok = false | |
277 | + for _, exLayer in ipairs(globalCsv.adv_can_out_layer) do | |
278 | + if exLayer == self.level then | |
279 | + ok = true | |
280 | + break | |
281 | + end | |
282 | + end | |
283 | + if not ok then return end | |
284 | + end | |
285 | + if params.relay or self.level >= csvdb["adv_chapterCsv"][self.chapterId].limitlevel or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1) then --关卡结束 | |
259 | 286 | self:over(true) |
260 | 287 | else |
261 | 288 | self:initByChapter(self.chapterId, self.level + 1, true, true) |
... | ... | @@ -340,6 +367,8 @@ local function clickChoose(self, room, block, params) |
340 | 367 | doEffect[effect[1]]() |
341 | 368 | end |
342 | 369 | |
370 | + self:checkTask(Adv.TaskType.Choose, 1, block.event.id) | |
371 | + | |
343 | 372 | if clearBlock then |
344 | 373 | block:clear() |
345 | 374 | end |
... | ... | @@ -367,6 +396,7 @@ local function clickTrader(self, room, block, params) |
367 | 396 | |
368 | 397 | local reward = self:award({[block.event.shop[buyId][1]] = block.event.shop[buyId][2]}) |
369 | 398 | block.event.status = block.event.status:setv(buyId, 1) |
399 | + self:checkTask(Adv.TaskType.Shop, 1, block.event.id) | |
370 | 400 | self:backReward(reward) |
371 | 401 | return true |
372 | 402 | end |
... | ... | @@ -395,6 +425,7 @@ local function clickBuild(self, room, block, params) |
395 | 425 | assert(doEffect[effect[1]], "error effect, event_buildingCsv id :" .. block.event.id) |
396 | 426 | if not self:cost(buildData.required:toNumMap(), {}) then return end |
397 | 427 | doEffect[effect[1]]() |
428 | + self:checkTask(Adv.TaskType.Build, 1, block.event.id) | |
398 | 429 | if clearBlock then |
399 | 430 | block:clear() |
400 | 431 | end |
... | ... | @@ -443,6 +474,13 @@ local function clickLayer(self, room, block, params) |
443 | 474 | return true |
444 | 475 | end |
445 | 476 | |
477 | +local function clickTask(self, room, block, params) | |
478 | + if self:addTask(block.event.id) then --增加任务 | |
479 | + block:clear() | |
480 | + return true | |
481 | + end | |
482 | +end | |
483 | + | |
446 | 484 | local eventCallFunc = { |
447 | 485 | [AdvEventType.Out] = clickOut, |
448 | 486 | [AdvEventType.BOSS] = clickMonster, |
... | ... | @@ -453,6 +491,7 @@ local eventCallFunc = { |
453 | 491 | [AdvEventType.Build] = clickBuild, |
454 | 492 | [AdvEventType.Click] = clickClick, |
455 | 493 | [AdvEventType.Layer] = clickLayer, |
494 | + [AdvEventType.Task] = clickTask, | |
456 | 495 | } |
457 | 496 | |
458 | 497 | --点击处理 roomId, blockId |
... | ... | @@ -567,7 +606,9 @@ function Adv:enemyDead(roomId, blockId, escape) |
567 | 606 | if escape then |
568 | 607 | block:clear() |
569 | 608 | else |
570 | - local monsterData = csvdb["event_monsterCsv"][block.event.id] | |
609 | + | |
610 | + local enemyId = block.event.id | |
611 | + local monsterData = csvdb["event_monsterCsv"][enemyId] | |
571 | 612 | self:scoreChange(AdvScoreType.Kill, monsterData.type) |
572 | 613 | |
573 | 614 | local item = block.event.item |
... | ... | @@ -575,6 +616,7 @@ function Adv:enemyDead(roomId, blockId, escape) |
575 | 616 | local dropData = csvdb["event_dropCsv"][monsterData.dropid] |
576 | 617 | item = dropData["range"]:randWeight(true) |
577 | 618 | end |
619 | + | |
578 | 620 | if item[1] == 0 then |
579 | 621 | block:clear() |
580 | 622 | else |
... | ... | @@ -583,6 +625,8 @@ function Adv:enemyDead(roomId, blockId, escape) |
583 | 625 | item = item |
584 | 626 | }) |
585 | 627 | end |
628 | + self:checkTask(Adv.TaskType.Kill, 1, enemyId) | |
629 | + self:checkTask(Adv.TaskType.KillAll) | |
586 | 630 | end |
587 | 631 | end |
588 | 632 | self:backBlockChange(roomId, blockId) |
... | ... | @@ -665,7 +709,7 @@ function Adv:scoreChange(scoreType, pms) |
665 | 709 | end |
666 | 710 | cutTypes[AdvScoreType.Kill] = function() |
667 | 711 | local chapterData = csvdb["adv_chapterCsv"][self.chapterId] |
668 | - score = globalCsv.adv_score_monster[pms] * chapterData["monRatio"] | |
712 | + score = globalCsv.adv_score_monster[pms] * chapterData["reward"] | |
669 | 713 | end |
670 | 714 | cutTypes[AdvScoreType.Item] = function() |
671 | 715 | score = csvdb["itemCsv"][pms[1]].adv_score_item * pms[2] |
... | ... | @@ -704,6 +748,7 @@ end |
704 | 748 | |
705 | 749 | --回合事件处理 |
706 | 750 | function Adv:afterRound() |
751 | + self.round = self.round + 1 | |
707 | 752 | if self.battle then |
708 | 753 | self.battle:afterRound() |
709 | 754 | end | ... | ... |
src/adv/AdvBattle.lua
... | ... | @@ -176,9 +176,9 @@ function Battle:afterRound() |
176 | 176 | end |
177 | 177 | for i = #self.enemys[mapIdx], 1, -1 do |
178 | 178 | if self.enemys[mapIdx][i].isDead then |
179 | - self.adv:enemyDead(self.enemys[mapIdx][i].roomId, self.enemys[mapIdx][i].blockId) | |
180 | 179 | self.enemys[mapIdx][i]:clear() |
181 | - table.remove(self.enemys[mapIdx], i) | |
180 | + local enemy = table.remove(self.enemys[mapIdx], i) | |
181 | + self.adv:enemyDead(enemy.roomId, enemy.blockId) | |
182 | 182 | end |
183 | 183 | end |
184 | 184 | ... | ... |
src/adv/AdvMap.lua
... | ... | @@ -11,7 +11,7 @@ local createMap, getEventLib |
11 | 11 | function Map:ctor(adv, mapIdx, mapInfo) |
12 | 12 | self.adv = adv |
13 | 13 | if type(mapInfo) == "number" then -- mapInfo 传入 id |
14 | - mapInfo = createMap(mapInfo, self.adv.chapterId, self.adv.level) -- 生成地图 | |
14 | + mapInfo = createMap(self, mapInfo) -- 生成地图 | |
15 | 15 | end |
16 | 16 | if not mapInfo then return end |
17 | 17 | |
... | ... | @@ -78,7 +78,7 @@ function Map:addNewMonsterRand(monsterId, where) |
78 | 78 | end |
79 | 79 | |
80 | 80 | if not monsterId then |
81 | - local eventLib = getEventLib(self.adv.chapterId, self.adv.level, AdvEventType.Monster) | |
81 | + local eventLib = getEventLib(self, AdvEventType.Monster) | |
82 | 82 | if not next(eventLib[AdvEventType.Monster][0]) then return false end |
83 | 83 | monsterId = math.randWeight(eventLib[AdvEventType.Monster][0], "showup") |
84 | 84 | end |
... | ... | @@ -161,7 +161,7 @@ end |
161 | 161 | |
162 | 162 | -----------------------------随机地图----------------------------- |
163 | 163 | |
164 | -createMap = function(mapId, chapterId, level) | |
164 | +createMap = function(self, mapId) | |
165 | 165 | local mapInfo = {} |
166 | 166 | mapInfo.rooms = {} |
167 | 167 | mapInfo.mapId = mapId |
... | ... | @@ -172,7 +172,7 @@ createMap = function(mapId, chapterId, level) |
172 | 172 | return |
173 | 173 | end |
174 | 174 | --事件随机 |
175 | - local eventLib = getEventLib(chapterId, level) -- 同时记录出现次数 | |
175 | + local eventLib = getEventLib(self) -- 同时记录出现次数 | |
176 | 176 | local monsterEvents = {} --处理钥匙掉落 |
177 | 177 | local haveBoss = false |
178 | 178 | |
... | ... | @@ -332,7 +332,8 @@ createMap = function(mapId, chapterId, level) |
332 | 332 | end |
333 | 333 | |
334 | 334 | --关卡事件库 |
335 | -getEventLib = function(chapterId, level, needEventType) -- needEventType 需要的事件 | |
335 | +getEventLib = function(self, needEventType) -- needEventType 需要的事件 | |
336 | + local chapterId, level = self.adv.chapterId, self.adv.level | |
336 | 337 | local chapter = math.floor(chapterId / 100) % 100 |
337 | 338 | |
338 | 339 | local libsToType = { |
... | ... | @@ -347,6 +348,9 @@ getEventLib = function(chapterId, level, needEventType) -- needEventType 需要 |
347 | 348 | |
348 | 349 | } |
349 | 350 | local eventLib = {} |
351 | + | |
352 | + local advEventOpenStatus = self.adv.owner:advEventOpenStatus() | |
353 | + | |
350 | 354 | for lib, eventType in pairs(libsToType) do |
351 | 355 | -- init eventLib |
352 | 356 | if type(eventType) == "table" then |
... | ... | @@ -359,15 +363,12 @@ getEventLib = function(chapterId, level, needEventType) -- needEventType 需要 |
359 | 363 | -- needEventType 只获取这个事件类型 |
360 | 364 | if not needEventType or eventLib[needEventType] then |
361 | 365 | for id, data in pairs(csvdb[lib]) do |
362 | - if data.levelchapter == chapter then | |
366 | + local etype = type(eventType) == "table" and eventType[data.type] or eventType | |
367 | + | |
368 | + if data.levelchapter == chapter and (data.unlockType == 0 or (advEventOpenStatus[etype] or {})[data.unlockType]) then | |
363 | 369 | if AdvCommon.checkIsIn(level, data.leveltype, data.levellimit) then |
364 | - if type(eventType) == "table" then | |
365 | - eventLib[eventType[data.type]][data.BlockEventType] = eventLib[eventType[data.type]][data.BlockEventType] or {} | |
366 | - eventLib[eventType[data.type]][data.BlockEventType][id] = {showup = data.showup, limit = data.limit} | |
367 | - else | |
368 | - eventLib[eventType][data.BlockEventType] = eventLib[eventType][data.BlockEventType] or {} | |
369 | - eventLib[eventType][data.BlockEventType][id] = {showup = data.showup, limit = data.limit} | |
370 | - end | |
370 | + eventLib[etype][data.BlockEventType] = eventLib[etype][data.BlockEventType] or {} | |
371 | + eventLib[etype][data.BlockEventType][id] = {showup = data.showup, limit = data.limit} | |
371 | 372 | end |
372 | 373 | end |
373 | 374 | end | ... | ... |
... | ... | @@ -0,0 +1,176 @@ |
1 | +local AdvTask = {} | |
2 | + | |
3 | + | |
4 | +function AdvTask.bind(Adv) | |
5 | + Adv.TaskType = { | |
6 | + Arrive = 1, --到达N层 | |
7 | + Kill = 2, --消灭指定怪物N个 | |
8 | + Item = 3, --获得指定道具N个 | |
9 | + Choose = 4, --完成指定抉择点N次 | |
10 | + Shop = 5, --和指定商人交易N次 | |
11 | + Build = 6, --和指定建筑交互N次 | |
12 | + KillAll = 7, --消灭本层所有怪物 | |
13 | + } | |
14 | + | |
15 | + -- 检查任务状态 在新领取任务的时候回进行检查 | |
16 | + local function checkTaskStatus(self, taskData, status, count, cond) | |
17 | + count = count or 0 | |
18 | + if status == -1 or not taskData then | |
19 | + return | |
20 | + end | |
21 | + local function checkCondValue() | |
22 | + if taskData.value2 ~= "" then | |
23 | + local conds = taskData.value2:toArray(true, "=") | |
24 | + for _, one in pairs(conds) do | |
25 | + if one == cond then | |
26 | + return true | |
27 | + end | |
28 | + end | |
29 | + end | |
30 | + return true | |
31 | + end | |
32 | + | |
33 | + local checkTaskFunc = {} | |
34 | + checkTaskFunc[Adv.TaskType.Arrive] = function() | |
35 | + if self.level > status then | |
36 | + if self.level >= taskData.value1 then | |
37 | + return -1 | |
38 | + else | |
39 | + return self.level | |
40 | + end | |
41 | + end | |
42 | + end | |
43 | + checkTaskFunc[Adv.TaskType.KillAll] = function() | |
44 | + if #self.battle.player:getTeam(2) == 0 then | |
45 | + return -1 | |
46 | + end | |
47 | + end | |
48 | + | |
49 | + if checkTaskFunc[taskData.condition] then | |
50 | + status = checkTaskFunc[taskData.condition]() | |
51 | + else | |
52 | + if count == 0 or not checkCondValue() then return end --没有变化 | |
53 | + status = status + count | |
54 | + if status >= taskData.value1 then | |
55 | + status = -1 | |
56 | + end | |
57 | + end | |
58 | + return status | |
59 | + end | |
60 | + | |
61 | + function Adv:initLayerTask() | |
62 | + self.advTask = {} | |
63 | + if not next(self.advMTask) then | |
64 | + self.advMTask = { | |
65 | + id = 1, | |
66 | + status = 0, | |
67 | + lock = 1, | |
68 | + } | |
69 | + self.advTaskChange = true | |
70 | + end | |
71 | + self.advMTask.id = self.advMTask.id or 1 | |
72 | + local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id] | |
73 | + if mainTaskData and self.advMTask.lock then | |
74 | + if math.floor(self.chapterId / 100) % 100 == mainTaskData.chapter and self.level >= mainTaskData.level then --到达指定关卡解锁当前任务 | |
75 | + self.advMTask.lock = nil | |
76 | + self.advMTask.status = 0 | |
77 | + local ts = checkTaskStatus(self, mainTaskData, self.advMTask.status, 0) | |
78 | + if ts then | |
79 | + self.advMTask.status = ts | |
80 | + end | |
81 | + self.advTaskChange = true | |
82 | + end | |
83 | + end | |
84 | + end | |
85 | + | |
86 | + function Adv:checkTask(taskType, count, cond) | |
87 | + local chapter = math.floor(self.chapterId / 100) % 100 | |
88 | + for taskId, status in pairs(self.advTask) do | |
89 | + local taskData = csvdb["event_questCsv"][taskId] | |
90 | + if taskData and taskData.levelchapter == chapter and taskType == taskData.condition then | |
91 | + local ts = checkTaskStatus(self, taskData, status, count, cond) | |
92 | + if ts then | |
93 | + self.advTask[taskId] = ts | |
94 | + self.advTaskChange = true | |
95 | + end | |
96 | + end | |
97 | + end | |
98 | + | |
99 | + local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id] | |
100 | + if not self.advMTask.lock and mainTaskData and mainTaskData.chapter == chapter and taskType == mainTaskData.condition then | |
101 | + local ts = checkTaskStatus(self, mainTaskData, self.advMTask.status, count, cond) | |
102 | + if ts then | |
103 | + self.advMTask.status = ts | |
104 | + self.advTaskChange = true | |
105 | + end | |
106 | + end | |
107 | + end | |
108 | + | |
109 | + -- 点击任务地块领取任务 | |
110 | + function Adv:addTask(taskId) | |
111 | + local taskData = csvdb["event_questCsv"][taskId] | |
112 | + if taskData then | |
113 | + self.advTask[taskId] = 0 | |
114 | + local ts = checkTaskStatus(self, taskData, self.advTask[taskId], 0) | |
115 | + if ts then | |
116 | + self.advTask[taskId] = ts | |
117 | + end | |
118 | + | |
119 | + self.advTaskChange = true | |
120 | + return true | |
121 | + end | |
122 | + end | |
123 | + | |
124 | + --完成层任务 | |
125 | + function Adv:finishTask(taskId) | |
126 | + local ok, reward | |
127 | + if self.advTask[taskId] and self.advTask[taskId] == -1 then | |
128 | + local taskData = csvdb["event_questCsv"][taskId] | |
129 | + if not taskData then return end | |
130 | + if taskData.reward == 1 then | |
131 | + reward = self.owner:award(taskData.rewardValue) | |
132 | + end | |
133 | + self.advTask[taskId] = nil | |
134 | + self.owner:updateProperty({field = "advTask", value = self.advTask}) | |
135 | + ok = true | |
136 | + end | |
137 | + return ok, reward | |
138 | + end | |
139 | + | |
140 | + -- 完成主线任务 | |
141 | + function Adv:finishMTask() | |
142 | + local ok, reward | |
143 | + if self.advMTask.status == -1 then --已完成带领取 | |
144 | + local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id] | |
145 | + if not mainTaskData then return end | |
146 | + if mainTaskData.reward == 1 then | |
147 | + reward = self.owner:award(mainTaskData.rewardValue) | |
148 | + end | |
149 | + self.advMTask.id = self.advMTask.id + 1 | |
150 | + self.advMTask.status = 0 | |
151 | + local nextTaskData = csvdb["adv_questCsv"][self.advMTask.id] | |
152 | + if not nextTaskData or math.floor(self.chapterId / 100) % 100 ~= nextTaskData.chapter or self.level < nextTaskData.level then | |
153 | + self.advMTask.lock = true | |
154 | + else | |
155 | + local ts = checkTaskStatus(self, nextTaskData, self.advMTask.status, 0) | |
156 | + if ts then | |
157 | + self.advMTask.status = ts | |
158 | + end | |
159 | + end | |
160 | + | |
161 | + self.owner:updateProperty({field = "advMTask", value = self.advMTask}) | |
162 | + ok = true | |
163 | + end | |
164 | + return ok, reward | |
165 | + end | |
166 | + | |
167 | + function Adv:updateTask(notNotify) | |
168 | + if self.advTaskChange then | |
169 | + self.owner:updateProperties({advTask = self.advTask, advMTask = self.advMTask}, notNotify) | |
170 | + end | |
171 | + self.advTaskChange = false | |
172 | + end | |
173 | +end | |
174 | + | |
175 | + | |
176 | +return AdvTask | |
0 | 177 | \ No newline at end of file | ... | ... |
src/models/Daily.lua
... | ... | @@ -18,7 +18,7 @@ function Daily:updateProperty(params) |
18 | 18 | local type, default = table.unpack(self.schema[params.field]) |
19 | 19 | |
20 | 20 | if params.delta then |
21 | - self:setProperty(params.field, self:getProperty(paramsfield) + params.delta) | |
21 | + self:incrProperty(params.field, params.delta) | |
22 | 22 | self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) |
23 | 23 | return true |
24 | 24 | end | ... | ... |
src/models/Role.lua
... | ... | @@ -36,6 +36,7 @@ Role.schema = { |
36 | 36 | level = {"number", 1}, |
37 | 37 | exp = {"number", 0}, |
38 | 38 | items = {"string", ""}, |
39 | + funcOpen = {"table", {}}, --功能是否开放 | |
39 | 40 | loveStatus = {"string", ""}, --统计角色的最高 好感度等级 类型相关 -- type=loveL type=loveL |
40 | 41 | crown = {"number", 0}, -- 看伴娘 |
41 | 42 | |
... | ... | @@ -47,8 +48,8 @@ Role.schema = { |
47 | 48 | advInfo = {"table", {}}, -- 冒险关卡信息 |
48 | 49 | advTeam = {"table", {}}, -- 冒险玩家队伍信息 |
49 | 50 | advHang = {"table", {}}, -- 挂机信息 -- {chapterId = {format = teaminfo, time = endtime}} |
50 | - advTask = {"table", {l = {}, m = {}}}, -- 冒险已领取任务完成状态 -- l 层级任务, m 主线任务 {id = status} | |
51 | - advMTask = {"table", {}}, -- 冒险主线已经完成的任务[数组] --为了节省空间 服务器使用 | |
51 | + advTask = {"table", {}}, -- 冒险已领取任务完成状态 {id = status} --每层重置 | |
52 | + advMTask = {"table", {id = 1, status = 0, lock = true}}, -- 冒险主线任务 -- {id = id, status = status, lock = true} -- 当前主线id 当前主线状态 是否锁定状态 | |
52 | 53 | advAchiev = {"table", {}}, -- 冒险成就 {chapterId = {achievId = status}} |
53 | 54 | --挂机相关 |
54 | 55 | hangPass = {"table", {}}, -- 挂机通过的最大关卡 |
... | ... | @@ -173,6 +174,7 @@ function Role:data() |
173 | 174 | level = self:getProperty("level"), |
174 | 175 | exp = self:getProperty("exp"), |
175 | 176 | items = self:getProperty("items"):toNumMap(), |
177 | + funcOpen = self:getProperty("funcOpen"), | |
176 | 178 | loveStatus = self:getProperty("loveStatus"):toNumMap(), |
177 | 179 | diamond = self:getAllDiamond(), |
178 | 180 | bagLimit = self:getProperty("bagLimit"), | ... | ... |
src/models/RolePlugin.lua
... | ... | @@ -96,6 +96,9 @@ function RolePlugin.bind(Role) |
96 | 96 | [ItemType.AdvItem] = function() --冒险道具不会进入 玩家仓库 |
97 | 97 | count = 0 |
98 | 98 | end, |
99 | + [ItemType.FuncOpen] = function() | |
100 | + self:funcOpen(itemId) | |
101 | + end, | |
99 | 102 | } |
100 | 103 | -- 对数量筛查 |
101 | 104 | count = checkItemCount(self, itemId, count) |
... | ... | @@ -585,6 +588,55 @@ function RolePlugin.bind(Role) |
585 | 588 | -- todo |
586 | 589 | return globalCsv.adv_daily_cross_count |
587 | 590 | end |
591 | + | |
592 | + function Role:isFuncOpen(func) | |
593 | + return self:getProperty("funcOpen")[func] == 1 | |
594 | + end | |
595 | + | |
596 | + function Role:funcOpen(func) | |
597 | + if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then | |
598 | + self:changeUpdates({{type = "funcOpen", field = func, value = 1}}) | |
599 | + end | |
600 | + end | |
601 | + | |
602 | + function Role:funcClose(func) | |
603 | + if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then | |
604 | + self:changeUpdates({{type = "funcOpen", field = func, value = nil}}) | |
605 | + end | |
606 | + end | |
607 | + | |
608 | + function Role:advChapterIsOpen(chapterId, layer) | |
609 | + local chapter = math.floor(chapterId / 100) % 100 | |
610 | + local exlayer = math.floor((layer - 1) / 10) * 10 + 1 | |
611 | + | |
612 | + if exlayer == 1 then --第一层判断前置 | |
613 | + local advPass = self:getProperty("advPass") | |
614 | + local chapterData = csvdb["adv_chapterCsv"][chapterId] | |
615 | + for id, l in pairs(chapterData.prepose:toNumMap()) do | |
616 | + if (advPass[id] or 0) < l then return false end -- 前置 | |
617 | + end | |
618 | + return true | |
619 | + end | |
620 | + | |
621 | + local unlock = {} | |
622 | + for func , data in pairs(csvdb["unlockCsv"]) do | |
623 | + if data.type == 1 and chapter == data.value1 and exlayer == data.value2 then | |
624 | + return self:isFuncOpen(func) | |
625 | + end | |
626 | + end | |
627 | + end | |
628 | + | |
629 | + function Role:advEventOpenStatus() | |
630 | + local openStatus = {} | |
631 | + for func , data in pairs(csvdb["unlockCsv"]) do | |
632 | + if data.type == 5 then | |
633 | + openStatus[data.value1] = openStatus[data.value1] or {} | |
634 | + openStatus[data.value1][data.value2] = self:isFuncOpen(func) | |
635 | + end | |
636 | + end | |
637 | + return openStatus | |
638 | + end | |
639 | + | |
588 | 640 | end |
589 | 641 | |
590 | 642 | return RolePlugin |
591 | 643 | \ No newline at end of file | ... | ... |