[SNES] Dottie dreads nought - Ajuda em ponteiros e gráficos

Iniciado por TheBossBR, Setembro 21, 2021, 16:39:50 PM

tópico anterior - próximo tópico

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

TheBossBR

Me ajuda na tradução do game ( Dottie dreads nought ) que saiu para super Nintendo!. Sou novato.
Eu criei novos caracteres para acentos add na fonte do jogo, mas não consigo setar ou identificá-lo na tabela. Gostaria de saber se têm uma forma de fazer sem substituir os existentes?

E também não consegui achar o ponteiro do jogo.



Imagens
https://drive.google.com/drive/folders/1cq9NQ1eIXXvLZAxXzcrxtoucyMQ68F3Y?usp=sharing


Tabela
https://drive.google.com/file/d/1x9WFj92ST_x1I94QgnskEPVxLL4fpgZu/view?usp=sharing



Agradeço desde já obrigado.

huskie

Favor alterar a imagem de exibição e a assinatura para um tema mais condizente com este forum.

E a assinatura mesmo, completamente fora das regras. Leia as regras para saber os limites de imagens. Evite usar Gifs animadas também. A animação de gifs em PGs, creia, pesa em PCs modestos além de deixar o visual da página discrepante.
Through PS4 PSXItarch v3 Linux!

TheBossBR

Citação de: huskie online Setembro 21, 2021, 23:41:17 PM
Favor alterar a imagem de exibição e a assinatura para um tema mais condizente com este forum.

E a assinatura mesmo, completamente fora das regras. Leia as regras para saber os limites de imagens. Evite usar Gifs animadas também. A animação de gifs em PGs, creia, pesa em PCs modestos além de deixar o visual da página discrepante.

Okay, obrigado por me alertar..  :desisto:

Mas você conseguiria me ajudar com minhas dúvidas?

Kamppello

#3
Olá, TheBossBR!
Citação de: TheBossBR online Setembro 21, 2021, 16:39:50 PM
Gostaria de saber se têm uma forma de fazer sem substituir os existentes?
Sim tem! Mas é inúmeras vezes mais difícil do que substituir os existentes. Você tem que fazer uma busca mais profunda na Rom, se não encontrar é por que a fonte deve estar comprimida, você vai ter que dar um jeito de descomprimir antes de poder mexer nela.
Citação de: TheBossBR online Setembro 21, 2021, 16:39:50 PM
E também não consegui achar o ponteiro do jogo.
Se na base da observação você não conseguir encontrá-los, terá que tentar via debug, havia um tutorial aqui no fórum que ensinava a fazer isso.

TheBossBR

Citação de: Kamppello online Setembro 22, 2021, 07:47:39 AM
Olá, TheBossBR!

Sim tem! Mas é inúmeras vezes mais difícil do que substituir os existentes. Você tem que fazer uma busca mais profunda na Rom, se não encontrar é por que a fonte deve estar comprimida, você vai ter que dar um jeito de descomprimir antes de poder mexer nela.
Então eu vou substituir mesmo, mas vai ficar difícil achar 12 caracteres para substituir

Citação de: Kamppello online Setembro 22, 2021, 07:47:39 AM
Se na base da observação você não conseguir encontrá-los, terá que tentar via debug, havia um tutorial aqui no fórum que ensinava a fazer isso.
Vou tentar novamente e fazer o teste. (me passa o link do tutorial)
Obrigado.

Agora gostaria de se têm algum tutorial para subsistirá o gráfico de background? Só quero mudar os textos para ficar em português é um mecânica do jogo.


[spoiler]https://i.imgur.com/auhINlj.png[/spoiler]

Anime_World

Citação de: TheBossBR online Setembro 22, 2021, 11:01:00 AM
Vou tentar novamente e fazer o teste. (me passa o link do tutorial)
Obrigado.

