Fórum Unificado de Romhacking e Tradução

Romhacking e Tradução de Jogos => Dúvidas e Ajuda => Tópico iniciado por: Slasher online Junho 16, 2026, 00:25:41 AM

Título: Ajuda para tradução de jogo do GBA 🥹
Enviado por: Slasher online Junho 16, 2026, 00:25:41 AM
Decidi traduzir meu primeiro jogo de GBA...
Já estive atuando um pouco até na cena de romhacking... mas esta é a minha primeira vez neste console.
O que me motivou a começar essa tradução foi que, apesar de já terem traduzido muitos jogos no GBA, este ainda não tinha tradução. E como o GBA é tão farto em traduções, imaginei que seria um sistema fácil de traduzir.

E parecia uma tarefa bem fácil mesmo inicialmente! Muitos textos foram fáceis de encontrar. Num primeiro momento já consegui traduzir muita coisa:

Introdução = 100%
Tutorial = 100%
Menus = 90%


Mas como felicidade de pobre dura pouco :choro1: , não consegui prosseguir depois disso.
Pelo que vi, os principais textos usados durante o resto do jogo, como os Quiz e os Pergaminhos, usam na verdade uma espécie de "lista pronta" de palavras, que estão escritas uma do lado da outra no final da rom... Acredito que dicionário seja o termo usado para isso. Na prática, entendi que, na hora de mostrar as perguntas, ao invés de abrir o texto, o jogo "monta" as frases combinando essas "palavras prontas" (algo que provavelmente foi feito para economizar espaço no cartucho). E é a primeira vez que me deparo com isso!

Ainda sou um pouco novo na cena de romhacking e isso foi novidade pra mim. Não faço ideia de como alterar à partir daqui. Alguém pode ajudar a encontrar os pointers e mostrar o caminho especificamente para este jogo?
Pelo que pesquisei acredito que é possível expandir a rom para inserir os novos textos e perguntas por inteiro e sem compactação ao final da rom e assim não depender dessa "lista de palavras", que já usa uma ordem pronta, lembrando que no português teríamos de mudar a ordem das palavras e algumas frases podem ter menos ou mais termos em um idioma... Mas não sei como proceder depois de expandir a ROM...

Se alguém puder me mostrar o "caminho das pedras"... agradeço muito! Sabendo por onde ir vou continuar o processo da tradução até o final...

Se alguém puder me ajudar de verdade agradeço. Pelo menos preciso saber:

- Quais ferramentas preciso utilizar neste caso?
- Como localizar e arrumar os ponteiros nesse jogo?

Acho que isso já seria um começo para terminar essa tradução.

O nome do jogo é o The Bible Game e gostaria de mudar os textos das perguntas e respostas.

