30 yıl önceki bir RPG'nin (Forgotten Saga) kaynak portunu yapmak
(forgottensaga-classic.blogspot.com)Forgotten Saga'yı (1997 Kore DOS RPG'si) kaynak portuyla taşımak
Motivasyon
- 30 yıl önce, ilkokuldayken ilk satın aldığım kutulu oyun Forgotten Saga'ydı
- Hayatımdaki ilk RPG'ydi ve doğal olarak ona derinden bağlandım
- 20 yılı aşkın süre unutup yaşadıktan sonra hâlâ çok sayıda insanın oynadığını öğrendim
- "Bunu çoklu platformda çalışan bir oyuna dönüştüremez miyim?"
- Elde kalan tek şey 1997 tarihli PE32 çalıştırılabilir dosyası ve veri dosyalarıydı (doğal olarak kaynak kod yoktu)
Yaklaşım
- Orijinal oyunu yeniden üretmenin genel olarak iki yolu vardı
- Spesifikasyona dayalı yeniden yorumlama — oynanışı izleyip benzerini yeniden yapmak
- Orijinal fonksiyon düzeyinde sadık yeniden kurulum — decompile edilmiş kodu olduğu gibi portlamak
- İkincisini seçtim. Tahminlere değil, doğrulanmış orijinal davranışa uymak için
- Orijinal sürüm 1997 Windows MSVC ile yapılmıştı
Analiz edilenler
Orijinal binary'nin decompile edilmesi
- PE32, Ghidra 12 ile işlendi. 937 fonksiyonun tamamı %100 başarıyla decompile edildi
- 51.799 satır pseudocode C
Veri formatlarının çözülmesi (48 tür, tamamı doğrulandı)
- LZSS — standart + FAM varyantı (
0x00ring init, farklıref_offsetbit yerleşimi) - SPB — 256 renk + RLE, 1.155 görsel
- MOB — karakter/NPC animasyonları, 2.699 kare.
0xA4header + RLE pixel + 20B frame stride - SCP — bytecode VM, 128+ opcode, 6.026 entry, 43.036 diyalog satırı
- FAM — 292 harita, 5 katman (base / overlay / collision / ...)
- DAT — CHAR / ITEM 290 tür / MAGIC / ABILITY / MONSTER
- SAV — actor struct
0x2A4(676B), party + inventory + global değişkenler
Kullanıcı girdisinin doğrudan doğrulanması
- Save dosyalarını doğrudan parse ederek actor struct offset'lerini doğruladım
- Önceki hatalı eşleştirmeler (
0x3CATK→STR,0x40INT→TLT vb.) düzeltildi
Ortaya çıkarılanlar
- 263 Lua dosyası, 157.277 satır
- 3.760 asset
- LÖVE 2D 11.5 masaüstü build'i + love.js (emscripten) web build'i
- Mobil sanal joystick + Korece IME doğrudan uygulandı
- SharedArrayBuffer etkinleştirildi (coi-serviceworker üzerinden COOP/COEP)
- IndexedDB save kalıcılığı (tarayıcı ortamı)
- 5 dağıtım kanalı — Web / iOS / Android / Windows / macOS
Yeniden üretim kapsamı
- Başlık / karakter oluşturma / saha / diyalog / mağaza / envanter / ekipman / tuzak / DETECT·UNLOCK / save — tamamlandı
- Savaş sistemi — sürüyor
Yapay zeka araçlarının kullanımı
- Ağırlıklı olarak GPT 5.5'in
/goalözelliği, Claude Code ise yardımcı + gerçek zamanlı debug için kullanıldı
GPT 5.5 /goal rolü — decompile analizi / birikimli düzeltmeler
- Orijinal fonksiyon cluster'ları / call graph / opcode reference için otomatik analiz
- Veri formatlarında derin inceleme (save formatı, actor offset'leri, FAM yapısı vb.)
- İlk otomatik decode çıktısındaki mislabel düzeltmelerinin biriktirilmesi (51.799 satırlık düzeltilmiş sürüm)
Claude Code'un rolü — Lua portlama + anında doğrulama döngüsü
- Orijinal fonksiyonu okuma → Lua'ya portlama →
verify.shtesti çalıştırma (100+ test modu, 1.000+ assertion) - Tarayıcı ortamında debug (IDBFS / IME / SharedArrayBuffer vb.)
- Kullanıcı raporu gelince debug → düzeltme → dev dağıtımı → doğrulama → canlı dağıtım döngüsü
Çalışma süresi
- Yaklaşık 1~3 ay
Nasıl bir sonuç ortaya çıktı
- Oyna (tarayıcı): https://forgottensaga-classic.blogspot.com/2026/05/…
- Hem PC hem mobilde çalışıyor. Mobilde sanal joystick + Korece IME özel olarak uygulandı
- Orijinal oynanışa sadık yeniden üretim — Z sıralaması, palet döngüsü, NPC durum makinesi, SCP VM gibi orijinal davranışlar 1:1
24 yorum
Ben ortaokuldayken, o zamanlar pek yaygın olmayan bir "ön sipariş" veren bir arkadaş vardı; Forgotten Saga çıkış tarihini sürekli tutturamayınca bana durmadan dert yanardı, o çocuk aklıma geldi. hahaha
Yaklaşık 2 yıl kadar? Gecikmişti haha
Nostalji taşıyor. Harika projeyi destekliyorum!
Teşekkürler, romantizmi bulmak pek kolay değilmiş :)
İsim girilmezse otomatik olarak Hiro ve Amy olarak atanıyordu ama burada o olmuyor.
Baştan sona bug dolu bir oyundu; porta aktarırken bug'ları da aslına sadık kalarak mı taşıdığınızı merak ediyorum.
Hatta muhtemelen daha da fazla bug olacaktır.. Yavaş yavaş iyileştirmeye çalışacağım.
Harika.. vay be
Teşekkürler💪🏻
Ben de bu aralar ilkokul zamanlarımda keyifle oynadığım klasik bir oyunu web’e port etmek istiyordum, tam da böyle bir yazı çıkmış. Bu motivasyonun ya da yapılan analizlerin anlatıldığı yazıların nereden alınıp GeekNews’te göründüğünü merak ediyorum.
Haha, çünkü onu ben yükledim.
https://github.com/NAMYUNWOO/forgottensaga_classic
Repo burada
❤️Teşekkürler
İsmi yanlış girdim; bunu nasıl silebilirim? Esc sanal düğmesi çalışmıyor, klavyedeki Backspace de çalışmıyor. Heyecanlandım doğrusu.
Teşekkür ederim üzgünüm
Backspace’in çalışmama hatasını çözdüm ama tam ekranda
esctuşuna basınca tam ekranın kapanması sorunu üzerinde hâlâ çalışıyorum..Harikasınız!
Haha, küçük bir hayranlık sadece..
Gerçekten harikasınız!
Çok abartıyorsunuz haha 😂
Vay canına, gerçekten inanılmaz.
Teşekkürler~~👍🏻👍🏻
Vay be, gerçekten aşırı iyiymiş
Teşekkür ederim, adım adım tamamlanmışlık düzeyini yükselteceğim.
Teşekkür ederim. Teşekkür ederim. Destekliyorum.
Destek verdiğiniz için teşekkürler!