11 pontos por colus001 2026-03-26 | 3 comentários | Compartilhar no WhatsApp

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

 
roxie 29 일 전

Nossa, dá para sentir aquele clima nostálgico dos velhos tempos na tela do jogo;;

 
computerphilosopher 2026-03-26

Parece ser um jogo como The Secret of Monkey Island. Parece divertido.

 
colus001 2026-03-26

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