Hacer un port del código fuente de Forgotten Saga (RPG coreano para DOS de 1997)
Motivación
- Hace 30 años, cuando estaba en primaria, el primer juego en caja que compré fue Forgotten Saga
- Fue el primer RPG de mi vida, así que naturalmente me enganché a fondo
- Después de más de 20 años de tenerlo olvidado, me enteré de que mucha gente aún lo sigue jugando
- "¿No sería posible convertir esto en un juego multiplataforma?"
- Lo único que quedaba era el ejecutable PE32 de 1997 + los archivos de datos (obviamente, no había código fuente)
Enfoque
- A grandes rasgos, hay dos formas de recrear el juego original
- Reinterpretación basada en especificaciones — volver a hacerlo viendo el gameplay para que se parezca
- Restauración fiel a nivel de funciones originales — portar tal cual el código decompilado
- Elegí la segunda. Quería seguir el comportamiento original verificado, no hacer suposiciones
- El original era Windows MSVC de 1997
Qué analicé
Decompilación del binario original
- Procesé el PE32 con Ghidra 12. Logré decompilar con éxito el 100% de 937 funciones
- 51,799 líneas de pseudocódigo en C
Ingeniería inversa del formato de datos (48 tipos, todos verificados)
- LZSS — estándar + variante FAM (ring init
0x00, distinta disposición de bits en ref_offset)
- SPB — 256 colores + RLE, 1,155 imágenes
- MOB — 2,699 frames de animación de personajes/NPC. header
0xA4 + píxeles RLE + frame stride de 20B
- SCP — VM de bytecode, 128+ opcodes, 6,026 entradas, 43,036 líneas de diálogo
- FAM — 292 mapas, 5 capas (base / overlay / collision / ...)
- DAT — CHAR / ITEM 290 tipos / MAGIC / ABILITY / MONSTER
- SAV — struct de actor
0x2A4 (676B), party + inventario + variables globales
Verificación directa mediante entradas de usuario
- Parseé directamente los archivos de guardado para verificar los offsets de la struct de actor
- Corregí mapeos erróneos anteriores (
0x3C ATK→STR, 0x40 INT→TLT, etc.)
Qué construí
- 263 archivos Lua, 157,277 líneas
- 3,760 assets
- Build de escritorio con LÖVE 2D 11.5 + build web con love.js (emscripten)
- Implementación directa de joystick virtual para móvil + IME coreano
- Activación de SharedArrayBuffer (COOP/COEP via coi-serviceworker)
- Persistencia de saves en IndexedDB (entorno de navegador)
- 5 canales de distribución — Web / iOS / Android / Windows / macOS
Alcance de la reproducción
- Título / creación de personaje / campo / diálogos / tienda / inventario / equipamiento / trampas / DETECT·UNLOCK / guardado — completado
- Sistema de combate — en progreso
Uso de herramientas de IA
- Principalmente la función
/goal de GPT 5.5, con Claude Code como apoyo + debug en tiempo real
Rol de GPT 5.5 /goal — análisis de decompilación / acumulación de correcciones
- Análisis automatizado de clusters de funciones originales / call graph / referencia de opcodes
- Deep dive en formatos de datos (formato sav, offset de actor, estructura FAM, etc.)
- Acumulación de correcciones de etiquetas erróneas en la decodificación automática inicial (versión corregida de 51,799 líneas)
Rol de Claude Code — port a Lua + ciclo de verificación inmediata
- Lectura de funciones originales → port a Lua → ejecución de tests con
verify.sh (100+ modos de prueba, 1,000+ assertions)
- Debug del entorno de navegador (IDBFS / IME / SharedArrayBuffer, etc.)
- Al recibir reportes de usuarios: debug → fix → despliegue dev → verificación → despliegue live
Tiempo de trabajo
- Aproximadamente de 1 a 3 meses
Qué tipo de resultado es
- Jugar (navegador): https://forgottensaga-classic.blogspot.com/2026/05/…
- Funciona tanto en PC como en móvil. En móvil se implementó directamente joystick virtual + IME coreano
- Reproducción fiel del gameplay original — ordenamiento Z, ciclo de paleta, máquina de estados de NPC, VM SCP, etc., con comportamiento original 1:1
Aún no hay comentarios.