Bem-vindo: Qui Set 20, 2018 10:25 am


Tutorial rom hacking de nes (parte 2)

Acervo de tutoriais e guias sobre videogames e outros assuntos. Quer trocar a bateria de seu cartucho de SNES? Como fazer para abrir aquela fitinha de Famicom? Sempre (ou quase sempre) encontre socorro nesta seção!

Moderadores: Monge Cravos, Hunter

Tutorial rom hacking de nes (parte 2)

Mensagempor nesrocks » Qui Abr 21, 2016 11:08 pm

Na aula de hoje vamos aprender a modificar texto! :talktohand:

Ao abrir uma rom de NES em um hex editor você raramente encontrará algo legível. Isso é porque, na maioria das vezes, os textos estão em forma de referências a sprites representando cada caractere. O NES em si não sabe nem que está escrevendo algo. Pra ele não passa de uma imagem qualquer sendo montada assim como cenários, etc. Mas é bem fácil modificar textos. Vou mostrar dois métodos, um simples, ideal para textos curtos e outro pra modificações mais extensas.

Método simples
Ferramentas necessárias:
- apenas o fceux! :bigsmile:

Abra a rom a ser editada no fceux, vá até o momento que contem o texto que você quer editar e pause o emulador (eu configurei minha hotkey de pause pra ser no TAB). Identifique a palavra que você quer editar. Nesse exemplo vou mudar a palavra nintendo da tela título do kung fu.
Imagem

Depois, abra o ppu viewer (debug - ppu viewer). Como verificamos no outro tutorial, esses são os tiles atualmente carregados. Passe o mouse em cima da letra "N" e verifique o endereço de memória desse tile embaixo. No nosso caso, $17.
Imagem

Off topic: "$17" é um valor hexadecimal. Os tiles são contados da esquerda pra direita, de cima pra baixo, do $00 até o $FF. São 256 tiles. $17 em sistema decimal vale 23. Como a contagem começa do 0, se você contar os tiles 1 por 1 vai ver que o "N" é o 24º (23 + 1).

Anyway, anote esse valor e procure por mais letras da palavra, na sequência. O "I" é $12, "N" já sabemos que é $17, e o "T" é $1D. Com 4 letras já dá pra procurar. Ficamos com 17 12 17 1D, formando "NINT".
Vá em debug, hex editor.
No menu "view" mude para "ROM".
Agora vá em edit, find. Verifique que o modo de procura é "hex" e não "text" e escreva 1712171D na busca e dê enter. Aparece um resultado na linha 001700. Verificando os valores seguintes, confere com a formação da palavra "NINTENDO"! :dance: Agora é só modificar pra mostrar tiles diferentes no lugar desses. Tenha certeza de estar modificando os caracteres corretos. Procure os valores dos tiles que você quer e escreva por cima deles usando o próprio hex editor do fceux.

Mudei para "MODDING"
Imagem
Imagem

"Eu editei mas no meu não mudou nada!". :sad: Isso é provavelmente porque você editou a ROM mas ainda não fez o NES ler a ROM novamente. Você pode fazer isso resetando o console ou entrando no jogo e dando game over para ele carregar a tela de novo. Aí ele vai reler o endereço que desta vez está modificado e mostrará o resultado do trabalho.

Agora é só salvar a edição! No hex editor vá em file, save rom as... my hack.nes e pronto :)

Mas nem tudo são flores. :angry: Perceba que na ROM tudo está mega otimizado e compactado em forma binária. Portanto, a ROM foi compilada com os espaços reservados. O que vem depois da palavra editada é código para outras coisas, então, o máximo que você pode fazer de maneira simples é trocar por palavras com o mesmo número ou menor de caracteres. No meu caso eu mudei pra uma palavra com um caractere a menos, então no final coloquei o caractere "FF", que no jogo kung fu corresponde a um tile 100% transparente, como pode ser visto na ppu viewer (o último tile).

Um risco que se corre utilizando um editor hex externo é o de se deletar ou adicionar caracteres. :shame: Isso não deve ser feito, pois muda os endereços de todos os caracteres dali em diante na ROM, quase que certamente corrompendo por completo o funcionamento do jogo. Felizmente no editor do fceux essa opção nem existe.

Método completo
Pra mudar uma palavrinha ou outra parece legal, mas mudar muitos textos esse método de cima dá uma trabalheira danada. :beatup: É por isso que existem as tabelas de conversão, aceitas por alguns editores hex. Existem muitos editores que aceitam as tabelas, mas o que eu achei melhor e recomendo é o próprio fceux. :devil:

O que a tabela faz é traduzir pra você os valores de cada hex pra uma letra pré determinada automaticamente. :love: Assim você pode facilmente identificar o que é texto e digitar por cima! O único trabalho que você tem é ensinar pra ele qual hex equivale a qual letra. E é bem simples. Vamos mudar um texto de super mario bros 3.

Imagem

Crie um arquivo txt e abra-o usando o notepad.
Imagem

Agora coloque em cada linha um endereço de memoria, um símbolo de igual (=) e um caractere representando a tradução daquele endereço. Faça isso seguindo o método de cima, usando o PPU viewer pra saber o que representa o que. O conteúdo do arquivo vai ficar assim por exemplo:
B0=A
B1=B
B2=C
B3=D
B4=E
B5=F
B6=G
B7=H
B8=I
B9=J
BA=K
BB=L
BC=M
BD=N
BE=O
BF=P
FE=

