Source-Portierung eines 30 Jahre alten RPGs (Forgotten Saga)
(forgottensaga-classic.blogspot.com)Forgotten Saga (koreanisches DOS-RPG von 1997) als Source-Port portieren
Motivation
- Vor 30 Jahren war das erste Packungs-Spiel, das ich in der Grundschule gekauft habe, Forgotten Saga.
- Mein erstes RPG überhaupt, und ich bin ganz natürlich tief darin versunken.
- Nachdem ich es über 20 Jahre lang vergessen hatte, habe ich erfahren, dass es noch immer viele Leute spielen.
- „Könnte man daraus nicht ein plattformübergreifendes Spiel machen?“
- Übrig geblieben sind nur die PE32-Executable von 1997 und die Datendateien (natürlich ohne Sourcecode).
Vorgehensweise
- Es gibt im Wesentlichen zwei Wege, das Originalspiel zu rekonstruieren:
- Spezifikationsbasierte Neuinterpretation — das Gameplay beobachten und etwas Ähnliches neu bauen
- Originalgetreue Rekonstruktion auf Funktionsebene — den dekompilierten Code direkt portieren
- Ich habe mich für Letzteres entschieden, um verifiziertes Originalverhalten statt Vermutungen zu übernehmen.
- Das Original basiert auf Windows MSVC von 1997.
Analysierte Inhalte
Dekompilierung des Original-Binarys
- PE32 mit Ghidra 12 verarbeitet. 937 Funktionen, 100 % erfolgreich dekompiliert
- 51.799 Zeilen pseudocodeartiges C
Reverse Engineering der Datenformate (48 Typen, alle verifiziert)
- LZSS — Standard + FAM-Variante (ring init
0x00, andere Bit-Anordnung beiref_offset) - SPB — 256 Farben + RLE, 1.155 Bilder
- MOB — Charakter-/NPC-Animationen mit 2.699 Frames.
0xA4-Header + RLE-Pixel + Frame-Stride 20B - SCP — Bytecode-VM, 128+ Opcodes, 6.026 Einträge, 43.036 Dialogzeilen
- FAM — 292 Karten, 5 Layer (base / overlay / collision / ...)
- DAT — CHAR / ITEM 290 Typen / MAGIC / ABILITY / MONSTER
- SAV — Actor-Struct
0x2A4(676B), Party + Inventar + globale Variablen
Direkte Verifikation von Benutzereingaben
- Save-Dateien direkt geparst, um die Actor-Struct-Offsets zu verifizieren
- Frühere fehlerhafte Mappings korrigiert (
0x3CATK→STR,0x40INT→TLT usw.)
Erstellte Ergebnisse
- 263 Lua-Dateien, 157.277 Zeilen
- 3.760 Assets
- Desktop-Build mit LÖVE 2D 11.5 + Web-Build mit love.js (emscripten)
- Virtuellen Joystick für Mobilgeräte + koreanisches IME selbst implementiert
- SharedArrayBuffer aktiviert (COOP/COEP via coi-serviceworker)
- Persistente SAV-Speicherung mit IndexedDB (Browser-Umgebung)
- 5 Distributionskanäle — Web / iOS / Android / Windows / macOS
Umfang der Reproduktion
- Titel / Charaktererstellung / Feld / Dialog / Shop / Inventar / Ausrüstung / Fallen / DETECT·UNLOCK / Speichern — abgeschlossen
- Kampfsystem — in Arbeit
Einsatz von AI-Tools
- Vor allem die
/goal-Funktion von GPT 5.5, Claude Code unterstützend + für Live-Debugging
Rolle von GPT 5.5 /goal — Dekompilierungsanalyse / fortlaufende Korrekturen
- Automatisierte Analyse von Original-Funktionsclustern / Call Graph / Opcode-Referenzen
- Deep Dive in Datenformate (SAV-Format, Actor-Offsets, FAM-Struktur usw.)
- Fortlaufende Korrektur von Fehlbezeichnungen in der anfänglichen automatischen Dekodierung (korrigierte Fassung mit 51.799 Zeilen)
Rolle von Claude Code — Lua-Portierung + sofortiger Verifikationszyklus
- Originalfunktion lesen → nach Lua portieren →
verify.sh-Tests ausführen (100+ Testmodi, 1.000+ Assertions) - Debugging in der Browser-Umgebung (IDBFS / IME / SharedArrayBuffer usw.)
- Bei Nutzermeldungen: debuggen → fixen → Dev-Deployment → verifizieren → Live-Deployment-Zyklus
Arbeitsdauer
- Etwa 1–3 Monate
Was für ein Ergebnis es ist
- Play (Browser): https://forgottensaga-classic.blogspot.com/2026/05/…
- Läuft sowohl auf PC als auch mobil. Auf Mobilgeräten mit eigenimplementiertem virtuellem Joystick + koreanischem IME
- Originalgetreue Reproduktion des Gameplays — Z-Sortierung, Palette Cycling, NPC-State-Machine, SCP-VM usw. mit 1:1-Originalverhalten
24 Kommentare
Ich muss daran denken, dass ich einen Freund hatte, der damals schon eine für die Zeit eher ungewöhnliche "Vorbestellung" gemacht hatte, als ich in der Mittelschule war. Weil Forgotten Saga den Veröffentlichungstermin immer wieder nicht einhielt, hat er sich ständig bei mir darüber ausgejammert. lol
Etwa 2 Jahre? War wohl aufgeschoben worden, haha.
Da kommt richtig Nostalgie auf. Ich drücke diesem großartigen Projekt die Daumen!
Danke, Romantik zu finden ist heutzutage nicht leicht.
Wenn man keinen Namen eingegeben hat, wurde automatisch Hiro Amy festgelegt, aber das geht offenbar nicht. Das Spiel war voller Bugs; ich frage mich, ob beim Portieren sogar die Bugs originalgetreu mitportiert wurden.
Es wird sogar noch mehr Bugs haben … Ich werde es nach und nach verbessern.
Großartig … wow
Vielen Dank 💪🏻
Ich möchte in letzter Zeit auch ein klassisches Spiel, das ich in der Grundschulzeit mit viel Spaß gespielt habe, fürs Web portieren, und dann taucht so ein Beitrag auf. Ich frage mich, woher die Texte über die Motivation oder die analysierten Inhalte stammen, die dann bei GeekNews erscheinen.
Haha, weil ich es gepostet habe.
https://github.com/NAMYUNWOO/forgottensaga_classic
Das Repo ist hier.
❤️Vielen Dank
Ich habe den Namen falsch eingegeben – wie kann ich ihn löschen? Der virtuelle
Esc-Button funktioniert nicht, und auch die Rücktaste auf der Tastatur reagiert nicht. Ich bin ganz aufgeregt.Vielen Dank
Ich habe den Bug behoben, dass Backspace nicht funktioniert. Das Problem, dass im Vollbildmodus beim Drücken von Esc der Vollbildmodus beendet wird, ist aber noch nicht gelöst..
Ausgezeichnet!
Hehe, nur eine kleine Fanliebe..
Großartig!
Das ist zu viel des Lobes, haha 😂
Wow, wirklich beeindruckend.
Danke~~👍🏻👍🏻
Wow, das ist wirklich verdammt großartig.
Danke, ich werde die Qualität Schritt für Schritt verbessern.
Vielen Dank. Vielen Dank. Ich unterstütze euch.
Danke für eure Unterstützung!