DQ6 AI処理の解析9

マヌーサ・マホトーンなどの補助呪文の他に戦闘中重要なのはバイキルト・スカラ系・ルカニ系・フバーハ・マジックバリアなどがあります。DQ3に移植する際にマジックバリア以外は避けて通れないので解析にかなり手間がかかりました。このへんになってくるとどう数値化したもんかというのが問題になってきます。

  • SR: $02DDDF AI判断用_SR_0019(バイキルト)
02DDDFSTZ $14DP($14)=#$00
02DDE1LDX #$0017X=#$0017最終インデックス
02DDE4LDY #$04ACY=#$04AC最終インデックス開始オフセット
02DDE7STZ $04DP($04)=#$00
02DDE9LDA $205F,YA=$205F+Y
02DDECAND #$0001A&=#$0001戦闘に参加していなければスキップ
02DDEFBEQ #$6Cif(z==on) goto $02DE5D
02DDF1LDA $204E,YA=$204E+Y
02DDF4AND #$0007A&=#$0007
02DDF7CMP #$0006A>=#$0006?グループIDがモンスター側ならスキップ
02DDFABCC #$61if(c==off) goto $02DE5D
02DDFCLDA $205E,YA=$205E+Y
02DDFFAND #$0004A&=#$0004条件不明
02DE02BNE #$59if(z==off) goto $02DE5D
02DE04LDA $2050,YA=$2050+Y
02DE07AND #$0002A&=#$0002生死判定
02DE0ABNE #$51if(z==off) goto $02DE5D
02DE0CLDA $2059,YA=$2059+Y
02DE0FAND #$00C0A&=#$00C0マホカンタ・マホターン
02DE12BNE #$49if(z==off) goto $02DE5D
02DE14LDA $2050,YA=$2050+Y
02DE17AND #$0008A&=#$0008マヒ
02DE1ABNE #$41if(z==off) goto $02DE5D
02DE1CLDA $204E,YA=$204E+Y
02DE1FAND #$0020A&=#$0020バイキルト
02DE22BNE #$39if(z==off) goto $02DE5D
02DE24LDA $2052,YA=$2052+Y
02DE27AND #$00F0A&=#$00F0マヌーサ中
02DE2ABNE #$31if(z==off) goto $02DE5D
02DE2CLDA $2052,YA=$2052+Y
02DE2FAND #$0002A&=#$0002混乱
02DE32BNE #$29if(z==off) goto $02DE5D
02DE34LDA $2050,YA=$2050+Y
02DE37AND #$00E0A&=#$00E0眠り
02DE3ABNE #$21if(z==off) goto $02DE5D
02DE3CLDA $0EA=DP($0E)
02DE3ECMP #$0002A==#$0002?作戦が俺に任せろなら主人公のみ対象
02DE41BNE #$0Bif(z==off) goto $02DE4E
02DE43LDA $204F,YA=$204F+Y
02DE46AND #$01FFA&=#$01FF
02DE49CMP #$0101A==#$0101?
02DE4CBNE #$0Fif(z==off) goto $02DE5D
02DE4ELDA $205A,YA=$205A+Y
02DE51AND #$03FFA&=#$03FF攻撃力取得
02DE54CMP $04A>=DP($04)?
02DE56BCC #$05if(c==off) goto $02DE5D
02DE58STA $04DP($04)=A攻撃力最大値をセット
02DE5ASTX $2591$2591=X対象のインデックスを保存
02DE5DTYAA=Y
02DE5ESECc=on
02DE5FSBC #$0034A-=(#$0034+!c)
02DE62TAYY=A
02DE63DEXX–
02DE64BPL #$83if(n==off) goto $02DDE9
02DE66LDA $04A=DP($04)最大攻撃力が0なら該当者なし
02DE68BEQ #$4Fif(z==on) goto $02DEB9
02DE6AJSL $C2E939SR: $02E939 引数:1#$00ターゲット情報セット(戦闘参加者かつ生者のみ)
02DE6FJSL $C2E966SR: $02E966 引数:1#$06ターゲット情報セット(リストアップ済みから味方側を抜く)
02DE74LDA $04A=DP($04)
02DE76LSRA>>1
02DE77LSRA>>1
02DE78PHAPush A
02DE79LDA $04A=DP($04)
02DE7BASLA< <1
02DE7CSECc=on
02DE7DSBC $01,SA-=(Stack($01)+!c)
02DE7FSTA $01,SStack($01)=A
02DE81PLAPull A最大攻撃力の1.75倍の値を作る
02DE82JSL $C2E966SR: $02E966 引数:1#$38ターゲット情報セット(リストアップ済みから最大攻撃力1.75倍より守備力が多いものを抜く)
02DE87LDA $04A=DP($04)
02DE89JSL $C2E966SR: $02E966 引数:1#$60ターゲット情報セット(リストアップ済みから最大攻撃力よりHPが少ないものを抜く)
02DE8ELDA $00A=DP($00)
02DE90ORA $02Aor=DP($02)
02DE92BEQ #$25if(z==on) goto $02DEB9該当するモンスターがいなければ終わり
02DE94LDY #$0000Y=#$0000
02DE97LSR $02DP($02)>>1
02DE99ROR $00DP($00)>>1
02DE9BBCC #$0Dif(c==off) goto $02DEAA
02DE9DLDA $204A,YA=$204A+Y条件に該当したモンスターの脅威値合計を加算する
02DEA0CLCc=off
02DEA1ADC $14A+=(DP($14)+c)
02DEA3BCC #$03if(c==off) goto $02DEA8
02DEA5LDA #$FFFFA=#$FFFFオーバーフロー調整
02DEA8STA $14DP($14)=A
02DEAATYAA=Y
02DEABCLCc=off
02DEACADC #$0034A+=(#$0034+c)1戦闘中キャラクター分のアドレスを加算
02DEAFTAYY=A
02DEB0CMP #$04ADA>=#$04AD?最終インデックスのアドレスオフセットまで続ける
02DEB3BCC #$E2if(c==off) goto $02DE97
02DEB5LSR $14DP($14)>>1
02DEB7LSR $14DP($14)>>1作成した脅威値を1/4する
02DEB9RTSreturn

