Files
healer-man/src/game/manastormCatalog.ts
T
2026-08-14 15:56:39 -04:00

206 lines
6.1 KiB
TypeScript

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<ManastormReferenceKind, "map" | "encounter">;
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<Record<ManastormReferenceKind, string>>;
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<number, ManastormSourceRow[]>();
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) ?? [];
}