import type { Vec2 } from '@rpg/engine';
import { FLAGS, type FlagId } from './ids';
/**
* NPC локации: позиция в юнитах, спрайт/атлас, диалоги и флаг сюжета
* после первого разговора. Тайл привязки вычисляется из pos при загрузке
* модуля — снапшот/валидатор/клики читают `tile`, реестр объектов — `pos`.
*/
export interface NpcDef {
id: string;
name: string;
/** Позиция ног в мировых юнитах (центр тайла = координата + 0.5). */
pos: Vec2;
/** Тайл привязки (floor от pos; вычисляется — в контенте не писать). */
tile: { x: number; y: number };
/** Ключ спрайта в ассетах (chars/<sprite>.png). */
sprite: string;
/** Атлас idle-анимации (по умолчанию chars/npcs_sheet.json). */
atlas?: string;
/** Первый диалог (когда флаг ещё не поднят). */
dialogueFirst: string;
/** Повторный диалог. */
dialogueRepeat: string;
/** Флаг, поднимаемый после первого диалога. */
flagKey: FlagId;
}
const NPCS_RAW: Omit<NpcDef, 'tile'>[] = [
{
id: 'elder',
name: 'Старейшина Ирвин',
pos: { x: 12.5, y: 9.5 },
sprite: 'elder_irwin',
dialogueFirst: 'elder_first',
dialogueRepeat: 'elder_repeat',
flagKey: FLAGS.met_elder
},
{
id: 'trader',
name: 'Торговка Мила',
pos: { x: 17.5, y: 11.5 },
sprite: 'trader_mila',
dialogueFirst: 'trader_first',
dialogueRepeat: 'trader_repeat',
flagKey: FLAGS.met_mila
}
];
export const NPCS: NpcDef[] = NPCS_RAW.map((d) => ({
...d,
tile: { x: Math.floor(d.pos.x), y: Math.floor(d.pos.y) }
}));