VanguardReMaster/server/src/Vanguard.Rules/Engine/Abilities/Abilities.cs

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