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, } public enum TriggerContext { DriveCheck, DamageCheck, } /// Триггер, который ждёт выбора целей от владельца. 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 int TemporaryPower { get; set; } /// Временный бонус крита до конца текущего боя. public int TemporaryCritical { 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; } }