namespace Vanguard.Rules.Cards; /// /// Логическая карта. Одна на имя: параллельные арты и переиздания ссылаются сюда через nameId. /// Лимит копий в колоде считается по этому объекту, а не по принту. /// public sealed record CardDefinition { public required string NameId { get; init; } public required string NameEn { get; init; } public string? NameRu { get; init; } public required CardType Type { get; init; } public required int Grade { get; init; } public required int Power { get; init; } public required int Shield { get; init; } public int Critical { get; init; } = 1; public TriggerType Trigger { get; init; } = TriggerType.None; public required Clan Clan { get; init; } /// Sentinel (Perfect Guard). Лимит — 4 карты в колоде. public bool IsSentinel { get; init; } /// Restraint: не может атаковать. public bool IsRestraint { get; init; } /// /// Явное переопределение печатной поддержки. null — по умолчанию: /// карты 0 и 1 ранга поддерживают, остальные нет. /// public bool? BoostOverride { get; init; } /// Печатная способность поддержки. Эффекты могут изменить её в рантайме. public bool HasBoost => BoostOverride ?? Grade <= 1; /// Явное переопределение печатного перехвата. null — по умолчанию 2 ранг. public bool? InterceptOverride { get; init; } /// Печатный перехват: по умолчанию у карт 2 ранга. public bool HasIntercept => InterceptOverride ?? Grade == 2; /// /// Может атаковать Арьергард в заднем ряду той же колонки (Wyvern Strike, Tejas). /// public bool CanSnipeBackRow { get; init; } /// /// Печатное число проверок при атаке из круга Авангарда: /// 0–2 ранг — одна, 3 ранг и выше — двойная. /// public int DefaultDriveChecks => Grade >= 3 ? 2 : 1; public string? TextEn { get; init; } public string? TextRu { get; init; } /// Grade 0 без триггера — кандидат в стартовый вэнгард. public bool IsStartingVanguardCandidate => Grade == 0 && Trigger == TriggerType.None; } /// Конкретный принт: номер + арт. Единица коллекции и бустера. public sealed record CardPrinting { public required string PrintingId { get; init; } public required string NameId { get; init; } public required Rarity Rarity { get; init; } public string? ImageKey { get; init; } /// Параллельный арт (BT01/S01…S12). public bool IsParallel { get; init; } /// Для параллельного арта — принт, к которому он привязан. public string? BasePrintingId { get; init; } }