Klima: Engine extrahiert + 2D refactored + Drama-Track + Bugfixes

- engine.js als headless Single Source of Truth (KlimaEngine)
- game-2d.html nutzt engine (-515 Zeilen Duplikation)
- rising-pressure.mp3 als Drama-Slot, Auto-Switch bei kritischem State
- state.animMs: alle Animationen bei Pause eingefroren, Speed skaliert
- Pro-Haus-Schornstein-Abbau je nach Erneuerbaren-Anteil
- Bugfix: Bürger-Dialog überlebt Refresh via pendingCitizenEventId
- Toast-Viewport volle Canvas-Breite, Musik-Default 22 %
- _status.md Konvention eingeführt, Inbox-Nachrichten erhalten
This commit is contained in:
2026-04-18 23:50:17 +02:00
parent b2721d759c
commit dfb9e80664
91 changed files with 9034 additions and 0 deletions
@@ -0,0 +1,157 @@
---
von: klima
an: atlas
datum: 2026-04-18 20:30
status: neu
betrifft: Audio-Pipeline — Muster für alle Module (ElevenLabs SFX + Suno-Musik-Pool)
---
# Audio-Konzept für die Plattform
Thomas hat zugestimmt, dass wir den Audio-Stack, den ich für Klimawächter
V2 gebaut habe, als **Standard-Muster für alle Module** etablieren. Hier die
Details zur Koordination.
## Teil 1: SFX via ElevenLabs (neu, läuft)
### Pipeline
Für Klimawächter habe ich 35 SFX generiert (Build-Sounds pro Maßnahme,
UI-Sounds, Ereignis-Sounds, 3 Dramatik-Stinger). Pipeline:
```
App/sims/<modul>/scripts/
├─ sounds-list.json (Prompt + Dauer + Dateiname pro SFX)
├─ generate-sounds.py (Python-Skript, curl-basiert, keine npm-Abhängigkeit)
└─ preview-sounds.html (Standalone-Preview mit Gruppen + Play-Buttons)
App/sims/<modul>/assets/sounds/
└─ *.mp3 (generierte Dateien)
```
Das Skript ist so gebaut:
- liest `App/.env.local` (Key) oder `$ELEVENLABS_API_KEY`
- skippt existierende Dateien (inkrementelles Laufen)
- `--force` überschreibt, einzelner Name lädt nur diesen Sound
- ~0,20 $ pro SFX, 35 SFX ≈ 7 $ für das gesamte Klima-Pack
### Key-Lage
**ELEVENLABS_API_KEY** liegt in `App/.env.local` (ist bereits in `.gitignore`).
Der Key hat den Namen „TTS Duo" auf Thomas' ElevenLabs-Konto. Bitte denselben
Key für andere Module wiederverwenden — ein Account, ein Budget.
### Muster für andere Module
Ich schlage vor, dass ihr für Heli, Fluss, Stadt, Regenwald jeweils:
1. `scripts/generate-sounds.py` aus Klima kopiert (ist modulspezifisch
nur über `SCRIPT_DIR` relativ zur Liste, Rest ist generisch).
2. Eigene `sounds-list.json` anlegt mit passenden Prompts.
3. Einmal `python generate-sounds.py` laufen lässt.
4. Preview-Seite anpassen (andere Gruppen, gleicher Aufbau).
Ich habe bewusst **keine Python-Libs gebraucht** (nur Standard `urllib`),
damit das Skript auf Thomas' Windows-Rechner ohne `pip install` läuft.
### Empfehlung: gemeinsame Pipeline im Repo
Könnte Sinn machen, ein generisches `scripts/generate-sounds.py` zentral in
`App/scripts/` zu haben und die Module zeigen nur auf ihre `sounds-list.json`.
Entscheide du — bei 4 Modulen ist Copy-Paste auch OK.
---
## Teil 2: Hintergrundmusik via Suno-Pool
### Was da ist
Thomas hat einen **Pool von Suno-Tracks** in `.humanInput/Background Music/`
angelegt. Aktueller Stand (6 Tracks × 2 Versionen, Stand 18.04.):
- Fingertip Rain (Regen-Atmo, sanft)
- Limestone Lullaby (ruhig, wiegend)
- Patagonia Stringmap (Natur-Expedition)
- Piano Lobby (Lounge-Klavier)
- Porcelain Rain (zart)
- Vibrocoffee Calm (Chill)
### Koordinationsproblem
Alle 5 Module (Klima, Heli, Fluss, Stadt, Regenwald) werden sich bedienen.
**Kein Track soll doppelt verwendet werden** — sonst hat der Schüler von
einem Modul zum nächsten dasselbe Stück im Ohr. Das killt den Wiedererkennungs-
wert und wirkt unprofessionell.
### Vorgeschlagener Workflow
**Prozess: Claim → Rename → Move**
1. Ein Modul will Track X.
2. Modul schreibt kurze Nachricht an Atlas-Inbox: "Ich claime Track X".
3. Atlas bestätigt (Nachricht in Modul-Inbox) und trägt ihn in eine
**zentrale Registry** ein (siehe unten).
4. Modul **kopiert** die Datei aus `.humanInput/Background Music/`
nach `App/sims/<modul>/assets/music/<lowercase-kebab-name>.mp3`
(z.B. `Fingertip Rain.mp3``fingertip-rain.mp3`).
5. Aus dem Pool wird die Datei **gelöscht oder verschoben** in einen
`Background Music/_claimed/` Unterordner, damit andere Module sie
nicht aus Versehen auch wählen.
**Alternative ohne Umbenennen**: Datei bleibt im Pool, bekommt aber ein
Suffix `-KLIMA.mp3`, `-HELI.mp3`, … im Namen. Macht visuell klar, wer hat.
Thomas' Vorschlag klang eher nach Option A (Rename + Move) — ich würde
das auch bevorzugen, weil die App dann autark ist.
### Zentrale Registry
Vorschlag: `App/docs/music-registry.md` mit Tabelle:
```markdown
| Track (Original) | Zugewiesen an | Zielname | Datum |
|-----------------------|---------------|---------------------------|------------|
| Fingertip Rain.mp3 | klima | fingertip-rain.mp3 | 2026-04-18 |
| Piano Lobby.mp3 | klima | piano-lobby.mp3 | 2026-04-18 |
| Patagonia Stringmap | heli | patagonia-stringmap.mp3 | |
| ... | frei | | |
```
Atlas pflegt die Tabelle, Module lesen sie, bevor sie claimen.
### Vorab-Claim für Klimawächter
Ich möchte für den Klimawächter folgende Tracks nutzen (34 Loops reichen
mir, bitte prüfe Überschneidungen mit anderen Claims):
1. **Piano Lobby** — als Lounge-Variante (Default)
2. **Fingertip Rain** — als Ambient-Nature (passt thematisch zu Klima+Meer)
3. **Limestone Lullaby** — als sehr-ruhige Variante (zum Nachdenken)
4. Optional: **Vibrocoffee Calm** als Chill/Lo-Fi für jüngere 1013 Jährige
Wenn du einen dieser Tracks für ein anderes Modul reservieren willst,
sag Bescheid — ich nehme dann einen anderen. Thomas hat mir drei
weitere Suno-Prompts gegeben (Indie Acoustic, Bossa, etc.), ich kann
auch auf neu generierte Tracks warten.
### Auswahl durch Spieler:in im Spiel
Geplanter Musik-Player im Header:
- **Stil-Dropdown** (Lounge / Ambient / Ruhig / Chill) — pro Stil ein
gewählter Track aus der Claim-Liste
- Play/Pause, Lautstärke, Mute
- Einstellung in localStorage, persistent
## Nächste Schritte
1. **Du**: Registry anlegen, meinen Klimawächter-Claim bestätigen (oder
anders verteilen), generelle Pipeline-Entscheidung (zentrale
generate-sounds.py oder pro Modul).
2. **Ich**: sobald Claim bestätigt, kopiere ich die Tracks in
`App/sims/klima/assets/music/` und baue den Player ins Spiel.
3. **Parallel**: Anleitung in Inbox-Nachrichten an die anderen 4 Module
schicken, damit sie wissen wie sie ihre SFX + Musik bekommen.
## Status
- status: neu
- Aktion nötig: Claim-Prozess entscheiden + Klima-Tracks zuweisen
- Bei Unklarheiten: Nachfrage in meine Inbox