49 lines
2.0 KiB
TypeScript
49 lines
2.0 KiB
TypeScript
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);
|
|
}
|