Agora gostaria de se têm algum tutorial para subsistirá o gráfico de background? Só quero mudar os textos para ficar em português é um mecânica do jogo.
Vai depender de como funciona a rotina de impressão de caracteres da fonte no jogo. Se ela mapear de $00 a $FF. Você consegue incluir o restante. Agora se ela mapear uma faixa apenas de caracteres, precisa fazer alterações em assembly na rotina pra imprimir os extras.
nonononono

TheBossBR

#6
Citação de: Anime_World online Setembro 22, 2021, 18:33:53 PM
Vai depender de como funciona a rotina de impressão de caracteres da fonte no jogo. Se ela mapear de $00 a $FF. Você consegue incluir o restante. Agora se ela mapear uma faixa apenas de caracteres, precisa fazer alterações em assembly na rotina pra imprimir os extras.

Têm algum tutorial (video) no youtube que ensinar fazer isso.
pois acho que não vai ter caractere suficiente não.. vai ficar sem algumas letras.

Agradeço desde já.
Obrigado.  :parabens:


PS: têm o link acima da minha tabela e caracteres



TheBossBR

Consegui editar os gráficos (das mecânicas do jogo, [Superior Direito] )  :corram:

Rom
https://drive.google.com/file/d/1Z834MRSFv6jFazrNeAGb_2LW7XqrwDvq/view?usp=sharing

Agora vou criar planilha e começar a tradução.
têm algum modelo de arquivo para controlar tradução?

tipo: Endereço hex, offset, ponteiro, texto em inglês e português

Exemplo que estou criando.
https://docs.google.com/spreadsheets/d/1iQPSITPIM5rYNHepzqua-MywskPHy0IipAtma4zKNoQ/edit?usp=sharing

kuroi

Boa noite, TheBossBR!

Eu fiz um debug do jogo que você está hackeando e encontrei o endereço inicial da tabela de ponteiros que você procura. Vou explicar as duas maneiras que usei para encontrar os ponteiros:

Modo 1: Via Debug:
Obs: Siga o tutorial do Denim que o Kamppello mandou aí em cima e você conseguirá chegar ao valor do ponteiro procurado para um jogo de SNES HiROM. Mas se tiver dificuldades, eu escrevi um "mini tutorial" aqui:

1.1- Para começar a Debugar esse jogo, eu usei o endereço do diálogo: "Hi, I'm Dottie.{nl}Pleased to meet you!", que é 0x64E9D;
1.2- Depois eu converti o endereço para o formato do SNES usando o programa "SNEStuff" em formato HiROM de SNES. Com isso, o endereço ficou: 0xC64E9D;
1.3- Depois eu abri a ROM no emulador Debuger "Geiger's SNES9x", criei um Breakpoint de leitura no endereço 0xC64E9D e rodei o jogo;
1.4- No momento em que o jogo deveria exibir o diálogo: "Hi, I'm [...]you!", a execução pausa. Isso mostra que o BP funcionou;
1.5- Então eu resetei o jogo e iniciei a captura de logs do debug há alguns segundos antes do Breakpoint, clicando em CPU;
1.6- Ao chegar ao Breakpoint, eu cliquei em "Step into" uma vez e depois desmarquei o CPU;
1.7- Abri o último arquivo de debug gerado fui até a última linha do mesmo:
$C0/A621 B7 14       LDA [$14],y[$C6:4E9D]   A:091F X:0110 Y:0000 P:envmxdiZc
1.8- Como a instrução acima está carregando o valor 0x4E9D na posição $14 da memória, procurei nas instruções anteriores a gravação desse valor e encontrei:
$C0/62ED 85 14       STA $14    [$00:1D0E]   A:4E9D X:0000 Y:002E P:envmxdizc
1.9- Após isso, bastou encontrar a instrução acima da linha anterior, que buscava o 4E9D vinda da ROM e cheguei até a instrução:
$C0/62E4 B7 14       LDA [$14],y[$C9:2322]   A:C922 X:0000 Y:002D P:eNvmxdizc
1.10- A instrução acima carrega o endereço da ROM 0xC92322
1.11- Por último, converti novamente o endereço da ROM encontrado para o formato do PC usando o "SNEStuff" (para HiROM) e obtive o Offset: 0x92322
1.12- Fui até o Offset 0x92322 na ROM e Voilà! Abemos endereço do ponteiro do diálogo que começa em 0x64E9D! Ele está gravado no Offset 0x92322, assim como os outros ponteiros subsequentes (mas cuidado que eles não estão em ordem!).

