久しぶりの質問回答コーナーです。お題は
DQ3で特定のアイテムを装備している場合に戦闘終了時に盗むが発動するようにする
というものです。質問者の方は「盗賊を廃止して代わりに特定のアイテムを装備していたら盗むが発動するようにする」という実装をしようとしていたようです。実装の情報をもらったので見てみましたがほとんど正解にたどり着いていたのでパパっと添削して終わりにします。
- SR: $02A910 アイテム取得処理(盗賊)
略 | |||
---|---|---|---|
02A962 | JSR $FE40 | SR: $02FE40 | アイテム装備チェック |
02A965 | NOP | ||
02A966 | NOP | ||
略 |
- SR: $02FE40 アイテム装備チェック(新SR)
02FE40 | LDA $242C | A=$242C | 盗むアイテム情報をスタックに退避 |
---|---|---|---|
02FE43 | PHA | Push A | |
02FE44 | LDA #$00FD | A=#$00FD | |
02FE47 | STA $242C | $242C=A | |
02FE4A | JSL $C2B87A | SR: $02B87A | |
02FE4E | BVC #$08 | if(v==off) goto $02FE58 | |
02FE50 | PLA | Pull A | |
02FE51 | STA $242C | $242C=A | 盗むアイテム情報に戻す |
02FE54 | LDA #$0006 | A=#$0006 | 盗賊の職業IDにする |
02FE57 | RTS | return | |
02FE58 | PLA | Pull A | |
02FE59 | STA $242C | $242C=A | 盗むアイテム情報に戻す |
02FE5C | LDA #$0000 | A=#$0000 | 戦士の職業IDにする |
02FE5F | RTS | return |
SR: $02A962のあたりはもともとは職業IDを取得して盗賊であるかどうかを判断する箇所になっています。これを特定のアイテムの装備をチェックして装備していれば盗賊(職業ID:6)、そうでなければ6以外の値の適当な値にして返す、という実装にしています。ポイントはこの時点で$242Cには盗むアイテムがセットされているので装備品チェックの際に使用するメモリが使われているのでスタックに一旦退避する必要があるということです。ださいコードですがこれなら確実に動くはず。自分もこの実装をした後デバッガで動きを見たら$02FE5Cの行が抜けていたので、自戒の意味も込めて「とにかくデバッガ使っとけ」という言葉でこのエントリを〆ようと思います。
コメント
迅速な回感謝いたします。
スタックを使う方法も考えていたのですが、盗む発動アイテムを装備していなかった時のPULL Aを忘れていました(^_^;)
今までデバックを使わずにやってきましたので、考えを改めたいと思います。
盗賊は初期設定(盗むが発動する)のままで、特定のアイテムを装備したら盗むを発動させるにはどのようにしたらよいでしょうか?
Aレジスタにはもともと職業IDが入っているので6(盗賊の職業ID)だったらなにもしないでリターンすればいいのではないでしょうか。