DQ3戦闘部分解説9

今回は割と重要なモンスター行動の決定部分です。実は自分も真面目に見たことがないので泥縄で理解しながらの投下です。

  • SR: $026464 モンスター行動決定
026464 PHP Push P Flag
026465 PHB Push DB
026466 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
026468 PEA #$7E7E Push #$7E7E
02646B PLB Pull DB
02646C PLB Pull DB
02646D LDY #$0000 Y=#$0000
026470 LDA $23B8,Y A=$23B8+Y
026473 AND #$00FF A&=#$00FF
026476 CMP #$0018 A>=#$0018?
026479 BCS #$07 if(c==on) goto $026482
02647B STA $2428 $2428=A
02647E JSL $C2648B SR: $02648B モンスター行動決定(個別)
026482 INY Y++
026483 CPY #$0018 Y>=#$0018?
026486 BCC #$E8 if(c==off) goto $026470
026488 PLB Pull DB
026489 PLP Pull P Flag
02648A RTL return
  • SR: $02648B モンスター行動決定(個別)
02648B PHP Push P Flag
02648C REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
02648E PHA Push A
02648F PHX Push X
026490 PHY Push Y
026491 PHB Push DB
026492 PEA #$7E7E Push #$7E7E
026495 PLB Pull DB
026496 PLB Pull DB
026497 LDX $2428 X=$2428
02649A JSL $C2CAD9 SR: $02CAD9 引数:1#$2050 引数:2#$0002 行動可能か?
0264A2 BEQ #$4E if(z==on) goto $0264F2
0264A4 JSL $C2B416 SR: $02B416 行動主体者が味方かつドラゴラム中かチェック
0264A8 BCC #$48 if(c==off) goto $0264F2
0264AA JSR $64FA SR: $0264FA 強襲or逃げる失敗時に各モンスターが行動するか決める
0264AD BCS #$43 if(c==on) goto $0264F2
0264AF JSL $C2BE8A SR: $02BE8A 引数:1#$1C 生死判定
0264B4 BCS #$3C if(c==on) goto $0264F2
0264B6 JSL $C2BE8A SR: $02BE8A 引数:1#$20 アストロン残りターン数
0264BB BCS #$31 if(c==on) goto $0264EE
0264BD JSL $C2BE8A SR: $02BE8A 引数:1#$16 麻痺チェック
0264C2 BCS #$2A if(c==on) goto $0264EE
0264C4 JSL $C2CAD9 SR: $02CAD9 引数:1#$2047 引数:2#$00FF 眠りの深さ取得
0264CC BNE #$20 if(z==off) goto $0264EE
0264CE JSL $C2CAD9 SR: $02CAD9 引数:1#$2052 引数:2#$0002 ?
0264D6 BNE #$16 if(z==off) goto $0264EE
0264D8 JSL $C2BE8A SR: $02BE8A 引数:1#$26 時間を止めたキャラクターか?
0264DD BCS #$0F if(c==on) goto $0264EE
0264DF JSL $C2C240 SR: $02C240 引数:1#$0E 知能パターン取得
0264E4 CMP #$0002 A==#$0002? 神なら行動直前に決める?
0264E7 BEQ #$05 if(z==on) goto $0264EE
0264E9 JSR $6557 SR: $026557 モンスター行動決定
0264EC BRA #$04 goto $0264F2
0264EE JSL $C2B4F1 SR: $02B4F1 戦闘中キャラクター行動リセット?
0264F2 PLB Pull DB
0264F3 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
0264F5 PLY Pull Y
0264F6 PLX Pull X
0264F7 PLA Pull A
0264F8 PLP Pull P Flag
0264F9 RTL return
  • SR: $026557 モンスター行動決定
