update 2004.08.15

Chankast 改造コードサーチ講座 第3回
〜Dコードを用いた判定と、キー入力によるコード発動〜


概要
今回は、「ステータス最大でラクラク♪」といった単純なパラメータ書き換えではなく、
メモリエリアを判定し、その内容によってコードを実行する…条件付きコードを説明します。

準備
今回は以下のツールを使用します。
・DBxSTAND たにしげ師匠作のプロセスメモリエディタ
・ChanCalc ChankastのメモリアドレスをDreamCastの実アドレスに変換します
・DreamHacker スクリプト型の改造コード実行ツール
プロセスメモリエディタにはDBxSTANDを用いていますが、基本的に「何でもOK」です。
Googleでメモリエディタとでも検索すればいくつかヒットするでしょう。
ただし、サーチ範囲を指定できるものが理想です。

ターゲット 機動戦士ガンダム 連邦VSジオンDX

前回の講座と同じく、再び連ジDXを対象に説明します。
当然、あらかじめ
・Chankastで連ジDXを開始してChanCalcで基本アドレスを取得。
・DBxSTANDで基本アドレスから始まるサーチ領域の確保
の作業を済ませておいてください。
(その手順については講座 第1回を参照してください)。

そして題材はDコードを用いて、Rトリガを押すと敵軍を撃破です。

そもそもDコードとは?

例えば、HPや所持金といったパラメータは多いに越したことは無いので、
基本的には常にMAX値を書き込み続けても問題は無いのですが、
レースゲームで常に速度をMAXにしてしまうとカーブが曲がれず激突してしまったり、
RPGでダメージをMAXにすると倒してはいけない敵を倒すことでシナリオがバグったりします。

このような現象を回避するために「ある一定の条件を満たす(満たさない)時にだけ発動」
させることが可能なDコードを用います。

作業1 増減サーチを行う

まず、アーケードで適当なシナリオを選択してメイン画面(戦闘)まで進みます。
DBxSTANDを開き、サーチ方式でラジオボタン「2BYTE長」をチェックしてから新規[N]を押して、
サーチエリアのパラメータ情報を記録します(ここまでは前回とほとんど同じ作業ですね)。

続いて、敵モビルスーツを破壊して敵軍の戦力ゲージを下げてDBxSTANDの減少[-]を実行。
さらに破壊して減少[-]を実行、また、再び戦闘を始めて増加[+]を実行することで、
どんどん候補を絞ってゆきましょう。

基本アドレス017F0000でサーチした場合、アドレス01BC17FCと01BC17FEが残ります。
01BC17FCの値を減らすと画面内では敵軍の戦力ゲージの色が変化し、それに合わせて
01BC17FEの値も変化するような仕組みになっていました。
つまり前者が戦力ゲージ、後者が戦力ゲージとの差を表しているわけですね。
戦力ゲージが減る様子

上記のアドレスをChanCalcでDCの実アドレスに変換すると、
それぞれアドレス003D17FCと003D17FEであることが判明します。
変換

キー入力情報の取得

コードの要とも言える「Rトリガを押すと〜」のサーチです。
何故Rトリガというと、単純にこのゲームでは押しても特に何も起こらないからですね。
基本的には複数ボタン同時押しや、空いたボタンに機能拡張するのが理想です。
(例えば、ブレーキにブーストボタンを割り当てたりすると、激しく不便で仕方ありません)。

さて、このキーコードのサーチ方法ですが、実は特に難しいことはありません。
「押してない状態でサーチ、押してサーチ・・・」と入力の有無をひたすら調べるだけです。
コツとしては「パッドのボタンを押したままPause」することで、キー入力状態をキープしたまま、
エミュレーションを停止できますので、その間にDBxSTANDでパラメータをサーチします。
そんな感じで絞り込んでゆくと・・・
キー入力サーチ

上画像のような個所がヒットします。
他にも「ゲーム独自のキー情報格納個所」と思われる場所は残るのですが、ここが一番目につきました。
Dreamcast ControllerSEGA ENTERPRISES,LTD.など、あくまで予想ですが、
メーカー標準入力ライブラリの構造体の可能性がありますね。

