DQ3戦闘部分解説3

今回は戦闘中に各種情報にアクセスするSRを見ていきます。よく出てくるSRは

  • 戦闘行動構造体アクセスSR
  • 固定情報(モンスターの耐性情報など)アクセスSR
  • 戦闘中情報取得/更新SR

です。大概の処理はこれらのSRを駆使すれば事足ります。
(※2016-10-15更新)

dq3-battleimage-003

  • 戦闘中キャラクター情報取得系SR群(結果はAにセット)
アドレス引数1引数2ビットシフトインデックス指定
$02CA5BオフセットX
$02CA62オフセットY
$02CAD9オフセットビットマスクありX
$02CAE0オフセットビットマスクありY
$02CB2Bオフセットビットマスクあり(バグ?)X
$02CB32オフセットビットマスクなしY

ここでいう「ビットシフトの有無」というのは得られた値を右(下位ビット)に寄せるかどうか、ということです。具体的には

  • SR:$027C68 MP切れ・マホトーン・呪いで行動できないか決定する
027CA1JSL $C2CB32SR: $02CB32 引数:1#$2051 引数:2#$0002戦闘中キャラクター情報取得 インデックス:Y(ビットシフトなし)
027CA9BNE #$23if(z==off) goto $027CCEマホトーン中なら動作を変える

このSRをコールして対象がマホトーン中だった場合、Aレジスタには#$0002がセットされて返ってきます。このSRをビットシフトありの$02CAE0に変えると#$0001がセットされて返ってきます。大抵は上記のようにON/OFFのみをチェックしているので問題ありませんが、返ってきた値をみて動作を変えるような場合は注意が必要です。ここで1点問題になるのがXをインデックスにとるSR: $02CAD9とSR: $02CB2Bです。

  • SR:$02CAD9 戦闘中キャラクター情報取得 インデックス:X(ビットシフトあり)
02CAD9PHPPush P Flag
02CADAPHBPush DB
02CADBREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02CADDTXAA=X
02CADEBRA #$05goto $02CAE5
  • SR:$02CB2B 戦闘中キャラクター情報取得 インデックス:X(ビットシフトあり)
02CB2BPHPPush P Flag
02CB2CPHBPush DB
02CB2DREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02CB2FTXAA=X
02CB30BRA #$B3goto $02CAE5実体へのジャンプ先がSR: $02CAD9と同じ

この周辺のSRはインデックスをXに取るSRは実体を持たず、実体はインデックスをYに取るSRの途中に飛ばして無駄な重複を省いています。問題はSR: $02CB2Bの方で、ジャンプ先がビットシフトありのSRの途中になっています。したがって、「インデックスをXに取るSRでビットシフトなしのSRは存在しない」状態になっています。恐らくバグではないかと思いますが、実際にSR: $02CB2Bをコールしている箇所(27箇所)を調べてみましたが、たまたま問題ないケースでした(DQ3 K.MixではこれらのSRの違いを余り意識していなかったのでごちゃ混ぜで使いまくっていました)。どれもON/OFFのチェックでしか使っていないか、ビットマスクがシフトの必要のない#$00FFや#$01FFだったので問題がなかったようです。顕在化はしませんが潜在的なバグとも言えます。

  • 戦闘中キャラクター情報変更系SR群
アドレス引数1引数2ビットシフトインデックス指定セット値
$02CA98オフセットXA
$02CB70オフセットビットマスクありXA
$02CB79オフセットビットマスクありYA
  • 戦闘行動構造体取得系SR群(結果はAにセット)
アドレス引数1引数2インデックス指定
$2CC03オフセットX
$2CC0AオフセットY
$2CC25オフセットビットマスクX
$2CC2CオフセットビットマスクY
$2CC47オフセットビットマスク(3バイトにまたがる場合)X
$2CC4Eオフセットビットマスク(3バイトにまたがる場合)Y

「オフセット」は1レコード目の開始アドレス(2バイト)+オフセットを意味します。例えば戦闘中キャラクター情報の素早さ(オフセット:#$14-)の場合には1レコード目の開始アドレス(7E)2020+0014で2034を指定しています。戦闘行動構造体へのアクセスは拡張パッチとオリジナルで戦闘行動構造体の場所が変わっているのでこの値が異なります。バンク$02には戦闘行動構造体にアクセスしている場所が無数にありますが、その1つ1つを書き換える作業をしたわけで作業をした方(多分86氏)にはマジ感謝です。

戦闘中情報取得/変更については、以前にも載せましたが、他とまとめて再掲します。

  • SR: $02BE8A 戦闘中情報取得/変更($7E2428に対象インデックスがセットされていることが前提)
引数意味
00現HP取得
02現HP変更
04HP加算処理
06HP減算処理
08現MP取得
0A現MP変更
0CMP加算処理
0EMP減算処理
10毒かチェック on:毒 off:毒でない
12毒回復
14毒にする
16麻痺かチェック on:麻痺 off:麻痺でない
18麻痺回復
1A麻痺にする
1C生死判定 on:死亡 off:生きている
1E毒麻痺HP回復?
20アストロン残りターン数取得
22敵味方判定 on:敵 off:味方
24職業ID取得
26時間を止めたキャラクター情報取得
28混乱かチェック on:混乱 off:混乱でない
2A混乱回復
2C混乱にする
2E性別取得

  • SR: $02C240 キャラクター固定情報取得($7E2428に対象インデックスがセットされていることが前提)
引数意味
00最大HP取得
02最大MP取得
04攻撃力取得
06守備力取得
08素早さ取得
0Aレベル取得
0C回避率分子取得
0E知能パターン取得(モンスターのみ有効?)
10行動回数情報取得(モンスターのみ有効?)
12自然回復量取得(モンスターのみ有効?)
14集中攻撃情報取得(モンスターのみ有効?)
16現在の戦闘行動に対応する耐性情報取得

これらのSRは対象がPCであろうがモンスターであろうが有効です。内部で対象のキャラクターの敵味方フラグを見て対応するSR配列を呼び出すことでラップしているため、コールする側ではPCであろうがモンスターであろうが意識する必要がありません。ここは非常によく出来てると思います。

コメント

タイトルとURLをコピーしました