DQ6戦闘部分解説9

相当サボっていますがとりあえずあまりネタを考えるのに頭を使わなくていいところから作業をしていきます。というわけで前回の続き、戦闘コマンド入力「たたかう」を見ていきます。

dq6戦闘画面

  • SR:$0238BB 戦闘コマンド処理_SRアドレス_戦う
0238BBJSL $C42B1CSR: $042B1C 引数:1#$01 引数:2#$FFパーティ人数取得
0238C1PHAPush A
0238C2LDY #$0000Y=#$0000
0238C5JSL $C2BB34SR: $02BB34戦闘中キャラクターIDから通常キャラクターIDへ変換
0238C9STX $258B$258B=X
0238CCJSR $3965SR: $023965コマンド入力の必要があるか(ないc=on)
0238CFBCS #$55if(c==on) goto $023926
0238D1JSL $C2CAC6SR: $02CAC6
0238D5STY $386E$386E=Y
0238D8LDA #$00DAA=#$00DA戦闘コマンド入力のウィンドウID
0238DBJSL $C37236SR: $037236ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
0238DFBCS #$4Eif(c==on) goto $02392F
0238E1LDX $258BX=$258B
0238E4JSL $C2C331SR: $02C331
0238E8LDX #$000AX=#$000A
0238EBLDA $3874A=$3874
0238EECMP $C2394D,XA==$02394D+X?
0238F2BEQ #$06if(z==on) goto $0238FA
0238F4DEXX–
0238F5DEXX–
0238F6BPL #$F6if(n==off) goto $0238EE
0238F8BRA #$FEgoto $0238F8
0238FAJSR $3959SR: $($023959+X)戦闘コマンド各種処理
0238FDBCC #$06if(c==off) goto $023905
0238FFJSL $C3B0B9SR: $03B0B9ウィンドウ消去(フェードなし)
023903BRA #$DAgoto $0238DF
023905LDX $258BX=$258B
023908JSL $C2EFA7SR: $02EFA7 引数:1#$2052 引数:2#$0002混乱中かチェック
023910BEQ #$14if(z==on) goto $023926
023912LDA #$8198A=#$8198混乱していたら「行動直前に戦闘行動を決定」の戦闘行動・対象値に差し替え
023915JSL $C2EF6BSR: $02EF6B 引数:1#$2034
02391BLDA #$0000A=#$0000
02391EJSL $C2F034SR: $02F034 引数:1#$2061 引数:2#$0080
023926INYY++
023927TYAA=Y
023928CMP $01,SA>=Stack($01)?
02392ABCC #$99if(c==off) goto $0238C5
02392CPLAPull A
02392DCLCc=off
02392ERTSreturn
02392FDEYY–戦闘コマンドキャンセル時の処理
023930BMI #$18if(n==on) goto $02394A
023932JSL $C2BB34SR: $02BB34戦闘中キャラクターIDから通常キャラクターIDへ変換
023936STX $258B$258B=X
023939JSR $3965SR: $023965コマンド入力の必要があるか(ないc=on)
02393CBCS #$F1if(c==on) goto $02392F
02393EDEC $38B0$38B0–
023941LDA $38B0A=$38B0
023944JSL $C3B4F9SR: $03B4F9指定ページ以上の深さのバッファクリア
023948BRA #$87goto $0238D1
02394APLAPull A
02394BSECc=on
02394CRTSreturn

基本的にはパーティ人数を取得し、コマンド入力の必要があるかどうかを判断し、必要がなければスキップするというループを人数分繰り返しています。$02392F-以降の処理は戦闘コマンド入力ウィンドウでキャンセルをおした時の処理です。1つ前に戻るわけですが、死人などコマンド入力のひつようのないキャラクターをスキップするということをやっています。Yが#$FFFFになったら一番先頭ということなので1つ前のウィンドウに戻ります。

  • SR:$02C197 AI行動決定の必要があるか(ないc=on)
