【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から見ていきましょう。

変換の方法は以下の通りです。



8*{左から1つ目の数字}+4*{左から2つ目の数字}+2*{左から3つ目の数字}+{左から4つ目の数字}


出てきた値が10以上の場合は以下の文字に置き換えます。

数字 置き換える文字
10 A
11 B
12 C
13 D
14 E
15 F

例の1111の場合は、


8*1+4*1+2*1+1=15

15を表から探すとFになります。

つまり、2進数の1111は16進数でいうFになるわけです。

真ん中の1111は同様にFになるので、あとは1101の変換をすればxxx部分を求めることができます。

1101も16進数に変換してみると、


8*1+4*1+2*0+1=13

13を表から探すとDになります。

求めた16進数を組み合わせると、xxx部分DFFと求められます。

最後に、キー判定コード『94000130 F(xxx)0000』の(xxx)をxxx部分のDFFに置き換えると、LボタンをPARコード発動のボタンにできるわけです。

Lボタンを押して発動するにはキー判定コードを『94000130 FDFF0000』にすればよい、となります。

2進数から16進数の変換をもっと簡単に行うには...?

上記の手順で進数から16進数の変換を行うのは面倒だという方はプログラマー電卓などを使用すると変換が簡単に行えます。

ここではプログラマー電卓の説明は省きますが、以下のサイトに使い方は乗ってます。

faq.nec-lavie.jp

まとめ

キー判定コードを使用して、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