Port mã nguồn Forgotten Saga (RPG DOS Hàn Quốc năm 1997)
Động lực
- 30 năm trước, hồi học tiểu học, gói game đầu tiên tôi mua là Forgotten Saga
- RPG đầu đời, nên tự nhiên bị cuốn rất sâu
- Sống quên nó hơn 20 năm rồi mới biết đến giờ vẫn còn rất nhiều người chơi
- "Liệu có thể biến nó thành game đa nền tảng không?"
- Thứ còn lại chỉ là file thực thi PE32 năm 1997 + các file dữ liệu (đương nhiên không có mã nguồn)
Cách tiếp cận
- Có hai hướng lớn để tái hiện game gốc
- Diễn giải lại dựa trên đặc tả — xem gameplay rồi làm lại cho giống
- Khôi phục trung thực theo từng hàm của bản gốc — port nguyên mã đã decompile
- Tôi chọn cách thứ hai, để bám theo hành vi gốc đã được kiểm chứng thay vì suy đoán
- Bản gốc là Windows MSVC năm 1997
Nội dung đã phân tích
Decompile binary gốc
- Dùng Ghidra 12 để xử lý PE32. Decompile thành công 100% của 937 hàm
- 51.799 dòng pseudocode C
Phân tích ngược định dạng dữ liệu (48 loại, đã kiểm chứng toàn bộ)
- LZSS — chuẩn + biến thể FAM (ring init
0x00, bố trí bit ref_offset khác)
- SPB — 256 màu + RLE, 1.155 ảnh
- MOB — animation nhân vật/NPC, 2.699 frame. Header
0xA4 + pixel RLE + frame stride 20B
- SCP — VM bytecode, hơn 128 opcode, 6.026 entry, 43.036 câu thoại
- FAM — 292 map, 5 layer (base / overlay / collision / ...)
- DAT — CHAR / ITEM 290 loại / MAGIC / ABILITY / MONSTER
- SAV — struct actor
0x2A4 (676B), party + inventory + biến toàn cục
Tự kiểm chứng trực tiếp từ dữ liệu người dùng
- Tự parse file save để kiểm chứng offset của struct actor
- Sửa các mapping sai trước đó (
0x3C ATK→STR, 0x40 INT→TLT, v.v.)
Những gì đã tạo ra
- 263 file Lua, 157.277 dòng
- 3.760 asset
- Bản build desktop LÖVE 2D 11.5 + bản web love.js (emscripten)
- Tự triển khai joystick ảo trên di động + IME tiếng Hàn
- Kích hoạt SharedArrayBuffer (COOP/COEP qua coi-serviceworker)
- Lưu save bền vững bằng IndexedDB sav (môi trường trình duyệt)
- 5 kênh phát hành — Web / iOS / Android / Windows / macOS
Phạm vi tái hiện
- Tiêu đề / tạo nhân vật / field / hội thoại / cửa hàng / inventory / trang bị / bẫy / DETECT·UNLOCK / save — hoàn tất
- Hệ thống chiến đấu — đang thực hiện
Ứng dụng công cụ AI
- Chủ yếu dùng tính năng
/goal của GPT 5.5, Claude Code hỗ trợ phụ + debug thời gian thực
Vai trò của GPT 5.5 /goal — phân tích decompile / tích lũy chỉnh sửa
- Tự động phân tích cluster hàm gốc / call graph / opcode reference
- Deep dive vào định dạng dữ liệu (định dạng sav, offset actor, cấu trúc FAM, v.v.)
- Tích lũy sửa các nhãn sai trong bản decode tự động ban đầu (bản đã chỉnh sửa của 51.799 dòng)
Vai trò của Claude Code — port sang Lua + chu kỳ kiểm chứng ngay lập tức
- Đọc hàm gốc → port sang Lua → chạy test
verify.sh (hơn 100 chế độ test, hơn 1.000 assertion)
- Debug trong môi trường trình duyệt (IDBFS / IME / SharedArrayBuffer, v.v.)
- Khi có báo cáo từ người dùng thì debug → fix → phát hành dev → kiểm chứng → phát hành live
Thời gian thực hiện
Đây là sản phẩm gì
- Play (trình duyệt): https://forgottensaga-classic.blogspot.com/2026/05/…
- Chạy được trên cả PC và di động. Bản di động tự triển khai joystick ảo + IME tiếng Hàn
- Tái hiện trung thực gameplay gốc — hành vi nguyên bản 1:1 như Z sorting, palette cycle, state machine của NPC, SCP VM, v.v.
Chưa có bình luận nào.