DQ3 遊び人の遊びを変更する2

ここ2週間ばかり試行錯誤していた無限回廊の実装ですが魔王物語物語に逃避して時間をいたずらに消費していたのは秘密、結局諦めてデバッガで処理をまじめに見ていくことでようやくからくりがわかり、技術的な問題は1つクリアできました。ただ今度は「1フロアでいくつまで無限回廊分岐を設定出来るのか」を調べなくてはなりません。DQ3のオリジナルでは無限回廊は最大で1フロア上に2つまでしか設定されていません(地球のへそのB1Fの横廊下)。フロアの設計が終わってからやっぱり出来ませんでしたでは空しいのでテストフロアを用意して設定できる最大数を調べるつもりです。大体のからくりは理解したので別エントリーで解説する予定です。

さて、本題です。まず「遊び人が遊びを選択した場合(1/4)に役に立つ遊びを選択する処理」を実装します。作者自身も遊び人を真面目に育ててプレイしていないにもかかわらず奇特な方が遊び人を連れて歩いていたらレベル40未満でも役に立つ遊びが発動したという情報もあったのでもしかしたら問題が残っているのかもしれません。あえてその実装を晒すことで前回のようにバグの指摘をしてもらえるかもということで問題があれば指摘をお願いします(一応デバッガ上で動作の確認はしてOKだったのですが、特定のケースでバグが発生するのかも)。

  • SR: $0275E7 遊び人の遊ぶ処理メイン
02760D JSR $E1E4 SR: $02E1E4 遊び人の遊び決定処理
  • SR: $02E1E4 遊び人の遊び決定処理(新SR)
02E1E4 JSR $E1ED SR: $02E1ED 遊び人が役に立つ遊びをするか決定(該当c=on)
02E1E7 BCS #$03 if(c==on) goto $02E1EC
02E1E9 JSR $7611 SR: $027611 遊び人の遊び決定処理
02E1EC RTS return

役に立つ遊びが規定レベルに到達していなかったり、確率判定で選択されなかった場合は通常の遊びが選択されるようにします。$027611はオリジナルの遊び選択処理です。

  • SR: $02E1ED 遊び人が役に立つ遊びをするか決定(該当c=on)(新SR)
02E1ED JSL $C2C240 SR: $02C240 引数:1#$0A レベル取得
02E1F2 CMP #$0028 A>=#$0028? レベル40以上か
02E1F5 BCC #$0D if(c==off) goto $02E204
02E1F7 JSR $E599 SR: $02E599 役に立つ遊びをするときの分子部分計算
02E1FA PHA Push A
02E1FB JSL $C012D1 SR: $0012D1 乱数計算
02E1FF CMP $01,S A==or>=Stack($01)?
02E201 PLA Pull A
02E202 BCC #$02 if(c==off) goto $02E206
02E204 CLC c=off
02E205 RTS return
02E206 JSR $E247 SR: $02E247 役に立つ遊びを決定して返す
02E209 BCC #$F9 if(c==off) goto $02E204
02E20B JSR $75C6 SR: $0275C6
02E20E STA $242A $242A=A
02E211 LDA $23E4 A=$23E4
02E214 STA $2428 $2428=A
02E217 JSL $C270F2 SR: $0270F2
02E21B JSR $76CE SR: $0276CE
02E21E LDA $2430 A=$2430
02E221 STA $23E6 $23E6=A
02E224 LDX $23E4 X=$23E4 ここまで対象決定処理?通常の遊びの処理をコピーしただけ
02E227 LDA #$0000 A=#$0000
02E22A JSL $C2CB70 SR: $02CB70 引数:1#$2050 引数:2#$0080
02E232 SEC c=on
02E233 RTS return
  • SR: $02E599 役に立つ遊びをするときの分子部分計算(新SR)
02E599 PHA Push A Aにはレベルが格納されている
02E59A JSL $C2C240 SR: $02C240 引数:1#$18 賢さ取得
02E59F CMP #$0104 A==or>=#$0104? 賢さが260以上
02E5A2 PLA Pull A
02E5A3 BCC #$0A if(c==off) goto $02E5AF
02E5A5 LSR A>>1
02E5A6 STA $00 DP($00)=A
02E5A8 JSL $C2C240 SR: $02C240 引数:1#$0A レベル取得
02E5AD ADC $00 A+=(DP($00)+c) 1.5倍にする
02E5AF LSR A>>1 通常はレベルの半分
02E5B0 RTS return

通常の場合は発動率はレベル/510ですが、賢さが260以上の場合は発動率を通常の1.5倍にするために、レベルを半分にした後もう1回レベルを足してから半分にしています。

コメント

  1. p より:

    前回コメ書こうと思ったら先こされたので今度こそ
    でもしっかり見たわけではないので違うかも
    org $02E1F7辺りからの
    JSR $E599 ;分子取得
    PHA ;↑分子の値
    JSL $0012D1 ;乱数をAに?
    CMP $01,s ;乱数と分子比較
    PLA ;A=分子
    この処理だとCMP $00,sでは?
    多分
    LDA #分子
    STA $00
    LDA #乱数
    CMP $01 ;分子と比較
    と似た状況になってるかと

    管理者より返信:

    こちらでもCMP $01,sで正しいことを確認しました。自分もマヌーサの命中率が逆になっているのを指摘してもらったのに気のせいで無視した前科があるのでおあいこということでw、今後も突っ込み頼みます。

  2. p より:

    あ、でもこれレベルチェック以降だからここに書いてあるバグ?と関係薄いw
    出直してきま

  3. p より:

    凄い勘違い・・・CMP $01,sであってますorz
    活動してないせいでもう色々駄目だ
    今後コメは確信もてるまで自重します