PR
[PR]アフィリエイト広告を利用しています
[PR]アフィリエイト広告を利用しています

【入門】BizHawk×Lua×AI(Claude)でゲームのメモリ値を画面表示する最小テンプレ|RAM Searchで所持金アドレスを特定する手順

AIでレトロゲームのメモリを解析する技術ブログのイメージ図 エミュレーター制御

【技術検証に関する法的注意事項・免責事項】
本記事に掲載されているメモリ解析、Luaスクリプト実行、およびAIコード生成に関する技術情報は、自らが所有するゲームソフトおよびオフライン環境における技術研究・教育目的の検証記録です。著作権法第47条の3に配慮し、複製ROMの配布、コピーガードの回避(DRM解除)、オンライン環境での不正操作(BOT化)等に関する情報は一切取り扱いません。掲載情報の実行によって生じた損害について、当ブログは一切の責任を負いかねます。

※本記事にはアフィリエイト広告(PR)を含みます。

難易度:中級 ★★☆/対象環境:BizHawk(最新安定版)+Windows/対象ソフト:ご自身が所有する『ドラゴンクエストIII』(ファミコン版を例に解説。オフラインでの技術検証)

この記事でできること(結論)

この記事では、エミュレーター BizHawkRAM Search(メモリ検索) でゲーム内の「所持金」が入っているメモリアドレスを特定し、Lua スクリプトでその値を画面に常時オーバーレイ表示する「最小テンプレ」を作ります。コードは Claude(AI) に書かせ、うまく動かないところは対話で直していきます。ゲーム内部の数値がどこにあるかを「解析して状態を検証する」ための、いちばん短い入口です。改造やチートを目的とするものではなく、メモリ解析と状態検証の技術記録です。

難しいアセンブリの知識は不要です。順番どおりに進めれば、はじめてでも「メモリの値をリアルタイムで読む」体験ができます。

前提環境

項目 内容
エミュレーター BizHawk(公式配布の最新安定版)
OS Windows 10 / 11
対象ソフト 自分が所有するゲーム(本記事はファミコン版『ドラゴンクエストIII』を例に解説)
使用コア ファミコン=NesHawk(BizHawk同梱)。他機種でも考え方は同じ
使うAI Claude(生成したLuaコードの作成・修正に使用)

ROMやBIOSの入手方法・配布については本記事では一切扱いません。あくまで自分が所有するソフトを、自分のオフライン環境で技術的に調べることが前提です。

手順の全体像

やることは3ステップです。

  1. RAM Searchで「所持金」のメモリアドレスを特定する
  2. そのアドレスを読むだけの最小LuaコードをClaudeに書かせる
  3. 画面に値を表示し、ズレたらClaudeと対話して直す
RAM Searchでアドレス特定→AIがLua生成→画面にオーバーレイ表示する3ステップの概念図
RAM Searchでアドレスを特定し、AIにLuaを書かせ、画面に表示するまでの流れ(概念図)

ステップ1:RAM Searchで「所持金」のアドレスを特定する

RAM Search は「値が変わったメモリだけを絞り込む」機能です。所持金のように自分で増減させられる数値は、これで比較的かんたんに見つかります。

絞り込みの流れ

  1. BizHawk のメニューから Tools → RAM Search を開く。
  2. ゲーム内で所持金を確認したら、RAM Search で「現在の値でスキャン(新規検索)」を実行。
  3. ゲーム内で買い物などをして所持金を減らす → RAM Search で「Less Than(前回より小さい)」で絞り込む。
  4. 今度は所持金を増やす → 「Greater Than(前回より大きい)」で絞り込む。
  5. これを数回くり返すと、候補が数個まで減ります。所持金と同じ動きをするアドレスが目的のものです。

候補が絞れたら、そのアドレス(例:0x00XXXX)を控えておきます。

📌 この記事は「型(テンプレ)」の解説版です。実際に特定できる具体的なアドレス値と、動作中のGIFは、実機検証の記録として後日この記事に追記します(本ブログは「試行錯誤の過程」を一次情報として更新していく方針です)。まずはあなた自身の環境で上の手順を再現し、出てきたアドレスを次のコードに当てはめてください。

