Add Pathfinder 2e game system mode
All checks were successful
CI / check (push) Successful in 2m21s
CI / build-image (push) Successful in 24s

Implements PF2e as an alternative game system alongside D&D 5e/5.5e.
Settings modal "Game System" selector switches conditions, bestiary,
stat block layout, and initiative calculation between systems.

- Valued conditions with increment/decrement UX (Clumsy 2, Frightened 3)
- 2,502 PF2e creatures from bundled search index (77 sources)
- PF2e stat block: level, traits, Perception, Fort/Ref/Will, ability mods
- Perception-based initiative rolling
- System-scoped source cache (D&D and PF2e sources don't collide)
- Backwards-compatible condition rehydration (ConditionId[] → ConditionEntry[])
- Difficulty indicator hidden in PF2e mode (excluded from MVP)

Closes dostulata/initiative#19

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Lukas
2026-04-07 01:26:22 +02:00
parent 8f6eebc43b
commit e62c49434c
67 changed files with 27758 additions and 527 deletions

View File

@@ -64,7 +64,7 @@ export function useDifficultyBreakdown(): DifficultyBreakdown | null {
}
type CreatureInfo = {
cr: string;
cr?: string;
source: string;
sourceDisplayName: string;
};
@@ -87,10 +87,11 @@ function buildBreakdownEntry(
};
}
if (creature) {
const cr = creature.cr ?? null;
return {
combatant: c,
cr: creature.cr,
xp: crToXp(creature.cr),
cr,
xp: cr ? crToXp(cr) : null,
source: creature.sourceDisplayName ?? creature.source,
editable: false,
side,
@@ -132,7 +133,7 @@ function resolveCr(
getCreature: (id: CreatureId) => CreatureInfo | undefined,
): { cr: string | null; creature: CreatureInfo | undefined } {
const creature = c.creatureId ? getCreature(c.creatureId) : undefined;
const cr = creature ? creature.cr : (c.cr ?? null);
const cr = creature?.cr ?? c.cr ?? null;
return { cr, creature };
}