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

344 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using Wizard.Battle.View.Vfx;
namespace Wizard;
public static class AIAttachEventToBattleModuleUtility
{
public static void SetupEventWhenInitGame(BattlePlayerBase ally, BattlePlayerBase opponent, OperateMgr operateMgr, EnemyAI ai)
{
SetupOnAddCemeteryEvent(ally, opponent, ai);
SetupOnTurnStartComplete(ally, opponent, ai);
SetupOnTurnEndStart(ally, opponent, ai);
SetupOperateMgrEvent(operateMgr, ai);
}
public static void DepriveAttachedAIBattleModule(BattlePlayerBase ally, BattlePlayerBase opponent, OperateMgr operateMgr, EnemyAI ai)
{
DepriveAttachedPlayerBattleEvent(ally, opponent, ai.PlayerBattleEvent);
DepriveAttachedOperateMgrBattleEvent(operateMgr, ai.OprMgrBattleEvent);
}
private static void DepriveAttachedPlayerBattleEvent(BattlePlayerBase ally, BattlePlayerBase opponent, AIAttachPlayerBattleEventCache playerBattleEvent)
{
if (playerBattleEvent.AllyAddCemeteryEvent != null)
{
ally.OnAddCemeteryEvent -= playerBattleEvent.AllyAddCemeteryEvent;
playerBattleEvent.AllyAddCemeteryEvent = null;
}
if (playerBattleEvent.OpponentAddCemeteryEvent != null)
{
opponent.OnAddCemeteryEvent -= playerBattleEvent.OpponentAddCemeteryEvent;
playerBattleEvent.OpponentAddCemeteryEvent = null;
}
if (playerBattleEvent.AllyTurnStartCompleteEvent != null)
{
ally.OnTurnStartComplete = (Action)Delegate.Remove(ally.OnTurnStartComplete, playerBattleEvent.AllyTurnStartCompleteEvent);
playerBattleEvent.AllyTurnStartCompleteEvent = null;
}
if (playerBattleEvent.OpponentTurnStartCompleteEvent != null)
{
opponent.OnTurnStartComplete = (Action)Delegate.Remove(opponent.OnTurnStartComplete, playerBattleEvent.OpponentTurnStartCompleteEvent);
playerBattleEvent.OpponentTurnStartCompleteEvent = null;
}
}
private static void DepriveAttachedOperateMgrBattleEvent(OperateMgr oprMgr, AIAttachOperateMgrBattleEventCache oprMgrBattleEvent)
{
if (oprMgrBattleEvent.OnSetCardSuccessEvent != null)
{
oprMgr.OnSetCardSuccess -= oprMgrBattleEvent.OnSetCardSuccessEvent;
oprMgrBattleEvent.OnSetCardSuccessEvent = null;
}
if (oprMgrBattleEvent.OnSetCardExecutedEvent != null)
{
oprMgr.OnSetCardExecuted -= oprMgrBattleEvent.OnSetCardExecutedEvent;
oprMgrBattleEvent.OnSetCardExecutedEvent = null;
}
if (oprMgrBattleEvent.OnEvolveSuccessEvent != null)
{
oprMgr.OnEvolveSuccess -= oprMgrBattleEvent.OnEvolveSuccessEvent;
oprMgrBattleEvent.OnEvolveSuccessEvent = null;
}
if (oprMgrBattleEvent.OnEvolveCompleteEvent != null)
{
oprMgr.OnEvoleComplete -= oprMgrBattleEvent.OnEvolveCompleteEvent;
oprMgrBattleEvent.OnEvolveCompleteEvent = null;
}
if (oprMgrBattleEvent.OnBeforeAttackEvent != null)
{
oprMgr.OnBeforeAttack -= oprMgrBattleEvent.OnBeforeAttackEvent;
oprMgrBattleEvent.OnBeforeAttackEvent = null;
}
if (oprMgrBattleEvent.OnAttackExecutedEvent != null)
{
oprMgr.OnAttackExecuted -= oprMgrBattleEvent.OnAttackExecutedEvent;
oprMgrBattleEvent.OnAttackExecutedEvent = null;
}
if (oprMgrBattleEvent.OnBeforeFusionEvent != null)
{
oprMgr.OnBeforeFusion -= oprMgrBattleEvent.OnBeforeFusionEvent;
oprMgrBattleEvent.OnBeforeFusionEvent = null;
}
if (oprMgrBattleEvent.OnAfterFusionEvent != null)
{
oprMgr.OnAfterFusion -= oprMgrBattleEvent.OnAfterFusionEvent;
oprMgrBattleEvent.OnAfterFusionEvent = null;
}
}
private static void SetupOnAddCemeteryEvent(BattlePlayerBase ally, BattlePlayerBase opponent, EnemyAI ai)
{
ai.PlayerBattleEvent.AllyAddCemeteryEvent = delegate(BattleCardBase card, BattlePlayerBase.CEMETERY_TYPE cemeteryType, bool isOpen, SkillBase skill)
{
if (cemeteryType == BattlePlayerBase.CEMETERY_TYPE.NORMAL && !(card is NullBattleCard) && card.SelfBattlePlayer.ClassAndInPlayCardList.Contains(card) && card.HasSkillWhenDestroy && ai.LatestAction != null)
{
ai.LatestAction.CreateRandomTargetInformation(card, (SkillBase skillBase) => skillBase.IsWhenDestroySkill && RegisterTool.IsSkillRandom(skillBase));
}
};
ally.OnAddCemeteryEvent += ai.PlayerBattleEvent.AllyAddCemeteryEvent;
ai.PlayerBattleEvent.OpponentAddCemeteryEvent = delegate(BattleCardBase card, BattlePlayerBase.CEMETERY_TYPE cemeteryType, bool isOpen, SkillBase skill)
{
if (cemeteryType == BattlePlayerBase.CEMETERY_TYPE.NORMAL && !(card is NullBattleCard) && card.SelfBattlePlayer.ClassAndInPlayCardList.Contains(card))
{
RecordOpponentBarbarossa(card, ai);
if (card.HasSkillWhenDestroy && ai.LatestAction != null)
{
ai.LatestAction.CreateRandomTargetInformation(card, (SkillBase skillBase) => skillBase.IsWhenDestroySkill && RegisterTool.IsSkillRandom(skillBase));
}
}
};
opponent.OnAddCemeteryEvent += ai.PlayerBattleEvent.OpponentAddCemeteryEvent;
}
private static void SetupOnTurnStartComplete(BattlePlayerBase ally, BattlePlayerBase opponent, EnemyAI ai)
{
ai.PlayerBattleEvent.AllyTurnStartCompleteEvent = delegate
{
ai.UpdateAICurrentVirtualField();
AIVirtualField currentVirtualField = ai.CurrentVirtualField;
if (ai.LatestAction != null && ai.BeforeLatestActionField != null)
{
currentVirtualField.UpdateTagInformationFromLatestAction(ai.LatestAction, ai.BeforeLatestActionField);
}
ai.LatestAction = null;
ai.BeforeLatestActionField = null;
};
ally.OnTurnStartComplete = (Action)Delegate.Combine(ally.OnTurnStartComplete, ai.PlayerBattleEvent.AllyTurnStartCompleteEvent);
ai.PlayerBattleEvent.OpponentTurnStartCompleteEvent = delegate
{
if (!ai.IsBattleEnd)
{
if (ai.IsOpponentBarbarossaDestroyed)
{
ai.IsOpponentBarbarossaDestroyed = false;
}
ai.UpdateAICurrentVirtualField();
AIVirtualField currentVirtualField = ai.CurrentVirtualField;
if (ai.LatestAction != null && ai.BeforeLatestActionField != null)
{
currentVirtualField.UpdateTagInformationFromLatestAction(ai.LatestAction, ai.BeforeLatestActionField);
}
ai.LatestAction = null;
ai.BeforeLatestActionField = null;
}
};
opponent.OnTurnStartComplete = (Action)Delegate.Combine(opponent.OnTurnStartComplete, ai.PlayerBattleEvent.OpponentTurnStartCompleteEvent);
}
private static void SetupOnTurnEndStart(BattlePlayerBase ally, BattlePlayerBase opponent, EnemyAI ai)
{
ai.PlayerBattleEvent.AllySelfTurnEndEvent = delegate
{
ai.LatestAction = new AIRealActionInformation(AIOperationType.TURNEND, ally.Class, ally.Class, null);
ai.SaveBeforeLatestActionInformation();
for (int i = 0; i < ally.ClassAndInPlayCardList.Count; i++)
{
ai.LatestAction.CreateRandomTargetInformation(ally.ClassAndInPlayCardList[i], (SkillBase skill) => skill.OnSelfTurnEndStart != 0 && RegisterTool.IsSkillRandom(skill));
}
for (int num = 0; num < opponent.ClassAndInPlayCardList.Count; num++)
{
ai.LatestAction.CreateRandomTargetInformation(opponent.ClassAndInPlayCardList[num], (SkillBase skill) => skill.OnOpponentTurnEndStart != 0 && RegisterTool.IsSkillRandom(skill));
}
};
ally.OnTurnEndStart += ai.PlayerBattleEvent.AllySelfTurnEndEvent;
ai.PlayerBattleEvent.OpponentSelfTurnEndEvent = delegate
{
ai.LatestAction = new AIRealActionInformation(AIOperationType.TURNEND, opponent.Class, opponent.Class, null);
ai.SaveBeforeLatestActionInformation();
for (int i = 0; i < opponent.ClassAndInPlayCardList.Count; i++)
{
ai.LatestAction.CreateRandomTargetInformation(opponent.ClassAndInPlayCardList[i], (SkillBase skill) => skill.OnSelfTurnEndStart != 0 && RegisterTool.IsSkillRandom(skill));
}
for (int num = 0; num < ally.ClassAndInPlayCardList.Count; num++)
{
ai.LatestAction.CreateRandomTargetInformation(ally.ClassAndInPlayCardList[num], (SkillBase skill) => skill.OnOpponentTurnEndStart != 0 && RegisterTool.IsSkillRandom(skill));
}
};
opponent.OnTurnEndStart += ai.PlayerBattleEvent.OpponentSelfTurnEndEvent;
}
private static void SetupVirtualPairOnAfterPickCard(BattlePlayerPair pair, AIOperationSimulatorAccessor accessor)
{
pair.Self.OnAfterPickCard += delegate
{
accessor.UpdateCurrentField(pair, EnemyAI.EmptyPlayPtn);
};
pair.Opponent.OnAfterPickCard += delegate
{
accessor.UpdateCurrentField(pair, EnemyAI.EmptyPlayPtn);
};
}
private static void SetupOperateMgrEvent(OperateMgr operateMgr, EnemyAI ai)
{
SetupOperateMgrOnSetCardSuccess(operateMgr, ai);
SetupOperateMgrOnSetCardExecuted(operateMgr, ai);
SetupOperateMgrOnEvolveSuccess(operateMgr, ai);
SetupOperateMgrOnEvolveComplete(operateMgr, ai);
SetupOperateMgrOnBeforeAttack(operateMgr, ai);
SetupOperateMgrOnAttackExecuted(operateMgr, ai);
SetupOperateMgrOnBeforeFusion(operateMgr, ai);
SetupOperateMgrOnAfterFusion(operateMgr, ai);
}
private static void SetupOperateMgrOnSetCardSuccess(OperateMgr operateMgr, EnemyAI ai)
{
ai.OprMgrBattleEvent.OnSetCardSuccessEvent = delegate(BattleCardBase originalCard, BattleCardBase playCard, IEnumerable<BattleCardBase> selectedCards)
{
ai.LatestAction = new AIRealActionInformation(AIOperationType.PLAY, playCard, originalCard, selectedCards);
ai.SaveBeforeLatestActionInformation();
ai.LatestAction.CreateRandomTargetInformation(playCard, (SkillBase skill) => skill.IsWhenPlaySkill && RegisterTool.IsSkillRandom(skill));
};
operateMgr.OnSetCardSuccess += ai.OprMgrBattleEvent.OnSetCardSuccessEvent;
}
private static void SetupOperateMgrOnSetCardExecuted(OperateMgr operateMgr, EnemyAI ai)
{
ai.OprMgrBattleEvent.OnSetCardExecutedEvent = delegate
{
if (ai.IsBattleEnd)
{
return NullVfx.GetInstance();
}
ai.UpdateAICurrentVirtualField();
AIVirtualField currentVirtualField = ai.CurrentVirtualField;
if (ai.LatestAction != null && ai.BeforeLatestActionField != null)
{
currentVirtualField.UpdateTagInformationFromLatestAction(ai.LatestAction, ai.BeforeLatestActionField);
}
ai.LatestAction = null;
ai.BeforeLatestActionField = null;
return NullVfx.GetInstance();
};
operateMgr.OnSetCardExecuted += ai.OprMgrBattleEvent.OnSetCardExecutedEvent;
}
private static void RecordOpponentBarbarossa(BattleCardBase destroyCard, EnemyAI ai)
{
if (destroyCard.BaseParameter.BaseCardId == 106241020)
{
ai.IsOpponentBarbarossaDestroyed = true;
}
}
private static void SetupOperateMgrOnEvolveSuccess(OperateMgr operateMgr, EnemyAI ai)
{
ai.OprMgrBattleEvent.OnEvolveSuccessEvent = delegate(BattleCardBase originalEvolver, BattleCardBase realEvolver, IEnumerable<BattleCardBase> selectedTargets)
{
ai.SaveBeforeLatestActionInformation();
ai.LatestAction = new AIRealActionInformation(AIOperationType.EVOLVE, realEvolver, originalEvolver, selectedTargets);
ai.LatestAction.CreateRandomTargetInformation(realEvolver, (SkillBase skill) => skill.IsWhenEvolveSkill && RegisterTool.IsSkillRandom(skill), forceCheckEvolveSkills: true);
};
operateMgr.OnEvolveSuccess += ai.OprMgrBattleEvent.OnEvolveSuccessEvent;
}
private static void SetupOperateMgrOnEvolveComplete(OperateMgr operateMgr, EnemyAI ai)
{
ai.OprMgrBattleEvent.OnEvolveCompleteEvent = delegate
{
if (!ai.IsBattleEnd)
{
ai.UpdateAICurrentVirtualField();
AIVirtualField currentVirtualField = ai.CurrentVirtualField;
if (ai.LatestAction != null && ai.BeforeLatestActionField != null)
{
currentVirtualField.UpdateTagInformationFromLatestAction(ai.LatestAction, ai.BeforeLatestActionField);
}
ai.LatestAction = null;
ai.BeforeLatestActionField = null;
}
return NullVfx.GetInstance();
};
operateMgr.OnEvoleComplete += ai.OprMgrBattleEvent.OnEvolveCompleteEvent;
}
private static void SetupOperateMgrOnBeforeAttack(OperateMgr operateMgr, EnemyAI ai)
{
ai.OprMgrBattleEvent.OnBeforeAttackEvent = delegate(BattleCardBase attacker, BattleCardBase target, SkillProcessor skillProcessorOneTime)
{
ai.LatestAction = new AIRealActionInformation(AIOperationType.ATTACK, attacker, attacker, new List<BattleCardBase> { target });
ai.SaveBeforeLatestActionInformation();
ai.LatestAction.CreateRandomTargetInformation(attacker, (SkillBase skill) => skill.IsBeforAttackSkill && RegisterTool.IsSkillRandom(skill));
return NullVfx.GetInstance();
};
operateMgr.OnBeforeAttack += ai.OprMgrBattleEvent.OnBeforeAttackEvent;
}
private static void SetupOperateMgrOnAttackExecuted(OperateMgr operateMgr, EnemyAI ai)
{
ai.OprMgrBattleEvent.OnAttackExecutedEvent = delegate
{
if (!ai.IsBattleEnd)
{
ai.UpdateAICurrentVirtualField();
AIVirtualField currentVirtualField = ai.CurrentVirtualField;
if (ai.LatestAction != null && ai.BeforeLatestActionField != null)
{
currentVirtualField.UpdateTagInformationFromLatestAction(ai.LatestAction, ai.BeforeLatestActionField);
}
ai.LatestAction = null;
ai.BeforeLatestActionField = null;
}
return NullVfx.GetInstance();
};
operateMgr.OnAttackExecuted += ai.OprMgrBattleEvent.OnAttackExecutedEvent;
}
private static void SetupOperateMgrOnBeforeFusion(OperateMgr operateMgr, EnemyAI ai)
{
ai.OprMgrBattleEvent.OnBeforeFusionEvent = delegate(BattleCardBase fusionActor, IEnumerable<BattleCardBase> targets)
{
ai.LatestAction = new AIRealActionInformation(AIOperationType.FUSION, fusionActor, fusionActor, targets);
ai.SaveBeforeLatestActionInformation();
};
operateMgr.OnBeforeFusion += ai.OprMgrBattleEvent.OnBeforeFusionEvent;
}
private static void SetupOperateMgrOnAfterFusion(OperateMgr operateMgr, EnemyAI ai)
{
ai.OprMgrBattleEvent.OnAfterFusionEvent = delegate
{
if (!ai.IsBattleEnd)
{
ai.UpdateAICurrentVirtualField();
AIVirtualField currentVirtualField = ai.CurrentVirtualField;
if (ai.LatestAction != null && ai.BeforeLatestActionField != null)
{
currentVirtualField.UpdateTagInformationFromLatestAction(ai.LatestAction, ai.BeforeLatestActionField);
}
ai.LatestAction = null;
ai.BeforeLatestActionField = null;
}
return NullVfx.GetInstance();
};
operateMgr.OnAfterFusion += ai.OprMgrBattleEvent.OnAfterFusionEvent;
}
public static void SetupVirtualPairEventForOperationSimulator(BattlePlayerPair pair, AIOperationSimulatorAccessor accessor)
{
SetupVirtualPairOnAfterPickCard(pair, accessor);
}
}