@
feat(quantik-game): фаза 1 — оболочка игры + физ-уровень + прогресс (MVP) Страница /quantik монтирует уровень-спеку в SimEngine (игровой режим: HUD из Ф0 + слайдеры закона + play/reset), на победу шлёт результат и показывает экран успеха (звёзды/время/попытки, inline SVG). Уровень phys-artillery-1 как данные (levels.js): гравитация + запуск тела из угла/скорости, портал, бонус-звезда. Бэкенд: миграция 076 game_progress (UNIQUE user+level), /api/game/progress (GET свой / POST upsert best time/stars, attempts++, auth-only, валидация входа), клиент LS.gameProgress*, пункт сайдбара. game.test.js 13/13; npm test 251 pass/8 baseline; lint:routes 0. Уровень проверен на реальном интеграторе (311 выигрышных комбо, 31 на 3★). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> @
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
-- ═══════════════════════════════════════════════════════════════
|
||||
-- 076: Game progress (Квантик — Законы Мира, Фаза 1).
|
||||
--
|
||||
-- Прогресс игрока по уровням игры «Квантик». Уровень идентифицируется
|
||||
-- строковым level_id (напр. 'phys-artillery-1'); сами уровни — это спеки
|
||||
-- SimForge (встроенные данные сейчас, custom_sims cat='game' в Ф5).
|
||||
--
|
||||
-- Upsert хранит ЛУЧШИЙ результат: best_time_ms (минимальное время прохождения),
|
||||
-- best_stars (максимум собранных звёзд 0..3). attempts растёт на каждый submit.
|
||||
-- UNIQUE(user_id, level_id) — одна строка прогресса на пару игрок-уровень.
|
||||
-- user_id ON DELETE CASCADE — прогресс удаляется вместе с игроком.
|
||||
-- ═══════════════════════════════════════════════════════════════
|
||||
|
||||
CREATE TABLE IF NOT EXISTS game_progress (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
level_id TEXT NOT NULL, -- идентификатор уровня (спека)
|
||||
best_time_ms INTEGER, -- лучшее (минимальное) время, мс
|
||||
best_stars INTEGER NOT NULL DEFAULT 0, -- лучшее число звёзд 0..3
|
||||
attempts INTEGER NOT NULL DEFAULT 0, -- число попыток (++ на submit)
|
||||
completed_at TEXT DEFAULT (datetime('now')), -- время первого прохождения
|
||||
UNIQUE (user_id, level_id)
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_game_progress_user ON game_progress (user_id);
|
||||
Reference in New Issue
Block a user