# Phase 4: Квантовые способности + SR-комнаты **Status:** ✅ Done (reviewed — PASS, committed) **Parent plan:** [PLAN.md](./PLAN.md) **Domain:** fullstack ## Objective Фирменные «квантовые» механики, дающие герою идентичность, плюс связка с флешкарт-SR: **суперпозиция** (раздвоение), **коллапс/пауза** (точный прицел), **туннелирование** (проход сквозь тонкую стену за «энергию», которую даёт быстрое SR-повторение). ## Tasks - [x] Task 1: Суперпозиция: уровни L12/L13 с двумя телами `ball`+`ball2`, общий закон (theta,v) рулит обеими зеркально; `goal.when` ссылается на `ball.*` И `ball2.*` (победа — только обе). Реюз мульти-body физики. ball2 — полупрозрачный «фантом» (tintHeroSpec в quantik-game.js). - [x] Task 2: Коллапс/пауза-прицел: уровень L14 несёт пунктир-`plot` (id 'aim') с предсказанной параболой текущего закона; способность «Прицел» = пауза-тоггл (`inst.pause/play`) для прицела. - [x] Task 3: Туннелирование: барьер = `forbidden`-зона `wall`; `fail:'wall.hit && tunnel<1'`. Способность «Туннель» тратит TUNNEL_COST энергии → `inst.setParam('tunnel',1)` (стена проницаема). `tunnel` — НЕ слайдер (только способность); отсутствует в env → 0 → стена сплошная. - [x] Task 4: SR-комната: `QuantikAbilities.openRestRoom` — мини-сессия повторения в модалке (НЕ iframe). `LS.fcListDecks → fcStudySession → fcReview`; «Знаю/Легко» начисляют энергию. Пусто (нет колод/нет due) → дружелюбное окно + ссылка `/flashcards`. - [x] Task 5: Контент — глава `quantum` (5 уровней): L12/L13 суперпозиция, L14 прицел, L15/L16 туннель. - [x] Task 6: Тесты (headless vm + РЕАЛЬНЫЕ движки): суперпозиция (оба тела), энергия (grant/spend/ reward чистая логика), tunnel flips fail, per-level solvability sweep (5/5 выигрываемы, full-star достижим), регресс существующих 11 уровней без throw. 48/48; harness удалён. ## Files to Modify/Create - `frontend/js/labs/_sim_engine.js` — поле `tunnelable` у стены + расход энергии (аддитивно, документировать). - `frontend/js/game/quantik-game.js` — способности, HUD энергии, SR-комната-модалка. - интеграция с флешкарт-SR (клиентский модуль повторения / `LS` API). - `frontend/js/game/levels.js` — уровни способностей. - тест(ы). ## Acceptance Criteria - Суперпозиция: победа только когда обе копии выполнили условие. - Коллапс: на паузе виден предсказанный путь. - Туннелирование тратит энергию; SR-повторение её пополняет; стена проницаема только при заряде. - Без eval/эмодзи; existing симуляции/SR не сломаны; тесты зелёные; lint baseline 0. ## Notes - Имя param `e` зарезервировано (число Эйлера в SimExpr) — для энергии брать `energy`/`charge`. - SR-движок повторения уже существует — переиспользовать, не дублировать расписание. ## Review Checklist - [x] Все задачи; аддитивность; без эмодзи/eval; тесты зелёные; lint baseline 0 ## Handoff to Next Phase ### Что добавлено (файлы) - **Новый** `frontend/js/game/quantik-abilities.js` (`window.QuantikEnergy` + `window.QuantikAbilities`). - `frontend/js/game/levels.js` — глава `quantum` (L12–L16) + `CHAPTERS.quantum`. - `frontend/js/game/quantik-game.js` — `tintHeroSpec` тинтует `ball2` (фантом); `start()` монтирует `QuantikAbilities.mountBar` (оборачивает `inst.destroy` для снятия панели); `openRest()` + сброс `abilities.resetAbilities()` на «Ещё раз». - `frontend/quantik.html` — `