Skip to content

Repository files navigation

Gungnir (PSP) — Tradução PT-BR

Tradução completa para português do Brasil de Gungnir: Inferno of the Demon Lance and the War of Heroes (Sting / Atlus, PSP).

Todo o texto do jogo está traduzido — 17.550 strings.

Onde foi testado: emulador (PPSSPP). Não foi testado em PSP real. A ISO leva o executável decriptado — um PRX de PSP válido (e_type 0xFFA0, MIPS), que é o formato que o firmware customizado carrega, e ISO em PSP só roda por CFW de qualquer forma. Deve funcionar em hardware, mas ninguém confirmou. Se você testar, abra uma issue contando o resultado.

⚠️ Se você baixou a v1, troque pela v2

A v1 (agosto/2026) trava antes da primeira batalha: o evento de abertura para de avançar, a cena congela e o combate nunca carrega. O texto dela estava certo, mas a reinserção quebrava a estrutura do script. A v2 corrige isso — veja o que mudou.


Baixar

>> Baixar o patch na página de Releases <<

O patch não contém o jogo — só a diferença entre a ISO original e a traduzida. Você precisa ter a sua própria cópia.

Aplicar em Gungnir (USA)
Tamanho 262.766.592 bytes
CRC32 183F3EDC
SHA-1 veja COMO_APLICAR.txt

Passo a passo completo em COMO_APLICAR.txt.

Resumo: baixe o Floating IPS, clique em Apply Patch, escolha o .bps e depois a sua ISO.

O formato BPS carrega CRC32 da origem, do destino e do próprio patch. Se você usar a ISO errada, ele avisa em vez de gerar um arquivo quebrado em silêncio.


O que está traduzido

frente strings %
Texto da ISO (data.dar) 13.998 100%
Texto do EBOOT 3.552 100%
Total 17.550 100%

Aplicado em 454 sessões de tradução. Acentuação implementada com a largura dos glifos casada com a fonte original — sem letras coladas nem cortadas.

O que NÃO está traduzido

Texto que está dentro de imagem. São 1.295 arquivos .tpl no data.dar, e mexer neles é edição gráfica, não tradução. Ficou de fora por opção.

pasta qtd o que é
actname/ 397 nome de ação/skill na batalha
location/ 59 banner de lugar
tutorial/ 57 páginas inteiras de tutorial
win/, victory/, btlst/ 103 telas de vitória e início de batalha
chapter/ 28 título de capítulo
outros ~35 exército, gunsin, telas de sistema

As de maior impacto no jogo são tutorial/ e actname/. O resto é cosmético.

Além disso, 70 trechos de diálogo (de 11.667) ficaram mais curtos que o original, por causa do limite de espaço do bytecode explicado acima. Levantamento completo em docs/graficos_com_texto.md.


O que mudou da v1 para a v2

A v1 tinha a tradução certa e quebrava a estrutura do jogo. O primeiro defeito é o que impedia jogar; os outros eram reais mas silenciosos.

1. Travava antes da primeira batalha e ao terminar combates. Os arquivos de script (event/, map/) são bytecode com saltos de endereço absoluto. A v1 deixava esses arquivos mudarem de tamanho — português é mais longo que inglês — e aí os saltos passavam a apontar para o lugar errado: o evento exibia a fala e parava.

Não dá para remapear esses saltos por varredura: a maioria dos valores que parecem ponteiro é float de parâmetro (00 00 80 40 é 4.0, 00 00 b8 41 é 23.0).

A saída está em tools/emprestar.py: o intérprete pula os zeros depois do terminador da string. Então nenhum arquivo muda de tamanho, e cada frase é gravada dentro do espaço em bytes que a frase original ocupava — uma frase partida em pedaços pelos bytes de controle é montada de volta preservando esses bytes na ordem exata.

