Captures the pre-Godot-port state of the codebase. This is the rollback anchor for the Godot port (M0 of theriapolis-rpg-implementation-plan-godot-port.md). All Phase 0 through Phase 6.5 work is included; Phase 7 is in flight. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
5.5 KiB
Character Creation — Design Intent
This document captures the originally-planned design for the character
creation flow, extracted verbatim from the Phase 5 implementation plan
(theriapolis-rpg-implementation-plan-phase5.md §4.2). The current shipping
implementation deviates from it in one significant way (collapsed to a single
screen instead of a multi-step wizard) — both forms are valid; Design is free
to redesign in either direction.
From the Phase 5 plan, §4.2 (verbatim):
4.2 Character creation
Screen flow (single Myra panel, multi-step):
- Clade. Picker of 7 cards: Canidae / Felidae / Mustelidae / Ursidae / Cervidae / Bovidae / Leporidae. Each shows ability mods + 1-line trait summary.
- Species. Filtered to the selected clade. Shows size, ability mods, defining trait.
- Class. All 8. Shows hit die, primary ability, level-1 feature names. Recommends species/class fits (informational only — no restrictions).
- Background. All 12. Skill proficiencies + tool proficiencies + feature text. Mechanical effects of features are stubbed for Phase 5.
- Stats. Two methods, player choice:
- Standard array: 15, 14, 13, 12, 10, 8 (assignable). Default.
- Roll 4d6 drop lowest ×6, assign. Each Reroll press derives a fresh seed:
statRollSeed = worldSeed ^ RNG_STAT_ROLL ^ msSinceGameStartmsSinceGameStartis wall-clock ms since the process started.CharacterBuilder.RollAbilityScoresaccepts anulong? msOverride = nullparameter; when non-null, that value is used in place of the live ms snapshot. Tests use the override; the game does not. This gives true non-reproducibility across plays, reproducibility within tests, and worldseed-anchored variation.- Skills. Class lists
skillsChooseandskillOptions. Player picks N from the offered list (in addition to background's two free).- Name + confirm. Default "Wanderer". On confirm:
CharacterBuilderproduces aCharacter,ActorManager.SpawnPlayeris called with that character attached.Validation: every step's Next button is disabled until the field is valid.
CharacterBuilder.TryBuild(out string error)is the single canonical check.
What shipped vs. what was planned
The Phase 5 M2 implementation collapsed the 7-step wizard into a single panel with all selectors visible at once because:
- Defaults are sensible enough that pressing Confirm immediately produces a working character — no step is strictly required.
- All inputs are independent (changing class doesn't invalidate clade), so a wizard doesn't actually serialize anything.
- A single screen is faster to ship and easier to test in M2.
The data model and validation already support either presentation. A multi-step wizard with progressive disclosure (per the original plan) is a fully valid redesign target. So is a denser single-screen layout with better visual hierarchy. So is a hybrid (e.g. two screens: identity, then mechanics).
Constraints (don't redesign these out)
- Stats seeding rule — the formula
statRollSeed = worldSeed ^ RNG_STAT_ROLL ^ msSinceGameStartis locked. Each Reroll press must produce a new outcome (player rerolls for a better roll; we deliberately allow this rather than name-locking). Tests pin the seed via an override parameter. - Validation is canonical via
CharacterBuilder.Validate(out string error)— UI displays whatever message the builder produces; UI does not invent its own validation rules. - Skill count is class-driven —
ClassDef.SkillsChoosesays how many skills the player picks fromClassDef.SkillOptions. Background skills are added automatically and don't count toward this quota. - Stats are entered as a 6-value block and assigned to abilities — whether via Standard Array drag/click assignment or a 4d6 roll, the underlying data is six integers in (STR, DEX, CON, INT, WIS, CHA) order. Clade and species mods are applied AFTER assignment (in the builder), so the screen shows both the base value and the post-mod final.
- Name field is required and free-text. Default "Wanderer". No length cap enforced beyond Myra's TextBox default.
Out of scope for this design pass
- Hybrid characters (two parent clades). The data layer doesn't support them
yet (
Character.Cladeis a single ref) and they're explicitly Phase 6. - Subclass selection at character creation. The data is loaded but Phase 5 defers all subclass mechanics to Phase 5.5+.
- Backstory / personality fields beyond the suggested-personality string on each background.
- Save slot picker (separate flow —
SaveLoadScreen). - Multiplayer / co-op character creation.
What "good" looks like
A redesign that:
- Keeps "press Confirm immediately and get a working character" working — defaults are part of the contract.
- Surfaces clade traits, species traits, class level-1 features, and background features at the moment of selection (not buried two clicks away).
- Communicates the relationship between clade ability mods and species ability mods clearly (additive — both apply).
- Makes the difference between Standard Array and 4d6 rolling visually obvious so players don't accidentally lock in random rolls.
- Gives the rolled-stats path a "show previous roll for comparison" affordance.
- Shows the starting kit (weapons, armor, gear from
ClassDef.StartingKit) before the player commits.