import { resolveDungeonAssets } from "./dungeonAssets"; import type { DungeonDefinition, Vector3Tuple } from "./dungeonTypes"; import { WAILING_CAVERNS_DEFINITION } from "./dungeons/wailingCaverns"; export type { Vector3Tuple } from "./dungeonTypes"; export type AreaCheckpoint = DungeonDefinition["areas"][number]; /** * Compatibility exports for older tests and non-runtime tooling. New runtime * code resolves through the active dungeon registry instead of these aliases. */ export const DUNGEON_MANIFEST = WAILING_CAVERNS_DEFINITION; export const DUNGEON_BOUNDS = WAILING_CAVERNS_DEFINITION.bounds; export const AREA_CHECKPOINTS = WAILING_CAVERNS_DEFINITION.areas; export const DUNGEON_FILE_NAMES = { visual: WAILING_CAVERNS_DEFINITION.assets.visual[0].fileName, collision: WAILING_CAVERNS_DEFINITION.assets.collision[0].fileName, navigation: WAILING_CAVERNS_DEFINITION.assets.navigation.fileName, } as const; const legacyAssets = resolveDungeonAssets(WAILING_CAVERNS_DEFINITION); export const DUNGEON_ASSETS = { visual: legacyAssets.visual[0] ?? null, collision: legacyAssets.collision[0] ?? null, navigation: legacyAssets.navigation, } as const; export function resolveAreaNameForDungeon(definition: DungeonDefinition, position: Vector3Tuple): string { let nearest: DungeonDefinition["areas"][number] | null = null; let nearestDistanceSquared = Number.POSITIVE_INFINITY; for (const checkpoint of definition.areas) { const dx = position[0] - checkpoint.center[0]; const dy = position[1] - checkpoint.center[1]; const dz = position[2] - checkpoint.center[2]; const distanceSquared = dx * dx + dy * dy + dz * dz; if (distanceSquared <= checkpoint.radius * checkpoint.radius && distanceSquared < nearestDistanceSquared) { nearest = checkpoint; nearestDistanceSquared = distanceSquared; } } return nearest?.name ?? definition.presentation.unchartedAreaName; } export function resolveAreaName(position: Vector3Tuple): string { return resolveAreaNameForDungeon(WAILING_CAVERNS_DEFINITION, position); }