2. 272 efeitos sonoros saíam vazios. No container .dar, stored_size == 0 significa "guardado sem compressão", e o tamanho real está no decomp_size. O reempacotador lia isso como "arquivo vazio" e gravava os 272 se/*.vag com zero byte.

3. Tabela de ponteiros do cabeçalho. Cada .bin começa com [tipo, n, offset_da_tabela] seguido de n endereços absolutos, que a v1 não atualizava — 575 ponteiros errados em 35 arquivos.

Além disso a v2 conserta: caixas de diálogo tortas; texto cortado no meio da frase; 220 pedaços de frase que apareciam em inglês na tela; o japonês que sobrava em duas falas; e 22 textos do EBOOT nunca traduzidos, incluindo falas de personagem morrendo.

Nada cresce, e isso é verificado

Nenhum arquivo muda de tamanho. Fora das frases de texto, a imagem é idêntica à original. Isso não é afirmação de projeto — é conferido por nove provas que comparam a ISO gerada contra a original byte a byte. Rode todas com tools/provar_tudo.sh:

prova o que garante
0 diff global: todo byte diferente cai numa região declarada
1 nenhum arquivo editado mudou de tamanho; nenhum byte fora do texto mudou
2 as tabelas de ponteiro de string resolvem para a frase certa
3 o conteúdo escrito em cada frase é sequência válida com terminador
4 no EBOOT, nenhum byte fora das entradas de texto mudou
5 nenhuma célula-host de acento aparece no texto original
6 todo caractere gravado tem glifo desenhado na fonte
7 os bytes de controle dentro das frases estão na mesma ordem e quantidade — 9.187 ocorrências do 0x3B, uma a uma
8 o texto inglês original, passado de volta pelo mesmo gravador, reproduz a imagem original sem alterar um byte fora das frases
9 nenhuma linha é mais larga que a maior linha que o próprio jogo já usa

A prova 8 é a mais forte: ela demonstra que o gravador estruturalmente não alcança nada além de texto. As provas 6, 7 e 9 nasceram de defeitos que só apareceram porque foram medidos — a 7 achou 189 bytes de controle sendo perdidos.

O preço: o texto tem que caber

Como nada cresce, cada frase só dispõe dos bytes que a frase inglesa ocupava, a 2 bytes por caractere (Shift-JIS). Resultado medido:

  • 24.310 das 37.048 entradas (65%) carregam a tradução base integral
  • fidelidade de caracteres contra a tradução base: 91,2%
  • cerca de 950 frases ficaram sem o ponto final, por falta de 2 bytes

O montador escolhe, entre a reescrita à mão e cada degrau das regras automáticas, a versão que preserva mais — pontuação final e primeira palavra da frase valem mais que tamanho.


Como foi feito

As ferramentas usadas estão em tools/. Não são um pacote polido — é o ferramental que o projeto precisou, e está aqui porque pode servir para outros jogos da Sting no PSP, que compartilham formatos.

ferramenta o que faz
listar_dar.py, extrair.py leitura do container .dar
mapear_texto.py localiza o texto e a tabela de ponteiros
criar_sessoes.py, aplicar_sessao.py divide em sessões traduzíveis e reinsere
eboot_gungnir.py decriptação e reinserção no EBOOT
fonte_gungnir.py decodifica/recodifica os .tpl (fontes, 4bpp swizzled)
acentos_gungnir.py, desenhar_acentos_gungnir.py desenha os glifos acentuados
calib_largura.py casa a largura dos novos glifos com a tabela do jogo
repack_gungnir.py, reinserir_gungnir.py remonta o .dar e a ISO
emprestar.py grava o texto sem o arquivo mudar de tamanho; preserva os bytes de controle
montar_seguro.py escolhe, por frase, a versão mais fiel que cabe no orçamento de bytes
encurtar_gungnir.py, aplicar_curto.py escada de regras de encurtamento, da menos à mais agressiva
provar_tudo.sh + provar*.py as nove provas: compara a ISO gerada contra a original
bps.py gera e aplica o patch BPS

Notas técnicas de formato em docs/gungnir_mapa.md.

Três problemas que custaram caro

Acentos com largura errada. Desenhar o glifo não basta: o jogo tem uma tabela de largura por caractere, e um á com largura de a sai colado no vizinho. O calib_largura.py existe por isso.

Crash de ponteiro. Texto em português é mais longo que em inglês, e a reinserção ingênua estourava um limite e travava o jogo. Corrigido no reinseridor.

Saltos absolutos no bytecode. O mais caro dos três, e o que gerou a v2. Está explicado em o que mudou da v1 para a v2. A lição: antes de mexer no texto para caber numa restrição, vale conferir se a restrição é real — aqui a saída não era encurtar a tradução, era não deixar o arquivo mudar de tamanho.


Reportando problemas

Erro de tradução, texto cortado ou travamento: abra uma issue com print e onde aconteceu. Esse tipo de coisa só aparece jogando, e eu não zerei o jogo inteiro.

Apoiar

A tradução é gratuita e continua sendo. Se ela te serviu e você quiser contribuir com algo, aceito Pix:

031ce91d-e33b-48b6-84c5-1930edd381c5

Sem obrigação nenhuma. Reportar um erro que você encontrou jogando ajuda tanto quanto.

Licença e escopo

As ferramentas em tools/ são livres — use como quiser.

A tradução é trabalho derivado do jogo original, feita sem fins lucrativos e distribuída como patch justamente para não distribuir o jogo. Não vendo, não peça ISO, e não use isso comercialmente.

Gungnir é propriedade da Sting e da Atlus.

About

Tradução completa para português do RPG de PSP Gungnir (Sting/Atlus), que nunca saiu do Japão em PT-BR: 17.550 strings, na ISO e no EBOOT. Testado em PSP real.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages