108 lines
4.4 KiB
Markdown
108 lines
4.4 KiB
Markdown
# Roll-Your-Character Build Flow — Implementation Spec
|
|
|
|
This is the guided, dice-driven character creation flow referenced in the build
|
|
prompt. It should work for both a DM building a character for a player and a
|
|
player building their own, and the UI must tell the user exactly which die to
|
|
roll at each step (this is the whole point of the feature — it should feel like
|
|
rolling at a physical table, not filling out a form).
|
|
|
|
Model this as a state machine on `Character.buildStage` (see Prisma schema) with
|
|
the in-progress rolls/choices held in `Character.buildState` (JSON) until the
|
|
build is finalized, at which point the real columns (`species`, `characterClass`,
|
|
ability scores, proficiencies) get set and `buildStage` becomes `COMPLETE`.
|
|
|
|
## Step 1 — Roll Species (d6)
|
|
|
|
Tell the player: **"Roll a d6."** Then offer the choice(s) that result maps to.
|
|
Most rolls offer 2 species to pick between; keep the flavor text short.
|
|
|
|
| d6 Roll | Choose between |
|
|
|---|---|
|
|
| 1 | Human or Half-Elf |
|
|
| 2 | Elf or Gnome |
|
|
| 3 | Dwarf or Halfling |
|
|
| 4 | Dragonborn or Tiefling |
|
|
| 5 | Half-Orc or Orc |
|
|
| 6 | Wildcard — pick any species |
|
|
|
|
If the player rolls Half-Elf, immediately prompt for which two abilities (other
|
|
than Charisma) get the flexible +1 — this choice has to happen here, not be
|
|
silently defaulted (see GAME_RULES_REFERENCE.md).
|
|
|
|
## Step 2 — Roll Class (d8)
|
|
|
|
Tell the player: **"Roll a d8."**
|
|
|
|
| d8 Roll | Choose between |
|
|
|---|---|
|
|
| 1 | Fighter or Barbarian |
|
|
| 2 | Rogue or Ranger |
|
|
| 3 | Wizard or Sorcerer |
|
|
| 4 | Cleric or Paladin |
|
|
| 5 | Bard or Warlock |
|
|
| 6 | Druid or Monk |
|
|
| 7 | Reroll once, keep either result |
|
|
| 8 | Wildcard — pick any class |
|
|
|
|
## Step 3 — Roll Motivation (d6, optional flavor)
|
|
|
|
Tell the player: **"Roll a d6"** (optional — DM can skip this step for the whole
|
|
campaign via a campaign setting).
|
|
|
|
| d6 Roll | Motivation |
|
|
|---|---|
|
|
| 1 | Revenge for a past wrong |
|
|
| 2 | Seeking fortune or wealth |
|
|
| 3 | Protecting someone they love |
|
|
| 4 | Redemption for a past mistake |
|
|
| 5 | Driven by curiosity or knowledge |
|
|
| 6 | Duty or oath to a cause or order |
|
|
|
|
Store this as free text on the character (a `motivation` field, or fold it into
|
|
`notes`) — it's flavor, not a mechanical input.
|
|
|
|
## Step 4 — Roll Ability Scores
|
|
|
|
Standard method: **roll 4d6, drop the lowest die, sum the remaining 3** — six
|
|
times, once per ability (STR, DEX, CON, INT, WIS, CHA). Let the UI roll these
|
|
(server-side, so results can't be tampered with client-side) and then let the
|
|
player **assign** each of the six results to an ability score of their choice.
|
|
Show the running math live (base roll → + species bonus → final score →
|
|
modifier) as they assign, using the calculation module from
|
|
GAME_RULES_REFERENCE.md — don't let this drift out of sync with the sheet view.
|
|
|
|
## Step 5 — Skill & Save Proficiencies
|
|
|
|
Present the 18 skills with their governing ability (`seed-data/skills.json`) and
|
|
let the player check proficiencies — respect each class's normal "choose N
|
|
skills from list" limits if you want to be strict, or keep v1 permissive (DM can
|
|
always correct it). Saving throw proficiencies are **not** a choice — they're
|
|
fixed per class (`seed-data/classes.json`) and should just be set automatically.
|
|
|
|
## Step 6 — Starting Equipment
|
|
|
|
Pull `startingItemCount` and `startingSpellCount` from the campaign's settings
|
|
(DM configures these when creating/configuring the campaign — see
|
|
`Campaign.startingItemCount` / `Campaign.startingSpellCount` in the schema).
|
|
Let the player pick that many starting items from the campaign's weapon/item
|
|
pool and, if their class has spellcasting, that many starting spells from the
|
|
campaign's spell list.
|
|
|
|
## Step 7 — Finalize
|
|
|
|
Compute and freeze HP max (`currentHp = hpMax` on finalize), AC, initiative, and
|
|
all derived stats via the calculation module. Set `buildStage = COMPLETE`. From
|
|
this point the character sheet is editable directly (level up, stat changes,
|
|
inventory, notes) rather than walking the dice flow again.
|
|
|
|
## UI Notes
|
|
|
|
- Every step should show a big, obvious "Roll d_N_" button that triggers a
|
|
server-side roll (never trust a client-submitted roll result) and animates/
|
|
displays the die result before revealing the choice(s) it maps to.
|
|
- The DM should be able to build a character for a player using this exact same
|
|
flow (same component, different "who is this for" context) — don't build two
|
|
separate builders.
|
|
- Players building their own characters need the same flow, gated to campaigns
|
|
they're a member of.
|