50 poin oleh namyunwoo 2026-05-17 | 24 komentar | Bagikan ke WhatsApp

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 bit ref_offset berbeda)
  • 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 (0x3C ATK→STR, 0x40 INT→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 /goal di 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

 
chinnotching 2026-05-22

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

 
namyunwoo 2026-05-22

Tertunda sekitar 2 tahun? hehe

 
benjamin 2026-05-20

Nostalgianya benar-benar terasa. Saya mendukung proyek keren ini!

 
namyunwoo 2026-05-22

Terima kasih, susah juga ya mencari romantismenya.

 
chcv0313 2026-05-19

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.

 
namyunwoo 2026-05-19

Bahkan kemungkinan bug-nya akan lebih banyak.. akan saya perbaiki sedikit demi sedikit.

 
shakespeares 2026-05-18

Keren sekali.. wow

 
namyunwoo 2026-05-22

Terima kasih 💪🏻

 
zz5414 2026-05-18

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.

 
namyunwoo 2026-05-22

Hehe, karena saya yang mengunggahnya.

 
namyunwoo 2026-05-22

❤️Terima kasih

 
gafani 2026-05-18

Saya salah memasukkan nama, bagaimana cara menghapusnya? Tombol virtual Esc tidak berfungsi dan tombol Backspace di keyboard juga tidak berfungsi. Deg-degan nih.

 
namyunwoo 2026-05-19

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

 
sam1287 2026-05-18

Luar biasa!

 
namyunwoo 2026-05-22

Hehe, cuma sedikit rasa cinta dari penggemar..

 
teipub 2026-05-18

Luar biasa!

 
namyunwoo 2026-05-22

Anda terlalu memuji, haha 😂

 
ifmkl 2026-05-18

Wah, ini benar-benar luar biasa.

 
namyunwoo 2026-05-22

Terima kasih~~👍🏻👍🏻

 
kaydash 2026-05-18

Wah, ini benar-benar keren banget

 
namyunwoo 2026-05-22

Terima kasih, saya akan pelan-pelan meningkatkan kualitas penyelesaiannya.

 
mssmss 2026-05-17

Terima kasih. Terima kasih. Semangat terus.

 
namyunwoo 2026-05-22

Terima kasih atas dukungannya!