50 puntos por namyunwoo 2026-05-17 | 24 comentarios | Compartir por WhatsApp

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 en ref_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 (0x3C ATK→STR, 0x40 INT→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 /goal de 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

 
chinnotching 2026-05-22

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

 
namyunwoo 2026-05-22

Se retrasó como unos 2 años, ¿no? jaja

 
benjamin 2026-05-20

Qué nostalgia tan increíble. ¡Apoyo este gran proyecto!

 
namyunwoo 2026-05-22

Gracias, encontrar ese romanticismo no es nada fácil.

 
chcv0313 2026-05-19

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.

 
namyunwoo 2026-05-19

Incluso probablemente tendrá más errores... Iré mejorándolo poco a poco.

 
shakespeares 2026-05-18

Está genial... wow

 
namyunwoo 2026-05-22

Gracias 💪🏻

 
zz5414 2026-05-18

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.

 
namyunwoo 2026-05-22

Jaja, porque yo lo subí.

 
xguru 2026-05-18

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í.

 
namyunwoo 2026-05-22

❤️Gracias

 
gafani 2026-05-18

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.

 
namyunwoo 2026-05-19

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..

 
sam1287 2026-05-18

¡Excelente trabajo!

 
namyunwoo 2026-05-22

jaja, es solo un pequeño cariño de fan..

 
teipub 2026-05-18

¡Impresionante!

 
namyunwoo 2026-05-22

Me halagas demasiado jaja 😂

 
ifmkl 2026-05-18

Wow, de verdad es impresionante.

 
namyunwoo 2026-05-22

¡Gracias~~👍🏻👍🏻

 
kaydash 2026-05-18

Wow, de verdad estuvo brutal.

 
namyunwoo 2026-05-22

Gracias, iré mejorando la calidad poco a poco.

 
mssmss 2026-05-17

Gracias. Gracias. Los apoyo.

 
namyunwoo 2026-05-22

¡Gracias por el apoyo!