using Theriapolis.Core.Rules.Stats; namespace Theriapolis.Core.Rules.Combat; /// /// One attack a combatant can attempt — a weapon, a natural attack, or an /// NPC stat-block entry. Built once at combat-start; the resolver rolls /// against it. Distinct from , which is the /// per-attempt struct that bakes in attacker/defender/situation. /// public sealed record AttackOption { public string Name { get; init; } = ""; /// Total +N to add to the d20 attack roll. public int ToHitBonus { get; init; } public DamageRoll Damage { get; init; } = new(0, 0, 0, DamageType.Bludgeoning); /// Reach in tactical tiles. 1 = 5 ft. melee; 2 = 10 ft. polearm or Large reach. public int ReachTiles { get; init; } = 1; /// Short-range tiles for ranged attacks (0 = melee-only). public int RangeShortTiles { get; init; } = 0; /// Long-range tiles (disadvantage past short, can't fire past long). public int RangeLongTiles { get; init; } = 0; /// Crit-range threshold (default 20; razored weapons crit on 19+). public int CritOnNatural { get; init; } = 20; public bool IsRanged => RangeShortTiles > 0; }