DQ3戦闘部分解説8

ずいぶんさぼっていたのですが再開します。長さ的に少々短めでもエントリ頻度を増やすことにします。

  • SR: $025D56 ターン中の素早さ決定
025D56 PHP Push P Flag
025D57 PHB Push DB
025D58 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
025D5A PEA #$7E7E Push #$7E7E
025D5D PLB Pull DB
025D5E PLB Pull DB
025D5F LDX #$0017 X=#$0017 戦闘中参加キャラクターインデックス最大値
025D62 LDY #$002E Y=#$002E ターン中の素早さ(テンポラリ)を保持するオフセット
025D65 JSL $C2CB2B SR: $02CB2B 引数:1#$2050 引数:2#$0002 行動可能か?
025D6D BEQ #$29 if(z==on) goto $025D98
025D6F STX $2428 $2428=X
025D72 JSL $C2BE8A SR: $02BE8A 引数:1#$1C 生死判定?
025D77 LDA #$0000 A=#$0000
025D7A BCS #$1C if(c==on) goto $025D98
025D7C JSL $C2CA5B SR: $02CA5B 引数:1#$2043 素早さ取得
025D82 CLC c=off
025D83 ADC #$0014 A+=(#$0014+c)
025D86 STA $00 DP($00)=A
025D88 JSL $C01457 SR: $001457 $00-FFの乱数発生
025D8C PHX Push X
025D8D LDX #$0000 X=#$0000
025D90 JSL $C010D6 SR: $0010D6 $00,X(3B)=A(1B)*$00,X(2Byte)
025D94 PLX Pull X
025D95 LDA $01 A=DP($01)
025D97 INC A++
025D98 STA $2484,Y $2484+Y=A ターン中の素早さをセット
025D9B JSL $C2CA98 SR: $02CA98 引数:1#$2045 ターン中の素早さ値セット
025DA1 DEY Y–
025DA2 DEY Y–
025DA3 DEX X–
025DA4 BPL #$BF if(n==off) goto $025D65
025DA6 JSR $5DAC SR: $025DAC ターン中の行動順序設定
025DA9 PLB Pull DB
025DAA PLP Pull P Flag
025DAB RTL return

ターン中の素早さを作成する計算式は(現在の素早さ+20)*($00-FFの乱数)で、実際に使用されるのはその上位2バイトです。理論値で言うと$0000-0111までの値を取りうることになりますが、乱数の要素が大きいので素早さがMAX値近くにあっても必ず先に動けるとは限りません。乱数要素をなくすor減らせばターン中の行動順を制御しやすくなりますが、例えば素早さMAXのモンスターがいたらどうあがいても先手を打てない、ということになります。このあたりがターン制のDQではいかんともしがたいところです。