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

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

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

  • SR: $0275E7 遊び人の遊ぶ処理メイン
02760DJSR $E1E4SR: $02E1E4遊び人の遊び決定処理
  • SR: $02E1E4 遊び人の遊び決定処理(新SR)
02E1E4JSR $E1EDSR: $02E1ED遊び人が役に立つ遊びをするか決定(該当c=on)
02E1E7BCS #$03if(c==on) goto $02E1EC
02E1E9JSR $7611SR: $027611遊び人の遊び決定処理
02E1ECRTSreturn

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

  • SR: $02E1ED 遊び人が役に立つ遊びをするか決定(該当c=on)(新SR)
02E1EDJSL $C2C240SR: $02C240 引数:1#$0Aレベル取得
02E1F2CMP #$0028A>=#$0028?レベル40以上か
02E1F5BCC #$0Dif(c==off) goto $02E204
02E1F7JSR $E599SR: $02E599役に立つ遊びをするときの分子部分計算
02E1FAPHAPush A
02E1FBJSL $C012D1SR: $0012D1乱数計算
02E1FFCMP $01,SA==or>=Stack($01)?
02E201PLAPull A
02E202BCC #$02if(c==off) goto $02E206
02E204CLCc=off
02E205RTSreturn
02E206JSR $E247SR: $02E247役に立つ遊びを決定して返す
02E209BCC #$F9if(c==off) goto $02E204
02E20BJSR $75C6SR: $0275C6
02E20ESTA $242A$242A=A
02E211LDA $23E4A=$23E4
02E214STA $2428$2428=A
02E217JSL $C270F2SR: $0270F2
02E21BJSR $76CESR: $0276CE
02E21ELDA $2430A=$2430
02E221STA $23E6$23E6=A
02E224LDX $23E4X=$23E4ここまで対象決定処理?通常の遊びの処理をコピーしただけ
02E227LDA #$0000A=#$0000
02E22AJSL $C2CB70SR: $02CB70 引数:1#$2050 引数:2#$0080
02E232SECc=on
02E233RTSreturn

  • SR: $02E599 役に立つ遊びをするときの分子部分計算(新SR)
02E599PHAPush AAにはレベルが格納されている
02E59AJSL $C2C240SR: $02C240 引数:1#$18賢さ取得
02E59FCMP #$0104A==or>=#$0104?賢さが260以上
02E5A2PLAPull A
02E5A3BCC #$0Aif(c==off) goto $02E5AF
02E5A5LSRA>>1
02E5A6STA $00DP($00)=A
02E5A8JSL $C2C240SR: $02C240 引数:1#$0Aレベル取得
02E5ADADC $00A+=(DP($00)+c)1.5倍にする
02E5AFLSRA>>1通常はレベルの半分
02E5B0RTSreturn

通常の場合は発動率はレベル/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
    活動してないせいでもう色々駄目だ
    今後コメは確信もてるまで自重します

タイトルとURLをコピーしました