opolyx hat jetzt eine Stimme: Ton und Stummschalter
Das Spiel war völlig stumm. Jetzt machen Würfel, Figuren, Geld, Auktionsticken und der Siegesklang alle ein Geräusch – mit einer Taste, um alles abzuschalten.

Kurz gesagt
Bis zu diesem Update gab opolyx überhaupt keinen Ton von sich. Kein leises Spiel – ein buchstäblich stummes: Es gab nirgendwo in der App Audio. Eine Sechs zu würfeln und bankrottzugehen fühlte sich exakt gleich an.
Jetzt sind die Momente hörbar, auf die es ankommt. Nichts läuft in Schleife, nichts spielt im Hintergrund – jedes Geräusch hängt an etwas, das gerade auf dem Brett passiert ist:
- die Würfel, sobald du auf Würfeln drückst – und noch einmal, wenn sie auf ihren Zahlen zur Ruhe kommen;
- deine Figur, ein Schritt pro Feld, während sie über das Brett läuft;
- Geld, das den Besitzer wechselt: Miete, Steuern, ein Feld kaufen, bauen;
- die Auktionsuhr, die durch die letzten fünf Sekunden deines Gebots tickt;
- das Jackpot-Rad und der Klang, wenn du eine Partie gewinnst oder verlierst.
Der Ton ist standardmäßig an. Wenn du lieber lautlos spielst, schaltet die Lautsprechertaste in der oberen Leiste mit einem Klick alles ab, und deine Wahl wird auf diesem Gerät gemerkt – es ist die erste Einstellung, die opolyx je für dich gespeichert hat.
Auch die Highlight-Clips, die wir auf YouTube, Instagram und TikTok stellen, waren stumm. Sie tragen jetzt dieselben Signale wie das Spiel, ein Bankrott im Clip klingt also wie ein Bankrott am Tisch.
Für technisch Neugierige
Die Wiedergabe läuft über Web Audio statt über ein Audio-Element pro Signal. Dekodierte Puffer bringen Mehrstimmigkeit (ein landender Würfel über einem Bewegungsschritt), sample-genaue Planung und bleiben innerhalb der bestehenden Content-Security-Policy – jede Datei kommt von unserer eigenen Domain.
Welches Signal zu welchem Ereignis erklingt, ist ein erschöpfender Switch über die Ereignis-Union der Engine, ein neues Domänenereignis lässt die Typprüfung also scheitern, bis jemand entscheidet, ob es ein Geräusch macht:
// lib/sound/events.ts — exhaustive over DomainEvent['kind']
export function soundForEvent(e: DomainEvent, viewerSlot: number | null): SoundId | null {
switch (e.kind) {
case 'rent_paid':
return e.payload.amount >= BIG_RENT ? 'cash-big' : 'cash';
case 'player_bankrupt':
return 'bankrupt';
// …every kind handled; no default, so a new event is a type error
}
}Vier Signale sind zeit- statt ereignisgesteuert, weil das Serverereignis nicht der Moment ist, in dem der Spieler die Handlung wahrnimmt. Der Wurf löst beim Klick aus (0 ms), das Landen am Ende der 3D-Würfelanimation, der Schritt pro Feld in der Hüpfschlange der Figur, und Sieg/Niederlage beim Einblenden des Ergebnisbildschirms.
| Signal | Löst aus bei |
|---|---|
| dice-roll | dem Klick, nicht der Serverantwort |
| dice-land | dem Ende der 3D-Würfel-Setzanimation |
| move-step | jedem Feld in der Hüpfschlange der Figur |
| tick | den letzten 5 Sekunden deines eigenen Zuges oder Gebots |
| victory / defeat | dem Einblenden des Ergebnisbildschirms |
Alle 26 Dateien sind CC0, beschnitten, auf einen Spitzenpegel von −3 dBFS normalisiert und als Mono-MP3 kodiert – MP3 statt Ogg, weil Safari auf iOS Ogg Vorbis nicht dekodieren kann. Das Build-Skript prüft nach dem Kodieren den Spitzenpegel: Eine frühere Fassung lieferte Dateien mit der richtigen Länge, der richtigen Größe und ganz ohne hörbaren Ton aus, weil ein Ausblendfilter alles jenseits seines Fensters stummgeschaltet hatte.
