[ASM PATCHING] Aula Básica - 03

Iniciado por Anime_World, Outubro 20, 2020, 17:48:34 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

Anime_World

Se você chegou até aqui já deve saber mais que qualquer outro as facilidades de se usar um asm patching para traduzir um jogo. Portanto, com ponteiros não será diferente. É bem mais rápido e simples edita-los por este método, sem necessidade de ficar calculando exaustivamente um por um ou de programar um Dumper/Inserter para isso.

Na aula anterior, produzimos nosso patch para alterar alguns textos no jogo Altered Beast de Mega Drive. Porém nessa aula faremos um patch novo para o jogo Yu Yu Hakusho de GBA. A ideia é variar um pouco de plataforma para mostrar a diversidade de aplicações do método e dar uma noção mais abrangente de como usa-lo em outros sistemas.

Bem vamos iniciar o nosso patch configurando ele, diferente de outras arquiteturas como N64, PSX, Mega, Snes, MSX, Master System... o bass ainda não suporta a arquitetura do GBA, porém, por ser uma ferramenta muito bem feita ele permite que você trabalhe com as ROMs sem problema algum. Sabendo disso vamos configura-lo sem a necessidade do comando arch, a nossa única mudança será o sistema de ordenação dos bytes (comando: endian) de msb que é big-endian, para lsb que é little-endian e o sistema de ordenação usado pelo GBA:


Feito isso vamos localizar os textos do Menu na ROM:



E adicionar as string ao nosso patch:


Porém se observarmos mais atentamente veremos que existe uma ENDSTRING representada por 2 bytes determinando o fim de cada string. Poderíamos simplesmente fazer desta forma para adiciona-la ao nosso patch:


Para obter organização e facilidade visual, recomendo fazer da seguinte forma:


Dessa forma atribuímos o valor a uma constante, que pode ser reutilizada inúmeras vezes e facilmente identificada.

Com todas as strings em nosso patch, podemos já traduzir porém teremos uma limitação de espaço determinada pela estrutura atual da ROM. O que nos forçaria a abreviar ou procurar sinônimos, reduzindo a qualidade de nossa tradução. Por tal motivo, ainda não inseri o comando origin que determina o offset de onde estão localizados os textos, já que abordagem ideal para isso será editar os ponteiros dos menu principal e mover as strings dele para uma área com espaço suficiente para acomodar as strings traduzidas.

Sabemos que os ponteiros de GBA são encontrados invertendo o offset (endereço do texto) e adicionando 08 ao final.

- No caso da string PLAY do menu principal o offset é 0x035894.
- Invertendo a ordem dos bytes temos: 945803.
- Adicionando o 08 ao final temos: 94580308.
- Com uma simples busca hexadecimal pelo valor encontraremos mais de um resultado. Não se assuste, são todos ponteiros para a string PLAY.


Agora que sabemos aonde estão o ponteiros para a string PLAY, vamos colocar suas localizações usando o comando origin em nosso patch:


E em seguida vamos atribuir seus valores, usando o label da string PLAY para isso:


E sem nos esquecer adicionar o 08 que vai ao final do ponteiro


Calculo introduzido, a partir de agora, independente de onde colocarmos a string PLAY, automaticamente o endereço dela será inserido no valor ponteiro. Sem necessidade de ficar recalculando a todo instante.
Todavia, ainda não temos um endereço para alocar as strings do menu principal na ROM. Precisamos encontrar um espaço adequado. Eu encontrei esse no offset 0x761B0 que parece servir bem para o propósito:


Vamos alocar as strings do Menu Principal lá então, mais uma vez usando o comando origin:

Nota:os valor dos ponteiros pode ser escrito em forma de calculo também, somando $08000000 ao label terá o mesmo efeito de adicionar db $08 depois dele, pois o bass fará a inversão do resultado. Coloquei só para que você saibam que também existe essa possibilidade.

Tudo pronto teremos o seguinte patch e em sequencia já podemos roda-lo no bass:

// ********************************************************
// *      [GBA] YuYu Hakusho - Spirit Detective           *
// *               Patch de Tradução v1.0                 *
// ********************************************************
// * Tradutor: Anime_World                                *
// ********************************************************
// * Modificações:                                        *
// *  - Textos dos Menus                                  *
// *  - Textos dos Dialogos                               *
// ********************************************************

// Sistema de Ordenação dos Bytes
endian lsb

// ROM Patcheada
output "Yu Yu Hakusho - Spirit Detective (BR).gba",create

// ROM Original
origin $0000000
insert "Yu Yu Hakusho - Spirit Detective (U).gba"

// Controle
constant ENDSTRING($0000)

// Ponteiros:
origin $00029530
    dl menu_principal_play
    db $08
origin $00029854
    dl menu_principal_play
    db $08
origin $00029ABC
    dl menu_principal_play
    db $08
origin $000358D0
    dl menu_principal_play
    db $08

// Menus
origin $000761B0
menu_principal_play:
    db "PLAY"
    dw ENDSTRING
menu_principal_music:
    db "MUSIC"
    dw ENDSTRING
menu_principal_locked:
    db "LOCKED"
    dw ENDSTRING
menu_principal_extras:
    db "EXTRAS"
    dw ENDSTRING
menu_principal_effects:
    db "EFFECTS"
    dw ENDSTRING


Modificamos o valor da string PLAY para o valor traduzido que desejarmos: "INICIAR JOGO", "NOVO JOGO", "JOGAR", "INICIAR",etc...
E se tudo estiver correto, ao verificarmos o primeiro ponteiro da string PLAY teremos o seguinte valor gravado na ROM:

E ao executarmos o jogo no emulador:



Perfeito! Como é possível verificar, não temos mais limitações para inserir os textos. Ficando livres para traduzir adequadamente os menus.

Existem outras 5 strings do menu principal: MUSIC,LOCKED,EXTRAS e EFFECTS para praticar como exercício. Os dialogos desse jogo também são bem simples e fáceis de encontrar. Sendo excelente para praticar os princípios do ROMHacking.

Na próxima aula, veremos como inserir edições gráficas na ROM usando o asm patching. Até lá.

OBSERVAÇÃO IMPORTANTE: Este não é um tutorial sobre ponteiros e sim sobre como trabalhar os ponteiros usando o asm patching, se você tem dúvidas sobre como encontrar ponteiros, recomendo que leia os tutoriais adequados para isso.
nonononono