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' | 'zvenets';
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: [],
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 } },
// Тропа в Звенец (деревня-мастерская).
{ tile: { x: 26, y: 14 }, to: 'zvenets', entry: { x: 3, y: 10 } }
],
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'
},
zvenets: {
id: 'zvenets',
name: 'Звенец',
music: 'music/zvenets',
spawn: { x: 14, y: 10 },
npcs: NPCS,
enemies: [],
exits: [
// Тропа обратно на луга.
{ tile: { x: 2, y: 10 }, to: 'meadows', entry: { x: 25, y: 14 } }
],
ambience: 'ash'
}
};
/** Определение локации по id (с фолбэком на луга для старых сейвов). */
export function locationOf(id: string | null | undefined): LocationDef {
return LOCATIONS[(id as LocationId) ?? 'meadows'] ?? LOCATIONS.meadows;
}