Newer
Older
rpg / apps / game / src / data / locations.ts
import type { NpcDef } from './npcs';
import type { EnemyKindId } from './enemies';
import { NPCS } from './npcs';

/**
 * Локации демо-среза. Карты хранятся файлами assets/maps/<id>.map
 * (формат rpg-map, RLE) и загружаются через parseMap в BootScene.
 */
export type LocationId = 'meadows' | 'ponds';

export interface LocationExit {
    /** Тайл-триггер (наступил — переход). */
    tile: { x: number; y: number };
    to: LocationId;
    /** Куда поставить героя в новой локации. */
    entry: { x: number; y: number };
}

export interface LocationDef {
    id: LocationId;
    name: string;
    /** Музыка локации (кроссфейд при переходе). */
    music: string;
    /** Стартовый тайл (новая игра / респаун). */
    spawn: { x: number; y: number };
    npcs: NpcDef[];
    enemies: { kind: EnemyKindId; tile: { x: number; y: number } }[];
    exits: LocationExit[];
    /** Атмосферные частицы: 'ash' — пепел, 'fog' — туман прудов. */
    ambience: 'ash' | 'fog';
}

export const LOCATIONS: Record<LocationId, LocationDef> = {
    meadows: {
        id: 'meadows',
        name: 'Выжженные луга',
        music: 'music/meadows',
        spawn: { x: 14, y: 14 },
        npcs: NPCS,
        enemies: [
            { kind: 'crawler', tile: { x: 8, y: 9 } },
            { kind: 'crawler', tile: { x: 10, y: 7 } },
            { kind: 'spitter', tile: { x: 20, y: 8 } },
            { kind: 'crawler', tile: { x: 22, y: 21 } },
            { kind: 'heavy', tile: { x: 6, y: 22 } }
        ],
        exits: [
            // Северо-западный угол: тропа на Серые пруды.
            { tile: { x: 2, y: 2 }, to: 'ponds', entry: { x: 3, y: 3 } }
        ],
        ambience: 'ash'
    },
    ponds: {
        id: 'ponds',
        name: 'Серые пруды',
        music: 'music/ponds',
        spawn: { x: 3, y: 3 },
        npcs: [],
        enemies: [
            { kind: 'crawler', tile: { x: 5, y: 12 } },
            { kind: 'crawler', tile: { x: 9, y: 18 } },
            { kind: 'spitter', tile: { x: 16, y: 11 } },
            { kind: 'spitter', tile: { x: 18, y: 18 } },
            { kind: 'heavy', tile: { x: 12, y: 15 } }
        ],
        exits: [
            // Обратно на луга.
            { tile: { x: 2, y: 2 }, to: 'meadows', entry: { x: 3, y: 3 } }
        ],
        ambience: 'fog'
    }
};

/** Определение локации по id (с фолбэком на луга для старых сейвов). */
export function locationOf(id: string | null | undefined): LocationDef {
    return LOCATIONS[(id as LocationId) ?? 'meadows'] ?? LOCATIONS.meadows;
}