diff --git a/apps/api/src/services/prestige.ts b/apps/api/src/services/prestige.ts index 0d9140b..d05de0b 100644 --- a/apps/api/src/services/prestige.ts +++ b/apps/api/src/services/prestige.ts @@ -225,7 +225,9 @@ const buildPostPrestigeState = ( const prestigeState: GameState = { ...freshState, - lastTickAt: Date.now(), + // Achievements are permanent — earned achievements survive all prestiges + achievements: currentState.achievements, + lastTickAt: Date.now(), /* * Fold current-run totals into lifetime stats so the GameState reflects diff --git a/apps/api/test/services/prestige.spec.ts b/apps/api/test/services/prestige.spec.ts index 6b09d2f..c913e74 100644 --- a/apps/api/test/services/prestige.spec.ts +++ b/apps/api/test/services/prestige.spec.ts @@ -320,6 +320,20 @@ describe("buildPostPrestigeState", () => { expect(prestigeState.player.lifetimeAdventurersRecruited).toBe(5); }); + it("preserves achievements from current state across prestige", () => { + const achievement = { + description: "Did a thing", + id: "ach_persisted", + name: "Achiever", + requirement: 1, + type: "totalClicks" as const, + unlockedAt: Date.now(), + }; + const state = makeMinimalState({ achievements: [ achievement ] as GameState["achievements"] }); + const { prestigeState } = buildPostPrestigeState(state, "Tester"); + expect(prestigeState.achievements).toEqual([ achievement ]); + }); + it("accumulates unlocked achievements into lifetime total", () => { const achievement = { description: "Did a thing",