using Vanguard.Rules.Cards; namespace Vanguard.Rules.Engine.Abilities; public enum AbilityTrigger { OnRideOver, OnPlace, OnBoost, OnPhaseStart, OnAttackDeclared, OnAttackHit, OnBoosted, OnDriveCheck, OnLeaveGuardian, OnDamageTaken, } /// Контекст сработавшей способности. public sealed class AbilityContext { public required GameEngine Engine { get; init; } public required CardInstance Source { get; init; } public required int Owner { get; init; } /// Второй участник события: новая карта при смене, усиленная карта при поддержке. public CardInstance? Other { get; init; } public Phase Phase { get; init; } public GameState State => Engine.State; public CardCatalog Catalog => Engine.State.Catalog; } public sealed class AbilityDefinition { public required AbilityTrigger Trigger { get; init; } public Func? Condition { get; init; } public required Action Resolve { get; init; } /// Проверка, что стоимость можно оплатить. public Func? CanPay { get; init; } /// Оплата стоимости перед разрешением. public Action? Pay { get; init; } /// «Вы можете» — движок спрашивает игрока перед разрешением. public bool Optional { get; init; } } /// Непрерывный эффект: пересчитывается при каждом запросе. public sealed class ContinuousAbility { public required Func Applies { get; init; } public Func? PowerBonus { get; init; } public Func? CriticalBonus { get; init; } } /// /// Активируемая способность: игрок сам объявляет её в Основной фазе. /// Стоимость (повернуть себя, сбросить карту) оплачивает движок по описанию. /// public sealed class ActivatedAbility { public required Func CanActivate { get; init; } public bool RestsSelf { get; init; } public bool RequiresDiscard { get; init; } /// Стоимость: уничтожить саму карту после оплаты. public bool RetiresSelf { get; init; } public required Action Resolve { get; init; } } public abstract class CardScript { public abstract string NameId { get; } public virtual IEnumerable Abilities => Array.Empty(); public virtual IEnumerable Continuous => Array.Empty(); public virtual IEnumerable Activated => Array.Empty(); } /// Сработавшая способность, ожидающая выбора порядка или решения игрока. public sealed class TriggeredAbility { public required AbilityDefinition Definition { get; init; } public required AbilityContext Context { get; init; } public int Owner => Context.Owner; }