DQ6 AI処理の解析10

今回はスカラ系を見てみます。バイキルト同様数値化が難しいものの、AIの選択肢から外すということは考えられないので解析は避けて通れません。

  • SR: $02DBB2 AI判断用_SR_0014(スカラ)
02DBB2 LDA $0E A=DP($0E)
02DBB4 CMP #$0002 A==#$0002? 作戦が俺に任せろか
02DBB7 BEQ #$21 if(z==on) goto $02DBDA
02DBB9 JSR $DBF1 SR: $02DBF1 モンスターの攻撃力最大値取得
02DBBC STZ $14 DP($14)=#$00
02DBBE LDX #$0017 X=#$0017
02DBC1 LDY #$04AC Y=#$04AC
02DBC4 JSR $DC10 SR: $02DC10 モンスターの攻撃力最大値取得
02DBC7 CMP $14 A>=DP($14)?
02DBC9 BCC #$05 if(c==off) goto $02DBD0
02DBCB STA $14 DP($14)=A
02DBCD STX $2591 $2591=X
02DBD0 TYA A=Y
02DBD1 SEC c=on
02DBD2 SBC #$0034 A-=(#$0034+!c)
02DBD5 TAY Y=A
02DBD6 DEX X–
02DBD7 BPL #$EB if(n==off) goto $02DBC4
02DBD9 RTS return
02DBDA JSR $DBF1 SR: $02DBF1 元の守備力の1/8を取得
02DBDD STZ $14 DP($14)=#$00
02DBDF LDA #$0001 A=#$0001
02DBE2 JSL $C2C3BA SR: $02C3BA 主人公が戦闘に参加しているか(該当c=off)
02DBE6 BCS #$08 if(c==on) goto $02DBF0
02DBE8 STX $2591 $2591=X
02DBEB JSR $DC10 SR: $02DC10 モンスターの攻撃力最大値取得
02DBEE STA $14 DP($14)=A
02DBF0 RTS return
  • SR: $02DBF1 モンスターの攻撃力最大値取得
02DBF1 STZ $00 DP($00)=#$00
02DBF3 LDY #$04AC Y=#$04AC
02DBF6 LDA $2046,Y A=$2046+Y 打撃攻撃脅威値が0ならスキップ(味方なら0?)
02DBF9 BEQ #$0C if(z==on) goto $02DC07
02DBFB LDA $205A,Y A=$205A+Y
02DBFE AND #$03FF A&=#$03FF 攻撃力取得
02DC01 CMP $00 A>=DP($00)?
02DC03 BCC #$02 if(c==off) goto $02DC07
02DC05 STA $00 DP($00)=A
02DC07 TYA A=Y
02DC08 SEC c=on
02DC09 SBC #$0034 A-=(#$0034+!c)
02DC0C TAY Y=A
02DC0D BPL #$E7 if(n==off) goto $02DBF6
02DC0F RTS return
  • SR: $02DC10 元の守備力の1/8を取得
02DC10 LDA $205F,Y A=$205F+Y
02DC13 AND #$0001 A&=#$0001 戦闘に参加していなければスキップ
02DC16 BEQ #$44 if(z==on) goto $02DC5C
02DC18 LDA $204E,Y A=$204E+Y
02DC1B AND #$0007 A&=#$0007
02DC1E CMP #$0006 A>=#$0006? グループIDが味方でなければスキップ
02DC21 BCC #$39 if(c==off) goto $02DC5C
02DC23 LDA $205E,Y A=$205E+Y
02DC26 AND #$0004 A&=#$0004 不明?
02DC29 BNE #$31 if(z==off) goto $02DC5C
02DC2B LDA $2050,Y A=$2050+Y
02DC2E AND #$0002 A&=#$0002 生死判定
02DC31 BNE #$29 if(z==off) goto $02DC5C
02DC33 LDA $2059,Y A=$2059+Y
02DC36 AND #$00C0 A&=#$00C0 マホカンタ・マホターンならスキップ
02DC39 BNE #$21 if(z==off) goto $02DC5C
02DC3B LDA $204E,Y A=$204E+Y
02DC3E AND #$0008 A&=#$0008 守備力が最大ならスキップ
02DC41 BNE #$19 if(z==off) goto $02DC5C
02DC43 LDA $2058,Y A=$2058+Y 現守備力取得
02DC46 LSR A>>1
02DC47 CMP $00 A>=DP($00)? 現守備力の1/2とバッファ中の最大値を比較
02DC49 BCS #$11 if(c==on) goto $02DC5C
02DC4B LDA $204F,Y A=$204F+Y
02DC4E AND #$00FF A&=#$00FF
02DC51 JSL $C45124 SR: $045124 引数:1#$07 引数:2#$FF 引数:3#$FF 元の守備力取得
02DC58 LSR A>>1
02DC59 LSR A>>1
02DC5A LSR A>>1
02DC5B RTS return
02DC5C LDA #$0000 A=#$0000
02DC5F RTS return

要は「スカラを実行することでどれだけダメージを抑えられるか」ということを算出しているようです。DQ6でのダメージ算出式は守備力は1/4されてさらに期待値50%前後の値だったはずなのでモデルとして1/8すればいいということなのだと思います。

コメント

  1. タカオ より:

     色々探しているうちにやっとこのページまでたどり着きました。
     実は暫くぶり新しい遊び方を試みてみようと、ver1.8.0時点で勇者抜いて平均レベル60前後の例えば賢僧呪魔の魔法中心のパーティで「フルオート対ボス戦」を目指したところ、賢者を「いのちだいじに」にいくら指定しても、他の二人以上が黄色表示の瀕死状態でも構わずベホマズンせずに僧侶にバイキルトをかけようとしてしまいます。
     これさえ避けられれば、かなりいい所まで行けるような気がしますが。
     何とかならないものでしょうか…(^^;

    管理者より返信:

    AI導入時のエントリでも書きましたが、現象発生時のSnes9x 1.51でのステートセーブを送ってください。