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