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とかぶれてる部分が一部ありますがあとで見直します(大局に影響はない…はず)。
コメント