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

135 lines
6.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Cute;
using UnityEngine;
using Wizard;
using Wizard.Battle.Resource;
using Wizard.Battle.UI;
using Wizard.Battle.View.Vfx;
public class Skill_evolve : SkillBase
{
public const float EVOLVE_STAGGER_TIME_AMOUNT = 0.05f;
protected List<BattleCardBase> _evolvedBySkill = new List<BattleCardBase>();
public Skill_evolve(SkillParameter skillPrm, string option)
: base(skillPrm, option)
{
}
public override VfxWithLoading Start(CallParameter parameter)
{
if (parameter.targetCards.Where((BattleCardBase c) => !c.IsEvolution).Count() == 0)
{
return NullVfxWithLoading.GetInstance();
}
ParallelVfxPlayer parallelVfxPlayer = ParallelVfxPlayer.Create();
ParallelVfxPlayer parallelVfxPlayer2 = ParallelVfxPlayer.Create();
ParallelVfxPlayer parallelVfxPlayer3 = ParallelVfxPlayer.Create();
ParallelVfxPlayer parallelVfxPlayer4 = ParallelVfxPlayer.Create();
_evolvedBySkill = parameter.targetCards.Where((BattleCardBase battleCardBase2) => battleCardBase2.CanEvolution(isSkill: true, isSelfBattlePlayer: true) && battleCardBase2.IsInplay).ToList();
if (IsBattleLog)
{
BattleLogManager.GetInstance().AddLogSkillEvolution(_evolvedBySkill, this);
}
base.SkillPrm.ownerCard.SelfBattlePlayer.CallOnBeforeSkillEvolve(base.SkillPrm.ownerCard, _evolvedBySkill);
float num = 0f;
int num2 = 0;
foreach (BattleCardBase card in parameter.targetCards)
{
if (!card.CanEvolution(isSkill: true, isSelfBattlePlayer: true) || !card.IsInplay)
{
continue;
}
Action enableAttackControlAction = null;
Action enableAttackTargettingMovementAction = null;
base.SkillPrm.ownerCard.SelfBattlePlayer.BattleMgr.VfxMgr.RegisterImmediateVfx(InstantVfx.Create(delegate
{
if (card.IsPlayer)
{
enableAttackControlAction = card.ForceAttackOff();
}
else
{
enableAttackTargettingMovementAction = card.BattleCardView._attackTargetSelectInfo.DisableAttackTargettingMovement();
}
}));
VfxWith<Func<GameObject>> loadResourcesVfxWithEffect = SkillEvolveVfx.LoadCardEvolveResources(card, base.SkillPrm.resourceMgr);
SequentialVfxPlayer sequentialVfxPlayer = SequentialVfxPlayer.Create(WaitVfx.Create(num));
BattleCardBase battleCardBase = card;
VfxWithLoading vfxWithLoading = CreateSkillEffect(base.SkillPrm.resourceMgr, battleCardBase.AsIEnumerable(), isFollowInHand: false, addToLastOperation: true, num2 > 0);
parallelVfxPlayer.Register(vfxWithLoading.LoadingVfx);
sequentialVfxPlayer.Register(vfxWithLoading.MainVfx);
bool evolveMeWhenAttack = (base.IsBeforAttackSkill && battleCardBase == base.SkillPrm.ownerCard) || (base.IsBeforeAttackSelfAndOtherSkill && battleCardBase != base.SkillPrm.ownerCard);
if (evolveMeWhenAttack)
{
base.SkillPrm.ownerCard.SelfBattlePlayer.CallOnEvolveMeWhenAttack(battleCardBase);
}
sequentialVfxPlayer.Register(card.Evolution(isSkill: true, parameter.skillProcessor, new SkillConditionCheckerOption(), (BattleCardBase evolvedCard, IBattleResourceMgr resourceMgr) => new SkillEvolveVfx(evolvedCard, resourceMgr, loadResourcesVfxWithEffect.Value, base.SkillPrm.ownerCard, evolveMeWhenAttack)));
parallelVfxPlayer3.Register(sequentialVfxPlayer);
parallelVfxPlayer2.Register(TurnOffAttackFrameVfx(card));
parallelVfxPlayer.Register(loadResourcesVfxWithEffect.Vfx);
parallelVfxPlayer4.Register(ToggleOffCantAttackVfx(card, enableAttackControlAction, enableAttackTargettingMovementAction));
num += 0.05f;
num2++;
}
RegisterEvolveTriggerSkill(parameter.skillProcessor, parameter.targetCards);
VfxBase vfxToRegister = UIManager.GetInstance().CreateNowLoadingVfx(parallelVfxPlayer);
VfxWithLoadingSequential vfxWithLoadingSequential = VfxWithLoadingSequential.Create(parallelVfxPlayer2, parallelVfxPlayer3, parallelVfxPlayer4);
vfxWithLoadingSequential.RegisterToLoadingVfx(vfxToRegister);
return vfxWithLoadingSequential;
}
private VfxBase TurnOffAttackFrameVfx(BattleCardBase evolvedCard)
{
return InstantVfx.Create(delegate
{
evolvedCard.BattleCardView._inPlayFrameEffect.HideFrameEffect();
});
}
private VfxBase ToggleOffCantAttackVfx(BattleCardBase evolvedCard, Action enableAttackControlAction, Action enableAttackTargettingMovementAction)
{
return InstantVfx.Create(delegate
{
enableAttackControlAction.Call();
enableAttackTargettingMovementAction.Call();
});
}
private void RegisterEvolveTriggerSkill(SkillProcessor skillProcessor, IEnumerable<BattleCardBase> targets)
{
List<BattleCardBase> list = base.SkillPrm.selfBattlePlayer.HandCardList.Where((BattleCardBase c) => c.Skills.Any((SkillBase s) => s.OnWhenEvolveOtherStart != 0 || s.OnWhenEvolveSelfAndOtherStart != 0)).ToList();
list.AddRange(base.SkillPrm.opponentBattlePlayer.HandCardList.Where((BattleCardBase c) => c.Skills.Any((SkillBase s) => s.OnWhenEvolveOtherStart != 0 || s.OnWhenEvolveSelfAndOtherStart != 0)));
list.AddRange(base.SkillPrm.selfBattlePlayer.ClassAndInPlayCardList.Where((BattleCardBase c) => c.Skills.Any((SkillBase s) => s.OnWhenEvolveOtherStart != 0 || s.OnWhenEvolveSelfAndOtherStart != 0)));
list.AddRange(base.SkillPrm.opponentBattlePlayer.ClassAndInPlayCardList.Where((BattleCardBase c) => c.Skills.Any((SkillBase s) => s.OnWhenEvolveOtherStart != 0 || s.OnWhenEvolveSelfAndOtherStart != 0)));
int i;
for (i = 0; i < list.Count; i++)
{
if (targets.Any((BattleCardBase t) => t != list[i]) && list[i].Skills.Any((SkillBase s) => s.OnWhenEvolveOtherStart != 0))
{
skillProcessor.Register(list[i].Skills.CreateWhenEvolveOtherInfo(targets.ToList(), skillProcessor, new BattlePlayerReadOnlyInfoPair(list[i].SelfBattlePlayer, list[i].OpponentBattlePlayer)));
}
if (list[i].Skills.Any((SkillBase s) => s.OnWhenEvolveSelfAndOtherStart != 0))
{
skillProcessor.Register(list[i].Skills.CreateWhenEvolveSelfAndOtherInfo(targets.ToList(), skillProcessor, new BattlePlayerReadOnlyInfoPair(list[i].SelfBattlePlayer, list[i].OpponentBattlePlayer)));
}
}
}
protected override bool IsSkipInduction(SkillProcessor.ProcessCallType callType)
{
if (!base.IsSkipInduction(callType))
{
if (base.ApplyingTargetFilter is SkillTargetSelfFilter && base.ApplyAndFilter.All((ApplySkillTargetFilterCollection f) => f.TargetFilter is SkillTargetSelfFilter))
{
return base.SkillPrm.ownerCard.IsEvolution;
}
return false;
}
return true;
}
}