02C197PHPPush P Flag
02C198REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02C19APHAPush A
02C19BPHXPush X
02C19CPHYPush Y
02C19DPHBPush DB
02C19EPEA #$7E7EPush #$7E7E
02C1A1PLBPull DB
02C1A2PLBPull DB
02C1A3LDX $258BX=$258B
02C1A6JSL $C2EFA7SR: $02EFA7 引数:1#$204E 引数:2#$0007グループIDを収得
02C1AECMP #$0006A>=#$0006?PC側でなければスキップ
02C1B1BCC #$30if(c==off) goto $02C1E3
02C1B3JSL $C2EFA7SR: $02EFA7 引数:1#$204F 引数:2#$00FFキャラクターID取得
02C1BBJSL $C45D7ASR: $045D7A 引数:1#$FF 引数:2#$FF
02C1C1CMP #$0002A==#$0002?
02C1C4BEQ #$1Dif(z==on) goto $02C1E3
02C1C6JSL $C2EFF4SR: $02EFF4 引数:1#$2052 引数:2#$0004ドラゴラム中ならスキップ
02C1CEBNE #$13if(z==off) goto $02C1E3
02C1D0JSL $C2EFF4SR: $02EFF4 引数:1#$2053 引数:2#$0020名前がもどき中ならスキップ
02C1D8BNE #$09if(z==off) goto $02C1E3
02C1DAPLBPull DB
02C1DBREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02C1DDPLYPull Y
02C1DEPLXPull X
02C1DFPLAPull A
02C1E0PLPPull P Flag
02C1E1CLCc=off
02C1E2RTLreturn
02C1E3PLBPull DB
02C1E4REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02C1E6PLYPull Y
02C1E7PLXPull X
02C1E8PLAPull A
02C1E9PLPPull P Flag
02C1EASECc=on
02C1EBRTLreturn

このSRはAI行動決定の際にも使用されていて他でも何箇所かで使われています。よくわからないのは$02C1BB-C4あたりで、恐らく「PC情報の何か」を参照しているようですが、全てのキャラクターで値が2のキャラクターは存在しないので事実上意味ありません。

  • SR:$023965 コマンド入力の必要があるか(ないc=on)
023965PHYPush Y
023966JSL $C2C197SR: $02C197 AI行動決定の必要があるか(ないc=on)
02396ABCS #$59if(c==on) goto $0239C5
02396CJSL $C42C26SR: $042C26 引数:1#$01 引数:2#$FD 引数:3#$FF
023973CMP #$0001A==#$0001?キャラクターIDが主人公ならステータス判断部分に強制ジャンプ
023976BEQ #$0Aif(z==on) goto $023982
023978JSL $C43488SR: $043488 引数:1#$FF作戦取得
02397DCMP #$0005A==#$0005?さくせんが「めいれいさせろ」以外ならコマンド入力の必要なし
023980BNE #$3Fif(z==off) goto $0239C1
023982LDX $258BX=$258B
023985JSL $C2E4DCSR: $02E4DC 引数:1#$18戦闘中情報取得/変更 死んでいたらスキップ
02398ABCS #$39if(c==on) goto $0239C5
02398CJSL $C2EFA7SR: $02EFA7 引数:1#$2050 引数:2#$0008麻痺中ならスキップ
023994BNE #$2Bif(z==off) goto $0239C1
023996JSL $C2EFA7SR: $02EFA7 引数:1#$2050 引数:2#$00E0眠っていたらスキップ
02399EBNE #$21if(z==off) goto $0239C1
0239A0JSL $C2EFA7SR: $02EFA7 引数:1#$2055 引数:2#$00C0休み中ならスキップ
0239A8BNE #$17if(z==off) goto $0239C1
0239AAJSL $C2EFA7SR: $02EFA7 引数:1#$2056 引数:2#$0080精霊の歌を歌っている最中ならスキップ
0239B2BNE #$0Dif(z==off) goto $0239C1
0239B4JSL $C2EFA7SR: $02EFA7 引数:1#$205D 引数:2#$0080パルプンテによる凍りつき中ならスキップ
0239BCBNE #$03if(z==off) goto $0239C1
0239BEPLYPull Y
0239BFCLCc=off
0239C0RTSreturn
0239C1JSL $C2C2F5SR: $02C2F5知能が神の場合の戦闘行動決定
0239C5PLYPull Y
0239C6SECc=on
0239C7RTSreturn

この辺はお約束というか、行動不能フラグを1個ずつ見ていってどれかに該当していたらコマンド入力はなし、というだけです。この辺は基本的な部分なのでこれといっていじるような場所でもないので「そういうもの」という理解でいいと思います。

  • SR:$02C2F5 知能が神の場合の戦闘行動決定
