Files
TheriapolisV3/_design_handoff/character_creation/IMPLEMENTATION_STATUS.md
T
Christopher Wiebe b451f83174 Initial commit: Theriapolis baseline at port/godot branch point
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>
2026-04-30 20:40:51 -07:00

124 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.