Add PF2e weak/elite creature adjustments with stat block toggle
All checks were successful
CI / check (push) Successful in 2m32s
CI / build-image (push) Successful in 19s

Weak/Normal/Elite toggle in PF2e stat block header applies standard
adjustments (level, AC, HP, saves, Perception, attacks, damage) to
individual combatants. Adjusted stats are highlighted blue (elite) or
red (weak). Persisted via creatureAdjustment field on Combatant.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lukas
2026-04-11 02:24:30 +02:00
parent a44f82127e
commit 09a801487d
18 changed files with 985 additions and 31 deletions

View File

@@ -128,6 +128,22 @@ A user wants to rename a combatant. Clicking the combatant's name immediately en
4. **Given** a bestiary combatant row and a custom combatant row, **When** the user clicks either combatant's name, **Then** the behavior is identical — inline edit mode is entered immediately in both cases.
**Story C4 — Name Updates on Weak/Elite Toggle (Priority: P2)**
When a PF2e weak/elite adjustment is toggled on a bestiary-linked combatant, the name automatically gains or loses a "Weak" or "Elite" prefix. Auto-numbered suffixes are preserved (e.g., "Goblin 2" → "Elite Goblin 2"). Toggling back to Normal removes the prefix. Existing auto-numbering of other combatants is not affected.
**Acceptance Scenarios**:
1. **Given** a combatant named "Iron Hag", **When** the DM toggles to "Elite", **Then** the name becomes "Elite Iron Hag".
2. **Given** a combatant named "Goblin 2", **When** the DM toggles to "Weak", **Then** the name becomes "Weak Goblin 2".
3. **Given** a combatant named "Elite Iron Hag", **When** the DM toggles back to "Normal", **Then** the name becomes "Iron Hag".
4. **Given** "Goblin 1" and "Goblin 2" exist, **When** the DM toggles "Goblin 1" to "Elite", **Then** it becomes "Elite Goblin 1" and "Goblin 2" is not renamed.
5. **Given** a combatant named "Elite Goblin 1", **When** the DM manually renames it to "Big Boss", **Then** the rename proceeds normally (manual names override the prefix convention).
---
### Clearing the Encounter
@@ -291,6 +307,12 @@ EditCombatant MUST preserve the combatant's position in the list, `activeIndex`,
#### FR-024 — Edit: UI
The UI MUST provide an inline name-edit mechanism for each combatant, activated by a single click on the name. Clicking the name MUST enter inline edit mode immediately — no delay, no timer, consistent for all combatant types. The name MUST display a `cursor-text` cursor on hover to signal editability. The updated name MUST be immediately visible after submission. The 250ms click timer and double-click detection logic MUST be removed entirely.
#### FR-041 — Edit: Weak/Elite name prefix
When a PF2e weak/elite adjustment is toggled on a bestiary-linked combatant (see `specs/004-bestiary/spec.md`, FR-101), the system MUST prepend "Weak " or "Elite " to the combatant's name, preserving any auto-numbered suffix. Toggling to "Normal" MUST remove the prefix. Switching directly between "Weak" and "Elite" MUST swap the prefix.
#### FR-042 — Edit: Prefix does not trigger re-numbering
Adding or removing a weak/elite prefix MUST NOT trigger auto-numbering recalculation for other combatants. "Goblin 1" becoming "Elite Goblin 1" does not cause "Goblin 2" to be renumbered.
#### FR-025 — ConfirmButton: Reusable component
The system MUST provide a reusable `ConfirmButton` component that wraps any icon button to add a two-step confirmation flow.
@@ -363,6 +385,7 @@ All domain events MUST be returned as plain data values from operations, not dis
- **ConfirmButton: two instances in confirm state simultaneously**: Each manages its own state independently.
- **ConfirmButton: combatant row re-renders while in confirm state**: Confirm state persists through re-renders as long as combatant identity is stable.
- **Name click behavior is uniform**: A single click on any combatant's name enters inline edit mode immediately. There is no gesture disambiguation (no timer, no double-click detection). Stat block access is handled via the dedicated book icon on bestiary rows (see `specs/004-bestiary/spec.md`, FR-062).
- **Weak/elite prefix on a manually renamed combatant**: If the user manually renames "Elite Goblin" to "Big Boss" and then toggles to Normal, the prefix "Elite " is not present to remove — the name "Big Boss" remains unchanged.
---