Внутренняя документация вертикального среза. Игра — демо движка @rpg/engine: каждая подсистема задействована в геймплее, недостающие возможности внедряются в движок жанронезависимо. Пользовательская дока движка — docs/engine/, арт — docs/art-style.md, мир — docs/world.md.
| Подсистема | Где показана в демо | Статус |
|---|---|---|
| Engine (GameLoop, фиксированный шаг 60 Гц) | весь геймплей, Game.ts |
готово |
| Renderer (480×270, целочисленный масштаб, pixelated) | весь рендер, main.ts + computeScale |
готово |
| Camera (follow, bounds от западного угла, shake) | следование за героем; тряска при резонансе/уроне | готово |
| SceneManager (replace/push/pop, fade) | меню → локация → сумка/сейвы; переходы локаций | готово |
| InputManager (действия, геймпад, мульти-биндинг) | advance/attack/menu/inventory/debug; геймпад-карта | готово |
| VirtualJoystick | тач в локациях (включается при первом касании) | готово |
| IsometricTileMap + A* | карты локаций, движение по клику | готово |
| mapFormat (JSON+RLE) | карты — файлы assets/maps/*.map, генерация npm run maps |
готово |
| Tiled-импорт | не задействован (дока + тест есть) | резерв |
| EventBus | combat:hurt/attack/playerHit, quest:flower |
готово |
| GameState (флаги/вары) | прогресс квеста, hp/kills/motes/deaths; сериализация в сейвы | готово |
| SaveManager (слоты) | autosave (Esc) + 3 слота, SaveSlotsScene |
готово |
| Settings + onChange | громкости master/music/sfx, SettingsScene |
готово |
| AudioManager (шины) | музыка локаций с кроссфейдом, sfx боя/шагов/UI | готово |
| Tween + easing | хит-флэш, кольца резонанса, всплывающие тосты, кат-сцены | готово |
| Particles (атмосфера + burst) | пепел лугов, туман прудов, удары/смерти сгустков | готово |
| StateMachine | EnemyBrain — ИИ сгустков (dormant/rise/chase/…/sleep/dead) |
готово |
| ECS (World) | боевые сущности: враги и снаряды на Entity |
готово |
| Panel/Button/MenuList | меню, настройки, сейвы, сумка | готово |
| DialogueRunner + DialogueBox | графы data/dialogues.ts, ветки квеста |
готово |
| CutsceneRunner | кат-сцена сдачи квеста (посадка → камера к башне → колокол → зелень → финал) | готово |
| DebugOverlay | F3: fps/тайл/позиция/hp | готово |
| math/shapes (cone/circle) | конус удара, круг цели, кольца | готово |
| Cooldown | кулдауны удара/резонанса/атак врагов | готово |
| math/rng (mulberry32) | генерация карт и частиц, детерминированный shake | готово |
| AgentHost/EngineAgent (agent/) | window.__agent: снапшот, ручной шаг, инъекция ввода, инварианты |
готово |
| data/validate.ts → Invariant[] | runtime-валидация контента (диалоги/NPC/локации/враги) | готово |
| tools/agent.mjs + tools/agent-lib.mjs | CLI check/run/snapshot/screenshot/dev; смоуки на мосту | готово |
quest_bells_taken).got_cloth).flowers).elder_hand_in) — посадка цветов у тропы, тайлы зеленеют.trader_after).packages/engine — жанронезависимый движок, публичный API только src/index.ts.apps/game/src/:
data/ — контент: locations.ts (определения локаций), map.ts (генераторы), dialogues.ts (графы), npcs.ts, enemies.ts, quests.ts (журнал/сумка);scenes/ — BootScene → MenuScene (+ SettingsScene, SaveSlotsScene) → LocationScene (+ InventoryScene);systems/ — PlayerController (путь + прямое движение), DialogueSystem, combat/ (CombatWorld, EnemyBrain, PlayerCombat, CombatViews, HealthBar, stats).tools/pixelart (PNG-атласы), tools/audio (WAV-генератор), tools/maps (карты-файлы), tools/agent.mjs + tools/agent-lib.mjs + tools/checks/ (агентный мост: check/snapshot/сценарии), tools/smoke*.mjs (смоуки через мост, в реальном Chromium).render/shake.ts — Shake + Camera.addShake (детерминированный rng).math/shapes.ts — inCircle, inCone, angleBetween, nearest.core/Cooldown.ts — trigger/update/ready/progress.render/particleSim.ts — чистая интеграция частиц; Particles.burst/oneShot.anim/flash.ts + render/spriteFx.ts — TintFlash/flashSprite.input/InputManager — isActionJustReleased, wasKeyReleased, pointer.downTicks, мульти-биндинг (одна клавиша → несколько действий).core/StateMachine.transitionAny — переход из любого состояния.map/IsometricTileMap.setTile — изменение тайла с перерисовкой ячейки.map/pathfinding.findPathToNeighbor — путь к краю занятого/непроходимого тайла (гейтинг взаимодействий по дистанции в демо).cutscene/CutsceneRunner.ts — view-агностичный раннер шагов (call/cameraMove/burst/wait/setFlag), шаг с seconds: 0 — параллельный; сцена ставит геймплей на паузу по active.agent/types.ts — SceneAgent/AgentHost/Invariant/SnapshotLayer: движковый каркас моста жанронезависим (по образцу StorageLike), тесты без Pixi.agent/EngineAgent.ts — снапшот (движковый слой + сцена), инварианты, ручной шаг (step/waitFor), атомарная инъекция ввода (tapVirtual/press/key), команды.core/Engine.stepTick/stepTicks/tickCount + GameLoop.setManual/resetTiming — детерминированные шаги логики без «догоняния» rAF.input/InputManager.inject* — инъекция через те же структуры, что реальные события.dialogue/DialogueRunner — раскрыт для снапшота (nodeId/choices/waitingForChoice).agent/GameAgent.ts (window.__agent), agent/snapshot.ts, data/validate.ts, сцены реализуют SceneAgent (whitelist-команды, lastToast).Текущий срез — движок для ИИ-агента + геймплей на нём (план утверждён):
window.__agent, валидация контента, tools/agent.mjs, смоуки на мосту, docs/llms.txt + docs/engine/agent.md + docs/engine/practices.md.TransitionDef (step/click, условия, lockedText), дисарм тайла входа, returnTo, сейвы v3, телепорт-колодцы (Звенец ↔ луга), сценарий tools/checks/transitions.mjs.tools/checks/.Дальше (запрос игрока, после моста):
Остальное (по мере готовности базиса):