VanguardReMaster/server/src/Vanguard.Rules/Cards/CardDefinition.cs

64 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

namespace Vanguard.Rules.Cards;
/// <summary>
/// Логическая карта. Одна на имя: параллельные арты и переиздания ссылаются сюда через nameId.
/// Лимит копий в колоде считается по этому объекту, а не по принту.
/// </summary>
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; }
/// <summary>Sentinel (Perfect Guard). Лимит — 4 карты в колоде.</summary>
public bool IsSentinel { get; init; }
/// <summary>Restraint: не может атаковать.</summary>
public bool IsRestraint { get; init; }
/// <summary>
/// Явное переопределение печатной поддержки. null — по умолчанию:
/// карты 0 и 1 ранга поддерживают, остальные нет.
/// </summary>
public bool? BoostOverride { get; init; }
/// <summary>Печатная способность поддержки. Эффекты могут изменить её в рантайме.</summary>
public bool HasBoost => BoostOverride ?? Grade <= 1;
/// <summary>Явное переопределение печатного перехвата. null — по умолчанию 2 ранг.</summary>
public bool? InterceptOverride { get; init; }
/// <summary>Печатный перехват: по умолчанию у карт 2 ранга.</summary>
public bool HasIntercept => InterceptOverride ?? Grade == 2;
public string? TextEn { get; init; }
public string? TextRu { get; init; }
/// <summary>Grade 0 без триггера — кандидат в стартовый вэнгард.</summary>
public bool IsStartingVanguardCandidate => Grade == 0 && Trigger == TriggerType.None;
}
/// <summary>Конкретный принт: номер + арт. Единица коллекции и бустера.</summary>
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; }
/// <summary>Параллельный арт (BT01/S01…S12).</summary>
public bool IsParallel { get; init; }
/// <summary>Для параллельного арта — принт, к которому он привязан.</summary>
public string? BasePrintingId { get; init; }
}