Applies the seven-campaign saga direction spec (021c248) to the docs it
was written to protect. No new milestone, no new content, no BOM line.
docs/roadmap.md — a "Guarded direction" section, and a ⛨ saga note on the
four milestones that would otherwise foreclose the shape:
M3 don't hardcode the title flow so a saga entry path can't be added
M4 keep construct()'s `creation` a plain Dictionary; the scene must not
become its only producer
M5 the level curve is no longer open — L20 across 7 tiers; enemy stat
blocks carry tier; no scaling multiplier, ever
M9 the save is two objects (Saga + Campaign); humiliations move to the
Saga or they die with the campaign
races-and-classes spec — the deferred "XP curve → M5" line now inherits the
ceiling rather than choosing one.
canon-roadmap — what the saga asks of content: a tier field when the
item/quest namespaces land, and a fixed-vs-variable mark on each BOM line
when the BOM is written. Tiers 2-7 and the other six kings go to the
Backlog.
Content build --check green; no generated content touched.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
233 lines
13 KiB
Markdown
233 lines
13 KiB
Markdown
# Races & Classes — mechanical design
|
||
|
||
**Date:** 2026-07-11
|
||
**Status:** Approved (design). Feeds M4 (character creation); combat kit hands off to M5.
|
||
**Charter refs:** §7 (Luck), §8 (stats & classes), §10 (combat), §11 (canon log), §16/§17 (mockups + the flagged reconciles).
|
||
|
||
This spec settles the **mechanics** of races and callings so M4 character creation has
|
||
rules to read. It resolves the §17 class-name reconcile (charter §8 vs the mock's
|
||
callings) and gives every race trait a concrete rule. **Lore/flavor is deliberately
|
||
out of scope** — it lives in a separate canon/worldbuilding effort; placeholders here
|
||
are marked `[CANON-TBD]`.
|
||
|
||
Scope choice (agreed): **full mechanical spec** — everything creation + the character
|
||
sheet read. The **combat ability kit is deferred to M5** (the action economy, damage
|
||
resolution, and DC bands aren't designed yet); this spec marks that seam everywhere it
|
||
touches it.
|
||
|
||
---
|
||
|
||
## 1. Foundations (the resolution spine)
|
||
|
||
### Attributes (6)
|
||
|
||
`STR · DEX · CON · FTH · MAG · LCK`. Modifier = `floor((score − 10) / 2)` (matches the
|
||
Character Sheet mock's "score N" + modifier display). FTH/MAG replace WIS/INT (§8).
|
||
|
||
### Saving throws (5, not 6)
|
||
|
||
One save per attribute **except LCK**. LCK is never a save and never rolled — it is the
|
||
borderline-selector (§7). Saves: **STR · DEX · CON · FTH · MAG**. This keeps §7 airtight:
|
||
LCK cannot leak onto the character sheet as a number.
|
||
|
||
### Resolution model — deterministic + Luck-selects-borderline
|
||
|
||
The check model §7 actually describes (chosen over a random d20, which would reintroduce
|
||
the per-roll variance §7 exists to remove):
|
||
|
||
```
|
||
check value = ability_mod + (proficiency_bonus if proficient) + situational
|
||
compare to a DC:
|
||
value − DC ≥ +band → success (deterministic, repeatable, plannable)
|
||
value − DC ≤ −band → failure (deterministic, repeatable)
|
||
within the band → LCK selects the branch (§7)
|
||
```
|
||
|
||
`band` size is **M5 tuning**. Consequences:
|
||
|
||
- **LCK is the only randomizer in the game.** Every other number is reproducible.
|
||
- Race/class features are **flat modifiers** that shift you across thresholds — never
|
||
dice, never advantage/disadvantage. (Mock talents using "advantage" language, e.g.
|
||
*Reckless Swing*, translate to flat mods.)
|
||
- **Death saves** become the purest expression of the model: a downed character sits in
|
||
the borderline band and **LCK selects** stabilize-vs-slip. No new system; reuses the
|
||
band; delivers §7's whole "am I cursed?" thesis at the highest-stakes moment.
|
||
|
||
### HP, MP, and the anti-spam gate
|
||
|
||
- **HP:** `L1 max HP = hit_die_max + CON_mod`. Per-class hit die (§4). Level curve → M5.
|
||
- **MP:** caster callings (FTH/MAG-primary) get an MP pool sized off their casting stat;
|
||
martials have **0 MP**. Pool formula + spell costs → M5.
|
||
- **The spam-gate is the action economy, not MP.** One **Action** + one **Bonus** + one
|
||
**Move** per turn (§10) caps everyone at one big thing per turn. On top of that:
|
||
- **Casters** spend **MP** — a *depleting reservoir* (decision: attrition — dump or ration).
|
||
- **Martials** use **cooldowns** — a *recharging cadence* (decision: rhythm — is it back yet?).
|
||
- Basic attack is the free, repeatable option; signature abilities compete for the one Action.
|
||
|
||
This is why §10 says the tactics live "in the action economy and resources, not the map."
|
||
With no grid, decisions live in what you spend your Action on and whether your good options
|
||
are available (MP left / cooldown ready).
|
||
|
||
### Proficiency bonus
|
||
|
||
+2 at level 1 (mock). Scales with level — curve deferred (creation is L1 only).
|
||
|
||
---
|
||
|
||
## 2. The six attributes — roles + skill map
|
||
|
||
Adopts the mock's **9 skills verbatim**. LCK owns no save, no skill, no display.
|
||
|
||
| Attr | Save | Skills | Combat role | Out-of-combat (§8) |
|
||
|---|---|---|---|---|
|
||
| **STR** | STR | Athletics, Intimidation | Melee attack + damage | Carry, forcing things |
|
||
| **DEX** | DEX | Stealth, Sleight of Hand, Acrobatics | Initiative, finesse/ranged attack, light-armor AC | Sleight, escape |
|
||
| **CON** | CON | Endurance | HP pool | Resist poison / exhaustion / infection (affliction track) |
|
||
| **FTH** | FTH | Perception, Faith-Lore | Divine casting, spell DC | Conviction in dialogue, awareness |
|
||
| **MAG** | MAG | Sorcery | Arcane casting, spell DC | Recall, deduction |
|
||
| **LCK** | — | — | Selects borderline branches, crit thresholds | Fires Improviser; boon vs humiliation |
|
||
|
||
- **Perception under FTH** (not a standalone WIS) honors §8's FTH/MAG-replace-WIS/INT — a
|
||
Priest/Bonesetter is also the party's best lookout, giving FTH its out-of-combat teeth.
|
||
- **Death saves = LCK** (see §1).
|
||
|
||
**Flags (adopting the mock as-is, noting thinness — not expanding now):**
|
||
|
||
- MAG has only 1 skill (Sorcery), CON only 1 (Endurance). §8 says MAG governs recall/
|
||
deduction — an "Arcana/Lore" skill would fit. **Deferred** to a later content pass.
|
||
- **SPEED** (mock's 30', "Old Knee −5") has no grid to matter on (§10) → treated as
|
||
**narrative-only flavor** (chases/fleeing in prose), not a tactical value.
|
||
|
||
---
|
||
|
||
## 3. Races (4)
|
||
|
||
Under **features only, no stat mods**, and **flat modifiers**. Each race = one headline
|
||
feature with real teeth + one minor feature. All upside; downsides live in flavor.
|
||
|
||
**Nightsight ruling** (resolves darkvision/low-light with no light grid): the character
|
||
**ignores darkness-based penalties on checks** — a situational flat modifier (others take
|
||
−X in the dark, you take 0). Bites on the DM's exploration awareness checks.
|
||
|
||
| Race | Headline feature | Minor feature | Mock trait resolved |
|
||
|---|---|---|---|
|
||
| **Human** | **+1 to all 5 saves** | **+1 skill proficiency of choice** at creation | "+1 to every save" |
|
||
| **Elf** | **Perception proficiency** (+2) | **Nightsight** | "low-light sight · keen senses" |
|
||
| **Dwarf** | **+2 to CON saves vs poison & the infection/affliction track** (may also halve duration) | **Nightsight** | "poison resist · darkvision" |
|
||
| **Beastfolk** | **Natural claws** — innate unarmed attack (STR or DEX, light-weapon damage, always available even disarmed/grappled) | **Keen scent** — flat situational bonus to detect hidden / track by smell | "natural claws · keen scent" |
|
||
|
||
- **Dwarf's resist maps onto the mock's own affliction track** ("Infected Bite: CON save
|
||
each dawn") — the character who shrugs off the rot the gritty tone (§3) inflicts.
|
||
- **Beastfolk is the only race with a combat-*action* feature** (claws) — the aggressive pick.
|
||
- **No race touches an attribute score** — keeps the point-buy pure.
|
||
- **Human's bonus skill** is an addition beyond the mock's bare "+1 all saves" (agreed:
|
||
keep it) so Human = "the adaptable one" with an actual creation choice.
|
||
- **Beastfolk's "taxed twice at every gate"** (a mechanical shop/disposition downside) is
|
||
**deferred** to the canon session + the shop economy (M8). Race mechanics stay
|
||
upside-only for now.
|
||
|
||
---
|
||
|
||
## 4. Callings (7)
|
||
|
||
The full charter-7 (§8), gritty calling names (§17 reconcile resolved in favor of the
|
||
mock's village-names, which honor §8's "named for the role in the world" better than
|
||
§8's own list). Two need names from the canon session — marked `[CANON-TBD]`.
|
||
|
||
Static kit only — **the combat ability kit (the bar) is deferred to M5.** This is what
|
||
creation + the character sheet read.
|
||
|
||
| Calling | Archetype | Primary | Hit die | Save profs | Skill profs | Resource | Armor | L1 talent (stub) |
|
||
|---|---|---|---|---|---|---|---|---|
|
||
| **Sellsword** | Fighter | STR | d10 | STR, CON | 2 | Cooldowns | Heavy | **Second Wind** — once/rest, claw back HP |
|
||
| **[CANON-TBD]** ⚔ | Barbarian | STR | d12 | STR, CON | 2 | Cooldowns | Medium | **Blood Fury** — rage: soak + hit harder, per-encounter |
|
||
| **Cutpurse** | Rogue | DEX | d8 | DEX, MAG | 4 | Cooldowns | Light | **Backstab** — bonus dmg vs an unaware/first-strike target |
|
||
| **Trapper** | Ranger | DEX | d10 | DEX, CON | 3 | Cooldowns | Light | **Set Snare** — place a control trap, cooldown |
|
||
| **Hedge-Mage** | Wizard | MAG | d6 | MAG, FTH | 2 | MP (MAG) | None | **Hexbolt** — signature MP-free arcane basic |
|
||
| **Bonesetter** | Cleric | FTH | d8 | FTH, CON | 2 | MP (FTH) | Medium | **Mend** — heal HP, gritty field-medic |
|
||
| **[CANON-TBD]** 🔥 | Warlock | FTH | d8 | FTH, MAG | 2 | MP (FTH) | Light | **Pact Mark** — curse a target, FTH/MP |
|
||
|
||
- **Two STR martials differentiated by shape, not stat:** Sellsword = disciplined, heavy
|
||
armor + d10 + sustain (Second Wind); the Barbarian-calling = reckless, d12 + medium
|
||
armor + rage (soak via fury, not plate). Same primary, opposite feel.
|
||
- **Cutpurse gets 4 skills** (breadth is the rogue's identity); Trapper 3; others 2. Drawn
|
||
from the class's stat-appropriate slice of the 9-skill list, plus what race grants.
|
||
- **Casters** (Hedge-Mage / Bonesetter / Warlock-calling) have **MP**; martials have 0 and
|
||
live on cooldowns. MP pool formula → M5.
|
||
- **Backstab** — the mock's "advantage" phrasing becomes a **flat bonus vs an unaware/
|
||
first-strike target** under the resolution model; no positioning needed, fits gridless (§10).
|
||
- **Trapper is a pure martial** (traps = cooldown gadgets, no MP) — the D&D half-caster
|
||
ranger is deliberately not ported, to keep spell math out of the POC.
|
||
- **Armor categories** (Heavy/Medium/Light/None) are proficiency categories; specific gear
|
||
comes from origin grants + the item system (M7).
|
||
- **L1 talents are stubs** — full kit at M5.
|
||
|
||
---
|
||
|
||
## 5. Character-creation integration (M4) + canon-log contract
|
||
|
||
Folds into the proven point-buy model (rolled base + additive spend, LCK hidden).
|
||
|
||
**Order of operations:**
|
||
|
||
1. **Roll base attributes** — 3d6 with floors per stat. **LCK rolled hidden** (avg of 5 +
|
||
origin `luck_modifier`, §7) — never shown.
|
||
2. **Spend the +3 additive pool** — additive only; LCK untouchable.
|
||
3. **Apply race** — features only, no stat mods (saves / skill profs / Nightsight / claws).
|
||
4. **Apply calling** — hit die → `HP = hit_die_max + CON_mod`; save profs; skill profs; MP
|
||
pool if caster (from casting stat); armor category; L1 talent.
|
||
5. **Origin overlays** — `build_constraints.allowed_classes` gates offered callings;
|
||
`luck_modifier` → LCK; inventory/disposition grants.
|
||
|
||
**Derived at creation** (all deterministic): HP, MP, AC (base + armor + DEX), the 5 saves,
|
||
9 skills, initiative (DEX), spell DC for casters (`8 + prof + casting_mod`), prof bonus +2.
|
||
|
||
**Two contract migrations this forces (flagged, do them at M4, not silently):**
|
||
|
||
- **Canon log gains a `race` field.** §11's player block is `{name, class, luck_descriptor}`
|
||
today; the Narrator/NPC need `race` to describe the player. Small schema bump to the M0
|
||
contract (`docs/schemas/canon-log.schema.json`). The full mechanical sheet stays in client
|
||
`GameState` — the canon log carries only what the AI narrates from (name, **race**, class,
|
||
luck_descriptor).
|
||
- **The deserter origin is stale.** `content/origins/deserter.json` has
|
||
`allowed_classes: ["sellsword","assassin","priest"]` — old charter names. Migrate to the
|
||
new calling ids (`cutpurse`/`bonesetter`/etc.) and the 7-calling roster. Origins gate
|
||
races only if they choose to (`allowed_races` omitted = all).
|
||
|
||
Creation stays **100% deterministic except the hidden LCK roll** — every derived number is
|
||
reproducible from the choices, which is exactly what §10's per-encounter seeding needs.
|
||
Character creation is the first place seeding matters.
|
||
|
||
---
|
||
|
||
## 6. Explicitly deferred (the seams)
|
||
|
||
Nothing here silently pre-empts a later brainstorm.
|
||
|
||
**→ M5 (combat):**
|
||
- Full ability kits / the bar; MP pool formula + spell + cooldown costs.
|
||
- The **damage-determinism reconcile** (§7/§10 vs the Combat HUD mock's ranges).
|
||
- The **borderline band size** (DC bands).
|
||
- Leveling — hit-die progression, prof-bonus scaling, talent tiers, XP curve. (Creation is L1.)
|
||
**The ceiling is no longer open:** the seven-campaign saga
|
||
([spec](2026-07-12-character-reuse-seven-arc-design.md)) fixes it at **L20 across 7
|
||
tiers** (tier N ≈ levels 3N−2 … 3N). M5 designs the curve *to* that ceiling; it does
|
||
not choose it. An open-ended curve is unsolvable and forecloses the saga.
|
||
|
||
**→ Canon session (lore):**
|
||
- The two **[CANON-TBD]** calling names (Barbarian ⚔ / Warlock 🔥).
|
||
- All race/calling flavor, descriptions, origin fragments.
|
||
- The **beastfolk social tax** (mechanical downside, ties to M8 shop).
|
||
|
||
**→ Later content pass:**
|
||
- MAG/CON skill thinness (an Arcana/Lore skill).
|
||
- SPEED as narrative-only flavor.
|
||
|
||
---
|
||
|
||
## §2 accounting
|
||
|
||
Every system here is **state** (code owns it). Races and callings are code-owned data the
|
||
AI only *narrates from* — the canon log's new `race` field is the sole text-facing surface,
|
||
and it carries a value code decided. No AI system mutates any of this. Consistent with §2.
|