- 最終更新日
- 記事公開日
【ゲーム改造】ROM内のバイナリデータを書き換えて、名前やステータスを自由自在に変更する
マイコン・プログラミングの知識があれば、ゲームの改造も難しくありません。
そこで今回は、初代プレイステーションのゲームソフト「競艇WARS マクル6」を使って、名前を実名にリネーム・能力のパラメーターを変更する方法について紹介します。
目次
ゲームROMの準備
まずは、ゲームソフト(CD-ROM)から、パソコンにデータを取り出しておく必要があります。
データの取り出し方については、たくさんの方がブログに書いていますので、そちらを参考にしてください。
この吸い出したデータのことを、ゲーム改造の世界では「ROM」と呼んでいます。
バイナリデータ編集ソフト「Stirling」の準備
ROM内のデータは、コンピューターにしか解読できない「バイナリ」というデータ形式で書き込まれています。
このバイナリデータを編集するために使用するのが、「Stirling」というソフトです。
マイコン界隈では、お馴染みのソフトですね。
Stirlingを使えば、バイナリデータを人間が理解できるデータ形式に変換・表示してくれます。
このStirlingを活用して、今回はROMデータのプログラムを解析していきます。
ROMファイルをStirlingで開く
吸い出したROMファイル「xxxxx.bin」をStirlingで開きます。
※拡張子「.bin」はバイナリ形式のファイル
画面左がバイナリデータ(2進数)を16進数で表示したもの。
画面右がバイナリデータをテキスト形式で表示したものです。
バイナリデータ?2進数?16進数?
コンピューターは、「0」と「1」の組み合わせだけで情報を表現しています。
その0と1だけで表現されたデータのことを「バイナリデータ」と言い、0と1だけで表現する方法のことを「2進数」と言います。
2進数は長くて読みにくい
例えば、
「あ」
という文字をコンピューターに理解してもらうには、
「10000010 10100000」
という2進数のバイナリデータを送る必要があります。
たった一文字なのに、こんなにも長いデータが必要なんです。
しかし、これでは人間が読み取るのが大変・・・
もっとデータを短く表現できないのか?
そこで、「16進数」という方法が用いられています。
16進数なら短くて済む
16進数なら、
「あ」
という文字も、
「82A0」
だけで済みます。
これなら、2進数に比べて、編集も解読もしやすそうです。
でも、そんなことができるんなら、そもそも16進数じゃなくて、最初から「あ」とだけ表示すればいいじゃないか?と思うかもしれません。
しかし、ROM内に入っているデータは文字ばかりではありません。
画像や映像のデータやプログラムのコードも入っています。
テキスト以外はバイナリデータでの編集は難しい
もちろん画像や映像も元をたどれば0と1だけを組み合わせたデータです。
文字とは比べものにならないくらい大量のデータが並んでいます。
元となるソースコードも持たずに、編集ソフトだけでそれらを復元して表示するのはさすがに不可能です。
バイナリデータの数値だけをいじって、画像を編集することも難しいでしょう。
よってバイナリ編集ソフトは、「人間が読み取りやすい16進数のデータ」と「テキストデータだけを復元したデータ」を表示するデザインとなっているのだと思います。
ということで、Stirlingの解説に戻りましょう。
さきほどの解説通り、画面左側に並ぶ英数字の羅列は16進数で示したデータ。
画面右側は、テキストだけはきちんと表示されていますが、その他の画像データなどは文字化けしたような意味不明な文字列が表示された状態となっています。
改造1:実名にリネーム
ようやく改造に手をかけるところまで来ました。
ここからが本番です。
まず、改造のカギとなるのが「テキストデータ」です。
画面右側は、意味不明な文字列が並んでいますが、唯一、テキストデータだけは解読できます。
例えば、「選手名」をたどっていけば、改造すべき箇所がすぐに見つかりそうです。
一度、ゲームを起動しましょう。
※PS1用エミュレーター「ePSXe」を使用しています。
その中に登場する選手名をメモしておきます。
今回は、この「月舞 善速」選手をリネームしてみることにします。
リネーム名は、実在するボートレーサー「峰 竜太」選手に書き換えてみましょう。
デフォルトのキャラクター名で検索して、改造箇所を探る
再度、ROMデータをStirlingで開きます。
画面上部メニューの「検索・移動」-[検索]を選択してください。
すると[検索データ]を入力する欄が表示されます。
「月舞」とだけ入力し、[次検索]をクリックして下さい。
該当するデータが見つかると、ハイライトで表示されます。
この部分をリネームしたい名前に書き換えます。
左側の英字数と右側のテキストデータの関係
まず、画面右側の漢字にマウスカーソルを合わせてみてください。
すると、漢字の半分だけがハイライトされた状態になると思います。
と同時に、画面左側は2桁の数字にアンダーバーが表示されています。
例えば、「月」の半分がハイライトされた状態では、「8C」という数字にアンダーバーが表示されています。
これは、漢字を表示するには16進数のデータが2つ必要なことを示しています。
今度はマウスをドラッグして「8C 8E」まで選んだ状態にしてみてください。
すると、漢字の「月」一文字がハイライトされると思います。
名前データを書き換える
画面右の漢字「月」にカーソルを合わせて、「峰」と書き換えます。
これで一文字書き換えられました。
簡単ですね。
※空白に注意
リネーム前の文字数は「月舞 善速」で漢字4つでしたが、リネームしたい名前の文字数は「峰 竜太」と漢字3文字です。
あらかじめデータの入れるための領域は確保してあるので、「舞」を消してはいけません。
「空白」で埋める必要があります。
空白に書き換えるには、「舞」にカーソルを合わせたときにハイライトされる画面左側の「95 91」を「00 00」に書き換えてください。
あとは、「峰」を書き換えたとき同じように「善速」を「竜太」に変えるだけです。
Stirlingの上書き保存
最後に、メニュー上部の[ファイル]-[上書き保存]として作業完了です。
※もしくは、フロッピーディスクのアイコンをクリックする事でも、上書き保存が可能です。
エミュレーターの再起動
ePSXeの上部メニューから[起動]-[リセット]を選び、再起動します。
選手名を確認すると、きちんとリネームされているはずです。
この要領で、レース名やペラの名前など、他のテキストデータも全てリネームが可能です。
改造2:能力値の変更
能力値は、基本的に数値でデータが格納されています。
とはいえ、数値はプログラム上でたくさん使用されているので、その中から能力値に使われている数値だけを見つけ出すのは簡単なことではありません。
ただし、今回のようにキャラクターに能力値が付随している場合は、キャラクター名のすぐ近くに能力値のパラメーターが格納されていることも多いです。
では、どうやって能力値が書かれたデータを見つけていくか?
まずは、キャラクター名の近くの数値を適当にいじって、保存。
実際にゲームを起動してみて、変化しているところを探す。
という、とても地道な作業を繰り返すだけです。
マクル6のライバル能力値(パラメーターの解析結果)
今回、私がマクル6を解析してみた結果、対戦相手の能力値は、以下のようなデータで格納されていました↓
(?)となっているところは不明です。
おそらく、チルト角度のようなパラメーターが用意されているのだとは思うのですが、ゲームの表面に出てこないデータは解析が難しいです。
顔コード(04)
顔データは、ストーリーモード「艇王への道」のセーブデータが影響します。
艇王への道でライバルを倒さないと、そのキャラクターのオリジナル顔画像は解放されません。
また、顔コードは基本的にいじらない方が良いです。
顔コードとペラは紐づいているので、顔コードだけを変更しても、ペラは別人という現象が起きます。
勝率コード(06/07)
例えば、「4D 03」というデータが格納されていた場合↓
① 反転 ⇒ 03 4D
② 034D (16進数)⇒ 845(10進数)
③ 勝率:8.45
勝率を「7.15」に変更する場合↓
① 715 (10進数) ⇒ 02CB (16進数)
② 反転 ⇒ CB 02
③[06]⇒ CB
④[07]⇒ 02
性別コード(08)
00 ⇒ 男性
01 ⇒ 女性
※どちらを選んでもゲーム性の影響なし?
支部コード(09)
00 ⇒ 北海道
01 ⇒ 青森
02 ⇒ 岩手
03 ⇒ 宮城
04 ⇒ 秋田
05 ⇒ 山形
06 ⇒ 福島
07 ⇒ 茨城
08 ⇒ 栃木
09 ⇒ 群馬
0A ⇒ 埼玉
0B ⇒ 千葉
0C ⇒ 東京
0D ⇒ 神奈川
0E ⇒ 新潟
0F ⇒ 富山
10 ⇒ 石川
11 ⇒ 福井
12 ⇒ 山梨
13 ⇒ 長野
14 ⇒ 岐阜
15 ⇒ 静岡
16 ⇒ 愛知
17 ⇒ 三重
18 ⇒ 滋賀
19 ⇒ 京都
1A ⇒ 大阪
1B ⇒ 兵庫
1C ⇒ 奈良
1D ⇒ 和歌山
1E ⇒ 鳥取
1F ⇒ 島根
20 ⇒ 岡山
21 ⇒ 広島
22 ⇒ 山口
23 ⇒ 徳島
24 ⇒ 香川
25 ⇒ 愛媛
26 ⇒ 高知
27 ⇒ 福岡
28 ⇒ 佐賀
29 ⇒ 長崎
2A ⇒ 熊本
2B ⇒ 大分
2C ⇒ 宮崎
2D ⇒ 鹿児島
グレードコード(0A)
00 ⇒ B2級
01 ⇒ B1級
02 ⇒ A2級
03 ⇒ A1級
04 ⇒ A1級(※SGクラス?)
※各グレードには収容できる人数制限があるようです。その制限を超えると、プレイヤーの顔データがバグります。
得意枠コード(0B)
00 ⇒ イン
01 ⇒ 内
02 ⇒ 内中
03 ⇒ 中
04 ⇒ 中外
05 ⇒ 外
06 ⇒ 大外
平均STコード(0D)
例えば、0.14の場合。
14(10進数)⇒ 0E
ペラ能力コード(00/01/02/03)
最大値:FF
※FFに設定すると、画面の枠を飛び出すくらいに能力値が跳ね上がります。実際の動きもVモンキーどころではない角度で曲がります(実質68がMAX?)
ペラ能力をMAXにしてみる
例えば、ペラ能力をMAXにするときは、バイナリデータを以下のように書き換えます↓
出足・回足・伸び・ピット離れの数値を、全て「68」としました。
※16進数と10進数
この「68」という数値は「16進数」での表記です。
バイナリデータ上では「16進数」で表記しますが、実際のゲーム上では「10進数」に変換された数値「104」が適用されます。
68(16進数) = 104(10進数)
その他のパラメーターに関しても同様に、バイナリデータ上では16進数で表記しますが、ゲーム上では10進数に変換された数値が適用されます。
例えば、平均ST(スタートタイム)はゲーム上では、「0.14」となっていますが、バイナリデータ上では「0E」です。
0E(16進数) = 14(10進数)
よって、ゲーム上で使用する数値が決まっている場合は、以下のツールを使用して、16進数に変換した数値をバイナリデータに書き込んでください↓
改造3:その他
その他、「所持金」や「選手寿命」といったプレイヤーの進行具合によって変動するデータは、セーブデータ(.mcr)に保存されています。
エミュePSXe場合、ゲーム内でメモリーカードに保存したデータは、以下のディレクトリに保存されています↓
epsxe-2-0-5 / memcards / epsxe000.mcr
値が変動する前と後のデータを比較して、その違いから一つずつヒントを探していきます。
※値が変動する前のデータを必ずどこか別の場所に保存しておいてください。
バイナリデータの比較方法
Stirlingで、変動前と変動後の2つのファイル(.mcr)を開き、上部メニューの[検索・移動]-[比較]を選択します。
すると、互いの相違箇所が表示されます。
例:選手寿命を延ばす
例えば、選手寿命を変更したい場合。
変動前の寿命が100日残っていたとします。
バイナリデータでは、数値を16進数で表示する必要がありますから、まずは下記のツールを使って、「100」という数値を16進数に変換します↓
変換した結果、100という数値を16進数に変換すると、「64」という値になりました。
100(10進数) = 64(16進数)
次に、選手寿命を一日縮めて99日残っている変動後のデータを見てみます。
99という数値を16進数に変換すると、「63」という値になります。
99(10進数) = 63(16進数)
この2つのセーブデータを元にStirlingで比較すると、相違点に「64」「63」という数字が浮かび上がります。
あとは、その数値を好きな数字に変えるだけです。
※セーブデータは「データが壊れていないか?」チェックサムを監視しています。ただ書き換えるだけだと、セーブデータが壊れてしまいます。チェックサムが変わらないように値を変更してください(改造前にePSXeフォルダごとバックアップするのを忘れずに!)
ゲームのルールを変えるのは難しい
ちなみに、いくらプログラミングが分かると言っても、ゲームの内容自体を変えることは、ほぼ不可能です。
できるのは、あくまでゲーム内の数値を書き換えられる程度。
ゲーム内のプログラムを書き換えるには、まず逆アセンブルという作業を行い、バイナリデータで書かれた機械語から、人間が解読できるアセンブリ言語に変換します。
しかしアセンブリ言語は、C言語のような直感的に解読できるような言語ではありません。
多少プログラミングに精通していても、理解できない人がほとんどでしょう。
逆アセしたコードには注釈も残っていません。
どのエリアでどのような処理が行われているのか?全く分からない状態です。
しかも、プレステのソフトともなれば、とんでもない行数のコードが書かれています。
無理だとは言い切れませんが、かなり困難な作業になることは間違いないでしょう。