c1_lua/lua/app/module/battle/helper/battle_snapshot_helper.lua
2023-09-01 10:41:55 +08:00

288 lines
13 KiB
Lua

local BattleConst = GConst.BattleConst
local SIDE_ATK = GConst.BattleConst.SIDE_ATK
local BATTLE_ROGUE_SKILL_HANDLE = require "app/module/battle/skill/battle_rogue_skill_handle"
local BattleSnapshotHelper = {}
local NEED_SAVE_SNAPSHOT_BATTLE_TYPE = {
[BattleConst.BATTLE_TYPE.STAGE] = true,
[BattleConst.BATTLE_TYPE.DAILY_CHALLENGE] = true,
}
function BattleSnapshotHelper:clearSnap(battleBaseController)
if not NEED_SAVE_SNAPSHOT_BATTLE_TYPE[battleBaseController.battleType] then
return
end
LocalData:saveBattleSnapshot({})
end
function BattleSnapshotHelper:snapshotBattleInfo(battleBaseController)
-- 每一波开始时记录, 此时怪物为正常状态
if not NEED_SAVE_SNAPSHOT_BATTLE_TYPE[battleBaseController.battleType] then
return
end
battleBaseController.snapShotInfo = table.clearOrCreate(battleBaseController.snapShotInfo)
-- 战斗
battleBaseController.snapShotInfo.params = table.clearOrCreate(battleBaseController.snapShotInfo.params) -- 战斗参数
if battleBaseController.params then
if battleBaseController.params.atkFormation then
local formation = battleBaseController.params.atkFormation
battleBaseController.snapShotInfo.params.atkFormation = table.clearOrCreate(battleBaseController.snapShotInfo.params.atkFormation)
for matchType, heroEntity in pairs(formation) do
battleBaseController.snapShotInfo.params.atkFormation[tostring(matchType)] = heroEntity:getCfgId()
end
end
if battleBaseController.snapShotInfo.params.defFormation then
battleBaseController.snapShotInfo.params.defFormation = nil
end
end
battleBaseController.snapShotInfo.battleType = battleBaseController.battleType -- 战斗类型
battleBaseController.snapShotInfo.totalDurationTime = battleBaseController.totalDurationTime -- 总时间
battleBaseController.snapShotInfo.eliminateTotalCount = battleBaseController.eliminateTotalCount -- 消除个数
battleBaseController.snapShotInfo.maxLinkCount = battleBaseController.maxLinkCount -- 最长链接数
battleBaseController.snapShotInfo.realTime = battleBaseController.realTime -- 真实时间
battleBaseController.snapShotInfo.taskProgress = battleBaseController.taskProgress -- 战斗任务数据
battleBaseController.snapShotInfo.waveRoundCount = table.clearOrCreate(battleBaseController.snapShotInfo.waveRoundCount) -- 波次的回合数
for k, v in pairs(battleBaseController.waveRoundCount) do
battleBaseController.snapShotInfo.waveRoundCount[tostring(k)] = v
end
battleBaseController.snapShotInfo.lastRoundBreakedGridType = table.clearOrCreate(battleBaseController.snapShotInfo.lastRoundBreakedGridType) -- 上一回合破碎的格子类型
for k, v in pairs(battleBaseController.lastRoundBreakedGridType) do
battleBaseController.snapShotInfo.lastRoundBreakedGridType[tostring(k)] = v
end
battleBaseController.snapShotInfo.curBoardIndex = battleBaseController.curBoardIndex
battleBaseController.snapShotInfo.chapterId = battleBaseController.chapterId -- 当前战斗关卡
battleBaseController.snapShotInfo.waveIndex = battleBaseController:getWaveIndex() -- 当前波次
battleBaseController.snapShotInfo.gotMysteryBoxIndexs = table.clearOrCreate(battleBaseController.snapShotInfo.gotMysteryBoxIndexs) -- 神秘宝箱索引
for k, v in pairs(battleBaseController.gotMysteryBoxIndexs) do
battleBaseController.snapShotInfo.gotMysteryBoxIndexs[tostring(k)] = v
end
battleBaseController.snapShotInfo.time = battleBaseController.time -- 未暂停的战斗时间
-- 棋盘
local board = battleBaseController:snapshotBoard()
battleBaseController.snapShotInfo.boardSnapInfo = {}
for posId, info in pairs(board) do
battleBaseController.snapShotInfo.boardSnapInfo[tostring(posId)] = info
end
local gridEdge = battleBaseController:snapshotGridEdge()
battleBaseController.snapShotInfo.gridEdge = gridEdge
-- 血量
if battleBaseController.battleData.atkTeam:getMaxHp() <= 0 then
battleBaseController.snapShotInfo.hpPercent = 0 -- 容错
else
battleBaseController.snapShotInfo.hpPercent = battleBaseController.battleData.atkTeam:getHpPercent()
end
-- 技能
battleBaseController.snapShotInfo.atkSkillMap = table.clearOrCreate(battleBaseController.snapShotInfo.atkSkillMap)
for skillId, info in pairs(battleBaseController.battleData:getSelectSkillMap(SIDE_ATK)) do
battleBaseController.snapShotInfo.atkSkillMap[tostring(skillId)] = info
end
battleBaseController.snapShotInfo.atkSkillEnergy = table.clearOrCreate(battleBaseController.snapShotInfo.atkSkillEnergy)
for elementType, skillEntity in pairs(battleBaseController.battleData:getSkillEntities(SIDE_ATK)) do
battleBaseController.snapShotInfo.atkSkillEnergy[tostring(elementType)] = skillEntity:getEnergy()
end
-- BattleBaseData
battleBaseController.snapShotInfo.battledataShopInfo = battleBaseController.battleData:getSnapshoptInfo()
-- buff
battleBaseController.snapShotInfo.atkBuff = table.clearOrCreate(battleBaseController.snapShotInfo.atkBuff)
local buffList = battleBaseController.atkTeam:getBuffList()
for index, buffEffect in pairs(buffList) do
local buffEntity = buffEffect.buff
if buffEntity and buffEntity:getNeedSave() then
local saveBuffEffect = {
type = buffEntity:getName(),
num = buffEntity:getEffectNum(),
round = buffEffect.round or 1,
ratio = 10000,
}
table.insert(battleBaseController.snapShotInfo.atkBuff, saveBuffEffect)
end
end
-- 战斗数据
battleBaseController.snapShotInfo.heroReport = {}
local members = battleBaseController.battleData:getAtkTeam():getAllMembers()
for k, v in pairs(members) do
local matchTypeStr = tostring(v:getMatchType())
battleBaseController.snapShotInfo.heroReport[matchTypeStr] = {
skill_cast = v:getActiveSkillReleaseCount(),
damage = v:getDamageCount(),
}
end
-- 快照时间
battleBaseController.snapShotInfo.snapShotTime = Time:getServerTime()
battleBaseController.snapShotInfo.currentVersion = Platform:getClientVersion()
LocalData:saveBattleSnapshot(battleBaseController.snapShotInfo)
end
function BattleSnapshotHelper:dealSnapshotBattleBaseInfo(battleBaseController, snapInfo)
if not snapInfo then
return
end
if not NEED_SAVE_SNAPSHOT_BATTLE_TYPE[snapInfo.battleType] then
return
end
local atkFormation = snapInfo.params.atkFormation
snapInfo.params.atkFormation = {}
for matchTypeStr, heroId in ipairs(atkFormation) do
local matchType = tonumber(matchTypeStr)
local heroEntity = DataManager.HeroData:getHeroById(heroId)
if matchType and heroEntity then
snapInfo.params.atkFormation[matchType] = heroEntity
end
end
battleBaseController.params = snapInfo.params
battleBaseController.battleType = snapInfo.battleType or GConst.BattleConst.BATTLE_TYPE.STAGE
battleBaseController.totalDurationTime = snapInfo.totalDurationTime
battleBaseController.eliminateTotalCount = snapInfo.eliminateTotalCount
battleBaseController.maxLinkCount = snapInfo.maxLinkCount
battleBaseController.realTime = snapInfo.realTime
battleBaseController.taskProgress = snapInfo.taskProgress
if snapInfo.waveRoundCount then
for waveIndexStr, round in pairs(snapInfo.waveRoundCount) do
local waveIndex = tonumber(waveIndexStr)
if waveIndex then
battleBaseController.waveRoundCount[waveIndex] = round
end
end
end
if snapInfo.lastRoundBreakedGridType then
for gridtypeStr, v in pairs(snapInfo.lastRoundBreakedGridType) do
local gridtype = tonumber(gridtypeStr)
if gridtype then
battleBaseController.lastRoundBreakedGridType[gridtype] = v
end
end
end
battleBaseController.chapterId = snapInfo.chapterId
battleBaseController:setWaveIndex(snapInfo.waveIndex)
battleBaseController.maxWaveIndex = battleBaseController:getMaxWave()
if snapInfo.gotMysteryBoxIndexs then
for indexStr, v in pairs(snapInfo.gotMysteryBoxIndexs) do
local index = tonumber(indexStr)
if index then
battleBaseController.gotMysteryBoxIndexs[index] = v
end
end
end
end
function BattleSnapshotHelper:dealSnapshotBattleExtraInfo(battleBaseController, snapshot)
if not snapshot then
return
end
if not NEED_SAVE_SNAPSHOT_BATTLE_TYPE[snapshot.battleType] then
return
end
local atkSelecetSkillMap = snapshot.atkSkillMap
if atkSelecetSkillMap then
local skillPool = battleBaseController.battleData:getSkillPool(SIDE_ATK)
if skillPool then
for elementType, list in pairs(skillPool) do -- 先遍历一下未解锁的技能
if not battleBaseController.battleData:isUnlockedSkillElementType(elementType, SIDE_ATK) then
local skillEntity = battleBaseController.battleData:getSkillEntityByElement(elementType, SIDE_ATK)
if skillEntity then
local skillId = skillEntity:getUnlockId()
local skillIdStr = tostring(skillId)
if skillId and atkSelecetSkillMap[skillIdStr] then
atkSelecetSkillMap[skillIdStr] = nil
battleBaseController:dealSelectSkill(skillId, nil, SIDE_ATK, true)
end
end
end
end
end
for skillIdStr, info in pairs(atkSelecetSkillMap) do
local skillId = tonumber(skillIdStr)
if skillId then
if info.value and info.value > 0 then
battleBaseController.battleData:setSkillCount(skillId, info.value, SIDE_ATK, info.count)
BATTLE_ROGUE_SKILL_HANDLE.takeEffect(skillId, battleBaseController.battleData, battleBaseController, info.value, SIDE_ATK)
local skillEntities = battleBaseController:getSkillEntities(SIDE_ATK)
for _, entity in pairs(skillEntities) do
entity:gotUpSKill(skillId)
end
else
if info.count then
for i = 1, info.count do
battleBaseController:dealSelectSkill(skillId, info.value, SIDE_ATK, true)
end
end
end
end
end
end
local atkSkillEnergy = snapshot.atkSkillEnergy
if atkSkillEnergy then
local skillMap = battleBaseController.battleData:getSkillEntities(SIDE_ATK)
for matchTypeStr, count in pairs(atkSkillEnergy) do
local matchType = tonumber(matchTypeStr)
if matchType and skillMap[matchType] then
skillMap[matchType]:addEnergy(count)
end
end
end
if battleBaseController.battleUI then
battleBaseController.battleUI:refreshSkill(nil, nil, SIDE_ATK)
end
-- buff
local atkBuff = snapshot.atkBuff
if atkBuff then
local atkMainUnit = battleBaseController.atkTeam:getMainUnit()
for _, saveBuffEffect in ipairs(atkBuff) do
local BattleBuffEntity = require "app/userdata/battle/skill/battle_buff_entity"
local buffEntity = BattleBuffEntity:create()
buffEntity:init(saveBuffEffect, atkMainUnit.unitEntity)
buffEntity:setTargetSide(atkMainUnit)
buffEntity:setNeedSave(true)
atkMainUnit:takeEffect(buffEntity, atkMainUnit)
end
end
if snapshot.hpPercent then
local atkTeamEntity = battleBaseController.battleData.atkTeam
local hp = atkTeamEntity:getHp() * snapshot.hpPercent
hp = math.floor(hp + 0.00000000001)
if hp < 1 then
hp = 1
end
atkTeamEntity:setAttrValue(BattleConst.ATTR_NAME.HP, hp)
if battleBaseController.battleUI then
battleBaseController.battleUI:refreshAtkHp(atkTeamEntity:getHp(), atkTeamEntity:getHpPercent())
end
end
if snapshot.heroReport then
local members = battleBaseController.battleData:getAtkTeam():getAllMembers()
for matchTypeStr, v in pairs(snapshot.heroReport) do
local matchType = tonumber(matchTypeStr)
if members[matchType] then
members[matchType]:setDamageCount(v.damage)
members[matchType]:setActiveSkillReleaseCount(v.skill_cast)
end
end
end
end
return BattleSnapshotHelper