●改造コードについて
基本的には、直接メモリを操作するコードとPARコードのように暗号化されたコードがあります
PARコードは「アクションリプレイ」で使用されていますが、ここでは使用しません
●VBA(Visual Boy Advance)でのチート(cheats)
改造コードを入れるときは、メニューの「チート(cheats)」→「コードリスト(cheats List)」で
リスト用のダイアログを開きます
このリストに入っているアドレスのメモリは固定(ロック)され、つねに設定された値を維持します
チェックが付いていると右側が「E」になり有効で、
チェックを外すと「D」になり、以前の値をいれて固定を外します
ダイアログの左下にある「コード(code)」を押すと「改造コードの追加(Add cheat code)」ダイアログが開きます
上のエディットボックスには説明をいれることができます
説明はいれなくてもいいですが、大量にコードがあったり時間が経つとなにか分からなくなるので
説明は「HP最大」とか自分なりの説明を入れておきます
下のエディットボックスにはコードをいれることができます
コードは「アドレス」:「値」という書き方になり
「0040000:FF」といれると、メモリの「00400000」の1バイトに「FF」が入り固定されます
「アドレス」は4BYTE(32bit)でメモリの位置を表します
「値」部分は1バイト(8bit)・2バイト(16bit)・4バイト(32bit)を入れることができます
メモリを検索する時は、メニューの「チート(cheats)」→「改造コードの検索(Search for cheats)」で
検索用のダイアログを開きます
上にあるリストには検索されたアドレスの「前に検索した時の値」と「今の値」が表示されます
上図では32bitとして、16進数でFF(000000FF)をメモリ内から検索した結果です
リストには検索したアドレス・以前の値・現在の値が入ります
リストはゲームに戻っても、「開始」ボタンを押さない限り消えません
検索したアドレスが大量にあるとメッセージボックスが出てくるので、
ゲームを進めてから検索するとか、条件を変更したりして後で検索します
なにもない場合もメッセージボックスが表示されるので、その場合は「開始」ボタンを押しやり直します
※検索タイプ(Search type)
| 古い値(Old Value) |
以前に検索した時の値を基準にする |
| 特定の値(Specific Value) |
下の「値の入力(Enter value)」に入れた値を基準にする |
※サイズ(Data size)
検索するアドレスの値をどのサイズにするかを決めます
| 8bit |
メモリを1バイト単位で検索します |
| 16bit |
メモリを2バイト単位で検索します |
| 32bit |
メモリを4バイト単位で検索します |
※比較タイプ(Compare type)
検索タイプの値を指定されたサイズで、検索中の値と どうやって比べるかを決めます
| 等しい(Equal) |
値が同じなら検索にかかります |
| 異なる(Not equal) |
値が同じじゃないなら検索にかかります |
| 未満(Less than) |
検索中の値が指定された値より下なら検索にかかります |
| 以下(Less or equal) |
検索中の値が指定された値以下なら検索にかかります |
| 超える(Gerather than) |
検索中の値が指定された値より上なら検索にかかります |
| 以上(Gerather or equal) |
検索中の値が指定された値以上なら検索にかかります |
※基数(Signed/Unsigned)
検索するアドレスの値と「値の入力(Enter value)」に入っている値の扱い方を決めます
| 10進数 符号付(Signed) |
プラス〜0〜マイナスを扱います |
| 10進数(Unsigned) |
マイナスは使わない |
| 16進数(Hexadecimal) |
16進数で検索 |
※値の入力(Enter value)
「検索タイプ(Search type)」が「特定の値(Specific Value)」の場合、ここに値を入れます
この値は32bit(4バイト)まで入れることができます
また、サイズ(Data size)で決められたbitで検索するので、
サイズ(Data size)が8bitで、値の入力(Enter value)が8bit以上なら絶対見つかりません
逆にサイズ(Data size)が32bitで、値の入力(Enter value)が32bit以下なら
自動で上位バイトに0を入れてくれます(
上図)
※開始(Start)
現在のメモリのアドレスすべてを対象にします
一度検索している場合は、見つかったアドレスをリストから消します
※検索(Search)
対象になるアドレスの値と指定された値を検索します
一度検索している場合は、対象のアドレスの値から検索します
対象を絞るために、「古い値」で「開始」を押して、「等しい」で「検索」を押す、
その後ゲームを進めて「異なる」で「検索」すると変化したアドレスが分かる
また、「特定の値」で「開始」を押し、「等しい」で「検索」を押すと、
その値があるかどうかが分かる
他のアプリでも検索方法は大体同じような感じです
●特定の値を探す
特定の値はとりあえず見える値を探します
HPやお金などがこれに当たります
HPやお金は変動し比較的 桁が大きいので、見つけやすく、他のデータも近くにある可能性があります
ただし、値が表示用の場合や、複数に分けられている場合(戦闘用・マップ移動用など)もあります
暗号化されている場合もあるので、変動量から調べても見つからない場合があります
アドレスがある程度見つかった場合は、「値を変更」⇔「ゲームで確認」をひたすら確認してきます
特定された場合でも、その近くに別のデータがあるので、BYTE単位で確認していきます
※数値(お金の場合)を見つける
256以上の値がある状態で、目的の値を10進または16進数で、一度検索します
256以上なら2バイト以上になるので、検索時に見つかりやすくなります
運がよければこの時点で発見できます
桁が大きくなればなるほど見つけやすくなります
例として、変動させやすい「お金」でやってみます
まず、ゲーム中でお金を通常の方法で変動させます
これは買い物や戦闘で獲得したりして変動させます
そして、その時点での「お金」の値を16進にして再度検索します
複数ある場合は、どれでもいいので1つを選択し、値を変えてみます
ゲームに戻り、「お金」を表示させ、もう一度検索ダイアログに戻り、先ほどの値を見てみます
すると、変更したアドレスが「お金」なら別のアドレスも変動します
変動しない場合は、値が表示用の場合かダミーです
複数のアドレスに値を分散しチェックするタイプなら
とりあえず全部のアドレスを特定の値に変更し、1つ1つ「無効」にしながら確認します
キャラのステータスも同様にレベルアップ前などにセーブしておけば楽に検索できます
※文字コートを発見し文字コート表を作ってみる
WindowsではASCIIやJISコートを使用しているように
各ゲームは独自の文字コードになっています
この文字コートがわかれば、「名前」からアドレスと特定できます
例えば登録番号が分かれば、ゲームに登場する物・人・場所などが分かります
ただし、これには使用可能になるための「フラグ」が必要な場合もあるので絶対ではありません
また、「表示用のアドレス」と「キャラデータ用のアドレス」が存在することがあります
まず、ゲーム中で文字を入力できる場面にしクイックセーブ(エミュ本体の機能)しておきます
この時点で検索の「開始」をして、全てのアドレスを対象にします
次に「あ」など文字を入れて「決定」し、
「古い値」「8bit(ダメならそれ以上)」「16進」「異なる」で検索します
たくさん検索された場合は、一度ゲームに戻り、「等しい」で再度検索します
まだたくさん検索される場合は、「い」を入れて「異なる」で検索します
まだまだたくさん検索された場合は、一度ゲームに戻り、「等しい」で再度検索します
ちなみに、大抵のゲームでは、ゲーム中に画面を切り替えたりしないと反映されません
これを繰り返し検索して、アドレスと特定します
ある程度絞り込めれば、残りのアドレス全部を書き換えるなどして調べて絞り込めばOKです
例えば、10ヶ所アドレスが残っているなら、まず上側5つを書き換える
この時点で変わったならこの5つのアドレスのどれかになります
変わらなかった場合は、ここよりあとのアドレスになると思われます
アドレスが特定できたなら、その値を直接(メモリビュアーで)1ずつずらして、表にします
表が完成したら、ゲーム画面での名前を32bit値として「開始」「検索」し、
探している名前のアドレスを特定します
「名前」のアドレス前後に、登録番号などが眠っています(無いこともありますが)
32bit値なので検索する時は、先頭4文字(4バイト)で探しますが、
16進で「01 02 03 04」という文字列を検索する時は、「04 03 02 01」としないと見つかりません