50 pontos por namyunwoo 2026-05-17 | 24 comentários | Compartilhar no WhatsApp

Fazendo o source port de Forgotten Saga (RPG coreano para DOS de 1997)

Motivação

  • Há 30 anos, o primeiro jogo de caixa que comprei na escola primária foi Forgotten Saga
  • Meu primeiro RPG na vida, e naturalmente mergulhei fundo nele
  • Depois de mais de 20 anos sem lembrar dele, descobri que muita gente ainda joga até hoje
  • "Será que não dá para transformar isso em um jogo multiplataforma?"
  • O que restou foi apenas o executável PE32 de 1997 + os arquivos de dados (obviamente sem código-fonte)

Abordagem

  • Existem, em linhas gerais, duas formas de reproduzir o jogo original
    • Reinterpretação baseada em especificação — refazer algo parecido observando a jogabilidade
    • Restauração fiel do original no nível de função — portar o código decompilado como ele é
  • Escolhi a segunda. A ideia era seguir o comportamento validado do original, e não suposições
  • O original foi feito em Windows MSVC de 1997

O que foi analisado

Decompilação do binário original

  • PE32 processado com Ghidra 12. Sucesso de 100% na decompilação de 937 funções
  • 51.799 linhas de pseudocódigo em C

Engenharia dos formatos de dados (48 tipos, todos verificados)

  • LZSS — padrão + variação FAM (0x00 em ring init, distribuição de bits de ref_offset diferente)
  • SPB — 256 cores + RLE, 1.155 imagens
  • MOB — 2.699 frames de animação de personagem/NPC. Header 0xA4 + pixel RLE + frame stride de 20B
  • SCP — VM de bytecode, mais de 128 opcodes, 6.026 entradas, 43.036 falas
  • FAM — 292 mapas, 5 camadas (base / overlay / collision / ...)
  • DAT — CHAR / ITEM com 290 tipos / MAGIC / ABILITY / MONSTER
  • SAV — struct de actor 0x2A4 (676B), party + inventário + variáveis globais

Verificação direta da entrada do usuário

  • Parsing direto de save files para verificar os offsets da struct de actor
  • Correção de mapeamentos errados anteriores (0x3C ATK→STR, 0x40 INT→TLT etc.)

O que foi produzido

  • 263 arquivos Lua, 157.277 linhas
  • 3.760 assets
  • Build desktop em LÖVE 2D 11.5 + build web com love.js (emscripten)
  • Implementação direta de joystick virtual para mobile + IME coreano
  • Ativação de SharedArrayBuffer (COOP/COEP via coi-serviceworker)
  • Persistência de saves em IndexedDB (ambiente de navegador)
  • 5 canais de distribuição — Web / iOS / Android / Windows / macOS

Escopo da reprodução

  • Título / criação de personagem / campo / diálogos / loja / inventário / equipamento / armadilhas / DETECT·UNLOCK / save — concluído
  • Sistema de combate — em andamento

Uso de ferramentas de IA

  • Principalmente o recurso /goal do GPT 5.5, com Claude Code como apoio + debug em tempo real

Papel do GPT 5.5 /goal — análise da decompilação / acúmulo de correções

  • Análise automatizada de clusters de funções do original / call graph / referência de opcodes
  • Deep dive nos formatos de dados (formato sav, offsets de actor, estrutura FAM etc.)
  • Acúmulo de correções de mislabels da decodificação automática inicial (versão corrigida de 51.799 linhas)

Papel do Claude Code — port para Lua + ciclo imediato de validação

  • Leitura da função original → port para Lua → execução dos testes em verify.sh (mais de 100 modos de teste, mais de 1.000 assertions)
  • Debug no ambiente de navegador (IDBFS / IME / SharedArrayBuffer etc.)
  • Ao receber relatos de usuários: debug → correção → deploy de dev → validação → deploy em produção

Período de trabalho

  • Cerca de 1 a 3 meses

Que tipo de resultado é esse

  • Play (navegador): https://forgottensaga-classic.blogspot.com/2026/05/…
  • Funciona tanto em PC quanto em mobile. No mobile, joystick virtual + implementação própria de IME coreano
  • Reprodução fiel da jogabilidade original — ordenação Z, cycle de paleta, máquina de estados dos NPCs, SCP VM e outros comportamentos do original em proporção 1:1

24 comentários

 
chinnotching 26 일 전

Eu me lembro de um amigo que, quando eu estava no ensino fundamental, fez uma "pré-compra", algo que não era comum naquela época, e ficava desabafando comigo porque Forgotten Saga não conseguia cumprir repetidamente a data de lançamento. kkk

 
namyunwoo 25 일 전

Uns 2 anos de atraso? haha

 
benjamin 27 일 전

Que nostalgia transbordando. Apoio esse projeto incrível!

 
namyunwoo 25 일 전

Obrigado, não é fácil encontrar esse tipo de romantismo hoje em dia.

 
chcv0313 29 일 전

Se não colocasse um nome, era definido automaticamente como Hiro Amy, mas isso não está funcionando.
Era um jogo cheio de bugs, então fiquei curioso para saber se, ao fazer o port, você também portou fielmente até os bugs.

 
namyunwoo 28 일 전

Talvez tenha até mais bugs.. Vou melhorando aos poucos.

 
shakespeares 2026-05-18

Que incrível.. uau

 
namyunwoo 25 일 전

Obrigado 💪🏻

 
zz5414 2026-05-18

Eu também andava querendo portar para a web um jogo clássico que me diverti muito jogando na época do ensino fundamental, e aí apareceu um post desses. Fico curioso sobre de onde vêm os textos sobre a motivação ou o conteúdo analisado para aparecerem no GeekNews.

 
namyunwoo 25 일 전

haha, fui eu que postei

 
namyunwoo 25 일 전

❤️Obrigado

 
gafani 2026-05-18

Coloquei o nome errado; como posso apagar? O botão virtual Esc não funciona, e o Backspace do teclado também não funciona. Estou nervoso aqui.

 
namyunwoo 28 일 전

Obrigado
Consegui corrigir o bug em que o Backspace não funcionava, mas ainda estou resolvendo o problema de que, ao pressionar Esc no modo de tela cheia, a tela cheia é encerrada.

 
sam1287 2026-05-18

Excelente!

 
namyunwoo 25 일 전

kkk, é só um pequeno carinho de fã..

 
teipub 2026-05-18

Impressionante!

 
namyunwoo 25 일 전

Você está sendo gentil demais haha 😂

 
ifmkl 2026-05-18

Uau, isso é realmente incrível.

 
namyunwoo 25 일 전

Obrigado~~👍🏻👍🏻

 
kaydash 2026-05-18

Nossa, isso ficou foda demais

 
namyunwoo 25 일 전

Obrigado. Vou melhorar a qualidade aos poucos.

 
mssmss 2026-05-17

Obrigado. Obrigado. Estou torcendo por você.

 
namyunwoo 25 일 전

Obrigado pelo apoio!