feat: Sprint 3 — Prestige Loop endless
Some checks failed
CI/CD — Build & Deploy / Build & Deploy (push) Failing after 35s

- Migration saves: saveVersion pattern + migrateSave lazy (v1→v2)
- Formule ADN rebalancée: log10 + clamp min 1 + cap bonus ×4
- Prestige Experience: modal fullscreen, preview ADN, stats run, best run
- Arbre V2: 25 nœuds, 3 capstones, post-capstones repeatables (scaling par tranche)
- Convergence évolutif Alpha→Omega (tier system)
- Reset arbre: 1 gratuit/prestige, payant linéaire au-delà
- Milestones prestige: 8 paliers (1→100), cosmétiques exclusifs, bonus gameplay
- balance.ts: constantes centralisées pour playtest
- 136 tests green, 0 regression
This commit is contained in:
2026-03-28 18:24:24 +01:00
parent f80f071c24
commit ed8cf87d4e
22 changed files with 1917 additions and 158 deletions

View File

@@ -15,18 +15,20 @@ class GameSaveManager extends AbstractManager {
async upsert(userId, gameState, metadata) {
const { lifetimeTadpoles, prestigeCount, playTimeSeconds } = metadata;
const saveVersion = gameState.saveVersion ?? 1;
const gameStateJson = JSON.stringify(gameState);
const [result] = await this.database.query(
`INSERT INTO ${this.table} (user_id, game_state, lifetime_tadpoles, prestige_count, play_time_seconds)
VALUES (?, ?, ?, ?, ?)
`INSERT INTO ${this.table} (user_id, game_state, save_version, lifetime_tadpoles, prestige_count, play_time_seconds)
VALUES (?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
game_state = VALUES(game_state),
save_version = VALUES(save_version),
lifetime_tadpoles = VALUES(lifetime_tadpoles),
prestige_count = VALUES(prestige_count),
play_time_seconds = VALUES(play_time_seconds),
last_save = CURRENT_TIMESTAMP`,
[userId, gameStateJson, lifetimeTadpoles, prestigeCount, playTimeSeconds]
[userId, gameStateJson, saveVersion, lifetimeTadpoles, prestigeCount, playTimeSeconds]
);
return result.affectedRows;