Modo 2: Modo Noob:
2.1- Obtenha o endereço do diálogo que quer encontrar o ponteiro, que no caso é o 0x64E9D
2.2- Utilize a "regra geral" do cálculo de ponteiros para jogos de SNES HiROM sem Header, somando o Offset atual do diálogo ao valor 0xC00000, ficando assim: 0x64E9D + 0xC00000 = 0xC64E9D, que invertido (pois trata-se de uma plataforma Litte Endian) fica: "9D4EC6"
2.3- Procure pelos valores acima em um Editor Hexadecimal e você chegará ao mesmo Offset 0x92322

Pronto! Agora o próximo passo seria desenvolver um programinha Dumper/Inserter para utilizar essa lógica descrita em um dos modos acima para Dumpar os textos (já com os ponteiros), traduzir os txts e Inserir novamente com os ponteiros editados!

Até mais!!
君の夢が叶うのは誰かの影じゃないぜ。
風の強い日を選んで走ってきた。

TheBossBR

Citação de: kuroi online Setembro 24, 2021, 00:38:41 AM
Boa noite, TheBossBR!

Eu fiz um debug do jogo que você está hackeando e encontrei o endereço inicial da tabela de ponteiros que você procura. Vou explicar as duas maneiras que usei para encontrar os ponteiros:

Modo 1: Via Debug:
Obs: Siga o tutorial do Denim que o Kamppello mandou aí em cima e você conseguirá chegar ao valor do ponteiro procurado para um jogo de SNES HiROM. Mas se tiver dificuldades, eu escrevi um "mini tutorial" aqui:

[spoiler]1.1- Para começar a Debugar esse jogo, eu usei o endereço do diálogo: "Hi, I'm Dottie.{nl}Pleased to meet you!", que é 0x64E9D;
1.2- Depois eu converti o endereço para o formato do SNES usando o programa "SNEStuff" em formato HiROM de SNES. Com isso, o endereço ficou: 0xC64E9D;
1.3- Depois eu abri a ROM no emulador Debuger "Geiger's SNES9x", criei um Breakpoint de leitura no endereço 0xC64E9D e rodei o jogo;
1.4- No momento em que o jogo deveria exibir o diálogo: "Hi, I'm [...]you!", a execução pausa. Isso mostra que o BP funcionou;
1.5- Então eu resetei o jogo e iniciei a captura de logs do debug há alguns segundos antes do Breakpoint, clicando em CPU;
1.6- Ao chegar ao Breakpoint, eu cliquei em "Step into" uma vez e depois desmarquei o CPU;
1.7- Abri o último arquivo de debug gerado fui até a última linha do mesmo:
$C0/A621 B7 14       LDA [$14],y[$C6:4E9D]   A:091F X:0110 Y:0000 P:envmxdiZc
1.8- Como a instrução acima está carregando o valor 0x4E9D na posição $14 da memória, procurei nas instruções anteriores a gravação desse valor e encontrei:
$C0/62ED 85 14       STA $14    [$00:1D0E]   A:4E9D X:0000 Y:002E P:envmxdizc
1.9- Após isso, bastou encontrar a instrução acima da linha anterior, que buscava o 4E9D vinda da ROM e cheguei até a instrução:
$C0/62E4 B7 14       LDA [$14],y[$C9:2322]   A:C922 X:0000 Y:002D P:eNvmxdizc
1.10- A instrução acima carrega o endereço da ROM 0xC92322
1.11- Por último, converti novamente o endereço da ROM encontrado para o formato do PC usando o "SNEStuff" (para HiROM) e obtive o Offset: 0x92322
1.12- Fui até o Offset 0x92322 na ROM e Voilà! Abemos endereço do ponteiro do diálogo que começa em 0x64E9D! Ele está gravado no Offset 0x92322, assim como os outros ponteiros subsequentes (mas cuidado que eles não estão em ordem!).

