using Vanguard.Rules.Cards; namespace Vanguard.Rules.Engine; public enum Phase { Mulligan, Stand, Draw, Ride, Main, Battle, End, } public enum Step { None, Guard, Drive, Trigger, Ability, Choice, } /// Вариант выбора, который предлагается игроку. public sealed record ChoiceOption(int Slot, string Label); /// Карта на поле: игрок и круг (-1 — Авангард). public sealed record UnitTarget(int Player, int Slot); /// /// Ожидание выбора игрока. Resolve получает индекс выбранного варианта. /// Пока выбор не сделан, движок не продолжает разрешение способности. /// public sealed class PendingChoice { public required int Player { get; init; } public required string Prompt { get; init; } public required IReadOnlyList Options { get; init; } public required Action Resolve { get; init; } } public enum TriggerContext { DriveCheck, DamageCheck, } /// Когда карта, находившаяся на поле, возвращается в колоду. public enum ReturnToDeckTiming { AfterBattle, EndOfTurn, } /// Триггер, который ждёт выбора целей от владельца. public sealed class PendingTrigger { public required int Player { get; init; } public required string PrintingId { get; init; } public required CardInstance Card { get; init; } public required TriggerType Trigger { get; init; } public required TriggerContext Context { get; init; } /// На drive check триггер сначала даёт +5000 силы, на damage check — нет. public required bool GrantsPower { get; init; } /// Сколько урона осталось раздать после этого триггера (контекст damage check). public int RemainingDamage { get; init; } } /// Экземпляр карты в партии. Один принт может встречаться много раз. public sealed class CardInstance { public required int Id { get; init; } public required string PrintingId { get; init; } /// Повёрнута ли карта (Rest). Актуально только для юнитов на поле. public bool Rested { get; set; } /// Открыта ли карта. Для урона — лицом вверх после Counter Blast. public bool FaceUp { get; set; } /// Модификаторы силы и крита с указанием источника и срока жизни. public List Modifiers { get; } = new(); /// Способности, выданные эффектами, а не напечатанные на карте. public List GrantedAbilities { get; } = new(); /// Запреты, выданные эффектами. public List Restrictions { get; } = new(); /// Вернуть карту в колоду после боя или в конце хода (Juggernaut, Lozenge). public ReturnToDeckTiming? ReturnToDeck { get; set; } /// /// Переопределение Сдерживания, выданное эффектом. /// null — как напечатано на карте. /// public bool? RestraintOverride { get; set; } /// /// Переопределение способности поддержки, выданное эффектом. /// null — как напечатано на карте. /// public bool? BoostOverride { get; set; } /// Переопределение перехвата, выданное эффектом. public bool? InterceptOverride { get; set; } /// Эффект разрешил перехватывать из заднего ряда. public bool InterceptFromBackRow { get; set; } /// /// Переопределение числа проверок, выданное эффектом. /// null — по умолчанию: 1 для 0–2 ранга, 2 для 3+, у Арьергарда 0. /// public int? DriveChecksOverride { get; set; } } public sealed class PlayerState { public PlayerState(string name) => Name = name; public string Name { get; } public List Deck { get; } = new(); public List Hand { get; } = new(); public CardInstance? Vanguard { get; set; } /// Пять кругов Арьергарда: 0–2 задний ряд, 3–4 передний (3 — левый, 4 — правый). public CardInstance?[] RearGuards { get; } = new CardInstance?[RearGuardSlots]; public const int RearGuardSlots = 5; public List Guardian { get; } = new(); public List Soul { get; } = new(); public List Damage { get; } = new(); public List Drop { get; } = new(); public List Trigger { get; } = new(); public bool IsDefeated { get; set; } }