Cuando pensamos en servidores web, lo último que nos viene a la mente es un videojuego. Menos aún, uno lanzado en 2011, diseñado para resolver acertijos con portales y cubos. Sin embargo, eso es exactamente lo que ha logrado el proyecto HTTPortal: transformar Portal 2 en un servidor web funcional que responde a peticiones HTTP de los navegadores y les proporciona acceso a páginas web... ¡a base de cubos dentro del juego!
Dicho proyecto aprovecha una curiosa característica del motor Source (usado tanto por 'Portal 2' como por éxitos como 'Half-Life'): una opción de consola para desarrolladores que abre un puerto TCP y permite recibir comandos externos. Lo demás es pura magia (y mucho scripting), que permite al juego no solo lanzar portales de teleportación… sino también lanzar portales web.
¿Cómo es posible esto?
Cuando visitas una página web, tu navegador se comunica con un servidor usando un lenguaje llamado HTTP. Este protocolo funciona sobre una red TCP, que es como un sistema de mensajería que garantiza que los datos lleguen completos y en orden. La mayoría de los videojuegos (incluyendo Portal 2) usan otro sistema más rápido pero menos confiable llamado UDP. Por eso, lo primero es encontrar una forma de usar TCP dentro del juego.
Y, para ello, el motor Source tiene una opción oculta: '-netconport 3000'. Si la activas al lanzar el juego, Portal 2 abrirá un servidor TCP en el puerto 3000. Este servidor no está diseñado para páginas web… pero sí recibe texto.
Así que el navegador envía comandos HTTP como 'GET /index.html', y Portal 2 los recibe… como si fueran comandos de consola. Y ahí reside el truco.
Pero, ¿cómo responde Portal 2 a un navegador? Al principio, el juego recibe los comandos pero no sabe qué hacer con ellos. Usa el comando 'alias' para decir: “cuando recibas GET, responde con este texto”. Y ese texto puede ser el código de una página HTML.
Aquí es donde entra en juego VScript, el lenguaje interno de los eventos de 'Portal 2': usando scripts y trucos como la biblioteca ppmod, puedes imprimir una respuesta HTTP completa en la consola, que el navegador interpreta como una página web.
Construyendo páginas web… ¡con cubos!
Una de las ideas más ingeniosas del proyecto es el uso del entorno del juego para representar la estructura de una página HTML. Así, cada cubo representa una etiqueta, texto o estilo.
Con algunos comandos especiales puedes construir un sitio completo directamente en el mundo del juego:
script newElement(H1)
crea una etiqueta<H1>
script newElement(-H1)
cierra esa etiqueta con</H1>
script newElement("Hola Mundo!")
agrega textoscript newModifier("style", "color: red")
aplica estilos CSS
Cada uno de estos elementos se representa con cubos en el mapa. Sí, literalmente construyes la página web con bloques en el mundo 3D de Portal 2; los cubos se colocan físicamente de izquierda a derecha y de arriba a abajo. Así, el juego actúa como una especie de editor visual de páginas web.
En teoría, esto permite convertir cualquier página web sencilla en una pila de cubos. El creador del proyecto probó incluso con la página de inicio de DuckDuckGo, aunque tuvo que enfrentarse al límite de entidades del motor de juego. El resultado fue una representación surrealista pero técnicamente correcta de la web, construida con miles de cubos codificados por estilo, etiquetas y texto.
Limitaciones
Aunque este proyecto es fascinante, no está exento de limitaciones: el contenido no se actualiza en tiempo real sin recargar (aunque JavaScript puede ayudar en esa tarea), y no se pueden representar imágenes complejas.
Además, el navegador nunca deja de cargar: como Portal 2 nunca cierra la conexión, el navegador piensa que todavía está esperando más datos. Así que, para que el navegador entienda cuándo termina la respuesta, se necesita un encabezado 'Content-Length' preciso y calculado a mano, algo que obliga al desarrollador a contar cada carácter y salto de línea. Una vez ajustado, el navegador puede renderizar correctamente el HTML.
¿Por qué importa esto?
Aunque a primera vista esto puede parecer una mera excentricidad de un programador (y 'gamer'), tiene implicaciones interesantes:
- Muestra que los motores de videojuegos son, en esencia, plataformas de ejecución general.
- Permite integrar interfaces web con juegos sin software adicional.
- Sirve como laboratorio experimental para aprender sobre HTTP, TCP/IP, y scripting en entornos (muy) limitados.
- Y, sobre todo, representa una increíble hazaña de creatividad e ingeniería inversa.
¿Cómo puedo probarlo?
Requisitos básicos:
- Contar con el juego 'Portal 2' en tu cuenta de Steam.
- Habilitar la consola de desarrollador.
- Añadir el parámetro de lanzamiento '-netconport 3000'.
- Descargar y mover los archivos del repositorio HTTPortal.
- Abrir 'localhost:3000' en tu navegador.
Desde ahí, puedes empezar a construir tu propia página con cubos en el nivel 'Laser Chaining' del juego.
Imagen | Marcos Merino mediante IA
En Genbeta | 25 años después, Apache ha perdido la corona del servidor web más usado en Internet: larga vida al rey Nginx
Ver 0 comentarios