import runtimeSnapshot from "./generated/manastormRuntimeCatalog.json"; import affixSnapshot from "./generated/manastormAffixes.json"; import { INSTALLED_MANASTORM_STAGES } from "./manastormInstalledStages"; import type { ManastormCatalogLike, ManastormCatalogAffixLike, ManastormCatalogModifierLike, ManastormCatalogMessageLike, } from "./manastorm"; interface InstalledRuntimeSnapshot { readonly schemaVersion: 2; readonly catalogId: string; readonly modeId: number; readonly defaultModeId: number; readonly modeIds?: readonly number[]; readonly maximumLevel: number; readonly modes?: readonly { readonly modeId: number; readonly key: string; readonly maximumLevel: number; readonly modifiers: readonly (readonly number[])[]; readonly messages: readonly { readonly progressionValue: number; readonly groupId: number; readonly title: string; readonly description: string; readonly iconReference?: string; }[]; }[]; readonly encounters: readonly { readonly encounterId: number; readonly name: string; readonly creatureId: number; readonly mapIds: readonly number[]; readonly modeIds: readonly number[]; readonly sourceRowIds: readonly string[]; }[]; readonly encounterSources: readonly { readonly role: string; readonly path: string; readonly sha256: string; }[]; readonly sourceRows?: readonly { readonly sourceRecordId: number; readonly mapId: number; readonly modeId: number; readonly encounterId: number; readonly scalars: readonly number[]; }[]; readonly encounterModesByMap: readonly { readonly mapId: number; readonly modeIds: readonly number[]; }[]; readonly modifiers: readonly (readonly number[])[]; readonly groupModifiers: readonly (readonly number[])[]; readonly messages: readonly { readonly progressionValue: number; readonly groupId: number; readonly title: string; readonly description: string; readonly iconReference?: string; }[]; } const installed = runtimeSnapshot as InstalledRuntimeSnapshot; const modeId = installed.modeId; const modes = installed.modes ?? [{ modeId, key: "leveling", maximumLevel: installed.maximumLevel, modifiers: installed.modifiers, messages: installed.messages, }]; const modifiers: readonly ManastormCatalogModifierLike[] = modes.flatMap( (mode) => mode.modifiers.map( ([level, ...tuning]) => ({ modeId: mode.modeId, level, tuning }), ), ); const groupModifiers = installed.groupModifiers.map(([playerCount, ...multipliers]) => ({ playerCount, modeId, sourceModeId: modeId, appliesToModeIds: installed.modeIds ?? [modeId], multipliers, })); const messages: readonly ManastormCatalogMessageLike[] = modes.flatMap( (mode) => mode.messages.map((message) => ({ modeId: mode.modeId, progressionValue: message.progressionValue, groupId: message.groupId, title: message.title, description: message.description, ...(message.iconReference ? { iconReference: message.iconReference } : {}), })), ); const affixes: readonly ManastormCatalogAffixLike[] = affixSnapshot.affixes.map((affix) => ({ id: affix.id, name: affix.name, description: affix.description, unlockLevel: affix.unlockLevel, modeIds: affix.modeIds, iconReference: affix.iconReference, trigger: affix.trigger as ManastormCatalogAffixLike["trigger"], spellId: affix.spellId, sourceRecordIds: affix.sourceRecordIds, sourceReportId: affixSnapshot.sourceReportId, sourceSpellDbcSha256: affixSnapshot.spellDbcSha256, })); const rewardCadenceSource = "Ascension Manastorm observable reward cadence; amounts are local balance substitutions."; const rewards = Object.freeze([ { id: "installed-leveling-milestone", modeIds: [0], claimPolicy: "repeatable", milestoneEvery: 5, currencyId: "bedlamBullions", currencyBase: 5, currencyPerLevel: 0.1, cacheId: "leveling-manastorm-cache", provenance: { fidelity: "authored-observable-cadence", source: rewardCadenceSource }, }, { id: "installed-leveling-clear", modeIds: [0], claimPolicy: "repeatable", currencyId: "bonzoBolts", currencyBase: 2, currencyPerLevel: 0.5, cacheId: "leveling-manastorm-cache", provenance: { fidelity: "authored-observable-cadence", source: rewardCadenceSource }, }, { id: "installed-leveling-first-clear", modeIds: [0], claimPolicy: "first-clear", currencyId: "bonzoBolts", currencyBase: 1, currencyPerLevel: 0.1, provenance: { fidelity: "authored-observable-cadence", source: rewardCadenceSource }, }, { id: "installed-endgame-milestone", modeIds: [2], claimPolicy: "repeatable", milestoneEvery: 5, currencyId: "bedlamBullions", currencyBase: 5, currencyPerLevel: 0.1, cacheId: "endgame-manastorm-cache", cachePolicy: "accumulating-chance", provenance: { fidelity: "authored-observable-cadence", source: rewardCadenceSource }, }, { id: "installed-endgame-clear", modeIds: [2], claimPolicy: "repeatable", currencyId: "bonzoBolts", currencyBase: 3, currencyPerLevel: 0.5, cacheId: "endgame-manastorm-cache", cachePolicy: "accumulating-chance", provenance: { fidelity: "authored-observable-cadence", source: rewardCadenceSource }, }, { id: "installed-endgame-first-clear", modeIds: [2], claimPolicy: "first-clear", currencyId: "bedlamBullions", currencyBase: 1, currencyPerLevel: 0.05, provenance: { fidelity: "authored-observable-cadence", source: rewardCadenceSource }, }, ] as const); /** * Runtime view of the installed client snapshot. Shipping stage packages are * joined to authoritative encounter/creature identities and reviewed package * anchors by manastormInstalledStages; incomplete joins remain excluded. */ export const INSTALLED_MANASTORM_RUNTIME_CATALOG: ManastormCatalogLike = Object.freeze({ id: installed.catalogId, modeId, modeIds: installed.modeIds ?? [modeId], maximumLevel: installed.maximumLevel, modifiers, groupModifiers, messages, affixes, rewards, stages: INSTALLED_MANASTORM_STAGES, });