feat(sprint1-step3b): backend save system + anti-cheat + données rattrapées

- game_saves table + migration 002 (JSON state, anti-cheat metadata)
- saveControllers.js : load/save avec validation delta ressources (750k/s × 1.1)
- GameSaveManager : upsert MySQL ON DUPLICATE KEY UPDATE
- useSaveSync hook : auto-save 30s + keepalive beforeunload + guest fallback
- save-validation.test.ts : 8 tests anti-cheat
- economy.ts : arbre d'évolution 5 nœuds + prestige ADN (rattrapage step 2)
- economy.test.ts : +40 tests (évolution tree, multipliers, start bonus)
- GDD + SPRINT1.md : docs sprint complètes
- Rethème data : shop.json, Achievements.json, Cookie, Legal (rattrapage step 1)
This commit is contained in:
2026-03-20 13:40:16 +01:00
parent 9f0ccda99b
commit a52746ed0c
20 changed files with 1167 additions and 152 deletions

View File

@@ -0,0 +1,14 @@
-- Migration 002 — Game saves with anti-cheat metadata
-- Safe: CREATE TABLE IF NOT EXISTS, no data loss
-- Run: mysql -u <user> -p clickerz < migrations/002_game_saves.sql
CREATE TABLE IF NOT EXISTS game_saves (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL UNIQUE,
game_state JSON NOT NULL,
last_save TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
lifetime_tadpoles BIGINT DEFAULT 0,
prestige_count INT DEFAULT 0,
play_time_seconds INT DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

View File

@@ -1,3 +1,4 @@
DROP TABLE IF EXISTS game_saves;
DROP TABLE IF EXISTS users;
CREATE TABLE users (
@@ -10,3 +11,14 @@ CREATE TABLE users (
lastname VARCHAR(50) NULL,
super_oauth_id VARCHAR(36) NULL UNIQUE
);
CREATE TABLE game_saves (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL UNIQUE,
game_state JSON NOT NULL,
last_save TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
lifetime_tadpoles BIGINT DEFAULT 0,
prestige_count INT DEFAULT 0,
play_time_seconds INT DEFAULT 0,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);