พอร์ตซอร์สของ RPG เมื่อ 30 ปีก่อน (Forgotten Saga)
(forgottensaga-classic.blogspot.com)พอร์ตซอร์สของ Forgotten Saga (RPG DOS เกาหลีปี 1997)
แรงจูงใจ
- เมื่อ 30 ปีก่อน เกมแพ็กเกจเกมแรกที่ซื้อเองตอนประถมคือ Forgotten Saga
- เป็น RPG เกมแรกในชีวิต เลยอินลึกไปโดยธรรมชาติ
- ใช้ชีวิตไปกว่า 20 ปีแบบลืมมันไปแล้ว ก่อนจะมารู้ว่ายังมีคนเล่นกันอยู่มาก
- "จะทำให้เกมนี้เป็นเกมหลายแพลตฟอร์มได้ไหม?"
- สิ่งที่เหลืออยู่มีเพียงไฟล์ปฏิบัติการ 1997 PE32 + ไฟล์ข้อมูลเท่านั้น (แน่นอนว่าไม่มีซอร์สโค้ด)
แนวทางการเข้าถึง
- วิธีการสร้างเกมต้นฉบับขึ้นมาใหม่มีอยู่ใหญ่ ๆ สองแบบ
- ตีความใหม่ตามสเปก — ดูเกมเพลย์แล้วสร้างใหม่ให้คล้ายกัน
- ฟื้นคืนต้นฉบับอย่างซื่อตรงในระดับฟังก์ชัน — พอร์ตโค้ดที่ decompile ออกมาโดยตรง
- เลือกแบบหลัง เพื่อให้ยึดตามพฤติกรรมต้นฉบับที่ตรวจสอบได้ ไม่ใช่การคาดเดา
- ต้นฉบับคือ Windows MSVC ปี 1997
สิ่งที่วิเคราะห์
decompile ไบนารีต้นฉบับ
- ใช้ Ghidra 12 จัดการ PE32 decompile ฟังก์ชันสำเร็จ 100% จำนวน 937 ฟังก์ชัน
- pseudocode C จำนวน 51,799 บรรทัด
แกะฟอร์แมตข้อมูล (48 ชนิด ตรวจสอบครบทั้งหมด)
- LZSS — มาตรฐาน + ดัดแปลงแบบ FAM (
0x00สำหรับ ring init, การจัดวางบิตของref_offsetต่างออกไป) - SPB — 256 สี + RLE, 1,155 ภาพ
- MOB — แอนิเมชันตัวละคร/NPC 2,699 เฟรม
0xA4header + 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
ตรวจสอบอินพุตผู้ใช้โดยตรง
- พาร์สไฟล์เซฟโดยตรงเพื่อตรวจสอบ actor struct offset
- แก้การแมปที่ผิดก่อนหน้า (
0x3CATK→STR,0x40INT→TLT เป็นต้น)
สิ่งที่สร้างขึ้น
- Lua 263 ไฟล์, 157,277 บรรทัด
- แอสเซ็ต 3,760 รายการ
- บิลด์เดสก์ท็อป LÖVE 2D 11.5 + บิลด์เว็บ love.js (emscripten)
- ทำ virtual joystick บนมือถือ + Korean IME เอง
- เปิดใช้ SharedArrayBuffer (COOP/COEP ผ่าน coi-serviceworker)
- ทำ sav persistence ด้วย IndexedDB (บนเบราว์เซอร์)
- ช่องทางแจกจ่าย 5 แบบ — Web / iOS / Android / Windows / macOS
ขอบเขตการถอดแบบ
- ไตเติล / สร้างตัวละคร / ฟิลด์ / บทสนทนา / ร้านค้า / อินเวนทอรี / อุปกรณ์ / กับดัก / DETECT·UNLOCK / เซฟ — เสร็จแล้ว
- ระบบต่อสู้ — กำลังดำเนินการ
การใช้เครื่องมือ AI
- เน้นใช้ฟีเจอร์
/goalของ GPT 5.5, ส่วน Claude Code ใช้เสริม + ดีบักแบบเรียลไทม์
บทบาทของ GPT 5.5 /goal — วิเคราะห์ decompile / สะสมการแก้ไข
- วิเคราะห์อัตโนมัติ original function cluster / call graph / opcode reference
- deep dive ฟอร์แมตข้อมูล (sav format, actor offset, โครงสร้าง FAM ฯลฯ)
- สะสมการแก้ mislabel ของผลถอดรหัสอัตโนมัติช่วงแรก (ฉบับแก้ไข 51,799 บรรทัด)
บทบาทของ Claude Code — พอร์ตเป็น Lua + วงจรตรวจสอบทันที
- อ่านฟังก์ชันต้นฉบับ → พอร์ตเป็น Lua → รันเทสต์
verify.sh(100+ test mode, 1,000+ assertion) - ดีบักสภาพแวดล้อมเบราว์เซอร์ (IDBFS / IME / SharedArrayBuffer เป็นต้น)
- เมื่อได้รับรายงานจากผู้ใช้: ดีบัก → แก้ → ปล่อย dev → ตรวจสอบ → ปล่อย live เป็นวงจร
ระยะเวลาทำงาน
- ประมาณ 1–3 เดือน
เป็นผลงานแบบไหน
- Play (เบราว์เซอร์): https://forgottensaga-classic.blogspot.com/2026/05/…
- ใช้งานได้ทั้ง PC / มือถือ โดยบนมือถือมี virtual joystick + Korean IME ที่ทำเอง
- ถอดแบบเกมเพลย์ต้นฉบับอย่างซื่อตรง — Z sorting, palette cycle, NPC state machine, SCP VM และพฤติกรรมต้นฉบับแบบ 1:1
24 ความคิดเห็น
ผมนึกถึงเพื่อนคนหนึ่งตอนที่ผมเรียนมัธยมต้น ซึ่งสมัยนั้นมีการ "สั่งซื้อล่วงหน้า" ที่ยังไม่ค่อยพบเห็นกันนัก แต่ Forgotten Saga ก็เลื่อนวันวางจำหน่ายอยู่เรื่อย ๆ เลยเอาแต่บ่นระบายกับผมตลอดเลยครับ ฮ่าๆ
ค้างมาประมาณ 2 ปีได้มั้ง? 555
กลิ่นอายความโรแมนติกพุ่งทะลักเลยนะครับ ขอเป็นกำลังใจให้กับโปรเจกต์เจ๋ง ๆ นี้!
ขอบคุณครับ หาความโรแมนติกแบบนี้ได้ยากจริงๆ
ถ้าไม่ใส่ชื่อ ระบบจะตั้งเป็น Hiro กับ Amy โดยอัตโนมัติ แต่ดูเหมือนอันนั้นจะใช้ไม่ได้แล้วนะครับ
เดิมก็เป็นเกมที่บั๊กเยอะมากอยู่แล้ว เลยสงสัยว่าตอนพอร์ตได้พอร์ตบั๊กมาครบถ้วนด้วยหรือเปล่า
ที่จริงแล้วน่าจะมีบั๊กมากกว่าเดิมเสียอีก.. จะค่อย ๆ ปรับปรุงไปทีละนิดครับ
ยอดเยี่ยมมาก.. ว้าว
ขอบคุณครับ💪🏻
ผมเองช่วงนี้ก็อยากพอร์ตเกมคลาสสิกที่เคยเล่นสนุกมากตอนสมัยประถมลงเว็บเหมือนกัน พอมีโพสต์แบบนี้ขึ้นมาก็เลยสนใจนะครับ แล้วก็สงสัยว่าบทความเกี่ยวกับแรงจูงใจหรือเนื้อหาการวิเคราะห์นั้นเอามาจากที่ไหนถึงได้ขึ้นบน GeekNews
ฮ่าๆ ก็ผมเป็นคนโพสต์เองนี่ครับ
https://github.com/NAMYUNWOO/forgottensaga_classic
Repo อยู่ที่นี่
❤️ขอบคุณครับ
ใส่ชื่อผิดไป ลบยังไงได้บ้างครับ? ปุ่ม Esc แบบเสมือนก็กดไม่ได้ แล้วปุ่ม Backspace บนคีย์บอร์ดก็กดไม่ติดด้วย ตื่นเต้นใจสั่นเลยครับ
ขอบคุณครับ T_T
ผมแก้บั๊กที่ปุ่ม Backspace ใช้งานไม่ได้แล้ว แต่ปัญหาที่กด esc ในโหมดเต็มจอแล้วออกจากโหมดเต็มจอยังอยู่ระหว่างแก้ไขอยู่..
ยอดเยี่ยมมากครับ!
ฮ่าๆ ก็เป็นความเป็นแฟนเล็กๆ น้อยๆ ครับ..
ยอดเยี่ยมมากครับ!
ชมเกินไปแล้วครับ 555 😂
ว้าว สุดยอดจริง ๆ ครับ
ขอบคุณนะ~~👍🏻👍🏻
โห เจ๋งชะมัดเลย
ขอบคุณครับ ผมจะค่อย ๆ ปรับปรุงความสมบูรณ์ให้ดีขึ้นทีละขั้น
ขอบคุณครับ ขอบคุณครับ เป็นกำลังใจให้ครับ
ขอบคุณที่ให้กำลังใจกัน!