import type { QuestDef, QuestObjective, QuestRewards } from "./quest.js"; /** Readonly authoring input; mutable QuestDef catalogs also satisfy this shape. */ export type QuestCatalogDefinition = Omit, "requires" | "objectives" | "rewards"> & { requires?: readonly string[]; objectives: readonly Readonly[]; rewards?: Omit, "items" | "unlocks" | "quests"> & { items?: readonly Readonly[number]>[]; unlocks?: readonly string[]; quests?: readonly string[]; }; }; /** Caller-owned reference namespaces; objective kinds remain unconstrained. */ export type QuestCatalogReferenceKind = "item" | "target" | "inventory" | "currency"; /** A located structural issue; path is a JSON Pointer into the supplied catalog. */ export interface QuestCatalogIssue { code: "duplicate-quest" | "duplicate-objective" | "missing-requirement" | "missing-follow-up" | "missing-external-start" | "unknown-reference" | "invalid-count" | "invalid-amount" | "invalid-radius" | "blocked-prerequisites" | "dependency-cycle"; severity: "error" | "warning"; message: string; path: string; questId?: string; objectiveId?: string; referenceId?: string; relatedQuestIds?: string[]; requirementIds?: string[]; } /** Declarations and optional lookups for a game's own authoring rules. */ export interface QuestCatalogValidationOptions { /** Unlock ids that non-quest systems may grant, including ids shared with quests. */ externalUnlocks?: Iterable; /** Quests game systems may grant active, bypassing their acceptance prerequisites. */ externallyStartedQuests?: Iterable; /** Check present references against caller catalogs; omitted means unchecked. */ hasReference?(kind: QuestCatalogReferenceKind, id: string, context: { quest: QuestCatalogDefinition; objective?: Readonly; }): boolean; } /** * Validate catalog ids, references, quantities, and potential prerequisite progression without mutation. * Requirements are completed quest ids OR unlock ids; all requirements of a quest must be met. * Any eligible quest may be accepted directly. External unlocks and granted quest starts are possible * entry points, not claims about their timing. Blocked progression/cycles are warnings: game systems * can bypass prerequisites. Topology uses the last duplicate, matching journal registration. * Traversal is iterative and linear in definitions, requirements, and their producer edges. * Objective and item counts may be fractional or zero; negative/nonfinite counts are invalid. * This assumes objectives can be completed and does not evaluate narrative, chronology, or balance. * * @capability quest-catalog-validation diagnose authored quest ids, prerequisite and reward references, quantities, and blocked dependencies with caller-declared external unlocks */ export declare function validateQuestCatalog(catalog: readonly QuestCatalogDefinition[] | Readonly>, options?: QuestCatalogValidationOptions): QuestCatalogIssue[];