DQ6 AI処理の解析4

前回まででAI行動決定のための準備処理が終わっています。ここからはAIのメイン処理となる各戦闘行動の評価が始まります。

  • SR: $02D191 AI行動決定
02D191JSL $C46CD9SR: $046CD9戦闘参加パーティ人数取得
02D195STA $1ADP($1A)=A
02D197STZ $0CDP($0C)=#$00
02D199LDA $2555A=$2555行動主体の戦闘中インデックス
02D19CASLA<<1
02D19DTAXX=A
02D19ELDA $C2F092,XA=$02F092+X行動主体の戦闘中アドレス開始位置
02D1A2TAXX=A
02D1A3LDA $2052,XA=$2052+X
02D1A6AND #$00F0A&=#$00F0呪文が使える状態か
02D1A9BEQ #$07if(z==on) goto $02D1B2
02D1ABLDA $0CA=DP($0C)
02D1ADORA #$0002Aor=#$0002呪文使用可能フラグON
02D1B0STA $0CDP($0C)=A
02D1B2LDA $204F,XA=$204F+X
02D1B5AND #$00FFA&=#$00FF
02D1B8LDY #$00B4Y=#$00B4山彦の帽子のアイテムID
02D1BBJSL $C45217SR: $045217 引数:1#$FD 引数:2#$07 引数:3#$FF 引数:4#$40アイテム装備チェック
02D1C3BVC #$09if(v==off) goto $02D1CE
02D1C5PHAPush A
02D1C6LDA $0CA=DP($0C)
02D1C8ORA #$0020Aor=#$0020山彦フラグON
02D1CBSTA $0CDP($0C)=A
02D1CDPLAPull A
02D1CEJSL $C45B66SR: $045B66 引数:1#$07 引数:2#$FF 引数:3#$40行動主体者が取りうる戦闘行動の列挙
02D1D5STZ $18DP($18)=#$00
02D1D7JSL $C43488SR: $043488 引数:1#$0EDP($0E)に作戦取得
02D1DCLDA $2011A=$2011
02D1DFAND #$0010A&=#$0010
02D1E2BEQ #$05if(z==on) goto $02D1E9スライム格闘場か
02D1E4LDA #$0005A=#$0005「命令させろ」(コマンド入力は不可)を強制設定
02D1E7STA $0EDP($0E)=A
02D1E9JSL $C2C9D5SR: $02C9D5複数対象攻撃武器による期待ダメージ取得?
02D1EDLDX $18X=DP($18)
02D1EFLDA $48D8,XA=$48D8+X
02D1F2CMP #$0000A==#$0000?
02D1F5BEQ #$06if(z==on) goto $02D1FD
02D1F7STA $255F$255F=A
02D1FAJSR $D2A2SR: $02D2A2対象の戦闘行動の効果値算出?
02D1FDINC $18DP($18)++
02D1FFINC $18DP($18)++
02D201LDA $18A=DP($18)
02D203CMP #$0140A>=#$0140?
02D206BCC #$E5if(c==off) goto $02D1ED
02D208LDA #$0042A=#$0042攻撃
02D20BSTA $255F$255F=A
02D20EJSR $D2A2SR: $02D2A2対象の戦闘行動の効果値算出?
02D211LDA #$0099A=#$0099防御
02D214STA $255F$255F=A
02D217JSR $D2A2SR: $02D2A2対象の戦闘行動の効果値算出?
02D21ALDA $0EA=DP($0E)
02D21CASLA<<1
02D21DASLA<<1
02D21EASLA<<1
02D21FTAXX=A
02D220LDY #$0000Y=#$0000
02D223STZ $04DP($04)=#$00
02D225LDA $260B,YA=$260B+Y各行動種別ごとの最大値取得
02D228STA $00DP($00)=A
02D22ALDA $C2D272,XA=$02D272+X作戦に応じた戦闘行動種別倍加
02D22EAND #$00FFA&=#$00FF
02D231PHXPush X
02D232LDX #$0000X=#$0000
02D235JSL $C00D0CSR: $000D0CDP($00+X)=A(1Byte)*DP($00+X)
02D239PLXPull X
02D23ALDA $02A=DP($02)
02D23CBEQ #$05if(z==on) goto $02D243
02D23ELDA #$FFFFA=#$FFFF#$FFFFでクリップ
02D241STA $00DP($00)=A
02D243LDA $04A=DP($04)
02D245CMP $00A>=DP($00)?
02D247BCS #$10if(c==on) goto $02D259
02D249LDA $262B,YA=$262B+Y
02D24CSTA $258D$258D=A決定された戦闘行動セット
02D24FLDA $263B,YA=$263B+Y
02D252STA $2591$2591=A対象情報をセット
02D255LDA $00A=DP($00)
02D257STA $04DP($04)=A
02D259INXX++
02D25AINYY++
02D25BINYY++
02D25CCPY #$0009Y>=#$0009?なぜ9?
02D25FBCC #$C4if(c==off) goto $02D225
02D261LDA $04A=DP($04)
02D263BNE #$0Cif(z==off) goto $02D271
02D265LDA #$0042A=#$0042
02D268STA $258D$258D=A
02D26BLDA #$0041A=#$0041
02D26ESTA $2591$2591=A
02D271RTSreturn