026557 LDX $2428 X=$2428
02655A JSL $C2B52D SR: $02B52D 戦闘中キャラクター行動情報初期化
02655E JSL $C2C240 SR: $02C240 引数:1#$10 行動回数取得
026563 TAY Y=A
026564 JSL $C265DA SR: $0265DA 戦闘行動決定
026568 LDA $242A A=$242A
02656B JSL $C2CB70 SR: $02CB70 引数:1#$2034 引数:2#$01FF 戦闘行動ID指定
026573 LDA $2430 A=$2430
026576 JSL $C2CB70 SR: $02CB70 引数:1#$2035 引数:2#$00FE ターゲット情報指定
02657E LDA $2470 A=$2470
026581 JSL $C2CB70 SR: $02CB70 引数:1#$204D 引数:2#$00FF モンスターが何番目の行動を使うか
026589 DEY Y–
02658A BEQ #$4D if(z==on) goto $0265D9
02658C JSL $C265DA SR: $0265DA 戦闘行動決定
026590 LDA $242A A=$242A
026593 JSL $C2CB70 SR: $02CB70 引数:1#$2036 引数:2#$01FF 戦闘行動ID指定
02659B LDA $2430 A=$2430
02659E JSL $C2CB70 SR: $02CB70 引数:1#$2037 引数:2#$00FE
0265A6 LDA $2470 A=$2470
0265A9 JSL $C2CB70 SR: $02CB70 引数:1#$204E 引数:2#$00FF
0265B1 DEY Y–
0265B2 BEQ #$25 if(z==on) goto $0265D9
0265B4 JSL $C265DA SR: $0265DA 戦闘行動決定
0265B8 LDA $242A A=$242A
0265BB JSL $C2CB70 SR: $02CB70 引数:1#$2038 引数:2#$01FF 戦闘行動ID指定
0265C3 LDA $2430 A=$2430
0265C6 JSL $C2CB70 SR: $02CB70 引数:1#$2039 引数:2#$00FE ターゲット情報指定
0265CE LDA $2470 A=$2470
0265D1 JSL $C2CB70 SR: $02CB70 引数:1#$204F 引数:2#$00FF モンスターが何番目の行動を使うか
0265D9 RTS return

ここまでは枠組みの話で、これといって特筆するべき点はありません。次回は戦闘行動決定の部分を詳しく見ていくことにします。

(2010-11-04追記)

  • SR: $0264FA 強襲or逃げる失敗時に各モンスターが行動するか決める
0264FA PEA #$23AB Push #$23AB
0264FD PEA #$0030 Push #$0030
026500 PEA #$7E00 Push #$7E00
026503 JSL $C9029E SR: $09029E RAM上情報取得
026507 BEQ #$1E if(z==on) goto $026527 通常
026509 DEC A–
02650A BEQ #$1D if(z==on) goto $026529 先制時
02650C DEC A–
02650D BEQ #$29 if(z==on) goto $026538 強襲時
02650F JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF グループID取得
026517 CMP #$0004 A>=#$0004? PC側or格闘場で賭けたモンスター
02651A BCS #$09 if(c==on) goto $026525
02651C LDA #$0002 A=#$0002
02651F JSL $C0133E SR: $00133E 乱数発生 00-A A(1B)
026523 BNE #$02 if(z==off) goto $026527
026525 SEC c=on
026526 RTS return
026527 CLC c=off
026528 RTS return
026529 JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF グループID取得
026531 CMP #$0004 A>=#$0004? PC側or格闘場で賭けたモンスター
026534 BCC #$EF if(c==off) goto $026525
026536 BRA #$EF goto $026527
026538 JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF グループID取得
026540 CMP #$0004 A>=#$0004? PC側or格闘場で賭けたモンスター
026543 BCS #$E0 if(c==on) goto $026525
026545 LDA #$0003 A=#$0003
026548 PEA #$23AB Push #$23AB
02654B PEA #$0030 Push #$0030
02654E PEA #$7E00 Push #$7E00
026551 JSL $C902E9 SR: $0902E9 RAM上情報変更
026555 BRA #$D0 goto $026527

ここで注目すべきは$02651Cから$026524の部分です。この実装により、強襲時or逃走失敗時にモンスターが行動する確率は2/31/3になっています。例えば$026523をF0 02に変えると、これが2/3となり、逃走失敗時に攻撃されるリスクが倍になります。FC版ではどうなっていたのかわかりませんが、1/3はちょっと低すぎでは、と思います。3体いても攻撃してくるのは平均1体しかいないわけで、逃げる連発でも何とかなってしまう可能性が高いと思われます。この実装ではDQ2であったような「ドラゴンフライ4体に先制されて炎吐きまくられて何もできないうちに全滅」という悲劇は起こりようがなさそうです。自分の中の感触では、3/4くらいが妥当な気がするので、

02651C LDA #$0002 A=#$0003
02651F JSL $C0133E SR: $00133E 乱数発生 00-A A(1B)
026523 BNE #$02 if(z==off) goto $026527

としようかと思います。