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