DQ3戦闘部分解説9

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

  • SR: $026464 モンスター行動決定
026464PHPPush P Flag
026465PHBPush DB
026466REP #$30m=off(A/M:16b) x=off(X/Y:16b)
026468PEA #$7E7EPush #$7E7E
02646BPLBPull DB
02646CPLBPull DB
02646DLDY #$0000Y=#$0000
026470LDA $23B8,YA=$23B8+Y
026473AND #$00FFA&=#$00FF
026476CMP #$0018A>=#$0018?
026479BCS #$07if(c==on) goto $026482
02647BSTA $2428$2428=A
02647EJSL $C2648BSR: $02648Bモンスター行動決定(個別)
026482INYY++
026483CPY #$0018Y>=#$0018?
026486BCC #$E8if(c==off) goto $026470
026488PLBPull DB
026489PLPPull P Flag
02648ARTLreturn

  • SR: $02648B モンスター行動決定(個別)
02648BPHPPush P Flag
02648CREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02648EPHAPush A
02648FPHXPush X
026490PHYPush Y
026491PHBPush DB
026492PEA #$7E7EPush #$7E7E
026495PLBPull DB
026496PLBPull DB
026497LDX $2428X=$2428
02649AJSL $C2CAD9SR: $02CAD9 引数:1#$2050 引数:2#$0002行動可能か?
0264A2BEQ #$4Eif(z==on) goto $0264F2
0264A4JSL $C2B416SR: $02B416行動主体者が味方かつドラゴラム中かチェック
0264A8BCC #$48if(c==off) goto $0264F2
0264AAJSR $64FASR: $0264FA強襲or逃げる失敗時に各モンスターが行動するか決める
0264ADBCS #$43if(c==on) goto $0264F2
0264AFJSL $C2BE8ASR: $02BE8A 引数:1#$1C生死判定
0264B4BCS #$3Cif(c==on) goto $0264F2
0264B6JSL $C2BE8ASR: $02BE8A 引数:1#$20アストロン残りターン数
0264BBBCS #$31if(c==on) goto $0264EE
0264BDJSL $C2BE8ASR: $02BE8A 引数:1#$16麻痺チェック
0264C2BCS #$2Aif(c==on) goto $0264EE
0264C4JSL $C2CAD9SR: $02CAD9 引数:1#$2047 引数:2#$00FF眠りの深さ取得
0264CCBNE #$20if(z==off) goto $0264EE
0264CEJSL $C2CAD9SR: $02CAD9 引数:1#$2052 引数:2#$0002?
0264D6BNE #$16if(z==off) goto $0264EE
0264D8JSL $C2BE8ASR: $02BE8A 引数:1#$26時間を止めたキャラクターか?
0264DDBCS #$0Fif(c==on) goto $0264EE
0264DFJSL $C2C240SR: $02C240 引数:1#$0E知能パターン取得
0264E4CMP #$0002A==#$0002?神なら行動直前に決める?
0264E7BEQ #$05if(z==on) goto $0264EE
0264E9JSR $6557SR: $026557モンスター行動決定
0264ECBRA #$04goto $0264F2
0264EEJSL $C2B4F1SR: $02B4F1戦闘中キャラクター行動リセット?
0264F2PLBPull DB
0264F3REP #$30m=off(A/M:16b) x=off(X/Y:16b)
0264F5PLYPull Y
0264F6PLXPull X
0264F7PLAPull A
0264F8PLPPull P Flag
0264F9RTLreturn

  • SR: $026557 モンスター行動決定
026557LDX $2428X=$2428
02655AJSL $C2B52DSR: $02B52D戦闘中キャラクター行動情報初期化
02655EJSL $C2C240SR: $02C240 引数:1#$10行動回数取得
026563TAYY=A
026564JSL $C265DASR: $0265DA戦闘行動決定
026568LDA $242AA=$242A
02656BJSL $C2CB70SR: $02CB70 引数:1#$2034 引数:2#$01FF戦闘行動ID指定
026573LDA $2430A=$2430
026576JSL $C2CB70SR: $02CB70 引数:1#$2035 引数:2#$00FEターゲット情報指定
02657ELDA $2470A=$2470
026581JSL $C2CB70SR: $02CB70 引数:1#$204D 引数:2#$00FFモンスターが何番目の行動を使うか
026589DEYY–
02658ABEQ #$4Dif(z==on) goto $0265D9
02658CJSL $C265DASR: $0265DA戦闘行動決定
026590LDA $242AA=$242A
026593JSL $C2CB70SR: $02CB70 引数:1#$2036 引数:2#$01FF戦闘行動ID指定
02659BLDA $2430A=$2430
02659EJSL $C2CB70SR: $02CB70 引数:1#$2037 引数:2#$00FE
0265A6LDA $2470A=$2470
0265A9JSL $C2CB70SR: $02CB70 引数:1#$204E 引数:2#$00FF
0265B1DEYY–
0265B2BEQ #$25if(z==on) goto $0265D9
0265B4JSL $C265DASR: $0265DA戦闘行動決定
0265B8LDA $242AA=$242A
0265BBJSL $C2CB70SR: $02CB70 引数:1#$2038 引数:2#$01FF戦闘行動ID指定
0265C3LDA $2430A=$2430
0265C6JSL $C2CB70SR: $02CB70 引数:1#$2039 引数:2#$00FEターゲット情報指定
0265CELDA $2470A=$2470
0265D1JSL $C2CB70SR: $02CB70 引数:1#$204F 引数:2#$00FFモンスターが何番目の行動を使うか
0265D9RTSreturn

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

(2010-11-04追記)

  • SR: $0264FA 強襲or逃げる失敗時に各モンスターが行動するか決める
0264FAPEA #$23ABPush #$23AB
0264FDPEA #$0030Push #$0030
026500PEA #$7E00Push #$7E00
026503JSL $C9029ESR: $09029ERAM上情報取得
026507BEQ #$1Eif(z==on) goto $026527通常
026509DECA–
02650ABEQ #$1Dif(z==on) goto $026529先制時
02650CDECA–
02650DBEQ #$29if(z==on) goto $026538強襲時
02650FJSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FFグループID取得
026517CMP #$0004A>=#$0004?PC側or格闘場で賭けたモンスター
02651ABCS #$09if(c==on) goto $026525
02651CLDA #$0002A=#$0002
02651FJSL $C0133ESR: $00133E乱数発生 00-A A(1B)
026523BNE #$02if(z==off) goto $026527
026525SECc=on
026526RTSreturn
026527CLCc=off
026528RTSreturn
026529JSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FFグループID取得
026531CMP #$0004A>=#$0004?PC側or格闘場で賭けたモンスター
026534BCC #$EFif(c==off) goto $026525
026536BRA #$EFgoto $026527
026538JSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FFグループID取得
026540CMP #$0004A>=#$0004?PC側or格闘場で賭けたモンスター
026543BCS #$E0if(c==on) goto $026525
026545LDA #$0003A=#$0003
026548PEA #$23ABPush #$23AB
02654BPEA #$0030Push #$0030
02654EPEA #$7E00Push #$7E00
026551JSL $C902E9SR: $0902E9RAM上情報変更
026555BRA #$D0goto $026527

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

02651CLDA #$0002A=#$0003
02651FJSL $C0133ESR: $00133E乱数発生 00-A A(1B)
026523BNE #$02if(z==off) goto $026527

としようかと思います。

コメント

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