Portando o código-fonte de um RPG de 30 anos atrás (Forgotten Saga)
(forgottensaga-classic.blogspot.com)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 (
0x00emring init, distribuição de bits deref_offsetdiferente) - 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 (
0x3CATK→STR,0x40INT→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
/goaldo 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
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
Uns 2 anos de atraso? haha
Que nostalgia transbordando. Apoio esse projeto incrível!
Obrigado, não é fácil encontrar esse tipo de romantismo hoje em dia.
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.
Talvez tenha até mais bugs.. Vou melhorando aos poucos.
Que incrível.. uau
Obrigado 💪🏻
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.
haha, fui eu que postei
https://github.com/NAMYUNWOO/forgottensaga_classic
O repositório está aqui.
❤️Obrigado
Coloquei o nome errado; como posso apagar? O botão virtual
Escnão funciona, e o Backspace do teclado também não funciona. Estou nervoso aqui.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.
Excelente!
kkk, é só um pequeno carinho de fã..
Impressionante!
Você está sendo gentil demais haha 😂
Uau, isso é realmente incrível.
Obrigado~~👍🏻👍🏻
Nossa, isso ficou foda demais
Obrigado. Vou melhorar a qualidade aos poucos.
Obrigado. Obrigado. Estou torcendo por você.
Obrigado pelo apoio!