- The Backdooms es un juego HTML comprimido, autoextraíble y de generación infinita inspirado en DOOM 1993 y The Backrooms, que se ejecuta directamente en el navegador desde un código QR
- Su enfoque consiste en incluir todo el código del juego dentro de una URL y apunta a una estructura totalmente offline, para poder jugar sin conexión a internet después de escanearlo
- El flujo de compresión comprime el HTML con Zlib, lo codifica en Base64, lo inserta en un wrapper HTML con JavaScript y luego lo descomprime y ejecuta en el navegador mediante la API
DecompressionStream
- La generación del QR usa
qr.make(fit=True) para encontrar la versión de QR más pequeña posible, y falla si no entra dentro del límite estándar de la versión 40 con nivel de corrección de errores L
- El soporte móvil se limita a navegadores móviles modernos compatibles con la API
DecompressionStream; el README menciona Edge, Yandex y Opera como ejemplos
Qué hace The Backdooms
- The Backdooms es un juego HTML que contiene el juego completo dentro de un código QR y se ejecuta en un navegador web
- El juego está inspirado en DOOM 1993 y The Backrooms, y está compuesto como una página web comprimida y autoextraíble
- Al escanear el código QR, se ejecuta directamente en el navegador, sin necesidad de descargas ni instalación aparte
- El README indica que se puede escanear para jugar
- GitHub Pages también ofrece una versión un poco menos comprimida
Un método de compresión que lleva al límite el almacenamiento
- El objetivo del proyecto es llevar al límite la capacidad de almacenamiento de los códigos QR y la compresión, y mostrar cómo alojar una aplicación web ligera dentro de un código QR
- El flujo de compresión se compone de los siguientes pasos
- Lee el HTML de entrada
- Comprime el HTML con Zlib
- Codifica los datos comprimidos en Base64
- Los inserta en un wrapper HTML basado en JavaScript
- Convierte todo el HTML a un Data URI con el formato
data:text/html;base64,...
- En el navegador, usa la API
DecompressionStream para descomprimir y ejecutar dinámicamente el contenido comprimido
- El diagrama del README incluye
DecompressionStream 'gzip' y una etapa de Format Mismatch dentro del procesamiento del navegador
Lógica de generación del código QR
- La herramienta de generación de códigos QR ofrece un flujo para convertir un juego de aproximadamente 2.5 kb en un código QR
- Ejemplos de ejecución:
python3 QRGEN.py <your-game.html> <output-qrcode.png>
python3 QRGEN.py EVEN-SMALLER-SLAMMER-BACKROOMS.html qrcode.png
- El proceso de generación primero intenta con
qr.make(fit=True) encontrar la versión de QR más pequeña que se ajuste a la longitud del contenido
- Si la versión necesaria supera el límite estándar de los códigos QR, que es 40, fuerza la versión 40 con
fit=False
- Para incluir la mayor cantidad de datos posible, usa el nivel de corrección de errores más bajo, L
- Si los datos siguen siendo demasiado grandes incluso con versión 40 y nivel L, la codificación QR falla y devuelve un error
Ejecución y compatibilidad
- Para jugar solo se necesita un navegador web moderno
- Después de escanearlo, se puede jugar sin conexión a internet porque el código completo del juego está dentro de la URL
- En móviles, se necesita un navegador moderno compatible con la API
DecompressionStream
- El README menciona Edge, Yandex y Opera como ejemplos
- Hay una implementación alternativa basada en BigInt para códigos QR más pequeños en The BigInt Branch, pero la compatibilidad con navegadores móviles es limitada
Entorno de generación y licencia
- Para generar el código QR directamente, se necesitan las siguientes dependencias
-
Python 3.7+
- La biblioteca
qrcode
pillow para procesar imágenes de códigos QR
- El comando para instalar las dependencias es el siguiente
pip install qrcode[pil]
- El proceso de desarrollo está documentado en [MindDump](https://kuberwastaken.github.io/blog/Projects/How-I-Managed-To-Get-Doom-In-A-QR-Code)
- El proyecto está publicado bajo la **MIT License**, por lo que se puede usar, modificar y compartir libremente
1 comentarios
Comentarios de Hacker News
Acabo de conocer DecompressionStream y pulí la parte de HTML para reducir unos bytes más.
También dejé un PR por si te interesa verlo.
De verdad, muchas gracias; fue lo mejor que me pasó este mes.
Es un proyecto realmente genial.
También acabo de conocer las URL
data:; conocía y había usado el esquema URIdata:, pero no sabía que podía usarse como una URL completa.Había pensado en hacer algo parecido que entrara entero en un código QR, pero lo había postergado porque creía equivocadamente que necesitaba un enlace HTTP(s). Este video me inspiró mucho: Can you fit a whole game into a QR code?(https://www.youtube.com/watch?v=ExwqNreocpg)
Pero fui en la dirección opuesta, basada en navegador, para tener una compatibilidad más amplia, y también dejé la atribución en el repositorio.
Quizá sea una pregunta tonta porque soy principiante en tecnología, pero ¿un QR no es simplemente datos codificados?
Si el máximo de datos que puede contener un QR es de unos 3 KB, eso equivaldría a unos 3000 caracteres de texto plano; entonces me pregunto si el logro aquí es que este juego tipo Doom funcione como código ejecutable de ese tamaño.
En el estándar QR, el significado y el propósito de la codificación de 8 bits parecen un poco ambiguos, pero la interpretación básica es el conjunto de caracteres JIS8 y Shift JIS, y en otros ECI representa directamente valores de bytes de 8 bits.
En cualquier caso, es posible guardar datos binarios arbitrarios en un código QR, y la herramienta
qrencodelo soporta por defecto.Sin embargo, muchos decodificadores asumen que el QR contiene texto, así que el soporte es complicado; incluso envié un parche para decodificación de QR binarios por un problema en el que zbar rompía los datos al pasarlos por
iconv.Originalmente solo quería imprimir una clave privada RSA de 4096 bits como código QR, pero después la gente empezó a codificar videojuegos en QR también, y es realmente genial.
https://youtu.be/ExwqNreocpg
https://news.ycombinator.com/item?id=24287347
Lo escaneé con el escáner QR predeterminado del iPhone y me mostró “no se encontraron datos utilizables”.
data:.Por ejemplo, una página web autocontenida
Hi!puede codificarse comodata:text/html;base64,PGh0bWw+PGJvZHk+SGkhPC9ib2R5PjwvaHRtbD4=, y si la pegas en el navegador se renderizaHi!.Pero si haces un código QR con eso, no funciona en esa situación.
La mayoría de los teléfonos no leen bien códigos QR grandes, así que hace falta algo como https://qrscanner.org/.
Y no funcionaría en teléfonos; por las limitaciones de tamaño no pude incluir también esa compatibilidad.
Suelo escanear códigos QR pegados por todos lados para ahorrar tiempo al ingresar URL, y pensar que escanear un QR permitiría ejecución de código arbitrario da bastante miedo.
Si agregas
image-rendering: pixelatedal CSS del canvas, creo que se vería con un aspecto de píxeles nítidos en lugar de borroso.Ojalá el próximo proyecto sea un LLM en un código QR.
Relacionado: https://www.reddit.com/r/OpenAI/comments/138kbhs/someone_sho...
No es un LLM, pero aun así es un chatbot bastante genial.
https://github.com/Kuberwastaken/MiniLMs/tree/main/SYNEVA
El enlace del tráiler del juego lleva a un Short llamado “Fly me to the moon - 19 September 2024”.
Parece un error.
Me encantan estos proyectos de juegos ultrapequeños.
Me recuerda a .kkrieger.
https://en.wikipedia.org/wiki/.kkrieger
Espero que sigas haciendo cosas geniales, kuberwastaken.
Una vez hablé con un amigo de una idea más o menos relacionada.
Me preguntaba si se podría codificar completo un archivo STL para impresión 3D en un código QR y pegarlo al objeto físico, para que con solo escanear lo que hiciste pudieras volver a imprimirlo.
Al investigarlo, parecía demasiada data, e incluso busqué códigos QR multicolor, pero no sabía que simplemente se podían hacer códigos QR más grandes.
Como las mesas solo requerían cortar placas, codifiqué un archivo 2D, pero incluso así tuve que usar un algoritmo de compresión personalizado para la prueba de concepto.
https://johnkestner.com/rev/