Tutorial Rom hacking parte 1

Devido ao interesse do DirleyVR no tópico do super pitfall resolvi fazer esse tutorial introdutório ao rom hacking no nes. Vou mostrar como fazer pra mudar os gráficos, e depois como mudar o texto. São modificações simples (dependendo da rom escolhida), e que quebram a barreira inicial e ensinam uma coisa ou duas sobre o funcionamento do NES que são úteis depois ao fazer hacks mais complicados. Se tiver bastante interesse posso fazer mais outros tutoriais prosseguindo no nível de complexidade. Lembrando que to em processo de aprendizagem, então se eu falar alguma besteira me corrijam. Acho rom hacking bem divertido e quem sabe vocês também. :positivo:

Vamos lá!

Mudando os gráficos de um jogo de NES

Introdução
Os gráficos do nes, como a maioria já sabe, são feitos de tiles. Esses tiles tem 8×8 pixels e não guardam a informação da cor, e sim um ID que vai de 0 a 4. Pixels com o mesmo ID vão ter a mesma cor, e pixels com ID 0 são transparentes. As cores são atribuídas depois por uma paleta de 4 cores.
Existem alguns editores de tile disponíveis. Eu gostei mais de usar o yy-chr pois ele tem umas funcionalidades muito bacanas que podem ser usadas mais tarde pra tarefas mais complexas do que o que vou mostrar aqui, então já começar usando ele pra se acostumar é uma boa ideia. Ele está disponível em duas versões. Eu sempre usei a C++ e nem tinha visto que tinha outra. Abri a C# aqui e vi que é um pouco diferente, mas não muito.
http://www.romhacking.net/utilities/119/
Vamos usar também o fceux que tem ferramentas muito completas de debug.
http://www.fceux.com/web/home.html

A maioria das roms do NES são facilmente editáveis nesses programas, mas nem todas. Algumas os programadores colocaram compressão de gráficos. Exemplo disso é o Contra que na versão americana tem a rom comprimida e na versão japonesa está tudo sem compressão. Eles fizeram isso pro jogo caber num chip menor e cortar os custos. Além de comprimir o jogo removeram um monte de conteúdo… Sacanas. :devil:
Uma maneira fácil de verificar se a ROM tem compressão é simplesmente abrir o yy-chr e abrir uma rom (sem ser zipada, a rom .nes mesmo).
Dica: crie uma pasta de romhacking e crie uma subpasta pra cada jogo pra organizar, e mantenha uma rom original sempre à mão e trabalhe nas alterações na cópia.

Mão na massa
Vamos editar uma ROM sem compressão. Pra começar do fácil, escolha um jogo do começo do nes, aqueles jogos menores mais antigos, tipo balloon fight, battle city, etc. Eles são mais simples e têm menos gráficos e você não vai ficar perdido. Eu recomendo o arkanoid que tem os gráficos armazenados lindamente na ROM :hypnotized: Nunca vi tamanha organização, impressionante! :ghost: Mas eu escolhi duck hunt porque gosto de desafios. :rotfl:

No lado esquerdo da tela do yy-chr tem a rom inteira exibida em forma gráfica. Se você der scroll vai ver que a maior parte dela é chuvisco. Isso aí nada mais é que o código do jogo que ao ser lido como imagem não significa nada. Da mesma forma que a estática da tv são as ondas de rádio vindas do espaço… :bigsmile: (fun fact). Mas o programa já da scroll automaticamente pra parte que ele acha serem os gráficos e normalmente ele está certo. Se não estiver, dê scroll até encontrar. Se não encontrar, escolha outro jogo. Descomprimir gráficos não é tarefa para iniciantes. :devil:

Aí é só escolher um tile e modificar ele na área da direita. Lembre-se que a paleta usada no editor é apenas para referência, então tente usar uma paleta parecida com a real do jogo pra você não se confundir. Você pode editar cada cor individualmente e tentar chegar numa coloração parecida. E toda primeira cor de cada paleta de 4 cores é transparência, então mudar essa cor serve como referencia da “cor de céu”, mas pintar o tile com essa cor significa aplicar transparencia!
Comece mudando algo simples, como o desenho da bala na interface do duck hunt. Ele está na página seguinte ao carregar o jogo no yy-chr (ao lado da palavra “SHOT”).

