Porter le code source d’un RPG d’il y a 30 ans (Forgotten Saga)
(forgottensaga-classic.blogspot.com)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 deref_offsetdiffé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 (
0x3CATK→STR,0x40INT→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é
/goalde 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
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
Environ 2 ans de retard ? haha
Quelle bouffée de nostalgie. Je soutiens ce superbe projet !
Merci, ce n’est pas facile de retrouver cette part de romantisme.
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.
Il y aura même probablement encore plus de bugs... Je vais essayer de l'améliorer petit à petit.
Superbe... waouh
Merci 💪🏻
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.
Haha, c’est moi qui l’ai posté.
https://github.com/NAMYUNWOO/forgottensaga_classic
Le repo est ici.
❤️Merci
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é.
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
Escen plein écran quitte le mode plein écran..C'est remarquable !
Haha, c’est juste un petit geste de fan...
C'est impressionnant !
Vous me flattez trop haha 😂
Waouh, c’est vraiment impressionnant.
Merci~~👍🏻👍🏻
Waouh, c’est vraiment incroyable.
Merci, je vais améliorer progressivement le niveau de finition.
Merci. Merci. Je vous soutiens.
Merci pour votre soutien !