Newer
Older
rpg / v2 / apps / game / src / data / areas.ts
/**
 * Области демки (референс 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]!;
}