Modo 2: Modo Noob:
2.1- Obtenha o endereço do diálogo que quer encontrar o ponteiro, que no caso é o 0x64E9D
2.2- Utilize a "regra geral" do cálculo de ponteiros para jogos de SNES HiROM sem Header, somando o Offset atual do diálogo ao valor 0xC00000, ficando assim: 0x64E9D + 0xC00000 = 0xC64E9D, que invertido (pois trata-se de uma plataforma Litte Endian) fica: "9D4EC6"
2.3- Procure pelos valores acima em um Editor Hexadecimal e você chegará ao mesmo Offset 0x92322

Pronto! Agora o próximo passo seria desenvolver um programinha Dumper/Inserter para utilizar essa lógica descrita em um dos modos acima para Dumpar os textos (já com os ponteiros), traduzir os txts e Inserir novamente com os ponteiros editados!

Até mais!![/spoiler]

Boa noite, kuroi!

Muito obrigado pelo tutorial, de verdade vou tentar aplicar como sou muito novado, têm alguns termos e testes que ainda não entendo. Mas vou esforçar para aprender.

Mas sobre Dumper/Inserter (oque seria isso?) Eu vou ter que desenvolver ou já têm aplicativo para essa função?  :hein:

E probleminha agora é que eu tenho que inserir as letras gráficas acentuadas e não substituir pois não tem como substituir todas as letras. As que estão vou precisar utilizá-la.
Igual adicionei no anexo, coloquei as fotos seguindo a ordem. Mas parece ela mapear uma faixa apenas de caracteres, igual Anime_World falou!. [spoiler]
Citação de: Anime_World online Setembro 22, 2021, 18:33:53 PM
Vai depender de como funciona a rotina de impressão de caracteres da fonte no jogo. Se ela mapear de $00 a $FF. Você consegue incluir o restante. Agora se ela mapear uma faixa apenas de caracteres, precisa fazer alterações em assembly na rotina pra imprimir os extras.
[/spoiler]


Agradeço desde já muito obrigado.  :danca1:

kuroi

#12
Boa noite, TheBossBR. Blz, cara?

Certo. Vamos por partes:

1- O Dumper/Inserter é um programa que nós Romhackers costumamos fazer para extrair textos (Dump) de jogos, para traduzí-los usando uma ferramenta externa, como um editor de textos comum, para que então depois possamos reinserí-los (Insert) na ROM original, corrigindo automaticamente todos os ponteiros que foram modificados. Para mais detalhes do que é e como escrever o seu próprio Dumper/Inserter usando a linguagem C, eu escrevi um "pequeno tutorial" de 112 páginas sobre isso nesse link:
http://www.romhacking.net.br/index.php?topic=842.0

2- Sobre os acentos, como se trata de um jogo que possui pouquíssimos textos, eu fiz um "estudo" sobre quais acentos poderiam ser usados no jogo traduzido e quais os caracteres especiais poderiam ser usados para substituí-los por caracteres acentuados do português e cheguei a seguinte conclusão:

Caracteres acentuados utilizados na minha tradução:
ÍáãúóíêçéÓ

