LuisAldrichGuz

THREE ARENA

Stack: Three.js, TypeScript, Node.js, Vite

Demo

THREE ARENA

Un motor de arena shooter que corre en el navegador y juega los archivos de verdad de Quake 3 Arena y OpenArena. El contenedor ZIP, el formato BSP de los niveles, los parches de Bézier, los lightmaps horneados y la física del jugador están escritos desde cero en TypeScript y Three.js. Sin motor, sin importador de assets y sin una compilación a WebAssembly del original.

No busco nada con esto. Es un homenaje a uno de los juegos que me inspiró y a John Carmack, que es mi ejemplo a seguir: el crack de cracks.

Lo hago en mi tiempo libre. GPL-2.0-or-later.

El menú principal de Three Arena
54 arenas y tres bots, leídos de los datos originales de 1999
Entrar a una partida
Aparecer, encontrarse al primero y coger lo que haya

Qué hay aquí dentro

Dos mitades que se encuentran en un formato de archivo.

Una tubería que abre un .pk3 —un ZIP lleno de datos de 1999— y escribe un .glb del nivel con su iluminación horneada original, más un JSON con su casco de colisión. Lee el directorio central del ZIP, los diecisiete lumps del BSP, las texturas Targa, los scripts .shader del propio motor y los lightmaps, y tesela los parches de Bézier de los que está hecho cada arco y cada rampa curva de un nivel de Quake.

Y un motor que carga esos dos archivos y los juega.

Convertir un mapa tarda menos de un segundo. wrackdm17 sale en 37 475 triángulos y 2.09 MB, con sus 56 parches, sus 1 002 brushes y los ocho lightmaps metidos en una sola página de atlas.

El visor orbital con las estadísticas de conversión
El visor orbital: lo que costó cada mapa, triángulo a triángulo
El mapa convertido, jugándose
Y el mismo archivo, ya jugándose: la luz es la que se horneó en 1999

La física no se parece a la de Quake. Es la de Quake.

Portada función por función desde bg_pmove.c. Correr mide 319 unidades por segundo contra las 320 del original, y tres strafe jumps encadenados llegan a 465.

El strafe jump sale porque el código de aceleración tiene el mismo comportamiento explotable que tenía el de 1999. No imité la técnica: porté la cuenta, y el truco vino dentro.

El banco de movimiento
Escalera, rampa, losa y esquina, sin un solo dato del juego de por medio

Hay veinticuatro pruebas que afirman cifras exactas del motor original: la velocidad en suelo, lo que ganan tres saltos encadenados, escalones de 16 unidades que se suben y repisas de 26 que no, y esquinas que ni atrapan al jugador ni lo dejan pasar.

Se juega

::carousel images=[{"src": "/media/project-list/images/three-arena/arenas.webp", "alt": "Selector de arenas", "caption": "Las arenas convertidas, con los bots que se les meten"}, {"src": "/media/project-list/images/three-arena/setup.webp", "alt": "Selección de personaje", "caption": "Los modelos de OpenArena, cargados desde sus propios .md3"}, {"src": "/media/project-list/images/three-arena/combate.webp", "alt": "Combate", "caption": "Un bot al otro lado del mapa y el aviso de FIGHT"}, {"src": "/media/project-list/images/three-arena/marcador.webp", "alt": "Marcador en partida", "caption": "El marcador sin salir de la partida"}, {"src": "/media/project-list/images/three-arena/bots.webp", "alt": "Dos bots peleando", "caption": "Los bots se matan entre ellos y el marcador se entera"}, {"src": "/media/project-list/images/three-arena/municion.webp", "alt": "Munición en el suelo", "caption": "Los objetos del mapa salen del BSP, no están puestos a mano"}] height="460px"::

Bajas seguidas
Los bots no esperan turno

Jugar con alguien es un comando más

Por defecto es uno contra bots, y tiene que serlo: la idea es que abra desde un hosting estático sin nada detrás. El servidor es opcional. Se levanta, imprime un enlace, y quien lo abra entra a tu partida — predicción de tu lado, interpolación del otro, y si cierras la pestaña y vuelves, regresas al mismo asiento con tu marcador.

Las armas y el audio todavía no cruzan el cable. Sólo el movimiento, la reconexión y el marcador.

Los datos no están en el repositorio, y es a propósito

Un mapa convertido es obra derivada del mapa del que salió. Subirlo aquí sería redistribuir el arte de OpenArena con mi nombre encima, así que el .gitignore tira los .pk3, los .bsp y los .glb, y el repositorio no trae ni uno.

Los datos los pone quien lo corre, una vez: 426 MB de OpenArena 0.8.8, que es software libre. La tubería apunta ahí y ya.

El código va en GPL-2.0-or-later por lo mismo: para que la conversión que hagas en tu máquina sea tuya sin asteriscos.

Estado

Se juega. Lo voy a desplegar con el modo offline —uno contra los bots—, que es el que ya está. El online lo estoy trabajando: lo que falta es que las armas y el audio crucen la red.

El final de una partida
La última baja y el marcador

Se juega aquí: arena.luisaldrichguz.net. Sólo en computadora, y con el ratón capturado.