From 8da953a773e97ebd7cd2d97be6a8eb9b8c78ff67 Mon Sep 17 00:00:00 2001 From: zhouhaihai Date: Wed, 18 Sep 2019 11:32:40 +0800 Subject: [PATCH] 无尽模式 --- src/actions/AdvAction.lua | 45 ++++++++++++++++++++++++++++++++------------- src/actions/RoleAction.lua | 1 + src/adv/Adv.lua | 27 +++++++++++++++++++++------ src/adv/AdvCommon.lua | 4 ++++ src/adv/AdvMap.lua | 8 +++++++- src/models/Role.lua | 3 +++ src/models/RolePlugin.lua | 9 +++++++++ 7 files changed, 77 insertions(+), 20 deletions(-) diff --git a/src/actions/AdvAction.lua b/src/actions/AdvAction.lua index 7fd80ee..8d37310 100644 --- a/src/actions/AdvAction.lua +++ b/src/actions/AdvAction.lua @@ -14,6 +14,8 @@ local table_insert = table.insert local tconcat = table.concat local table_unpack = table.unpack +local AdvCommon = require "adv.AdvCommon" + local _M = {} @@ -55,27 +57,45 @@ function _M.startAdvRpc( agent, data ) local chapterId = msg.chapterId --关卡id local layer = msg.layer or 1 --选择层数 local format = msg.format --编队 + + --上一个关卡结束才可以开始新的关卡 + if next(role:getProperty("advInfo")) then return 8 end + local chapterData = csvdb["adv_chapterCsv"][chapterId] - if not chapterData then return 1 end + if not chapterData or layer < 1 then return 1 end if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return 2 end -- 是否有体力 if (layer - 1) % globalCsv.adv_can_out_layer_pre ~= 0 then return 3 end - if chapterData.limitlevel ~= 0 and layer > chapterData.limitlevel then return 4 end - - -- 关卡开放判断 - if not role:advChapterIsOpen(chapterId, layer) then return 5 end - - --中继开放判断 local advPass = role:getProperty("advPass") - if layer ~= 1 and (not role:isFuncOpen(FuncOpenType.AdvRelay) or (advPass[chapterId] or 0) < (layer - 1)) then return 6 end + if AdvCommon.isEndless(chapterId) then + for _k, _v in pairs(csvdb["adv_chapterCsv"]) do --解锁全部关卡 + if not AdvCommon.isEndless(_k) then + if (advPass[_k] or 0) ~= _v.limitlevel then return 12 end + end + end + if not role:isFuncOpen(FuncOpenType.AdvEndless) or not role:isFuncOpen(FuncOpenType.AdvRelay) then return 11 end -- 开放了中继模式 和 无尽模式 才可以玩儿无尽模式 + local maxl = math.floor(role:getProperty("advElM") / 10) * 10 + local openLayer = {} + for i = 0, (globalCsv.adv_endless_open_relay - 1) do + local l = maxl - i * globalCsv.adv_can_out_layer_pre + if l < 0 then + break + end + openLayer[l] = 1 + end + if not openLayer[layer - 1] then return 10 end + else + if layer > chapterData.limitlevel then return 4 end + -- 关卡开放判断 + if not role:advChapterIsOpen(chapterId, layer) then return 5 end + --中继开放判断 + if layer ~= 1 and (not role:isFuncOpen(FuncOpenType.AdvRelay) or (advPass[chapterId] or 0) < (layer - 1)) then return 6 end + end if not checkFormat(role, format) then return 7 end - --上一个关卡结束才可以开始新的关卡 - if next(role:getProperty("advInfo")) then return 8 end - local advTeam = role:getProperty("advTeam") table.clear(advTeam) @@ -107,8 +127,7 @@ function _M.startHangRpc(agent, data) if advHang[chapterId] then return end --正在挂机 local advPass = role:getProperty("advPass") - if chapterData.limitlevel == 0 or advPass[chapterId] ~= chapterData.limitlevel then return end -- 没有全通关 - + if AdvCommon.isEndless(chapterId) or advPass[chapterId] ~= chapterData.limitlevel then return end -- 没有全通关 if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return end -- 是否有体力 diff --git a/src/actions/RoleAction.lua b/src/actions/RoleAction.lua index 4bfc5d0..08ed35f 100644 --- a/src/actions/RoleAction.lua +++ b/src/actions/RoleAction.lua @@ -116,6 +116,7 @@ function _M.loginRpc( agent, data ) SERV_OPEN = redisproxy:hget("autoincrement_set", "server_start") role:changeStructVersion() -- 数据结构 版本更新 + role:advEndlessSeasonCheck() -- 冒险赛季更新检查 -- 跨天登陆事件 role:onCrossDay(now) diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index 34828eb..f05b214 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -176,10 +176,18 @@ function Adv:randomMapId(chapterId, level) error("chapterId " .. chapterId .. " dont exist!") return end - if chapterData.limitlevel ~= 0 and level > chapterData.limitlevel then - error("level overflow!") - return + if AdvCommon.isEndless(chapterId) then + level = level % chapterData.limitlevel + if level == 0 then + level = chapterData.limitlevel + end + else + if level > chapterData.limitlevel then + error("level overflow!") + return + end end + --随出地图Id local raw_pool = chapterData.mapid:toArray(true, "=") @@ -270,14 +278,21 @@ local function clickOut(self, room, block, params) 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}}) + if AdvCommon.isEndless(self.chapterId) then + -- 刷新最高层 + if self.owner:getProperty("advElM") < self.level then + self.owner:updateProperty({field = "advElM", value = self.level}) + end + else + if self.level > (advPass[self.chapterId] or 0) then + self.owner:changeUpdates({{type = "advPass", field = self.chapterId, value = self.level}}) + end end if params.relay then if self.level % globalCsv.adv_can_out_layer_pre ~= 0 or not self.owner:isFuncOpen(FuncOpenType.AdvRelay) then return end end local levellimit = csvdb["adv_chapterCsv"][self.chapterId].limitlevel - if params.relay or (levellimit > 0 and self.level >= levellimit) or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1) then --关卡结束 + if params.relay or (not AdvCommon.isEndless(self.chapterId) and (self.level >= levellimit or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1))) then --关卡结束 self:over(true) else self:initByChapter(self.chapterId, self.level + 1, true, true) diff --git a/src/adv/AdvCommon.lua b/src/adv/AdvCommon.lua index d9301af..fbf3f90 100644 --- a/src/adv/AdvCommon.lua +++ b/src/adv/AdvCommon.lua @@ -47,4 +47,8 @@ function AdvCommon.checkIsIn(checkValue, checkType, checkRange) end end +function AdvCommon.isEndless(chapterId) + return math.floor(chapterId / 100) == 2 +end + return AdvCommon \ No newline at end of file diff --git a/src/adv/AdvMap.lua b/src/adv/AdvMap.lua index 3746ef7..23e2f3c 100644 --- a/src/adv/AdvMap.lua +++ b/src/adv/AdvMap.lua @@ -334,7 +334,13 @@ end --关卡事件库 getEventLib = function(self, needEventType) -- needEventType 需要的事件 local chapterId, level = self.adv.chapterId, self.adv.level - + if AdvCommon.isEndless(chapterId) then + local chapterData = csvdb["adv_chapterCsv"][chapterId] + level = level % chapterData.limitlevel + if level == 0 then + level = chapterData.limitlevel + end + end local libsToType = { ["event_monsterCsv"] = {AdvEventType.Monster, AdvEventType.BOSS, AdvEventType.Monster}, ["event_chooseCsv"] = AdvEventType.Choose, diff --git a/src/models/Role.lua b/src/models/Role.lua index 4ed6f3c..83f012e 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -53,6 +53,8 @@ Role.schema = { advMTask = {"table", {id = 1, status = 0, lock = true}}, -- 冒险主线任务 -- {id = id, status = status, lock = true} -- 当前主线id 当前主线状态 是否锁定状态 advAchiev = {"table", {}}, -- 冒险成就 {chapterId = {achievId = status}} advL = {"number", 1}, -- 冒险队等级 + advElM = {"number", 0}, -- 无尽模式通关的最高层数 endless max layer + advElS = {"number", globalCsv.adv_endless_season}, -- 无尽模式记录的赛季 endless season --挂机相关 hangPass = {"table", {}}, -- 挂机通过的最大关卡 @@ -192,6 +194,7 @@ function Role:data() advMTask = self:getProperty("advMTask"), advAchiev = self:getProperty("advAchiev"), advL = self:getProperty("advL"), + advElM = self:getProperty("advElM"), hangPass = self:getProperty("hangPass"), hangTeam = self:getProperty("hangTeam"), diff --git a/src/models/RolePlugin.lua b/src/models/RolePlugin.lua index 97e2f63..d523e8f 100644 --- a/src/models/RolePlugin.lua +++ b/src/models/RolePlugin.lua @@ -645,6 +645,15 @@ function RolePlugin.bind(Role) return openStatus end + -- 赛季检查 + function Role:advEndlessSeasonCheck() + if self:getProperty("advElS") ~= globalCsv.adv_endless_season then + local ml = self:getProperty("advElM") + local nl = math.max(0, ml - (math.floor(ml / 50) + 2) * 10) + self:setProperty("advElM", math.floor(nl / 10) * 10) + self:setProperty("advElS", globalCsv.adv_endless_season) + end + end end return RolePlugin \ No newline at end of file -- libgit2 0.21.2