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;
}