以前にもちょっと書きましたが、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で参照するアドレスがとんでもない場所だった(全く関係ないプログラム部分)→減衰ペースが異常に高くなったということのようです。同じ問題は追加ダンジョンでも起きるはずなのですが、おそらくたまたま正常時と変わらない減衰ペースだったため、表面化しなかっただけと思われます。
コメント
こんにちは。黄金の爪を回収してしまうと、後から売ってもエンカウント率は呪われたままなのでしょうか?
ピラミッドの中で黄金の爪を捨てるor全滅して剥奪される以外ではピラミッドのエンカウント率は元に戻らないようです。