79 lines
5.0 KiB
C#
79 lines
5.0 KiB
C#
|
|
namespace Theriapolis.GodotHost.UI;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 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 <c>class.skill_options</c> and
|
||
|
|
/// <c>background.skill_proficiencies</c> in <c>Content/Data</c>.
|
||
|
|
///
|
||
|
|
/// Labels and ability mapping mirror Theriapolis.Core.Rules.Stats.SkillId;
|
||
|
|
/// descriptions are ported verbatim from <c>src/data.jsx</c>'s
|
||
|
|
/// <c>SKILL_DESC</c> table in the React prototype. If the JSON schema
|
||
|
|
/// gains a description field later, swap to a data-driven lookup.
|
||
|
|
/// </summary>
|
||
|
|
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<string, string> 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<SkillEntry> ByAbility(string ability)
|
||
|
|
{
|
||
|
|
foreach (var s in All)
|
||
|
|
if (s.Ability == ability) yield return s;
|
||
|
|
}
|
||
|
|
}
|