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

189 lines
6.3 KiB
C#

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Wizard;
public static class AIBestFusionPatternCalculator
{
public static AIFusionSituationInfo CalculateBestFusionPattern(AIVirtualField field, AISinglePlayptnRecord playPtnRecord)
{
AIFusionSituationInfo aIFusionSituationInfo = null;
float num = 0f;
List<int> playPtn = playPtnRecord.PlayPtn;
List<float> collection = CalculateAllHandBonus(field, playPtnRecord);
float num2 = 0f;
if (playPtn == null || playPtn.Count <= 0)
{
num2 -= CalculateHandOverflowPenalty(field, null, null);
}
for (int i = 0; i < field.AllyHandCards.Count; i++)
{
AIVirtualCard aIVirtualCard = field.AllyHandCards[i];
if (!aIVirtualCard.TagCollectionContainer.HasTag(AIPlayTagType.Fusion) || !aIVirtualCard.IsFusionable)
{
continue;
}
AIFusionSituationInfo aIFusionSituationInfo2 = CreateFusionSituation(aIVirtualCard, field, playPtn);
float value = CalculateHandBonusForFusion(aIVirtualCard, field, playPtnRecord, aIFusionSituationInfo2, isIgnoreInFusion: true);
List<float> list = new List<float>(collection);
list[i] = value;
float num3 = list.Sum() + num2;
List<AIVirtualCard> fusionCandidates = GetFusionCandidates(aIVirtualCard, field, aIFusionSituationInfo2, playPtn);
if (fusionCandidates == null || fusionCandidates.Count <= 0)
{
continue;
}
int count = fusionCandidates.Count;
int num4 = (int)Mathf.Pow(2f, count);
AISelectedTargetInfo info = null;
bool flag = false;
for (int j = 1; j < num4; j++)
{
AISelectedTargetInfo aISelectedTargetInfo = new AISelectedTargetInfo(ConvertPatternIndexToList(fusionCandidates, j), TargetSelectType.NormalRuleBase);
aIFusionSituationInfo2.SetTarget(aISelectedTargetInfo, AIScriptTokenArgType.TARGET_SELECT);
float num5 = CalculateAfterFusionHandValue(aIFusionSituationInfo2, field, playPtnRecord, list) - num3;
if (num5 > num)
{
flag = true;
num = num5;
info = aISelectedTargetInfo;
}
}
if (flag)
{
aIFusionSituationInfo = aIFusionSituationInfo2;
aIFusionSituationInfo.SetTarget(info, AIScriptTokenArgType.TARGET_SELECT);
}
}
return aIFusionSituationInfo;
}
private static AIFusionSituationInfo CreateFusionSituation(AIVirtualCard actor, AIVirtualField field, List<int> playPtn)
{
AIFusionSituationInfo aIFusionSituationInfo = new AIFusionSituationInfo(actor, null);
if (!aIFusionSituationInfo.InitializeFusionParameter(field, playPtn))
{
return null;
}
return aIFusionSituationInfo;
}
private static List<AIVirtualCard> GetFusionCandidates(AIVirtualCard actor, AIVirtualField field, AIFusionSituationInfo fusion, List<int> playPtn)
{
List<AIVirtualCard> list = AIFilteringUtility.MultipleFiltering(field.AllyHandCards, fusion.Range, actor, playPtn, fusion);
if (list == null || list.Count <= 0)
{
return null;
}
list.Remove(actor);
return list;
}
private static List<AIVirtualCard> ConvertPatternIndexToList(List<AIVirtualCard> candidates, int patternIndex)
{
int num = patternIndex;
List<AIVirtualCard> list = new List<AIVirtualCard>();
int num2 = 0;
while (num > 0)
{
bool flag = num % 2 > 0;
num /= 2;
if (flag)
{
list.Add(candidates[num2]);
}
num2++;
if (num2 >= candidates.Count)
{
break;
}
}
return list;
}
private static List<float> CalculateAllHandBonus(AIVirtualField field, AISinglePlayptnRecord playPtnRecord)
{
List<float> list = new List<float>();
for (int i = 0; i < field.AllyHandCards.Count; i++)
{
float item = CalculateHandBonusForFusion(field.AllyHandCards[i], field, playPtnRecord, null, isIgnoreInFusion: false);
list.Add(item);
}
return list;
}
private static float CalculateAfterFusionHandValue(AIFusionSituationInfo fusion, AIVirtualField field, AISinglePlayptnRecord playPtnRecord, List<float> allHandBonusList)
{
float num = 0f;
List<int> playPtn = playPtnRecord.PlayPtn;
List<AIVirtualCard> targets = fusion.GetSituationTarget(AIScriptTokenArgType.TARGET_SELECT).Targets;
for (int i = 0; i < field.AllyHandCards.Count; i++)
{
AIVirtualCard aIVirtualCard = field.AllyHandCards[i];
if (!targets.Contains(aIVirtualCard))
{
num = ((!aIVirtualCard.IsSameCard(fusion.Actor)) ? (num + allHandBonusList[i]) : (num + CalculateHandBonusForFusion(aIVirtualCard, field, playPtnRecord, fusion, isIgnoreInFusion: true)));
}
}
num += fusion.Actor.GetFusionBonus(playPtn, fusion);
if (playPtn == null || playPtn.Count <= 0)
{
num -= CalculateHandOverflowPenalty(field, targets, fusion);
}
return num;
}
private static float CalculateHandBonusForFusion(AIVirtualCard card, AIVirtualField field, AISinglePlayptnRecord playPtnRecord, AIFusionSituationInfo fusion, bool isIgnoreInFusion)
{
List<int> playPtn = playPtnRecord.PlayPtn;
float num = card.GetHandBonus(playPtn, fusion, isIgnoreInFusion);
bool flag = false;
float num2 = card.Cost;
int num3 = field.AllyPp;
for (int i = 0; i < playPtnRecord.PlayedCardList.Count; i++)
{
PlayedCardInfo playedCardInfo = playPtnRecord.PlayedCardList[i];
if (playedCardInfo.Card.IsSameCard(card))
{
flag = true;
num2 = num3 - playedCardInfo.RestPp;
break;
}
num3 = playedCardInfo.RestPp;
}
if (flag)
{
num = 2f * (num + 2f);
}
return num - Mathf.Abs(num2 - (float)field.AllyPpTotal) * 0.01f;
}
private static float CalculateHandOverflowPenalty(AIVirtualField field, List<AIVirtualCard> fusionCandidates, AISituationInfo fusionSituation)
{
float num = 0f;
int num2 = field.AllyHandCards.Count;
if (fusionCandidates != null && fusionSituation != null && fusionSituation.ActionType == AIOperationType.FUSION)
{
num2 -= fusionCandidates.Count;
int fusionDrawCount = fusionSituation.Actor.GetFusionDrawCount(EnemyAI.EmptyPlayPtn, fusionSituation);
num2 += fusionDrawCount;
if (num2 > 9)
{
num += 2f * (float)(num2 - 9);
num2 = 9;
}
}
for (int i = 0; i < field.AllyInplayCards.Count; i++)
{
AIVirtualCard tagOwner = field.AllyInplayCards[i];
num2 += tagOwner.GetHandPlusCount(EnemyAI.EmptyPlayPtn);
}
if (num2 > 8)
{
num += 2f * (float)(num2 - 8);
}
return num;
}
}