ここ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回レベルを足してから半分にしています。
コメント
前回コメ書こうと思ったら先こされたので今度こそ
でもしっかり見たわけではないので違うかも
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、今後も突っ込み頼みます。
あ、でもこれレベルチェック以降だからここに書いてあるバグ?と関係薄いw
出直してきま
凄い勘違い・・・CMP $01,sであってますorz
活動してないせいでもう色々駄目だ
今後コメは確信もてるまで自重します