【PARコードの基礎】No.2 - キー判定コード
ゲームの改造コードについてまとめておきます。
ここではニンテンドーDSの改造コードを例に挙げて説明します。
キー判定コード
前回はPARコードの仮想アドレスと仮想アドレスに格納する値について説明しました。
例としてポケットモンスターBW2で所持金をMAXにするコードを挙げています。
02226084 0098967F
ですが、これだけでは所持金をMAXにするタイミングを決めることができません。
そこで任意のタイミングでこのPARコードを発動できるようにするために、
キー判定コードというものを使う必要があります。
では実際の例で見てみましょう。
94000130 FFFB0000 //キー判定コード 02226084 0098967F //前回解説した部分 D2000000 00000000 //キー判定コードで行われる処理がここまで、という合図
このPARコードは、SELECTボタンを押したときに所持金をMAXにするコードです。
このPARコードの1行目に当たる部分がキー判定コードで、
3行目に当たる部分がキー判定コードで行われる処理の終了を指すものになります。
キー判定コードを使用した場合は、この『D2000000 00000000』を最終行に記述して閉じる必要があります。
新たに2行コードを追加することでSELECTボタンを押したタイミングで所持金をMAXにできるようになったわけですね。
キー判定コードの例
キー判定コードの例をいくつか挙げるとこのようなものがあります。
94000130 FFFE0000 //Aボタンで発動 94000130 FFFD0000 //Bボタンで発動 94000130 FFBF0000 //十字キー上で発動 94000130 FF7F0000 //十字キー下で発動 94000130 FEFF0000 //Rボタンで発動 94000130 FDFF0000 //Lボタンで発動
キー判定コードの例をよく見てほしいんですが、後半部分の2~4文字目以外は全て同じコードになっているのが分かると思います。
つまり、キー判定コードのボタンを変更するには『94000130 F(xxx)0000』のxxx部分を変更すればいいわけです。
キー判定コードのボタン割り当て
では、キー判定コードをどのように書けば任意のボタンで発動できるのか解説したいと思います。
下の表から対応するボタンのビットを探して2進数から16進数に変換することで、xxx部分を求めることができキー判定コードも求めることができます。
xxx部分の2進数を求める
押して発動させたいボタンのビットを0、それ以外を1とおきます。
1 | 1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 |
---|---|---|---|---|---|---|---|---|---|---|---|
固定 | 固定 | L | R | ↓ | ↑ | ← | → | START | SELECT | B | A |
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
例えば、Lボタンを押して発動させたいなら『1101 1111 1111』。
STARTボタンとAボタンを同時押しで発動させたいなら『1111 1111 0110』といった具合ですね。
これでxxx部分の2進数を求めることができました。次はこれを16進数に変換します。
xxx部分の16進数を求める
まずはLボタンを押して発動させたい例で見ていきます。
2進数から16進数に変換する際は、2進数を4桁区切りで変換していくと楽です。
『1101 1111 1111』の一番右、1111から見ていきましょう。
変換の方法は以下の通りです。
出てきた値が10以上の場合は以下の文字に置き換えます。
数字 | 置き換える文字 |
---|---|
10 | A |
11 | B |
12 | C |
13 | D |
14 | E |
15 | F |
例の1111の場合は、
15を表から探すとFになります。
つまり、2進数の1111は16進数でいうFになるわけです。
真ん中の1111は同様にFになるので、あとは1101の変換をすればxxx部分を求めることができます。
1101も16進数に変換してみると、
13を表から探すとDになります。
求めた16進数を組み合わせると、xxx部分はDFFと求められます。
最後に、キー判定コード『94000130 F(xxx)0000』の(xxx)をxxx部分のDFFに置き換えると、LボタンをPARコード発動のボタンにできるわけです。
Lボタンを押して発動するにはキー判定コードを『94000130 FDFF0000』にすればよい、となります。
まとめ
キー判定コードを使用して、PARコードが発動するタイミングを制御するには
PARコードをキー判定コードと処理の終了コードとで挟む必要がある。
94000130 FFFB0000 //キー判定コード 02226084 0098967F //前回解説した部分 D2000000 00000000 //キー判定コードで行われる処理がここまで、という合図
キー判定コードによるボタンの割当ては『94000130 F(xxx)0000』の(xxx)に何を書き込むかによって決まり、
割り当てたボタンを0、それ以外を1とし、以下の表から得られた2進数を16進数に変換したものを(xxx)部分に置き換えることで、ボタンにPARコードを割り当てることができる。
1 | 1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 |
---|---|---|---|---|---|---|---|---|---|---|---|
固定 | 固定 | L | R | ↓ | ↑ | ← | → | START | SELECT | B | A |
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
割り当てられるボタンとキー判定コードの対応表は以下の通りである。
ボタン | キー判定コード |
---|---|
Lボタン | 94000130 FDFF0000 |
Rボタン | 94000130 FEFF0000 |
↓ボタン | 94000130 FF7F0000 |
↑ボタン | 94000130 FFBF0000 |
←ボタン | 94000130 FFDF0000 |
→ボタン | 94000130 FFEF0000 |
STARTボタン | 94000130 FFF70000 |
SELECTボタン | 94000130 FFFB0000 |
Bボタン | 94000130 FFFD0000 |
Aボタン | 94000130 FFFE0000 |
応用編
いくつかのボタンを同時押しした際にPARコードを発動させることもできます。
先ほどの表を思い出してみてください。
1 | 1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 | 0or1 |
---|---|---|---|---|---|---|---|---|---|---|---|
固定 | 固定 | L | R | ↓ | ↑ | ← | → | START | SELECT | B | A |
12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
12桁の2進数の中に0を複数含めると、それらのボタン同時押しでPARコードを発動させられます。
例えば、Lボタンと↑ボタンとAボタン同時押しで発動するキー判定コードを作ってみましょう。
Lボタンと↑ボタンとAボタンに対応するビットを0と置くと『1101 1011 1110』となります。
この2進数を16進数に変換するとDBEとなり、これを(xxx)に置き換えると、キー判定コードは『94000130 FDBE0000』となります。
例外
キー判定コードは基本的に上記の手順で求めることができるのですが、例外も存在します。
なぜこのようなコードになるか確かなことが言えないので、分かったら追記します。
例外のキー判定コードは以下の表にまとめておきます。
ボタン | キー判定コード |
---|---|
Xボタンを押した時 | 927FFFA8 FBFF0000 |
Yボタンを押した時 | 927FFFA8 F7FF0000 |
Lボタンのみを押した時 | 94000130 000001FF |
Rボタンのみを押した時 | 94000130 000002FF |
Aボタンのみを押した時 | 94000130 000003FE |
Bボタンのみを押した時 | 94000130 000003FD |
SELECTボタンのみを押した時 | 94000130 000003FB |
STARTボタンのみを押した時 | 94000130 000003F7 |
↓ボタンのみを押した時 | 94000130 0000037F |
↑ボタンのみを押した時 | 94000130 000003BF |
←ボタンのみを押した時 | 94000130 000003DF |
→ボタンのみを押した時 | 94000130 000003FF |
【PARコードの基礎】No.1 - 16進数と仮想アドレス
ゲームの改造コードについてまとめておきます。
ここではニンテンドーDSの改造コードを例に挙げて説明します。
PARコードとは?
PAR(Pro Action Replay)コードとは、
ゲーム機の仮想アドレスに格納されている値を書き換えるためのコードのことです。
で、この仮想アドレスに格納されている値を書き換えると何ができるのか?、というと
一瞬でレベルをカンストさせたり、所持金をMAXにしたりできるわけです。
では、PARコードの一例を見てみましょう。
02226084 0098967F
このコードは、ポケットモンスターBW2において所持金をMAXにするコードです。
空白で前半部分と後半部分に区切られているのが分かると思います。
前半部分の『02226084』は仮想アドレス、
後半部分の『0098967F』は仮想アドレスに格納する値を表しています。
仮想アドレスについては後ほど解説します。
16進数
16進数とは、0~9までの数字とA~Fまでの記号を用いて数値を表現する方法のことです。
詳しくはここで説明すると長くなるので、リンク先の説明などで調べてみてください。
PARコードはDSのものに限らず基本的に16進数で記述されます。
上で挙げたPARコードの一例を見てみましょう。
後半部分の『0098967F』に注目してください。
これはもちろん16進数で記述されているのですが、
これを10進数に変換すると、9999999になります。
仮想アドレス
仮想アドレスとは、プログラムから見たメモリアドレスのことです。
ゲームをプレイ中に変化する数値(レベル、所持金、位置情報etc...)全てに仮想アドレスが割り振られており、
仮想アドレスの中身を書き換えることで、それに対応した数値を変化させることができます。
ちなみに、仮想アドレスはデータの格納場所を示すもの(住所的なもの)なので、
仮想アドレスの数値自体は変更しません。書き換えるのはあくまで仮想アドレスの中身です。
上で挙げたPARコードの例でいくと、
前半部分の『02226084』が仮想アドレスになるのですが、
このPARコードは所持金をMAXにするものでした。
つまり、この『02226084』という仮想アドレスは現在の所持金を格納している場所であり、
この仮想アドレスの数値を後半部分の『0098967F』という値(10進数で9999999)に書き換えることで
現在の所持金をMAXにすることができる、という仕組みになっています。
応用編
仕組みさえ分かってしまえばPARコードを改造することもできます。
元のPARコードは
02226084 0098967F
ですが、逆に所持金を0にしたければ
02226084 00000000
1000円にしたければ
02226084 000003E8
といった感じにPARコードをアレンジすることもできます。
16進数で1000を表すには3E8になるところは要注意。
まとめ
仮想アドレス
ゲーム内のデータを格納しておく場所の情報
PARコード前半部分
仮想アドレスを表す
PARコード後半部分
ゲーム内で書き換えたい数値