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

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

  • SR: $068FDC エンカウント判定?
068FDD JSL $C690A1 SR: $0690A1 今いる床に応じた減衰値取得
068FE1 CMP #$0000 A==#$0000?
068FE4 BEQ #$46 if(z==on) goto $06902C
068FE6 STA $1A DP($1A)=A
068FE8 STZ $02 DP($02)=#$00
068FEA STX $00 DP($00)=X
068FEC LDX $1A X=DP($1A)
068FEE JSL $C903EE SR: $0903EE 引数:1#$01 引数:2#$0014 引数:3#$C8B605 引数:4#$0000 構造体アクセス
068FFA ASL A<<1
068FFB TAX X=A
068FFC LDA $C6902F,X A=$06902F+X
069000 LDX #$0000 X=#$0000
069003 JSL $C010D6 SR: $0010D6
069007 ASL $00 DP($00)<<1
069009 ROL $02 DP($02)<<1
06900B ASL $00 DP($00)<<1
06900D ROL $02 DP($02)<<1
06900F JSR $903F SR: $06903F しのびあし中の減衰値調整
069012 JSR $904D SR: $06904D トヘロス・せいすい中の減衰値0化
069015 JSR $908A SR: $06908A ピラミッドで黄金の爪奪取後の減衰値調整
069018 LDA $F796 A=$F796
06901B SEC c=on
06901C SBC $01 A-=(DP($01)+c)
06901E STA $F796 $F796=A
069021 BCS #$09 if(c==on) goto $06902C
069023 JSL $C68FC3 SR: $068FC3 エンカウント値リセット

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

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

  • SR: $068FC3 エンカウント初期値セット処理?
068FC3 STZ $18 DP($18)=#$00
068FC5 LDX #$0003 X=#$0003 回数設定
068FC8 LDA #$0010 A=#$0010
068FCB JSL $C0133E SR: $00133E 乱数発生 00-A A(1B)
068FCF CLC c=off
068FD0 ADC $18 A+=(DP($18)+c) ランダム値バッファに加算
068FD2 STA $18 DP($18)=A
068FD4 DEX X–
068FD5 BNE #$F1 if(z==off) goto $068FC8
068FD7 XBA Exchange A(HighByte) and A(LowByte) 上下1バイトを入れ替え
068FD8 STA $F796 $F796=A
068FDB RTL return

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

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

  • SR: $0690A1 今いる床に応じた減衰ベース値取得
0690A1 LDA $98B1 A=$98B1
0690A4 JSL $C69160 SR: $069160
0690A8 LDA $98AF A=$98AF
0690AB BEQ #$09 if(z==on) goto $0690B6
0690AD CMP #$0003 A>=#$0003?
0690B0 BCC #$08 if(c==off) goto $0690BA
0690B2 LDX #$0050 X=#$0050 ダンジョンの場合?
0690B5 RTL return
0690B6 LDX #$0000 X=#$0000
0690B9 RTL return
0690BA DEC A–
0690BB STA $18 DP($18)=A
0690BD LDX $DB05 X=$DB05
0690C0 JSR $90C4 SR: $($0690C4+X) フィールドマップの場合?
0690C3 RTL return

ここで得た減衰ベース値に$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で参照するアドレスがとんでもない場所だった(全く関係ないプログラム部分)→減衰ペースが異常に高くなったということのようです。同じ問題は追加ダンジョンでも起きるはずなのですが、おそらくたまたま正常時と変わらない減衰ペースだったため、表面化しなかっただけと思われます。

コメント

  1. 匿名 より:

    こんにちは。黄金の爪を回収してしまうと、後から売ってもエンカウント率は呪われたままなのでしょうか?

    管理者より返信:

    ピラミッドの中で黄金の爪を捨てるor全滅して剥奪される以外ではピラミッドのエンカウント率は元に戻らないようです。