Commit a80fee7cca90aa07aa063f7fc79a3a81c152d9b5

Authored by zhouhaihai
1 parent 505479c7

光环

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
... ...