DQ6 AI処理の解析6

だいぶ間が空いてしまいました。まずは回復系の効果値の算出について見てみます。

  • SR: $02D8FC AI判断用_SR_0007
02D8FC STZ $14 DP($14)=#$00
02D8FE LDA #$0017 A=#$0017
02D901 STA $258B $258B=A
02D904 LDY #$04AC Y=#$04AC
02D907 LDA $205F,Y A=$205F+Y
02D90A AND #$0001 A&=#$0001
02D90D BEQ #$34 if(z==on) goto $02D943
02D90F LDA $204E,Y A=$204E+Y
02D912 AND #$0007 A&=#$0007
02D915 CMP #$0006 A>=#$0006?
02D918 BCC #$29 if(c==off) goto $02D943
02D91A LDA $205E,Y A=$205E+Y
02D91D AND #$0004 A&=#$0004
02D920 BNE #$21 if(z==off) goto $02D943
02D922 LDA $2050,Y A=$2050+Y
02D925 AND #$0002 A&=#$0002
02D928 BNE #$19 if(z==off) goto $02D943
02D92A LDA $2059,Y A=$2059+Y
02D92D AND #$00C0 A&=#$00C0
02D930 BNE #$11 if(z==off) goto $02D943
02D932 JSR $D94F SR: $02D94F 回復行動効果値算出
02D935 LDA $00 A=DP($00)
02D937 CMP $14 A>=DP($14)?
02D939 BCC #$08 if(c==off) goto $02D943
02D93B STA $14 DP($14)=A
02D93D LDA $258B A=$258B
02D940 STA $2591 $2591=A
02D943 TYA A=Y
02D944 SEC c=on
02D945 SBC #$0034 A-=(#$0034+!c)
02D948 TAY Y=A
02D949 DEC $258B $258B–
02D94C BPL #$B9 if(n==off) goto $02D907
02D94E RTS return

ここは単に外枠に当たる部分で戦闘に参加しているキャラクターでループしているだけなので取り立てて説明するべきところはありません。

  • SR: $02D94F 回復行動効果値算出
02D94F STZ $00 DP($00)=#$00
02D951 LDA $203C,Y A=$203C+Y $203Cには最大HPがセットされている
02D954 PHA Push A
02D955 SEC c=on
02D956 SBC $2030,Y A-=($2030+Y+!c) 最大HPと現HPの差(HP減少分)を取得
02D959 STA $02 DP($02)=A HP減少分をセット
02D95B PLA Pull A
02D95C LSR A>>1
02D95D CMP $2030,Y A>=$2030+Y?
02D960 BCC #$0C if(c==off) goto $02D96E HPが最大HPの50%以上
02D962 LSR A>>1
02D963 CMP $2030,Y A>=$2030+Y?
02D966 BCC #$13 if(c==off) goto $02D97B HPが最大HPの25%を切っている
02D968 JSR $D988 SR: $02D988 回復量最小値をHP減少分でクリップ
02D96B ASL $00 DP($00)<<1 ピンチなので効果値を2倍にする
02D96D RTS return
02D96E JSR $D988 SR: $02D988 回復量最小値をHP減少分でクリップ
02D971 LDA $0E A=DP($0E)
02D973 CMP #$0004 A==#$0004? 作戦がいのちだいじにでなければ効果値1/2
02D976 BEQ #$02 if(z==on) goto $02D97A
02D978 LSR $00 DP($00)>>1
02D97A RTS return
02D97B JSR $D988 SR: $02D988 回復量最小値をHP減少分でクリップ
02D97E LDA $0E A=DP($0E)
02D980 CMP #$0000 A==#$0000? 作戦がガンガンいこうぜなら効果値1/2
02D983 BNE #$02 if(z==off) goto $02D987
02D985 LSR $00 DP($00)>>1
02D987 RTS return

現HPが最大HPの50%以上、25%~50%、25%未満の3パターンで効果値の動作が変わっています。行動種別ごとの作戦毎の補正とは別に特別な処理をしているわけです。

アドレス 動作
50%以上 $02D96E-7A 「いのちだいじに」でなければ効果値1/2(あまり必要性がない)
25%~50% $02D97B-87 「ガンガンいこうぜ」であれば効果値1/2
25%未満 $02D966-6D 作戦にかかわらず効果値2倍(ピンチなので)
  • SR: $02D988 回復量最小値をHP減少分でクリップ
02D988 LDA $258B A=$258B
02D98B STA $2559 $2559=A
02D98E PHY Push Y
02D98F JSL $C9291A SR: $09291A 回復量の最小値を取得
02D993 PLY Pull Y
02D994 LDA $0C A=DP($0C)
02D996 CMP #$8020 A==#$8020? 山彦による2回発動対象か
02D999 BNE #$02 if(z==off) goto $02D99D
02D99B ASL $00 DP($00)<<1 山彦発動なら2倍にする
02D99D LDA $02 A=DP($02)
02D99F CMP $00 A>=DP($00)?
02D9A1 BCS #$02 if(c==on) goto $02D9A5
02D9A3 STA $00 DP($00)=A
02D9A5 RTS return

効果値の算出ですが、最大HP-HPの値と対象の戦闘行動の最小回復値を比較して値の小さいものを効果値として採用しています。これは最大HP30、現HP10のキャラクターに無意味にベホマを使わないようにするためです(ホイミで事足りるのでホイミを使うべき)。次回以降はダメージ系、確率系の効果値の算出を見ていきます。