Newer
Older
rpg / apps / game / src / data / items.ts
/**
 * Реестр предметов (контент по docs/world.md). Id — стабильные ключи сейва.
 * Описания — стиль сеттинга: кратко, меланхолично.
 */
export interface ItemDef {
    id: ItemId;
    name: string;
    desc: string;
}

export type ItemId = 'cloth' | 'bellflower' | 'salt' | 'water_flask' | 'mote' | 'clock';

export const ITEMS: Record<ItemId, ItemDef> = {
    clock: {
        id: 'clock',
        name: 'Медные часы',
        desc: 'Старые, с одной стрелкой. Ирвин: «Стрелка не врёт — темнота по ней приходит».'
    },
    cloth: {
        id: 'cloth',
        name: 'Вощёное полотно',
        desc: 'Маска от наката. Дышать поверх свежего пепла — потерять голос.'
    },
    bellflower: {
        id: 'bellflower',
        name: 'Лунный колокольчик',
        desc: 'Трава-возвращенец. Вытягивает пепел из земли. Посаженный — надежда.'
    },
    salt: {
        id: 'salt',
        name: 'Соль',
        desc: 'Край держится на обмене. Соль здесь дороже золота.'
    },
    water_flask: {
        id: 'water_flask',
        name: 'Вода в медном бутле',
        desc: 'Мутная, но чистая. Пруды отдают воду неохотно.'
    },
    mote: {
        id: 'mote',
        name: 'Пепельный мот',
        desc: 'Сгусток серой земли с тёплой искрой — то, что колокольчик вытянул из пепла. Мила меняет моты на товар.'
    }
};

/** Безопасное имя по id (незнакомый id — сам id). */
export function itemName(id: string): string {
    return ITEMS[id as ItemId]?.name ?? id;
}

/**
 * Строка от «применения» предмета (юза́бельные — только часы). Чистая функция:
 * null — предмет без эффекта (сумка молчит). label — текущее время сумки
 * (в сумке время заморожено — LocationScene не тикается).
 */
export function useItemLine(id: string, ctx: { label: string }): string | null {
    return id === 'clock' ? `Время: ${ctx.label}` : null;
}