DQ3 成長限界上昇パッチver3.1リリース

K.Mixで発見したバグなどを修正した成長限界上昇パッチを「ダウンロード」ページにうpしました。ver3からの変更点は、

  • 最大MPが成長限界以上になっている場合にレベルアップ時に「最大MPが+64xxxあがった!」と表示される問題を修正した。表示だけの問題。
  • 素早さの種使用時に素早さが255以上だと「○○ポイント 上がった!」の表示がされない問題を修正した。
  • 運のよさに依存する場合の計算式を変更し、運のよさが256以上の場合は成功率*32*((320-256)/320)*((320-Luck+256)/320)が閾値となるようにした。256未満の場合はオリジナル通り成功率*32*((320-Luck)/320)となる。

です。機能追加は一切行っていません。バグについてはまあいいとして、長らくスレでも懸案になっていた「運のよさが320以上になると運のよさに依存する戦闘行動が必中になってしまう」問題について、一定の解法は提示できたのではないかと思います。その辺も踏まえつつ、「運のよさに依存する戦闘行動と運のよさ」の部分について解説をしていきます。

成否系の戦闘行動において、成否の判定は通常は「#$00-FF の乱数と閾値となる戦闘行動の成功率の倍率*32を比較して閾値より乱数が小さければ成功」ということをしています(SR: $02A3EB)。つまり、倍率が8なら#$100になるので、失敗はしない、ということになります。閾値が小さければ小さいほど失敗の確率が高くなるともいえます。そして運のよさが絡む場合は、閾値に件の計算式をかけて閾値を下げる、ということをしています。というわけで、運のよさが最大(255)の場合は、閾値を約80%下げることになります。また、この計算式のまま成長限界上昇パッチを適用した場合、320を超えると閾値を下げるどころか逆に上げてしまい、結果として必中になる、ということなのだと思います。

この問題に対して、単純な解決策は「運のよさの影響する部分の計算式を((511-Luck)/511)に変える」です。ただ、実際どれだけ影響があるのかわかりませんが(以前米で「あまり差は実感できなかった」というレポートもありました)、序盤で成否系の戦闘行動にかかりやすくなる、という別の問題が懸念されます。そこで、今回のパッチでは、「運のよさ255まではオリジナルと同じ計算式を適用、それ以上は2回試行し、1回目は運のよさ256として同じ計算式で判定、2回目は運のよさ-256として判定し、どちらかで成功すればOK」というモデルを使用することにしました。これを閾値の補正として使用すると((320-256)/320)*((320-Luck+256)/320)という計算式で多分合ってるのでは、と思うのですが、いまいち自信がありません。間違ってたら指摘をお願いします。これによって、運のよさが255以上の閾値の低下率はそれ以下のときよりも緩やかになりますが、「運のよさ255以上はあくまでおまけ」という方針にすることで成長限界上昇パッチと運のよさ計算式を破綻することなく共存させられるのでは、というのが狙いです。

  • SR: $02C51E 運のよさ依存の場合の閾値調整
02C533 STA $6A DP($6A)=A
02C535 LDA $242A A=$242A
02C538 CMP #$002E A==#$002E? 戦闘行動がザオラルの場合は別扱い(ただし未使用)
02C53B BEQ #$1E if(z==on) goto $02C55B
02C53D PLA Pull A
02C53E JSR $E480 SR: $02E480 運のよさ依存の場合の閾値調整
02C541 PHA Push A
02C542-58 NOP
  • SR: $02E480 運のよさ依存の場合の閾値調整(新SR)
02E480 PHA Push A
02E481 LDA $6A A=DP($6A)
02E483 CMP #$0100 A>=#$0100? 運のよさが256以上か
02E486 BCS #$20 if(c==on) goto $02E4A8
02E488 STA $6A DP($6A)=A
02E48A LDA #$0140 A=#$0140
02E48D SEC c=on
02E48E SBC $6A A-=(DP($6A)+c) この部分はオリジナルどおり
02E490 STA $6A DP($6A)=A
02E492 LDX #$006A X=#$006A
02E495 LDA $01,S A=Stack($01)
02E497 JSL $C01146 SR: $001146
02E49B LDA #$0140 A=#$0140
02E49E JSL $C01295 SR: $001295
02E4A2 LDA $6A A=DP($6A)
02E4A4 STA $01,S Stack($01)=A
02E4A6 PLA Pull A
02E4A7 RTS return
02E4A8 SEC c=on
02E4A9 SBC #$00FF A-=(#$00FF +c) $100のほうが正しい?
02E4AC STA $6A DP($6A)=A
02E4AE LDA #$0140 A=#$0140
02E4B1 SEC c=on
02E4B2 SBC $6A A-=(DP($6A)+c)
02E4B4 STA $6A DP($6A)=A
02E4B6 LDA #$0041 A=#$0041
02E4B9 LDX #$006A X=#$006A
02E4BC JSL $C010D6 SR: $0010D6 $00,X(3B)=A(1B)*$00,X(2B)
02E4C0 LDA $01,S A=Stack($01)
02E4C2 JSL $C010D6 SR: $0010D6 $00,X(3B)=A(1B)*$00,X(2B)
02E4C6 LDA #$0140 A=#$0140
02E4C9 JSL $C01295 SR: $001295 $00,X(3B)=$00,X(3B)/A(2B?) 剰余A,$30
02E4CD LDA #$0140 A=#$0140
02E4D0 JSL $C01295 SR: $001295 $00,X(3B)=$00,X(3B)/A(2B?) 剰余A,$30
02E4D4 LDA $6A A=DP($6A)
02E4D6 STA $01,S Stack($01)=A
02E4D8 PLA Pull A
02E4D9 RTS return

一応この実装で運のよさが255以上の場合に期待したとおりの閾値に調整されていたのをデバッガ上で確認したのでまあ概ねOKかと。$FFとか$100とかぶれてる部分が一部ありますがあとで見直します(大局に影響はない…はず)。