Hacer un port del código de un RPG de hace 30 años (Forgotten Saga)
(forgottensaga-classic.blogspot.com)Hacer un port del código de Forgotten Saga (RPG coreano para DOS de 1997)
Motivación
- Hace 30 años, cuando estaba en primaria, el primer juego de caja que compré fue Forgotten Saga
- Fue mi primer RPG y naturalmente me enganché a fondo
- Después de más de 20 años de tenerlo olvidado, descubrí que mucha gente aún lo sigue jugando
- “¿No se podrá convertir esto en un juego multiplataforma?”
- Lo único que queda es el ejecutable PE32 de 1997 + archivos de datos (por supuesto, no existe el código fuente)
Enfoque
- Hay dos formas principales de recrear el juego original
- Reinterpretación basada en especificaciones — volver a hacerlo de forma parecida viendo el gameplay
- Restauración fiel por función del original — portar tal cual el código decompilado
- Elegí la segunda. Quería seguir el comportamiento original verificado, no suposiciones
- El original fue hecho en Windows MSVC de 1997
Lo que analicé
Decompilación del binario original
- Procesé el PE32 con Ghidra 12. Éxito del 100% al decompilar 937 funciones
- 51,799 líneas de pseudocódigo en C
Ingeniería del formato de datos (48 tipos, todos verificados)
- LZSS — estándar + variante FAM (ring init
0x00, distinta disposición de bits enref_offset) - SPB — 256 colores + RLE, 1,155 imágenes
- MOB — animación de personajes/NPC, 2,699 frames. 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 de entradas del usuario
- Parseé directamente los archivos de guardado para verificar los offsets del struct de actor
- Corregí mapeos erróneos previos (
0x3CATK→STR,0x40INT→TLT, etc.)
Lo que 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 propia de joystick virtual móvil + IME coreano
- Activación de SharedArrayBuffer (COOP/COEP vía coi-serviceworker)
- Persistencia de saves con 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 / equipo / trampas / DETECT·UNLOCK / guardado — completado
- Sistema de combate — en progreso
Uso de herramientas de IA
- Principalmente la función
/goalde GPT 5.5, con Claude Code como apoyo + depuración 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 / referencias de opcode
- Deep dive de formatos de datos (formato sav, offsets de actor, estructura FAM, etc.)
- Acumulación de correcciones de etiquetas erróneas del decodificado automático inicial (versión corregida de 51,799 líneas)
Rol de Claude Code — port a Lua + ciclo de validación inmediata
- Leer funciones originales → portarlas a Lua → ejecutar tests con
verify.sh(100+ modos de prueba, 1,000+ assertions) - Depuración en entorno de navegador (IDBFS / IME / SharedArrayBuffer, etc.)
- Al recibir reportes de usuarios: depuración → fix → despliegue dev → validación → despliegue live
Tiempo de trabajo
- Aproximadamente 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 incluye joystick virtual + implementación propia de IME coreano
- Reproducción fiel del gameplay original — comportamiento 1:1 del original en orden Z, ciclo de paleta, máquina de estados de NPC, VM SCP, etc.
24 comentarios
Recuerdo a un amigo que, cuando yo estaba en secundaria, hizo una "compra anticipada", algo poco común en esa época, y no dejaba de quejarse conmigo porque Forgotten Saga seguía sin cumplir la fecha de lanzamiento. jaja
Se retrasó como unos 2 años, ¿no? jaja
Qué nostalgia tan increíble. ¡Apoyo este gran proyecto!
Gracias, encontrar ese romanticismo no es nada fácil.
Si no ponías un nombre, se asignaba automáticamente como Hiro y Amy, pero parece que eso ya no funciona.
Era un juego lleno de bugs, así que me da curiosidad si al portearlo también reprodujiste fielmente hasta los bugs.
Incluso probablemente tendrá más errores... Iré mejorándolo poco a poco.
Está genial... wow
Gracias 💪🏻
Yo también últimamente he querido portar a la web un juego clásico que disfruté mucho en la primaria, y justo aparece una publicación como esta. Me da curiosidad de dónde sacan los textos sobre la motivación o el análisis para que aparezcan en GeekNews.
Jaja, porque yo lo subí.
Portear el código fuente de un RPG de hace 30 años (Forgotten Saga)
https://github.com/NAMYUNWOO/forgottensaga_classic
El repo está aquí.
❤️Gracias
Puse mal el nombre, ¿cómo puedo borrarlo? El botón virtual de Esc no funciona y la tecla de retroceso del teclado tampoco. Estoy con los nervios de punta.
Gracias, qué pena.
Ya resolví el bug de que no funcionaba la tecla Backspace. Pero el problema de que al presionar Esc en pantalla completa se salga del modo de pantalla completa todavía lo estoy resolviendo..
¡Excelente trabajo!
jaja, es solo un pequeño cariño de fan..
¡Impresionante!
Me halagas demasiado jaja 😂
Wow, de verdad es impresionante.
¡Gracias~~👍🏻👍🏻
Wow, de verdad estuvo brutal.
Gracias, iré mejorando la calidad poco a poco.
Gracias. Gracias. Los apoyo.
¡Gracias por el apoyo!