Implementando DOOM com htop
Como compilar
- Entre no diretório
doomgeneric
- Compile com o comando
make -j8
- É necessário um arquivo WAD (dados do jogo). Este projeto inclui
freedoom1.wad (todos os créditos ao projeto Freedoom). Como alternativa, também é possível baixar e usar a versão clássica gratuita shareware DOOM1.wad
Como executar
Como funciona
- O trabalho foi feito a partir de um fork do projeto https://github.com/ozkl/doomgeneric
- Foram adicionados os arquivos
main.c, keylogger.c, ascii_stuff.c e feitas algumas modificações
- Foi escrito um conversor simples de imagem para ASCII (a longa cadeia de if em
ascii_stuff.c)
- O processo principal do Doom cria processos filhos na mesma quantidade de linhas da imagem ASCII e cria um segmento de memória compartilhada para cada processo
- O processo principal copia cada linha para o segmento de memória do processo correspondente, e cada processo filho lê do seu segmento e sobrescreve
argv[0]
- Originalmente a ideia era ordenar os processos pelo uso de CPU, mas isso se mostrou difícil. O
nice do Linux também foi considerado, mas foi descartado porque há apenas 19 valores configuráveis pelo usuário
- Surgiu então a ideia de usar a quantidade de memória virtual alocada. Ela é específica para cada processo
- Mesmo que todos os processos filhos aloquem exatamente a mesma memória, os frames aparecem na ordem correta no
htop. A suposição é que, em caso de empate, ele ordene pelo momento de criação
- Foi escrito um keylogger simples para abrir o dispositivo de teclado. O jogo continua rodando em segundo plano o tempo todo, independentemente de o
htop estar aberto ou não
Plataformas suportadas
- Testado apenas no Ubuntu 22.04
- No WSL e no Arch, o nome do dispositivo de teclado é diferente. É necessário portar
Solução de problemas
- Se o teclado não funcionar
- Verifique a macro
KEYBOARD_DEVICE em main.c. Ela pode variar conforme a plataforma
- Use o comando
ll /dev/input/by-path e escolha o dispositivo que contenha kbd
- Se o frame travar
- O comando
sed pode não ter funcionado
- No
htop, vá em F2 -> "Display options" -> marque "Update process names on every refresh"
- Erro
sed: can't read /home/<user>/.config/htop/htoprc: No such file or directory
- Isso acontece porque o
htop nunca foi executado. Abra o htop, feche e execute o sed novamente
- Se o processo principal do Doom morrer e restarem apenas processos zumbis
- Execute
sudo pkill doom-htop
Melhorias
- Ao mover com as setas, a tela do
htop se desloca, o que é incômodo
- Isso pode ser resolvido mudando o foco depois de iniciar o
htop (por exemplo, pressionando a tecla a para abrir o menu de seleção de processador)
FAQ
- Q: Por que você fez isso?
A: Porque parecia divertido.
Licença
- Freedoom usa uma licença estilo BSD (veja
freedoom-license.txt)
- O restante do código provavelmente está sob GPL
Opinião do GN⁺
- Representar a tela de um jogo 3D com arte ASCII é uma ideia original. Parece também um bom exemplo de como desenhar gráficos em uma tela como a do htop usando C
- É impressionante que não tenha sido apenas uma conversão visual para ASCII, mas uma implementação integrada com o motor real do jogo
- Também vale destacar o bom aproveitamento do projeto
doomgeneric, permitindo implementar isso com pouco código
- Abrir diretamente o dispositivo Linux para capturar entrada do teclado pode não funcionar em WSL ou em outros sistemas operacionais. Vale considerar o uso de uma biblioteca de entrada de teclado independente do sistema
- A ideia de usar memória compartilhada para trocar dados dos frames ASCII entre processos pai e filho é interessante. Parece um bom exemplo para estudar IPC
- A ideia de colocar os gráficos ASCII nos nomes dos processos do htop também é criativa. Porém, o htop acaba tendo efeitos colaterais, como a tela se mover por causa das mudanças no nome dos processos. Parece precisar de melhorias
- Embora pareça estar sob licença GPL, isso não está claro. Se o código for reutilizado, é necessário verificar a licença
1 comentários
Opiniões do Hacker News
Estes comentários reagem a um projeto que executa o jogo Doom renderizado em ASCII como um processo usando o
htop. Os principais pontos são os seguintes:htopcomo motor de renderização é impressionante e mostra a essência do hacking de software.