Replace the stagnant Pf2eTools bestiary with Foundry VTT PF2e system data (github.com/foundryvtt/pf2e, v13-dev branch). This gives us 4,355 remaster-era creatures across 49 sources including Monster Core 1+2 and all adventure paths. Changes: - Rewrite index generation script to walk Foundry pack directories - Rewrite PF2e normalization adapter for Foundry JSON shape (system.* fields, items[] for attacks/abilities/spells) - Add stripFoundryTags utility for Foundry HTML + enrichment syntax - Implement multi-file source fetching (one request per creature file) - Add spellcasting section to PF2e stat block (ranked spells + cantrips) - Add saveConditional and hpDetails to PF2e domain type and stat block - Add size and rarity to PF2e trait tags - Filter redundant glossary abilities (healing when in hp.details, spell mechanic reminders, allSaves duplicates) - Add PF2e stat block component tests (22 tests) - Bump IndexedDB cache version to 5 for clean migration Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
76 lines
1.8 KiB
TypeScript
76 lines
1.8 KiB
TypeScript
import type {
|
|
Pf2eBestiaryIndex,
|
|
Pf2eBestiaryIndexEntry,
|
|
} from "@initiative/domain";
|
|
|
|
import rawIndex from "../../../../data/bestiary/pf2e-index.json";
|
|
|
|
interface CompactCreature {
|
|
readonly n: string;
|
|
readonly s: string;
|
|
readonly lv: number;
|
|
readonly ac: number;
|
|
readonly hp: number;
|
|
readonly pc: number;
|
|
readonly sz: string;
|
|
readonly tp: string;
|
|
readonly f: string;
|
|
readonly li: string;
|
|
}
|
|
|
|
interface CompactIndex {
|
|
readonly sources: Record<string, string>;
|
|
readonly creatures: readonly CompactCreature[];
|
|
}
|
|
|
|
function mapCreature(c: CompactCreature): Pf2eBestiaryIndexEntry {
|
|
return {
|
|
name: c.n,
|
|
source: c.s,
|
|
level: c.lv,
|
|
ac: c.ac,
|
|
hp: c.hp,
|
|
perception: c.pc,
|
|
size: c.sz,
|
|
type: c.tp,
|
|
};
|
|
}
|
|
|
|
let cachedIndex: Pf2eBestiaryIndex | undefined;
|
|
|
|
export function loadPf2eBestiaryIndex(): Pf2eBestiaryIndex {
|
|
if (cachedIndex) return cachedIndex;
|
|
|
|
const compact = rawIndex as unknown as CompactIndex;
|
|
cachedIndex = {
|
|
sources: compact.sources,
|
|
creatures: compact.creatures.map(mapCreature),
|
|
};
|
|
return cachedIndex;
|
|
}
|
|
|
|
export function getAllPf2eSourceCodes(): string[] {
|
|
const index = loadPf2eBestiaryIndex();
|
|
return Object.keys(index.sources);
|
|
}
|
|
|
|
export function getDefaultPf2eFetchUrl(
|
|
_sourceCode: string,
|
|
baseUrl?: string,
|
|
): string {
|
|
if (baseUrl !== undefined) {
|
|
return baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
}
|
|
return "https://raw.githubusercontent.com/foundryvtt/pf2e/v13-dev/packs/pf2e/";
|
|
}
|
|
|
|
export function getCreaturePathsForSource(sourceCode: string): string[] {
|
|
const compact = rawIndex as unknown as CompactIndex;
|
|
return compact.creatures.filter((c) => c.s === sourceCode).map((c) => c.f);
|
|
}
|
|
|
|
export function getPf2eSourceDisplayName(sourceCode: string): string {
|
|
const index = loadPf2eBestiaryIndex();
|
|
return index.sources[sourceCode] ?? sourceCode;
|
|
}
|