見出し画像

Gym Retroにバーチャファイター2を追加する

バーチャファイター2」は「ソニック」に並ぶセガの看板ゲームです。しかし、「Gym Retro」が対応している1000本のゲームには含まれていません。そこで今回は、「Gym Retro」にバーチャファイター2を追加する方法について説明します。

1. Gym Retroへのゲーム追加に必要なファイル

Gym Retroにゲームを追加するには、以下のファイルが必要になります。

・rom.md: ゲームのROM
・rom.sha: ゲームのROMを一意に判定するハッシュ
・VirtuaFighter2.Level1.AkiraVsLau.state: 環境リセットの開始状態を示すセーブデータ
・metadata.json: Gym Retroのデフォルトの状態の指定
・data.json:Gym Retroに読み込むメモリアドレスの指定
・scenario.json(オプション):エージェントの報酬関数と完了条件を指示
・script.lua(オプション) : より高度な報酬関数と完了条件の指定

2. ROMの入手

ROMは「Steam」で購入して入手します。今回は「バーチャファイター2」を用意します。購入時は98円でした。

画像1

Steam:Virtua Fighter™ 2

購入したらSteamアプリを起動し、ゲームタイトルを「右クリック→Property→LOCAL FILES→BROWSE LOCAL FILES...」でROMが保存されているフォルダを開き、ROMを取得します。バーチャファイター2のROM「VIRTUAFIGHTER2.bin」を取得して、「rom.md」に名前変更します。

3. BizHawkのインストールと実行

はじめにゲームメモリを探索して、「報酬関数」「完了条件」として利用する「変数」のアドレスを調べます。「バーチャファイター2」の場合は、「体力ゲージ」「ラウンド内の勝利数」の変数を探します。

ゲームメモリのアドレスを探索するには、「BizHawk」というツールを使います。このツールは「Windows」でのみ動きます。

◎BizHawkのインストール
BizHawkのインストール手順は次の通りです。

(1)「bizhawk_prereqs_v2.1.zip」をダウンロードして解凍して実行します。
これによって、BizHarkの前提条件がインストールされます。
(2)「BizHawk-2.3.2.zip」をダウンロードして解凍します。

◎BizHawkの実行
BizHawkの実行手順は次の通りです。

(1)「EmuHawk.exe」を実行します。
(2)メニュー「File→Open ROM」を選択し、「rom.md」を選択します。

◎BizHawkでのバーチャファイター2の操作方法
BizHawkでのバーチャファイター2の操作方法は次の通りです。

・十字ボタン:方向キー
・ABCボタン:ZXCキー
・スタートボタン:Enter
・技の出し方 : 公式ページ参照

画像2

4. ゲームメモリを調べる

ゲームメモリを調べるには、「BizHawk」のメニュー「Tools → RAM Watch」と「Tools → RAM Search」を使います。
「体力ゲージ」の変数を探す手順は次の通りです。

(1)ラウンドを開始(今回はAkira vs Lau)し、直後にメニュー「Emulation → Pause」で一時停止。
(2)「RAM Search」で「New」を押す。
「New」を押すことで、全アドレスが表示される初期状態となります。

・Address:アドレス
・Value:現在の値
・Prev:前回の値
・Changes:変更回数

画像3

(3)Pauseを解いて、一回ダメージを受けて、再度Pause。
(4)変数の型を指定。
ROM Searchを開き、「Size」で「2 Byte」、「Display」で「Unsigned」を選択します。体力ゲージに使われそうな型として「2 Byte」の「Unsigned」を選択しました。

「Size」と「Display」の選択肢は次の通りです。

・Size
  ・1Byte
  ・2Byte
  ・4Byte

・Display
  ・Unsigned
  ・Signed
  ・Hex
  ・Binary

(5)前回の値より現在の値が減ったアドレスを絞り込む。
「Compare To / By」で「Previous Value」、「Comparison Operator」で「Less Than」を選択し、「Search」を押します。

「Compare To / By」と「Comparison Operator」の選択肢は次の通りです。

・Compare To / By
  ・Previous Value(前回の値)
  ・Specific Value(特定の値)
  ・Specific Address(特定のアドレス)
  ・Specific Changes(特定の変更回数)
  ・Difference of(違い)

・Comparison Operator
  ・Equal To(等しい)
  ・Not Equal To(等しくない)
  ・Less Than(より小さい)
  ・Greater Than(より大きい)
  ・Less Than or Equal To(以下)
  ・Greater Than or Equal To(以上)
  ・Different by(異なる)

