export type ValidationError = { path: string; message: string; }; export type ValidationResult = { ok: boolean; errors: ValidationError[]; }; export declare function validateEntityBlueprint(v: unknown, path?: string): ValidationResult; export declare function validateAbilityDefinition(v: unknown, path?: string): ValidationResult; export declare function validateStatusDefinition(v: unknown, path?: string): ValidationResult; /** * Cross-validates a collection of StatusDefinitions. * * Runs `validateStatusDefinition()` on each entry, then checks: * - No duplicate IDs * - When `knownTags` is supplied, used tags must be ⊆ declared (ERROR — a pack * that ships `tags: ['made-up']` against a ruleset that declared its * vocabulary is invalid). When `knownTags` is omitted the tag check is * skipped; there is no invented global vocabulary. */ export declare function validateStatusDefinitionPack(defs: unknown[], knownTags?: string[], path?: string): ValidationResult & { advisories: ValidationError[]; }; /** * Bind a status pack against a ruleset's `contentConventions.statusTags`. * * One helper for every starter's schema-conformance (and for JSON packs that * have a ruleset in hand). Passes the declared tags through to * {@link validateStatusDefinitionPack} so used ⊆ declared is an error, not an * advisory the caller can ignore. */ export declare function validateStatusPackAgainstRuleset(defs: unknown[], ruleset: { contentConventions?: { statusTags?: string[]; }; }, path?: string): ValidationResult & { advisories: ValidationError[]; }; export declare function validateZoneDefinition(v: unknown, path?: string): ValidationResult; /** * `EntityPlacementRecord` — WHERE one entity stands (C3/P1). * * Referential resolution (does `entityId` name a real blueprint? does `zoneId` * name a real zone?) is NOT here: this is the structural guard, and the refs * pass owns cross-references. Splitting them matters because a shape failure * must stop the pack before `validateRefs` dereferences anything — C1's ledger * entry 5 is exactly this, where widening a shape guard did not close a * raw-`TypeError` hole because the refs pass ran unconditionally afterward. */ export declare function validateEntityPlacementRecord(v: unknown, path?: string): ValidationResult; /** Authored giveItem: itemId onto entityId. */ export declare function validateItemPlacementRecord(v: unknown, path?: string): ValidationResult; /** * `EncounterAnchorRecord` — a per-zone spawn-set entry (C3/P1). * * `probability` is range-checked here rather than clamped. A clamp turns an * authoring mistake into a silent behaviour change, which is the * silent-fallback shape C0 measured four separate times (`slot`, `rarity`, * `difficulty`, `genre`). * * `encounterType` is the closed map play's encounterAnchorsChannel accepts * (ambush/patrol/horde/duel). `boss-fight` and `solo` are deliberately absent. */ export declare const ENCOUNTER_ANCHOR_TYPES: readonly ["ambush", "patrol", "horde", "duel"]; export declare function validateEncounterAnchorRecord(v: unknown, path?: string): ValidationResult; /** * Typed hazard record (F-b6a8aa78). Shape mirrors ContentPack.hazardDefinitions * — reqStr id/trigger, effects as an array of objects, finite optionals. * Cross-ref of zone.hazardRefs → hazard id is validateRefs' job. */ export declare function validateHazardDefinition(v: unknown, path?: string): ValidationResult; /** * Minimal item record (F-b6a8aa78). Non-empty string id; refuse non-objects. * Full slot/rarity/loadout shape lives on `@ai-rpg-engine/equipment` * ItemDefinition, which is assignable to ContentPack.items. Cross-ref of * inventory/reward ids is validateGameContent's job. */ export declare function validateItemRecord(v: unknown, path?: string): ValidationResult; /** * Structural district record (F-6fbd6e71). Shape mirrors ContentPack.districts * — id/name/zoneIds/tags required; controllingFaction and baseMetrics optional. * Zone-id resolution against pack.zones is validateRefs' job. */ export declare function validateDistrictDefinition(v: unknown, path?: string): ValidationResult; /** * Structural RuleProfile (F-0987c369). statMapping.attack/precision/resolve * required non-empty strings. formulaOverrides is reserved and unread. */ export declare function validateRuleProfile(v: unknown, path?: string): ValidationResult; export declare function validateRoomDefinition(v: unknown, path?: string): ValidationResult; export declare function validateQuestDefinition(v: unknown, path?: string): ValidationResult; export declare function validateDialogueDefinition(v: unknown, path?: string): ValidationResult & { advisories: ValidationError[]; }; export declare function validateProgressionTreeDefinition(v: unknown, path?: string): ValidationResult; export declare function validateSoundCueDefinition(v: unknown, path?: string): ValidationResult; export declare function validateRulesetDefinition(v: unknown, path?: string): ValidationResult; /** Minimal ruleset shape for cross-validation (compatible with RulesetDefinition) */ export type AbilityPackRuleset = { stats: { id: string; }[]; resources: { id: string; }[]; }; /** * Cross-validates an ability pack against a ruleset. * * Runs `validateAbilityDefinition()` on each ability, then checks: * - Costs reference resources that exist in the ruleset (or implicit: hp, stamina) * - Checks reference stats that exist in the ruleset * - `stat-modify` effects reference valid stats * - `resource-modify` effects reference valid resources (or implicit) * - No duplicate ability IDs within the pack */ export declare function validateAbilityPack(abilities: unknown[], ruleset: AbilityPackRuleset, path?: string): ValidationResult & { advisories: ValidationError[]; }; export declare function formatErrors(result: ValidationResult): string; //# sourceMappingURL=validate.d.ts.map