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> @
50 lines
4.4 KiB
Markdown
50 lines
4.4 KiB
Markdown
# Phase 3: Граф-уровни (движение по f(x)) + зоны-препятствия
|
|
|
|
**Status:** ⬜ Not Started
|
|
**Parent plan:** [PLAN.md](./PLAN.md)
|
|
**Domain:** fullstack
|
|
|
|
## Objective
|
|
Новый тип уровня: Квантик движется по кривой `y=f(x)`, которую **собирает игрок** (настраивает
|
|
параметры/выбирает выражение). Препятствия — «запретные зоны»; цель/звёзды/проигрыш — выражения.
|
|
Реюз `plot` + `SimExpr`. Сид граф-главы.
|
|
|
|
## Tasks
|
|
- [ ] Task 1: «Бегунок по кривой»: герой-точка с `x` = функция t (напр. линейный проход xmin→xmax),
|
|
`y = f(x)` через ту же скомпилированную функцию, что у `plot`. Кривая рисуется (P3 plot),
|
|
герой едет по ней с glow/trail. Без физики (кинематический проход), либо мягкая физика — на выбор уровня.
|
|
- [ ] Task 2: Тип объекта/поле «зона» (forbidden/target): прямоугольник/круг в мире + удобные
|
|
env-предикаты (или документированный паттерн: `fail:'inzone(...)'`). Реализовать helper-предикаты
|
|
БЕЗ расширения небезопасного синтаксиса — предпочесть готовить булевы поля зон в env
|
|
(напр. `zone1.hit`) на основе позиции героя, чтобы `goal`/`fail` ссылались на них.
|
|
- [ ] Task 3: Цель = добраться до конца/в целевую зону, не задев запретные (`fail`). Звёзды: пройти
|
|
под нормативом, собрать бонус-точки (зоны-сборы).
|
|
- [ ] Task 4: Управление: слайдеры коэффициентов `f(x)` (a·sin(b·x+c)+d и т.п.) ИЛИ выбор/набор
|
|
выражения с inline-проверкой `SimExpr.compile(...).error` (как в sim-builder). Безопасно.
|
|
- [ ] Task 5: Контент: сид граф-главы (~4–5 уровней): синус под мостом, парабола над ямой,
|
|
кусочная подгонка, экспонента/логарифм — растущая сложность, привязка к темам алгебры.
|
|
- [ ] Task 6: Интеграция в карту (Ф2): новая глава-созвездие; общий конвейер результата/XP.
|
|
- [ ] Task 7: Тесты: проход по кривой достигает цели; задевание зоны → fail; смоук рендера кривой+героя.
|
|
|
|
## Files to Modify/Create
|
|
- `frontend/js/labs/_sim_engine.js` — поддержка «бегунка по кривой» (если не выразимо текущими полями)
|
|
и подготовка булевых полей зон в env. Аддитивно, документировать в шапке.
|
|
- `frontend/js/game/levels.js` — граф-глава.
|
|
- `frontend/js/game/quantik-game.js` / `map.js` — новая глава, управление коэффициентами.
|
|
- тест(ы).
|
|
|
|
## Acceptance Criteria
|
|
- Квантик едет по собранной игроком кривой; правильная `f(x)` проводит между препятствиями к цели.
|
|
- Задевание запретной зоны → проигрыш; норматив/сборы дают звёзды.
|
|
- Кривая безопасна (SimExpr, без eval); existing симуляции/уровни не затронуты; тесты зелёные.
|
|
|
|
## Notes
|
|
- НЕ вводить произвольные функции-предикаты в синтаксис выражений (безопасность). Зоны → булевы env-поля.
|
|
- Переиспользовать P3 plot (несколько кривых, заливка, маркеры) для визуала «земли»/препятствий.
|
|
|
|
## Review Checklist
|
|
- [ ] Все задачи; аддитивность движка; без эмодзи/eval; тесты зелёные; lint baseline 0
|
|
|
|
## Handoff to Next Phase
|
|
<!-- Заполняет агент-имплементер. -->
|