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