Burrr.io: un juego multijugador en tiempo real de taladros en un planeta redondo

Taladros que excavan un planeta redondo, crecen, se cazan entre sí y se esconden en silencio. Burrr.io es un juego de navegador para ordenador y móvil: sin instalación, sin registro, un clic en Jugar — y detrás, un servidor en Go que dirige cada partida y un motor gráfico ajustado para que el móvil no se caliente.

Burrr.io: un juego multijugador en tiempo real de taladros en un planeta redondo
Ver proyecto:
burrr.io
Burrr.io: un juego multijugador en tiempo real de taladros en un planeta redondo

La idea

Burrr.io es un producto propio, no un encargo: un juego multijugador del género .io — abres un enlace, escribes un apodo, pulsas Jugar y en segundos estás en un mapa compartido con otros jugadores. Controlas un taladro, una sierra circular que abre túneles en la tierra, recoge mineral y cristales, crece a medida que puntúa y lucha contra otros taladros. Funciona en el navegador del ordenador y del móvil, en inglés, español y ruso.

El género tiene un punto débil conocido: a los pocos minutos se reduce a «mantener el botón y dar vueltas». El objetivo de diseño de Burrr.io era el contrario: una decisión real cada minuto — dónde excavar, esconderse o atacar, si las capas profundas compensan el riesgo.

Jugabilidad

El mapa es un planeta visto en sección. La gravedad tira hacia el núcleo y la roca se dispone en anillos: tierra blanda junto a la superficie, después arcilla y piedra, después basalto y magma, y lava en el núcleo. Cuanto más hondo, más cuesta excavar — y más rico es el mineral.

El terreno está vivo. La arena y la grava forman bolsas dentro de la roca firme y se derrumban sobre el túnel de debajo, encima de quien esté excavando allí. Los lagos subterráneos inundan los túneles cuando alguien rompe su pared, la lava quema y las bolsas de gas envenenan o explotan. Los túneles viejos vuelven a cerrarse poco a poco, así que el planeta nunca queda agotado.

Cada pocos minutos el mapa cambia los planes de todos: una erupción de magma sube desde el núcleo y empuja a toda la sala hacia la superficie, o cae en algún punto un meteorito lleno de cristales que se convierte en el lugar por el que pelear.

La información es un arma. Cada taladro ve solo lo que está en su línea de visión — la roca tapa la vista, un túnel deja ver más lejos a lo largo de él — y el resto es niebla de guerra. Cada taladro hace ruido — cuanto más grande y rápido, más fuerte — y el minimapa muestra los anillos de ese ruido, no posiciones exactas. Apaga el motor y desapareces del sonar de todos: así son posibles las emboscadas.

Entre partidas el jugador mantiene una progresión ligera: monedas del oro que excava, una recompensa diaria que crece con la racha, un arsenal de objetos (minas, bláster, láser, impulso, torreta y más) y veinte rangos militares con su insignia junto a cada nombre, para ver de un vistazo contra quién juegas. A eso se suman medallas por hazañas de combate y logros por las pacíficas: atravesar el planeta por el núcleo y salir por el otro lado da su propia pintura de casco.

Dos modos: todos contra todos, con hasta 40 jugadores, y captura la bandera, en la que dos equipos excavan hasta la base fortificada del rival. Los amigos pueden entrar juntos en el mismo mapa con un código o un enlace. El chat solo tiene frases predefinidas, sin texto libre que moderar.

El servidor lo decide todo

En un juego multijugador, todo lo que se confía al cliente alguien lo falsificará. En Burrr.io el navegador solo envía la entrada — rumbo, acelerar, usar objeto, silencio. Todo lo demás se calcula en nuestro servidor: movimiento, excavación, daño, la física de la arena, el agua, la lava y el gas, los bots y los eventos del mapa. La lógica del juego funciona a 20 ciclos por segundo y la física del terreno a 10.

El servidor está escrito en Go: cada sala es un mapa y una gorrutina, y el ciclo no reserva memoria. El protocolo es un formato binario compacto propio sobre WebSocket; cada jugador recibe en cada ciclo solo lo que ve su taladro y solo los campos que han cambiado. La niebla de guerra se aplica en el servidor: el cliente sencillamente nunca recibe la posición de los jugadores que no ve, así que un cliente modificado no tiene nada que revelar. El protocolo se define una sola vez en Go, y unos vectores de prueba compartidos garantizan que el cliente en TypeScript decodifica exactamente lo que codifica el servidor.

El mapa en sí no cuesta tráfico. El planeta se genera a partir de una semilla, y la generación en Go y en TypeScript coincide bit a bit — las pruebas comparan las sumas de control —, así que el cliente construye el mismo planeta por sí mismo y el servidor solo envía lo que ha cambiado desde entonces.

