Commit 4faef572d59a9a0dd795125987386e9c91b02ffc

Authored by zhouhaihai
1 parent 7104d350

冒险任务,冒险扫荡, 冒险中继

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
... ... @@ -39,6 +39,7 @@ actionCodes = {
39 39 Adv_endBattleRpc = 158,
40 40 Adv_endHangRpc = 159,
41 41 Adv_buyAdvCountRpc = 160,
  42 + Adv_finishTaskRpc = 161,
42 43  
43 44 Hero_loadInfos = 201,
44 45 Hero_updateProperty = 202,
... ...
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 &quot;adv.AdvCommon&quot;
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
... ...
src/adv/AdvTask.lua 0 → 100644
... ... @@ -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
... ...