Newer
Older
rpg / v2 / apps / game / src / data / areas.ts
/**
 * Области демки (референс v1 locations.ts → данные v2): спавны и переходы
 * в тайлах v1 (конвертация в воксели — на границе, tileCenter/UNIT).
 * Переходы: step — наступил на тайл, click — «E» рядом (двери, колодцы);
 * 'return' — назад, откуда вошли (стек переходов).
 */
import { INTERACTABLES, type InteractableDef } from './interactables';
import { HAZARD_PONDS, HAZARD_SIDING, type HazardDef } from './hazards';

/** Тайл v1 (юниты v1). */
export interface Tile { x: number; y: number }

/** Тайл раскладки v1 «лунный колокольчик» (сборный — квест «Три цветка»). */
const T_BELLFLOWER = 5;

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[];
    /** Интерактивные объекты области (из data/interactables.ts). */
    interactables?: InteractableDef[];
    /** Зоны наката (низины: без полотна еле идёшь). */
    hazards?: HazardDef[];
    /** Сборный тайл (лунный колокольчик): «E» рядом — сбор. */
    harvestTile?: number;
}

export const AREA_DEFS: AreaDef[] = [
    {
        id: 'meadows',
        name: 'Выжженные луга',
        interactables: INTERACTABLES.meadows,
        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 } } }],
        interactables: INTERACTABLES.ponds,
        hazards: [HAZARD_PONDS],
        // Лунные колокольчики собираются только у прудов (квест «Три цветка»).
        harvestTile: T_BELLFLOWER,
    },
    {
        id: 'zvenets',
        name: 'Звенец',
        interactables: INTERACTABLES.zvenets,
        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: 'Ржавая роща',
        interactables: INTERACTABLES.rust_grove,
        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 },
        ],
        hazards: [HAZARD_SIDING],
    },
    {
        id: 'machine_hall',
        name: 'Зал Старой Машины',
        interactables: INTERACTABLES.machine_hall,
        spawn: { x: 13, y: 19 },
        transitions: [{ tile: { x: 13, y: 21 }, target: 'return', duration: 0.2 }],
    },
    {
        id: 'house_elder',
        name: 'Дом Ирвина',
        interactables: INTERACTABLES.house_elder,
        spawn: { x: 5, y: 7 },
        transitions: [{ tile: { x: 5, y: 8 }, target: 'return', duration: 0.2 }],
    },
    {
        id: 'shop',
        name: 'Лавка Милы',
        interactables: INTERACTABLES.shop,
        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]!;
}