Characters: seed the current party sheets, add skill expertise

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>
This commit is contained in:
Frank
2026-10-04 12:50:24 +02:00
co-authored by Claude Opus 5.5
parent d4d8cae00f
commit 7a927e21a3
13 changed files with 196 additions and 13 deletions
+14
View File
@@ -42,6 +42,20 @@ class CharacterTest extends TestCase
self::assertSame(1, $c->skillModifier('Perception'));
}
public function testExpertiseDoublesProficiencyBonus(): void
{
$c = $this->darragh()->setSkillExpertise(['Stealth']);
// Dex 17 -> +3, expertise (2 x +2 prof) -> +7
self::assertSame(7, $c->skillModifier('Stealth'));
// Sleight of Hand stays plain proficient -> +5
self::assertSame(5, $c->skillModifier('Sleight of Hand'));
// Expertise alone implies proficiency
$c->setSkillProficiencies([])->setSkillExpertise(['Perception']);
self::assertSame(5, $c->skillModifier('Perception')); // Wis +1, 2 x +2
}
public function testSaveModifierAddsProficiencyOnlyWhenProficient(): void
{
$c = $this->darragh();