Files
SVSimServer/SVSim.BattleEngine/Engine/SkillFilterCollectionBase.cs
gamer147 0d9d8acae0 feat(battle-engine): M1 auto-copy closure (782 battle-logic files)
Compile-driven bulk-copy loop (tools/engine-port/m1_copy_loop.py) pulled the precise reference closure of the battle-core roots, stopping at the classify god-object/View-VFX-UI boundary. 782 files; no re-explosion (M0 had estimated ~order 1000). Residual frontier = 52 shim-classified + 80 external (Unity/BCL) types to author next.
2026-06-05 16:57:20 -04:00

105 lines
3.7 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Wizard;
using Wizard.Battle;
public class SkillFilterCollectionBase
{
private const int CAP_CARDFILTER = 6;
private bool _isSkipPrivateCardCheck;
public ISkillBattlePlayerFilter BattlePlayerFilter { get; set; }
public ISkillTargetFilter TargetFilter { get; set; }
public List<ISkillCardFilter> CardFilterList { get; private set; }
public ISkillSelectFilter SelectFilter { get; set; }
public void SetCardFilter(List<ISkillCardFilter> list)
{
CardFilterList = list;
}
protected bool IsPrivateCard(BattlePlayerReadOnlyInfoPair playerInfoPair, IEnumerable<IReadOnlyBattleCardInfo> cardInfos, SkillConditionCheckerOption checkerOption)
{
if (_isSkipPrivateCardCheck)
{
return false;
}
if (playerInfoPair.ReadOnlySelf.IsPlayer)
{
return false;
}
if (TargetFilter is SkillTargetGameLeftCardsFilter || TargetFilter is SkillTargetLeftThisTurnCardListFilter)
{
return false;
}
if (TargetFilter is SkillTargetInplayBuffingCardsFilter || TargetFilter is SkillTargetInplayDebuffingCardsFilter)
{
return false;
}
if (CardFilterList.Any((ISkillCardFilter f) => f is SkillFusionIngredientCardListFilter || f is SkillTargetDrewSkillFilter) || TargetFilter is SkillTargetFusionIngredientedCardListIncludeThisFusion || TargetFilter is SkillTargetFusionThisTurnCardList)
{
return false;
}
if (TargetFilter is SkillTargetGamePlayCardsOtherSelfFilter || TargetFilter is SkillTargetTurnPlayCardsOtherSelfFilter || TargetFilter is SkillTargetTurnSummonCardsFilter || TargetFilter is SkillTargetGameSummonCardsFilter || TargetFilter is SkillTargetGameSummonCardsOtherFilter)
{
return false;
}
if (TargetFilter is SkillTargetSelfFilter && CardFilterList.Any((ISkillCardFilter f) => f is SkillParameterLifeFilter))
{
return false;
}
if (TargetFilter is SkillTargetBurialRiteCardFilter)
{
return false;
}
if (BattleManagerBase.GetIns().XorShiftRandom(isSelf: true) != null && BattleManagerBase.GetIns().XorShiftRandom(isSelf: false) == null)
{
if (!cardInfos.All((IReadOnlyBattleCardInfo s) => (s.IsInHand && (checkerOption.LeftCards == null || checkerOption.LeftCards.IndexOf(s) == -1)) || s.IsInDeck))
{
return TargetFilter is SkillTargetBattleStartDeckFilter;
}
return true;
}
return false;
}
public SkillFilterCollectionBase(bool isSkipPrivateCardCheck = false)
{
CardFilterList = new List<ISkillCardFilter>(6);
SelectFilter = new SkillSelectAllFilter();
_isSkipPrivateCardCheck = isSkipPrivateCardCheck;
}
protected IEnumerable<IReadOnlyBattleCardInfo> FilteringBase(BattlePlayerReadOnlyInfoPair playerInfoPair, SkillConditionCheckerOption checkerOption, SkillOptionValue optionValue, bool isSkipPrivateCheck = false)
{
IEnumerable<IReadOnlyBattleCardInfo> enumerable = null;
if (BattlePlayerFilter == null)
{
enumerable = TargetFilter.Filtering(null, checkerOption);
}
else if (TargetFilter != null)
{
IEnumerable<IBattlePlayerReadOnlyInfo> battlePlayerInfos = BattlePlayerFilter.Filtering(playerInfoPair);
enumerable = TargetFilter.Filtering(battlePlayerInfos, checkerOption);
if (IsPrivateCard(playerInfoPair, enumerable, checkerOption) || isSkipPrivateCheck)
{
return enumerable;
}
}
foreach (ISkillCardFilter cardFilter in CardFilterList)
{
enumerable = cardFilter.Filtering(enumerable, optionValue);
}
if (enumerable != null)
{
IEnumerable<BattleCardBase> cards = enumerable.Cast<BattleCardBase>();
enumerable = SelectFilter.Filtering(cards, optionValue, checkerOption).Cast<IReadOnlyBattleCardInfo>();
}
return enumerable;
}
}