50 points par namyunwoo 2026-05-17 | 24 commentaires | Partager sur WhatsApp

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

Motivation

  • Il y a 30 ans, le premier jeu en boîte que j’ai acheté à l’école primaire, c’était Forgotten Saga
  • Mon tout premier RPG, dans lequel je me suis naturellement plongé très profondément
  • Après l’avoir oublié pendant plus de 20 ans, j’ai découvert que beaucoup de gens y jouent encore
  • « Ne pourrait-on pas en faire un jeu multiplateforme ? »
  • Il ne restait que l’exécutable PE32 de 1997 et les fichiers de données (bien sûr, sans le code source)

Approche

  • Il y a globalement deux façons de recréer le jeu original
    • Réinterprétation basée sur les spécifications — regarder le gameplay et le recréer de manière similaire
    • Restauration fidèle au niveau des fonctions d’origine — porter tel quel le code décompilé
  • J’ai choisi la seconde, pour suivre le comportement original vérifié plutôt que des suppositions
  • L’original est un programme Windows MSVC de 1997

Ce qui a été analysé

Décompilation du binaire d’origine

  • 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 — 2 699 frames d’animation de personnages/NPC. Header 0xA4 + pixels RLE + stride de frame de 20B
  • SCP — VM de bytecode, plus de 128 opcode, 6 026 entrées, 43 036 lignes de dialogue
  • FAM — 292 cartes, 5 layers (base / overlay / collision / ...)
  • DAT — CHAR / ITEM 290 types / MAGIC / ABILITY / MONSTER
  • SAV — structure d’acteur 0x2A4 (676B), groupe + inventaire + variables globales

Vérification directe des saisies utilisateur

  • Vérification des offsets de la structure d’acteur en parsant directement les fichiers de sauvegarde
  • Correction d’anciens mappings erronés (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 dans IndexedDB (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 fonctionnalité /goal de GPT 5.5, avec Claude Code en support + 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’opcode
  • Deep dive dans les formats de données (format sav, offsets d’acteur, structure FAM, etc.)
  • Accumulation des corrections de mislabel dans la première version décodée automatiquement (51 799 lignes corrigées)

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 de l’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 il s’agit

  • Play (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, palette cycling, machine à états des NPC, SCP VM, etc., avec un comportement original reproduit à l’identique

24 commentaires

 
chinnotching 2026-05-22

Quand j’étais au collège, j’avais un ami qui avait fait une « précommande », ce qui était plutôt rare à l’époque. Ça me rappelle ce type qui n’arrêtait pas de se plaindre auprès de moi parce que la sortie de Forgotten Saga continuait à être repoussée. lol

 
namyunwoo 2026-05-22

Environ 2 ans de retard ? haha

 
benjamin 2026-05-20

Quelle bouffée de nostalgie. Je soutiens ce superbe projet !

 
namyunwoo 2026-05-22

Merci, ce n’est pas facile de retrouver cette part de romantisme.

 
chcv0313 2026-05-19

Si on ne saisissait pas de nom, c’était automatiquement défini sur Hiro et Amy, mais ça ne semble pas fonctionner ici.
C’était un jeu bourré de bugs, donc je me demande si vous avez aussi fidèlement porté les bugs en même temps que le portage.

 
namyunwoo 2026-05-19

Il y aura même probablement encore plus de bugs... Je vais essayer de l'améliorer petit à petit.

 
shakespeares 2026-05-18

Superbe... waouh

 
namyunwoo 2026-05-22

Merci 💪🏻

 
zz5414 2026-05-18

Moi aussi, ces temps-ci, j’avais envie de porter sur le web un jeu rétro auquel je m’étais beaucoup amusé à l’école primaire, donc voir passer ce genre d’article tombe à point nommé. Je me demande d’où viennent les textes sur la motivation ou le contenu de l’analyse qui se retrouvent ensuite sur GeekNews.

 
namyunwoo 2026-05-22

Haha, c’est moi qui l’ai posté.

 
namyunwoo 2026-05-22

❤️Merci

 
gafani 2026-05-18

J’ai saisi un mauvais nom, comment puis-je l’effacer ? Le bouton virtuel Esc ne fonctionne pas, et la touche Retour arrière du clavier non plus. Je suis tout excité.

 
namyunwoo 2026-05-19

Merci
J’ai corrigé le bug où la touche retour arrière ne fonctionnait pas. En revanche, je suis encore en train de résoudre le problème où appuyer sur Esc en plein écran quitte le mode plein écran..

 
sam1287 2026-05-18

C'est remarquable !

 
namyunwoo 2026-05-22

Haha, c’est juste un petit geste de fan...

 
teipub 2026-05-18

C'est impressionnant !

 
namyunwoo 2026-05-22

Vous me flattez trop haha 😂

 
ifmkl 2026-05-18

Waouh, c’est vraiment impressionnant.

 
namyunwoo 2026-05-22

Merci~~👍🏻👍🏻

 
kaydash 2026-05-18

Waouh, c’est vraiment incroyable.

 
namyunwoo 2026-05-22

Merci, je vais améliorer progressivement le niveau de finition.

 
mssmss 2026-05-17

Merci. Merci. Je vous soutiens.

 
namyunwoo 2026-05-22

Merci pour votre soutien !