Commit ccbafe671db4e819e1f896ec4918eba5949e49b9
1 parent
4b61215f
冒险神器和buff
Showing
10 changed files
with
727 additions
and
291 deletions
Show diff stats
src/GlobalVar.lua
| ... | ... | @@ -16,6 +16,15 @@ AttsEnum = { |
| 16 | 16 | pierce = 10, -- 穿透 |
| 17 | 17 | } |
| 18 | 18 | |
| 19 | +--冒险属性 | |
| 20 | +AdvAttsEnum = { | |
| 21 | + hp = 1, -- 血量 | |
| 22 | + atk = 2, -- 攻击 | |
| 23 | + def = 3, -- 物理防御 | |
| 24 | + hit = 4, -- 命中 | |
| 25 | + miss = 5, -- 闪避 | |
| 26 | +} | |
| 27 | + | |
| 19 | 28 | AttsEnumEx = { |
| 20 | 29 | [1] = "hp", -- 血量 |
| 21 | 30 | [2] = "atk", -- 攻击 |
| ... | ... | @@ -78,6 +87,7 @@ ItemId = { |
| 78 | 87 | DinerCoin = 12, --后勤物资 |
| 79 | 88 | LoveUp = 14, --好感度提升道具 |
| 80 | 89 | OldCoin = 15, --古代金币 |
| 90 | + AdvPoint = 16, -- 探险点 | |
| 81 | 91 | DinerSpTask = 20, -- 餐厅任务采购券 |
| 82 | 92 | LoveBreak = 21, --好感度突破道具 |
| 83 | 93 | PvpKey = 22, -- pvp钥匙 |
| ... | ... | @@ -131,6 +141,7 @@ AdvBackEventType = { |
| 131 | 141 | Trap = 17, --陷阱 |
| 132 | 142 | Layer = 18, --切换层 |
| 133 | 143 | MapShow = 19, -- 展示地图 |
| 144 | + ChooseArtifact = 20, -- 等待选择神器 | |
| 134 | 145 | } |
| 135 | 146 | |
| 136 | 147 | AdvScoreType = { | ... | ... |
src/ProtocolCode.lua
| ... | ... | @@ -56,6 +56,9 @@ actionCodes = { |
| 56 | 56 | Adv_workshopRpc = 162, |
| 57 | 57 | Adv_wheelSurfRpc = 163, |
| 58 | 58 | Adv_finishAchievRpc = 164, |
| 59 | + Adv_chooseArtifactRpc = 165, | |
| 60 | + Adv_wearArtifactRpc = 166, | |
| 61 | + Adv_upArtifactRpc = 167, | |
| 59 | 62 | |
| 60 | 63 | Hero_loadInfos = 201, |
| 61 | 64 | Hero_updateProperty = 202, | ... | ... |
src/actions/AdvAction.lua
| ... | ... | @@ -259,6 +259,7 @@ function _M.clickBlockRpc(agent, data) |
| 259 | 259 | local msg = MsgPack.unpack(data) |
| 260 | 260 | |
| 261 | 261 | local adv = role:getAdvData() |
| 262 | + if adv:isWaitChooseArtifact() then return end | |
| 262 | 263 | local status = adv:clickBlock(msg.roomId, msg.blockId, msg) |
| 263 | 264 | if not status then return end |
| 264 | 265 | SendPacket(actionCodes.Adv_clickBlockRpc, MsgPack.pack({events = adv:popBackEvents()})) |
| ... | ... | @@ -278,6 +279,7 @@ function _M.useItemRpc(agent, data) |
| 278 | 279 | if not itemData then return end |
| 279 | 280 | |
| 280 | 281 | local adv = role:getAdvData() |
| 282 | + if adv:isWaitChooseArtifact() then return end | |
| 281 | 283 | --重置数量 |
| 282 | 284 | if itemData["function"] == 0 or itemData["function"] == 2 then count = 1 end |
| 283 | 285 | if not adv:cost({[itemId] = count}, {}, true) then return true end |
| ... | ... | @@ -324,7 +326,8 @@ function _M.usePotionRpc(agent, data) |
| 324 | 326 | if own <= 0 then return 4 end |
| 325 | 327 | |
| 326 | 328 | local adv = role:getAdvData() |
| 327 | - | |
| 329 | + if adv:isWaitChooseArtifact() then return end | |
| 330 | + | |
| 328 | 331 | local status = adv:doActive(potionData.effect, target) -- target |
| 329 | 332 | if not status then return end |
| 330 | 333 | |
| ... | ... | @@ -338,6 +341,67 @@ function _M.usePotionRpc(agent, data) |
| 338 | 341 | return true |
| 339 | 342 | end |
| 340 | 343 | |
| 344 | +-- 选择神器 | |
| 345 | +function _M.chooseArtifactRpc(agent, data) | |
| 346 | + local role = agent.role | |
| 347 | + local msg = MsgPack.unpack(data) | |
| 348 | + local adv = role:getAdvData() | |
| 349 | + | |
| 350 | + if not msg.idx then return end | |
| 351 | + if not adv:isWaitChooseArtifact() then return end | |
| 352 | + local status = adv:chooseArtifact(msg.idx) | |
| 353 | + if not status then return end | |
| 354 | + adv:saveDB() | |
| 355 | + | |
| 356 | + SendPacket(actionCodes.Adv_chooseArtifactRpc, '') | |
| 357 | + return true | |
| 358 | +end | |
| 359 | + | |
| 360 | +-- 穿戴神器 | |
| 361 | +function _M.wearArtifactRpc(agent, data) | |
| 362 | + local role = agent.role | |
| 363 | + local msg = MsgPack.unpack(data) | |
| 364 | + local slot = msg.slot | |
| 365 | + local id = msg.id | |
| 366 | + | |
| 367 | + local adv = role:getAdvData() | |
| 368 | + | |
| 369 | + if math.illegalNum(slot, 1, 5) then return end | |
| 370 | + if not adv:isHaveArtifact(id) then return end | |
| 371 | + if not adv:isWaitChooseArtifact() then return end | |
| 372 | + | |
| 373 | + local status = adv:wearArtifact(slot, id) | |
| 374 | + if not status then return end | |
| 375 | + adv:saveDB() | |
| 376 | + | |
| 377 | + SendPacket(actionCodes.Adv_wearArtifactRpc, '') | |
| 378 | + return true | |
| 379 | +end | |
| 380 | + | |
| 381 | +-- 升级神器 | |
| 382 | +function _M.upArtifactRpc(agent, data) | |
| 383 | + local role = agent.role | |
| 384 | + local msg = MsgPack.unpack(data) | |
| 385 | + local id = msg.id | |
| 386 | + | |
| 387 | + local adv = role:getAdvData() | |
| 388 | + local curLevel = adv:isHaveArtifact(id) | |
| 389 | + if not curLevel then return end | |
| 390 | + if not role:isArtifactOpen(id, adv:isEndless(), curLevel + 1) then return end | |
| 391 | + local cost = csvdb["adv_artifactCsv"][curLevel].exp:toNumMap() | |
| 392 | + if not adv:cost(cost, {}, true) then return end | |
| 393 | + | |
| 394 | + local status = adv:artifactLevelUp(id) | |
| 395 | + if not status then return end | |
| 396 | + adv:cost(cost, {}) | |
| 397 | + | |
| 398 | + if status == 1 then -- 现在穿着呢。更新下 | |
| 399 | + adv:saveDB() | |
| 400 | + end | |
| 401 | + SendPacket(actionCodes.Adv_upArtifactRpc, '') | |
| 402 | + return true | |
| 403 | +end | |
| 404 | + | |
| 341 | 405 | --退出 |
| 342 | 406 | function _M.exitAdvRpc(agent, data) |
| 343 | 407 | local role = agent.role |
| ... | ... | @@ -361,6 +425,7 @@ function _M.startBattleRpc(agent, data) |
| 361 | 425 | if not enemyId then return end |
| 362 | 426 | |
| 363 | 427 | local adv = role:getAdvData() |
| 428 | + if adv:isWaitChooseArtifact() then return end | |
| 364 | 429 | local enemy = adv.battle:getEnemyById(enemyId) |
| 365 | 430 | |
| 366 | 431 | if enemy.monsterId ~= monsterId or enemy.roomId ~= roomId or enemy.blockId ~= blockId or enemy.lock or enemy.isDead then return end |
| ... | ... | @@ -387,6 +452,7 @@ function _M.endBattleRpc(agent, data) |
| 387 | 452 | |
| 388 | 453 | if not player or not player.hp or not player.sp or not enemyId or not key then return end |
| 389 | 454 | local adv = role:getAdvData() |
| 455 | + if adv:isWaitChooseArtifact() then return end | |
| 390 | 456 | -- 校验 |
| 391 | 457 | if not adv.__battleCache then return end |
| 392 | 458 | if adv.__battleCache.enemyId ~= enemyId then return end | ... | ... |
src/adv/Adv.lua
| ... | ... | @@ -33,6 +33,7 @@ function Adv:initByInfo(advInfo) |
| 33 | 33 | self.lastEnemyId = advInfo.lastEId or 1 |
| 34 | 34 | self.mapStack = advInfo.mstack or {} |
| 35 | 35 | self.lchoose = advInfo.lch or {} |
| 36 | + self.waitArtifact = advInfo.waitAF | |
| 36 | 37 | self.maps = {} |
| 37 | 38 | for id, map in ipairs(advInfo.maps or {}) do |
| 38 | 39 | self.maps[id] = AdvMap.new(self, id, map) |
| ... | ... | @@ -87,6 +88,7 @@ function Adv:clear() |
| 87 | 88 | self.lchoose = {} |
| 88 | 89 | self.maps = {} |
| 89 | 90 | self.battle = nil |
| 91 | + self.waitArtifact = nil | |
| 90 | 92 | end |
| 91 | 93 | |
| 92 | 94 | function Adv:saveDB(notNotify) |
| ... | ... | @@ -100,6 +102,7 @@ function Adv:saveDB(notNotify) |
| 100 | 102 | advInfo.lastEId = self.lastEnemyId |
| 101 | 103 | advInfo.mstack = self.mapStack |
| 102 | 104 | advInfo.lch = self.lchoose |
| 105 | + advInfo.waitAF = self.waitArtifact | |
| 103 | 106 | advInfo.maps = {} |
| 104 | 107 | |
| 105 | 108 | self.battle:saveDB() |
| ... | ... | @@ -159,7 +162,146 @@ function Adv:getBlock(roomId, blockId, mapIdx) |
| 159 | 162 | end |
| 160 | 163 | end |
| 161 | 164 | |
| 165 | +function Adv:isHaveArtifact(id) | |
| 166 | + return self.owner:getProperty("advAFGet")[id] | |
| 167 | +end | |
| 168 | + | |
| 169 | +function Adv:awardArtifact(id, params) | |
| 170 | + if self:isHaveArtifact(id) then return end | |
| 171 | + self.owner:changeUpdates({{type = "advAFGet", field = id, value = 1}}, params.notNotify) | |
| 172 | +end | |
| 173 | + | |
| 174 | + | |
| 175 | +function Adv:delArtifactEffect(effect) | |
| 176 | + for _, eff in ipairs(effect:toArray()) do | |
| 177 | + local etype, id = table.unpack(eff:toArray(true, "=")) | |
| 178 | + if etype == 1 then | |
| 179 | + self.battle.player:addPassive({id = id}) | |
| 180 | + elseif etype == 2 then | |
| 181 | + self.battle.player:addBuff(id) | |
| 182 | + end | |
| 183 | + end | |
| 184 | +end | |
| 185 | + | |
| 186 | +function Adv:addArtifactEffect(effect) | |
| 187 | + for _, eff in ipairs(effect:toArray()) do | |
| 188 | + local etype, id = table.unpack(eff:toArray(true, "=")) | |
| 189 | + if etype == 1 then | |
| 190 | + self.battle.player:delPassiveById(id) | |
| 191 | + elseif etype == 2 then | |
| 192 | + self.battle.player:delBuffById(id) | |
| 193 | + end | |
| 194 | + end | |
| 195 | +end | |
| 196 | + | |
| 197 | +function Adv:wearArtifact(slot, id) | |
| 198 | + local advAFGet = self.owner:getProperty("advAFGet") | |
| 199 | + local advAFWear = self.owner:getProperty("advAFWear") | |
| 200 | + | |
| 201 | + local curWear = {} | |
| 202 | + for _, _id in pairs(advAFWear) do | |
| 203 | + curWear[_id] = 1 | |
| 204 | + end | |
| 205 | + if curWear[id] then return end | |
| 206 | + | |
| 207 | + if advAFWear[slot] then | |
| 208 | + local oldData = csvdb["adv_artifactCsv"][advAFWear[slot]][advAFGet[advAFWear[slot]]] | |
| 209 | + self:delArtifactEffect(oldData.effect) | |
| 210 | + if oldData.comboId ~= 0 then | |
| 211 | + local comboData = csvdb["adv_artifact_comboCsv"][oldData.comboId] | |
| 212 | + if comboData then | |
| 213 | + local isHaveCombo = true | |
| 214 | + for _, _id in ipairs(comboData.artifactid:toArray(true)) do | |
| 215 | + if not curWear[_id] then | |
| 216 | + isHaveCombo = false | |
| 217 | + break | |
| 218 | + end | |
| 219 | + end | |
| 220 | + if isHaveCombo then | |
| 221 | + self:delArtifactEffect(comboData.effect) | |
| 222 | + end | |
| 223 | + end | |
| 224 | + end | |
| 225 | + curWear[advAFWear[slot]] = nil | |
| 226 | + end | |
| 227 | + | |
| 228 | + curWear[id] = 1 | |
| 229 | + local newData = csvdb["adv_artifactCsv"][id][advAFGet[id]] | |
| 230 | + self:addArtifactEffect(newData.effect) | |
| 231 | + if newData.comboId ~= 0 then | |
| 232 | + local comboData = csvdb["adv_artifact_comboCsv"][newData.comboId] | |
| 233 | + if comboData then | |
| 234 | + local isHaveCombo = true | |
| 235 | + for _, _id in ipairs(comboData.artifactid:toArray(true)) do | |
| 236 | + if not curWear[_id] then | |
| 237 | + isHaveCombo = false | |
| 238 | + break | |
| 239 | + end | |
| 240 | + end | |
| 241 | + if isHaveCombo then | |
| 242 | + self:addArtifactEffect(comboData.effect) | |
| 243 | + end | |
| 244 | + end | |
| 245 | + end | |
| 162 | 246 | |
| 247 | + self.owner:changeUpdates({{type = "advAFWear", field = slot, value = id}}) | |
| 248 | + return true | |
| 249 | +end | |
| 250 | + | |
| 251 | +function Adv:artifactLevelUp(id) | |
| 252 | + local advAFGet = self.owner:getProperty("advAFGet") | |
| 253 | + local advAFWear = self.owner:getProperty("advAFWear") | |
| 254 | + local status = 0 | |
| 255 | + if advAFWear[id] then -- 穿着呢 | |
| 256 | + local oldData = csvdb["adv_artifactCsv"][id][advAFGet[id]] | |
| 257 | + local newData = csvdb["adv_artifactCsv"][id][advAFGet[id] + 1] | |
| 258 | + self:delArtifactEffect(oldData.effect) | |
| 259 | + self:addArtifactEffect(newData.effect) | |
| 260 | + status = 1 | |
| 261 | + end | |
| 262 | + self.owner:changeUpdates({{type = "advAFGet", field = id, value = advAFGet[id] + 1}}) | |
| 263 | + return status | |
| 264 | +end | |
| 265 | + | |
| 266 | +function Adv:waitChooseArtifact() | |
| 267 | + local chooses = {} | |
| 268 | + local pool = {} | |
| 269 | + local count = 3 --需要多少个 | |
| 270 | + | |
| 271 | + for id, temp in pairs(csvdb["adv_artifactCsv"]) do | |
| 272 | + if not self:isHaveArtifact(id) and self.owner:isArtifactOpen(id, self:isEndless()) then | |
| 273 | + table.insert(pool, id) | |
| 274 | + end | |
| 275 | + end | |
| 276 | + | |
| 277 | + for i = 1, count do | |
| 278 | + if len(pool) <= 0 then | |
| 279 | + table.insert(chooses, {ItemId.AdvPoint, 48}) | |
| 280 | + else | |
| 281 | + local idx = math.randomInt(1, #pool) | |
| 282 | + table.insert(chooses, pool[idx]) | |
| 283 | + table.remove(pool, idx) | |
| 284 | + end | |
| 285 | + end | |
| 286 | + self.waitArtifact = chooses | |
| 287 | + self:backChooseArtifact() | |
| 288 | +end | |
| 289 | + | |
| 290 | +function Adv:isWaitChooseArtifact() | |
| 291 | + return self.waitArtifact | |
| 292 | +end | |
| 293 | + | |
| 294 | +function Adv:chooseArtifact(index) | |
| 295 | + if not self.waitArtifact or not self.waitArtifact[index] then return end | |
| 296 | + local itemId = type(self.waitArtifact[index]) == "table" and self.waitArtifact[index][1] or self.waitArtifact[index] | |
| 297 | + local count = type(self.waitArtifact[index]) == "table" and self.waitArtifact[index][2] or 1 | |
| 298 | + self:award({[itemId] = count}) | |
| 299 | + return true | |
| 300 | +end | |
| 301 | + | |
| 302 | +function Adv:isEndless() | |
| 303 | + return AdvCommon.isEndless(self.chapterId) | |
| 304 | +end | |
| 163 | 305 | |
| 164 | 306 | --关卡通关,非层 score < 0 失败 |
| 165 | 307 | function Adv:over(success, isAllPass) |
| ... | ... | @@ -183,6 +325,7 @@ function Adv:over(success, isAllPass) |
| 183 | 325 | self:clear() |
| 184 | 326 | self.owner:checkTaskEnter("AdvScore", {score = score}) |
| 185 | 327 | self.owner:updateProperty({field = "advItems", value = ""}) |
| 328 | + self.owner:updateProperty({field = "advAFGet", value = {}}) | |
| 186 | 329 | |
| 187 | 330 | self:backEnd(success, score, scoreInfo, reward) |
| 188 | 331 | end |
| ... | ... | @@ -244,136 +387,34 @@ function Adv:award(gift, params) |
| 244 | 387 | tgift = gift |
| 245 | 388 | end |
| 246 | 389 | local items = self.owner:getProperty("advItems") |
| 390 | + local oldItems = items | |
| 247 | 391 | for itemId, count in pairs(tgift) do |
| 248 | 392 | if count > 0 then |
| 393 | + local buffAdd = self.battle.player:getRewardChange(itemId) | |
| 394 | + count = math.max(0, (count + buffAdd[0]) * (1 + buffAdd[1])) --附加 buff 的影响 | |
| 249 | 395 | self:scoreChange(AdvScoreType.Item, {itemId, count}) |
| 250 | 396 | self:checkTask(Adv.TaskType.Item, count, itemId) |
| 251 | 397 | self:checkAchievement(Adv.AchievType.GetItem, count, itemId) |
| 252 | 398 | end |
| 399 | + tgift[itemId] = count | |
| 253 | 400 | local origin = items:getv(itemId, 0) |
| 254 | 401 | local nums = origin + count |
| 255 | - if csvdb["adv_artifactCsv"][itemId] then | |
| 256 | - nums = self:checkArtifact(itemId, origin, count, nums) | |
| 257 | - end | |
| 258 | - if nums <= 0 then | |
| 259 | - items = items:delk(itemId) | |
| 260 | - nums = 0 | |
| 261 | - else | |
| 262 | - items = items:setv(itemId, nums) | |
| 263 | - end | |
| 264 | - end | |
| 265 | - | |
| 266 | - self.owner:updateProperty({field = "advItems", value = items, notNotify = params.notNotify}) | |
| 267 | - return tgift | |
| 268 | -end | |
| 269 | - | |
| 270 | 402 | |
| 271 | -function Adv:delArtifactEffect(effectType, effects) | |
| 272 | - if effectType == 1 then | |
| 273 | - for _, id in ipairs(effects:toArray(true, "=")) do | |
| 274 | - self.battle.player:delPassiveById(id) | |
| 275 | - end | |
| 276 | - elseif effectType == 2 then | |
| 277 | - for _, id in ipairs(effects:toArray(true, "=")) do | |
| 278 | - self.battle.player:delBuffById(id) | |
| 279 | - end | |
| 280 | - end | |
| 281 | -end | |
| 282 | - | |
| 283 | -function Adv:addArtifactEffect(effectType, effects) | |
| 284 | - if effectType == 1 then | |
| 285 | - for _, id in ipairs(effects:toArray(true, "=")) do | |
| 286 | - self.battle.player:addPassive({id = id}) | |
| 287 | - end | |
| 288 | - elseif effectType == 2 then | |
| 289 | - for _, id in ipairs(effects:toArray(true, "=")) do | |
| 290 | - self.battle.player:addBuff(id) | |
| 291 | - end | |
| 292 | - end | |
| 293 | -end | |
| 294 | --- 检查神器 | |
| 295 | -function Adv:checkArtifact(itemId, origin, count, nums) | |
| 296 | - local artifactData = csvdb["adv_artifactCsv"][itemId] | |
| 297 | - if count == 0 or not artifactData then return nums end | |
| 298 | - local advItems = self.owner:getProperty("advItems") | |
| 299 | - if count < 0 then --删除 | |
| 300 | - nums = 0 | |
| 301 | - local curData = artifactData[origin] | |
| 302 | - if curData then | |
| 303 | - -- 删除自己的效果 | |
| 304 | - self:delArtifactEffect(curData.type, curData.effect) | |
| 305 | - | |
| 306 | - --删除组合效果 | |
| 307 | - if curData.comboId ~= 0 then | |
| 308 | - local comboLv = advItems:getv(curData.comboId, 0) | |
| 309 | - if comboLv ~= 0 then | |
| 310 | - --删除自己的组合效果 | |
| 311 | - if curData.comboType == 1 or curData.comboType == 2 then | |
| 312 | - self:delArtifactEffect(curData.comboType, curData.comboEffect) | |
| 313 | - elseif curData.comboType == 3 then | |
| 314 | - self:delArtifactEffect(curData.type, curData.comboEffect) | |
| 315 | - end | |
| 316 | - | |
| 317 | - -- 删除组合的组合效果 | |
| 318 | - local comboData = (csvdb["adv_artifactCsv"][curData.comboId] or {})[comboLv] | |
| 319 | - if comboData then | |
| 320 | - if comboData.comboType == 1 or comboData.comboType == 2 then | |
| 321 | - self:delArtifactEffect(comboData.comboType, comboData.comboEffect) | |
| 322 | - elseif comboData.comboType == 3 then | |
| 323 | - self:delArtifactEffect(comboData.type, comboData.comboEffect) | |
| 324 | - self:addArtifactEffect(comboData.type, comboData.effect) | |
| 325 | - end | |
| 326 | - end | |
| 327 | - end | |
| 328 | - end | |
| 329 | - end | |
| 330 | - else | |
| 331 | - nums = math.max(0, math.min(nums, #artifactData)) | |
| 332 | - if nums == origin then return nums end | |
| 333 | - if origin == 0 then --初始获得 | |
| 334 | - local curData = artifactData[nums] | |
| 335 | - local addSelfEffect = true | |
| 336 | - --查看是否有组合 | |
| 337 | - if curData.comboId ~= 0 then | |
| 338 | - local comboLv = advItems:getv(curData.comboId, 0) | |
| 339 | - if comboLv ~= 0 then | |
| 340 | - --自己的组合效果 | |
| 341 | - if curData.comboType == 1 or curData.comboType == 2 then | |
| 342 | - self:addArtifactEffect(curData.comboType, curData.comboEffect) | |
| 343 | - elseif curData.comboType == 3 then | |
| 344 | - self:addArtifactEffect(curData.type, curData.comboEffect) | |
| 345 | - addSelfEffect = false | |
| 346 | - end | |
| 347 | - | |
| 348 | - --对方的组合效果 | |
| 349 | - local comboData = (csvdb["adv_artifactCsv"][curData.comboId] or {})[comboLv] | |
| 350 | - if comboData then | |
| 351 | - if comboData.comboType == 1 or comboData.comboType == 2 then | |
| 352 | - self:addArtifactEffect(comboData.comboType, comboData.comboEffect) | |
| 353 | - elseif comboData.comboType == 3 then | |
| 354 | - self:delArtifactEffect(comboData.type, comboData.effect) | |
| 355 | - self:addArtifactEffect(comboData.type, comboData.comboEffect) | |
| 356 | - end | |
| 357 | - end | |
| 358 | - end | |
| 359 | - end | |
| 360 | - if addSelfEffect then | |
| 361 | - self:addArtifactEffect(curData.type, curData.effect) | |
| 362 | - end | |
| 363 | - else --升级 | |
| 364 | - local originData = artifactData[origin] | |
| 365 | - local curData = artifactData[nums] | |
| 366 | - | |
| 367 | - if originData then | |
| 368 | - self:delArtifactEffect(originData.type, originData.effect) | |
| 369 | - end | |
| 370 | - | |
| 371 | - if curData then | |
| 372 | - self:addArtifactEffect(curData.type, curData.effect) | |
| 403 | + if csvdb["adv_artifactCsv"][itemId] then -- 获得神器 | |
| 404 | + self:awardArtifact(itemId, params) | |
| 405 | + else | |
| 406 | + if nums <= 0 then | |
| 407 | + items = items:delk(itemId) | |
| 408 | + nums = 0 | |
| 409 | + else | |
| 410 | + items = items:setv(itemId, nums) | |
| 373 | 411 | end |
| 374 | 412 | end |
| 375 | 413 | end |
| 376 | - return nums | |
| 414 | + if items ~= oldItems then | |
| 415 | + self.owner:updateProperty({field = "advItems", value = items, notNotify = params.notNotify}) | |
| 416 | + end | |
| 417 | + return tgift | |
| 377 | 418 | end |
| 378 | 419 | |
| 379 | 420 | |
| ... | ... | @@ -397,7 +438,9 @@ function Adv:cost(item, params, check) |
| 397 | 438 | if next(less) and not self.owner:checkItemEnough(less) then return end --不够 |
| 398 | 439 | if check then return true end |
| 399 | 440 | self:award(advCost, params) |
| 400 | - self.owner:costItems(less, params) | |
| 441 | + if next(less) then | |
| 442 | + self.owner:costItems(less, params) | |
| 443 | + end | |
| 401 | 444 | return true |
| 402 | 445 | end |
| 403 | 446 | |
| ... | ... | @@ -411,7 +454,7 @@ local function clickOut(self, room, block, params) |
| 411 | 454 | |
| 412 | 455 | local advPass = self.owner:getProperty("advPass") |
| 413 | 456 | |
| 414 | - if AdvCommon.isEndless(self.chapterId) then | |
| 457 | + if self:isEndless() then | |
| 415 | 458 | -- 刷新最高层 |
| 416 | 459 | if self.owner:getProperty("advElM") < self.level then |
| 417 | 460 | self.owner:updateProperty({field = "advElM", value = self.level}) |
| ... | ... | @@ -427,8 +470,8 @@ local function clickOut(self, room, block, params) |
| 427 | 470 | |
| 428 | 471 | self:checkAchievement(Adv.AchievType.OverWin, 1, self.level) |
| 429 | 472 | local levellimit = csvdb["adv_chapterCsv"][self.chapterId].limitlevel |
| 430 | - if params.relay or (not AdvCommon.isEndless(self.chapterId) and (self.level >= levellimit or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1))) then --关卡结束 | |
| 431 | - self:over(true, not AdvCommon.isEndless(self.chapterId) and self.level >= levellimit) | |
| 473 | + if params.relay or (not self:isEndless() and (self.level >= levellimit or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1))) then --关卡结束 | |
| 474 | + self:over(true, not self:isEndless() and self.level >= levellimit) | |
| 432 | 475 | else |
| 433 | 476 | self:initByChapter(self.chapterId, self.level + 1, true, true) |
| 434 | 477 | self:backNext() --下一关 |
| ... | ... | @@ -522,6 +565,9 @@ local function chooseCommon(self, room, block, chooseData, choose) |
| 522 | 565 | clearBlock = false |
| 523 | 566 | end, |
| 524 | 567 | [4] = function() --无事发生 |
| 568 | + end, | |
| 569 | + [11] = function() -- 获得神器 | |
| 570 | + self:waitChooseArtifact() --等待获取神器 | |
| 525 | 571 | end |
| 526 | 572 | } |
| 527 | 573 | assert(doEffect[effect[1]], "error effect, event_[link]chooseCsv id :" .. block.event.id) |
| ... | ... | @@ -1078,6 +1124,10 @@ function Adv:backMapShow() |
| 1078 | 1124 | self:pushBackEvent(AdvBackEventType.MapShow, {}) |
| 1079 | 1125 | end |
| 1080 | 1126 | |
| 1127 | +function Adv:backChooseArtifact() | |
| 1128 | + self:pushBackEvent(AdvBackEventType.ChooseArtifact, {}) | |
| 1129 | +end | |
| 1130 | + | |
| 1081 | 1131 | function Adv:scoreChange(scoreType, pms) |
| 1082 | 1132 | local cutTypes = {} |
| 1083 | 1133 | local score = 0 | ... | ... |
src/adv/AdvBattle.lua
| ... | ... | @@ -41,29 +41,30 @@ function Battle:initPlayer() |
| 41 | 41 | local player = advTeam.player |
| 42 | 42 | if not player then |
| 43 | 43 | player = {} |
| 44 | + player.level = 1 | |
| 45 | + player.exp = 0 | |
| 46 | + player.sp = 100 | |
| 47 | + player.growth = {} | |
| 44 | 48 | player.passives = {} |
| 45 | - local heroLevel = 0 | |
| 49 | + | |
| 46 | 50 | for slot, heroId in pairs(advTeam.heros) do |
| 47 | 51 | local hero = self.adv.owner.heros[heroId] |
| 48 | 52 | if hero then |
| 49 | - heroLevel = heroLevel + hero:getProperty("level") | |
| 50 | 53 | local advSkillId = csvdb["unitCsv"][self.adv.owner.heros[heroId]:getProperty("type")]["adv"] |
| 51 | 54 | if advSkillId > 1000 then |
| 52 | 55 | table.insert(player.passives, {id = advSkillId, level = hero:getSkillLevel(4)}) |
| 53 | 56 | end |
| 54 | 57 | end |
| 55 | 58 | end |
| 56 | - player.growth = (self.adv.owner:getRealBattleValue(advTeam.heros) / 80) ^ 0.52 + math.floor(heroLevel / 50) / 50 | |
| 57 | - player.level = 1 | |
| 58 | - player.exp = 0 | |
| 59 | - player.sp = 100 | |
| 60 | - local activeRelation = self.adv.owner:getHeroActiveRelation() | |
| 61 | - local baseAttr = csvdb["adv_unitCsv"][self.adv.chapterId] | |
| 62 | - for _, attr in pairs(AttsEnumEx) do | |
| 63 | - if baseAttr[attr] then | |
| 64 | - player[attr] = baseAttr[attr] + player.growth * (player.level - 1) | |
| 59 | + | |
| 60 | + local attrs = self.adv.owner:getTeamBattleInfo(advTeam).heros | |
| 61 | + for attrName, _ in pairs(AdvAttsEnum) do | |
| 62 | + for _, hero in pairs(attrs) do | |
| 63 | + player[attrName] = (player[attrName] or 0) + hero[attrName] | |
| 65 | 64 | end |
| 65 | + palyer.growth[attrName] = player[attrName] * 0.025 | |
| 66 | 66 | end |
| 67 | + | |
| 67 | 68 | player.hpMax = player.hp or 0 |
| 68 | 69 | self.isNewPlayer = true |
| 69 | 70 | advTeam.player = player | ... | ... |
src/adv/AdvBuff.lua
| ... | ... | @@ -27,6 +27,9 @@ Buff.EXP_UP = 24 -- 杀敌经验提高 |
| 27 | 27 | Buff.DISABLE_BUFF = 25 -- 禁用固有技 |
| 28 | 28 | Buff.ATTR_CHANGE_COND = 26 --属性变化(状态)有条件 |
| 29 | 29 | Buff.CHANGE_DROP_TO_CLICK = 27 --掉落转换为click |
| 30 | +Buff.SP_MAX_CHANGE = 28, -- 魔法上限 | |
| 31 | +Buff.ITEM_GET_UP = 29, -- 获得道具数量增加 | |
| 32 | +Buff.Buff_EFFECT_CHANGE = 30, -- 改变 buff 效果 | |
| 30 | 33 | |
| 31 | 34 | --角色一些属性的变化 |
| 32 | 35 | local function commonAttr(_Buff, attrName) |
| ... | ... | @@ -34,26 +37,46 @@ local function commonAttr(_Buff, attrName) |
| 34 | 37 | self.owner:reSetAttr(attrName) |
| 35 | 38 | end |
| 36 | 39 | _Buff._effectValue = function(self) |
| 37 | - return self.buffData.effectValue1, self.buffData.effectValue2 | |
| 40 | + return self.buffData.effectValue1, self:doEffectChange(self.buffData.effectValue2) * self.layer, attrName | |
| 41 | + end | |
| 42 | + _Buff._overlay = function(self) | |
| 43 | + self.owner:reSetAttr(attrName) | |
| 44 | + end | |
| 45 | + _Buff._uncover = function(self) | |
| 46 | + self.owner:reSetAttr(attrName) | |
| 38 | 47 | end |
| 39 | 48 | _Buff._endBuff = function(self, data) |
| 40 | 49 | self.owner:reSetAttr(attrName) |
| 41 | 50 | end |
| 51 | + _Buff._effectChange = function(self) | |
| 52 | + self.owner:reSetAttr(attrName) | |
| 53 | + end | |
| 42 | 54 | end |
| 43 | 55 | local function commonAttCond(_Buff, attrName) |
| 44 | 56 | _Buff._init = function(self, data) --初始化变化值 |
| 57 | + self._changeV = self:_calculate() | |
| 58 | + self.owner:reSetAttr(attrName) | |
| 59 | + end | |
| 60 | + _Buff._overlay = function(self) | |
| 61 | + self._changeV = (self._changeV or 0) + self:_calculate() | |
| 62 | + self.owner:reSetAttr(attrName) | |
| 63 | + end | |
| 64 | + _Buff._uncover = function(self) | |
| 65 | + self._changeV = self._changeV - self._changeV / (self.layer + 1) | |
| 66 | + self.owner:reSetAttr(attrName) | |
| 67 | + end | |
| 68 | + _Buff._calculate = function(self) | |
| 45 | 69 | local effectCount = 0 |
| 46 | 70 | if self.buffData.effectValue4 == 0 then |
| 47 | 71 | effectCount = self.owner.battle.adv.owner:getProperty("advItems"):getv(ItemId.OldCoin, 0) |
| 48 | 72 | end |
| 49 | - self._changeV = self.buffData.effectValue2 * effectCount / self.buffData.effectValue5 | |
| 50 | - self.owner:reSetAttr(attrName) | |
| 73 | + return self.buffData.effectValue2 * effectCount / tonumber(self.buffData.effectValue5) | |
| 51 | 74 | end |
| 52 | 75 | _Buff._initDB = function(self, data) |
| 53 | 76 | self._changeV = data.cv |
| 54 | 77 | end |
| 55 | 78 | _Buff._effectValue = function(self) |
| 56 | - return self.buffData.effectValue1, self._changeV | |
| 79 | + return self.buffData.effectValue1, self._changeV, attrName | |
| 57 | 80 | end |
| 58 | 81 | _Buff._endBuff = function(self, data) |
| 59 | 82 | self.owner:reSetAttr(attrName) |
| ... | ... | @@ -66,19 +89,29 @@ end |
| 66 | 89 | local BuffFactory = { |
| 67 | 90 | [Buff.HP_CHANGE] = function(_Buff) |
| 68 | 91 | _Buff._init = function(self, data) --初始化变化值 |
| 69 | - self._changeV = 0 | |
| 92 | + self._changeV = self:_calculate() | |
| 93 | + end | |
| 94 | + _Buff._overlay = function(self) | |
| 95 | + self._changeV = (self._changeV or 0) + self:_calculate() | |
| 96 | + end | |
| 97 | + _Buff._uncover = function(self) | |
| 98 | + self._changeV = self._changeV - self._changeV / (self.layer + 1) | |
| 99 | + end | |
| 100 | + _Buff._calculate = function(self) | |
| 101 | + local curValue = 0 | |
| 70 | 102 | if self.buffData.effectValue1 == 0 then --固定值 |
| 71 | - self._changeV = self.buffData.effectValue2 | |
| 103 | + curValue = self.buffData.effectValue2 | |
| 72 | 104 | elseif self.buffData.effectValue1 == 1 then |
| 73 | 105 | local baseOwner = self.buffData.effectValue4 == 1 and self.owner or self.release |
| 74 | 106 | local attrs = {[0] = "hp", [1] = "hpMax", [2] = "atk"} |
| 75 | - self._changeV = baseOwner[attrs[self.buffData.effectValue3]] * self.buffData.effectValue2 / 100 | |
| 107 | + curValue = baseOwner[attrs[self.buffData.effectValue3]] * self.buffData.effectValue2 / 100 | |
| 76 | 108 | end |
| 77 | - if self._changeV < 0 then | |
| 109 | + if curValue < 0 then | |
| 78 | 110 | if self.release then |
| 79 | - self._changeV = -self.release:getHurtValue(-self._changeV) | |
| 111 | + curValue = -self.release:getHurtValue(-curValue) | |
| 80 | 112 | end |
| 81 | 113 | end |
| 114 | + return curValue | |
| 82 | 115 | end |
| 83 | 116 | _Buff._initDB = function(self, data) |
| 84 | 117 | self._changeV = data.cv |
| ... | ... | @@ -92,8 +125,9 @@ local BuffFactory = { |
| 92 | 125 | end |
| 93 | 126 | end |
| 94 | 127 | _Buff._effectValue = function(self) |
| 95 | - return self._changeV | |
| 128 | + return self:doEffectChange(self._changeV) | |
| 96 | 129 | end |
| 130 | + | |
| 97 | 131 | _Buff._getDB = function(self) |
| 98 | 132 | return {cv = self._changeV} |
| 99 | 133 | end |
| ... | ... | @@ -101,33 +135,60 @@ local BuffFactory = { |
| 101 | 135 | |
| 102 | 136 | [Buff.HP_MAX_CHANGE] = function(_Buff) |
| 103 | 137 | _Buff._init = function(self, data) --初始化变化值 |
| 104 | - self._changeV = 0 | |
| 138 | + self._changeV = self:_calculate() | |
| 139 | + self:_hpChange() | |
| 140 | + end | |
| 141 | + _Buff._overlay = function(self) | |
| 142 | + self._changeV = (self._changeV or 0) + self:_calculate() | |
| 143 | + self:_hpChange() | |
| 144 | + end | |
| 145 | + | |
| 146 | + _Buff._uncover = function(self) | |
| 147 | + self._changeV = self._changeV - self._changeV / (self.layer + 1) | |
| 148 | + self.owner:reSetHpMax() | |
| 149 | + end | |
| 150 | + | |
| 151 | + -- 提高生命上限的时候要相应提高生命值 | |
| 152 | + _Buff._hpChange = function(self) | |
| 153 | + local oldHpMax = self.owner.hpMax | |
| 154 | + self.owner:reSetHpMax() | |
| 155 | + | |
| 156 | + local curValue = self.owner.hpMax - oldHpMax | |
| 157 | + if curValue > 0 then | |
| 158 | + self.owner:recover(curValue, self.release) -- 防止release不存在,地图点buff | |
| 159 | + elseif curValue < 0 then | |
| 160 | + self.owner:hurt(self.release and self.release:getHurtValue(-curValue) or -curValue, self.release, {hurtType = 2, buffId = self.id}) | |
| 161 | + end | |
| 162 | + end | |
| 163 | + | |
| 164 | + _Buff._calculate = function(self) | |
| 165 | + local curValue = 0 | |
| 105 | 166 | if self.buffData.effectValue1 == 0 then --固定值 |
| 106 | - self._changeV = self.buffData.effectValue2 | |
| 167 | + curValue = self.buffData.effectValue2 | |
| 107 | 168 | elseif self.buffData.effectValue1 == 1 then |
| 108 | 169 | local baseOwner = self.buffData.effectValue4 == 1 and self.owner or self.release |
| 109 | 170 | local attrs = {[0] = "hp", [1] = "hpMax", [2] = "atk"} |
| 110 | - self._changeV = baseOwner[attrs[self.buffData.effectValue3]] * self.buffData.effectValue2 / 100 | |
| 111 | - end | |
| 112 | - local old = self.owner.hpMax | |
| 113 | - self.owner.hpMax = math.max(1, self.owner.hpMax + self._changeV) | |
| 114 | - self._changeV = self.owner.hpMax - old | |
| 115 | - if self._changeV > 0 then | |
| 116 | - self.owner:recover(self._changeV, self.release) -- 防止release不存在,地图点buff | |
| 117 | - elseif self._changeV < 0 then | |
| 118 | - self.owner:hurt(self.release and self.release:getHurtValue(-self._changeV) or -self._changeV, self.release, {hurtType = 2, buffId = self.id}) | |
| 119 | - self.owner.hp = math.min(self.owner.hpMax, self.owner.hp) | |
| 171 | + curValue = baseOwner[attrs[self.buffData.effectValue3]] * self.buffData.effectValue2 / 100 | |
| 120 | 172 | end |
| 173 | + return curValue | |
| 174 | + end | |
| 175 | + | |
| 176 | + _Buff._effectValue = function(self) | |
| 177 | + return self:doEffectChange(self._changeV) | |
| 178 | + end | |
| 179 | + | |
| 180 | + _Buff._endBuff = function(self) | |
| 181 | + self.owner:reSetHpMax() | |
| 121 | 182 | end |
| 183 | + | |
| 184 | + _Buff._effectChange = function(self) | |
| 185 | + self.owner:reSetHpMax() | |
| 186 | + end | |
| 187 | + | |
| 122 | 188 | _Buff._initDB = function(self, data) |
| 123 | 189 | self._changeV = data.cv |
| 124 | 190 | end |
| 125 | - _Buff._endBuff = function(self, data) | |
| 126 | - if self._changeV then | |
| 127 | - self.owner.hpMax = math.max(1, self.owner.hpMax - self._changeV) | |
| 128 | - self.owner.hp = math.min(self.owner.hpMax, self.owner.hp) | |
| 129 | - end | |
| 130 | - end | |
| 191 | + | |
| 131 | 192 | _Buff._getDB = function(self) |
| 132 | 193 | return {cv = self._changeV} |
| 133 | 194 | end |
| ... | ... | @@ -137,61 +198,23 @@ local BuffFactory = { |
| 137 | 198 | commonAttr(_Buff, attrName) |
| 138 | 199 | end, |
| 139 | 200 | |
| 140 | - [Buff.ATTR_CHANGE] = function(_Buff) | |
| 201 | + [Buff.ATTR_CHANGE_COND] = function(_Buff) | |
| 141 | 202 | local attrName = AttsEnumEx[_Buff.buffData.effectValue3] |
| 142 | 203 | commonAttCond(_Buff, attrName) |
| 143 | 204 | end, |
| 144 | 205 | |
| 145 | 206 | |
| 146 | - [Buff.BACK_HURT] = function(_Buff) | |
| 147 | - _Buff._effectValue = function(self) | |
| 148 | - return self.buffData.effectValue1, self.buffData.effectValue2, self.buffData.effectValue3 | |
| 149 | - end | |
| 150 | - end, | |
| 151 | - | |
| 152 | - [Buff.HURT_CHANGE] = function(_Buff) | |
| 153 | - _Buff._effectValue = function(self) | |
| 154 | - return self.buffData.effectValue1, self.buffData.effectValue2 | |
| 155 | - end | |
| 156 | - end, | |
| 157 | - | |
| 158 | - [Buff.INJURED_CHANGE] = function(_Buff) | |
| 159 | - _Buff._effectValue = function(self) | |
| 160 | - return self.buffData.effectValue1, self.buffData.effectValue2, self.buffData.effectValue3 | |
| 161 | - end | |
| 162 | - end, | |
| 163 | - | |
| 164 | - [Buff.HURT_TRANSFER] = function(_Buff) | |
| 165 | - _Buff._effectValue = function(self) | |
| 166 | - return self.buffData.effectValue1, self.buffData.effectValue2 | |
| 167 | - end | |
| 168 | - end, | |
| 169 | - | |
| 170 | - [Buff.HURT_ABSORB] = function(_Buff) | |
| 171 | - _Buff._effectValue = function(self) | |
| 172 | - return self.buffData.effectValue1, self.buffData.effectValue2 | |
| 173 | - end | |
| 174 | - end, | |
| 175 | - | |
| 176 | - [Buff.CHANGE_DROP] = function(_Buff) | |
| 177 | - _Buff._effectValue = function(self) | |
| 178 | - return self.buffData.effectValue1, self.buffData.effectValue2 | |
| 179 | - end | |
| 180 | - end, | |
| 181 | - | |
| 182 | 207 | [Buff.CHANGE_DROP_TO_CLICK] = function(_Buff) |
| 183 | 208 | _Buff._effectValue = function(self) |
| 209 | + -- id | |
| 184 | 210 | return self.buffData.effectValue1 |
| 185 | 211 | end |
| 186 | 212 | end, |
| 187 | 213 | |
| 188 | 214 | [Buff.IMMNUE_BUFF] = function(_Buff) |
| 189 | - _Buff._init = function(self, data) | |
| 190 | - self.count = self.buffData.effectValue3 | |
| 191 | - end | |
| 192 | 215 | _Buff._canEffect = function(self, buffId, buffGroup) |
| 193 | 216 | local cType, aim = self.buffData.effectValue1, self.buffData.effectValue2 |
| 194 | - if (cType == 0 and buffId == aim) or (cType == 1 and buffGroup == aim) then | |
| 217 | + if buffData.dispel == 0 and (not cType or (cType == 0 and buffId == aim) or (cType == 1 and buffData.group == aim)) then | |
| 195 | 218 | return true |
| 196 | 219 | end |
| 197 | 220 | end |
| ... | ... | @@ -199,17 +222,19 @@ local BuffFactory = { |
| 199 | 222 | |
| 200 | 223 | [Buff.CLEAR_BUFF] = function(_Buff) |
| 201 | 224 | _Buff._init = function(self, data) |
| 202 | - self.count = self.buffData.effectValue3 | |
| 203 | 225 | for _, buff in ipairs(self.buffs) do -- 挂上就清除一下子 |
| 204 | - if not buff.isDel and self:canEffect(buff.id, buff:getGroup()) then | |
| 205 | - buff.isDel = true | |
| 206 | - self:effect() | |
| 226 | + if not buff.isDel and self:canEffect(buff.id) and not self.isDel then | |
| 227 | + if not buff.isDel and not self.isDel then | |
| 228 | + self:effect() | |
| 229 | + buff:uncover() | |
| 230 | + end | |
| 207 | 231 | end |
| 208 | 232 | end |
| 209 | 233 | end |
| 210 | - _Buff._canEffect = function(self, buffId, buffGroup) | |
| 234 | + _Buff._canEffect = function(self, buffId) | |
| 235 | + local buffData = csvdb["adv_map_buffCsv"][buffId] | |
| 211 | 236 | local cType, aim = self.buffData.effectValue1, self.buffData.effectValue2 |
| 212 | - if (cType == 0 and buffId == aim) or (cType == 1 and buffGroup == aim) then | |
| 237 | + if buffData.dispel == 0 and (not cType or (cType == 0 and buffId == aim) or (cType == 1 and buffData.group == aim)) then | |
| 213 | 238 | return true |
| 214 | 239 | end |
| 215 | 240 | end |
| ... | ... | @@ -221,78 +246,114 @@ local BuffFactory = { |
| 221 | 246 | self.owner.battle.adv:openBlockRand(roomNum) |
| 222 | 247 | end |
| 223 | 248 | _Buff._effectValue = function(self) |
| 224 | - return self.buffData.effectValue1 | |
| 249 | + -- 数量 | |
| 250 | + return self.buffData.effectValue1 * self.layer | |
| 225 | 251 | end |
| 226 | 252 | end, |
| 227 | 253 | |
| 228 | 254 | [Buff.SP_CHANGE] = function(_Buff) |
| 229 | - --cType 0 or nil 值 1 百分比 | |
| 230 | 255 | _Buff._afterRound = function(self) |
| 231 | - local value, cType = self:effect() | |
| 256 | + local cType, value = self:effect() | |
| 232 | 257 | self.owner:changeSp(value, cType) |
| 233 | 258 | end |
| 234 | 259 | _Buff._effectValue = function(self) |
| 235 | - return self.buffData.effectValue2, self.buffData.effectValue1 | |
| 260 | + -- 值/% 数量 | |
| 261 | + return self.buffData.effectValue1, self:doEffectChange(self.buffData.effectValue2) * self.layer | |
| 236 | 262 | end |
| 237 | 263 | end, |
| 238 | 264 | |
| 239 | - [Buff.HP_CHANGE_NOW] = function(_Buff) | |
| 240 | - _Buff._init = function(self, data) --初始化变化值 | |
| 241 | - self._changeV = 0 | |
| 242 | - if self.buffData.effectValue1 == 0 then --固定值 | |
| 243 | - self._changeV = self.buffData.effectValue2 | |
| 244 | - elseif self.buffData.effectValue1 == 1 then | |
| 245 | - local baseOwner = self.buffData.effectValue4 == 1 and self.owner or self.release | |
| 246 | - local attrs = {[0] = "hp", [1] = "hpMax", [2] = "atk"} | |
| 247 | - self._changeV = baseOwner[attrs[self.buffData.effectValue3]] * self.buffData.effectValue2 / 100 | |
| 248 | - end | |
| 249 | - if self._changeV < 0 then | |
| 250 | - self._changeV = self.release and -self.release:getHurtValue(-self._changeV) or self._changeV | |
| 251 | - end | |
| 252 | - end | |
| 253 | - _Buff._initDB = function(self, data) | |
| 254 | - self._changeV = data.cv | |
| 255 | - end | |
| 265 | + [Buff.EXP_ADD] = function(_Buff) | |
| 256 | 266 | _Buff._afterRound = function(self) |
| 257 | 267 | local value = self:effect() |
| 258 | - if value > 0 then | |
| 259 | - self.owner:recover(value, self.release) | |
| 260 | - elseif value < 0 then | |
| 261 | - self.owner:hurt(-value, self.release, {hurtType = self.buffData.effectValue5 == "1" and 6 or 2, buffId = self.id}) | |
| 262 | - end | |
| 268 | + self.owner.battle.player:addExp(value) | |
| 263 | 269 | end |
| 264 | 270 | _Buff._effectValue = function(self) |
| 265 | - return self._changeV | |
| 266 | - end | |
| 267 | - _Buff._getDB = function(self) | |
| 268 | - return {cv = self._changeV} | |
| 271 | + -- 经验值 | |
| 272 | + return self.buffData.effectValue1 * self.layer | |
| 269 | 273 | end |
| 270 | 274 | end, |
| 271 | 275 | |
| 272 | - [Buff.EXP_ADD] = function(_Buff) | |
| 273 | - --cType 0 or nil 值 1 百分比 | |
| 274 | - _Buff._afterRound = function(self) | |
| 275 | - local value = self:effect() | |
| 276 | - self.owner.battle.player:addExp(value) | |
| 277 | - end | |
| 276 | + [Buff.DISABLE_BUFF] = function(_Buff) | |
| 278 | 277 | _Buff._effectValue = function(self) |
| 279 | 278 | return self.buffData.effectValue1 |
| 280 | 279 | end |
| 281 | 280 | end, |
| 282 | 281 | |
| 283 | - [Buff.EXP_UP] = function(_Buff) | |
| 284 | - --cType 0 or nil 值 1 百分比 | |
| 282 | + [Buff.SP_MAX_CHANGE] = function(_Buff) | |
| 283 | + _Buff._init = function(self, data) --初始化变化值 | |
| 284 | + self:_spChange() | |
| 285 | + end | |
| 286 | + _Buff._overlay = function(self) | |
| 287 | + self:_spChange() | |
| 288 | + end | |
| 289 | + | |
| 290 | + _Buff._uncover = function(self) | |
| 291 | + self.owner:reSetSpMax() | |
| 292 | + end | |
| 293 | + | |
| 294 | + _Buff._spChange = function(self) | |
| 295 | + local oldSpMax = self.owner.spMax | |
| 296 | + self.owner:reSetSpMax() | |
| 297 | + | |
| 298 | + local curValue = self.owner.spMax - oldSpMax | |
| 299 | + self.owner:changeSp(curValue) | |
| 300 | + end | |
| 301 | + | |
| 302 | + _Buff._endBuff = function(self) | |
| 303 | + self.owner:reSetSpMax() | |
| 304 | + end | |
| 305 | + | |
| 306 | + _Buff._effectValue = function(self) | |
| 307 | + return self.buffData.effectValue1, self.buffData.effectValue2 * self.layer | |
| 308 | + end | |
| 309 | + end | |
| 310 | + | |
| 311 | + [Buff.ITEM_GET_UP] = function(_Buff) | |
| 285 | 312 | _Buff._effectValue = function(self) |
| 286 | - return self.buffData.effectValue1, self.buffData.effectValue2 | |
| 313 | + -- 值/% 数量 id | |
| 314 | + return self.buffData.effectValue1, self.buffData.effectValue2 * self.layer, self.buffData.effectValue3 | |
| 287 | 315 | end |
| 288 | 316 | end, |
| 289 | - [Buff.DISABLE_BUFF] = function(_Buff) | |
| 317 | + | |
| 318 | + -- 影响到的buff类型 1=生命变化、2=生命上限、3=属性变化、6=伤害变化、7=受伤变化、15=回魔、16=生命变化 (胡博文) | |
| 319 | + [Buff.Buff_EFFECT_CHANGE] = function(_Buff) | |
| 320 | + _Buff._init = function(self) | |
| 321 | + -- 先给自己的buff 搞一下子 | |
| 322 | + for _, buff in ipairs(self.owner.buffs) do | |
| 323 | + if not buff.isDel and buff.classify == self.buffData.effectValue1 then | |
| 324 | + buff:effectChange() | |
| 325 | + end | |
| 326 | + end | |
| 327 | + end | |
| 290 | 328 | _Buff._effectValue = function(self) |
| 291 | - return self.buffData.effectValue1 | |
| 329 | + return self.buffData.effectValue1, self.buffData.effectValue2 * self.layer | |
| 330 | + end | |
| 331 | + _Buff._overlay = function(self) | |
| 332 | + self:_init() | |
| 333 | + end | |
| 334 | + _Buff._uncover = function(self) | |
| 335 | + self:_init() | |
| 292 | 336 | end |
| 293 | 337 | end, |
| 294 | 338 | } |
| 295 | 339 | |
| 340 | +-- 同样的返回 effectValue1, effectValue2 * self.layer 类型的buff | |
| 341 | +local function CommonFuncBackEffect12(_Buff) | |
| 342 | + _Buff._effectValue = function(self) | |
| 343 | + return self.buffData.effectValue1, self:doEffectChange(self.buffData.effectValue2) * self.layer | |
| 344 | + end | |
| 345 | +end | |
| 346 | + | |
| 347 | +BuffFactory[Buff.BACK_HURT] = CommonFuncBackEffect12 -- 值/% 数量 | |
| 348 | +BuffFactory[Buff.HURT_CHANGE] = CommonFuncBackEffect12 -- 值/% 数量 | |
| 349 | +BuffFactory[Buff.INJURED_CHANGE] = CommonFuncBackEffect12 -- 值/% 数量 | |
| 350 | +BuffFactory[Buff.HURT_TRANSFER] = CommonFuncBackEffect12 -- 值/% 数量 | |
| 351 | +BuffFactory[Buff.HURT_ABSORB] = CommonFuncBackEffect12 -- 值/% 数量 | |
| 352 | +BuffFactory[Buff.CHANGE_DROP] = CommonFuncBackEffect12 -- id 数量 | |
| 353 | +BuffFactory[Buff.EXP_UP] = CommonFuncBackEffect12 -- 值/% 数量 | |
| 354 | +-- 历史遗留问题 | |
| 355 | +BuffFactory[Buff.HP_CHANGE_NOW] = BuffFactory[Buff.HP_CHANGE] | |
| 356 | + | |
| 296 | 357 | function Buff:ctor(owner, id) |
| 297 | 358 | self.owner = owner |
| 298 | 359 | self.id = id |
| ... | ... | @@ -301,6 +362,7 @@ function Buff:ctor(owner, id) |
| 301 | 362 | self.roundSpace = 0 --生效间隔 |
| 302 | 363 | self.round = 0 --剩余的回合 |
| 303 | 364 | self.count = -1 -- 可生效的次数 -1 无次数限制 |
| 365 | + self.layer = 1 -- 当前buff 层数 | |
| 304 | 366 | |
| 305 | 367 | if BuffFactory[self.buffData.type] then |
| 306 | 368 | BuffFactory[self.buffData.type](self) |
| ... | ... | @@ -322,6 +384,8 @@ end |
| 322 | 384 | function Buff:initNew(release, data) |
| 323 | 385 | self.release = release or self.owner |
| 324 | 386 | self.round = self.buffData.round |
| 387 | + self.roundSpace = 0 --生效间隔 | |
| 388 | + self.layer = 1 | |
| 325 | 389 | if self.buffData.effectTime > 0 then |
| 326 | 390 | self.count = self.buffData.effectTime |
| 327 | 391 | end |
| ... | ... | @@ -339,11 +403,11 @@ function Buff:initByDB(data) |
| 339 | 403 | end |
| 340 | 404 | end |
| 341 | 405 | self.round = data.round |
| 342 | - self.roundSpace = data.roundSp -- 可以优化为0的时候不记录 | |
| 406 | + self.roundSpace = data.roundSp | |
| 343 | 407 | if data.count then |
| 344 | 408 | self.count = data.count |
| 345 | 409 | end |
| 346 | - | |
| 410 | + self.layer = data.layer or 1 | |
| 347 | 411 | if self._initDB then |
| 348 | 412 | self:_initDB(data) |
| 349 | 413 | end |
| ... | ... | @@ -352,6 +416,13 @@ end |
| 352 | 416 | |
| 353 | 417 | function Buff:afterRound() |
| 354 | 418 | if self.isDel or self.owner.isDead then return end |
| 419 | + | |
| 420 | + -- keepTerm 检查 | |
| 421 | + if not self:checkKeep() then | |
| 422 | + self.isDel = true | |
| 423 | + return | |
| 424 | + end | |
| 425 | + | |
| 355 | 426 | if self.roundSpace > 0 then |
| 356 | 427 | self.roundSpace = self.roundSpace - 1 |
| 357 | 428 | self:decRound() |
| ... | ... | @@ -366,6 +437,56 @@ function Buff:afterRound() |
| 366 | 437 | self:decRound() |
| 367 | 438 | end |
| 368 | 439 | |
| 440 | +-- 只使用owner 和 buffData | |
| 441 | +function Buff:checkKeep() | |
| 442 | + if self.buffData.keepTerm == "" then return true end | |
| 443 | + --[[ | |
| 444 | + 1=怪物id; | |
| 445 | + 2=建筑id; | |
| 446 | + 3=事件id | |
| 447 | + 4=队伍为特定属性时 | |
| 448 | + --]] | |
| 449 | + | |
| 450 | + local checkFunc = {} | |
| 451 | + checkFunc[1] = function(_, enemyId) | |
| 452 | + local enemys = self.owner.battle.player:getTeam(2) | |
| 453 | + for _, enemy in pairs(enemys) do | |
| 454 | + if enemy.monsterId == enemyId then | |
| 455 | + return true | |
| 456 | + end | |
| 457 | + end | |
| 458 | + return false | |
| 459 | + end | |
| 460 | + checkFunc[2] = function(_, buildId) | |
| 461 | + for roomId, room in pairs(self.owner.battle.adv:getCurMap().rooms) do | |
| 462 | + for blockId, block in pairs(room.blocks) do | |
| 463 | + if block.isOpen and block:getEventType() == AdvEventType.Build and block.event.id == buildId then | |
| 464 | + return true | |
| 465 | + end | |
| 466 | + end | |
| 467 | + end | |
| 468 | + return false | |
| 469 | + end | |
| 470 | + checkFunc[3] = function(_, chooseId) | |
| 471 | + for roomId, room in pairs(self.owner.battle.adv:getCurMap().rooms) do | |
| 472 | + for blockId, block in pairs(room.blocks) do | |
| 473 | + if block.isOpen and (block:getEventType() == AdvEventType.Choose or block:getEventType() == AdvEventType.LinkChoose) and block.event.id == chooseId then | |
| 474 | + return true | |
| 475 | + end | |
| 476 | + end | |
| 477 | + end | |
| 478 | + return false | |
| 479 | + end | |
| 480 | + checkFunc[4] = function(_, teamAttr) | |
| 481 | + local role = self.owner.battle.adv.owner | |
| 482 | + return role:getHerosCamp(role:getProperty("advTeam").heros) == teamAttr | |
| 483 | + end | |
| 484 | + | |
| 485 | + local keepTerm = self.buffData.keepTerm:toArray(true, "=") | |
| 486 | + if not checkFunc[keepTerm[1]] then return true end | |
| 487 | + return checkFunc[keepTerm[1]](table.unpack(keepTerm)) | |
| 488 | +end | |
| 489 | + | |
| 369 | 490 | function Buff:decRound() |
| 370 | 491 | if self.buffData.round <= 0 then |
| 371 | 492 | return |
| ... | ... | @@ -415,8 +536,69 @@ function Buff:decCount() |
| 415 | 536 | end |
| 416 | 537 | end |
| 417 | 538 | |
| 418 | -function Buff:getGroup() | |
| 419 | - return self.buffData.group | |
| 539 | +function Buff:getOverlay() | |
| 540 | + if self.buffData.overlay == "" then | |
| 541 | + return false | |
| 542 | + end | |
| 543 | + local otype, layer = table.unpack(self.buffData.overlay:toArray(true, "=")) | |
| 544 | + if otype == 1 then -- 叠加 | |
| 545 | + return true, layer or 0 -- 0 叠加无数层 | |
| 546 | + end | |
| 547 | + return false | |
| 548 | +end | |
| 549 | + | |
| 550 | +-- 叠加 | |
| 551 | +function Buff:overlay(releaser, data) | |
| 552 | + local otype, maxLayer = self:getOverlay() | |
| 553 | + if self.isDel or not otype then -- 新获得的 (不可叠加相当于新获得的) | |
| 554 | + self.isDel = false | |
| 555 | + self:endBuff() | |
| 556 | + self:initNew(releaser, data) | |
| 557 | + else | |
| 558 | + -- 重置回合 次数 | |
| 559 | + self.roundSpace = 0 | |
| 560 | + self.round = self.buffData.round | |
| 561 | + if self.buffData.effectTime > 0 then | |
| 562 | + self.count = self.buffData.effectTime | |
| 563 | + else | |
| 564 | + self.count = -1 | |
| 565 | + end | |
| 566 | + | |
| 567 | + self.release = releaser or self.release | |
| 568 | + -- 叠加层数 | |
| 569 | + self.layer = self.layer + 1 | |
| 570 | + if maxLayer ~= 0 then | |
| 571 | + self.layer = math.min(maxLayer, self.layer) | |
| 572 | + end | |
| 573 | + if self._overlay then | |
| 574 | + self:_overlay() | |
| 575 | + end | |
| 576 | + end | |
| 577 | +end | |
| 578 | + | |
| 579 | +-- 扣减层数 | |
| 580 | +function Buff:uncover() | |
| 581 | + if self.layer <= 1 then | |
| 582 | + self.isDel = true | |
| 583 | + end | |
| 584 | + | |
| 585 | + self.layer = self.layer - 1 | |
| 586 | + if self._uncover then | |
| 587 | + self:_uncover() | |
| 588 | + end | |
| 589 | +end | |
| 590 | + | |
| 591 | +-- buff 效果增益减益 | |
| 592 | +function Buff:effectChange() | |
| 593 | + if self._effectChange then | |
| 594 | + self:_effectChange() | |
| 595 | + end | |
| 596 | +end | |
| 597 | + | |
| 598 | +function Buff:doEffectChange(effect) | |
| 599 | + if not self.buffData.classify then return effect end | |
| 600 | + local change = self.owner:getBuffEffectChange(self.buffData.classify) | |
| 601 | + return effect * (1 + change) | |
| 420 | 602 | end |
| 421 | 603 | |
| 422 | 604 | function Buff:getDB() |
| ... | ... | @@ -435,6 +617,7 @@ function Buff:getDB() |
| 435 | 617 | if self.count ~= -1 then |
| 436 | 618 | db.count = self.count |
| 437 | 619 | end |
| 620 | + db.layer = self.layer | |
| 438 | 621 | return db |
| 439 | 622 | end |
| 440 | 623 | ... | ... |
src/adv/AdvPlayer.lua
| ... | ... | @@ -31,6 +31,7 @@ function BaseObject:initData(data) |
| 31 | 31 | self._miss = data._miss or self.miss |
| 32 | 32 | self._hit = data._hit or self.hit |
| 33 | 33 | self._def = data._def or self.def |
| 34 | + self._hpMax = data._hpMax or self.hpMax | |
| 34 | 35 | end |
| 35 | 36 | -- 角色初始化完以后才是 技能和被动技能 方便初始化 buff 的 释放对象 |
| 36 | 37 | function BaseObject:initAfter(data) |
| ... | ... | @@ -124,30 +125,51 @@ function BaseObject:addBuff(buffId, releaser) |
| 124 | 125 | if not buffData then return end |
| 125 | 126 | for _, buff in ipairs(self.buffs) do |
| 126 | 127 | if not buff.isDel and (buff:getType() == Buff.CLEAR_BUFF or buff:getType() == Buff.IMMNUE_BUFF) then |
| 127 | - if buff:canEffect(buffId, buffData.group) then | |
| 128 | + if buff:canEffect(buffId) then | |
| 128 | 129 | buff:effect() |
| 129 | 130 | return |
| 130 | 131 | end |
| 131 | 132 | end |
| 132 | 133 | end |
| 133 | - table.insert(self.buffs, Buff.create(self, releaser, {id = buffId})) | |
| 134 | - | |
| 134 | + local oldBuff = self:getBuffById(buffId) | |
| 135 | + if oldBuff then | |
| 136 | + if not oldBuff:checkKeep() then return end | |
| 137 | + oldBuff:overlay(releaser, {}) -- 叠加 | |
| 138 | + else | |
| 139 | + -- 不能保持的buff 也加不上去 | |
| 140 | + if not Buff.checkKeep({ | |
| 141 | + owner = self, | |
| 142 | + buffData = buffData, | |
| 143 | + }) then return end | |
| 144 | + table.insert(self.buffs, Buff.create(self, releaser, {id = buffId})) | |
| 145 | + end | |
| 135 | 146 | self.battle.adv:backBuff(self.id, buffId) |
| 136 | 147 | end |
| 137 | 148 | |
| 149 | +function BaseObject:getBuffById(bId) | |
| 150 | + for idx, buff in ipairs(self.buffs) do | |
| 151 | + if buff.id == bId then | |
| 152 | + return buff | |
| 153 | + end | |
| 154 | + end | |
| 155 | +end | |
| 156 | + | |
| 138 | 157 | function BaseObject:delBuffById(bId) |
| 139 | - for _, buff in ipairs(self.buffs) do | |
| 140 | - if not buff.isDel and buff.id == bId then | |
| 141 | - buff.isDel = true | |
| 158 | + for idx, buff in ipairs(self.buffs) do | |
| 159 | + if buff.id == bId then | |
| 160 | + self.battle.adv:backBuff(self.id, buff.id, true) | |
| 161 | + buff:endBuff() | |
| 162 | + table.remove(self.buffs, idx) | |
| 142 | 163 | return buff |
| 143 | 164 | end |
| 144 | 165 | end |
| 145 | 166 | end |
| 146 | 167 | |
| 147 | 168 | function BaseObject:delPassiveById(pId) |
| 148 | - for _, passive in ipairs(self.passives) do | |
| 149 | - if not passive.isDel and passive.id == pId then | |
| 150 | - passive.isDel = true | |
| 169 | + for idx, passive in ipairs(self.passives) do | |
| 170 | + if passive.id == pId then | |
| 171 | + passive:endPassive() | |
| 172 | + table.remove(self.passives, idx) | |
| 151 | 173 | return passive |
| 152 | 174 | end |
| 153 | 175 | end |
| ... | ... | @@ -171,12 +193,12 @@ end |
| 171 | 193 | |
| 172 | 194 | |
| 173 | 195 | -- 通用的buff 效果汇总 -- 0 固定 1百分比 两种分类 |
| 174 | -function BaseObject:getCommonBuffEffect(bType) | |
| 196 | +function BaseObject:getCommonBuffEffect(bType, otherCond) | |
| 175 | 197 | local effect, count = {[0] = 0, [1] = 0}, 0 |
| 176 | 198 | for _, buff in ipairs(self.buffs) do |
| 177 | 199 | if not buff.isDel and buff:getType() == bType then |
| 178 | - local cType, value = buff:effect() | |
| 179 | - if cType then | |
| 200 | + local cType, value, cond = buff:effect() | |
| 201 | + if cType and (not otherCond or otherCond == cond) then | |
| 180 | 202 | effect[cType] = effect[cType] + value |
| 181 | 203 | count = count + 1 |
| 182 | 204 | end |
| ... | ... | @@ -186,15 +208,13 @@ function BaseObject:getCommonBuffEffect(bType) |
| 186 | 208 | return effect, count --效果 和生效的buff 个数 |
| 187 | 209 | end |
| 188 | 210 | --伤害反弹 |
| 189 | -function BaseObject:getBackHurtBuff(isAtk) | |
| 211 | +function BaseObject:getBackHurtBuff() | |
| 190 | 212 | local effect = {[0] = 0, [1] = 0} |
| 191 | 213 | for _, buff in ipairs(self.buffs) do |
| 192 | 214 | if not buff.isDel and buff:getType() == Buff.BACK_HURT then |
| 193 | - local cType, value, aType = buff:effect() -- aType 0 全部 1 普通攻击 | |
| 215 | + local cType, value = buff:effect() -- aType 0 全部 1 普通攻击 | |
| 194 | 216 | if cType then |
| 195 | - if aType == 0 or isAtk then | |
| 196 | - effect[cType] = effect[cType] + value | |
| 197 | - end | |
| 217 | + effect[cType] = effect[cType] + value | |
| 198 | 218 | end |
| 199 | 219 | end |
| 200 | 220 | end |
| ... | ... | @@ -211,12 +231,50 @@ function BaseObject:getInjuredChange() |
| 211 | 231 | local change = self:getCommonBuffEffect(Buff.INJURED_CHANGE) |
| 212 | 232 | return change |
| 213 | 233 | end |
| 234 | +-- 奖励道具变化 | |
| 235 | +function BaseObject:getRewardChange(itemId) | |
| 236 | + local change = self:getCommonBuffEffect(Buff.ITEM_GET_UP, itemId) | |
| 237 | + return change | |
| 238 | +end | |
| 239 | + | |
| 240 | +-- buff 增益 检疫 | |
| 241 | +function BaseObject:getBuffEffectChange(classify) | |
| 242 | + local effect = 0 | |
| 243 | + for _, buff in ipairs(self.buffs) do | |
| 244 | + if not buff.isDel and buff:getType() == Buff_EFFECT_CHANGE then | |
| 245 | + local cType, value = buff:effect() | |
| 246 | + if cType and cType == classify then | |
| 247 | + effect = effect + value | |
| 248 | + end | |
| 249 | + end | |
| 250 | + end | |
| 251 | + effect = effect / 100 | |
| 252 | + return effect | |
| 253 | +end | |
| 254 | + | |
| 255 | +function BaseObject:getAttrBuffChange(attr) | |
| 256 | + local AttrBuff = { | |
| 257 | + [Buff.ATTR_CHANGE] = 1, | |
| 258 | + [Buff.ATTR_CHANGE_COND] = 1, | |
| 259 | + } | |
| 260 | + local effect, count = {[0] = 0, [1] = 0}, 0 | |
| 261 | + for _, buff in ipairs(self.buffs) do | |
| 262 | + if not buff.isDel and AttrBuff[buff:getType()] then | |
| 263 | + local cType, value, attrName = buff:effect() | |
| 264 | + if cType and attr == attrName then | |
| 265 | + effect[cType] = effect[cType] + value | |
| 266 | + count = count + 1 | |
| 267 | + end | |
| 268 | + end | |
| 269 | + end | |
| 270 | + effect[1] = effect[1] / 100 | |
| 271 | + return effect, count | |
| 272 | +end | |
| 214 | 273 | --重新计算属性 |
| 215 | 274 | function BaseObject:reSetAttr(field) |
| 216 | 275 | local old = self[field] |
| 217 | 276 | self[field] = self["_" .. field] --重置一下 |
| 218 | - local fieldToBuff = {atk = Buff.ATK_CHANGE, hit = Buff.HIT_CHANGE, miss = Buff.MISS_CHANGE, def = Buff.DEF_CHANGE} | |
| 219 | - local effect = self:getCommonBuffEffect(fieldToBuff[field]) | |
| 277 | + local effect = self:getAttrBuffChange(field) | |
| 220 | 278 | self[field] = math.ceil((self[field] + effect[0]) * (1 + effect[1])) |
| 221 | 279 | local delta = self[field] - old |
| 222 | 280 | if delta ~= 0 then |
| ... | ... | @@ -228,6 +286,21 @@ function BaseObject:reSetAttr(field) |
| 228 | 286 | end |
| 229 | 287 | end |
| 230 | 288 | |
| 289 | +-- 重新计算 血量上限 | |
| 290 | +function BaseObject:reSetHpMax() | |
| 291 | + self.hpMax = self._hpMax | |
| 292 | + for _, buff in ipairs(self.buffs) do | |
| 293 | + if not buff.isDel and buff:getType() == Buff.HP_MAX_CHANGE then | |
| 294 | + local cv = buff:effect() | |
| 295 | + if cv then | |
| 296 | + self.hpMax = self.hpMax + cv | |
| 297 | + end | |
| 298 | + end | |
| 299 | + end | |
| 300 | + self.hpMax = math.max(1, self.hpMax) | |
| 301 | + self.hp = math.min(self.hpMax, self.hp) | |
| 302 | +end | |
| 303 | + | |
| 231 | 304 | --计算打出伤害加成后的值 |
| 232 | 305 | function BaseObject:getHurtValue(value) |
| 233 | 306 | value = value or self.atk |
| ... | ... | @@ -306,7 +379,7 @@ function BaseObject:hurt(value, releaser, params) |
| 306 | 379 | if value == 0 then return end |
| 307 | 380 | -- 反弹伤害 |
| 308 | 381 | if params.hurtType ~= 3 and params.hurtType ~= 5 and releaser and not releaser.isDead then |
| 309 | - local backEffect = self:getBackHurtBuff(params.hurtType == 1) | |
| 382 | + local backEffect = self:getBackHurtBuff() | |
| 310 | 383 | local backValue = math.max(0, value * backEffect[1] + backEffect[0]) |
| 311 | 384 | releaser:hurt(backValue, releaser, {hurtType = 3}) |
| 312 | 385 | end |
| ... | ... | @@ -408,9 +481,8 @@ end |
| 408 | 481 | |
| 409 | 482 | function BaseObject:getDB() |
| 410 | 483 | local db = {} |
| 411 | - db.hpMax = self.hpMax | |
| 412 | 484 | db.hp = self.hp |
| 413 | - local baseAttr = {"atk", "miss", "hit", "def"} | |
| 485 | + local baseAttr = {"atk", "miss", "hit", "def", "hpMax"} | |
| 414 | 486 | for _, field in pairs(baseAttr) do |
| 415 | 487 | db[field] = self[field] |
| 416 | 488 | db["_"..field] = self["_" .. field] |
| ... | ... | @@ -465,9 +537,11 @@ end |
| 465 | 537 | function Player:initData(data) |
| 466 | 538 | Player.super.initData(self, data) |
| 467 | 539 | self.level = data.level or 1 --level 每增加1级 属性增长 growth * baseAttr |
| 468 | - self.growth = data.growth or 0 | |
| 540 | + self.growth = data.growth | |
| 469 | 541 | self.exp = data.exp or 0 |
| 470 | 542 | self.sp = data.sp or 100 |
| 543 | + self.spMax = data.spMax or 100 | |
| 544 | + self._spMax = data._spMax or 100 | |
| 471 | 545 | end |
| 472 | 546 | |
| 473 | 547 | function Player:addExp(value) |
| ... | ... | @@ -488,15 +562,14 @@ function Player:addExp(value) |
| 488 | 562 | end |
| 489 | 563 | local delta = level - self.level |
| 490 | 564 | if delta > 0 then |
| 491 | - local baseAttr = csvdb["adv_unitCsv"][self.battle.adv.chapterId] | |
| 492 | - for _, attr in pairs(AttsEnumEx) do | |
| 493 | - if baseAttr[attr] then | |
| 494 | - self[attr] = self[attr] + self.growth * delta | |
| 495 | - if attr == "hp" then | |
| 496 | - self.hpMax = self.hpMax + self.growth * delta | |
| 497 | - else | |
| 498 | - self["_" .. attr] = self["_" .. attr] + self.growth * delta | |
| 499 | - end | |
| 565 | + for _, attr in pairs(AdvAttsEnum) do | |
| 566 | + if attr == "hp" then | |
| 567 | + self[attr] = self[attr] + self.growth[attr] * delta | |
| 568 | + self._hpMax = self._hpMax + self.growth[attr] * delta | |
| 569 | + self:reSetHpMax() | |
| 570 | + else | |
| 571 | + self["_" .. attr] = self["_" .. attr] + self.growth[attr] * delta | |
| 572 | + self:reSetAttr(attr) | |
| 500 | 573 | end |
| 501 | 574 | end |
| 502 | 575 | end |
| ... | ... | @@ -512,10 +585,19 @@ function Player:changeSp(value, cType) |
| 512 | 585 | elseif cType == 1 then |
| 513 | 586 | self.sp = self.sp + self.sp * value / 100 |
| 514 | 587 | end |
| 515 | - self.sp = math.floor(math.max(0, self.sp)) | |
| 588 | + self.sp = math.floor(math.min(self.spMax, math.max(0, self.sp))) | |
| 516 | 589 | self.battle.adv:pushBackEvent(AdvBackEventType.SpChange) |
| 517 | 590 | end |
| 518 | 591 | |
| 592 | +-- 重新计算 魔法上限 | |
| 593 | +function BaseObject:reSetSpMax() | |
| 594 | + self.spMax = self._spMax | |
| 595 | + local change = self:getCommonBuffEffect(Buff.SP_MAX_CHANGE) | |
| 596 | + self.spMax = math.ceil((self.spMax + change[0]) * (1 + change[1])) | |
| 597 | + self.spMax = math.max(1, self.spMax) | |
| 598 | + self.sp = math.min(self.spMax, self.sp) | |
| 599 | +end | |
| 600 | + | |
| 519 | 601 | --战斗结束了扣战斗buff次数 |
| 520 | 602 | function Player:effectBattleBuff() |
| 521 | 603 | for _, buff in ipairs(self.buffs) do |
| ... | ... | @@ -535,9 +617,10 @@ end |
| 535 | 617 | |
| 536 | 618 | function Player:getDB() |
| 537 | 619 | local db = Player.super.getDB(self) |
| 538 | - for _ , field in pairs({"level", "exp", "growth", "sp"}) do | |
| 620 | + for _ , field in pairs({"level", "exp", "growth", "sp", "spMax"}) do | |
| 539 | 621 | db[field] = self[field] |
| 540 | 622 | end |
| 623 | + db["_spMax"] = self._spMax | |
| 541 | 624 | return db |
| 542 | 625 | end |
| 543 | 626 | ... | ... |
src/adv/AdvTask.lua
| ... | ... | @@ -260,8 +260,7 @@ function AdvTask.bind(Adv) |
| 260 | 260 | if status == -1 or count < achievData.pt then return end |
| 261 | 261 | |
| 262 | 262 | local reward = self.owner:award(achievData.reward) |
| 263 | - self.owner:changeUpdates({{type = "advAchiev", field = {chapterId, "pts", taskId}, value = -1}}, notNotify) | |
| 264 | - | |
| 263 | + insertChange(chapterId, taskId, -1) | |
| 265 | 264 | return true, reward |
| 266 | 265 | end |
| 267 | 266 | ... | ... |
src/models/Role.lua
| ... | ... | @@ -65,7 +65,9 @@ Role.schema = { |
| 65 | 65 | advL = {"table", {0, 0}}, -- 冒险队等级 {lv, winCount} |
| 66 | 66 | advElM = {"number", 0}, -- 无尽模式通关的最高层数 endless max layer |
| 67 | 67 | advElS = {"number", globalCsv.adv_endless_season}, -- 无尽模式记录的赛季 endless season |
| 68 | - advAFOpen = {"table", {}}, -- 解锁的神器 | |
| 68 | + advAFOpen = {"table", {}}, -- 解锁的神器 {[id] = 1} | |
| 69 | + advAFGet = {"table", {}}, -- 当前拥有的神器 {[id] = 等级} | |
| 70 | + advAFWear = {"table", {}}, -- 当前拥有的神器 {[slot] = id} | |
| 69 | 71 | |
| 70 | 72 | --挂机相关 |
| 71 | 73 | hangPass = {"table", {}}, -- 挂机通过的最大关卡 |
| ... | ... | @@ -244,6 +246,8 @@ function Role:data() |
| 244 | 246 | advAchiev = self:getProperty("advAchiev"), |
| 245 | 247 | advL = self:getProperty("advL"), |
| 246 | 248 | advElM = self:getProperty("advElM"), |
| 249 | + advAFGet = self:getProperty("advAFGet"), | |
| 250 | + advAFWear = self:getProperty("advAFWear"), | |
| 247 | 251 | |
| 248 | 252 | hangPass = self:getProperty("hangPass"), |
| 249 | 253 | hangTeam = self:getProperty("hangTeam"), | ... | ... |
src/models/RolePlugin.lua
| ... | ... | @@ -641,6 +641,25 @@ function RolePlugin.bind(Role) |
| 641 | 641 | return result |
| 642 | 642 | end |
| 643 | 643 | |
| 644 | + function Role:getHerosCamp(heros) | |
| 645 | + local had = {} | |
| 646 | + for _, id in pairs(heros or {}) do | |
| 647 | + local hero = self.heros[id] | |
| 648 | + if hero then | |
| 649 | + local camp = csvdb["unitCsv"][hero:getProperty("type")].camp | |
| 650 | + had[camp] = (had[camp] or 0) + 1 | |
| 651 | + end | |
| 652 | + end | |
| 653 | + local curCamp = 0 | |
| 654 | + for camp , count in pairs(had) do | |
| 655 | + if count >= 3 then | |
| 656 | + curCamp = camp | |
| 657 | + break | |
| 658 | + end | |
| 659 | + end | |
| 660 | + return curCamp | |
| 661 | + end | |
| 662 | + | |
| 644 | 663 | function Role:getRealBattleValue(heros, activeRelation) -- 获取队伍战斗力 羁绊加成 |
| 645 | 664 | heros = heros or {} |
| 646 | 665 | local activeRelation = activeRelation or self:getHeroActiveRelation(heros) |
| ... | ... | @@ -673,6 +692,23 @@ function RolePlugin.bind(Role) |
| 673 | 692 | return self:getProperty("funcLv")[func] or 1 |
| 674 | 693 | end |
| 675 | 694 | |
| 695 | + -- 参数有level 则是检查是否可以升级 | |
| 696 | + function Role:isArtifactOpen(id, isEndless, level) | |
| 697 | + local isCheckLevel = not not level | |
| 698 | + level = level or 1 | |
| 699 | + local curData = (csvdb["adv_artifactCsv"][id] or {})[level] | |
| 700 | + if not curData then return false end | |
| 701 | + | |
| 702 | + if curData.unlock == 1 then -- 获得解锁 | |
| 703 | + return self:getProperty("advAFOpen")[id] and true or false | |
| 704 | + elseif temp[1].unlock == 2 then -- 特殊神器 不可解锁 | |
| 705 | + return isCheckLevel | |
| 706 | + elseif temp[1].unlock == 3 then | |
| 707 | + return isEndless | |
| 708 | + end | |
| 709 | + return true | |
| 710 | + end | |
| 711 | + | |
| 676 | 712 | function Role:funcOpen(func, count) |
| 677 | 713 | count = count or 1 |
| 678 | 714 | if csvdb["itemCsv"][func] and csvdb["itemCsv"][func].type == ItemType.FuncOpen then | ... | ... |