Files
SVSimServer/SVSim.BattleEngine/Engine/Wizard.Battle.Recovery/RecoveryRecordManagerBase.cs
gamer147 957af3d1ec feat(battle-engine): full Unity/VFX/god-object shims + expanded copy closure (2570 files)
Authored Unity primitive/object-model shim, VFX layer (control-flow-preserving, InstantVfx never invokes its action -- headless suppression), god-object stubs (GameMgr/EffectMgr/UIManager with faithfully-extracted nested enums), View/UI/Touch tree, LitJson+BetterList+Tuple copied, third-party stubs. Discovered Roslyn header-error masking: fixing class-header type errors unmasks body references, so the true copy closure is ~2570 files (was 782 under masking). Errors: masked-25720 -> 268; our shim files compile clean. Remaining: ~50 residual shim/external types, 24 NGUI UI-base overrides, static-type fixes, plus likely 1-2 more unmask waves.
2026-06-05 17:22:20 -04:00

184 lines
6.3 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using Cute;
using LitJson;
using Wizard.AutoTest;
using Wizard.ErrorDialog;
namespace Wizard.Battle.Recovery;
public abstract class RecoveryRecordManagerBase : IRecoveryRecordManager
{
protected OperationRecorderBase _recorder;
protected GameMgr _gameMgr;
protected DataMgr.BattleType _battleType;
protected readonly string _recoveryFilePath;
public const string DEFAULT_RECOVERY_SINGLE_FILE_NAME = "recovery_single.json";
public const string DEFAULT_RECOVERY_NETWORK_FILE_NAME = "recovery_network.json";
public const string DEFAULT_RECOVERY_AI_NETWORK_FILE_NAME = "recovery_ai_network.json";
protected abstract string DefaultRecoveryFileName { get; }
public RecoveryRecordManagerBase()
{
_recoveryFilePath = OperationRecorderBase.RecordDirectoryPath + DefaultRecoveryFileName;
}
public RecoveryRecordManagerBase(string recoveryFilePath)
{
_recoveryFilePath = OperationRecorderBase.RecordDirectoryPath + recoveryFilePath;
}
public void RecordSkillTarget(IEnumerable<BattleCardBase> targetCards)
{
_recorder.RecordSkillTargets(targetCards);
}
public virtual void SetupRecording(BattleManagerBase battleMgr, DataMgr.BattleType battleType, int randomSeed, int backGroundId, string bgmId = "NONE")
{
Directory.CreateDirectory(OperationRecorderBase.RecordDirectoryPath);
_gameMgr = GameMgr.GetIns();
_battleType = battleType;
_recorder = CreateOperationRecorder();
SetupRecorderEvents(_recorder, battleMgr);
}
public virtual void SetupMulliganStartTimeRecorderEvent(BattleManagerBase battleMgr)
{
}
protected abstract OperationRecorderBase CreateOperationRecorder();
protected virtual void SetupRecorderEvents(OperationRecorderBase operationRecorder, BattleManagerBase battleMgr)
{
battleMgr.OnStartOpening += operationRecorder.RecordStartTurnIsPlayer;
battleMgr.BattlePlayer.OnMulliganEnd += operationRecorder.RecordPlayerMulliganReplaceCards;
battleMgr.BattleEnemy.OnMulliganEnd += operationRecorder.RecordEnemyMulliganReplaceCards;
battleMgr.OperateMgr.OnSetCardSuccess += operationRecorder.RecordPlay;
battleMgr.OperateMgr.OnBeforeAttack += operationRecorder.RecordAttack;
battleMgr.OperateMgr.OnEvolveSuccess += operationRecorder.RecordEvolve;
battleMgr.OperateMgr.OnStartSelect += operationRecorder.RecordStartSelect;
battleMgr.OperateMgr.OnSelect += operationRecorder.RecordSelect;
battleMgr.OperateMgr.OnCompleteSelect += operationRecorder.RecordCompleteSelect;
battleMgr.OperateMgr.OnStartChoice += operationRecorder.RecordStartChoice;
battleMgr.OperateMgr.OnCompleteChoice += operationRecorder.RecordCompleteChoice;
battleMgr.OperateMgr.OnCancelSelect += operationRecorder.RecordCancelSelect;
battleMgr.OperateMgr.OnCancelChoice += operationRecorder.RecordCancelChoice;
battleMgr.OperateMgr.OnStartFusion += operationRecorder.RecordStartFusion;
battleMgr.OperateMgr.OnSelectFusionForRecovery += operationRecorder.RecordSelectFusion;
battleMgr.OperateMgr.OnCancelFusion += operationRecorder.RecordCancelFusion;
battleMgr.OperateMgr.OnBeforeFusion += operationRecorder.RecordCompleteFusionSelect;
if (battleMgr is SingleBattleMgr singleBattleMgr && _gameMgr.GetDataMgr().BossRushBattleData != null)
{
singleBattleMgr.OnBattleRetire += operationRecorder.RecordRetire;
}
}
public static bool IsExistsNetworkRecoveryFile()
{
return File.Exists(OperationRecorderBase.RecordDirectoryPath + "recovery_network.json");
}
public static bool IsExistsAINetworkRecoveryFile()
{
return File.Exists(OperationRecorderBase.RecordDirectoryPath + "recovery_ai_network.json");
}
public static bool IsExistsSingleRecoveryFile()
{
return File.Exists(OperationRecorderBase.RecordDirectoryPath + "recovery_single.json");
}
public static bool IsBossRushBattleRetired()
{
if (!IsExistsSingleRecoveryFile())
{
return false;
}
JsonData jsonData;
try
{
jsonData = RecoveryOperationInfo.ReadRecoveryFile(OperationRecorderBase.RecordDirectoryPath + "recovery_single.json");
}
catch (Exception ex)
{
AbortSoloPlayRecoveryTask task = new AbortSoloPlayRecoveryTask();
UIManager.GetInstance().StartCoroutine(Toolbox.NetworkManager.Connect(task, delegate
{
Data.Load.data.InitRecoveryStatus();
UIManager.GetInstance().isBattleRecovery = false;
DeleteRecoveryFile();
DialogBase dialogBase = Wizard.ErrorDialog.Dialog.Create(20001);
dialogBase.SetButtonDelegate(delegate
{
SoftwareReset.exec();
});
dialogBase.ClickSe_Btn1 = Se.TYPE.SYS_BTN_CANCEL_TRANS;
}));
throw ex;
}
if (!jsonData.Keys.Contains("operations"))
{
return false;
}
for (int num = jsonData["operations"].Count - 1; num >= 0; num--)
{
JsonData jsonData2 = jsonData["operations"][num];
if (jsonData2.Keys.Contains("ope") && jsonData2["ope"].ToString() == "retire")
{
return true;
}
}
return false;
}
public static void DeleteTempAINetworkRecoveryFile()
{
if (File.Exists(OperationRecorderBase.RecordDirectoryPath + "temp_recovery_ai_network.json"))
{
File.Delete(OperationRecorderBase.RecordDirectoryPath + "temp_recovery_ai_network.json");
}
}
public static DataMgr.BattleType GetRecoveryBattleType()
{
if (IsExistsNetworkRecoveryFile() || IsExistsAINetworkRecoveryFile())
{
if (IsExistsAINetworkRecoveryFile())
{
GameMgr.GetIns().IsAINetwork = true;
}
return Data.BattleRecoveryInfo.BattleType;
}
if (IsExistsSingleRecoveryFile())
{
JsonData jsonData = RecoveryOperationInfo.ReadRecoveryFile(OperationRecorderBase.RecordDirectoryPath + "recovery_single.json");
return (DataMgr.BattleType)jsonData.ToIntOrDefault("battle_type", 100);
}
return DataMgr.BattleType.None;
}
public static void DeleteRecoveryFile()
{
if (File.Exists(OperationRecorderBase.RecordDirectoryPath + "recovery_network.json"))
{
File.Delete(OperationRecorderBase.RecordDirectoryPath + "recovery_network.json");
}
if (File.Exists(OperationRecorderBase.RecordDirectoryPath + "recovery_ai_network.json"))
{
File.Delete(OperationRecorderBase.RecordDirectoryPath + "recovery_ai_network.json");
}
if (IsExistsSingleRecoveryFile())
{
File.Delete(OperationRecorderBase.RecordDirectoryPath + "recovery_single.json");
}
}
}