feat(sasch40): major overhaul with doodle jump, party bunker, and guitar hero

- Add global settings & pause modal (gear icon) with mute and reset, removing obsolete bag button
- Extend Prologue with Flo Maier (castle fire game over & Löschzug restart) and Viktor (vampire bite game over & Knoblauch restart)
- Rebuild Akt II as 3-level vertical Doodle Jump climber to rescue sisters Saskia, Maja, and Miriam with custom pixel portraits
- Update Akt III Schankraum with seamless oak floor, double-tap 'Luke zum Party Bunker', duel intro modals, and Hansi's departure in Hinterland
- Rebuild Akt IV as 3-lane medieval Guitar Hero rock concert with live crowd meter, combo multipliers, and Hansi duo
- Update AGENTS.md architectural documentation and playtest test suite
This commit is contained in:
Moritz Graf
2026-09-24 18:22:28 +02:00
parent 6374ba9e8a
commit 8a0b65c3fa
22 changed files with 2307 additions and 1250 deletions
@@ -15,6 +15,7 @@ export interface GameState {
startTime: number
elapsedSeconds: number
soundMuted: boolean
isPaused: boolean
}
export const STORAGE_KEY = 'sasch40_game_save_v1'
@@ -34,6 +35,7 @@ function getInitialState(): GameState {
startTime: Date.now(),
elapsedSeconds: 0,
soundMuted: false,
isPaused: false,
}
if (typeof window === 'undefined' || !window.localStorage) {
@@ -56,7 +58,8 @@ function getInitialState(): GameState {
unlockedEasterEggs: Array.isArray(parsed.unlockedEasterEggs) ? parsed.unlockedEasterEggs : [],
startTime: typeof parsed.startTime === 'number' ? parsed.startTime : defaults.startTime,
elapsedSeconds: typeof parsed.elapsedSeconds === 'number' ? parsed.elapsedSeconds : 0,
soundMuted: Boolean(parsed.soundMuted)
soundMuted: Boolean(parsed.soundMuted),
isPaused: false
}
if (state.soundMuted) {
sound.setMuted(true)
@@ -197,6 +200,14 @@ export const useGameStore = defineStore('game', {
this.soundMuted = sound.toggleMute()
},
pauseGame() {
this.isPaused = true
},
resumeGame() {
this.isPaused = false
},
resetGame() {
if (typeof window !== 'undefined' && window.localStorage) {
try {