namespace Theriapolis.GodotHost.UI; /// /// All 18 skills with display labels, governing ability, and codex /// flavor descriptions. Entries are keyed by their snake_case JSON id — /// the same string that appears in class.skill_options and /// background.skill_proficiencies in Content/Data. /// /// Labels and ability mapping mirror Theriapolis.Core.Rules.Stats.SkillId; /// descriptions are ported verbatim from src/data.jsx's /// SKILL_DESC table in the React prototype. If the JSON schema /// gains a description field later, swap to a data-driven lookup. /// public static class SkillsCatalog { public record SkillEntry(string JsonId, string Label, string Ability, string Description); public static readonly SkillEntry[] All = { new("acrobatics", "Acrobatics", "DEX", "Tumbling, balance, and the kind of footwork that keeps you upright on a coliseum sand-floor or a warren-rope. Body-cunning under pressure."), new("animal_handling", "Animal Handling", "WIS", "Reading and steering non-sentient beasts — feral hounds, draft-kine, the wild cousins of your own clade. Calming, herding, riding."), new("arcana", "Arcana", "INT", "Knowledge of the older magics: scent-sorcery, blood-sigil, the half-forgotten rites that pre-date the Covenant of Claws."), new("athletics", "Athletics", "STR", "Raw physical effort. Climbing scaffold, swimming the foul canal, hauling a packmate from the pit, breaking a hold."), new("deception", "Deception", "CHA", "Speaking convincingly past your scent. The art of the false posture, the planted rumor, the answer that is technically true."), new("history", "History", "INT", "The long memory of Theriapolis — the Imperium's fall, the Compact's ratification, which clade owes which other a centuries-old debt."), new("insight", "Insight", "WIS", "Reading another's true posture beneath their words. Catching the off-note in a snarl, the held breath, the lie in a friendly tail."), new("intimidation", "Intimidation", "CHA", "Bared-teeth diplomacy. The threat made plain enough that violence is not required to extract compliance."), new("investigation", "Investigation", "INT", "Methodical search and inference: scene-reading, document-sifting, the patient accumulation of small facts into a verdict."), new("medicine", "Medicine", "WIS", "Field surgery, poultice-craft, knowing which clade tolerates which tincture. Stabilizing the dying without finishing them."), new("nature", "Nature", "INT", "Knowledge of the wild outside the city wall — terrain, weather, plant-lore, and the unsigned beasts that observe no Covenant."), new("perception", "Perception", "WIS", "Awareness through every sense your clade gives you: ear-cock, scent-prickle, the half-glimpsed shape at the edge of vision."), new("performance", "Performance", "CHA", "Holding an audience — coliseum crowd, courtroom gallery, market square. Song, oratory, the body that compels watching."), new("persuasion", "Persuasion", "CHA", "Open-handed argument. The case made on its merits, the appeal to mutual benefit, the patient construction of agreement."), new("religion", "Religion", "INT", "The hymn-cycles of the Cervid liturgy, the Compact's sacred clauses, the small household rites your clade keeps without thinking."), new("sleight_of_hand", "Sleight of Hand", "DEX", "Quiet fingers — pickpocketing, palmed coins, the swap performed under another's nose. Useful in markets and courtrooms alike."), new("stealth", "Stealth", "DEX", "Movement unseen and unsmelled. Wind-checking, scent-suppression, the slow weight-shift on a creaking floor."), new("survival", "Survival", "WIS", "Field-craft beyond the wall: tracking, foraging, fire-making, knowing which run-off is safe to drink and which carries the upstream butcher's leavings."), }; public static readonly string[] Abilities = { "STR", "DEX", "CON", "INT", "WIS", "CHA" }; public static readonly System.Collections.Generic.Dictionary AbilityFullName = new() { { "STR", "Strength" }, { "DEX", "Dexterity" }, { "CON", "Constitution" }, { "INT", "Intellect" }, { "WIS", "Wisdom" }, { "CHA", "Charisma" }, }; public static SkillEntry? Get(string jsonId) => System.Array.Find(All, s => s.JsonId == jsonId); public static System.Collections.Generic.IEnumerable ByAbility(string ability) { foreach (var s in All) if (s.Ability == ability) yield return s; } }