The party sheets in assets/characters/ changed: Darrah_Oakwanderer.pdf is
gone, replaced by Darragh Fermwyr (same halfling ranger, renamed and
updated), Owayn Fermwyr (stout halfling fighter, BJ) and Dunnchadh
(ghostwise halfling druid, Circle of the Blighted, Rick).
- app:character:seed now carries those three sheets, read from the PDFs'
form fields. Darragh's portrait is renamed to match his new name.
- New skill expertise field (double proficiency bonus), since Darragh's
Deft Explorer gives him +7 Stealth and the sheet had nowhere to show
it. Expertise implies proficiency; the sheet marks it with two dots,
the edit form gets a checkbox list next to skill proficiencies.
- Migration adds skill_expertise, backfilling existing rows with [] so
the NOT NULL JSON column works on tables that already have characters.
Tests: expertise math on the entity, and a catalog test that every seed
sheet hydrates into a Character that passes validation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the Characters placeholder with a real 5e character sheet
feature, following the same read-only-detail/edit-split/game-notes
pattern as NPCs and Enemies:
- Character entity: identity, combat vitals, six ability scores, saving
throw and skill proficiencies (computed modifiers, not stored), a
small attacks table, and the sheet's freeform boxes (features,
equipment, personality, appearance, backstory, allies, treasure).
- Detail page shows the portrait uncropped, then the sheet - genuine
<table>s for ability scores, skills and attacks, since that's the one
part of a character sheet that actually is a table; everything else
reuses the prose helpers from the enemy stat block. Game notes are
the only editable field here, same as Enemy/NPC.
- Edit page covers every field via CharacterType; the attack rows are
six plain inputs handled by hand (not a Symfony collection field),
since it's a short fixed-shape table, not a dynamic list.
- Portraits follow the NPC convention: assets/image/characters/<NameNo
Spaces>.png, computed path, not a DB column.
- Imported the example sheet from assets/characters/ (Darragh
Oakwanderer, halfling ranger) directly into the database.
Tests: entity math (ability/save/skill modifiers, passive perception,
portrait path), template rendering for show/edit/index (catches broken
Twig/macro/path()/asset() calls), and the login-gate redirect. 21/21
passing; schema validate clean.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Halfling daughter of Bramble and Poppy Thorn, younger sister of Wren.
Portrait cropped of its frame and downsized to 450px wide.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Players open a no-login link and see live cursors and dragged gear
pieces synced in real time, backed by a small Workerman WebSocket
relay (src/Command/PuzzleRelayCommand.php) run alongside symfony
serve - no Docker/Mercure hub needed. The board renders the wall
artwork with a spare-gears tray, and a "Reset puzzle" button (visible
only to logged-in users, verified server-side via a signed token) lets
the DM wipe the shared state for everyone.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 41 cut from the "Wren Thorn … Mira Rook" sheet (space-free names)
- removed 17 stale files that matched no NPC: the 16 hallucinated names
from the first sheet (CalenCooper, *Mill, *Reed) now superseded by the
real families, plus HiyHearth
assets/image/npc-pictures/ = 180 files, one per NPC.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 50 portraits cut from the "Sten Voss … Ralf Brewster" sheet
- 51 from the "Mara Brewster … Poppy Thorn" sheet (incl. one stray
"HiyHearth" the generator invented between Eli and May Hearth)
- existing 55 files renamed to remove spaces (Garrick Voss.png ->
GarrickVoss.png)
assets/image/npc-pictures/ now holds 156 files.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Cut from the contact sheet, one PNG per character named by the label
under each portrait. 39 match an existing NPC row; 16 (the extra Cooper
kids, the "Mill" family, the "Reed" block) have no matching NPC in the
database yet.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>