พอร์ตซอร์สของ Forgotten Saga (เกม RPG DOS เกาหลีปี 1997)
แรงจูงใจ
- เมื่อ 30 ปีก่อน เกมแพ็กเกจเกมแรกที่ซื้อเองตอนประถมคือ Forgotten Saga
- เป็น RPG เกมแรกในชีวิต เลยอินลึกไปโดยธรรมชาติ
- ใช้ชีวิตลืมมันไปนานกว่า 20 ปี ก่อนจะมารู้ว่าจนถึงตอนนี้ก็ยังมีคนเล่นกันเยอะ
- "จะทำให้เกมนี้เป็นเกมหลายแพลตฟอร์มได้ไหม?"
- สิ่งที่เหลืออยู่มีแค่ไฟล์รัน
PE32 ของปี 1997 กับไฟล์ข้อมูลเท่านั้น (แน่นอนว่าไม่มีซอร์สโค้ด)
แนวทาง
- วิธีสร้างเกมต้นฉบับกลับมานั้นใหญ่ ๆ มีสองแบบ
- ตีความใหม่ตามสเปก — ดูเกมเพลย์แล้วสร้างขึ้นมาใหม่ให้คล้าย
- ฟื้นคืนต้นฉบับอย่างซื่อสัตย์ในระดับฟังก์ชัน — พอร์ตโค้ดที่ decompile ออกมาโดยตรง
- เลือกแบบหลัง เพื่อยึดตามพฤติกรรมต้นฉบับที่ตรวจสอบได้จริง ไม่ใช่การคาดเดา
- ต้นฉบับคือ Windows MSVC ปี 1997
สิ่งที่วิเคราะห์
decompile binary ต้นฉบับ
- ใช้ Ghidra 12 จัดการ
PE32 decompile สำเร็จ 100% ทั้ง 937 ฟังก์ชัน
- pseudocode C จำนวน 51,799 บรรทัด
แกะฟอร์แมตข้อมูล (48 ชนิด ตรวจสอบครบทั้งหมด)
- LZSS — มาตรฐาน + ตัวแปรแบบ FAM (ring init
0x00, การจัดวางบิตของ ref_offset ต่างออกไป)
- SPB — 256 สี + RLE, ภาพ 1,155 ภาพ
- MOB — แอนิเมชันตัวละคร/NPC 2,699 เฟรม
0xA4 header + RLE pixel + frame stride 20B
- SCP — bytecode VM, 128+ opcode, 6,026 entry, บทสนทนา 43,036 รายการ
- FAM — แผนที่ 292 แผนที่, 5 layer (base / overlay / collision / ...)
- DAT — CHAR / ITEM 290 ชนิด / MAGIC / ABILITY / MONSTER
- SAV — actor struct
0x2A4 (676B), party + inventory + global vars
ตรวจสอบอินพุตผู้ใช้โดยตรง
- parse ไฟล์เซฟโดยตรงเพื่อตรวจสอบ offset ของ actor struct
- แก้การแมปที่เคยผิดก่อนหน้า (
0x3C ATK→STR, 0x40 INT→TLT เป็นต้น)
สิ่งที่สร้างขึ้น
- Lua 263 ไฟล์, 157,277 บรรทัด
- แอสเซ็ต 3,760 รายการ
- เดสก์ท็อปบิลด์ด้วย LÖVE 2D 11.5 + เว็บบิลด์ด้วย love.js (emscripten)
- ทำ virtual joystick บนมือถือ + Korean IME ขึ้นมาเอง
- เปิดใช้งาน SharedArrayBuffer (COOP/COEP ผ่าน
coi-serviceworker)
- ทำ persistence ของ sav ด้วย IndexedDB (สภาพแวดล้อมเบราว์เซอร์)
- ช่องทางแจกจ่าย 5 แบบ — Web / iOS / Android / Windows / macOS
ขอบเขตการถอดแบบ
- ไตเติล / สร้างตัวละคร / ฟิลด์ / บทสนทนา / ร้านค้า / inventory / อุปกรณ์ / กับดัก / DETECT·UNLOCK / เซฟ — เสร็จแล้ว
- ระบบต่อสู้ — กำลังดำเนินการ
การใช้เครื่องมือ AI
- ใช้ ฟีเจอร์
/goal ของ GPT 5.5 เป็นหลัก ส่วน Claude Code เป็นตัวช่วย + debug แบบเรียลไทม์
บทบาทของ GPT 5.5 /goal — วิเคราะห์ decompile / สะสมการแก้ไข
- วิเคราะห์อัตโนมัติของ cluster ฟังก์ชันต้นฉบับ / call graph / opcode reference
- deep dive ฟอร์แมตข้อมูล (เช่น sav format, actor offset, โครงสร้าง FAM)
- สะสมการแก้ mislabel ของผล decode อัตโนมัติช่วงแรก (ฉบับแก้แล้ว 51,799 บรรทัด)
บทบาทของ Claude Code — พอร์ตเป็น Lua + วงจรตรวจสอบทันที
- อ่านฟังก์ชันต้นฉบับ → พอร์ตเป็น Lua → รันเทสต์
verify.sh (100+ test mode, 1,000+ assertion)
- debug สภาพแวดล้อมเบราว์เซอร์ (IDBFS / IME / SharedArrayBuffer เป็นต้น)
- เมื่อได้รับรายงานจากผู้ใช้ จะวนรอบ debug → fix → deploy dev → verify → deploy live
ระยะเวลาทำงาน
เป็นผลงานแบบไหน
- Play (browser): https://forgottensaga-classic.blogspot.com/2026/05/…
- ใช้งานได้ทั้ง PC และมือถือ โดยมือถือมี virtual joystick + Korean IME ที่ทำขึ้นเอง
- ถอดแบบเกมเพลย์ต้นฉบับอย่างซื่อสัตย์ — ทั้ง Z sorting, palette cycle, state machine ของ NPC, SCP VM และพฤติกรรมต้นฉบับแบบ 1:1
ยังไม่มีความคิดเห็น