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 quando estava no ensino fundamental foi Forgotten Saga
- Meu primeiro RPG na vida, e naturalmente mergulhei fundo nele
- Depois de mais de 20 anos sem pensar nisso, 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 (claro, sem o código-fonte)
Abordagem
- Há, em linhas gerais, duas formas de recriar o jogo original
- Reinterpretação com base na especificação — observar a jogabilidade e recriar algo parecido
- Restauração fiel em nível de função do original — portar diretamente o código decompilado
- Escolhi a segunda. O objetivo era seguir o comportamento original validado, não suposições
- O original foi feito em Windows MSVC em 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 reversa dos formatos de dados (48 tipos, todos validados)
- LZSS — padrão + variante FAM (inicialização do ring em
0x00, distribuição de bits de ref_offset diferente)
- SPB — 256 cores + RLE, 1.155 imagens
- MOB — 2.699 frames de animação de personagens/NPCs. cabeçalho
0xA4 + pixel RLE + frame stride de 20B
- SCP — VM de bytecode, 128+ opcodes, 6.026 entradas, 43.036 falas
- FAM — 292 mapas, 5 camadas (base / overlay / collision / ...)
- DAT — CHAR / ITEM 290 tipos / MAGIC / ABILITY / MONSTER
- SAV — struct de actor
0x2A4 (676B), party + inventory + global vars
Validação direta com entrada do usuário
- Parse manual de save files para validar 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 própria 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 recriação
- Tela de título / criação de personagem / campo / diálogo / loja / inventário / equipamento / armadilhas / DETECT·UNLOCK / save — concluído
- Sistema de combate — em andamento
Uso de ferramentas de IA
- Foco principal no recurso
/goal do GPT 5.5, com Claude Code como apoio + debug em tempo real
Papel do /goal do GPT 5.5 — análise de decompilação / acúmulo de correções
- Análise automatizada de clusters de funções originais / 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 do decode automático inicial (versão corrigida de 51.799 linhas)
Papel do Claude Code — port para Lua + ciclo de validação imediata
- Ler a função original → portar para Lua → executar testes em
verify.sh (100+ modos de teste, 1.000+ assertions)
- Debug no ambiente de navegador (IDBFS / IME / SharedArrayBuffer etc.)
- Ao receber relatos de usuários: debug → correção → deploy dev → validação → deploy live
Período de trabalho
Que tipo de resultado é esse
- Jogar (navegador): https://forgottensaga-classic.blogspot.com/2026/05/…
- Funciona tanto em PC quanto em mobile. No mobile, há joystick virtual + implementação própria de IME coreano
- Reprodução fiel da jogabilidade original — ordenação Z, ciclo de paleta, máquina de estados de NPC, SCP VM e outros comportamentos originais em equivalência 1:1
Ainda não há comentários.