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> @
44 lines
3.3 KiB
Markdown
44 lines
3.3 KiB
Markdown
# Phase 6: Класс-лидерборд / живая гонка (classroom SSE)
|
|
|
|
**Status:** ⬜ Not Started
|
|
**Parent plan:** [PLAN.md](./PLAN.md)
|
|
**Domain:** fullstack
|
|
|
|
## Objective
|
|
Соревновательный слой: лидерборды по уровню/классу и опциональная **живая гонка** в онлайн-уроке
|
|
(реюз classroom SSE + моста `sim_state`/`apply_sim_state` из Ф7 sim-builder).
|
|
|
|
## Tasks
|
|
- [ ] Task 1: API лидерборда: `GET /api/game/leaderboard?level_id=...&scope=class|global` — топ по
|
|
времени/звёздам. Источник — `game_progress` (best per user). Доступ: класс — только своему классу.
|
|
- [ ] Task 2: UI лидерборда: на экране уровня/победы и на карте — топ класса (имена/время/звёзды),
|
|
позиция игрока. Inline SVG-медали, без эмодзи.
|
|
- [ ] Task 3: Живая гонка (опц.): учитель в classroom запускает уровень классу; ученики решают
|
|
одновременно; прогресс/финиши транслируются через существующий SSE-relay. Реюз iframe-конвейера
|
|
`/lab?embed=...` НЕ требуется — гонка может жить на `/quantik` с гоночной комнатой по classId.
|
|
- [ ] Task 4: Сервер: relay результатов гонки (минимальный, поверх существующего SSE), без новых
|
|
тяжёлых таблиц — эфемерное состояние гонки в памяти/коротком хранилище.
|
|
- [ ] Task 5: Тесты: лидерборд отдаёт корректный топ и режет чужой класс; submit обновляет позицию;
|
|
смоук UI.
|
|
|
|
## Files to Modify/Create
|
|
- `backend/src/controllers/gameController.js`, `routes/game.js` — leaderboard (+ гонка-relay).
|
|
- `frontend/js/game/quantik-game.js` / `map.js` — UI лидерборда + гоночная комната.
|
|
- (опц.) интеграция кнопки запуска гонки в classroom.html (аддитивно, как Ф7 sim-builder).
|
|
- тест(ы).
|
|
|
|
## Acceptance Criteria
|
|
- Лидерборд по классу/глобально корректен и изолирован по классу; позиция игрока видна.
|
|
- Живая гонка (если включена) синхронит финиши классу через SSE; закрытие чистое.
|
|
- Без эмодзи/eval; existing функционал цел; тесты зелёные; lint baseline 0.
|
|
|
|
## Notes
|
|
- Реюз durable-уведомлений `pushNotif` для приглашения в гонку; эфемерный прогресс — через SSE.
|
|
- classroom.html — большой; искать через vex по DOM-id, точечный Read (ast-index не индексит inline-script).
|
|
|
|
## Review Checklist
|
|
- [ ] Все задачи; изоляция по классу; аддитивность classroom; без эмодзи/eval; тесты зелёные
|
|
|
|
## Handoff to Next Phase
|
|
<!-- Финальная фаза — далее комплексное ревью и мерж в feature/sim-builder. -->
|