opolyx ya tiene voz: efectos de sonido y un botón de silencio
El juego era completamente mudo. Ahora suenan los dados, las fichas, el dinero, el reloj de la subasta y la fanfarria de victoria, con un botón para apagarlo todo.

En palabras sencillas
Hasta esta actualización opolyx no emitía ningún sonido. No era un juego tranquilo: era literalmente mudo, no había audio en ninguna parte de la aplicación. Sacar un seis y arruinarte sonaban exactamente igual.
Ahora los momentos que importan se oyen. Nada se repite en bucle ni suena de fondo: cada sonido está ligado a algo que acaba de ocurrir en el tablero.
- los dados, en el instante en que pulsas Tirar, y otra vez al posarse sobre sus números;
- tu ficha, un paso por casilla mientras recorre el tablero;
- el dinero que cambia de manos: alquiler, impuestos, comprar una casilla, construir;
- el reloj de la subasta durante los últimos cinco segundos de tu puja;
- la ruleta del Bote, y la fanfarria al ganar o perder una partida.
El sonido viene activado. Si prefieres jugar en silencio, el botón del altavoz en la barra superior lo apaga todo con un clic y tu elección se recuerda en ese dispositivo: es el primer ajuste que opolyx guarda para ti.
Los clips que publicamos en YouTube, Instagram y TikTok también eran mudos. Ahora llevan los mismos sonidos que el juego, así que una bancarrota en un clip suena como una bancarrota en la mesa.
Para los más técnicos
La reproducción usa Web Audio en lugar de un elemento de audio por sonido. Los búferes decodificados permiten polifonía (unos dados aterrizando sobre un paso de ficha), programación con precisión de muestra y encajan en la política de seguridad de contenido existente: todos los archivos se sirven desde nuestro propio dominio.
Qué sonido corresponde a cada evento se resuelve con un switch exhaustivo sobre la unión de eventos del motor, de modo que añadir un evento nuevo rompe el typecheck hasta que alguien decide si debe sonar:
// 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
}
}Cuatro sonidos dependen del tiempo y no del evento, porque el evento del servidor no coincide con el momento en que el jugador percibe la acción. La tirada suena al hacer clic (0 ms), el aterrizaje al terminar el asentamiento de los dados 3D, el paso en cada casilla de la cola de saltos de la ficha, y victoria o derrota al montarse la pantalla de resultados.
| Sonido | Se dispara con |
|---|---|
| dice-roll | el clic, no la respuesta del servidor |
| dice-land | el final de la animación de los dados 3D |
| move-step | cada casilla de la cola de saltos de la ficha |
| tick | los últimos 5 segundos de tu turno o tu puja |
| victory / defeat | el montaje de la pantalla de resultados |
Los 26 archivos son CC0, recortados, normalizados a un pico de −3 dBFS y codificados en MP3 mono: MP3 y no Ogg porque Safari en iOS no puede decodificar Ogg Vorbis. El script de construcción comprueba el pico ya codificado; una versión anterior llegó a generar archivos con la duración y el tamaño correctos y sin sonido audible, porque un filtro de fundido había silenciado todo lo posterior a su ventana.
