Mem-porting source RPG 30 tahun lalu (Forgotten Saga)
(forgottensaga-classic.blogspot.com)Melakukan source port untuk Forgotten Saga (RPG DOS Korea 1997)
Motivasi
- 30 tahun lalu, game paket pertama yang saya beli saat masih SD adalah Forgotten Saga
- RPG pertama dalam hidup saya, dan saya pun tenggelam cukup dalam secara alami
- Setelah lebih dari 20 tahun melupakannya, saya baru tahu bahwa masih banyak orang yang memainkannya
- "Apakah ini tidak bisa dijadikan game multiplatform?"
- Yang tersisa hanya file executable PE32 tahun 1997 + file data (tentu saja source code-nya tidak ada)
Pendekatan
- Secara besar, ada dua cara untuk mereproduksi game aslinya
- Reinterpretasi berbasis spesifikasi — melihat gameplay lalu membuat ulang yang mirip
- Pemulihan setia per fungsi dari versi asli — mem-porting kode hasil dekompilasi apa adanya
- Saya memilih yang kedua, agar mengikuti perilaku asli yang telah terverifikasi, bukan perkiraan
- Versi aslinya adalah Windows MSVC 1997
Hal yang dianalisis
Dekompilasi binary asli
- Memproses PE32 dengan Ghidra 12. Berhasil mendekompilasi 937 fungsi 100%
- 51.799 baris pseudocode C
Membongkar format data (48 jenis, semuanya terverifikasi)
- LZSS — standar + varian FAM (inisialisasi ring
0x00, penempatan bitref_offsetberbeda) - SPB — 256 warna + RLE, 1.155 gambar
- MOB — animasi karakter/NPC 2.699 frame. header
0xA4+ pixel RLE + frame stride 20B - SCP — VM bytecode, 128+ opcode, 6.026 entri, 43.036 dialog
- FAM — 292 peta, 5 layer (base / overlay / collision / ...)
- DAT — CHAR / ITEM 290 jenis / MAGIC / ABILITY / MONSTER
- SAV — actor struct
0x2A4(676B), party + inventory + global vars
Verifikasi langsung input pengguna
- Mem-parsing save file secara langsung untuk memverifikasi offset actor struct
- Memperbaiki pemetaan lama yang salah (
0x3CATK→STR,0x40INT→TLT, dll.)
Hal yang berhasil dibuat
- 263 file Lua, 157.277 baris
- 3.760 aset
- Build desktop LÖVE 2D 11.5 + build web love.js (emscripten)
- Implementasi langsung virtual joystick mobile + IME bahasa Korea
- Aktivasi SharedArrayBuffer (COOP/COEP via coi-serviceworker)
- Persistensi save lewat IndexedDB (lingkungan browser)
- 5 kanal distribusi — Web / iOS / Android / Windows / macOS
Cakupan reproduksi
- Title / pembuatan karakter / field / dialog / toko / inventory / equipment / trap / DETECT·UNLOCK / save — selesai
- Sistem pertarungan — sedang dikerjakan
Pemanfaatan alat AI
- Terutama memakai fitur
/goaldi GPT 5.5, sedangkan Claude Code digunakan sebagai pendamping + debug real-time
Peran GPT 5.5 /goal — analisis dekompilasi / akumulasi koreksi
- Analisis otomatis original function cluster / call graph / opcode reference
- Deep dive format data (format sav, actor offset, struktur FAM, dll.)
- Mengakumulasi koreksi terhadap mislabel pada hasil decode otomatis awal (versi koreksi 51.799 baris)
Peran Claude Code — porting Lua + siklus verifikasi instan
- Membaca fungsi asli → porting ke Lua → menjalankan test
verify.sh(100+ mode test, 1.000+ assertion) - Debug lingkungan browser (IDBFS / IME / SharedArrayBuffer, dll.)
- Saat ada laporan pengguna: debug → fix → deploy dev → verifikasi → deploy live
Periode pengerjaan
- Sekitar 1–3 bulan
Seperti apa hasilnya
- Play (browser): https://forgottensaga-classic.blogspot.com/2026/05/…
- Berjalan di PC maupun mobile. Di mobile, virtual joystick + IME bahasa Korea diimplementasikan sendiri
- Reproduksi gameplay asli yang setia — perilaku asli direproduksi 1:1, termasuk Z sorting, palette cycle, state machine NPC, SCP VM, dll.
24 komentar
Saya jadi teringat seorang teman yang saat itu, ketika saya masih SMP, melakukan "pre-order" yang waktu itu masih jarang; karena Forgotten Saga terus gagal menepati tanggal rilis, dia terus mengeluh kepada saya. wkwk
Tertunda sekitar 2 tahun? hehe
Nostalgianya benar-benar terasa. Saya mendukung proyek keren ini!
Terima kasih, susah juga ya mencari romantismenya.
Kalau nama tidak diisi, dulu otomatis disetel menjadi Hiro dan Amy, tapi itu sepertinya tidak berfungsi ya.
Gamenya dulu penuh bug, jadi saya penasaran apakah saat porting bug-bugnya juga ikut dipindahkan dengan setia.
Bahkan kemungkinan bug-nya akan lebih banyak.. akan saya perbaiki sedikit demi sedikit.
Keren sekali.. wow
Terima kasih 💪🏻
Saya juga belakangan ini ingin mem-porting game klasik yang saya mainkan dengan seru saat masih SD ke web, lalu muncul tulisan seperti ini. Saya jadi penasaran dari mana tulisan tentang motivasi atau isi analisisnya diambil hingga muncul di GeekNews.
Hehe, karena saya yang mengunggahnya.
https://github.com/NAMYUNWOO/forgottensaga_classic
Repositorinya ada di sini
❤️Terima kasih
Saya salah memasukkan nama, bagaimana cara menghapusnya? Tombol virtual Esc tidak berfungsi dan tombol Backspace di keyboard juga tidak berfungsi. Deg-degan nih.
Terima kasih
Saya sudah memperbaiki bug backspace yang tidak berfungsi. Namun, masalah saat menekan esc di mode layar penuh yang menyebabkan layar penuh tertutup masih sedang saya tangani..
Luar biasa!
Hehe, cuma sedikit rasa cinta dari penggemar..
Luar biasa!
Anda terlalu memuji, haha 😂
Wah, ini benar-benar luar biasa.
Terima kasih~~👍🏻👍🏻
Wah, ini benar-benar keren banget
Terima kasih, saya akan pelan-pelan meningkatkan kualitas penyelesaiannya.
Terima kasih. Terima kasih. Semangat terus.
Terima kasih atas dukungannya!