Newer
Older
rpg / apps / game / src / data / ids.ts
/**
 * Реестры строковых сущностей сюжета: флаги и вары GameState.
 * Единственная точка правды: контент (диалоги, интерактивы, квесты, переходы)
 * и код сцены ссылаются на них через константы, а data/validate.ts сверяет
 * каждое строковое упоминание с реестром — опечатка падает в тестах и
 * agent:invariants, а не молча создаёт новый флаг.
 */

/**
 * Флаги сюжета: ключ = значение = id (строка в GameState/сейве).
 * Знакомства ставятся самими графами диалогов (dialogueFirst), а не кодом
 * сцены; старые ключи metElder/metTrader мигрируют (data/migrations.ts).
 */
export const FLAGS = {
    /** Познакомились со старейшиной (диалог elder_first). */
    met_elder: 'met_elder',
    /** Ирвин дал задание о колокольчиках (диалог elder_first; doneFlag стадии 1). */
    quest_bells_taken: 'quest_bells_taken',
    /** Колокольчики собраны и посажены (диалог elder_hand_in; doneFlag стадии 2). */
    quest_bells_done: 'quest_bells_done',
    /** Познакомились с Милой (диалог trader_first). */
    met_mila: 'met_mila',
    /** Мила дала вощёное полотно (диалог trader_first). */
    got_cloth: 'got_cloth',
    /** Колокол башни звенел (интерактив bell_rope). */
    rang_tower: 'rang_tower',
    /** Прочитана записка в доме Ирвина (интерактив note_elder). */
    read_note: 'read_note',
    /** Подсказка «как собирать колокольчики» уже показана (вход в пруды). */
    hint_bells: 'hint_bells',
    /** Вечер настал (диалог elder_hand_in: «вернусь до темноты» исполнено). */
    evening: 'evening'
} as const;

export type FlagId = keyof typeof FLAGS;

/** Вары прогресса (числовые; значение живёт в GameState.vars): ключ = id. */
export const VARS = {
    /** Пепельные моты в сумке (подбор наростов, победы над врагами). */
    motes: 'motes',
    /** Собранные лунные колокольчики (квест «Три цветка»). */
    flowers: 'flowers',
    /** Здоровье героя между входами в локацию. */
    hp: 'hp',
    /** Побеждённые враги (отладка/статистика). */
    kills: 'kills',
    /** Смерти героя (статистика). */
    deaths: 'deaths',
    /** Резонансы башни (кат-сцена, статистика). */
    resonances: 'resonances'
} as const;

export type VarId = keyof typeof VARS;

/** Синтезируемый флаг одноразового интерактива (once): used:<id>. */
export function usedFlag(id: string): string {
    return `used:${id}`;
}