M6.18: Skill expansion to 5 per ability — 12 new Theriapolis-flavored skills

Skill list grows from 18 → 30 so every ability has 5 skills tied to it.
New skills appended at SkillId byte indices 18–29 to preserve
save-game compat with pre-M6.18 characters.

  STR (+4): Brawl, Build-Read, Force, Haulage
  DEX (+2): Driving, Marksmanship
  CON (+5): Endurance, Fortitude, Hardiness, Lung-Craft, Pain Tolerance
  CHA (+1): Scent-Speak

Endurance covers applied effort over time; Hardiness covers external
condition tolerance (temperature, smoke, altitude); Fortitude is
ingestion-only (poison, spoiled food, ritual draughts). Pain Tolerance
is function-while-wounded. Lung-Craft is breath/voice discipline.

Class skill_options updated across all 8 callings so every new skill
has 3+ class homes (Muzzle-Speaker remains the universal pick of
all 30). Backgrounds left untouched — their skill grants are
doc-canon and would benefit from a separate balancing pass.

CharacterBuilder.SkillToJsonName extended with explicit cases for the
new skills so compound enum names like BuildRead serialize as
"build_read" rather than the fallback "buildread" — caught by
CharacterBuilderTests.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Christopher Wiebe
2026-05-09 20:25:56 -07:00
parent 39117a09ed
commit 97b49d4145
4 changed files with 95 additions and 15 deletions
@@ -401,6 +401,19 @@ public sealed class CharacterBuilder
SkillId.SleightOfHand => "sleight_of_hand",
SkillId.Stealth => "stealth",
SkillId.Survival => "survival",
SkillId.Brawl => "brawl",
SkillId.BuildRead => "build_read",
SkillId.Driving => "driving",
SkillId.Endurance => "endurance",
SkillId.Force => "force",
SkillId.Fortitude => "fortitude",
SkillId.Hardiness => "hardiness",
SkillId.Haulage => "haulage",
SkillId.LungCraft => "lung_craft",
SkillId.Marksmanship => "marksmanship",
SkillId.PainTolerance => "pain_tolerance",
SkillId.ScentSpeak => "scent_speak",
_ => s.ToString().ToLowerInvariant(),
};