4b5c8077d3
feat(quantik-game): фаза 0 — слой целей в движке (goal/HUD/result) Декларативный блок goal в спеке SimForge (булево SimExpr-условие победы), вычисляемый каждый кадр: фиксация результата (победа/время/попытки/звёзды), callback onGoal, HUD-оверлей (цель/звёзды/подсказка/баннер, inline SVG). API инстанса: onGoal/getResult/resetResult. Серверный validateSpec пропускает goal/game (длина выражений + escape текста, без исполнения). Аддитивно: спека без goal ведёт себя как раньше. Смоук 40/40; npm test 238 pass/8 baseline; lint:routes 0. План фичи (7 фаз) + CONTEXT. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> @
57 lines
5.0 KiB
Markdown
57 lines
5.0 KiB
Markdown
# Phase 2: Карта-созвездие + мир физ-уровней + XP/скины (MVP-мир)
|
|
|
|
**Status:** ⬜ Not Started
|
|
**Parent plan:** [PLAN.md](./PLAN.md)
|
|
**Domain:** fullstack
|
|
|
|
## Objective
|
|
Превратить одиночный уровень в **играбельный мир**: карта-созвездие из ~5–6 физ-уровней,
|
|
разблокировка по звёздам, XP, выбор скина Квантика, нарратор-Квантик (`PetSprite`) на интро/
|
|
победе. После этой фазы игра полноценно отгружаема.
|
|
|
|
## Tasks
|
|
- [ ] Task 1: Контент — ~5–6 физ-уровней-спек (данные в `levels.js`), нарастающая сложность:
|
|
артиллерия → перелёт через стену → отскок (restitution) → пружина/маятник → орбита/гравитация.
|
|
Каждый: `goal` + 1–3 звезды + норматив времени (`par_ms`) для 3-й звезды.
|
|
- [ ] Task 2: Структура «мир/глава»: метаданные уровня (id, title, chapter, order, par_ms, hint).
|
|
Карта группирует по главам (созвездиям).
|
|
- [ ] Task 3: Карта-созвездие `frontend/js/game/map.js` (+ разметка в quantik.html): узлы-уровни
|
|
на SVG/canvas-фоне, линии-связи, статус (заблокирован/доступен/пройден + число звёзд).
|
|
Разблокировка: уровень открыт, если набрано ≥ threshold звёзд в предыдущих (правило в данных).
|
|
- [ ] Task 4: XP/уровень игрока: XP = сумма звёзд × коэффициент (+ бонус за par). Хранить в
|
|
прогрессе (расширить `game_progress` агрегацией на клиенте ИЛИ доб. поле/таблицу `game_player`).
|
|
Полоса XP + «уровень Квантика» в шапке карты.
|
|
- [ ] Task 5: Скины Квантика: выбор `colorKey` из палитр `PetSprite` (+ позже паттерны). Скин
|
|
влияет на цвет glow-точки героя в уровне (param/проп движка) и на `PetSprite` на карте.
|
|
Хранить выбор (localStorage сейчас; серверно — опц.). Разблокировка скинов по XP/звёздам.
|
|
- [ ] Task 6: Нарратор: `PetSprite.render(...)` в интро уровня (краткая формулировка «почини закон…»)
|
|
и на экране победы (реакция по числу звёзд: happy/ecstatic). Реюз mood из pet-sprite.js.
|
|
- [ ] Task 7: Навигация: карта → уровень → результат → возврат на карту с обновлённым статусом/XP.
|
|
- [ ] Task 8: Тесты: разблокировка (логика чистой функцией — юнит-тест), агрегация XP; смоук карты.
|
|
|
|
## Files to Modify/Create
|
|
- `frontend/js/game/levels.js` — контент мира (расширить).
|
|
- `frontend/js/game/map.js` — карта-созвездие.
|
|
- `frontend/js/game/quantik-game.js` — навигация карта↔уровень, XP/скин в шапке.
|
|
- `frontend/quantik.html` — разметка карты/шапки.
|
|
- (опц.) `backend` — поле/агрегация игрока, если решим серверно; иначе клиентская агрегация прогресса.
|
|
- тест(ы) разблокировки/XP.
|
|
|
|
## Acceptance Criteria
|
|
- Карта показывает мир, статусы и звёзды; пройденные уровни открывают следующие.
|
|
- XP/уровень Квантика растут; смена скина видна и на карте, и в уровне.
|
|
- Нарратор-Квантик появляется на интро/победе с корректным настроением.
|
|
- Тесты разблокировки/XP зелёные; lint baseline 0; existing тесты не сломаны.
|
|
|
|
## Notes
|
|
- Без эмодзи — звёзды/иконки только inline SVG (`.ic`).
|
|
- Разблокировку держать **данными/чистой функцией** (легко тестировать и переносить на сервер).
|
|
- Не плодить серверные таблицы без нужды: прогресс уже в `game_progress` (Ф1); XP можно агрегировать.
|
|
|
|
## Review Checklist
|
|
- [ ] Все задачи; чистая функция разблокировки покрыта тестом; без эмодзи/eval
|
|
- [ ] Карта/навигация работают; existing тесты целы; lint baseline 0
|
|
|
|
## Handoff to Next Phase
|
|
<!-- Заполняет агент-имплементер. -->
|