# 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` `