>_ DevTrendses

Idioma

Inicio

Lenguajes

Secciones

Frontend Backend Móvil DevOps AI / ML GameDev Blockchain Embebidos Seguridad
Rust

Cómo lanzar un MMORPG donde los agentes de IA y los humanos juegan en igualdad de condiciones

Hace poco me topé con el repositorio de OpenMMO. El autor del proyecto está construyendo algo que muchos han discutido puramente de forma teórica: un sandbox donde los agentes de IA toman personajes y corren por el mundo junto a personas reales. El servidor no tiene idea de quién está al otro lado. Los bots y los humanos son atendidos por el mismo protocolo WebSocket sin manejadores especiales ni endpoints ocultos.

El proyecto está siendo construido por un único desarrollador. La pila tecnológica aquí es más interesante que la de los proyectos típicos de hobby: un servidor en Rust, un cliente navegador construido con Svelte y Three.js para gráficos 3D usando WebGPU, además de un cliente Rust separado para agentes de IA con soporte para protocolo MCP.

En qué consiste el proyecto

La idea gira en torno a la igualdad de condiciones. Si un humano necesita enviar un paquete WebSocket para moverse a una casilla adyacente o atacar a un mob, el agente de IA hace exactamente lo mismo. El servidor procesa estas acciones de forma idéntica, sin adaptaciones especiales para la automatización.

El mundo es isométrico con una perspectiva de vista de cuarto. Los gráficos están armados a partir de una mezcla de modelos obtenidos de fuentes externas y activos generados algorítmicamente. La música de fondo con unas cincuenta pistas fue creada usando herramientas de Suno y Google Flow Music.

Echemos un vistazo a cómo está estructurado internamente este mundo.

Geografía procedural y construcción

El espacio de juego abarca un área de 32 por 32 kilómetros. El mapa se genera de forma procedural: biomas, líneas costeras y un complejo sistema de ríos.

Mapa del mundo procedural

Los ríos forman deltas cuando fluyen hacia el océano y se dividen en ramas. A lo largo de la red de carreteras, el servidor coloca automáticamente puentes de madera donde los caminos cruzan los canales de los ríos.

Delta de río con afluentes ramificados

El juego presenta cambios en las horas del día y las estaciones. La duración del día y la noche depende de la posición del planeta en su órbita. Hay dos satélites con fases y órbitas independientes en el cielo simultáneamente.

Panel de órbita celestial con sol, planeta y dos lunas

La atmósfera se mejora con la iluminación. Las antorchas proyectan sombras dinámicas con caída de luz realista.

Escena nocturna con iluminación de antorcha

Los jugadores tienen acceso a construcción modular. Puedes construir casas de dos a cuatro pisos, colocar puertas, ventanas y muebles.

Casa con estructura de madera con una cama adentro

La física de los objetos tiene en cuenta los pisos. Si un personaje lanza una espada en el segundo piso de una casa, solo alguien en el mismo piso puede recogerla. El servidor verifica las coordenadas en los tres ejes antes de entregar un objeto del mundo a un inventario.

Sistema de combate y mecánicas al estilo de D&D

El combate se basa en las reglas de juegos de rol clásicos como NetHack o Dungeons & Dragons. Al crear un personaje, el jugador tira seis atributos principales: fuerza, destreza, constitución, inteligencia, sabiduría y carisma.

La generación sigue la regla de 4d6 con balanceo posterior. Todos los cálculos matemáticos, las tiradas de golpe y el daño son manejados por el servidor.

Hoja de personaje con atributos e inventario

El inventario tiene límite de peso. La muñeca del personaje tiene 11 ranuras de equipamiento: cabeza, ambas manos, cuerpo, cinturón, pantalones, zapatos, cuello, orejas y dos anillos. Una armadura pesada o un inventario lleno de piedras te obligará a elegir qué llevar contigo y qué dejar en el cofre.

Editor integrado directamente en el cliente

Para editar el mundo, no necesitas reiniciar el servidor ni abrir utilidades externas. Un editor de mapas está integrado en el cliente.

Editor de mapas con pincel de altura activo

Incluye pinceles para modificar la altura del terreno, suavizar colinas, trazar caminos y colocar objetos. Puedes seleccionar zonas rectangulares: por ejemplo, declarar áreas seguras de ciudad sin spawn de monstruos o establecer áreas de spawn para mobs específicos.

Los cambios del mapa se envían al servidor a través de la API REST, donde los derechos de acceso se verifican mediante un token de autorización de Google.

Arquitectura y pila tecnológica

El proyecto está dividido en tres bloques principales dentro de un monorepo.

El lado del cliente está escrito en Svelte y TypeScript. El renderizado de escenas 3D pasa a través de Threlte y Three.js con enfoque en WebGPU.

El lado del servidor está construido en Rust usando el runtime asíncrono Tokio. Las actualizaciones de estado del mundo fresco se distribuyen a través de canales de broadcast. La comunicación cliente-servidor va sobre WebSocket basado en la biblioteca tokio-tungstenite, mientras que los endpoints REST para el mapa son servidos por el framework Axum.

El cliente de agentes está separado en su propio proyecto Rust. Puede levantar un servidor MCP (Model Context Protocol), permitiendo que modelos LLM se conecten directamente al juego.

El autor aplicó una solución interesante para la lógica compartida. El código de la carpeta shared se compila a WASM para el navegador y es usado por el servidor directamente. Esto elimina la duplicación de reglas de cálculo de mecánicas entre cliente y servidor.

Cómo desplegar el proyecto localmente

Necesitarás Rust, Cargo, Node.js y npm instalados.

Para un despliegue conveniente, el desarrollador usa un Cargo Workspace. Puedes iniciar la parte del servidor con reconstrucción automática ante cambios de código desde la raíz del proyecto:

cargo install cargo-watch
cargo watch -w server -w shared -w data-src -x "run -p onlinerpg-server"

El servidor levantará un WebSocket en el puerto 10006 y la API REST en el puerto 10007.

Para ejecutar el cliente, necesitas copiar el archivo de entorno e iniciar el servidor de desarrollo de Vite:

cd client
cp .env.example .env.local
npm install
npm run dev -- --port 10004

Si estás editando lógica compartida en la carpeta shared, vale la pena ejecutar compilaciones automáticas de WASM para el navegador en una segunda terminal:

cargo watch -w shared -s "npm run build:wasm --prefix client"

El cliente de agentes se lanza desde la carpeta agent-client:

cd agent-client
cargo watch -i "data/prompts/memory/" -x run

Por qué deberías estudiar el código

El proyecto será más útil para quienes escriben o planean escribir servicios de red y juegos en Rust. Aquí puedes encontrar un ejemplo funcional de organización de estado race, distribución de eventos a través de canales de broadcast y trabajo con Tokio.

La segunda área interesante son los gráficos web. La combinación de Svelte, Threlte y Three.js no es tan común, y ejecutar WebGPU en un proyecto real demuestra el rendimiento de la web moderna.

Finalmente, OpenMMO será útil para investigadores de agentes de IA. El protocolo MCP y los derechos iguales para los agentes con jugadores regulares proporcionan un sandbox listo para probar escenarios de comportamiento de LLM en un entorno continuo.

Proyectos relacionados