DQ3 エンカウント解析+エンカウント率アップ変更

以前にもちょっと書きましたが、SFC版のDQ3のエンカウント率はFC版と比べると明らかに少ないです(特にダンジョンで)。移動スピードが上がった上に盗賊のしのびあしを使ってしまうとネクロゴンドの洞窟などピクニック気分で踏破できてしまいます。自分の経験では、FC版では洞窟の入口までたどり着くのに一苦労、稲妻の剣、刃の鎧を取るのにもう一苦労、それでようやく最終フロアをなんとか突破、という感じだったのですが、SFC版では下手すると稲妻の剣を回収してそのまま頂上まで行けてしまう、というのがプレイしていての実感でした。というわけで、エンカウントの仕組みを理解し、エンカウント頻度を上げるようにすることを目標とします。幸いバイナリwikiにエンカウント用のRAMの情報があるので($7EF796-7)、Snes9x Debuggerで$7EF796にWriteのブレイクポイントを張れば($7EF796の値を変更する部分でプログラムを止めるということ)、関係している部分は簡単に分かります。

  • SR: $068FDC エンカウント判定?
068FDDJSL $C690A1SR: $0690A1今いる床に応じた減衰値取得
068FE1CMP #$0000A==#$0000?
068FE4BEQ #$46if(z==on) goto $06902C
068FE6STA $1ADP($1A)=A
068FE8STZ $02DP($02)=#$00
068FEASTX $00DP($00)=X
068FECLDX $1AX=DP($1A)
068FEEJSL $C903EESR: $0903EE 引数:1#$01 引数:2#$0014 引数:3#$C8B605 引数:4#$0000構造体アクセス
068FFAASLA<<1
068FFBTAXX=A
068FFCLDA $C6902F,XA=$06902F+X
069000LDX #$0000X=#$0000
069003JSL $C010D6SR: $0010D6
069007ASL $00DP($00)<<1
069009ROL $02DP($02)<<1
06900BASL $00DP($00)<<1
06900DROL $02DP($02)<<1
06900FJSR $903FSR: $06903Fしのびあし中の減衰値調整
069012JSR $904DSR: $06904Dトヘロス・せいすい中の減衰値0化
069015JSR $908ASR: $06908Aピラミッドで黄金の爪奪取後の減衰値調整
069018LDA $F796A=$F796
06901BSECc=on
06901CSBC $01A-=(DP($01)+c)
06901ESTA $F796$F796=A
069021BCS #$09if(c==on) goto $06902C
069023JSL $C68FC3SR: $068FC3エンカウント値リセット

バイナリwikiにあるように$7EF796の値が0以下になるとエンカウントします。戦闘開始直前にSR: $069023でランダム値を作成し、$7EF796にセットしておき、戦闘終了後歩くたびにこの値が減っていく、という仕組みのようです。

(2011-04-20追記)
ランダム値の作成は実際はSR: $068FC3で行っており、以下のようになっています。

  • SR: $068FC3 エンカウント初期値セット処理?
068FC3STZ $18DP($18)=#$00
068FC5LDX #$0003X=#$0003回数設定
068FC8LDA #$0010A=#$0010
068FCBJSL $C0133ESR: $00133E乱数発生 00-A A(1B)
068FCFCLCc=off
068FD0ADC $18A+=(DP($18)+c)ランダム値バッファに加算
068FD2STA $18DP($18)=A
068FD4DEXX–
068FD5BNE #$F1if(z==off) goto $068FC8
068FD7XBAExchange A(HighByte) and A(LowByte)上下1バイトを入れ替え
068FD8STA $F796$F796=A
068FDBRTLreturn

0から1516の乱数を3回作成して加算し、それを上位1バイトとした2バイトの値が初期値としてセットされることになります。従って初期値のとりうる値の範囲は#$0000~#$2D00#3000となります。

減っていくペースはしのびあし中かどうか(1/2のペース)、トヘロス・せいすい中(戦闘のレベルとエリアレベルを比較して上なら減らない(多分)、今いる場所がピラミッドで黄金の爪強奪後か(減衰値#$0800で固定)、にといった例外にも影響されますが、基本は「今いる床の減衰ベース値×エンカウント率に応じた倍率」によってエンカウント率は大きく変化します。

  • SR: $0690A1 今いる床に応じた減衰ベース値取得
0690A1LDA $98B1A=$98B1
0690A4JSL $C69160SR: $069160
0690A8LDA $98AFA=$98AF
0690ABBEQ #$09if(z==on) goto $0690B6
0690ADCMP #$0003A>=#$0003?
0690B0BCC #$08if(c==off) goto $0690BA
0690B2LDX #$0050X=#$0050ダンジョンの場合?
0690B5RTLreturn
0690B6LDX #$0000X=#$0000
0690B9RTLreturn
0690BADECA–
0690BBSTA $18DP($18)=A
0690BDLDX $DB05X=$DB05
0690C0JSR $90C4SR: $($0690C4+X)フィールドマップの場合?
0690C3RTLreturn

ここで得た減衰ベース値に$068FEEで取得したエンカウント率に応じた倍率をかけた値を2倍して得られる値(4バイト長)の1-2バイトを最終的な減衰値としているようです(補正前の話)。ここで問題になるのはエンカウント率に応じた倍率に何が設定されているかです。

エンカウント率
0$0000
1$0010
2$0020
3$0040
4$0080

ちなみに、エンカウント率に4が設定されているのはクリア後の隠しダンジョン以外はテドン周辺?、ジパング?、ゾーマの島?、一部の海域のみです。言われてみれば、ゾーマの島、隠しダンジョンはかなりのエンカウント率だったような気がします。それ以外はほとんど3です。3と4では実質エンカウント率は2倍の差があることになります。というわけで、エンカウント率を増やすにはこの値をいじってしまえばいいことになります。例として

エンカウント率
0$0000
1$0040
2$0060
3$0080
4$00A0

とすれば、ほとんどのダンジョンなどで隠しダンジョン並みのエンカウント率になります。これがきついという場合は、

エンカウント率
0$0000
1$0020
2$0040
3$0060
4$0080

というのも有りかもしれません。このへんは実際にプレイしての調整が必要でしょう。ちなみに、DQ3SFC K.Mixで幽霊船追加イベント中にやたらとエンカウント率が高かったのは狙ってやったわけではなく、エンカウント率の設定値が2バイト長なのを知らなかったため、上位1バイトが#$FFのまま→#$FF03が返される→$068FFCで参照するアドレスがとんでもない場所だった(全く関係ないプログラム部分)→減衰ペースが異常に高くなったということのようです。同じ問題は追加ダンジョンでも起きるはずなのですが、おそらくたまたま正常時と変わらない減衰ペースだったため、表面化しなかっただけと思われます。

スポンサーリンク

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。