import generatedCatalog from "./generated/manastormCatalog.json"; export type ManastormReferenceStatus = "resolved" | "unresolved"; export type ManastormReferenceKind = "map" | "encounter" | "creature" | "spell" | "icon"; export interface ManastormDbcHeader { readonly recordCount: number; readonly fieldCount: number; readonly recordSize: number; readonly stringBlockSize: number; } export interface ManastormCatalogSource { readonly role: string; readonly path: string; readonly sha256: string; readonly byteLength: number; readonly dbc: ManastormDbcHeader; } export interface ManastormCatalogProvenance { readonly importerVersion: string; readonly generatedFrom: readonly string[]; readonly sources: readonly ManastormCatalogSource[]; } export interface ManastormCatalogCounts { readonly sourceRows: number; readonly maps: number; readonly encounters: number; readonly modifiers: number; readonly groupModifiers: number; readonly messages: number; readonly spellRecords: number; readonly spellIconRecords: number; readonly resolvedMessageIcons: number; readonly unresolvedMessageIcons: number; readonly validationIssues: number; } export interface ManastormValidationIssue { readonly severity: "warning" | "error"; readonly code: string; readonly source: string; readonly recordId: number; readonly field: string; readonly value: string | number | null; readonly message: string; } export interface ManastormUnresolvedReference { readonly kind: Exclude; readonly status: "unresolved"; readonly id: null; readonly reason: string; readonly sourceEncounterId?: number; readonly candidateSpellCount?: number; readonly basename?: string; } export interface ManastormResolvedIconReference { readonly kind: "icon"; readonly status: "resolved"; readonly basename: string; readonly spellIconIds: readonly number[]; readonly paths: readonly string[]; readonly sha256?: string; readonly resolutionSource: "SpellIcon.dbc" | "installed-icon-file"; } export interface ManastormResolvedCreatureReference { readonly kind: "creature"; readonly status: "resolved"; readonly id: number; readonly sourceEncounterId: number; readonly source: "DungeonEncounterExtra.dbc"; } export type ManastormIconReference = | ManastormResolvedIconReference | ManastormUnresolvedReference; export type ManastormCreatureReference = | ManastormResolvedCreatureReference | ManastormUnresolvedReference; export interface ManastormMapCatalogEntry { readonly id: string; readonly mapId: number; readonly name: string; readonly directory: string; readonly instanceType: number; readonly flags: number; readonly expansionId: number; readonly maxPlayers: number; readonly sourceRowIds: readonly string[]; readonly encounterIds: readonly string[]; } export interface ManastormEncounterCatalogEntry { readonly id: string; readonly encounterId: number; readonly mapIds: readonly number[]; readonly modeIds: readonly number[]; readonly sourceRowIds: readonly string[]; readonly creatureReference: ManastormCreatureReference; readonly spellReference: ManastormUnresolvedReference; readonly iconReference: ManastormUnresolvedReference; } export interface ManastormSourceRow { readonly id: string; readonly sourceRecordId: number; readonly mapId: number; readonly mapCatalogId: string; readonly modeId: number; readonly encounterId: number; readonly encounterCatalogId: string; readonly scalars: readonly [number, number, number, number, number]; } export interface ManastormModifier { readonly id: string; readonly sourceRecordId: number; readonly modeId: number; readonly level: number; readonly tuning: readonly [ number, number, number, number, number, number, number, number, number, number, number, ]; readonly rawFlag: number; } export interface ManastormGroupModifier { readonly id: string; readonly sourceRecordId: number; readonly playerCount: number; readonly modeId: number; readonly multipliers: readonly [number, number]; } export interface ManastormMessage { readonly id: string; readonly sourceRecordId: number; readonly modeId: number; readonly progressionValue: number; readonly groupId: number; readonly iconReference: ManastormIconReference; readonly spellReference: ManastormUnresolvedReference; readonly title: string; readonly description: string; readonly titleFlags: number; readonly descriptionFlags: number; } export interface ManastormCatalog { readonly schemaVersion: 1; readonly catalogId: "ascension-manastorm-installed-client"; readonly provenance: ManastormCatalogProvenance; readonly counts: ManastormCatalogCounts; readonly referencePolicy: Readonly>; readonly validationIssues: readonly ManastormValidationIssue[]; readonly maps: readonly ManastormMapCatalogEntry[]; readonly encounters: readonly ManastormEncounterCatalogEntry[]; readonly sourceRows: readonly ManastormSourceRow[]; readonly modifiers: readonly ManastormModifier[]; readonly groupModifiers: readonly ManastormGroupModifier[]; readonly messages: readonly ManastormMessage[]; } export const MANASTORM_CATALOG = generatedCatalog as unknown as ManastormCatalog; const mapById = new Map(MANASTORM_CATALOG.maps.map((map) => [map.mapId, map])); const encounterById = new Map( MANASTORM_CATALOG.encounters.map((encounter) => [encounter.encounterId, encounter]), ); const sourceRowsByMapId = new Map(); for (const row of MANASTORM_CATALOG.sourceRows) { const rows = sourceRowsByMapId.get(row.mapId) ?? []; rows.push(row); sourceRowsByMapId.set(row.mapId, rows); } export function installedManastormMapById(mapId: number): ManastormMapCatalogEntry | null { return mapById.get(mapId) ?? null; } export function installedManastormEncounterById( encounterId: number, ): ManastormEncounterCatalogEntry | null { return encounterById.get(encounterId) ?? null; } export function installedManastormRowsForMap(mapId: number): readonly ManastormSourceRow[] { return sourceRowsByMapId.get(mapId) ?? []; }