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