Files
SVSimServer/SVSim.BattleEngine/Engine/Wizard/AIBanishSimulationUtility.cs
gamer147 824309ec44 feat(battle-engine): close the AI-simulation subsystem (verbatim)
Copied the 89 uncopied AI*SimulationUtility/extension files defining the
AIVirtualCard/AIVirtualField extension methods; the compile loop then auto-closed
the revealed type deps (~3049 files total, drift-clean). 10.0k -> 62 errors.
2026-06-05 20:30:59 -04:00

239 lines
9.9 KiB
C#

using System.Collections.Generic;
using System.Linq;
namespace Wizard;
public static class AIBanishSimulationUtility
{
public static float EvalTargetingBanish(List<AIScriptTokenBase> argList, List<int> playPtn, AIVirtualField field, AIVirtualCard tagOwner, AISituationInfo situation)
{
List<AIVirtualCard> list = AIFilteringUtility.MultipleFiltering(field.CardListSet.BothInplayCards, argList, tagOwner, playPtn, null);
if (list == null || list.Count <= 0)
{
return 0f;
}
list = AITargetSelectFilteringUtility.SelectCandidatesWithForceTargeting(list, tagOwner, playPtn);
int num = 0;
float num2 = float.MinValue;
for (int i = 0; i < list.Count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
if (!aIVirtualCard.IsIndependent && !aIVirtualCard.IsUnbanishable && (aIVirtualCard.IsAlly == tagOwner.IsAlly || (!aIVirtualCard.IsUntouchable && !aIVirtualCard.IsSneak)))
{
num++;
float num3 = aIVirtualCard.EvaluateValueOnField(playPtn, situation, useStyle: true);
float num4 = (aIVirtualCard.IsAlly ? (0f - num3 - aIVirtualCard.GetAllBreakBonus(playPtn, useIgnoreInBattle: false) + aIVirtualCard.GetAllBanishBonus(playPtn, useIgnoreInBattle: false) + aIVirtualCard.GetAllLeaveBonus(playPtn, useIgnoreInBattle: false)) : (num3 + aIVirtualCard.GetAllBreakBonus(playPtn, useIgnoreInBattle: false) - aIVirtualCard.GetAllBanishBonus(playPtn, useIgnoreInBattle: false) - aIVirtualCard.GetAllLeaveBonus(playPtn, useIgnoreInBattle: false)));
if (num4 > num2)
{
num2 = num4;
}
}
}
if (num == 0)
{
num2 = 0f;
}
return num2;
}
public static float EvalRandomBanish(List<AIScriptTokenBase> argList, AIVirtualCard tagOwner, AIVirtualField field, List<int> playPtn, int count, AISituationInfo situation)
{
List<AIVirtualCard> list = AIFilteringUtility.MultipleFiltering(field.CardListSet.BothInplayCards, argList, tagOwner, playPtn, null);
if (list != null && list.Count > 0)
{
List<float> list2 = new List<float>();
float num = 0f;
for (int i = 0; i < list.Count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
if (!aIVirtualCard.IsUnbanishable && !aIVirtualCard.IsIndependent)
{
float num2 = aIVirtualCard.EvaluateValueOnField(playPtn, situation, useStyle: true, doesUseLostLife: true, useOthersTag: true, useIgnoreInBattle: true);
float num3 = aIVirtualCard.EvaluateBreakValue(playPtn, useIgnoreBreak: true);
float allBanishBonus = aIVirtualCard.GetAllBanishBonus(playPtn, useIgnoreInBattle: true);
float num4 = aIVirtualCard.EvaluateLeaveValue(playPtn, useIgnoreInBattle: true);
float num5 = (aIVirtualCard.IsAlly ? (-1f) : 1f) * (num2 + num3 - allBanishBonus - num4);
list2.Add(num5);
num += num5;
}
}
if (list.Count <= count)
{
return num;
}
List<float[]> list3 = AIMathematicsLibrary.EnumerateCombinations(list2, count).ToList();
float num6 = 0f;
for (int j = 0; j < list3.Count; j++)
{
for (int k = 0; k < list3[j].Length; k++)
{
num6 += list3[j][k];
}
}
return num6 / (float)list3.Count;
}
return 0f;
}
public static float EvalAllBanish(List<AIScriptTokenBase> argList, AIVirtualCard tagOwner, AIVirtualField field, List<int> playPtn, AISituationInfo situation)
{
List<AIVirtualCard> list = AIFilteringUtility.MultipleFiltering(field.CardListSet.BothInplayCards, argList, tagOwner, playPtn, null);
if (list == null || list.Count <= 0)
{
return 0f;
}
float num = 0f;
for (int i = 0; i < list.Count; i++)
{
AIVirtualCard aIVirtualCard = list[i];
if (!aIVirtualCard.IsIndependent && !aIVirtualCard.IsUnbanishable)
{
float num2 = aIVirtualCard.EvaluateValueOnField(playPtn, situation, useStyle: true, doesUseLostLife: true, useOthersTag: true, useIgnoreInBattle: true);
float num3 = aIVirtualCard.EvaluateBreakValue(playPtn, useIgnoreBreak: true);
float allBanishBonus = aIVirtualCard.GetAllBanishBonus(playPtn, useIgnoreInBattle: true);
float num4 = aIVirtualCard.EvaluateLeaveValue(playPtn, useIgnoreInBattle: true);
num += (aIVirtualCard.IsAlly ? (-1f) : 1f) * (num2 + num3 - allBanishBonus - num4);
}
}
return num;
}
public static void BanishAll(List<AIVirtualCard> targetCards, AISituationInfo situation)
{
for (int i = 0; i < targetCards.Count; i++)
{
BanishSingle(targetCards[i], situation);
}
}
public static void ExecuteTargetSelectBanish(AIVirtualCard owner, List<AIVirtualCard> targets, AIVirtualField field, List<int> playPtn, AISituationInfo situation, AIScriptTokenArgType selectType, int selectCount = 1)
{
if (situation == null)
{
AIConsoleUtility.LogError("ExecuteTargetSelectBanish() Error!! situation is null!!!!!");
}
else if (situation.IsTargetExists(selectType))
{
BanishTarget(situation, targets, selectType);
}
else
{
BanishTargetPrediction(situation, targets, owner, field, playPtn, selectType, selectCount);
}
}
private static void BanishTargetPrediction(AISituationInfo situation, List<AIVirtualCard> candidates, AIVirtualCard banishOwner, AIVirtualField field, List<int> playPtn, AIScriptTokenArgType selectType, int selectCount)
{
List<AIVirtualCard> candidates2 = AITargetSelectFilteringUtility.SelectCandidatesWithForceTargeting(candidates, banishOwner, playPtn);
if (selectCount <= 1)
{
AIVirtualCard target = AISimulationRemovalUtility.SelectRemovalTarget(candidates2, banishOwner, field, playPtn, situation, AISelectTargetPattern.Best, AIRemovalType.Banish);
situation.SetSingleTargetInInfo(target, TargetSelectType.Default, selectType);
BanishTarget(situation, candidates, selectType);
}
else
{
BanishAll(AISimulationRemovalUtility.SelectMultipleRemovalTargets(candidates2, banishOwner, field, playPtn, situation, AISelectTargetPattern.Best, AIRemovalType.Banish, selectCount), situation);
}
}
public static void BanishTarget(AISituationInfo situation, List<AIVirtualCard> candidates, AIScriptTokenArgType whichTarget)
{
AISelectedTargetInfo situationTarget = situation.GetSituationTarget(whichTarget);
if (situationTarget == null || !situationTarget.HasTarget)
{
AIConsoleUtility.LogError("BanishTarget error!! No target!!!!!");
return;
}
List<AIVirtualCard> targets = situationTarget.Targets;
for (int i = 0; i < targets.Count; i++)
{
AIVirtualCard aIVirtualCard = targets[i];
if (candidates.Contains(aIVirtualCard))
{
BanishSingle(aIVirtualCard, situation);
}
}
}
public static void BanishSingle(AIVirtualCard target, AISituationInfo situation)
{
if (!target.IsDead && !target.IsIndependent && !target.IsUnbanishable)
{
target.RemoveCard(situation, AIRemovalType.Banish, isFromSkill: true);
}
}
public static void BanishRandom(List<AIVirtualCard> targets, AIVirtualCard tagOwner, AIVirtualField field, List<int> playPtn, AISituationInfo situation, int selectCount = 1)
{
if (selectCount <= 1)
{
AIVirtualCard aIVirtualCard = AISimulationRemovalUtility.SelectRemovalTarget(targets, tagOwner, field, playPtn, situation, AISelectTargetPattern.Worst, AIRemovalType.Banish);
if (aIVirtualCard != null)
{
BanishSingle(aIVirtualCard, situation);
}
}
else
{
BanishAll(AISimulationRemovalUtility.SelectMultipleRemovalTargets(targets, tagOwner, field, playPtn, situation, AISelectTargetPattern.Worst, AIRemovalType.Banish, selectCount), situation);
}
}
public static int GetInplayBanishedCount(AIVirtualCard tagOwner, AIVirtualField field, List<int> playPtn, AISituationInfo situation, List<AIScriptTokenBase> argList)
{
return GetFilterdBanishCardList(tagOwner, field, playPtn, situation, argList, BattleCardBase.BanishInfo.BanishPlace.Field)?.Count ?? 0;
}
public static int GetHandBanishedCount(AIVirtualCard tagOwner, AIVirtualField field, List<int> playPtn, AISituationInfo situation, List<AIScriptTokenBase> argList)
{
return GetFilterdBanishCardList(tagOwner, field, playPtn, situation, argList, BattleCardBase.BanishInfo.BanishPlace.Hand)?.Count ?? 0;
}
private static List<AIVirtualCard> GetFilterdBanishCardList(AIVirtualCard tagOwner, AIVirtualField field, List<int> playPtn, AISituationInfo situation, List<AIScriptTokenBase> argList, BattleCardBase.BanishInfo.BanishPlace place)
{
List<AIVirtualCard> banishedCards = field.CardListSet.BanishedCards;
if (banishedCards == null || banishedCards.Count <= 0)
{
return null;
}
SeparateArgListToFilterAndTimingArg(argList, out var filters, out var turnOrGame);
if (filters == null || filters.Count <= 0 || (turnOrGame != AIScriptTokenArgType.TURN && turnOrGame != AIScriptTokenArgType.GAME))
{
return null;
}
List<AIVirtualCard> list = AIFilteringUtility.MultipleFiltering(banishedCards, filters, tagOwner, playPtn, situation, isBlockDeadCard: false);
if (list == null || list.Count <= 0)
{
return null;
}
if (turnOrGame == AIScriptTokenArgType.TURN)
{
list.RemoveAll((AIVirtualCard c) => !c.IsBanishedTargetTurn(field.CurrentTurnCount));
}
list.RemoveAll((AIVirtualCard c) => c.BanishedInfo.Place != place);
return list;
}
private static void SeparateArgListToFilterAndTimingArg(List<AIScriptTokenBase> argList, out List<AIScriptTokenBase> filters, out AIScriptTokenArgType turnOrGame)
{
if (argList == null || argList.Count <= 0)
{
AIConsoleUtility.LogError("AIBanishSimulationUtility.SeparateArgListToFilterAndTimingArg() error!! argList is null!!");
filters = null;
turnOrGame = AIScriptTokenArgType.NONE;
return;
}
if (argList[argList.Count - 1] is AIScriptArgumentToken aIScriptArgumentToken)
{
turnOrGame = aIScriptArgumentToken.ArgumentType;
}
else
{
AIConsoleUtility.LogError("AIBanishSimulationUtility.SeparateArgListToFilterAndTimingArg() error!! lastToken is not ArgumentToken!!");
turnOrGame = AIScriptTokenArgType.NONE;
}
filters = argList.GetRange(0, argList.Count - 1);
}
}