feat(sasch40): improve Act III, add state persistence and fix portraits

- Fix character portrait crops and version assets to portrait_v2, ensuring correct identities (resolving Nat/Verena mismatch)
- Update Schankraum scene image and configure Nginx cache-control to prevent stale asset caching
- Make secret beer tap completely invisible in tavern until clicked
- Reposition room hotspots in Act III to eliminate overlapping click targets
- Add exit button [✕] to Bavarian Gstanzl duel minigame
- Implement localStorage persistence in gameStore to maintain progress across page reloads
- Enable clean game state and storage reset when clicking "Nochmal spielen"
- Expand automated playtest script to cover Nat dialogue, duel exit, reload persistence, and game restart
This commit is contained in:
Moritz Graf
2026-09-24 11:03:22 +02:00
parent 7a7038e2c2
commit e45dbc2e19
34 changed files with 363 additions and 78 deletions
@@ -13,7 +13,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'sascha',
name: 'König Sascha I.',
title: 'Der 40-jährige Imperator',
portrait: '/assets/characters/sascha/portrait.jpg',
portrait: '/assets/characters/sascha/portrait_v2.jpg',
description: 'Herrscher über Haumdaucher, Träger der heiligen Sonnenbrille und Beschützer des 135-BPM-Basses.',
famousQuote: 'O zapft is im Reiche! Wo san meine Kronkorken?!',
themeColor: '#d4af37'
@@ -22,7 +22,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'mop',
name: 'Mop (Moritz)',
title: 'Der Welten-Erschaffer & Matrix-Architekt',
portrait: '/assets/characters/mop/portrait.jpg',
portrait: '/assets/characters/mop/portrait_v2.jpg',
description: 'Sitzt auf einer Wolke über dem Schloss und baut aus Pixeln und Hopfen diese Welt.',
famousQuote: 'Just adding a few more polygons here... wait, pixels. Pixels.',
themeColor: '#38bdf8'
@@ -31,7 +31,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'nat',
name: 'NAT (Josef)',
title: 'Hof-Chronist & Barde des Wildschweins',
portrait: '/assets/characters/nat/portrait.jpg',
portrait: '/assets/characters/nat/portrait_v2.jpg',
description: 'Kennt alle 3 Staffeln Bridgerton in- und auswendig, trägt florale Bomberjacken und erzählt epische Geschichten.',
famousQuote: 'Also pass auf Sascha... ich damals mit meinen Girls ab...',
themeColor: '#22c55e'
@@ -40,7 +40,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'verena',
name: 'Königin Verena',
title: 'Herrin des Hofes',
portrait: '/assets/characters/verena/portrait.jpg',
portrait: '/assets/characters/verena/portrait_v2.jpg',
description: 'Liebt Sascha über alles auf der Welt, hat aber ein unumstößliches königliches Edikt erlassen.',
famousQuote: 'Ich hab dich lieb mein Schatz, aber ich putze nach der Party fei ned!',
themeColor: '#ec4899'
@@ -49,7 +49,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'hansi',
name: 'Hansi (Johann)',
title: 'Ritter der floralen Garde',
portrait: '/assets/characters/hansi/portrait.jpg',
portrait: '/assets/characters/hansi/portrait_v2.jpg',
description: 'Perfekt gestylter Schnurrbart und florale Plattenrüstung.',
famousQuote: 'Habe die Ehre! Der Bass im Rittersaal ist auf Punkt.',
themeColor: '#6366f1'
@@ -58,7 +58,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'lutz',
name: 'Lutz',
title: 'Der ZTUL-Hofschornsteinfeger',
portrait: '/assets/characters/lutz/portrait.jpg',
portrait: '/assets/characters/lutz/portrait_v2.jpg',
description: 'Ein Hüne von Gestalt mit Kappe, runder Brille und dem legendären ZTUL-Trikot.',
famousQuote: 'Glück auf, Euer Durchlaucht! Schornstein ist frei für den Party-Nebel.',
themeColor: '#64748b'
@@ -67,7 +67,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'armend',
name: 'Armend',
title: 'Meister-Schmied der Kronkorken-Manufaktur',
portrait: '/assets/characters/armend/portrait.jpg',
portrait: '/assets/characters/armend/portrait_v2.jpg',
description: 'Prachtvoller Vollbart, formt aus 40 Kronkorken den goldenen Sound-Verstärker.',
famousQuote: 'Schlag zu, solange das Blech warm ist!',
themeColor: '#f97316'
@@ -76,7 +76,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'amy',
name: 'Amy (Amelie)',
title: 'Die Hof-Künstlerin',
portrait: '/assets/characters/amy/portrait.jpg',
portrait: '/assets/characters/amy/portrait_v2.jpg',
description: 'Kreatives Genie in Latzhose mit Dutt und feinen Kräuter-Zigarren.',
famousQuote: 'Rave the Kingdom! Die Farben brauchen mehr Bass!',
themeColor: '#a855f7'
@@ -85,7 +85,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'pue',
name: 'Pü (Jakob)',
title: 'Lichtmeister & Kristall-Rave-Magier',
portrait: '/assets/characters/pue/portrait.jpg',
portrait: '/assets/characters/pue/portrait_v2.jpg',
description: 'Lässt im geheimen Hinterzimmer die Disco-Kristalle tanzen und erhellt die Entourage mit bunten Lasern.',
famousQuote: 'Bass auf Anschlag, Kristalle auf Stroboskop! Willkommen im geheimen Hinterzimmer!',
themeColor: '#eab308'
@@ -94,7 +94,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'mario',
name: 'Mario',
title: 'Hof-Gaukler & Kettensägen-Virtuose',
portrait: '/assets/characters/mario/portrait.jpg',
portrait: '/assets/characters/mario/portrait_v2.jpg',
description: 'Jongliert furchtlos auf dem Marktplatz mit kreischenden Kettensägen und Hopfenkrügen.',
famousQuote: 'Pass auf die Zinken auf! Kettensägen-Akrobatik für König Sascha!',
themeColor: '#14b8a6'
@@ -103,7 +103,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'mane',
name: 'Mane (Ramona)',
title: 'Königliche Alpen-Wanderin',
portrait: '/assets/characters/mane/portrait.jpg',
portrait: '/assets/characters/mane/portrait_v2.jpg',
description: 'Zieht mit Wanderstock, Sonnenbrille und Flechtzopf durchs alpine Hinterland von Haumdaucher.',
famousQuote: 'Schee ists hier! Noch 3 Kilometer über den Grat bis zum Gipfel-Bier!',
themeColor: '#84cc16'
@@ -112,7 +112,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'flo_maier',
name: 'Flo Maier',
title: 'Hof-DJ & Sound-Ingenieur',
portrait: '/assets/characters/flo_maier/portrait.jpg',
portrait: '/assets/characters/flo_maier/portrait_v2.jpg',
description: 'Mastermind an den Turntables und Behüter der heiligen 135-BPM-Frequenz.',
famousQuote: 'Dieser Track drückt mehr als die königliche Kutsche!',
themeColor: '#0284c7'
@@ -121,7 +121,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'viktor',
name: 'Viktor',
title: 'Nachtwächter & Party-Ritter',
portrait: '/assets/characters/viktor/portrait.jpg',
portrait: '/assets/characters/viktor/portrait_v2.jpg',
description: 'Wacht im samtenen Vampir-Umhang über das Nachtleben und sorgt für eiskaltes Helles.',
famousQuote: 'Die Nacht ist jung und der Gerstensaft fließt in Strömen!',
themeColor: '#b91c1c'
@@ -130,7 +130,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'djs',
name: 'Die Hof-DJs',
title: 'Minnesänger der 135 BPM',
portrait: '/assets/characters/flo_maier/portrait.jpg',
portrait: '/assets/characters/flo_maier/portrait_v2.jpg',
description: 'Stehen an der königlichen Kanzel am doppelten Eichenholz-Plattenteller.',
famousQuote: 'Drop it like it\'s 1426! Mehr Bass auf die Burgzinnen!',
themeColor: '#06b6d4'
@@ -139,7 +139,7 @@ export const CHARACTERS: Record<string, CharacterConfig> = {
id: 'gefolge',
name: 'Das Haumdaucher Gefolge',
title: 'Die feiernde Reichs-Crowd',
portrait: '/assets/characters/viktor/portrait.jpg',
portrait: '/assets/characters/viktor/portrait_v2.jpg',
description: 'Viktor der Vampir-Ritter, DJ Flo Maier, Hansi, Fabian, Albin, der bärtige Guatemalteke, Markus & Nathalie.',
famousQuote: 'Ein Hoch auf König Sascha! Hoch soll er leben!',
themeColor: '#e11d48'