4 puntos por namyunwoo 2 시간 전 | Aún no hay comentarios. | Compartir por WhatsApp

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.

Aún no hay comentarios.