本部にURLがのってしまったので多くの改造野郎がきてくれたらしく、カウンタの上がる速度がかなり上がるようになりました。有益な情報を提供できるように鋭意努力する次第です。さて、前回指摘した「素早さのリミットが500になると一定値を超えると確実に先手が取れる」についてまず検証をしてみます。周知の事実ですが、DQでは素早さの値にランダム値を掛けてターンごとの素早さを決定しているので必ずしも素早さ通りには順番は回ってきません。DQ3では$025D56でターンごとの各キャラクターの素早さを決定し、その後$0263A2で多少の補正をして行動順が最終的に決まります。
- SR: $25D56 ターン中の素早さ決定
略 | |||
---|---|---|---|
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 | |
025D8C | PHX | Push X | |
025D8D | LDX #$0000 | X=#$0000 | |
025D90 | JSL $C010D6 | SR: $0010D6 | |
025D94 | PLX | Pull X | |
025D95 | LDA $01 | A=DP($01) | |
025D97 | INC | A++ | |
略 |
SR: $02CA5B 1:#$2043でステータス上の素早さの値を取得し、20(#$14)を加算して乱数発生SR: $001457を呼んで1バイトの乱数を発生させ、SR: $0010D6 を呼んで先ほどの20を加算してある素早さとかけて上2バイトに1を足して素早さを決定しています。ここでポイントになるのが$001457です。今までこれを$70-$80の間の乱数発生と思っていたので素早さが一定値以上になるとモンスター側の最大値(255)がターン中の素早さで上回れないと予想したのですが、実際プログラムを走らせてみると$70-$80以外の範囲の値も返ってきます。というわけで、次にこの中を見てみます。
- SR: $001457 乱数発生(1B)
略 | |||
---|---|---|---|
001462 | LDA #$0088 | A=#$0088 | |
001465 | LDX #$001F | X=#$001F | |
001468 | JSR $14D4 | SR: $0014D4 | |
略 |
SR: $0014D4は(A+(#$00-X))*16の下位1バイトを返す乱数発生SRです。よくよく考えてみると、例えば(#$88+#$08)*16なんていう場合には下位1バイトは#$00になるわけですね。この場合はもともとの素早さがいくらあろうとターン中の素早さは0(+1)になってしまうわけです。というわけで「確実に先手が取れる」というのは間違いでした。とはいえ、もともとの素早さが十分大き(511に近い)ければ、先手を取れる確率が高くなるのは確かだと思います。この点は何らか考える必要があると思います。もう1点問題を見つけました。もともとの素早さが255以上のキャラクターにピオリムをかけるとすばやさが「65xxxあがった」というメッセージが表示されます。ピオリムによって素早さが255になったので255-元の素早さがマイナスになりFFXXのような値になっているために発生している問題だと思われます。
- SR: $029A65 ピオリム系
略 | |||
---|---|---|---|
029A6B | JSL $C2CA5B | SR: $02CA5B 引数:1#$2043 | |
029A71 | STA $00 | DP($00)=A | |
029A73 | JSL $C2C240 | SR: $02C240 引数:1#$08 | |
029A78 | CLC | c=off | |
029A79 | ADC $00 | A+=(DP($00)+c) | |
029A7B | CMP #$00FF | A>=#$00FF? | |
029A7E | BCC #$03 | if(c==off) goto $029A83 | |
029A80 | LDA #$00FF | A=#$00FF | |
029A83 | JSL $C2CA98 | SR: $02CA98 引数:1#$2043 | |
029A89 | SEC | c=on | |
029A8A | SBC $00 | A-=(DP($00)+c) | |
略 |
$029A6Bで、戦闘中の現在の素早さを取得し、$029A73でステータス上の素早さを取得して足し、結果が255(#$FF)以上の場合は255でクリップし、$029A83でその結果を戦闘中の素早さとして設定しています。その後、設定後の素早さ(A)から設定前の素早さ($00)を引いて0でなければ、「すばやさが○○上がった」のメッセージを表示するという処理になっているため、この問題が発生します。この点に関しては255と比較するのではなく、511(#$01FF)と比較すればいいのかもしれません。
コメント