ステップ2:Claudeに「最小Luaコード」を書かせる

アドレスが分かったら、あとはそれを読んで画面に出すだけです。ここは自分でゼロから書かず、Claudeに頼みます。実際に送ったプロンプトはこちらです。

あなたはBizHawkのLuaに詳しいアシスタントです。
BizHawkのLua Consoleで動く、できるだけ短いスクリプトを書いてください。
要件:
- メモリアドレス 0x00XXXX にある「所持金」を毎フレーム読み取る
- 値を画面の左上に「GOLD: 数値」の形でオーバーレイ表示する
- 対象はファミコン。値は2バイト(16bit)と仮定し、まずはリトルエンディアンで読む
- 無限ループで、各フレームの最後に emu.frameadvance() を呼ぶ
コードだけを提示し、各行に短い日本語コメントを付けてください。

ポイントは、アドレス・バイト数・エンディアン・対象機種をはっきり伝えることです。ここが曖昧だと、AIは一般論のコードを返してきて動きません。

ステップ3:生成されたLuaコード

Claudeが返してきた最小テンプレがこちらです。0x00XXXX の部分を、ステップ1で特定した自分のアドレスに置き換えて使います。

-- 所持金を画面に常時表示する最小テンプレ(BizHawk / Lua)
local addr = 0x00XXXX          -- ← RAM Searchで特定したアドレスに置き換える
while true do
  local gold = memory.read_u16_le(addr)   -- 2バイト・リトルエンディアンで読み取り
  gui.text(10, 10, "GOLD: " .. gold)       -- 画面左上にオーバーレイ表示
  emu.frameadvance()                       -- 次のフレームへ進める
end

BizHawk の Lua Console(Tools → Lua Console)で新規スクリプトとして保存し、実行します。うまくいけば、画面左上に所持金がリアルタイムで表示され、買い物をすると数字が連動して動きます。

ステップ4:うまく動かないときの対処(よくあるつまずき)

最小テンプレは、次のポイントでつまずきがちです。表示がおかしいときは、上から順に疑ってください。

① 値が明らかに変(大きすぎる/連動しない)

読み取りバイト数かエンディアンが合っていない可能性が高いです。Claudeにこう追加で頼みます。

値が所持金と連動しません。次を試したコードもください。
(1) 1バイトで読む read_u8 版
(2) 2バイトのビッグエンディアン read_u16_be 版
どれが正しいか、値の動きで見分ける方法も教えてください。

② そもそも何も表示されない

gui.text は毎フレーム呼び続けないと表示が残りません。while true do … emu.frameadvance() end のループの中に入っているか確認します。ループの外に置くと一瞬で消えます。

③ アドレスは合っているのに値が読めない

RAM Search と Lua でメモリドメイン(読む領域)が食い違っていることがあります。BizHawk では memory.usememorydomain("RAM") のように領域を明示すると安定します。どの領域を指定すべきかもClaudeに聞くと早いです。

コピペ用:最終スクリプト(テンプレ)

エラー対処まで踏まえた、そのまま使えるテンプレです。addr と、必要なら読み取り関数・領域を自分の環境に合わせてください。

-- ===== メモリ値オーバーレイ 最小テンプレ(BizHawk / Lua)=====
-- 対象: 自己所有ソフトのオフライン技術検証
memory.usememorydomain("RAM")   -- 読む領域を明示(環境に合わせて変更)
local addr  = 0x00XXXX          -- RAM Searchで特定したアドレス
local label = "GOLD"            -- 表示ラベル
while true do
  local v = memory.read_u16_le(addr)   -- 値の型に合わせて read_u8 / read_u16_be も検討
  gui.text(10, 10, label .. ": " .. v) -- 左上にオーバーレイ
  emu.frameadvance()
end

よくある質問

これは「チート」や「改造」ですか?