このSRの中で戦闘行動の列挙→各戦闘行動の評価→補正→最終的な行動の決定を全て行っています。まず、戦闘行動の列挙ですが、呪文・特技のみで使用して効果のあるアイテムは含まれません。AIに任せていると賢者の石や雷鳴の剣は絶対に使われないということです。消費MP0の使い勝手のいい特技が多数あるDQ6では大して問題にはなりませんが、DQ3に移植する際には道具もAIの評価対象に含めるべきでしょう(携帯版やスマホ版はどうなってるかわかりませんが)。PS版以降のDQでは道具も対象に含まれているようなので(確かPS版DQ4は道具を使ってくれたはず)、これはSFC版DQ6特有の動作だと言えます。SFC版DQ5はどうだったか忘れました。

次に列挙した戦闘行動について1つずつ評価を行います。ここでは、各戦闘行動について固有のAI評価用のSRを呼び出し評価を行います。評価の結果はダメージ系以外の戦闘行動でも数値で表されます。便宜上ここでは「効果値」と呼ぶことにします。以前にもチラッと触れましたが、DQ6のAIは各戦闘行動を選択したとしたらどれだけの効果があるかを効果値で表現することでその大小の比較で効果値の高いものを選択するという極めてシンプルなものになっています。各戦闘行動は「行動種別」という値を持っており、それぞれ「ダメージ系」「補助(敵弱体)」「補助(味方強化)」「回復系(ステータス異常回復も含む)」「蘇生系」の5種類に分別されます。ある戦闘行動を評価した結果、すでにセットされている自分の所属する種別の最大効果値と比較し、大きければ差し替える、という処理を繰り返します。これにより全ての選択可能な戦闘行動の評価が終わると各行動種別の最大値がバッファにセットされた状態になります。最後に直接攻撃、防御についても評価を行います(列挙したリストに含まれないため)。

全部の評価が終わったあとは、作戦による各行動種別の補正を行います。一部の戦闘行動については評価中に作戦に応じた特殊な処理が含まれたりしますが、作戦方針によるざっくりとした補正を行います。補正内容は以下のとおり。

ID作戦名ダメージ系補助1*1補助2*2回復系蘇生系
0ガンガン行こうぜx02x00x00x01x00
1みんな頑張れx04x01x03x02x04
2いのち大事にx00x01x02x01x01
3俺に任せろx01x01x01x01x01
4呪文使うなx01x01x02x02x04
5命令させろx01x01x01x01x01

数値は全部倍率です。当然0になっている行動種別は一切実行されません。この補正を行ったあと、効果値が最大になる行動を探して最終的な決定になります。次回からは個別の評価SRの中身を見ていくことにします。

*1:敵弱体

*2:味方強化

コメント

  1. akito より:

    dq3 K.Mix、楽しませてもらっています。
    ちょっとした要望なのですが、ルイーダの酒場で仲間を預ける際にアイテムが自動でふくろに入らないようにできませんか?
    いろいろなキャラを育てながらプレイしているのですが、メンバーを入れ替えるときにうっかり薬草や毒消し草が消えるのが貧乏性な自分は気になってしまいまして。

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