補助系の呪文の問題点は「数値化が難しい」という一点につきます。もちろんいかようにでも実装は可能ですが、「はたして算出された効果値が妥当か」どうかでやたらと連発するようになったり、逆に全く実行してくれなかったりということになります。上のSRの流れはおおまかに言うと以下のようになっています。

  1. バイキルトをかけて意味のある((すでにバイキルトがかかっている、生きている、麻痺っていない、マヌーサにかかっていないなどの条件判断をする))味方のうちの最大攻撃力(とインデックス)を探す
  2. モンスター側のリストアップ(ターゲット情報セットSRを使う)
  3. 1で取得した最大攻撃力の1.75倍より守備力が大きいモンスターをリストから消す
  4. 1で取得した最大攻撃力の2倍よりHPが小さいモンスターをリストから消す
  5. 残ったモンスターの脅威値合計を合算し、1/4する

1では「おれにまかせろの場合には主人公のみを対象にする」という作戦別の特殊な処理が練りこまれています。正直3と4はなぜそういう判断になっているのか不明ですが、要は「バイキルトをかけて効果のあるモンスターだけを残す」を意図しているようです。3についてはDQ6のバイキルトは「ダメージ値を2倍」するものなので、守備力が高過ぎるモンスターに対しては意味がありません(ダメージ0を2倍しても0)。なので守備力が高すぎる場合には条件から外すということのようです。4についてはHPが低ければ長期戦にならないのですぐ倒せるという想定のもとバイキルトをかけるまでもないということで条件から外すということのようです。最後の5の1/4は補助系ということもあって効果値を控え目にするということなのでしょう。DQ3に移植する際はアレンジして意味があるとも思えないので((そのまま移植すれば文句もあるまいという))、バイキルトに関しては何も考えずこのまま移植することにしました。

コメント

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