/**
* Области демки (референс v1 locations.ts → данные v2): спавны и переходы
* в тайлах v1 (конвертация в воксели — на границе, tileCenter/UNIT).
* Переходы: step — наступил на тайл, click — «E» рядом (двери, колодцы);
* 'return' — назад, откуда вошли (стек переходов).
*/
/** Тайл v1 (юниты v1). */
export interface Tile { x: number; y: number }
export interface TransitionDef {
/** Тайл-триггер. */
tile: Tile;
/** Подпись подсказки (для click-переходов). */
label?: string;
/** Куда: [область, тайл входа] или 'return' — назад, откуда вошли. */
target: { area: string; entry: Tile } | 'return';
/** step (по умолчанию) или click (двери/колодцы/порталы). */
trigger?: 'step' | 'click';
/** Длительность фейда (сек), по умолчанию 0.4. */
duration?: number;
}
export interface AreaDef {
id: string;
name: string;
/** Стартовый тайл (вход в область по умолчанию). */
spawn: Tile;
transitions: TransitionDef[];
}
export const AREA_DEFS: AreaDef[] = [
{
id: 'meadows',
name: 'Выжженные луга',
spawn: { x: 16, y: 28 },
transitions: [
{ tile: { x: 2, y: 2 }, target: { area: 'ponds', entry: { x: 4, y: 4 } } },
{ tile: { x: 54, y: 28 }, target: { area: 'zvenets', entry: { x: 3, y: 20 } } },
{ tile: { x: 44, y: 40 }, label: 'Старый колодец', target: { area: 'zvenets', entry: { x: 16, y: 14 } }, trigger: 'click', duration: 0.2 },
],
},
{
id: 'ponds',
name: 'Серые пруды',
spawn: { x: 4, y: 4 },
transitions: [{ tile: { x: 2, y: 2 }, target: { area: 'meadows', entry: { x: 3, y: 3 } } }],
},
{
id: 'zvenets',
name: 'Звенец',
spawn: { x: 28, y: 20 },
transitions: [
{ tile: { x: 2, y: 20 }, target: { area: 'meadows', entry: { x: 53, y: 28 } } },
{ tile: { x: 16, y: 13 }, label: 'Старый колодец', target: { area: 'meadows', entry: { x: 44, y: 41 } }, trigger: 'click', duration: 0.2 },
{ tile: { x: 13, y: 12 }, label: 'Дом Ирвина', target: { area: 'house_elder', entry: { x: 5, y: 7 } }, trigger: 'click', duration: 0.2 },
{ tile: { x: 43, y: 19 }, label: 'Лавка Милы', target: { area: 'shop', entry: { x: 5, y: 7 } }, trigger: 'click', duration: 0.2 },
{ tile: { x: 54, y: 20 }, target: { area: 'rust_grove', entry: { x: 2, y: 20 } } },
],
},
{
id: 'rust_grove',
name: 'Ржавая роща',
spawn: { x: 2, y: 20 },
transitions: [
{ tile: { x: 1, y: 20 }, target: { area: 'zvenets', entry: { x: 53, y: 20 } } },
{ tile: { x: 46, y: 20 }, target: { area: 'old_siding', entry: { x: 2, y: 20 } } },
],
},
{
id: 'old_siding',
name: 'Старый разъезд',
spawn: { x: 2, y: 20 },
transitions: [
{ tile: { x: 1, y: 20 }, target: { area: 'rust_grove', entry: { x: 45, y: 20 } } },
{ tile: { x: 28, y: 31 }, label: 'Люк в подземелье', target: { area: 'machine_hall', entry: { x: 13, y: 19 } }, duration: 0.6 },
],
},
{
id: 'machine_hall',
name: 'Зал Старой Машины',
spawn: { x: 13, y: 19 },
transitions: [{ tile: { x: 13, y: 21 }, target: 'return', duration: 0.2 }],
},
{
id: 'house_elder',
name: 'Дом Ирвина',
spawn: { x: 5, y: 7 },
transitions: [{ tile: { x: 5, y: 8 }, target: 'return', duration: 0.2 }],
},
{
id: 'shop',
name: 'Лавка Милы',
spawn: { x: 5, y: 7 },
transitions: [{ tile: { x: 5, y: 8 }, target: 'return', duration: 0.2 }],
},
];
/** Область по id (фолбэк — луга, как в v1 areaOf). */
export function areaOf(id: string): AreaDef {
return AREA_DEFS.find((a) => a.id === id) ?? AREA_DEFS[0]!;
}