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_type0xFFA0, 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.
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 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.
| 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.