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>
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user