Salve a ROM (lembre-se de trabalhar com backups) e abra no emulador e chegue na fase com o tile que você alterou. Voilá! Realmente é simples assim editar os gráficos!

smileys no lugar de balas na interface

E agora?
Mas… Ok, os tiles tem 8 pixels, mas tem pedaço de pato pra todo lado na rom! :dontknow: Como funciona isso? Simples, os gráficos estão todos desmontados no editor em tiles de 8×8. Essa parte de montagem dos tiles é feita na lógica do jogo. Com isso o jogo consegue ter meta tiles maiores, formando imagens mais interessantes.
No caso dos sprites (objetos em movimento, personagens, inimigos, etc) isso é feito caso a caso na programação. Para os backgrounds existem umas tabelas que fazem o esquemático de montagem dos tiles e seu nome é nametable. O console usa essas nametables pra pegar os tiles e posicionar na tela formando a figura completa. No yy-chr é possível carregar nametables pra usar o cenário montadinho como referência e editar os tiles, mas não é possível editar facilmente as nametables. Esse assunto é tarefa pra outro tutorial. :coffee:

Informação extra

Todo gráfico tem que ser carregado pelo NES na sua memória RAM pra fácil acesso pra que a unidade de processamento de gráficos (PPU) consiga exibir na tela. Ele é lido da ROM e copiado pra RAM temporariamente pra processamento. Abrindo um jogo no fceux e indo em Debug, PPU viewer, você visualiza os 2 bancos de gráficos atualmente carregados na PPU. Somente esses tiles podem ser visualizados no jogo nesse momento! Quando ele quer mostrar gráficos novos ele tem que descarregar o anterior e aí ele não pode mais ser exibido. Isso é muito útil pra encontrar os tiles na ROM chegando naquela fase e observando no PPU viewer quais estão carregados. Aliás é por essa limitação que em double dragon 2 (e no 1 também se não me engano), você nunca vê dois inimigos diferentes ao mesmo tempo na tela, porque não cabiam aqui carregados ao mesmo tempo… Acabei com a infância de quem nunca tinha percebido isso. :witsend:

A cada momento existem no máximo 8 paletas carregadas. Cada paleta de cores está exibida na parte de baixo do viewer, de 4 em 4 cores. Clicando nas tabelas em cima com o botão direito você troca a paleta usada pra poder visualizar melhor os tiles (isso não afeta o jogo, é apenas para visualização no ppu viewer).

Passando o mouse em cima de cada tile no PPU viewer aparece embaixo o endereço na memória temporária onde o gráfico está carregado. Cada referência de tile ocupa 1 byte da memória. Se você for atento vai ver que os mesmos endereços da esquerda se repetem na direita (por exemplo o primeiro tile de cada área é o byte “$00”). Na verdade eles são diferentes, é que seus começos são omitidos pelo fceux. Os da esquerda começam com “00” e os da direita com “10”, então cada tabela começa em $0000 e $1000 respectivamente, mas foram abreviados mostrando apenas o byte final.

Aliás, no NES praticamente tudo é armazenado e calculado em hexadecimal (contagem de base 16), e existem muitos sites na net explicando, mas basicamente é 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, 10. Sendo que “A” vale 10, “B” vale 11, “F” vale 15 e “10” vale 16. “20” vale 32, “40” vale 64, “80” vale 128 e “FF” vale 255 (que é até onde vai 1 byte). . Ou seja, enquanto que no sistema decimal com apenas 2 algarismos você só consegue contar até 99, no sistema hexadecimal conta até 255. Contando com o zero são 256 possíveis valores.

No próximo tutorial vou falar sobre como mudar o texto dos jogos. :positivo:

Próximo tutorial: editando texto