なお、Lトリガを押せば画像の黄色い個所(Rトリガ)のすぐ右のアドレス01BA850BにFFが入り、
他のボタンを押すと01BA8508〜01BA8509のFFFFの値が変化します。
そして「これと全く同じデータ列が他のゲームにもあります」
全てのゲームを調べたというわけではないのですが、
同じライブラリを使っているゲームには必ず存在していると思われます。
逆を言えばDreamcast Controllerなどのサーチ単語でこの構造体を探し出すことで、
いちいちキー入力を調べることなく、簡単にキーコードを得ることができるわけですね。

閑話休題、それではこの該当アドレスをChanCalcで実アドレスに変換しましょう。
これによってRトリガの入力がアドレス 003B850Aということが判明します。

DreamHacker用の改造コードを作る

「Rトリガを押すことで敵軍を撃破」
これを数値の動きとして表すなら、
「アドレス003B850AがFFのときに、アドレス003D17FCに00000000を書き込む」
という内容になります。
アドレス003D17FCに00000000を書き込むのは、アドレス003D17FEにも0000を書き込むためですね。
これをDreamHacker形式の改造コードで記述すると以下のようになります。

/連邦VSジオンDXの改造コード
*Rトリガを押すと敵軍撃破
D03B850A FF
003D17FC 00000000

見たまんまなのですが、アドレス003B850AがFFかどうかを判断するには、
アドレス部の頭を0→Dに変えるだけです(これがDコードの名前の理由ですね)。
これにより「もしアドレス003B850AがFFならば次の行を実行する」という動作になり、
次の行…つまり、敵軍の戦力ゲージを0に書き換えるということですね。

また、このDコードは重ねて使うこともできます。
例えば自軍の主武装の残弾はアドレス003D1F28に格納されていますが、
これが全く無い状態でのみ使えるようにするなら・・・

/連邦VSジオンDXの改造コード
*主武装の残弾0のときRトリガを押すと敵軍撃破
D03D1F28 0000
D03B850A FF
003D17FC 00000000

このようなコードになります。

おまけ ドリームキャストのキー入力コード一覧

該当するアドレスはゲームごとに異なりますが、値は一緒です。
文字列 Dreamcast Controller をサーチして、該当した位置を 0E として、
以下の表を参照してアドレスを算出するとよいでしょう。

キーコード格納データ列の構造
XX XX XX XX XX XX XX XX 00 01 02 03 04 05 XX XX
XX XX XX XX XX XX D  r  e  a  m  c  a  s  t    
C  o  n  t  r  o  l  l  e  r  XX XX XX XX XX XX

簡易キーコードリスト
位置内容
00 デジタルXY軸(EF=上 / DF=下 / BF=左 / 7F=右)
F7=START / FD=Bボタン / FB=Aボタン
01FB=Xボタン / FD=Yボタン
02Rトリガ(00=OFF / 01=ON)
03Lトリガ(00=OFF / 01=ON)
04アナログX軸(00=左 〜 80=ニュートラル 〜 FF=右)
05アナログY軸(00=上 〜 80=ニュートラル 〜 FF=下)
0E文字列 "Dreamcast Controller"

上リストの00〜01の16ビット間の詳細データ
ビット(00-01)内容
11111111 11111111ニュートラル
11111101 11111111Bボタン
11111011 11111111Aボタン
11110111 11111111START
11101111 11111111デジタルY-(上)
11011111 11111111デジタルY+(下)
10111111 11111111デジタルX-(左)
01111111 11111111デジタルX+(右)
11111111 11111011Xボタン
11111111 11111101Yボタン
これらのビット値は同時押しすると論理積(AND)で処理される。
(例)A/Bボタン同時押し
 11111101(FD)
&11111011(FB)
=11111001(F9)
こんなかんじですね。

さいごに

一見難しいですが、実際には全く複雑なことはしていません。
ただ、理解できれば改造コードのバリエーションが膨らみますので、ぜひとも身につけてくださいませませ。


TOPに戻る