El progreso, las estadísticas y las clasificaciones también viven en el servidor, en MySQL, de modo que no se pueden editar desde el navegador.

Bots que juegan como personas

Una sala vacía es un juego muerto, así que los bots completan la partida de todos contra todos hasta quince participantes y ceden su sitio cuando entra un jugador real. Están hechos para ser indistinguibles de las personas: el protocolo no tiene marca de «bot», tienen apodos creíbles, las mismas pinturas y sierras que la gente y rangos acordes a su fuerza, de modo que la insignia también dice la verdad sobre un bot. Deciden solo por lo que ven y oyen — la misma niebla de guerra y el mismo sonar que un jugador humano —, así que el silencio y las emboscadas también funcionan contra ellos. Respetan los peligros y los eventos del mapa y, tras morir, vuelven a los pocos segundos o, a veces, abandonan la sala para siempre y entra alguien nuevo.

Un juego que no debe calentar el móvil

Un móvil paga cada fotograma en calor y batería, así que el rendimiento es una norma del proyecto, no un añadido. El cliente dibuja con PixiJS (WebGL); el terreno lo pinta un shader propio, que es lo más costoso que hace el juego: cada lectura de textura que contiene se ejecuta para cada uno de cientos de miles de píxeles sesenta veces por segundo. Por eso los datos de cada celda se preparan una sola vez en la CPU al subir un trozo del mapa, las salidas anticipadas del shader deben dar exactamente la misma imagen, y el terreno y los sprites se dibujan a dos resoluciones distintas.

La misma disciplina recorre todo el cliente: lo que se deriva del estado del juego se calcula una vez por ciclo o cuando cambia, nunca en cada fotograma; la interfaz HTML solo recibe valores que realmente han cambiado; el audio no cuesta nada mientras está silenciado; hay niveles de calidad gráfica y un modo de ahorro de batería. Cada cambio en estas rutas se mide en un móvil real antes y después. Un perfilado en un Galaxy S23 con el contador de carga redujo el consumo propio del juego de unos 460 mA a unos 350 mA, una cuarta parte menos.

Llevar la simulación del navegador al servidor persigue el mismo objetivo: el móvil ya no tiene que calcular el mundo ni los bots, solo dibuja lo que envía el servidor.

Infraestructura

El cliente es estático y lo sirve Cloudflare Pages; el servidor del juego y la base de datos funcionan en un servidor de Hetzner en Alemania. Un push a la rama principal despliega mediante GitLab CI. Los despliegues no cortan partidas: el nuevo proceso del servidor arranca junto al antiguo en los mismos puertos, y el antiguo deja de aceptar conexiones y termina sus salas — los jugadores de todos contra todos pasan al nuevo proceso al empezar una nueva vida, y las partidas de captura la bandera llegan a su final.

La capacidad se mide, no se supone: una herramienta de carga conecta clientes simulados a producción. Con 160 de ellos llenando cuatro salas de 40, el ciclo del servidor tarda unos 18 ms de sus 50 ms de presupuesto, tras una ronda de perfilado que eliminó el trabajo repetido de la percepción y de las instantáneas de red. Una página de administración reúne la analítica de producto sin cookies e indica cuándo hará falta un servidor mayor.

Tecnologías

- Cliente: TypeScript + Vite, PixiJS 8 (WebGL), shader de terreno propio, interfaz HTML/CSS
- Servidor de juego: Go (una gorrutina por sala, lógica a 20 ciclos/s, física del terreno a 10 Hz, ciclo sin reservas de memoria)
- Protocolo: WebSocket, formato binario propio, vectores de prueba compartidos entre Go y TypeScript
- Mapa: planeta redondo procedural, generado idéntico a partir de una semilla en cliente y servidor
- Base de datos: MySQL 8.4 (cuentas de invitado, progreso, estadísticas, clasificaciones, analítica)
- Alojamiento: Cloudflare Pages (cliente), Hetzner, Alemania (servidor y base de datos)
- CI/CD: GitLab CI, Docker, despliegues que dejan terminar las partidas en curso
- Herramientas: benchmark de la simulación con sumas de control del estado, clientes de prueba de carga, página de administración con analítica de producto
- Idiomas: inglés, español, ruso

Resultado

Un juego de navegador que empieza con un clic en el ordenador o en el móvil, donde cada partida es un planeta vivo: roca que se derrumba y se inunda, rivales que oyes antes de verlos y bots que no se distinguen de las personas. Debajo, un servidor autoritativo en Go que no deja nada que falsificar a los tramposos, y un motor gráfico medido en un móvil real para que una partida no lo convierta en una estufa de bolsillo.

Jugar a Burrr.io