Implementar DOOM con htop
Cómo compilar
- Ir al directorio
doomgeneric
- Compilar con el comando
make -j8
- Se necesita un archivo WAD (datos del juego). Este proyecto incluye
freedoom1.wad (todos los créditos para el proyecto Freedoom). O también se puede descargar y usar la versión shareware clásica gratuita DOOM1.wad
Cómo ejecutarlo
Cómo funciona
- Está hecho como un fork del proyecto https://github.com/ozkl/doomgeneric
- Se agregaron los archivos
main.c, keylogger.c y ascii_stuff.c, además de algunas modificaciones
- Se escribió un conversor simple de imagen a ASCII (la larga cadena de
if en ascii_stuff.c)
- El proceso principal de Doom crea procesos hijo según la cantidad de líneas de la imagen ASCII, y crea un segmento de memoria compartida para cada proceso
- El proceso principal copia cada línea en el segmento de memoria del proceso correspondiente, y cada proceso hijo lee desde su segmento y sobrescribe
argv[0]
- Al principio se intentó ordenar los procesos por uso de CPU, pero resultó difícil. También se consideró usar
nice en Linux, pero se descartó porque el usuario solo puede configurar 19 valores
- Surgió la idea de usar la cantidad de memoria virtual asignada. Es específica para cada proceso
- Incluso si todos los procesos hijo asignan exactamente la misma memoria, en
htop los frames se muestran en el orden correcto. Se supone que, cuando son iguales, se ordenan por tiempo de creación
- Se escribió un keylogger simple que abre el dispositivo del teclado. El juego siempre corre en segundo plano, independientemente de si
htop está abierto o no
Plataformas compatibles
- Solo se probó en Ubuntu 22.04
- En WSL y Arch el nombre del dispositivo del teclado es distinto. Hace falta portarlo
Solución de problemas
- Si el teclado no funciona
- Revisar la macro
KEYBOARD_DEVICE en main.c. Puede variar según la plataforma
- Usar el comando
ll /dev/input/by-path y elegir el dispositivo que incluya kbd
- Si el frame se congela
- Puede que el comando
sed no haya funcionado
- En
htop, ir a F2 -> "Display options" -> marcar "Update process names on every refresh"
- Error
sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory
- Ocurre porque
htop nunca se ha ejecutado. Ejecutar htop, salir y volver a correr sed
- Si el proceso principal de Doom muere y solo quedan procesos zombi
- Ejecutar
sudo pkill doom-htop
Mejoras
- Al moverse con las flechas, la pantalla de
htop también se mueve y resulta incómodo
- Se puede resolver cambiando el foco después de iniciar
htop (por ejemplo, presionando la tecla a para abrir el menú de selección de procesador)
FAQ
- Q: ¿Por qué lo hiciste?
A: Porque pensé que sería divertido.
Licencia
- Freedoom usa una licencia estilo BSD (ver
freedoom-license.txt)
- Se supone que el resto del código es GPL
Opinión de GN⁺
- Representar una pantalla de juego 3D con arte ASCII es una idea fresca. Parece un buen ejemplo de cómo dibujar gráficos en pantalla al estilo de htop usando C
- No se limita a convertir la pantalla a arte ASCII, sino que está implementado en conexión con el motor real del juego, lo cual resulta impresionante
- También vale la pena destacar cómo aprovecha bien el proyecto
doomgeneric para lograrlo con poca cantidad de código
- Abrir directamente dispositivos de Linux para recibir entrada del teclado puede no funcionar en WSL u otros entornos de SO. Podría valer la pena considerar una biblioteca de entrada de teclado independiente del sistema operativo
- Es interesante la idea de usar memoria compartida para intercambiar datos de frames ASCII entre procesos padre e hijo. Es un buen ejemplo para aprender sobre IPC
- También es creativa la idea de meter los gráficos ASCII en los nombres de proceso de htop. Sin embargo, hay efectos secundarios, como que la pantalla se mueve cuando cambian los nombres de los procesos. Parece que hace falta mejorar eso
- Se supone que está bajo licencia GPL, pero no está del todo claro. Si se va a reutilizar el código, conviene revisar la licencia
1 comentarios
Opiniones en Hacker News
Estos comentarios recogen reacciones a un proyecto que ejecuta el juego Doom renderizado en ASCII como procesos usando htop. Los puntos principales son los siguientes: