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.
|