Coloque quantas referências você quiser, de preferência todas as letras, números e pontuações disponíveis no ppu viewer. Não esqueça de colocar também o equivalente ao espaço. No caso do super mario bros 3 na maioria das vezes é o FE. FE= digite um espaço seguindo o sinal de igual. Salve o arquivo txt e renomeie para tabela.tbl

- Abra o hex editor do fceux
- Em file Load Tbl file escolha seu arquivo tabela.tbl

Dê scroll até encontrar o texto que você quer editar. Você pode utilizar a opção de busca marcando dessa vez "text" em vez de "hex". Por exemplo no meu caso eu procurei por "heavens" e encontrei o trecho que eu procurava.

Imagem

Prosseguindo, com o texto encontrado é apenas questão de clicar no lado direito do editor e digitar o novo texto por cima do antigo. ATENÇÃO pra digitar novo texto apenas por cima do que é realmente texto! Digitar no lugar errado vai corromper o código do jogo. Por isso sempre trabalhe com backups e comece fazendo pequenas edições e testando no jogo.
Lembrando também que ele só vai entender as letras que você digitar que você informou antes na tabela o valor hex. Por exemplo se você digitar "hackeando" na tabela precisa ter o "hex"=h, "hex"=a, "hex"=c, etc. Atentando para letras maiúsculas e minúsculas. Obviamente ele vai exibir na tela o tile correspondente àquele valor hex, então se na pattern table carregada no momento do jogo não tiver nenhum tile com o desenho da letra que você quer não adianta nada. É tudo apenas uma tradução do que existe nos tiles.

Após tudo editado teste chegando novamente na parte do jogo que carrega o texto. É interessante manter um savestate logo antes do carregamento da tela pra testar mais rapidamente. No meu caso eu salvei enquanto o mario estava caindo com o cetro em suas mãos logo após derrotar o koopaling.

Imagem

Pode ser que você precise fazer alguns ajustes de espaçamento depois da edição, adicionando espaços pra evitar palavras cortadas na quebra de linha etc. :ooooh:

O que eu não cobri neste tutorial
Muitas vezes os jogos mudam suas tabelas de um local pra outro. Por exemplo a tabela usada para as telas de rei falando no smb3 pode não ser a mesma tabela usada quando é o texto da carta da princesa. Nesse caso o único jeito é testar e descobrir.

Alguns jogos usam uns sistemas loucos de compressão de texto, com uns símbolos que fazem coisas diferentes. Alguns servem pra pular linha, outros servem pra repetir as letras uma determinada quantidade de vezes etc. Quando você aplica o segundo método nesses jogos, os textos ficam parcialmente legíveis. Cabe a você identificar qual a função dos caracteres especiais observando-os e comparando como fica no jogo.

Uma coisa muito legal que pode ser feita quando se sabe assembly é colocar textos maiores do que o texto original. Isso é conseguido utilizando-se de pointers aliados a espaços inutilizados na ROM. Pointers, ou apontadores em português, nada mais são do que redirecionadores do código pra outro endereço da ROM. O famoso "go to" pra quem conhece a linguagem BASIC. Modificando-se os apontadores você pode indicar espaços muito maiores da ROM e colocar bastante texto lá, exibindo-os no lugar do texto original.

É isso, espero que tenham curtido e ponham a mão na massa personalizando seus jogos e colocando no powerpak :wave:

Tutorial anterior (Parte 1): editando gráficos
Editado pela última vez por nesrocks em Sáb Abr 23, 2016 6:00 pm, em um total de 5 vezes.
Avatar do usuário
nesrocks
Membro NES Archive
 
Registrado em: Seg Ago 15, 2005 1:55 am
Localização: Rio de Janeiro - RJ

Re: Tutorial rom hacking de nes (parte 2)

Mensagempor DirleyVR » Sex Abr 22, 2016 3:01 pm

Cara, ainda vou ler isso tudo bem devagar com certeza! Muito bom!
Vivendo minha vida gamer hoje como se fosse nos anos 90!
Avatar do usuário
DirleyVR
Administrador
I'M A RETROGAMER!!!
 
Registrado em: Ter Nov 13, 2012 2:20 pm
Localização: Entre 1980 e 1994...

Re: Tutorial rom hacking de nes (parte 2)

Mensagempor nesrocks » Sáb Abr 23, 2016 5:53 pm

Dei uma atualizada no tutorial porque o fceux faz o trabalho das tabelas melhor que qualquer editor externo. Como que eu não sabia disso? Atualizado!
Avatar do usuário
nesrocks
Membro NES Archive
 
Registrado em: Seg Ago 15, 2005 1:55 am
Localização: Rio de Janeiro - RJ

Re: Tutorial rom hacking de nes (parte 2)

Mensagempor lop man » Qui Mai 26, 2016 2:50 pm

tu e fod* man parabens por compartilhar conhecimento :worship: :huggs:
foco Emuladores :-)
Avatar do usuário
lop man
Membro NES Archive
 
Registrado em: Seg Nov 07, 2011 12:11 am
Localização: campos dos goytacazes - RJ

Re: Tutorial rom hacking de nes (parte 2)

Mensagempor eduardo_facirolli » Sex Jul 29, 2016 12:18 am

Parabéns!!!
Avatar do usuário
eduardo_facirolli
Membro NES Archive
 
Registrado em: Qui Mar 04, 2010 6:29 am
Localização: Birigui - SP


Voltar para Tutoriais: reparos e gambiarras!

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante