b451f83174
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>
124 lines
6.7 KiB
Markdown
124 lines
6.7 KiB
Markdown
# Character Creation — Implementation Status
|
||
|
||
**Last updated:** 2026-04-25
|
||
**Source design:** `from_design/` (React/HTML/CSS prototype produced by Claude Design)
|
||
**Implementation:** [Theriapolis.Game/Screens/CharacterCreationScreen.cs](../../Theriapolis.Game/Screens/CharacterCreationScreen.cs)
|
||
**Helpers:** [Theriapolis.Game/UI/CodexCopy.cs](../../Theriapolis.Game/UI/CodexCopy.cs) (skill / language / item / class-clade copy)
|
||
|
||
The React prototype in `from_design/` is the canonical design reference.
|
||
Keep it intact as a snapshot; this document records what the C# / Myra port
|
||
preserves, adapts, and defers.
|
||
|
||
## Faithful ports ✓
|
||
|
||
- **7-step wizard structure** — Clade → Species → Calling → History →
|
||
Abilities → Skills → Sign. Matches the design's `STEPS` array in `app.jsx`.
|
||
- **Stepper at top with locked / active / completed states** — uses ✓ / ✕
|
||
/ Roman numerals as visual marks. Locked steps are disabled buttons; the
|
||
user can always click backward to revisit completed folios.
|
||
- **Aside summary panel on the right** — name, lineage, calling+history,
|
||
abilities (with mods applied), skills counter. Updates live as the player
|
||
builds the character.
|
||
- **Validation contract** — every step has `ValidateStep(int) → string?`;
|
||
Next is disabled while the current step is invalid; Confirm is disabled
|
||
unless every step is valid. Messages match the design's vocabulary.
|
||
- **All four content collections** — clades, species, classes, backgrounds —
|
||
rendered from the same JSON the design used. Filtering rules (species
|
||
filtered to selected clade, skills filtered to class options) match.
|
||
- **Class↔clade recommendations** — the "★ Suits Clade" badge on the Calling
|
||
cards uses the same lookup table from the design's `CLASS_CLADE_REC`.
|
||
Informational only; doesn't gate selection.
|
||
- **Standard Array vs 4d6-drop-lowest** — both methods supported. The roll
|
||
seed formula `worldSeed ^ RNG_STAT_ROLL ^ msSinceGameStart` (locked by the
|
||
Phase 5 plan §4.2 / DESIGN_INTENT.md) is preserved; tests inject `msOverride`.
|
||
- **Auto-assign + Clear** — match the design's affordances. Auto-assign
|
||
honours already-pinned abilities and fills the rest from the pool by
|
||
class-primary priority.
|
||
- **Roll history** — last 3 prior rolls displayed when in roll mode (just
|
||
like the React prototype's "Previous rolls:" line).
|
||
- **Skills grouped by ability** — same layout. Background-sealed skills
|
||
are pre-checked and locked; class-pickable skills show a counter
|
||
("N / required chosen"); skills not on the class's offered list are
|
||
disabled with `[—]` markers.
|
||
- **Review step** — name input + summary blocks for lineage, calling+history,
|
||
final abilities, skills, starting kit. Each block has an "Edit ›" link
|
||
back to the relevant earlier step. Starting kit reads from
|
||
`ClassDef.StartingKit` (same as M3).
|
||
|
||
## Adapted (not 1:1, but functionally equivalent)
|
||
|
||
- **Drag-and-drop stat assignment → click-pick-then-click-place.** Myra
|
||
doesn't ship native drag-drop. The pool shows clickable value buttons; a
|
||
selected value is bracketed (`[15]`); the next ability slot click consumes
|
||
it. Click a filled slot to return its value to the pool. Same end state
|
||
as drag-drop; one extra click per assignment.
|
||
- **Hover popovers → "Selected" detail panel.** Trait/skill/feature
|
||
descriptions surface in the bottom of the aside panel when the relevant
|
||
card is clicked, instead of on hover. Myra has no rich tooltip system;
|
||
building one would mean a custom popup widget. Click-to-show is a
|
||
reasonable substitute for keyboard-and-controller futures too.
|
||
- **Card grid with wrapping → fixed-width buttons in rows of 2 or 3.**
|
||
Myra has no native flex-wrap container, so each step's grid is hand-laid
|
||
with `HorizontalStackPanel`s of fixed-width `TextButton`s. Each card
|
||
is a multi-line button (name on line 1, mods/stats on line 2,
|
||
features/traits on line 3). Less pretty than the design's framed cards
|
||
but information-equivalent.
|
||
- **Predator/prey clade grouping** — kept as section headers between
|
||
rows ("── Predators ──", "── Prey ──") instead of separately styled
|
||
groups, since Myra has no rich section-divider widget.
|
||
- **Folio numerals + "Codex of Becoming" header** — preserved as text
|
||
("Folio I of VII — Clade") even without serif fonts to render it
|
||
ceremonial. The aesthetic gap is the next item.
|
||
|
||
## Deferred (visual / aesthetic gap)
|
||
|
||
The React prototype's "illuminated codex" art direction —
|
||
parchment-paper background, gilded accents (`--gild`, `--seal`), serif
|
||
display fonts (Cormorant Garamond, Cinzel), monospace tags (JetBrains Mono),
|
||
section rules with ornament glyphs — is not portable to Myra without
|
||
custom theming work.
|
||
|
||
Myra theming requires:
|
||
1. A `theme.json` declaring colors + brushes
|
||
2. Custom `SpriteFont` builds for the serif/display fonts
|
||
3. Optional 9-slice background brushes for card frames
|
||
4. A `Stylesheet` instance the Desktop loads at startup
|
||
|
||
For M5 ship-point, the C# wizard uses Myra's default fonts + a
|
||
semi-transparent dark panel (`Color(15, 15, 25, 220)`). The visual polish
|
||
is M6+ theming work — when we tackle it, the design's `index.html`
|
||
`<style>` block (font choices, color variables, density tokens) is the
|
||
source of truth.
|
||
|
||
Specific gaps worth tracking:
|
||
- **No portrait component** (the design has a placeholder silhouette/heraldry
|
||
panel in the aside).
|
||
- **No "scent aura" highlight** behind selected cards.
|
||
- **No bonus pill with sourced popover** — bonus tags currently render as
|
||
text "(+1 from clade+species)" instead of clickable chips.
|
||
- **No language hover chips** — language list shows as a plain comma-
|
||
separated string.
|
||
- **No fonts that match the codex tone** — Myra default font only.
|
||
|
||
## Out of scope (matches the design's "Known caveats")
|
||
|
||
- **No save/load mid-creation** — wizard is in-memory; close before
|
||
confirm = start over. Same as the React prototype.
|
||
- **No subclass selection** — both implementations defer this to a level-up
|
||
flow; subclass features are filtered out of the displayed level-1 feature
|
||
list.
|
||
- **No tool/weapon proficiency display** — present in data, not surfaced.
|
||
- **No equipment substitution** — the starting kit is what the class config
|
||
says it is; player can't swap items at creation time.
|
||
|
||
## How to refresh this comparison
|
||
|
||
1. If Claude Design ships an updated prototype: replace the contents of
|
||
`from_design/` with the new zip, then update this file and the matching
|
||
sections of `IMPLEMENTATION_STATUS.md`.
|
||
2. If the C# implementation gains a feature from the "Deferred" list, move
|
||
that bullet up to "Faithful ports" or "Adapted".
|
||
3. If the underlying schema changes (e.g. a new field on `ClassDef`), refresh
|
||
the snapshot in `MANIFEST.md`'s file list and re-run the bundled refresh
|
||
command.
|