Files
SVSimServer/SVSim.BattleEngine/Engine/Wizard/AIPreprocessSimulationUtility.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

180 lines
6.6 KiB
C#

using System.Collections.Generic;
namespace Wizard;
public static class AIPreprocessSimulationUtility
{
public static void SimulatePreprocess(AIVirtualCard activator, AISituationInfo situation, AIVirtualField field, AIScriptTokenArgType timing, bool isPseudo)
{
ExecuteEarthRite(activator, situation, field, timing, isPseudo);
ExecuteNecromance(activator, situation, field, timing, isPseudo);
ExecuteBurialRite(activator, situation, field, timing, isPseudo);
}
public static void ResetPreprocess(AISituationInfo situation, AIVirtualField field)
{
AISimulationPreprocessRecorder preprocessRecorder = situation.PreprocessRecorder;
if (preprocessRecorder.HasRecord)
{
for (int i = 0; i < preprocessRecorder.RecordList.Count; i++)
{
ResetBySingleRecord(preprocessRecorder.RecordList[i], field);
}
preprocessRecorder.RemoveAll();
}
}
public static AIScriptTokenArgType ConvertAIOperationTypeToTiming(AIOperationType operationType)
{
return operationType switch
{
AIOperationType.PLAY => AIScriptTokenArgType.WHEN_PLAY,
AIOperationType.EVOLVE => AIScriptTokenArgType.WHEN_EVO,
AIOperationType.FUSION => AIScriptTokenArgType.WHEN_FUSION,
_ => AIScriptTokenArgType.NONE,
};
}
private static void ExecuteEarthRite(AIVirtualCard activator, AISituationInfo situation, AIVirtualField field, AIScriptTokenArgType timing, bool isPseudo)
{
int earthRiteCount = activator.GetEarthRiteCount(field, situation, timing);
if (earthRiteCount > 0)
{
AISinglePreprocessRecord record = new AISinglePreprocessRecord(activator, situation.OriginalCard, timing);
field.ExecuteEarthRite(activator.IsAlly, earthRiteCount, situation, isPseudo, record);
situation.PreprocessRecorder.AddRecord(record);
}
}
private static void ExecuteNecromance(AIVirtualCard activator, AISituationInfo situation, AIVirtualField field, AIScriptTokenArgType timing, bool isPseudo)
{
int necromanceCountOrDefault = activator.GetNecromanceCountOrDefault(field, situation, timing);
if (necromanceCountOrDefault > 0)
{
AISinglePreprocessRecord record = new AISinglePreprocessRecord(activator, situation.OriginalCard, timing)
{
NecromanceCount = necromanceCountOrDefault
};
SimulateNecromanceOnField(activator, situation, field, necromanceCountOrDefault, isPseudo);
situation.PreprocessRecorder.AddRecord(record);
}
}
private static void SimulateNecromanceOnField(AIVirtualCard activator, AISituationInfo situation, AIVirtualField field, int necromanceCount, bool isPseudo)
{
field.VirtualCemetery.ExecuteNecromance(necromanceCount, activator.IsAlly, isPseudo);
if (!isPseudo)
{
ExecuteAllWhenNecromanceTags(field, situation);
if (activator.IsAlly)
{
field.AllyNecromancedCountInGame += necromanceCount;
}
else
{
field.EnemyNecromancedCountInGame += necromanceCount;
}
}
field.AllActivateCountHolderIncrement(situation, AIPlayTagType.NecromanceActivateCount, activator);
}
private static void ExecuteBurialRite(AIVirtualCard activator, AISituationInfo situation, AIVirtualField field, AIScriptTokenArgType timing, bool isPseudo)
{
if (!AIBurialRite.CheckValidTimingType(timing))
{
return;
}
if (isPseudo)
{
int burialRiteCount = activator.GetBurialRiteCount(field, situation, EnemyAI.EmptyPlayPtn, timing);
AISinglePreprocessRecord record = new AISinglePreprocessRecord(activator, situation.OriginalCard, timing)
{
BurialRiteCount = burialRiteCount
};
situation.PreprocessRecorder.AddRecord(record);
return;
}
AISelectedTargetInfo burialRiteTarget = situation.GetBurialRiteTarget();
if (burialRiteTarget != null)
{
AISinglePreprocessRecord record2 = new AISinglePreprocessRecord(activator, situation.OriginalCard, timing)
{
BurialRiteCount = burialRiteTarget.Targets.Count
};
situation.PreprocessRecorder.AddRecord(record2);
AIBurialRiteSimulationUtility.ExecuteBurialRite(field, situation, burialRiteTarget);
}
}
public static void ExecuteRecordingToPlayedCardInfo(PlayedCardInfo playedCardInfo, AIVirtualCard activator, AIVirtualField field, AISituationInfo situation, bool isPseudo)
{
AISimulationPreprocessRecorder preprocessRecorder = playedCardInfo.PreprocessRecorder;
if (preprocessRecorder != null && preprocessRecorder.HasRecord)
{
for (int i = 0; i < preprocessRecorder.RecordList.Count; i++)
{
ExecuteBySingleRecord(preprocessRecorder.RecordList[i], activator, field, situation, isPseudo);
}
if (playedCardInfo.HasPreDecidedSelectTargets)
{
situation.SelectedTargets = playedCardInfo.PreDecidedSelectTargets;
}
}
}
private static void ExecuteBySingleRecord(AISinglePreprocessRecord record, AIVirtualCard activator, AIVirtualField field, AISituationInfo situation, bool isPseudo)
{
if (record.EarthRiteCount > 0)
{
field.ExecuteEarthRite(activator.IsAlly, record.EarthRiteCount, situation, isPseudo, record);
situation.PreprocessRecorder.AddRecord(record);
}
if (record.NecromanceCount > 0)
{
SimulateNecromanceOnField(activator, situation, field, record.NecromanceCount, isPseudo);
situation.PreprocessRecorder.AddRecord(record);
}
if (record.BurialRiteCount <= 0)
{
return;
}
if (isPseudo)
{
situation.PreprocessRecorder.AddRecord(record);
return;
}
AISelectedTargetInfo situationTarget = situation.GetSituationTarget(AIScriptTokenArgType.TARGET_SELECT);
if (situationTarget != null && situationTarget.Type == TargetSelectType.BurialRite)
{
AIBurialRiteSimulationUtility.ExecuteBurialRite(field, situation, situationTarget);
situation.PreprocessRecorder.AddRecord(record);
}
}
private static void ResetBySingleRecord(AISinglePreprocessRecord record, AIVirtualField field)
{
if (record.EarthRiteCount > 0)
{
record.RestoreAllEarthRiteCount(field);
}
if (record.NecromanceCount > 0)
{
field.VirtualCemetery.ResetNecromance(record.RealActor.IsAlly, record.NecromanceCount);
}
}
private static void ExecuteAllWhenNecromanceTags(AIVirtualField field, AISituationInfo situation)
{
if (field.CardListSet.HasWhenNecromanceHolder)
{
List<AIVirtualCard> whenNecromanceTagHolders = field.CardListSet.WhenNecromanceTagHolders;
List<int> bestPlayPtn = field.BestPlayPtn;
for (int i = 0; i < whenNecromanceTagHolders.Count; i++)
{
AIVirtualCard aIVirtualCard = whenNecromanceTagHolders[i];
aIVirtualCard.TagCollectionContainer.NecromanceTags.Execute(aIVirtualCard, field, bestPlayPtn, situation);
}
}
}
}