4 points par namyunwoo 2 시간 전 | Aucun commentaire pour le moment. | Partager sur WhatsApp

Porter le code source de Forgotten Saga (RPG DOS coréen de 1997)

Motivation

  • Il y a 30 ans, quand j’étais en primaire, le premier jeu en boîte que j’ai acheté était Forgotten Saga
  • Mon tout premier RPG, dans lequel je me suis naturellement plongé à fond
  • Après l’avoir oublié pendant plus de 20 ans, j’ai découvert que beaucoup de gens y jouent encore
  • « Et si on pouvait en faire un jeu multiplateforme ? »
  • Il ne reste que l’exécutable PE32 de 1997 et les fichiers de données (évidemment, pas de code source)

Approche

  • Il existe globalement deux grandes façons de recréer le jeu original
    • Réinterprétation basée sur les spécifications — refaire quelque chose de similaire à partir de l’observation du gameplay
    • Restauration fidèle au niveau des fonctions d’origine — porter tel quel le code décompilé
  • J’ai choisi la seconde, afin de suivre le comportement original vérifié plutôt que des suppositions
  • L’original a été développé sous Windows avec MSVC en 1997

Ce qui a été analysé

Décompilation du binaire original

  • Traitement du PE32 avec Ghidra 12. Décompilation réussie à 100 % sur 937 fonctions
  • 51 799 lignes de pseudocode C

Rétro-ingénierie des formats de données (48 types, tous vérifiés)

  • LZSS — standard + variante FAM (initialisation du ring à 0x00, disposition des bits de ref_offset différente)
  • SPB — 256 couleurs + RLE, 1 155 images
  • MOB — animations de personnages/NPC, 2 699 frames. En-tête 0xA4 + pixels RLE + stride de frame de 20B
  • SCP — VM à bytecode, plus de 128 opcodes, 6 026 entrées, 43 036 lignes de dialogue
  • FAM — 292 cartes, 5 couches (base / overlay / collision / ...)
  • DAT — CHAR / ITEM 290 types / MAGIC / ABILITY / MONSTER
  • SAV — structure actor 0x2A4 (676B), groupe + inventaire + variables globales

Vérification directe via les entrées utilisateur

  • Analyse directe des fichiers de sauvegarde pour vérifier les offsets de la structure actor
  • Correction d’un mappage erroné précédent (0x3C ATK→STR, 0x40 INT→TLT, etc.)

Ce qui a été produit

  • 263 fichiers Lua, 157 277 lignes
  • 3 760 assets
  • Build desktop LÖVE 2D 11.5 + build web love.js (emscripten)
  • Implémentation directe d’un joystick virtuel mobile + IME coréen
  • Activation de SharedArrayBuffer (COOP/COEP via coi-serviceworker)
  • Persistance des sauvegardes via IndexedDB sav (en environnement navigateur)
  • 5 canaux de distribution — Web / iOS / Android / Windows / macOS

Portée de la reproduction

  • Titre / création de personnage / terrain / dialogues / boutique / inventaire / équipement / pièges / DETECT·UNLOCK / sauvegarde — terminé
  • Système de combat — en cours

Utilisation des outils d’IA

  • Principalement la fonction /goal de GPT 5.5, avec Claude Code en soutien + debug en temps réel

Rôle de GPT 5.5 /goal — analyse de décompilation / accumulation des corrections

  • Analyse automatisée des clusters de fonctions d’origine / call graph / références d’opcodes
  • Analyse approfondie des formats de données (format sav, offsets actor, structure FAM, etc.)
  • Accumulation des corrections des mauvais labels dans la première version de décodage automatique (version corrigée de 51 799 lignes)

Rôle de Claude Code — portage Lua + cycle de validation immédiat

  • Lecture des fonctions d’origine → portage Lua → exécution des tests verify.sh (plus de 100 modes de test, plus de 1 000 assertions)
  • Debug en environnement navigateur (IDBFS / IME / SharedArrayBuffer, etc.)
  • En cas de signalement utilisateur : debug → correction → déploiement dev → validation → déploiement live

Durée du travail

  • Environ 1 à 3 mois

De quel type de résultat s’agit-il ?

  • Jouer (navigateur) : https://forgottensaga-classic.blogspot.com/2026/05/…
  • Fonctionne à la fois sur PC et mobile. Sur mobile, joystick virtuel + IME coréen implémentés sur mesure
  • Reproduction fidèle du gameplay original — tri en Z, cycle de palette, machine d’état des NPC, SCP VM, etc., avec un comportement 1:1

Aucun commentaire pour le moment.

Aucun commentaire pour le moment.