DQ3 まねまね実装3

  • SR: $02DA30 まねまね反撃時の対象情報作成(新SR)
02DA30 JSL $C2CC2C SR: $02CC2C 引数:1#$0075 引数:2#$0003
02DA38 CMP #$0003 A>=#$0003?
02DA3B BCC #$05 if(c==off) goto $02DA42
02DA3D LDA #$0041 A=#$0041
02DA40 BRA #$15 goto $02DA57
02DA42 CMP #$0002 A>=#$0002?
02DA45 BCC #$0D if(c==off) goto $02DA54
02DA47 JSL $C2CB2B SR: $02CB2B 引数:1#$203C 引数:2#$00FF
02DA4F ORA #$0020 Aor=#$0020
02DA52 BRA #$03 goto $02DA57
02DA54 JSR $E659 SR: $02E659
02DA57 STA $23E6 $23E6=A
02DA5A RTS return
  • SR: $02DA0D まねまねで使用するRAM領域の初期化(新SR)
02DA0D LDX #$001E X=#$001E
02DA10 LDA #$FFFF A=#$FFFF
02DA13 STA $2620,X $2620+X=A
02DA16 DEX X–
02DA17 DEX X–
02DA18 BPL #$F9 if(n==off) goto $02DA13
02DA1A RTS return

前回のエントリで重要と書きましたが、完全に解析はできておらず、デバッガでRAM上の値をのぞきながら「これが確からしい」というものでしかありません。反撃する戦闘行動の対象設定値を取得し、3(全体)、2(グループ)、1(敵1体)によって$7E23E4にセットする値を変えています。この値は、戦闘中キャラクター情報($7E2030-)の5バイト目の2-7ビットを1ビット右にシフトしたものと同じです。

もう1つ前回のエントリで説明し忘れたのですが、「SR: $02D907 まねまねによる反撃処理」でまねまねによる反撃処理が終わった後に「SR: $02DA0D まねまねで使用するRAM領域の初期化」を呼んで関連する領域($7E2620-3F)の初期化を行っています。ただ、このままだと、戦闘開始直後に上記の領域が初期化されないので初期化を行う必要があります。

  • SR: $025A56 戦闘中使用RAM領域初期化
025A69 JSR $D7C0 SR: $02D7C0
025A6C-74 NOP
  • SR: $02D7C0 戦闘中使用RAM領域初期化(新SR)
02D7C0 LDA #$FFFF A=#$FFFF
02D7C3 STA $2462 $2462=A
02D7C6 STA $2464 $2464=A
02D7C9 STA $2465 $2465=A
02D7CC JSR $D54F SR: $02D54F
02D7CF JSR $DA0D SR: $02DA0D
02D7D2 RTS return

SR: $025A56は戦闘に入った直後に1回だけ呼ばれる(はず)のSRですが、空き領域がないのでそれっぽい処理と共に別SRで初期化を行っています。

とりあえずこれでまねまねの実装は終わりです。分割して書きづらかったので読むほうも理解しにくいと思われますが、これから改造界に踏み入ろうとする人の助けになればいいなと思います。

現時点で問題が1点あります。PC*1側のエフェクトがもともと存在しない戦闘行動(炎を吐くなど)はエフェクトが何も出ません。解析できればDQ6からエフェクトをコピれればこの部分も問題なくなるでしょう。

実装してから気がついたのですが、この特技(呪文?)はキメラ+はぐれメタルの組み合わせのときに、キメラが炎を吐くとぐれメタルを高確率で仕留められることに気が付きました。コマンドとしてまねまねを選んでいればキメラがはぐれメタルよりも先に炎を吐いてきた場合にははぐれメタルを一網打尽にできます。ドラゴラムのように1ターン待つ必要もないですし、遊び人自体の素早さも関係ありません。思わぬところで遊び人の存在価値が上がりました。

*1:プレイヤーキャラクター