/**
* Реестр объектов игры для дев-панели (трек 33): объекты регистрируются
* там же, где создаются (штампы мира в areas.ts, персонажи/снаряжение в
* main.ts, фауна в fauna.ts) — каталог вьювера собирается сам, без ручного
* списка в devview. Дедуп по id: штампы тысяч объектов и повторный спавн
* при переходах областей заполняют каталог по одному разу на вид.
*/
import type { VoxelModel, VoxelRig, AnimClip, CloudTiles, MannequinPalette } from '@rpg/engine';
/** Что строит вьювер из записи: модель + опционально рига/клип/тайли/скины. */
export interface RegistryBuild {
model: VoxelModel;
rig?: VoxelRig;
clip?: AnimClip;
tiles?: CloudTiles;
/** Скины: [имя, палитра] — переключение перекрашивает модель. */
skins?: Array<[string, MannequinPalette]>;
}
/** Запись каталога: id (стабильный, для моста/гейтов), подпись, сборка. */
export interface RegistryEntry {
id: string;
label: string;
build(): RegistryBuild;
}
const entries = new Map<string, RegistryEntry>();
/** Зарегистрировать объект вида (повторная регистрация с тем же id — no-op). */
export function registerObject(entry: RegistryEntry): void {
if (!entries.has(entry.id)) entries.set(entry.id, entry);
}
/** Все записи каталога в порядке регистрации. */
export function registryAll(): RegistryEntry[] {
return [...entries.values()];
}
/** Запись по id (мост/гейты открывают вьювер по id). */
export function registryGet(id: string): RegistryEntry | null {
return entries.get(id) ?? null;
}