(https://thegameboyabyss.neocities.org/images/bible/Bible%20Game,%20The%20(USA)-260420-111812.png)

Muito obrigado por qualquer ajuda!!!
Título: Res: Ajuda para tradução de jogo do GBA
Enviado por: kuroi online Junho 16, 2026, 01:12:58 AM
Pelo que você descreveu aí, me parece que você encontrou um "dicionário" no meio da rom...
Era uma prática comum em jogos antigos pra economizar espaço mesmo.
O que você teria que fazer aí seria primeiro identificar o bloco onde está o dicionário, traduzi-lo (usando termos reutilizáveis) e depois editar os ponteiros do bloco do dicionário, para que quando ele for chamado no script, tudo fique no seu devido lugar.
Título: Res: Ajuda para tradução de jogo do GBA
Enviado por: Slasher online Junho 16, 2026, 02:07:19 AM
Obrigado pela resposta!!
Em teoria seria isso mesmo, Kuroi!

Acontece que não estou sabendo como fazer isso. É a primeira vez que estou trabalhando com uma ROM de GBA. Sou novato no GBA e como não sabia muito por onde começar nesse console, estou apenas com um editor Hex e o VBA... Achei que só com isso já iria dar conta... até esbarrar nesse dicionário...
Quais ferramentas recomendam?? Entendo um pouco de romhacking mas nunca fiz nada no GBA. Achei que era mais fácil, devido a tantas traduções que já existem para ele (menos para esse jogo...)

CitarO que você teria que fazer aí seria primeiro identificar o bloco onde está o dicionário, traduzi-lo (usando termos reutilizáveis)
Identificar o bloco seria identificar o endereço onde começa e termina esse dicionário?
(Obs: se observar a rom, no "dicionario" as palavras ficam coladas umas nas outras. Ex: "WhatforThisYesGo" sem divisão entre as palavras, ok? Então eu precisaria ajustar as palavras para um tamanho maior no português, "empurrando" a palavra seguinte mais para frente e fazendo os devidos ajustes... Existe uma maneira fácil de fazer isso no GBA?)

Citare depois editar os ponteiros do bloco do dicionário
Como posso fazer para identificar os ponteiros no jogo? Qual emulador devo usar? Não consegui fazer isso aqui ainda.

E a melhor opção seria continuar usando o dicionário? Pensei que também poderia substituir as palavras do dicionário por um texto inteiro escrito em uma parte vazia da ROM, sem precisar fazer uma combinação de palavras.
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: ØX-Carnage online Julho 14, 2026, 15:16:01 PM
Interessante um jogo cristão.
Ainda esta com problemas nesse projeto?
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: Slasher online Julho 21, 2026, 00:41:30 AM
Sim, ainda não consegui progredir à partir da parte dos quizz que fazem uso do dicionário...
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: ØX-Carnage online Julho 21, 2026, 10:51:22 AM
Citação de: Slasher online Julho 21, 2026, 00:41:30 AMSim, ainda não consegui progredir à partir da parte dos quizz que fazem uso do dicionário...
Entendi se tiver o save da parte que ussa essas frases manda ae.
Não sou especialista  no assunto mas posso tentar ajudar.
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: Slasher online Julho 21, 2026, 14:39:32 PM
Citação de: ØX-Carnage online Julho 21, 2026, 10:51:22 AMEntendi se tiver o save da parte que ussa essas frases manda ae.
Não sou especialista  no assunto mas posso tentar ajudar.

Claro! Mando sim! Na verdade não precisa ir muito longe para chegar nessa parte mas segue o save:
Bible Game, The (USA).sgm (https://www.mediafire.com/file/hmqoqpacu6rsuho/Bible_Game%252C_The_%2528USA%2529.sgm/file)

Obs: é um Save state do emulador Virtual Boy Advanced

Caso consiga entender como fazer para traduzir essa parte pretendo continuar até o final...
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: ØX-Carnage online Julho 21, 2026, 16:49:22 PM
Citação de: Slasher online Julho 21, 2026, 14:39:32 PM
Citação de: ØX-Carnage online Julho 21, 2026, 10:51:22 AMEntendi se tiver o save da parte que ussa essas frases manda ae.
Não sou especialista  no assunto mas posso tentar ajudar.

Claro! Mando sim! Na verdade não precisa ir muito longe para chegar nessa parte mas segue o save:
Bible Game, The (USA).sgm (https://www.mediafire.com/file/hmqoqpacu6rsuho/Bible_Game%252C_The_%2528USA%2529.sgm/file)

Obs: é um Save state do emulador Virtual Boy Advanced

Caso consiga entender como fazer para traduzir essa parte pretendo continuar até o final...

Seria isso?
Se for isso, a melhor solução seria um dump e insert. Isso porque o jogo trabalha com valores de índice, ou seja, para cada frase há o offset de início e o offset final. Subtraindo tudo do dicionário, temos o limite de caracteres. Se você for mudar uma frase, terá que fazer isso em todas as outras.
Brincando, dei uma pesquisada na VRAM e na font. Ambas podem ser editadas e expandidas sem problemas.
Expandi a ROM até 16 MB e não travou, então dá para colocar os versículos conforme a nossa Bíblia.

(https://i.ibb.co/M5h32bhM/imagem-2026-07-21-164755116.png)  (https://i.ibb.co/9fTpJTn/imagem-2026-07-21-185413395.png)
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: Elizomar online Julho 22, 2026, 09:41:45 AM
Esse jogo promete.
Estou na espectativa de jogar em nosso idioma.  :cuteeyes:
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: ØX-Carnage online Julho 26, 2026, 20:56:29 PM
Explicação completa de como funciona essa rom.
Como o jogo escolhe e monta as perguntas e respostas

Durante a análise da ROM, descobri que as perguntas não estão armazenadas como frases completas.

O jogo utiliza três estruturas principais:




1) O dicionário de palavras

O dicionário começa em:

0x79D58C

As palavras ficam concatenadas, sem um byte de final de string entre elas.

Exemplo:

theofJesuswasTheJohnMatthewto...

Mas existe uma tabela separada que informa onde cada palavra começa e termina.

Essa tabela começa em:

0x7A328C

Cada entrada é um offset relativo de 16 bits.

Exemplo:

0x000E até 0x0011 = "the"
0x0011 até 0x0013 = "of"
0x0013 até 0x0018 = "Jesus"
0x0018 até 0x001B = "was"

A fórmula utilizada é:

Endereço da palavra = base do dicionário + offset relativo

Ou seja:

Endereço da palavra = 0x79D58C + offset



2) Como uma frase é armazenada

Uma pergunta como:

What is the first word of the Bible?

não aparece dessa forma no bloco principal de perguntas.

Ela é armazenada como uma sequência de índices:

18 30 0E 27 70 0F 0E 81 1E 01

Interpretando os índices:

18      = What
30      = is
0E      = the
27      = first
70      = word
0F      = of
0E      = the
81 1E  = Bible
01      = ?

Depois de consultar o dicionário, o jogo monta:

What is the first word of the Bible?

Índices menores que `0x80` utilizam um byte.

Exemplo:

What = índice 0x0018

Na frase:
18

Índices maiores utilizam dois bytes.

Exemplo:

Bible = índice 0x011E

Na frase:
81 1E

O primeiro byte recebe o bit `0x80`, indicando que existe um segundo byte.



3) Estrutura de cada registro

Cada registro pode conter:


O formato lógico é aproximadamente:

Pergunta
Resposta correta
Alternativas erradas
Referência
Explicação

As alternativas erradas ficam agrupadas em um campo e são separadas internamente por um índice especial.

Na Tool criada, isso é apresentado de forma legível:

▶ 118 (quiz)

{question}
At the feeding of the five thousand, who had the 5 loaves of bread and 2 fish?

{answers}
A lad
Andrew
Mary Magdalene
A young woman

{reference}
John 6:9

{explanation}
At the feeding of the five thousand, it was a lad who had the 5 loaves of bread and 2 fish.

Dentro de `{answers}`:

Primeira linha  = resposta correta
Linhas seguintes = respostas erradas

Assim, quando for traduzir não precisa editar índices manualmente.

O `insert.py` transforma novamente as frases completas em sequências de índices.



4) Tabela de offsets das perguntas

