diff --git a/src/adv/Adv.lua b/src/adv/Adv.lua index 6cc3477..6cb97ca 100644 --- a/src/adv/Adv.lua +++ b/src/adv/Adv.lua @@ -204,6 +204,7 @@ end function Adv:awardArtifact(id, params) if self:isHaveArtifact(id) then return end self.owner:changeUpdates({{type = "advAFGet", field = id, value = 1}}, params.notNotify) + self:checkAchievement(Adv.AchievType.GetMWeapon, 1, id) self:pushBackEvent(AdvBackEventType.Artifact, {id = id}) end @@ -284,18 +285,56 @@ function Adv:wearArtifact(slot, id) return true end +-- 是否穿着指定神器 +function Adv:isWearAF(id) + local advAFWear = self.owner:getProperty("advAFWear") + for _, _id in pairs(advAFWear) do + if _id == id then + return true + end + end + return false +end +--是否激活指定神器套装 +function Adv:haveComboAF(id) + local advAFGet = self.owner:getProperty("advAFGet") + local advAFWear = self.owner:getProperty("advAFWear") + local curWear = {} + for _, _id in pairs(advAFWear) do + curWear[_id] = 1 + end + for _, _id in pairs(advAFWear) do + local afData = csvdb["adv_artifactCsv"][_id][advAFGet[_id]] + if afData.comboId == id then + local comboData = csvdb["adv_artifact_comboCsv"][afData.comboId] + if comboData then + for _, _id2 in ipairs(comboData.artifactid:toArray(true)) do + if not curWear[_id2] then + return false + end + end + return true + end + return false + end + end + return false +end + function Adv:artifactLevelUp(id) local advAFGet = self.owner:getProperty("advAFGet") local advAFWear = self.owner:getProperty("advAFWear") local status = 0 + local newLv = advAFGet[id] + 1 if advAFWear[id] then -- 穿着呢 local oldData = csvdb["adv_artifactCsv"][id][advAFGet[id]] - local newData = csvdb["adv_artifactCsv"][id][advAFGet[id] + 1] + local newData = csvdb["adv_artifactCsv"][id][newLv] self:delArtifactEffect(oldData.effect) self:addArtifactEffect(newData.effect) status = 1 end - self.owner:changeUpdates({{type = "advAFGet", field = id, value = advAFGet[id] + 1}}) + self.owner:changeUpdates({{type = "advAFGet", field = id, value = newLv}}) + self:checkAchievement(Adv.AchievType.MWeaponLv, 1, id, newLv) return status end @@ -690,6 +729,7 @@ local function clickChoose(self, room, block, params) self:checkAdvUnlock(3, block.event.id) self:checkTask(Adv.TaskType.Choose, 1, block.event.id) self:checkAchievement(Adv.AchievType.Choose, 1, block.event.id) + self:checkAchievement(Adv.AchievType.ChooseBySelect, 1, block.event.id, choose) if clearBlock then block:clear() end @@ -708,6 +748,13 @@ local function clickLinkChoose(self, room, block, params) 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) + self:checkAchievement(Adv.AchievType.FinishStoryId, 1, chooseData.storyid) + local advStoryB = self.owner:getProperty("advStoryB") + advStoryB[chooseData.storyid] = (advStoryB[chooseData.storyid] or 0) + 1 + self.owner:setProperty("advStoryB", advStoryB) + local storyData = csvdb["event_linkchoose_storyCsv"][chooseData.storyid] + self:checkAchievement(Adv.AchievType.StorryDone, 1, storyData[1].chapter) -- 检查故事对应章节 + self:checkAdvUnlock(4, startId) self.lchoose.cur = self.lchoose.cur or {} table.insert(self.lchoose.cur, {block.event.id, choose}) @@ -763,6 +810,7 @@ local function clickBuild(self, room, block, params) self:checkTask(Adv.TaskType.Build, 1, block.event.id) self:checkAchievement(Adv.AchievType.Build, 1, block.event.id) + self:checkAchievement(Adv.AchievType.BuildBySelect, 1, block.event.id, choose) if clearBlock then block:clear() @@ -1147,6 +1195,20 @@ function Adv:enemyDead(enemy, escape) self:checkTask(Adv.TaskType.Kill, 1, enemyId) self:checkTask(Adv.TaskType.KillAll) self:checkAchievement(Adv.AchievType.Kill, 1, enemyId) + self:checkAchievement(Adv.AchievType.KillHadBuff, 1, enemy) + + self:checkAchievement(Adv.TaskType.KillWithBuff, 1) + self:checkAchievement(Adv.TaskType.KillNoBuff, 1) + self:checkAchievement(Adv.AchievType.KillWithMWeapon, 1) + self:checkAchievement(Adv.AchievType.KillWithAMWeapon, 1) + + if monsterData.type == 2 then + self:checkAchievement(Adv.TaskType.KillBoss, 1, enemyId) + self:checkAchievement(Adv.TaskType.KillBossWithBuff, 1) + self:checkAchievement(Adv.TaskType.KillBossNoBuff, 1) + self:checkAchievement(Adv.AchievType.KillBossWithMWeapon, 1) + self:checkAchievement(Adv.AchievType.KillBossWithAMWeapon, 1) + end end end self:backBlockChange(roomId, blockId) diff --git a/src/adv/AdvPlayer.lua b/src/adv/AdvPlayer.lua index 8186a80..383c8e0 100644 --- a/src/adv/AdvPlayer.lua +++ b/src/adv/AdvPlayer.lua @@ -638,6 +638,11 @@ function Player:afterLayer() end end +function Player:addBuff(buffId, releaser) + Player.super.addBuff(self, buffId, releaser) + self.battle.adv:checkAchievement(self.battle.adv.AchievType.GetBuff, 1, buffId) +end + function Player:getDB() local db = Player.super.getDB(self) for _ , field in pairs({"level", "exp", "growth", "sp", "spMax"}) do diff --git a/src/adv/AdvTask.lua b/src/adv/AdvTask.lua index d373006..5999c4a 100644 --- a/src/adv/AdvTask.lua +++ b/src/adv/AdvTask.lua @@ -194,7 +194,7 @@ function AdvTask.bind(Adv) TaskLayer = 3, --完成每层任务N次 UseItem = 4, --使用道具N次 GetItem = 5, --获得道具N个 - GetMWeapon = 6, --获得神器N个 -todo + GetMWeapon = 6, --获得神器N个 Build = 7, --完成建筑N个 Choose = 8, --完成事件N个 Shop = 9, --完成商店N次 @@ -203,6 +203,22 @@ function AdvTask.bind(Adv) Kill = 12, --消灭怪物N个 EnterILayer = 13, --进入夹层N次 KillByBuff = 14, --使用BUFF消灭敌人N个 + KillBoss = 15, --击杀首领N次 + FinishStoryId = 16, -- 完成故事Id + MWeaponLv = 17, -- 指定神器等级达到 + GetBuff = 18, -- 获得指定buff + KillHadBuff = 19, -- 击败拥有指定buff的敌人 + ChooseBySelect = 20, -- 指定事件的指定选项N次 + BuildBySelect = 21, -- 指定建筑的指定选项N次 + KillWithBuff = 22, -- 携带指定层数的buff 击败怪物 + KillBossWithBuff = 23, -- 携带指定层数的buff 击败boss + KillNoBuff = 24, -- 不携带指定的buff 击败boss + KillBossNoBuff = 25, -- 不携带指定的buff 击败boss + StorryDone = 26, -- 故事完成个数 + KillWithMWeapon = 27, -- 携带指定神器击败怪物N次 + KillBossWithMWeapon = 28, -- 携带指定神器击败BossN次 + KillWithAMWeapon = 29, -- 激活神器套装 击败怪物N次 + KillBossWithAMWeapon= 30, -- 激活神器套装 击败BossN次 } @@ -213,27 +229,81 @@ function AdvTask.bind(Adv) table.insert(advAchievChange, {type = "advAchiev", field = {chapterId, taskId}, value = value}) end - function Adv:checkAchievement(taskType, count, cond) + function Adv:checkAchievement(taskType, count, cond, cond2) 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() + checkTaskFunc[Adv.AchievType.KillHadBuff] = function() + if cond:hadBuffById(data.value2) then + return (oldStatus + count) + end + end + + checkTaskFunc[Adv.AchievType.KillWithBuff] = function() + local buff = self.battle.player:hadBuffById(data.value2) + if buff and buff.layer == data.value3 then + return (oldStatus + count) + end + end + checkTaskFunc[Adv.AchievType.KillBossWithBuff] = checkTaskFunc[Adv.AchievType.KillWithBuff] + + checkTaskFunc[Adv.AchievType.KillNoBuff] = function() + local buff = self.battle.player:hadBuffById(data.value2) + if not buff then + return (oldStatus + count) + end + end + checkTaskFunc[Adv.AchievType.KillBossNoBuff] = checkTaskFunc[Adv.AchievType.KillNoBuff] + + checkTaskFunc[Adv.AchievType.KillWithMWeapon] = function() + if self:isWearAF(data.value2) then + return (oldStatus + count) + end + end + checkTaskFunc[Adv.AchievType.KillBossWithMWeapon] = checkTaskFunc[Adv.AchievType.KillWithMWeapon] + + checkTaskFunc[Adv.AchievType.KillWithAMWeapon] = function() + if self:haveComboAF(data.value2) then + return (oldStatus + count) + end + end + checkTaskFunc[Adv.AchievType.KillBossWithAMWeapon] = checkTaskFunc[Adv.AchievType.KillWithAMWeapon] + + checkTaskFunc[Adv.AchievType.StorryDone] = function() + if data.value2 == 0 or data.value2 == cond then + local advStoryB = self.owner:getProperty("advStoryB") + local newCount = 0 + for storyId, _ in pairs(advStoryB) do + if data.value2 == 0 then + newCount = newCount + 1 + else + local storyData = csvdb["event_linkchoose_storyCsv"][storyId] + if storyData[1].chapter == data.value2 then + newCount = newCount + 1 + end + end + end + if newCount > oldStatus then + return newCount + end + end + end + - -- end if checkTaskFunc[taskType] then status = checkTaskFunc[taskType]() else - if count ~= 0 and (data.value2 == 0 or data.value2 == cond) then + if count ~= 0 and (data.value2 == 0 or data.value2 == cond) and (data.value3 == 0 or data.value3 == cond2) then status = oldStatus + count end end if (status or -1) >= data.value1 then status = -1 end - if status ~= oldStatus then + if status and status ~= oldStatus then insertChange(self.chapterId, taskId, status) if status == -1 then local ptcount = (self.owner:getProperty("advAchiev")[self.chapterId] or {})[-1] or 0 diff --git a/src/csvdata b/src/csvdata index d1b10c5..140e26c 160000 --- a/src/csvdata +++ b/src/csvdata @@ -1 +1 @@ -Subproject commit d1b10c53dcd4e448396a8fbbe10fcfb595ec79f5 +Subproject commit 140e26cedfd14213ed616ac36c7b44ca60e2c7ad diff --git a/src/models/Role.lua b/src/models/Role.lua index fa254fb..6cd26a9 100644 --- a/src/models/Role.lua +++ b/src/models/Role.lua @@ -69,6 +69,7 @@ Role.schema = { advAFGet = {"table", {}}, -- 当前拥有的神器 {[id] = 等级} advAFWear = {"table", {}}, -- 当前拥有的神器 {[slot] = id} advDrawB = {"table", {}}, -- 冒险抽奖回馈 {[1] = 0, [2] = 100} -- 池子类型 = 点数 + advStoryB = {"table", {}}, -- 冒险故事完成记录 (连锁事件绑定的故事) -- {storyId = 1} --挂机相关 hangPass = {"table", {}}, -- 挂机通过的最大关卡 -- libgit2 0.21.2