diff --git a/src/ProtocolCode.lua b/src/ProtocolCode.lua index af9971c..2d815e2 100644 --- a/src/ProtocolCode.lua +++ b/src/ProtocolCode.lua @@ -42,6 +42,7 @@ actionCodes = { Adv_finishTaskRpc = 161, Adv_workshopRpc = 162, Adv_wheelSurfRpc = 163, + Adv_finishAchievRpc = 164, Hero_loadInfos = 201, Hero_updateProperty = 202, diff --git a/src/actions/AdvAction.lua b/src/actions/AdvAction.lua index eb00b3c..50cad04 100644 --- a/src/actions/AdvAction.lua +++ b/src/actions/AdvAction.lua @@ -242,6 +242,8 @@ function _M.finishTaskRpc(agent, data) status, reward = adv:finishMTask() else status, reward = adv:finishTask(taskId) + adv:checkAchievement(adv.AchievType.TaskLayer, 1, taskId) + adv:updateAchievement() end adv:updateTask() if not status then return end @@ -382,6 +384,7 @@ end function _M.wheelSurfRpc(agent, data) local role = agent.role if not role:isFuncOpen(FuncOpenType.AdvWheelSurf) then return end + if not role._advWheelSurfCount then return end local drawData = csvdb["adv_wheelsurfCsv"][role:getFuncLv(FuncOpenType.AdvWheelSurf)] @@ -413,5 +416,26 @@ function _M.wheelSurfRpc(agent, data) return true end +function _M.finishAchievRpc(agent, data) + local role = agent.role + local msg = MsgPack.unpack(data) + -- local ctype = msg.ctype -- 领取类型 1 成就 2 pt累计奖励 + local chapterId = msg.chapterId --章节id + local taskId = msg.taskId -- 领取id + + local adv = role:getAdvData() + + local status, reward + -- if ctype == 1 then + -- status = adv:finishAchievement(chapterId, taskId) + -- elseif ctype == 2 then + status, reward = adv:getAchievementReward(chapterId, taskId) + -- end + if not status then return end + adv:updateAchievement() + SendPacket(actionCodes.Adv_finishAchievRpc, MsgPack.pack({reward = reward})) + return true +end + return _M \ No newline at end of file diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index b94ad7f..be02c21 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -43,8 +43,13 @@ end -- 随机新的地图 function Adv:initByChapter(chapterId, level, isToNext, notNotify) - if self.chapterId and chapterId ~= self.chapterId then return end --新的关卡 或者 去到下一层 - self.chapterId = chapterId + if not self.chapterId then -- 开始新的章节 + self.chapterId = chapterId + self:checkAchievement(Adv.AchievType.StartBattle, 1) + elseif chapterId ~= self.chapterId then -- 正常不会出现 + return + end + self.level = level or 1 self.round = 0 self.score = self.score or {} @@ -110,6 +115,7 @@ function Adv:saveDB(notNotify) end self:updateTask(notNotify) + self:updateAchievement(notNotify) self.owner:updateProperties({advInfo = advInfo, advTeam = advTeam}, notNotify) end @@ -163,6 +169,19 @@ function Adv:over(success) if success then reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap()) self.owner:checkTaskEnter(self.owner.TaskType.AdvPass, {id = self.chapterId}) + + -- 冒险队等级升一下子 + local advL = self.owner:getProperty("advL") + advL[2] = (advL[2] or 0) + 1 + for level = ((advL[1] or 0) + 1), #csvdb["adv_rankCsv"] do + local ldata = csvdb["adv_rankCsv"][level] + if ldata.unlock >= advL[2] then + advL[1] = level + self.owner:award(ldata.reward) + end + end + self.owner:updateProperty("advL", advL) + if self.owner:isFuncOpen(FuncOpenType.AdvWheelSurf) then self.owner._advWheelSurfCount = 0 -- 抽奖进行次数 end @@ -238,6 +257,7 @@ function Adv:award(gift, params) if count > 0 then self:scoreChange(AdvScoreType.Item, {itemId, count}) self:checkTask(Adv.TaskType.Item, count, itemId) + self:checkAchievement(Adv.AchievType.GetItem, count, itemId) end local origin = items:getv(itemId, 0) local nums = origin + count @@ -300,6 +320,8 @@ local function clickOut(self, room, block, params) 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 + + self:checkAchievement(Adv.AchievType.OverWin, 1, self.level) local levellimit = csvdb["adv_chapterCsv"][self.chapterId].limitlevel 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) @@ -307,6 +329,7 @@ local function clickOut(self, room, block, params) self:initByChapter(self.chapterId, self.level + 1, true, true) self:backNext() --下一关 end + end return true @@ -395,6 +418,7 @@ local function chooseCommon(self, room, block, chooseData, choose) doEffect[effect[1]]() end self:checkTask(Adv.TaskType.Choose, 1, block.event.id) + self:checkAchievement(Adv.AchievType.Choose, 1, block.event.id) return true, clearBlock end @@ -421,6 +445,7 @@ local function clickLinkChoose(self, room, block, params) if idx == 9 or not csvdb["event_linkchooseCsv"][block.event.id + 1] then --全部完成 local startId = math.floor(block.event.id / 10) * 10 + 1 self.lchoose[startId] = (self.lchoose[startId] or 0) + 1 + self:checkAchievement(Adv.AchievType.LinkChoose, 1, startId) else self.lchoose.ing = block.event.id + 1 --后面会出现后继事件 end @@ -428,7 +453,7 @@ local function clickLinkChoose(self, room, block, params) if clearBlock then block:clear() end - + return true end @@ -454,6 +479,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:checkAchievement(Adv.AchievType.Shop, 1, block.event.id) self:backReward(reward) return true end @@ -483,6 +509,7 @@ local function clickBuild(self, room, block, params) if not self:cost(buildData.required:toNumMap(), {}) then return end doEffect[effect[1]]() self:checkTask(Adv.TaskType.Build, 1, block.event.id) + self:checkAchievement(Adv.AchievType.Build, 1, block.event.id) if clearBlock then block:clear() end @@ -526,6 +553,7 @@ local function clickLayer(self, room, block, params) self.maps[mapIdx] = AdvMap.new(self, mapIdx, mapId) self.battle:initMapEnemys(mapIdx) + self:checkAchievement(Adv.AchievType.EnterILayer, 1, mapId) end self:backLayer() return true @@ -625,6 +653,8 @@ function Adv:useItem(itemId, count, target) return end + self:checkAchievement(Adv.AchievType.UseItem, count, itemId) + self:afterRound() self:saveDB() return true @@ -715,6 +745,7 @@ function Adv:enemyDead(enemy, escape) end self:checkTask(Adv.TaskType.Kill, 1, enemyId) self:checkTask(Adv.TaskType.KillAll) + self:checkAchievement(Adv.AchievType.Kill, 1, enemyId) end end self:backBlockChange(roomId, blockId) diff --git a/src/adv/AdvBlock.lua b/src/adv/AdvBlock.lua index 892b843..ee93b48 100644 --- a/src/adv/AdvBlock.lua +++ b/src/adv/AdvBlock.lua @@ -107,6 +107,7 @@ function Block:open() self.room.map.adv:mapItemChange(effect[2]) end end + adv:checkAchievement(adv.AchievType.Trap, 1, self.event.id) adv:backTrap() self:clear() end diff --git a/src/adv/AdvBuff.lua b/src/adv/AdvBuff.lua index 7f52af1..e7b7b75 100644 --- a/src/adv/AdvBuff.lua +++ b/src/adv/AdvBuff.lua @@ -19,6 +19,7 @@ Buff.SP_CHANGE = 15 -- sp变化(每回合) Buff.HP_CHANGE_NOW = 16 -- 生命变化(每回合生效,立刻生效) Buff.BATTLE_BUFF = 17 -- 切换为战斗中的buff Buff.CHANGE_DROP = 18 -- 转换掉落 +Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技 --角色一些属性的变化 local function commonAttr(_Buff, attrName) @@ -58,7 +59,7 @@ local BuffFactory = { if value > 0 then self.owner:recover(value, self.release) elseif value < 0 then - self.owner:hurt(-value, self.release, {hurtType = 2}) + self.owner:hurt(-value, self.release, {hurtType = 2, buffId = self.id}) end end _Buff._effectValue = function(self) @@ -85,7 +86,7 @@ local BuffFactory = { if self._changeV > 0 then self.owner:recover(self._changeV, self.release) -- 防止release不存在,地图点buff elseif self._changeV < 0 then - self.owner:hurt(self.release and self.release:getHurtValue(-self._changeV) or -self._changeV, self.release, {hurtType = 2}) + self.owner:hurt(self.release and self.release:getHurtValue(-self._changeV) or -self._changeV, self.release, {hurtType = 2, buffId = self.id}) self.owner.hp = math.min(self.owner.hpMax, self.owner.hp) end end @@ -214,7 +215,7 @@ local BuffFactory = { if value > 0 then self.owner:recover(value, self.release) elseif value < 0 then - self.owner:hurt(-value, self.release, {hurtType = 2}) + self.owner:hurt(-value, self.release, {hurtType = 2, buffId = self.id}) end end _Buff._effectValue = function(self) @@ -284,7 +285,7 @@ end function Buff:afterRound() - if self.isDel or self.owner.isDead or self.buffData.round == 0 then return end + if self.isDel or self.owner.isDead then return end if self.roundSpace > 0 then self.roundSpace = self.roundSpace - 1 self:decRound() diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index 2cdfc83..1dd5d5a 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -289,6 +289,10 @@ function BaseObject:hurt(value, releaser, params) team:triggerPassive(Passive.TEAM_DEAD) end + if params.hurtType == 2 and self ~= self.battle.player then + self.battle.adv:checkAchievement(self.battle.adv.AchievType.KillByBuff, 1, params.buffId) + end + self.isDead = true self.battle.adv:backDead(self.id) end @@ -475,7 +479,7 @@ end --战斗结束了扣战斗buff次数 function Player:effectBattleBuff() for _, buff in ipairs(self.buffs) do - if not buff.isDel and buff:getType() == Buff.BATTLE_BUFF then + if not buff.isDel and (buff:getType() == Buff.BATTLE_BUFF or buff:getType() == Buff.BATTLE_PASSIVE) then buff:effect() end end diff --git a/src/adv/AdvTask.lua b/src/adv/AdvTask.lua index 409bd42..38872d5 100644 --- a/src/adv/AdvTask.lua +++ b/src/adv/AdvTask.lua @@ -177,6 +177,99 @@ function AdvTask.bind(Adv) end advTaskChange = {} end + + + + ------ 冒险成就 ------------ + Adv.AchievType = { + StartBattle = 1, --累计挑战N次 + OverWin = 2, --通关N次M层 + TaskLayer = 3, --完成每层任务N次 + UseItem = 4, --使用道具N次 + GetItem = 5, --获得道具N个 + GetMWeapon = 6, --获得神器N个 -todo + Build = 7, --完成建筑N个 + Choose = 8, --完成事件N个 + Shop = 9, --完成商店N次 + LinkChoose = 10, --完成连锁事件N次 + Trap = 11, --触发陷阱N次 + Kill = 12, --消灭怪物N个 + EnterILayer = 13, --进入夹层N次 + KillByBuff = 14, --使用BUFF消灭敌人N个 + } + + + + local advAchievChange = {} + + local function insertChange(chapterId, taskId, value) + table.insert(advAchievChange, {type = "advAchiev", field = {chapterId, taskId}, value = value}) + end + + function Adv:checkAchievement(taskType, count, cond) + local advAchiev = self.owner:getProperty("advAchiev")[self.chapterId] or {} + for taskId , data in pairs(csvdb["adv_achievementCsv"][self.chapterId] or {}) do + local oldStatus = advAchiev[taskId] or 0 + if oldStatus ~= -1 and data.type == taskType then + local status + local checkTaskFunc = {} + -- checkTaskFunc[Adv.AchievType.] = function() + + -- end + if checkTaskFunc[taskType] then + status = checkTaskFunc[taskType]() + else + if count ~= 0 and (data.value2 == 0 or data.value2 == cond) then + status = oldStatus + count + end + end + if (status or -1) >= data.value1 then + status = -1 + end + if status ~= oldStatus then + insertChange(self.chapterId, taskId, status) + if status == -1 then + local ptcount = (self.owner:getProperty("advAchiev")[self.chapterId] or {})[-1] or 0 + ptcount = ptcount + data.pt + insertChange(self.chapterId, -1, ptcount) + end + end + + end + end + end + + -- --说不用领取 注释掉 + -- function Adv:finishAchievement(chapterId, taskId) + -- local achievData = (csvdb["adv_achievementCsv"][chapterId] or {})[taskId] + -- local status = (self.owner:getProperty("advAchiev")[chapterId] or {})[taskId] or -1 + + -- if status >= achievData.value1 then + -- insertChange(chapterId, taskId, -1) + -- local count = (self.owner:getProperty("advAchiev")[chapterId] or {})[-1] or 0 + -- count = count + achievData.pt + -- insertChange(chapterId, -1, count) + -- return true + -- end + -- end + + function Adv:getAchievementReward(chapterId, taskId) + local count = (self.owner:getProperty("advAchiev")[chapterId] or {})[-1] or 0 + local achievData = (csvdb["adv_achievement_rewardCsv"][chapterId] or {})[taskId] + local status = ((self.owner:getProperty("advAchiev")[chapterId] or {})["pts"] or {})[taskId] or 0 + if status == -1 or count < achievData.pt then return end + + local reward = self.owner:award(achievData.reward) + self.owner:changeUpdates({{type = "advAchiev", field = {chapterId, "pts", taskId}, value = -1}}, notNotify) + + return true, reward + end + + function Adv:updateAchievement(notNotify) + if not next(advAchievChange) then return end + self.owner:changeUpdates(advAchievChange, notNotify) + end + end diff --git a/src/models/Role.lua b/src/models/Role.lua index 83f012e..0ea8a69 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -51,8 +51,8 @@ Role.schema = { advHang = {"table", {}}, -- 挂机信息 -- {chapterId = {format = teaminfo, time = endtime}} advTask = {"table", {}}, -- 冒险已领取任务完成状态 {id = status} --每层重置 advMTask = {"table", {id = 1, status = 0, lock = true}}, -- 冒险主线任务 -- {id = id, status = status, lock = true} -- 当前主线id 当前主线状态 是否锁定状态 - advAchiev = {"table", {}}, -- 冒险成就 {chapterId = {achievId = status}} - advL = {"number", 1}, -- 冒险队等级 + advAchiev = {"table", {}}, -- 冒险成就 {chapterId = {achievId = status, -1 = pt, pts = {}}, } + advL = {"table", {0, 0}}, -- 冒险队等级 {lv, winCount} advElM = {"number", 0}, -- 无尽模式通关的最高层数 endless max layer advElS = {"number", globalCsv.adv_endless_season}, -- 无尽模式记录的赛季 endless season -- libgit2 0.21.2