2006.05.07
No.008 ボタン判定と加算コードの応用

はじめに
Project-DipStar-はVer3.50で「3コード(加算/減算)」をサポートしましたが、
そのままでは「ゲーム中、常に値が増え続けるだけ」といった用途でしか使えません。
しかし、No.006の最後で紹介したボタン判定コードを応用することで有効活用することができます。

きみのためなら死ねる
※ハード情報によって使用言語が変化する仕組みなので、
エミュレータ上では、日本語版ROMを使用しても英語版として動作します。


さて、上記画像右のゲーム「キンギョ(Gold fish)」ですが、上に10個並ぶレベルゲージに注目。
このパラメータそのものは、DipStar付属のサーチツールhasteDSとDSエミュレータDeSmuMEを使えば、
普通にアドレス0206C87Cに格納されているということが判明します(増減サーチだけで余裕)。

しかし、ここに「どういう値を書き込むのか?」が問題です。

例えば上の画像は「メモリーズ」なのでレベル10ですが、本編の「キンギョ」はレベル3です。
もし常に10に固定したままにすると、超難易度のレベル10に挑戦することになってしまい本末転倒。
しかも、プレイするゲームの種類によっては、一発クリアが条件のものもあるので、
Lv1以上の値ではフリーズしてしまうことも多々あります。
ボタン判定コードを組み合わせて「*ボタンを押したら値*を書き込む」なんてのもアリですが、
ステージクリアに必要なレベルの突破回数はゲームによって様々。
どうせなら「Aボタンを押したらレベル達成の値が1増える」のほうがスマートです。
レベル3であればAボタンを3回、レベル10であればAボタンを10回押す、みたいな感じですね。

どうすれば良いかを考える
まず、Aボタンの判定はNo.006の説明通りにやれば E4000130 100003FE のコードになります。
レベルゲージの値は1バイトで、これを1増やすのであればDipStarの加算コード 30100001 0206C87Cになります。
30100001→3010=バイト加算/01=1増やす)
これを単純に組み合わせると…
E4000130 100003FE
30100001 0206C87C
こんなコードになります。
が、勘のいい人は既に気付いたかもしれませんが、これではうまく作用しません。
マスターコードの定義位置にもよりますが「きみしね」のマスターコード F200FFF8 E12FFF1E は、
キー入力の瞬間に割り込んでいるため、このコードはかなりの頻度で実行されることになります。

メモリーズ「キンギョ」のプレイ中にAボタンを押せばわかりますが、一瞬でゲージがLv10を超え、
限界を超えてそのままフリーズして止まってしまいます。
これでは使い物になりませんね。

そのため「Aボタンを押して1増えた後は、Aボタンを押しっぱなしにしても増えない」ように、
コードを工夫してやる必要があります。

空きメモリを変数として利用し、フラグを制御
DipStarはデフォルトでARM7ユーザ領域であるアドレス02380000のギリギリ手前に常駐していますが、
大抵のゲームはまだまだ空きメモリがたくさん残っています。
まず間違いなくアドレス023FFFF0〜023FFFFFの16バイトは未使用だったりするので、
その辺りの値を利用してみましょう。

まず「ボタンを全く押していないなら、アドレス023FFFF0に1を書き込む」コードを作ります。
E4000130 100003FF
023FFFF0 00000001
要はボタンを押していない間にフラグを立てておくわけです。

次に「多段判定分岐コード」を利用した下記のコードを作ります。
E4000130 100003FE
E23FFFF0 00000001
30100001 0206C87C
これは「Aボタンを押し、なおかつアドレス023FFFF0の値が1であればレベルゲージに1を加算」
という複合的な処理を行うものです。
先ほどの処理で一瞬でもボタンを離してフラグを立てておけば、Aボタンを押すだけでこのコードは実行されます。

そして最後に「Aボタンを押したなら、アドレス023FFFF0に0を書き込む」コードを置きます。
E4000130 100003FE
023FFFF0 00000000
Aボタンを押しっぱなしにするとここでフラグがOFFになります。
初めの処理の「ボタンを押していない」の条件も満たされなくなります。

この7行のコードをこの順番通りに組み合わせると、以下のようなルーチンが成り立ちます。
・何も押さないとフラグが1になりAボタン入力が許可される
・Aボタンを押すとレベルゲージが1増え、フラグが0になる
→Aボタンを押している間はフラグが0のままなのでAボタン入力が許可されない
いわゆる、シューティングゲームのショット発射ルーチンの基礎とも言える制御ですが、
これにより「Aボタンを押すごとにレベルゲージが1増える」という条件を満たすことができます。

@マスターコード
F200FFF8 E12FFF1E
@ゲーム中にAボタンを押すとレベル達成+1
E4000130 100003FF
023FFFF0 00000001
E4000130 100003FE
E23FFFF0 00000001
30100001 0206C87C
E4000130 100003FE
023FFFF0 00000000

さいごに
加減算コードだけでなく、ボタン判定やフラグの概念を応用すれば、無限のパターンの改造コードを作ることができます。
既に解析し尽くしたと思えるゲームでも、少し視点を変えるだけで別のアプローチ方法が見えることもあります。
「頭をやわらかく〜」が本項の教訓ですねぇ。
>>次の講座へ進む