いいえ。ここで行うのは、メモリにある値を読み取って画面に表示する(状態を観測・検証する)ことだけで、ゲームデータやROMを書き換えるものではありません。俗に「裏技」「チート」と呼ばれる挙動も、仕組みの側から見ると「どのメモリがどう変化するか」という状態変化です。本ブログはそれを、自己所有ソフトのオフライン環境で技術的に検証する記録として扱います。

ファミコン以外(SFC・ゲームボーイ・メガドライブなど)でも同じ手順ですか?

考え方は同じです。「RAM Searchでアドレスを特定 → Luaで読む」という流れは全機種共通です。違うのは主に2点で、メモリドメイン(読む領域)値のバイト数・エンディアンです。機種を変えたら read_u8 / read_u16_le / read_u16_be のどれが正しいかを、値の動きを見ながら試します。

特定したアドレスは、セーブや再起動で変わりますか?

同じソフト・同じ版であれば、基本的にアドレスは固定です。ただし版(リビジョン)が違うとズレることがあるので、その版で特定し直してください。RAM Searchで一度見つけておけば、次回からはそのアドレスを使い回せます。

まとめ

RAM Search でアドレスを特定し、Claudeに最小Luaを書かせ、画面に値を出す——この3ステップが「AIでゲームを解析・制御する」いちばん短い入口です。ここまで来れば、あとは表示する値を増やしたり、値の変化に応じて処理を分岐させたりと、応用は一気に広がります。次はこのテンプレを土台に、Luaでの入力自動化や、複数の値の同時監視に進んでいきます。

次に読む

ドラクエ3大魔王ゾーマ「やみのころみ」の秘密
ドラゴンクエストIIIもはや日本国民で知らない人の方がマイノリティになったと言える作品。そんなドラゴンクエストIIIのゾーマの秘密知っていますか?って有名ですよね。ファミコン版「ひかりのたま」を使う前と使った後の色が逆だった伝説ドラゴンクエ...
Mesen2 メニューの使い方【Windows 10/11・Mesen 2.x】|Fileメニューの開き方・セーブステート保存/読込・前回セッション復元まで完全ガイド
Mesen2のメニューはウィンドウ最上部にあり、まず覚えるのはFileだけで十分です。Open・Save State・Load State・Load Last Session・Recent Files・Exitの全項目を日本語対訳つきで解説し、上書き事故を防ぐスロット運用、日本語UIの有無、セーブステートが読めなくなる原因までまとめました。

(近日公開)RAM Searchで HP・座標アドレスを特定する手順

検証環境をそろえるなら

メモリ解析やLua実行を快適に行うには、ある程度のPC性能があると作業が軽くなります。実験環境の候補は次のとおりです。

Amazonのアソシエイトとして、当ブログは適格販売により収入を得ています。

この記事の親ガイド

【初級★☆☆】PCでレトロゲームを遊ぶ 完全ガイド|何から始めるか5ステップ
PCで昔のゲームを遊びたいけれど何から始めればいいか分からない方へ。①前提の確認→②何で遊ぶか決める→③PCとコントローラー→④画面に映す→⑤AIで解析・制御する、の5ステップで全体像を整理しました。各ステップの詳しい手順記事へ案内する地図として使えます。自己所有ソフト・オフライン環境での技術検証を前提としています。

【予告】この5工程で使うスクリプトをまとめた「コピペで動くLua集+環境構築キット」を配布予定です。価格・配布日は未定で、決まり次第この記事に追記します。

【中級★★☆】ゲームのメモリ解析は5ステップで内部の数値が読める|BizHawk×Lua×AI 手順の全体像
ゲームのメモリ解析は5工程しかありません。①読み出せる状態をつくる ②目的の数値がどこにあるかを絞り込む ③読んだ数値を画面に出し続ける ④AIにコードを書かせて往復を削る ⑤自動化して実験する。この記事は手順そのものではなく「いまどの工程にいるか」「次にどの記事を開くか」を示す地図です。開始地点を事実だけで判定する4問チャート付き。自己所有ソフト・オフライン環境が前提です。

コメント