From 4faef572d59a9a0dd795125987386e9c91b02ffc Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Wed, 11 Sep 2019 09:58:39 +0800 Subject: [PATCH] 冒险任务,冒险扫荡, 冒险中继 --- src/GlobalVar.lua | 7 +++++++ src/ProtocolCode.lua | 1 + src/actions/AdvAction.lua | 45 ++++++++++++++++++++++++++++++++------------- src/actions/GmAction.lua | 33 +++++++++++++++++++++++++++++++++ src/adv/Adv.lua | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- src/adv/AdvBattle.lua | 4 ++-- src/adv/AdvMap.lua | 27 ++++++++++++++------------- src/adv/AdvTask.lua | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/models/Daily.lua | 2 +- src/models/Role.lua | 6 ++++-- src/models/RolePlugin.lua | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 11 files changed, 376 insertions(+), 40 deletions(-) create mode 100644 src/adv/AdvTask.lua diff --git a/src/GlobalVar.lua b/src/GlobalVar.lua index d61f41f..3fd9caa 100644 --- a/src/GlobalVar.lua +++ b/src/GlobalVar.lua @@ -43,6 +43,13 @@ ItemType = { LunchBox = 12, -- 便当盒(料理合成,冒险系统消耗道具) TimeBox = 13, -- 时间箱(开启需要时间,随机产出道具) AdvItem = 14, -- 冒险道具 + FuncOpen = 15, -- 管理功能开放 +} + +FuncOpenType = { + AdvEndless = 5919, -- 无尽模式 + AdvRelay = 5920, -- 中继开放 + AdvArtifact = 5921, -- 神器开放 } -- 物品起始id diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index 7f12deb..1898c07 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -39,6 +39,7 @@ actionCodes = { Adv_endBattleRpc = 158, Adv_endHangRpc = 159, Adv_buyAdvCountRpc = 160, + Adv_finishTaskRpc = 161, Hero_loadInfos = 201, Hero_updateProperty = 202, diff --git a/src/actions/AdvAction.lua b/src/actions/AdvAction.lua index bf2ec9f..73583e6 100644 --- a/src/actions/AdvAction.lua +++ b/src/actions/AdvAction.lua @@ -56,9 +56,9 @@ function _M.startAdvRpc( agent, data ) local layer = msg.layer or 1 --选择层数 local format = msg.format --编队 local chapterData = csvdb["adv_chapterCsv"][chapterId] - if not chapterData then return end + if not chapterData then return 1 end - if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return end -- 是否有体力 + if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return 2 end -- 是否有体力 local oklayer = false --层是否合法 if layer ~= 1 then @@ -68,30 +68,32 @@ function _M.startAdvRpc( agent, data ) break end end + else + oklayer = true 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 not oklayer then return 3 end + if layer > chapterData.limitlevel then return 4 end - if layer ~= 1 and (advPass[chapterId] or 0) < (layer - 1) then return end --中继 + -- 关卡开放判断 + if not role:advChapterIsOpen(chapterId, layer) then return 5 end - if not checkFormat(role, format) then return end + --中继开放判断 + if layer ~= 1 and (not role:isFuncOpen(FuncOpenType.AdvRelay) or (advPass[chapterId] or 0) < (layer - 1)) then return 6 end + + if not checkFormat(role, format) then return 7 end --上一个关卡结束才可以开始新的关卡 - if next(role:getProperty("advInfo")) then return end + if next(role:getProperty("advInfo")) then return 8 end local advTeam = role:getProperty("advTeam") table.clear(advTeam) advTeam.heros = {} - for slot, heroId in pairs(msg.heros) do + for slot, heroId in pairs(format.heros) do advTeam.heros[slot] = heroId end - advTeam.leader = msg.leader + advTeam.leader = format.leader role:updateProperty({field = "advTeam", value = advTeam}) role.dailyData:updateProperty({field = "advC", delta = 1}) @@ -203,6 +205,23 @@ function _M.buyAdvCountRpc(agent , data) return true end +function _M.finishTaskRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + + local adv = role:getAdvData() + local taskId = msg.taskId -- -1 则是主线任务 + local status, reward + if taskId == -1 then + status, reward = adv:finishMTask() + else + status, reward = adv:finishTask(taskId) + end + if not status then return end + SendPacket(actionCodes.Adv_finishTaskRpc, MsgPack.pack({reward = reward})) + return true +end + -- 点击地块(解锁)(触发事件) function _M.clickBlockRpc(agent, data) local role = agent.role diff --git a/src/actions/GmAction.lua b/src/actions/GmAction.lua index 50a6b13..5df66fb 100644 --- a/src/actions/GmAction.lua +++ b/src/actions/GmAction.lua @@ -163,12 +163,45 @@ end function _M.advc(role, pms) role:updateProperty({field = "advInfo", value = {}}) + role:updateProperty({field = "advTask", value = {}}) role:updateProperty({field = "advItems", value = ""}) role:updateProperty({field = "advTeam", value = {}}) role.advData = nil return "成功" end +function _M.advf(role, pms) + role.dailyData:updateProperty({field = "advC", value = 0}) + return "成功" +end + +function _M.adv(role, pms) + local chapterId = tonum(pms.pm1) + local layer = tonum(pms.pm2) + + local advData = csvdb["adv_chapterCsv"][chapterId] + if not advData then return end + layer = math.min(layer, advData.limitlevel) + local advPass = role:getProperty("advPass") + local addPre + addPre = function(chapterId) + local advData = csvdb["adv_chapterCsv"][chapterId] + for pre, l in ipairs(advData.prepose:toNumMap()) do + if (advPass[pre] or 0) < l then + advPass[pre] = l + addPre(pre) + end + end + end + if (advPass[chapterId] or 0) < layer then + advPass[chapterId] = layer + addPre(chapterId) + role:updateProperty({field = "advPass", value = advPass}) + end + + return "成功" +end + function _M.idlec(role, pms) role:updateProperty({field = "hangTeam", value = {}}) role:updateProperty({field = "hangInfo", value = {}}) diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index 6b51ad1..fcb9ef6 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -4,12 +4,20 @@ local AdvCommon = require "adv.AdvCommon" local AdvMap = require "adv.AdvMap" local Adv = class("Adv") +local AdvTask = import(".AdvTask") --任务相关数据搞出去 +AdvTask.bind(Adv) + function Adv:ctor(owner) assert(owner, "Adv instance must have owner(role)") self.owner = owner self.maps = {} self.battle = nil self.backEvents = {} --发给客户端的事件组 + + self.advTask = self.owner:getProperty("advTask") + self.advMTask = self.owner:getProperty("advMTask") + self.advTaskChange = false -- 任务改变才更新 + self:initByInfo(self.owner:getProperty("advInfo")) end @@ -19,6 +27,7 @@ function Adv:initByInfo(advInfo) self.chapterId = advInfo.chapterId self.level = advInfo.level or 1 + self.round = advInfo.round or 0 self.score = advInfo.score or {} self.lastEnemyId = advInfo.lastEId or 1 self.mapStack = advInfo.mstack or {} @@ -35,6 +44,7 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify) if self.chapterId and chapterId ~= self.chapterId then return end --新的关卡 或者 去到下一层 self.chapterId = chapterId self.level = level or 1 + self.round = 0 self.score = self.score or {} self.lastEnemyId = 1 self.mapStack = {1} -- 最后一个为当前的地图 @@ -50,6 +60,9 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify) self:initBattle() + self:initLayerTask() + + self:checkTask(Adv.TaskType.Arrive) if not notNotify then self:saveDB(notNotify) end @@ -59,6 +72,7 @@ function Adv:clear() self.chapterId = nil self.level = nil self.score = {} + self.round = 0 self.lastEnemyId = 1 self.mapStack = {} self.maps = {} @@ -71,6 +85,7 @@ function Adv:saveDB(notNotify) advInfo.chapterId = self.chapterId advInfo.level = self.level + advInfo.round = self.round advInfo.score = self.score advInfo.lastEId = self.lastEnemyId advInfo.mstack = self.mapStack @@ -87,7 +102,8 @@ function Adv:saveDB(notNotify) else advTeam.player = nil end - + + self:updateTask(notNotify) self.owner:updateProperties({advInfo = advInfo, advTeam = advTeam}, notNotify) end @@ -139,11 +155,6 @@ function Adv:over(success) local scoreInfo = self.score local reward if success then - 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 @@ -209,6 +220,7 @@ function Adv:award(gift, params) for itemId, count in pairs(tgift) do if count > 0 then self:scoreChange(AdvScoreType.Item, {itemId, count}) + self:checkTask(Adv.TaskType.Item, count, itemId) end local origin = items:getv(itemId, 0) local nums = origin + count @@ -255,7 +267,22 @@ local function clickOut(self, room, block, params) table.remove(self.mapStack) --退出夹层 self:backLayer() else --处于底层 - if self.level >= csvdb["adv_chapterCsv"][self.chapterId].limitlevel then --关卡结束 + + 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 + if params.relay then + local ok = false + for _, exLayer in ipairs(globalCsv.adv_can_out_layer) do + if exLayer == self.level then + ok = true + break + end + end + if not ok then return end + end + if params.relay or self.level >= csvdb["adv_chapterCsv"][self.chapterId].limitlevel or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1) then --关卡结束 self:over(true) else self:initByChapter(self.chapterId, self.level + 1, true, true) @@ -340,6 +367,8 @@ local function clickChoose(self, room, block, params) doEffect[effect[1]]() end + self:checkTask(Adv.TaskType.Choose, 1, block.event.id) + if clearBlock then block:clear() end @@ -367,6 +396,7 @@ local function clickTrader(self, room, block, params) local reward = self:award({[block.event.shop[buyId][1]] = block.event.shop[buyId][2]}) block.event.status = block.event.status:setv(buyId, 1) + self:checkTask(Adv.TaskType.Shop, 1, block.event.id) self:backReward(reward) return true end @@ -395,6 +425,7 @@ local function clickBuild(self, room, block, params) assert(doEffect[effect[1]], "error effect, event_buildingCsv id :" .. block.event.id) if not self:cost(buildData.required:toNumMap(), {}) then return end doEffect[effect[1]]() + self:checkTask(Adv.TaskType.Build, 1, block.event.id) if clearBlock then block:clear() end @@ -443,6 +474,13 @@ local function clickLayer(self, room, block, params) return true end +local function clickTask(self, room, block, params) + if self:addTask(block.event.id) then --增加任务 + block:clear() + return true + end +end + local eventCallFunc = { [AdvEventType.Out] = clickOut, [AdvEventType.BOSS] = clickMonster, @@ -453,6 +491,7 @@ local eventCallFunc = { [AdvEventType.Build] = clickBuild, [AdvEventType.Click] = clickClick, [AdvEventType.Layer] = clickLayer, + [AdvEventType.Task] = clickTask, } --点击处理 roomId, blockId @@ -567,7 +606,9 @@ function Adv:enemyDead(roomId, blockId, escape) if escape then block:clear() else - local monsterData = csvdb["event_monsterCsv"][block.event.id] + + local enemyId = block.event.id + local monsterData = csvdb["event_monsterCsv"][enemyId] self:scoreChange(AdvScoreType.Kill, monsterData.type) local item = block.event.item @@ -575,6 +616,7 @@ function Adv:enemyDead(roomId, blockId, escape) local dropData = csvdb["event_dropCsv"][monsterData.dropid] item = dropData["range"]:randWeight(true) end + if item[1] == 0 then block:clear() else @@ -583,6 +625,8 @@ function Adv:enemyDead(roomId, blockId, escape) item = item }) end + self:checkTask(Adv.TaskType.Kill, 1, enemyId) + self:checkTask(Adv.TaskType.KillAll) end end self:backBlockChange(roomId, blockId) @@ -665,7 +709,7 @@ function Adv:scoreChange(scoreType, pms) end cutTypes[AdvScoreType.Kill] = function() local chapterData = csvdb["adv_chapterCsv"][self.chapterId] - score = globalCsv.adv_score_monster[pms] * chapterData["monRatio"] + score = globalCsv.adv_score_monster[pms] * chapterData["reward"] end cutTypes[AdvScoreType.Item] = function() score = csvdb["itemCsv"][pms[1]].adv_score_item * pms[2] @@ -704,6 +748,7 @@ end --回合事件处理 function Adv:afterRound() + self.round = self.round + 1 if self.battle then self.battle:afterRound() end diff --git a/src/adv/AdvBattle.lua b/src/adv/AdvBattle.lua index 430852b..045ff34 100644 --- a/src/adv/AdvBattle.lua +++ b/src/adv/AdvBattle.lua @@ -176,9 +176,9 @@ function Battle:afterRound() end for i = #self.enemys[mapIdx], 1, -1 do if self.enemys[mapIdx][i].isDead then - self.adv:enemyDead(self.enemys[mapIdx][i].roomId, self.enemys[mapIdx][i].blockId) self.enemys[mapIdx][i]:clear() - table.remove(self.enemys[mapIdx], i) + local enemy = table.remove(self.enemys[mapIdx], i) + self.adv:enemyDead(enemy.roomId, enemy.blockId) end end diff --git a/src/adv/AdvMap.lua b/src/adv/AdvMap.lua index e4e6c46..51c123b 100644 --- a/src/adv/AdvMap.lua +++ b/src/adv/AdvMap.lua @@ -11,7 +11,7 @@ local createMap, getEventLib function Map:ctor(adv, mapIdx, mapInfo) self.adv = adv if type(mapInfo) == "number" then -- mapInfo 传入 id - mapInfo = createMap(mapInfo, self.adv.chapterId, self.adv.level) -- 生成地图 + mapInfo = createMap(self, mapInfo) -- 生成地图 end if not mapInfo then return end @@ -78,7 +78,7 @@ function Map:addNewMonsterRand(monsterId, where) end if not monsterId then - local eventLib = getEventLib(self.adv.chapterId, self.adv.level, AdvEventType.Monster) + local eventLib = getEventLib(self, AdvEventType.Monster) if not next(eventLib[AdvEventType.Monster][0]) then return false end monsterId = math.randWeight(eventLib[AdvEventType.Monster][0], "showup") end @@ -161,7 +161,7 @@ end -----------------------------随机地图----------------------------- -createMap = function(mapId, chapterId, level) +createMap = function(self, mapId) local mapInfo = {} mapInfo.rooms = {} mapInfo.mapId = mapId @@ -172,7 +172,7 @@ createMap = function(mapId, chapterId, level) return end --事件随机 - local eventLib = getEventLib(chapterId, level) -- 同时记录出现次数 + local eventLib = getEventLib(self) -- 同时记录出现次数 local monsterEvents = {} --处理钥匙掉落 local haveBoss = false @@ -332,7 +332,8 @@ createMap = function(mapId, chapterId, level) end --关卡事件库 -getEventLib = function(chapterId, level, needEventType) -- needEventType 需要的事件 +getEventLib = function(self, needEventType) -- needEventType 需要的事件 + local chapterId, level = self.adv.chapterId, self.adv.level local chapter = math.floor(chapterId / 100) % 100 local libsToType = { @@ -347,6 +348,9 @@ getEventLib = function(chapterId, level, needEventType) -- needEventType 需要 } local eventLib = {} + + local advEventOpenStatus = self.adv.owner:advEventOpenStatus() + for lib, eventType in pairs(libsToType) do -- init eventLib if type(eventType) == "table" then @@ -359,15 +363,12 @@ getEventLib = function(chapterId, level, needEventType) -- needEventType 需要 -- needEventType 只获取这个事件类型 if not needEventType or eventLib[needEventType] then for id, data in pairs(csvdb[lib]) do - if data.levelchapter == chapter then + local etype = type(eventType) == "table" and eventType[data.type] or eventType + + if data.levelchapter == chapter and (data.unlockType == 0 or (advEventOpenStatus[etype] or {})[data.unlockType]) then if AdvCommon.checkIsIn(level, data.leveltype, data.levellimit) then - if type(eventType) == "table" then - eventLib[eventType[data.type]][data.BlockEventType] = eventLib[eventType[data.type]][data.BlockEventType] or {} - eventLib[eventType[data.type]][data.BlockEventType][id] = {showup = data.showup, limit = data.limit} - else - eventLib[eventType][data.BlockEventType] = eventLib[eventType][data.BlockEventType] or {} - eventLib[eventType][data.BlockEventType][id] = {showup = data.showup, limit = data.limit} - end + eventLib[etype][data.BlockEventType] = eventLib[etype][data.BlockEventType] or {} + eventLib[etype][data.BlockEventType][id] = {showup = data.showup, limit = data.limit} end end end diff --git a/src/adv/AdvTask.lua b/src/adv/AdvTask.lua new file mode 100644 index 0000000..0329e3d --- /dev/null +++ b/src/adv/AdvTask.lua @@ -0,0 +1,176 @@ +local AdvTask = {} + + +function AdvTask.bind(Adv) + Adv.TaskType = { + Arrive = 1, --到达N层 + Kill = 2, --消灭指定怪物N个 + Item = 3, --获得指定道具N个 + Choose = 4, --完成指定抉择点N次 + Shop = 5, --和指定商人交易N次 + Build = 6, --和指定建筑交互N次 + KillAll = 7, --消灭本层所有怪物 + } + + -- 检查任务状态 在新领取任务的时候回进行检查 + local function checkTaskStatus(self, taskData, status, count, cond) + count = count or 0 + if status == -1 or not taskData then + return + end + local function checkCondValue() + if taskData.value2 ~= "" then + local conds = taskData.value2:toArray(true, "=") + for _, one in pairs(conds) do + if one == cond then + return true + end + end + end + return true + end + + local checkTaskFunc = {} + checkTaskFunc[Adv.TaskType.Arrive] = function() + if self.level > status then + if self.level >= taskData.value1 then + return -1 + else + return self.level + end + end + end + checkTaskFunc[Adv.TaskType.KillAll] = function() + if #self.battle.player:getTeam(2) == 0 then + return -1 + end + end + + if checkTaskFunc[taskData.condition] then + status = checkTaskFunc[taskData.condition]() + else + if count == 0 or not checkCondValue() then return end --没有变化 + status = status + count + if status >= taskData.value1 then + status = -1 + end + end + return status + end + + function Adv:initLayerTask() + self.advTask = {} + if not next(self.advMTask) then + self.advMTask = { + id = 1, + status = 0, + lock = 1, + } + self.advTaskChange = true + end + self.advMTask.id = self.advMTask.id or 1 + local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id] + if mainTaskData and self.advMTask.lock then + if math.floor(self.chapterId / 100) % 100 == mainTaskData.chapter and self.level >= mainTaskData.level then --到达指定关卡解锁当前任务 + self.advMTask.lock = nil + self.advMTask.status = 0 + local ts = checkTaskStatus(self, mainTaskData, self.advMTask.status, 0) + if ts then + self.advMTask.status = ts + end + self.advTaskChange = true + end + end + end + + function Adv:checkTask(taskType, count, cond) + local chapter = math.floor(self.chapterId / 100) % 100 + for taskId, status in pairs(self.advTask) do + local taskData = csvdb["event_questCsv"][taskId] + if taskData and taskData.levelchapter == chapter and taskType == taskData.condition then + local ts = checkTaskStatus(self, taskData, status, count, cond) + if ts then + self.advTask[taskId] = ts + self.advTaskChange = true + end + end + end + + local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id] + if not self.advMTask.lock and mainTaskData and mainTaskData.chapter == chapter and taskType == mainTaskData.condition then + local ts = checkTaskStatus(self, mainTaskData, self.advMTask.status, count, cond) + if ts then + self.advMTask.status = ts + self.advTaskChange = true + end + end + end + + -- 点击任务地块领取任务 + function Adv:addTask(taskId) + local taskData = csvdb["event_questCsv"][taskId] + if taskData then + self.advTask[taskId] = 0 + local ts = checkTaskStatus(self, taskData, self.advTask[taskId], 0) + if ts then + self.advTask[taskId] = ts + end + + self.advTaskChange = true + return true + end + end + + --完成层任务 + function Adv:finishTask(taskId) + local ok, reward + if self.advTask[taskId] and self.advTask[taskId] == -1 then + local taskData = csvdb["event_questCsv"][taskId] + if not taskData then return end + if taskData.reward == 1 then + reward = self.owner:award(taskData.rewardValue) + end + self.advTask[taskId] = nil + self.owner:updateProperty({field = "advTask", value = self.advTask}) + ok = true + end + return ok, reward + end + + -- 完成主线任务 + function Adv:finishMTask() + local ok, reward + if self.advMTask.status == -1 then --已完成带领取 + local mainTaskData = csvdb["adv_questCsv"][self.advMTask.id] + if not mainTaskData then return end + if mainTaskData.reward == 1 then + reward = self.owner:award(mainTaskData.rewardValue) + end + self.advMTask.id = self.advMTask.id + 1 + self.advMTask.status = 0 + local nextTaskData = csvdb["adv_questCsv"][self.advMTask.id] + if not nextTaskData or math.floor(self.chapterId / 100) % 100 ~= nextTaskData.chapter or self.level < nextTaskData.level then + self.advMTask.lock = true + else + local ts = checkTaskStatus(self, nextTaskData, self.advMTask.status, 0) + if ts then + self.advMTask.status = ts + end + end + + self.owner:updateProperty({field = "advMTask", value = self.advMTask}) + ok = true + end + return ok, reward + end + + function Adv:updateTask(notNotify) + if self.advTaskChange then + self.owner:updateProperties({advTask = self.advTask, advMTask = self.advMTask}, notNotify) + end + self.advTaskChange = false + end +end + + +return AdvTask \ No newline at end of file diff --git a/src/models/Daily.lua b/src/models/Daily.lua index 1385184..0a5fd2a 100644 --- a/src/models/Daily.lua +++ b/src/models/Daily.lua @@ -18,7 +18,7 @@ function Daily:updateProperty(params) local type, default = table.unpack(self.schema[params.field]) if params.delta then - self:setProperty(params.field, self:getProperty(paramsfield) + params.delta) + self:incrProperty(params.field, params.delta) self.owner:notifyUpdateProperty(params.field, self:getProperty(params.field)) return true end diff --git a/src/models/Role.lua b/src/models/Role.lua index 74b94be..6582954 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -36,6 +36,7 @@ Role.schema = { level = {"number", 1}, exp = {"number", 0}, items = {"string", ""}, + funcOpen = {"table", {}}, --功能是否开放 loveStatus = {"string", ""}, --统计角色的最高 好感度等级 类型相关 -- type=loveL type=loveL crown = {"number", 0}, -- 看伴娘 @@ -47,8 +48,8 @@ Role.schema = { advInfo = {"table", {}}, -- 冒险关卡信息 advTeam = {"table", {}}, -- 冒险玩家队伍信息 advHang = {"table", {}}, -- 挂机信息 -- {chapterId = {format = teaminfo, time = endtime}} - advTask = {"table", {l = {}, m = {}}}, -- 冒险已领取任务完成状态 -- l 层级任务, m 主线任务 {id = status} - advMTask = {"table", {}}, -- 冒险主线已经完成的任务[数组] --为了节省空间 服务器使用 + advTask = {"table", {}}, -- 冒险已领取任务完成状态 {id = status} --每层重置 + advMTask = {"table", {id = 1, status = 0, lock = true}}, -- 冒险主线任务 -- {id = id, status = status, lock = true} -- 当前主线id 当前主线状态 是否锁定状态 advAchiev = {"table", {}}, -- 冒险成就 {chapterId = {achievId = status}} --挂机相关 hangPass = {"table", {}}, -- 挂机通过的最大关卡 @@ -173,6 +174,7 @@ function Role:data() level = self:getProperty("level"), exp = self:getProperty("exp"), items = self:getProperty("items"):toNumMap(), + funcOpen = self:getProperty("funcOpen"), loveStatus = self:getProperty("loveStatus"):toNumMap(), diamond = self:getAllDiamond(), bagLimit = self:getProperty("bagLimit"), diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index f5db5e5..052c7fe 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -96,6 +96,9 @@ function RolePlugin.bind(Role) [ItemType.AdvItem] = function() --冒险道具不会进入 玩家仓库 count = 0 end, + [ItemType.FuncOpen] = function() + self:funcOpen(itemId) + end, } -- 对数量筛查 count = checkItemCount(self, itemId, count) @@ -585,6 +588,55 @@ function RolePlugin.bind(Role) -- todo return globalCsv.adv_daily_cross_count end + + function Role:isFuncOpen(func) + return self:getProperty("funcOpen")[func] == 1 + end + + function Role:funcOpen(func) + if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then + self:changeUpdates({{type = "funcOpen", field = func, value = 1}}) + end + end + + function Role:funcClose(func) + if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then + self:changeUpdates({{type = "funcOpen", field = func, value = nil}}) + end + end + + function Role:advChapterIsOpen(chapterId, layer) + local chapter = math.floor(chapterId / 100) % 100 + local exlayer = math.floor((layer - 1) / 10) * 10 + 1 + + if exlayer == 1 then --第一层判断前置 + local advPass = self:getProperty("advPass") + local chapterData = csvdb["adv_chapterCsv"][chapterId] + for id, l in pairs(chapterData.prepose:toNumMap()) do + if (advPass[id] or 0) < l then return false end -- 前置 + end + return true + end + + local unlock = {} + for func , data in pairs(csvdb["unlockCsv"]) do + if data.type == 1 and chapter == data.value1 and exlayer == data.value2 then + return self:isFuncOpen(func) + end + end + end + + function Role:advEventOpenStatus() + local openStatus = {} + for func , data in pairs(csvdb["unlockCsv"]) do + if data.type == 5 then + openStatus[data.value1] = openStatus[data.value1] or {} + openStatus[data.value1][data.value2] = self:isFuncOpen(func) + end + end + return openStatus + end + end return RolePlugin \ No newline at end of file -- libgit2 0.21.2