namespace Theriapolis.Core.Rules.Stats; /// /// Saving-throw categories. There's exactly one per ability; this enum is /// a thin alias of kept distinct so callsites read /// clearly ("MakeSave(SaveId.DEX, dc)" vs "Mod(AbilityId.DEX)"). /// public enum SaveId : byte { STR = 0, DEX = 1, CON = 2, INT = 3, WIS = 4, CHA = 5, } public static class SaveIdExtensions { public static AbilityId Ability(this SaveId s) => (AbilityId)(byte)s; public static SaveId FromJson(string raw) => raw.ToUpperInvariant() switch { "STR" => SaveId.STR, "DEX" => SaveId.DEX, "CON" => SaveId.CON, "INT" => SaveId.INT, "WIS" => SaveId.WIS, "CHA" => SaveId.CHA, _ => throw new ArgumentException($"Unknown save: '{raw}'"), }; }