Por que isso ainda não existia?
- A série de aventura point-and-click The Legend of Kyrandia, lançada há 35 anos. Dentro da série, apenas o segundo jogo, Hand of Fate, nunca havia sido localizado para coreano
- Entre os engines implementados no ScummVM, no caso do SCUMM da Lucas ou do SCI da Sierra existem vários jogos com localização fan-made para coreano, mas no engine Kyra da Westwood quase não há traduções de fãs
- Formato binário próprio, renderização de fonte considerando apenas 1 byte, ausência de todas as fontes necessárias
- Para localizar para coreano, não bastava apenas extrair e traduzir: foi necessário modificar os códigos de renderização de texto do engine Kyra no ScummVM
Tradução
- A tradução em si não foi muito difícil; os scripts extraídos foram passados para um LLM para serem traduzidos
- Foi usado apenas um prompt simples para manter o tom do jogo, e no geral o resultado não pareceu ter grandes problemas
- Partes mais sutis, como trocadilhos e jogos de linguagem, aparentemente não são traduzidas tão bem
Engenharia reversa
- Os formatos proprietários de jogo da Westwood: PAK (pacote), EMC (script de cena), DLG (diálogo), ENG (texto de UI)
- Cada formato foi alvo de engenharia reversa e virou uma ferramenta em Python
- EMC -> KMC, DLG -> DLK, ENG -> KOR, com cada um sendo traduzido e salvo em
OTHER.PAK
- O código do ScummVM foi modificado para que, no caso da tradução de fãs, os arquivos traduzidos fossem carregados de
OTHER.PAK
- Sem dependências externas, tudo passa a ser compilado com uma única linha,
$ python tools/build_korean.py, gerando um arquivo .zip; depois basta sobrescrever os arquivos do jogo original
Fonte
- Por padrão não havia fonte coreana, então foi preciso conseguir uma
- Havia uma fonte coreana do jogo clássico lançado oficialmente na Coreia, "The Dig", que já estava guardada
- Como a estrutura da fonte era um pouco diferente, o cabeçalho foi removido
- Foi adicionado um renderizador de fonte coreana ao ScummVM
- Felizmente, o sistema de fontes para fan translation em chinês já tinha carregamento de bitmap, renderização 1bpp, contorno e até combinação de 1 byte + 2 bytes (
MultiSubsetFont)
- Também existia em Kyrandia 1 um sistema de fonte coreana por composição, então a lógica para leitura de 2 bytes já estava presente
- Só foi necessário adicionar a lógica que converte pares de bytes de EUC-KR em índices de glifo
- Havia a ideia de aproveitar a fonte japonesa da versão FM-Towns, mas a solução acabou sendo mais simples
Guerra contra bugs
- Bug do "gagagaga"
- A função
preprocessString() que ajusta falas longas à largura da tela havia sido implementada com base em fontes de 1 byte
- Um
\r entrava no meio de um caractere de 2 bytes, corrompendo todo o texto seguinte e exibindo "gagagaga"
- Ao carregar scripts de cena, havia um erro na parte que referenciava
_scriptLangExt, então o carregamento acabava caindo no japonês
- Como também não havia a fonte correspondente, o texto era exibido como "gagagaga"
- Nos dois casos, o problema vinha de
getFontOffset retornar 0 quando o caractere correspondente não existia; foi preciso corrigir isso para tudo funcionar direito
- Game data not found
- A partir da segunda execução, o jogo passava a cair de forma estranha
- O problema era que, ao encerrar o jogo, o ScummVM salvava o idioma como coreano, o que fazia a detecção falhar
- Por enquanto, a detecção fica em inglês e, se
KOREAN.FNT existir, isso é salvo em fanLang para tratamento. Esse é o jeito correto de fazer
- Bug de Chunk overread
- Quando o IFFParser do ScummVM tentava fazer parse do script de cena traduzido KMC, surgia o erro
Chunk overread
- Ao empacotar o KMC conforme o padrão IFF, foi salvo
form_size = file_size - 8, mas a Westwood gravava form_size = file_size
- Os offsets ficavam desalinhados e geravam o erro
Contribuindo para o ScummVM
- Traduções de fãs são oficialmente suportadas pelo ScummVM com o formato
FLAGS_FAN(KO_KOR, EN_ANY)
- O primeiro é a tradução de fã, o segundo é o idioma original
- Depois que o engine inicia, a troca acontece em
kyra_hof.cpp, passando a oferecer suporte real ao modo coreano e carregar os arquivos traduzidos
- O sistema de extensões de arquivo varia por idioma, e no DOS o arquivo DLG usa DLE para inglês e DLG para alemão
- Como o trabalho começou com base no FM Towns e depois passou a incluir o DOS, de repente o alemão começou a aparecer
- Se não houver KMC, o jogo usa EMC, de modo que ele continua funcionando mesmo sem toda a tradução pronta
- Foi aberto um PR; a reação não foi tão crítica quanto se temia, e só foi preciso organizar os commits
O potencial da IA
- Na prática, a maior parte disso foi feita por OpenCode e Opus / Sonnet
- O que eu fiz foi mais como um líder de projeto: incentivar, testar, depurar e dar suporte (inserir prompts)
- Eu já tinha reunido todos os materiais e talvez pudesse fazer sozinho, mas provavelmente nem saberia por onde começar
- Quase não escrevi uma única linha de código Python ou C++, e isso realmente parece engenharia com IA
- Graças a isso, acho que fiquei mais positivo em relação a coding com IA
3 comentários
Nossa, dá para sentir aquele clima nostálgico dos velhos tempos na tela do jogo;;
Parece ser um jogo como The Secret of Monkey Island. Parece divertido.
Isso mesmo. Não chega a dar para chamar de rival, mas The Legend of Kyrandia também teve uma certa popularidade graças à tradução para o coreano. rs