O bloco principal dos registros começa em:

0x7A5172

A tabela de offsets começa em:

0x7CF014

Cada entrada da tabela possui quatro bytes e informa o deslocamento de uma pergunta em relação à base do bloco.

A fórmula é:

Endereço do registro =
base das perguntas + offset da tabela

Exemplo:

ID da pergunta: 118
Offset relativo: valor armazenado na tabela
Base: 0x7A5172

Endereço final:
0x7A5172 + offset relativo

A rotina responsável por localizar e montar o registro é chamada a partir da região:

0x080001F4

Ela recebe o ID da pergunta, consulta a tabela de offsets e encontra o registro correspondente.



5) Como o jogo escolhe qual pergunta será exibida

O jogo não lê simplesmente as 2.438 perguntas em ordem.

Também não faz um sorteio completamente novo entre todas as perguntas sempre que precisa mostrar uma.

O sistema funciona como um baralho dividido em grupos.

Existe uma tabela próxima de:

0x7A5152

Ela divide as perguntas em faixas.

Foi identificado 16 grupos.

Grupo 00: perguntas    0–150
Grupo 01: perguntas  151–386
Grupo 02: perguntas  387–621
Grupo 03: perguntas  622–872
Grupo 04: perguntas  873–1101
Grupo 05: perguntas 1102–1209
Grupo 06: perguntas 1210–1213
Grupo 07: perguntas 1214–1218

Os grupos seguintes formam uma segunda coleção com registros correspondentes aos primeiros grupos.

