Forgotten Saga(1997年の韓国製DOS RPG)をソースポートする
動機
- 30年前、小学生のときに初めて買ったパッケージゲームがForgotten Saga
- 人生初のRPGで、自然とのめり込んだ
- 20年以上忘れていたが、今でも多くの人が遊んでいることを知った
- 「これをマルチプラットフォームのゲームにできないか?」
- 残っていたのは1997年のPE32実行ファイルとデータファイルだけ(当然ソースコードはない)
アプローチ
- オリジナルゲームを再現する方法は大きく2つ
- 仕様ベースの再解釈 — ゲームプレイを見て似たように作り直す
- オリジナルの関数単位で忠実に復元 — デコンパイルしたコードをそのまま移植する
- 後者を選択。推測ではなく、検証済みのオリジナル動作に従うため
- オリジナルは1997年のWindows MSVC
解析した内容
オリジナルbinaryのデコンパイル
- Ghidra 12でPE32を処理。937関数を100%デコンパイル成功
- 51,799行のpseudocode C
データ形式の解析(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 — バイトコード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を検証
- 以前の誤ったマッピング(
0x3C ATK→STR, 0x40 INT→TLT など)を修正
作り上げたもの
- Lua 263ファイル、157,277行
- アセット 3,760個
- LÖVE 2D 11.5 デスクトップビルド + love.js (emscripten) Webビルド
- モバイル仮想ジョイスティック + 韓国語IMEを直接実装
- SharedArrayBuffer有効化(COOP/COEP via coi-serviceworker)
- IndexedDBによるsav永続化(ブラウザ環境)
- 配信チャネル5種 — Web / iOS / Android / Windows / macOS
再現範囲
- タイトル / キャラクター作成 / フィールド / 会話 / ショップ / インベントリ / 装備 / 罠 / DETECT・UNLOCK / セーブ — 完了
- 戦闘システム — 進行中
AIツール活用
- GPT 5.5 の
/goal 機能中心、Claude Code は補助 + リアルタイムデバッグ
GPT 5.5 /goal の役割 — デコンパイル解析 / 修正の蓄積
- オリジナル関数のcluster / call graph / opcode reference の自動解析
- データ形式のdeep dive(sav format, actor offset, FAM構造など)
- 初期自動デコード版のmislabel修正を蓄積(51,799行の修正版)
Claude Code の役割 — Lua移植 + 即時検証サイクル
- オリジナル関数 read → Lua移植 →
verify.sh test 実行(100+ test mode, 1,000+ assertion)
- ブラウザ環境デバッグ(IDBFS / IME / SharedArrayBuffer など)
- ユーザー報告を受けたら デバッグ → fix → dev配信 → 検証 → live配信 のサイクル
作業期間
どんな成果物か
まだコメントはありません。