02C2F5PHPPush P Flag
02C2F6REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02C2F8PHAPush A
02C2F9PHXPush X
02C2FAPHYPush Y
02C2FBPHBPush DB
02C2FCPEA #$7E7EPush #$7E7E
02C2FFPLBPull DB
02C300PLBPull DB
02C301LDX $258BX=$258B
02C304JSL $C2C331SR: $02C331行動情報リセット
02C308JSL $C2E7DBSR: $02E7DB 引数:1#$04行動回数決定
02C30DTAYY=AYが0になるまでセットし続ける
02C30ELDA #$8198A=#$8198「行動直前に戦闘行動を決定」の戦闘行動・対象値
02C311JSL $C2EF6BSR: $02EF6B 引数:1#$2034戦闘中キャラクター情報変更 インデックス:X
02C317DEYY–
02C318BEQ #$0Fif(z==on) goto $02C329
02C31AJSL $C2EF6BSR: $02EF6B 引数:1#$2036戦闘中キャラクター情報変更 インデックス:X
02C320DEYY–
02C321BEQ #$06if(z==on) goto $02C329
02C323JSL $C2EF6BSR: $02EF6B 引数:1#$2038戦闘中キャラクター情報変更 インデックス:X
02C329PLBPull DB
02C32AREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02C32CPLYPull Y
02C32DPLXPull X
02C32EPLAPull A
02C32FPLPPull P Flag
02C330RTLreturn

「知能が神の場合の戦闘行動決定」の「神」というのは要は「行動直前に戦闘行動を決められる」キャラクターのことです。モンスター側は「人間」「バカ」があるのでこういう呼び名になっているようです。PC側のAIはすべて直前に行動を決めているので全員神扱いです。

  • SR:$02E8C6 PC側固定情報取得SR_SR_0002(行動回数決定)
02E8C6JSL $C45DE4SR: $045DE4 引数:1#$FD 引数:2#$FFAI時行動回数設定を取得
02E8CCCMP #$0000A==#$0000?1回
02E8CFBNE #$02if(z==off) goto $02E8D3
02E8D1INCA++
02E8D2RTSreturn
02E8D3DECA–
02E8D4BNE #$09if(z==off) goto $02E8DF1~2回
02E8D6JSL $C00E97SR: $000E97
02E8DAAND #$0001A&=#$000150%の確率で2回行動
02E8DDINCA++
02E8DERTSreturn
02E8DFDECA–2回行動
02E8E0BNE #$03if(z==off) goto $02E8E5
02E8E2INCA++
02E8E3INCA++
02E8E4RTSreturn
02E8E5INCA++3回行動は強すぎるのでボツ?
02E8E6INCA++
02E8E7RTSreturn

SR: $02E7DBは最終的にはこのSRを呼び出します。各キャラクターのAI行動時の行動回数情報を取得し、行動回数を決定します。行動回数1~2回のキャラ(キラーマシン2だけ)は50%の確率で2回行動をすることがわかります。2ビット使って3パターンしかないのでもう1パターン追加するのは比較的簡単そうです。いじるなら2回行動の確率を33%にするとか、66%にするとかでしょうか。そもそもAIのほうが有利な行動をするというのはどうかと思うんですが(誰もマニュアルを使わなくなるので)、DQ6では個別作戦指定ができないのと、戦闘中使用して効果のある道具を使ってくれないのであっという間にMPが枯渇するくらいがデメリットと言えなくもないのですが、もうちょっと何とかしたい部分ではあります。

スポンサーリンク

コメント

  1. 匿名 より:

    レベルに依存して2回行動の確率があがっていくとか面白そうです

    管理者より返信:

    それもありでしょうね。オリジナルでは1~2回攻撃をするのはキラーマシン2しかいませんが、レベル上限の高い弱めの(笑)仲間に対しても適用すれば2回攻撃が発生する率がそっちの方が高い、という状況を作れていいかもしれません。

  2. 匿名 より:

    敵モンスターにもレベル設定されてるみたいなのでいろいろ強弱つけれそうですね

    管理者より返信:

    上記の部分はPC側の話なので、モンスター側の行動回数決定はまた別の箇所にあるはずです。まだ調べていませんが。恐らく1~2回行動は同じように1/2の確率で決めてると思います。レベルによる回数判定の変化をモンスター側にも導入するというのは、モンスター側、PC側を統一するという意味ではいいかもしれませんが、労力に見合う目に見える差が実感できるかが疑問です。

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。