4 pontos por namyunwoo 2 시간 전 | Ainda não há 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 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

  • Cerca de 1 a 3 meses

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.

Ainda não há comentários.