(6)これを繰り返して10個以下になったら、全て選択して「Watch」(双眼鏡)を押して、「ROM Watch」に追加。

画像6

(7)次のラウンドがはじまったら、Valueが0のものや、体力減ってないのに値が動いているものを、「Remove Watch」(×)で削除。
(8)残ったもの「DCE2」が「体力ゲージ」のアドレスとなる。

画像6

(9)次のラウンド開始時に「DCE2」の初期値が「28784」であることを確認。
(10)「Compare To / By」で「Specific Value : 28784」、「Comparison Operator」で「Equal To」で「Search」を押す。
2つに絞られるので、アドレス「DCE2」「DEE2」が「体力ゲージ」であることがわかりました。

画像4

同様の方法で、「ラウンド内の勝利数」は「DC0C」「DE0C」(0〜2)であることがわかります。

5. Integration UIのインストールと実行

次に、「Integration UI」をインストールします。「Integration UI」を使用すると、ゲームをプレイして保存状態を作成し、BizHawkほど高性能ではありませんが、ゲームメモリの変数を見つけることもできます。これを使って、

・stateファイル(VirtuaFighter2.Level1.AkiraVsLau.state)
・metadata.json
・data.json

の作成と動作確認を行います。

◎Integration UIのインストール
「Integration UI」は、以下からダウンロードできます。解凍して実行してください。

Windows用のインテグレーションUI
Mac用のインテグレーションUI

◎stateファイルの作成
「stateファイル」の作成手順は次の通りです。

(1)「Integration UI」(Gym Retro Integration.app)を起動。
(2)メニュー「Game → Open」を選択。
(3)ROM(rom.md)を選択。
(4)ゲーム名として「VirtuaFighter2」を指定。

画像7

(5)メニュー「Window → Control」で操作方法を確認。
(6)ゲームの開始状態になったら、「Command-P」でゲームを一時停止し(実際のゲーム内ではなくIntegration UIで)、「Command-S」で状態を保存。
今回は、Akira vs Lauでラウンド開始し、「READY」と表示されたら一時停止と状態保存を行います。
(7)ファイル名を指定。
今回は、「VirtuaFighter2.Level1.AkiraVsLau.state」とします。

◎metadata.jsonの作成
「metadata.json」では、Gym Retroのデフォルトの状態の指定を指定します。

【metadata.json】

{
 "default_state": "VirtuaFighter2.Level1.AkiraVsLau"
}

◎data.jsonの作成
「data.json」の作成手順は次の通りです。

(1)「Search」で名前「health_gage1」「Is」「28784」を指定し、「Search」ボタンを押し、検索結果の「health_gauge1」を選択し、検索結果の詳細表示。

画像8


(2)「ffdce2  >u2」を選択して、「Make variable」ボタンを押す。
「variables」に「ffdce2  >u2」が追加されます。

画像9

(3)同様に以下の変数を追加します。
・health_gage2 : ffdee2  >u2
・win_count1  :  ffdc0c >u2
・win_count2 : ffde0c  >u2

(4)メニュー「data → Save variables」で「data.json」として保存。

6. rom.shaの作成

「rom.sha」はROMのSH1のハッシュを記述します。Macでは以下のコマンドになります。

$ openssl sha1 rom.md
SHA1(rom.md)= 69e102855d4389c3fd1a8f3dc7d193f8eee5fe5b

【rom.sha】

c283bf31b646489c2341f8325c52fb8b788a3702

7. ゲームの追加

以下のファイルをまとめて「VirtuaFighter2-Genesis」のフォルダにまとめ、「<Gym Retroのインストール先>/retro/data/stable/VirtuaFighter2-Genesis」に配置します。

VirtuaFighter2-Genesisrom.mdrom.shametadata.jsonVirtuaFighter2.Level1.AkiraVsLau.statedata.json

動作確認のコードは次の通りです。
「報酬関数」「完了条件」はまだ設定してないので、実際に学習するには、取得したゲームメモリの情報(info)からこれらを計算する処理も必要になります。

【vf2.py】

import retro

# 環境の生成
env = retro.make(game='VirtuaFighter2-Genesis', state='VirtuaFighter2.Level1.AkiraVsLau')
env.reset()

# ランダム行動
for _ in range(2000):
   env.render()
   env.step(env.action_space.sample())


この記事が気に入ったらサポートをしてみませんか?