Files
Learn_System/plans/quantik-game/phase-2-map-world-xp.md
T
Maxim Dolgolyov 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>
@
2026-06-13 15:13:02 +03:00

5.0 KiB

Phase 2: Карта-созвездие + мир физ-уровней + XP/скины (MVP-мир)

Status: Not Started Parent plan: 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