Commit a80fee7cca90aa07aa063f7fc79a3a81c152d9b5
1 parent
505479c7
光环
Showing
4 changed files
with
255 additions
and
31 deletions
Show diff stats
src/adv/Adv.lua
| ... | ... | @@ -102,6 +102,9 @@ function Adv:initByChapter(params) |
| 102 | 102 | self.cacheUnlock = self.cacheUnlock or {} |
| 103 | 103 | self.shopStatus = self.shopStatus or {} |
| 104 | 104 | self.support = self.support or {} |
| 105 | + if self.battle then | |
| 106 | + self.battle:overBattle() | |
| 107 | + end | |
| 105 | 108 | self.battle = nil -- 清掉 老的 battle |
| 106 | 109 | self.logid = self.owner:getActionUcode() |
| 107 | 110 | |
| ... | ... | @@ -211,7 +214,7 @@ function Adv:saveDB(notNotify) |
| 211 | 214 | advInfo.logid = self.logid |
| 212 | 215 | advInfo.maps = {} |
| 213 | 216 | |
| 214 | - self.battle:saveDB() | |
| 217 | + self.battle:saveDB(advInfo) | |
| 215 | 218 | |
| 216 | 219 | for id , map in ipairs(self.maps) do |
| 217 | 220 | advInfo.maps[id] = map:getDB() |
| ... | ... | @@ -468,6 +471,11 @@ function Adv:initBattle(notDb) |
| 468 | 471 | if notDb and self.level ~= 1 then |
| 469 | 472 | self.battle.player:attrChangeCondBuffCheck(1) |
| 470 | 473 | end |
| 474 | + | |
| 475 | + -- 初始化 | |
| 476 | + if notDb then | |
| 477 | + self.battle:newBattle() | |
| 478 | + end | |
| 471 | 479 | end |
| 472 | 480 | |
| 473 | 481 | function Adv:triggerPassive(condType, params) |
| ... | ... | @@ -1084,7 +1092,9 @@ local function clickOut(self, room, block, params, isExit) |
| 1084 | 1092 | end |
| 1085 | 1093 | |
| 1086 | 1094 | if #self.mapStack > 1 then -- 处于夹层中 |
| 1095 | + local oldMapIdx = self:getCurMapIdx() | |
| 1087 | 1096 | table.remove(self.mapStack) --退出夹层 |
| 1097 | + self.battle:iLayerChange(oldMapIdx) | |
| 1088 | 1098 | self:backLayer(-1) |
| 1089 | 1099 | else --处于底层 |
| 1090 | 1100 | |
| ... | ... | @@ -1119,7 +1129,6 @@ local function clickOut(self, room, block, params, isExit) |
| 1119 | 1129 | end |
| 1120 | 1130 | local isHaveRelay = self:isHaveRelay(self.level) |
| 1121 | 1131 | |
| 1122 | - self.owner:getProperty("advTeam").player = self.battle.player:getDB() -- 临时缓存住 battle 的player | |
| 1123 | 1132 | if isHaveRelay and not self.isRelay then |
| 1124 | 1133 | self:initByChapter({ |
| 1125 | 1134 | chapterId = self.chapterId, |
| ... | ... | @@ -1562,6 +1571,7 @@ local function clickClick(self, room, block, params) |
| 1562 | 1571 | end |
| 1563 | 1572 | |
| 1564 | 1573 | local function clickLayer(self, room, block, params) |
| 1574 | + local oldMapIdx = self:getCurMapIdx() | |
| 1565 | 1575 | if block.event.mapIdx then |
| 1566 | 1576 | table.insert(self.mapStack, block.event.mapIdx) --进入夹层 |
| 1567 | 1577 | else |
| ... | ... | @@ -1577,6 +1587,7 @@ local function clickLayer(self, room, block, params) |
| 1577 | 1587 | self.maps[mapIdx]:initBattleAfter() |
| 1578 | 1588 | self:checkAchievement(Adv.AchievType.EnterILayer, 1, mapId) |
| 1579 | 1589 | end |
| 1590 | + self.battle:iLayerChange(oldMapIdx) | |
| 1580 | 1591 | self:backLayer(1) |
| 1581 | 1592 | return true |
| 1582 | 1593 | end |
| ... | ... | @@ -2101,21 +2112,11 @@ function Adv:scoreChange(scoreType, score) |
| 2101 | 2112 | end |
| 2102 | 2113 | |
| 2103 | 2114 | function Adv:getScore() |
| 2104 | - self.score[AdvScoreType.Level] = math.floor(self.score[AdvScoreType.Level] or 0) | |
| 2105 | - self.score[AdvScoreType.Task] = math.floor(self.score[AdvScoreType.Task] or 0) | |
| 2106 | - self.score[AdvScoreType.Kill] = math.floor(self.score[AdvScoreType.Kill] or 0) | |
| 2107 | - self.score[AdvScoreType.KillBoss] = math.floor(self.score[AdvScoreType.KillBoss] or 0) | |
| 2108 | - self.score[AdvScoreType.ItemBack] = math.floor(self.score[AdvScoreType.ItemBack] or 0) | |
| 2109 | - self.score[AdvScoreType.Event] = math.floor(self.score[AdvScoreType.Event] or 0) | |
| 2110 | - self.score[AdvScoreType.Story] = math.floor(self.score[AdvScoreType.Story] or 0) | |
| 2111 | - | |
| 2112 | - return self.score[AdvScoreType.Level] | |
| 2113 | - + self.score[AdvScoreType.Task] | |
| 2114 | - + self.score[AdvScoreType.Kill] | |
| 2115 | - + self.score[AdvScoreType.KillBoss] | |
| 2116 | - + self.score[AdvScoreType.ItemBack] | |
| 2117 | - + self.score[AdvScoreType.Event] | |
| 2118 | - + self.score[AdvScoreType.Story] | |
| 2115 | + local allScore = 0 | |
| 2116 | + for _, score in pairs(self.score) do | |
| 2117 | + allScore = allScore + math.floor(score) | |
| 2118 | + end | |
| 2119 | + return allScore | |
| 2119 | 2120 | end |
| 2120 | 2121 | |
| 2121 | 2122 | function Adv:popBackEvents() | ... | ... |
src/adv/AdvBattle.lua
| ... | ... | @@ -8,6 +8,7 @@ function Battle:ctor(adv) |
| 8 | 8 | self.isNewPlayer = false |
| 9 | 9 | self.enemys = {} --怪 |
| 10 | 10 | self.builds = {} -- 建筑 |
| 11 | + self.auras = {} -- 光环 | |
| 11 | 12 | self.cachePassiveEvent = {} |
| 12 | 13 | self:initPlayer() |
| 13 | 14 | self:initEnemys() |
| ... | ... | @@ -198,8 +199,10 @@ function Battle:addEnemy(room, block, mapIdx, init) |
| 198 | 199 | end |
| 199 | 200 | |
| 200 | 201 | for _, buff in ipairs(buffs) do |
| 201 | - enemy:addBuff(buff) | |
| 202 | + player:addBuff(buff) | |
| 202 | 203 | end |
| 204 | + -- 新生成的怪 加上 已有的光环buff | |
| 205 | + player:checkAuraBuff(self:checkDiffAuraBuff({}, self:getAurasByMap())) | |
| 203 | 206 | end |
| 204 | 207 | end |
| 205 | 208 | return player |
| ... | ... | @@ -347,6 +350,8 @@ function Battle:afterRound() |
| 347 | 350 | |
| 348 | 351 | self.player:triggerPassive(Passive.AFTER_ROUND) |
| 349 | 352 | |
| 353 | + self:checkAura() | |
| 354 | + | |
| 350 | 355 | if self.player.isDead then |
| 351 | 356 | self.adv:over(false, nil, -2) |
| 352 | 357 | end |
| ... | ... | @@ -435,8 +440,116 @@ function Battle:initMapEffect(ilayer) |
| 435 | 440 | end |
| 436 | 441 | |
| 437 | 442 | |
| 443 | +-- 夹层 进入退出 接口 清理玩家身上的老光环 添加新的光环 | |
| 444 | +function Battle:iLayerChange(oldMapIdx) | |
| 445 | + local auras = self:getActiveAuras() | |
| 446 | + local playerBuffs = self:checkDiffAuraBuff(self:getAurasByMap(oldMapIdx), auras) | |
| 447 | + local enemyBuffs = self:checkDiffAuraBuff(self:getAurasByMap(), auras) | |
| 448 | + self.player:checkAuraBuff(playerBuffs) | |
| 449 | + for _, enemy in pairs(self.player:getTeam(2)) do | |
| 450 | + enemy:checkAuraBuff(enemyBuffs) | |
| 451 | + end | |
| 452 | + self:setMapAuras(auras) | |
| 453 | +end | |
| 454 | + | |
| 455 | +-- 新的 关卡 关闭旧的战斗模块 清理 玩家身上的光环效果 | |
| 456 | +function Battle:overBattle() | |
| 457 | + local buffs = self:checkDiffAuraBuff(self:getAurasByMap(), {}) | |
| 458 | + self.player:checkAuraBuff(buffs) | |
| 459 | + self.adv.owner:getProperty("advTeam").player = self.player:getDB() -- 临时缓存住 battle 的player | |
| 460 | +end | |
| 461 | + | |
| 462 | +-- 初始化 新的 关卡 | |
| 463 | +function Battle:newBattle() | |
| 464 | + local auras = self:getActiveAuras() | |
| 465 | + local buffs = self:checkDiffAuraBuff({}, auras) | |
| 466 | + self:setMapAuras(auras) | |
| 467 | +end | |
| 468 | + | |
| 469 | +-- 过了回合 检查光环 | |
| 470 | +function Battle:checkAura() | |
| 471 | + local auras = self:getActiveAuras() | |
| 472 | + local buffs = self:checkDiffAuraBuff(self:getAurasByMap(), auras) | |
| 473 | + self.player:checkAuraBuff(buffs) | |
| 474 | + for _, enemy in pairs(self.player:getTeam(2)) do | |
| 475 | + enemy:checkAuraBuff(buffs) | |
| 476 | + end | |
| 477 | + self:setMapAuras(auras) | |
| 478 | +end | |
| 479 | + | |
| 480 | +-- 查找差异buff | |
| 481 | +function Battle:checkDiffAuraBuff(oldAuras, newAuras) | |
| 482 | + local auras = {} | |
| 483 | + for aurasId , count in pairs(oldAuras) do | |
| 484 | + auras[aurasId] = -count | |
| 485 | + end | |
| 486 | + for aurasId , count in pairs(newAuras) do | |
| 487 | + auras[aurasId] = (auras[aurasId] or 0) + count | |
| 488 | + end | |
| 489 | + | |
| 490 | + local buffs = {} | |
| 491 | + for aurasId , count in pairs(auras) do | |
| 492 | + local auraData = csvdb["adv_map_haloCsv"][aurasId] | |
| 493 | + if auraData then | |
| 494 | + for _, effect in ipairs(auraData.effect:toTableArray(true)) do | |
| 495 | + temp = buffs | |
| 496 | + for i = 1, #effect do | |
| 497 | + temp[effect[i]] = temp[effect[i]] or {} | |
| 498 | + temp = temp[effect[i]] | |
| 499 | + end | |
| 500 | + temp.count = (temp.count or 0) + count | |
| 501 | + if newAuras[aurasId] then | |
| 502 | + -- 加上 未消失标记 | |
| 503 | + temp.exist = true | |
| 504 | + end | |
| 505 | + end | |
| 506 | + end | |
| 507 | + end | |
| 508 | + return buffs | |
| 509 | +end | |
| 510 | + | |
| 511 | +-- 获取所有生效的 光环 | |
| 512 | +function Battle:getActiveAuras() | |
| 513 | + local auras = {} | |
| 514 | + for _, one in pairs(self.player:getAuras()) do | |
| 515 | + auras[one] = (auras[one] or 0) + 1 | |
| 516 | + end | |
| 517 | + for _, enemy in pairs(self.player:getTeam(2)) do | |
| 518 | + for _, one in pairs(enemy:getAuras()) do | |
| 519 | + auras[one] = (auras[one] or 0) + 1 | |
| 520 | + end | |
| 521 | + end | |
| 522 | + for _, build in pairs(self:getBuilds()) do | |
| 523 | + for _, one in pairs(build:getAuras()) do | |
| 524 | + auras[one] = (auras[one] or 0) + 1 | |
| 525 | + end | |
| 526 | + end | |
| 527 | + return auras | |
| 528 | +end | |
| 529 | + | |
| 530 | +function Battle:setMapAuras(auras) | |
| 531 | + self.auras[self.adv:getCurMapIdx()] = auras | |
| 532 | +end | |
| 533 | + | |
| 534 | +function Battle:getAurasByMap(mapIdx) | |
| 535 | + mapIdx = mapIdx or self.adv:getCurMapIdx() | |
| 536 | + local auras = self.auras[mapIdx] or {} | |
| 537 | + return auras | |
| 538 | +end | |
| 539 | + | |
| 540 | +function Battle:getBuilds() | |
| 541 | + local team = {} | |
| 542 | + for _, build in pairs(self.builds[self.adv:getCurMapIdx()]) do | |
| 543 | + if not build.isDead and not build.lock then -- 已经翻开的 | |
| 544 | + table.insert(team, build) | |
| 545 | + end | |
| 546 | + end | |
| 547 | + return team | |
| 548 | +end | |
| 549 | + | |
| 550 | + | |
| 438 | 551 | --写入数据 |
| 439 | -function Battle:saveDB() | |
| 552 | +function Battle:saveDB(advInfo) | |
| 440 | 553 | for idx, mapEnemys in pairs(self.enemys) do |
| 441 | 554 | for _, enemy in ipairs(mapEnemys) do |
| 442 | 555 | local block = self.adv:getBlock(enemy.roomId, enemy.blockId, idx) |
| ... | ... | @@ -453,6 +566,7 @@ function Battle:saveDB() |
| 453 | 566 | end |
| 454 | 567 | end |
| 455 | 568 | end |
| 569 | + advInfo.auras = self.auras | |
| 456 | 570 | end |
| 457 | 571 | |
| 458 | 572 | return Battle |
| 459 | 573 | \ No newline at end of file | ... | ... |
src/adv/AdvBuff.lua
| ... | ... | @@ -460,7 +460,18 @@ function Buff:initNew(release, data) |
| 460 | 460 | end |
| 461 | 461 | end |
| 462 | 462 | |
| 463 | -function Buff:createAfter() | |
| 463 | +function Buff:createAfter(layer) | |
| 464 | + layer = layer or 1 | |
| 465 | + local otype, maxLayer = self:getOverlay() | |
| 466 | + if otype then | |
| 467 | + self.layer = layer | |
| 468 | + if maxLayer ~= 0 then | |
| 469 | + self.layer = math.min(maxLayer, self.layer) | |
| 470 | + end | |
| 471 | + else | |
| 472 | + self.layer = 1 | |
| 473 | + end | |
| 474 | + | |
| 464 | 475 | if self._init then |
| 465 | 476 | self:_init() |
| 466 | 477 | end |
| ... | ... | @@ -647,12 +658,13 @@ function Buff:getOverlay() |
| 647 | 658 | end |
| 648 | 659 | |
| 649 | 660 | -- 叠加 |
| 650 | -function Buff:overlay(releaser, data) | |
| 661 | +function Buff:overlay(releaser, data, layer) | |
| 651 | 662 | local otype, maxLayer = self:getOverlay() |
| 652 | 663 | if self.isDel or not otype then -- 新获得的 (不可叠加相当于新获得的) |
| 653 | - self.isDel = false | |
| 654 | 664 | self:endBuff() |
| 665 | + self.isDel = false | |
| 655 | 666 | self:initNew(releaser, data) |
| 667 | + self:createAfter(layer) | |
| 656 | 668 | else |
| 657 | 669 | -- 重置回合 次数 |
| 658 | 670 | self.roundSpace = 0 |
| ... | ... | @@ -665,7 +677,7 @@ function Buff:overlay(releaser, data) |
| 665 | 677 | |
| 666 | 678 | self.release = releaser or self.release |
| 667 | 679 | -- 叠加层数 |
| 668 | - self.layer = self.layer + 1 | |
| 680 | + self.layer = self.layer + layer | |
| 669 | 681 | if maxLayer ~= 0 then |
| 670 | 682 | self.layer = math.min(maxLayer, self.layer) |
| 671 | 683 | end |
| ... | ... | @@ -676,14 +688,32 @@ function Buff:overlay(releaser, data) |
| 676 | 688 | end |
| 677 | 689 | |
| 678 | 690 | -- 扣减层数 |
| 679 | -function Buff:uncover() | |
| 680 | - if self.layer <= 1 then | |
| 691 | +function Buff:uncover(layer, isAura) | |
| 692 | + layer = layer or 1 | |
| 693 | + local oldLayer = self.layer | |
| 694 | + | |
| 695 | + self.layer = self.layer - layer | |
| 696 | + | |
| 697 | + if self.layer <= 0 then | |
| 681 | 698 | self.isDel = true |
| 682 | 699 | end |
| 683 | 700 | |
| 684 | - self.layer = self.layer - 1 | |
| 685 | - if self._uncover then | |
| 686 | - self:_uncover() | |
| 701 | + if isAura then | |
| 702 | + if layer == -1 then | |
| 703 | + self.layer = 0 | |
| 704 | + self.isDel = true | |
| 705 | + else | |
| 706 | + self.layer = math.max(1, self.layer) | |
| 707 | + self.isDel = false | |
| 708 | + end | |
| 709 | + end | |
| 710 | + | |
| 711 | + if self.isDel then return end | |
| 712 | + | |
| 713 | + if oldLayer ~= self.layer then | |
| 714 | + if self._uncover then | |
| 715 | + self:_uncover() | |
| 716 | + end | |
| 687 | 717 | end |
| 688 | 718 | end |
| 689 | 719 | ... | ... |
src/adv/AdvPlayer.lua
| ... | ... | @@ -143,7 +143,8 @@ function BaseObject:getDisablePassiveCount() |
| 143 | 143 | return count |
| 144 | 144 | end |
| 145 | 145 | |
| 146 | -function BaseObject:addBuff(buffId, releaser) | |
| 146 | +function BaseObject:addBuff(buffId, releaser, layer) | |
| 147 | + layer = layer or 1 | |
| 147 | 148 | local buffData = csvdb["adv_map_buffCsv"][buffId] |
| 148 | 149 | if not buffData then return end |
| 149 | 150 | for _, buff in ipairs(self.buffs) do |
| ... | ... | @@ -157,7 +158,7 @@ function BaseObject:addBuff(buffId, releaser) |
| 157 | 158 | local oldBuff = self:getBuffById(buffId) |
| 158 | 159 | if oldBuff then |
| 159 | 160 | if not oldBuff:checkKeep() then return end |
| 160 | - oldBuff:overlay(releaser, {}) -- 叠加 | |
| 161 | + oldBuff:overlay(releaser, {}, layer) -- 叠加 | |
| 161 | 162 | else |
| 162 | 163 | -- 不能保持的buff 也加不上去 |
| 163 | 164 | if not Buff.checkKeep({ |
| ... | ... | @@ -167,7 +168,7 @@ function BaseObject:addBuff(buffId, releaser) |
| 167 | 168 | }) then return end |
| 168 | 169 | local buff = Buff.create(self, releaser, {id = buffId}) |
| 169 | 170 | table.insert(self.buffs, buff) |
| 170 | - buff:createAfter() | |
| 171 | + buff:createAfter(layer) | |
| 171 | 172 | end |
| 172 | 173 | self:triggerPassive(Passive.GET_BUFF, {trigger = releaser, buffId = buffId}) |
| 173 | 174 | self:triggerPassive(Passive.PLAYER_BUFF_CLASSIFY, {trigger = releaser, classify = buffData.classify}) |
| ... | ... | @@ -224,6 +225,30 @@ end |
| 224 | 225 | function BaseObject:reSetSpMax() |
| 225 | 226 | end |
| 226 | 227 | |
| 228 | +function BaseObject:checkAuraBuff(buffs) | |
| 229 | +end | |
| 230 | + | |
| 231 | +function BaseObject:getAuras() | |
| 232 | + local auras = {} | |
| 233 | + if self:is("Enemy") then | |
| 234 | + local halo = csvdb["event_monsterCsv"][self.monsterId].halo | |
| 235 | + if halo then | |
| 236 | + for _, one in ipairs(halo:toArray(true, "=")) do | |
| 237 | + table.insert(auras, one) | |
| 238 | + end | |
| 239 | + end | |
| 240 | + elseif self:is("Build") then | |
| 241 | + local halo = csvdb["event_buildingCsv"][self.id].halo | |
| 242 | + if halo then | |
| 243 | + for _, one in ipairs(halo:toArray(true, "=")) do | |
| 244 | + table.insert(auras, one) | |
| 245 | + end | |
| 246 | + end | |
| 247 | + end | |
| 248 | + | |
| 249 | + return auras | |
| 250 | +end | |
| 251 | + | |
| 227 | 252 | |
| 228 | 253 | -- 通用的buff 效果汇总 -- 0 固定 1百分比 两种分类 |
| 229 | 254 | function BaseObject:getCommonBuffEffect(bType, otherCond) |
| ... | ... | @@ -625,6 +650,33 @@ function Enemy:getClassify() |
| 625 | 650 | return csvdb["event_monsterCsv"][self.monsterId].classify |
| 626 | 651 | end |
| 627 | 652 | |
| 653 | +-- 0=所有 1=怪物 2=玩家 | |
| 654 | +function Enemy:checkAuraBuff(buffs) | |
| 655 | + local needBuffs = {} | |
| 656 | + | |
| 657 | + for buffId, info in pairs(buffs[0] or {}) do | |
| 658 | + needBuffs[buffId] = needBuffs[buffId] or {} | |
| 659 | + needBuffs[buffId].count = (needBuffs[buffId].count or 0) + info.count | |
| 660 | + needBuffs[buffId].exist = info.exist | |
| 661 | + end | |
| 662 | + | |
| 663 | + for buffId, info in pairs(buffs[1] or {}) do | |
| 664 | + needBuffs[buffId] = needBuffs[buffId] or {} | |
| 665 | + needBuffs[buffId].count = (needBuffs[buffId].count or 0) + info.count | |
| 666 | + needBuffs[buffId].exist = info.exist | |
| 667 | + end | |
| 668 | + | |
| 669 | + for buffId, info in pairs(needBuffs) do | |
| 670 | + if info.count < 0 then | |
| 671 | + local buff = self:getBuffById(buffId) | |
| 672 | + if buff then | |
| 673 | + buff:uncover(info.exist and -info.count or -1, true) | |
| 674 | + end | |
| 675 | + elseif count > 0 then | |
| 676 | + self:addBuff(buffId, nil, info.count) | |
| 677 | + end | |
| 678 | + end | |
| 679 | +end | |
| 628 | 680 | |
| 629 | 681 | function Enemy:kill() |
| 630 | 682 | self:hurt(self.hp, self.battle.player, {hurtType = 5}) |
| ... | ... | @@ -775,6 +827,33 @@ function Player:addBuff(buffId, releaser) |
| 775 | 827 | end |
| 776 | 828 | return status |
| 777 | 829 | end |
| 830 | +-- 0=所有 1=怪物 2=玩家 | |
| 831 | +function Player:checkAuraBuff(buffs) | |
| 832 | + local needBuffs = {} | |
| 833 | + | |
| 834 | + for buffId, info in pairs(buffs[0] or {}) do | |
| 835 | + needBuffs[buffId] = needBuffs[buffId] or {} | |
| 836 | + needBuffs[buffId].count = (needBuffs[buffId].count or 0) + info.count | |
| 837 | + needBuffs[buffId].exist = info.exist | |
| 838 | + end | |
| 839 | + | |
| 840 | + for buffId, info in pairs(buffs[2] or {}) do | |
| 841 | + needBuffs[buffId] = needBuffs[buffId] or {} | |
| 842 | + needBuffs[buffId].count = (needBuffs[buffId].count or 0) + info.count | |
| 843 | + needBuffs[buffId].exist = info.exist | |
| 844 | + end | |
| 845 | + | |
| 846 | + for buffId, info in pairs(needBuffs) do | |
| 847 | + if info.count < 0 then | |
| 848 | + local buff = self:getBuffById(buffId) | |
| 849 | + if buff then | |
| 850 | + buff:uncover(info.exist and -info.count or -1, true) | |
| 851 | + end | |
| 852 | + elseif info.count > 0 then | |
| 853 | + self:addBuff(buffId, nil, info.count) | |
| 854 | + end | |
| 855 | + end | |
| 856 | +end | |
| 778 | 857 | |
| 779 | 858 | function Player:isPlayer() |
| 780 | 859 | return true | ... | ... |