Caracteres especiais da rom original que tive que substituir:
22=ó (era ")
23=é (era #)
2F=ç (era /)
5B=Í (era '(')
5C=ú (era \)
5D=Ó (era ')')
DF=á (era ß)
E4=ã (era ä)
F6=ê (era ö)
FC=í (era ü)

Resultado no jogo:


No caso, não houve a necessidade de "criar" novos endereçamentos de caracteres na fonte, porque reparei que o jogo não utiliza alguns caracteres. Portanto só os substiuí...

3- Depois que entendi a lógica de Ponteiros desse jogo, eu notei que ele possui uma quantidade ridiculamente pequena de textos (cerca de 100 linhas de texto...), portanto cheguei a escrever um Dumper/Inserter simples que Dumpa os textos em um arquivo txt já formatado com as quebras de linhas e "Endstrings". Depois de Dumpado, o tradutor deverá copiar o arquivo gerado (chamado "dump_orig.txt") para a pasta "scripts_traduzidos", renomeá-lo para somente "dump.txt" e traduzí-lo respeitando o tamanho de 29 caracteres por linha de texto da caixa e o número de no máximo 3 linhas por caixa. Após a tradução, o tradutor deverá rodar novamente o Dumper/Inserter, só que dessa vez escolherá "Inserir textos". Após a Inserção, basta rodar a ROM traduzida no Emulador, que o seu jogo estará traduzido...

Esse aqui é um exemplo do Dump_orig.txt (Textos originais Dumpados):


E esse aqui é um exemplo do Dump.txt (Textos traduzidos):


E após inserir todos textos, eu cheguei a essas conclusões:




Mas com eu não pretendo só te "entregar" todo o Hack feito do jogo (e acredito que você também não queira isso...), vou fazer um pequeno tutorial de como funciona o algoritmo das funções: "Dumper", "Inserter" e "calcula_ponteiro", para que você mesmo possa estudar e fazer o seu próprio Dumper/Inserter com a linguagem que quiser...

Algoritmo do Dumper:

1- Abrir o arquivo original do jogo;
2- Ler todo o seu conteúdo e gravar em uma variável de memória previamente alocada;
3- Fechar o arquivo original do jogo;
4- Abrir o arquivo de texto que receberá os dados do jogo
5- Iniciar o laço de repetição que lerá Byte por Byte da memória alocada delimitada pelo "Offset inicial" dos textos na ROM e o "Offset final" dos textos na ROM;
6- Verificar se o Byte anterior da memória alocada tem o valor hexa 0x00 (Endstring);
   6.1- Se o valor do Byte anterior lido da memória alocada for 0x00, somar o valor do Offset atual da memória ao valor 0xC00000 (Valor da "regra geral" do SNES HiROM);
   6.2- "Quebrar" o valor do Offset atual em 3 Bytes;
   6.3- Iniciar um novo laço de repetição que percorrerá todo o intervalo de início e fim dos ponteiros na ROM (é o endereço de início e fim da "tabela de ponteiros";
   6.4- Verificar se os três Bytes invertidos (Little Endian) coincidem com os Bytes encontrados na Tabela de Ponteiros;
   6.5- Se os valores forem iguais, gravar o endereço do ponteiro no arquivo de texto de saída (ex: {00092307});
7- Verificar se o valor encontrado na memória for igual a 0x06 (Quebra da linha);
   7.1- Gravar o Byte atual da memória como string no arquivo de texto de saída dentro de chaves (ex: {06}) e quebrar uma linha no arquivo de saída;
8- Verificar se o valor encontrado na memória for igual a 0x00 (Endstring);
   8.1- Gravar o Byte atual na memória como string no arquivo de texto de saída dentro de chaves, seguido de hífens separadores e uma quebra de linha(ex: {00}\n---------\n);
9- Se o Byte encontrado na memória alocada não for nem uma quebra de linha e nem uma Endstring, ele só poderá ser um caractere comum da tabela ASCII;
   9.1- Gravar o caractere lido da memória alocada no arquivo de texto de saída;
10- Fechar o arquivo de texto de saída
11- Liberar a memória alocada

Código interpretado em linguagem C comentado com os passos do algoritmo:

void Dumper(){
FILE *arquivo, *arquivo_saida;
unsigned char *memoria;
int cont = 0;
int linha;
unsigned int i, j, h;
unsigned int Byte1, Byte2, Byte3;
unsigned int OffsetInicioPonteiros = 0x922F8;
unsigned int  OffsetFimPonteiros = 0xFFFFF;
unsigned int Offset_ini = 0x64BBE;
unsigned int Offset_fim = 0x6511B;
unsigned char caminho_orig[50] = "scripts_originais\\Dump_orig.txt";

//Abrir o arquivo original do jogo
    arquivo = fopen("Dottie dreads nought_dump.sfc", "rb");
    fseek (arquivo, OFFSET, SEEK_SET);
    //Ler todo o seu conteúdo e gravar em uma variável de memória previamente alocada
    memoria = (unsigned char*) malloc (sizeof(unsigned char)*TAM_ARQ);
    cont = fread (memoria, sizeof(unsigned char), TAM_ARQ, arquivo);
    //Fechar o arquivo original do jogo
    fclose(arquivo);
   
    //Abrir o arquivo de texto que receberá os dados do jogo
    arquivo_saida = fopen(caminho_orig, "wt");
   
    //Iniciar o laço de repetição que lerá Byte por Byte da memória alocada delimitada pelo "Offset inicial" dos textos na ROM e o "Offset final" dos textos na ROM
    for(i=Offset_ini;i<=Offset_fim;i++){
    //Verificar se o Byte anterior da memória alocada tem o valor hexa 0x00 (Endstring)
if(memoria[i-1] == 0x00){

h = i;

//Se o valor do Byte anterior lido da memória alocada for 0x00, somar o valor do Offset atual da memória ao valor 0xC00000 (Valor da "regra geral" do SNES HiROM)
h = h + 0xC00000;

//"Quebrar" o valor do Offset atual em 3 Bytes
            Byte1 = (unsigned char)(h & 0x000000FF);
            Byte2 = (unsigned char)((h >> 8) & 0x000000FF);
    Byte3 = (unsigned char)((h>>16) & 0x000000FF);
   
    //Iniciar um novo laço de repetição que percorrerá todo o intervalo de início e fim dos ponteiros na ROM (é o endereço de início e fim da "tabela de ponteiros"
    for(j=OffsetInicioPonteiros;j<=OffsetFimPonteiros;j++){
   
    if( i == Offset_ini){
    continue;
}
    //Verificar se os três Bytes invertidos (Little Endian) coincidem com os Bytes encontrados na Tabela de Ponteiros
    if((Byte1 == memoria[j]) && (Byte2 == memoria[j+1]) && (Byte3 == memoria[j+2])){
    //Se os valores forem iguais, gravar o endereço do ponteiro no arquivo de texto de saída (ex: {00092307});
fprintf(arquivo_saida, "{%.8x}\n", j);
}
}
}
//Verificar se o valor encontrado na memória for igual a 0x06 (Quebra da linha)
if(memoria[i] == 0x06){
//Gravar o Byte atual da memória como string no arquivo de texto de saída dentro de chaves (ex: {06}) e quebrar uma linha no arquivo de saída
fprintf(arquivo_saida, "{%.2x}\n", memoria[i]);
}
//Verificar se o valor encontrado na memória for igual a 0x00 (Endstring)
else if(memoria[i] == 0x00){
//Gravar o Byte atual na memória como string no arquivo de texto de saída dentro de chaves, seguido de hífens separadores e uma quebra de linha(ex: {00}\n---------\n)
fprintf(arquivo_saida, "{%.2x}\n------------------\n", memoria[i]);
}
//Se o Byte encontrado na memória alocada não for nem uma quebra de linha e nem uma Endstring, ele só poderá ser um caractere comum da tabela ASCII
else{
//Gravar o caractere lido da memória alocada no arquivo de texto de saída
fprintf(arquivo_saida, "%c", memoria[i]);
}
}
printf("Script Dumpado!!\n");
getch();
//Fechar o arquivo de texto de saída
fclose(arquivo_saida);
//Liberar a memória alocada
free(memoria);
}


Bom, por enquanto vou deixar só a função "Dumper", porque aí você terá mais tempo para estudar e tirar as dúvidas...

Até mais!!
君の夢が叶うのは誰かの影じゃないぜ。
風の強い日を選んで走ってきた。

TheBossBR

Boa tarde, Kuroi. Tudo certo. E com você está bem?

Muito obrigado por jogar uma  :bomba: no meu colo...
agora vou ter que estudar  :scripts: e eu quero aprender fazer. espero que eu consiga.

Muito obrigado. têm pouco conhecimento no youtube pesquisando e você está me ajudando muito.

Curso Programação playlist em C
Vou começar estudando por essa playlist e vê consigo recriar seu código entendendo o processo.

Caracteres como F6=ö usar em "Stahlhörn" que seria nome próprio. Mas nas traduções suas normalmente você tira trema pq foi abolida nova gramatica portuguesa?
[spoiler][/spoiler]


Muito obrigado. Eu estava fazendo tudo manual ainda no começo mais talvez isso automatiza tudo né!

Exemplo que estou criando.
https://docs.google.com/spreadsheets/d/1iQPSITPIM5rYNHepzqua-MywskPHy0IipAtma4zKNoQ/edit?usp=sharing

kuroi

Boa tarde. Estes aqui são os motivos pelos quais eu troquei os tais Caracteres da fonte para inserir os acentos:

1- 22=ó (era ")
Quando fiz uma busca no script original do jogo, eu não encontrei em nenhum lugar o uso do caractere de "aspas duplas", apesar do mesmo estar dentro da fonte original do jogo... Por esse motivo, eu resolvi omití-lo e colocar o caractere acentuado "ó" no lugar dele, além de que se quiser usar aspas, eu posso usar as "aspas simples".

23=é (era #)
Esse caractere "hashtag" ou "cerquilha" em alguns lugares, eu reparei que no script original só é usado uma única vez, quando o desenvolvedor quer referenciar a sua página no Twitter lá no fim do jogo. Eu simplesmente troquei o caractere "#" do script traduzido por um "@", que ainda foi mantido. E com isso, consegui liberar mais um caractere para inserir o "é".

2F=ç (era /)
A "barra comum" eu não encontrei em nenhum lugar do script original, por isso a troquei pelo "ç".

5B=Í (era '(')
Como o caractere "abre parênteses" é um caractere 1 bit mais alto do que os outros e também não foi encontrado no script original que eu Dumpei, resolvi usá-lo para alocar um dos dois caracteres maiúsculos que eu precisava acentuar, que no caso era o "Í".

5C=ú (era \)
A "contra-barra" eu também não encontrei no script original, portanto troquei por "ú".

5D=Ó (era ')')
Como o caractere "fecha parênteses" é um caractere 1 bit mais alto do que os outros e também não foi encontrado no script original que eu Dumpei, resolvi usá-lo para alocar mais um dos dois caracteres maiúsculos que eu precisava acentuar, que no caso era o "Ó".

DF=á (era ß)
Esse caractere (que mais se parece com um "Beta"), só era usado para designar o nome da flor que era o objetivo do jogo, a tal "Edelweiß". Porém, em uma busca rápida pela internet eu encontrei o nome da tal flor escrita também como: "Edelweiss", portanto, troquei o nome da flor acabei ganhando mais um caractere que poderia ser substituído por um acentuado, no
caso, o "á".

E4=ã (era ä)
O caractere "a com trema" não foi encontrado em nenhum lugar do script original, por isso resolvi usá-lo para exibir o "ã".

F6=ê (era ö)
O caractere "o com trema", assim como você comentou, apesar de ser usado na palavra "Stahlhorn", ele não possui som ou efeito na nova reforma da língua portuguesa, por isso retirei o ö de todo o script e obtive espaço também para inserir o caractere acentuado "ê".

FC=í (era ü)
O caractere "u com trema" não foi encontrado em nenhum lugar do script original, por isso resolvi usá-lo para exibir o "í".

Obs: Os outros caracteres acentuados da língua portuguesa não foram inseridos nesta fonte, porque eles não foram usados na minha tradução. São eles:

Minúsculos:
"àâõô"

Maniúsculos:
"ÁÃÂÀÉÊÕÔ"

Assim que você conseguir entender o algoritmo do Dumper, eu te passarei o do Inserter e do cálculo de ponteiros.

Até mais!!
君の夢が叶うのは誰かの影じゃないぜ。
風の強い日を選んで走ってきた。