diff --git a/docs/engine/practices.md b/docs/engine/practices.md index e66c8c1..dd6d832 100644 --- a/docs/engine/practices.md +++ b/docs/engine/practices.md @@ -112,6 +112,32 @@ 4. Синтаксис знакомств — camelCase (`metElder`), сюжета — snake_case; это легаси в сейвах, не унифицировать без миграции. +## Ситуация: добавляю меню-сцену + +1. Наследуйся от движкового `MenuSceneBase` (см. `docs/engine/ui-and-dialogue.md`, + раздел «Меню-сцены»): в `build()` — Panel/PixelText/MenuList и + `uiRoot.addChild(this.view)`; ввод и гард `transitioning` — в каркасе. +2. Карта действий — вторым аргументом super: `{ up, down, confirm, cancel }` + (+ `left/right` для значений, `extra` для прочих). Имена действий — из + биндов `main.ts`, не выдумывай новые без бинда. +3. Сцена под push стоит на паузе (`SceneManager.update` тикает только + верхнюю) — «заморозку мира» делать не надо. +4. Пересборка списка (`setItems`) сохраняет фокус; недоступные пункты — + `disabled: true` (курсор их пропускает), а не no-op-колбэк. + +## Ситуация: добавляю предмет / лимит сумки + +1. Модель — движковый `Inventory` (`docs/engine/inventory.md`): стаки неявные, + `add` возвращает, сколько влезло (лимиты обрезают, не бросают). +2. Имя/описание — `ItemDef` в `data/items.ts` (литеральный union `ItemId` — + опечатка не скомпилируется); движение предметов — `inventory.add/remove` + в `Game.ts`. +3. Лимиты сумки — опции конструктора в `Game.ts` (`{ maxSlots, maxPerStack }`); + UI читает `inventory.all` — формат строки («имя ×N») только в + `inventoryItems` (`data/quests.ts`), не форматируй в сцене. +4. Изменения сумки можно слушать: `inventory.onChange((ch) => ...)` + (`InventoryChange { kind, id, count, after }`) — например, для HUD. + ## Ситуация: коммичу 1. `pre-commit` хук (`.githooks/`, подключается `npm run prepare` →