2 puntos por GN⁺ 2024-04-22 | 1 comentarios | Compartir por WhatsApp

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

  • Se recomienda guardar antes cualquier trabajo importante
  • Se confirmó que funciona bien incluso en laptops antiguas
  • Ejecutar los siguientes comandos:
    sed -i 's/update_process_names=0/update_process_names=1/' ~/.config/htop/htoprc
    sudo ./doom-htop -iwad freedoom1.wad
    htop -d 1 -s M_VIRT
    
  • El orden en que se ejecuten doom-htop y htop no importa
  • Se necesita sudo para abrir el dispositivo del teclado. Si esto genera dudas de seguridad, se puede ejecutar sin sudo y ver solo los gráficos
  • -d 1 en htop es para una tasa de actualización de 10 FPS. -s M_VIRT es para ordenar los procesos por asignación de memoria virtual
  • El comando sed es necesario porque htop no actualiza por defecto el nombre de los procesos en cada refresco

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

  1. 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
  2. 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"
  3. 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
  4. 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

  1. 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

 
GN⁺ 2024-04-22
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:

  • Comparación con PSDoom: Mientras que PSDoom usa Doom para gestionar procesos, este proyecto hace lo contrario: usa un administrador de procesos para jugar Doom.
  • Evaluación técnica: Renderizar en ASCII e insertarlo en los nombres de los procesos en sí no es tan difícil, pero la idea de usar htop como motor de renderizado es impresionante y muestra la esencia del hacking de software.
  • Respeto por la habilidad del desarrollador: Ver a desarrolladores que tienen el tiempo y la capacidad para crear proyectos así hace que uno pierda confianza en sus propias habilidades.
  • Tendencia de integración con Doom: Ahora incluso vale la pena considerar integrar cosas cotidianas dentro de Doom. Uno puede imaginar una lista de tareas o un calendario.
  • Elogio del espíritu hacker: Da gusto ver que los proyectos de hacking por diversión se vuelvan populares, y eso demuestra que el espíritu hacker sigue vivo.
  • Recuerda a Bad Apple: Hace pensar en el video de Bad Apple implementado en el Administrador de tareas de Windows.
  • El futuro de Doom: Es difícil imaginar hasta dónde podrá llegar Doom en el futuro.