O jogo mantém os grupos separados. Uma pergunta pertencente a uma faixa não é misturada com as perguntas das outras faixas.



6) Criação da lista de IDs

Ao preparar o sistema de perguntas, uma rotina próxima de:

0x08000550

cria na RAM uma lista com os IDs:

0, 1, 2, 3, 4, 5 ... 2437

A lista fica em uma estrutura apontada na região:

0x03003C0C

Depois, cada grupo é embaralhado separadamente.

Exemplo:

Antes:

151, 152, 153, 154, 155, 156

Depois:

154, 151, 156, 153, 152, 155

O embaralhamento altera a ordem das perguntas, mas não move uma pergunta para outro grupo.



7) O jogo utiliza as perguntas como um baralho

Depois que uma faixa foi embaralhada, o jogo utiliza os IDs em sequência.

Exemplo:

Lista embaralhada:

118, 72, 145, 3, 94

As próximas perguntas serão:

Primeira chamada:  118
Segunda chamada:    72
Terceira chamada:  145
Quarta chamada:      3
Quinta chamada:     94

Portanto, o jogo não precisa sortear novamente todos os IDs a cada pergunta.

Ele consulta a próxima posição da lista embaralhada e avança o contador daquele grupo.

Os contadores ficam em uma estrutura próxima de:

0x03003C20

Quando o contador chega ao final da faixa, ele volta ao início correspondente.

Esse sistema diminui a possibilidade de uma pergunta se repetir imediatamente.



8) Como o grupo é escolhido

Quando o jogo precisa mostrar uma pergunta, ele primeiro verifica o estado atual da partida.

Duas rotinas relacionadas a essa seleção foram encontradas:

0x08000748
0x08000810

A lógica geral é:


A variável exata que determina cada grupo depende do estado do jogo. Pode envolver o modo, a localização ou o progresso atual.



9) Montagem do texto na RAM

Depois que o ID foi escolhido, a rotina faz:


Isso é repetido para:

Pergunta
Resposta correta
Alternativas erradas
Referência
Explicação

A ROM só possui os índices. A frase completa é reconstruída na RAM durante a execução.



10) Validação da pergunta escolhida

Existe ainda um pequeno loop de validação próximo na região:

0x080017B0–0x080017E0

Depois de montar a pergunta, o jogo verifica se o texto resultante está vazio.

A lógica é aproximadamente:

Escolher ID
    |
    v
Montar pergunta
    |
    v
A pergunta está vazia?
    |
    +-- Sim --> escolher outro ID
    |
    +-- Não --> mostrar na tela

Isso impede que um registro vazio seja exibido ao jogador.



11) Resumo em pseudocódigo

Ao iniciar o sistema de perguntas:

    criar uma lista com IDs de 0 até 2437

    para cada grupo:
        embaralhar os IDs da faixa
        posicionar o contador no início


Quando precisar mostrar uma pergunta:

    grupo = calcular_grupo_pelo_estado_do_jogo

    posição = contador_do_grupo

    id = lista_embaralhada[posição]

    avançar contador_do_grupo

    se chegou ao final da faixa:
        voltar ao início da faixa

    offset = tabela_de_offsets[id]

    registro = base_das_perguntas + offset

    montar:
        pergunta
        respostas
        referência
        explicação

    se a pergunta estiver vazia:
        escolher outra
    senão:
        mostrar a pergunta



Bom foi isso. O jogo usa um sistema muito interessante, é como se fosse um cardeado a cada rodada embaralha as perguntas e respostas.
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: Slasher online Julho 28, 2026, 23:13:05 PM
Super interessante isso Carnage!
:cuteeyes:
Eu confesso que subestimei essa rom. Com base em outra tradução que fiz, achava que seria algo super simples e que as perguntas estariam todas em sequência, escritas uma por uma na rom... Bastando traduzir.
:huh:
Agora tenho mais que certeza de que se não fosse a sua ajuda não iria conseguir progredir de onde parei!
Muito obrigado!
Título: Res: Ajuda para tradução de jogo do GBA 🥹
Enviado por: Elizomar online Julho 29, 2026, 09:42:26 AM
 :estudando1:  Mano do céu, estou lendo um artigo PHD Rom Master. Que show de análise, OX-C.  Grato!!