今回はスカラ系を見てみます。バイキルト同様数値化が難しいものの、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すればいいということなのだと思います。
コメント
色々探しているうちにやっとこのページまでたどり着きました。
実は暫くぶり新しい遊び方を試みてみようと、ver1.8.0時点で勇者抜いて平均レベル60前後の例えば賢僧呪魔の魔法中心のパーティで「フルオート対ボス戦」を目指したところ、賢者を「いのちだいじに」にいくら指定しても、他の二人以上が黄色表示の瀕死状態でも構わずベホマズンせずに僧侶にバイキルトをかけようとしてしまいます。
これさえ避けられれば、かなりいい所まで行けるような気がしますが。
何とかならないものでしょうか…(^^;
AI導入時のエントリでも書きましたが、現象発生時のSnes9x 1.51でのステートセーブを送ってください。