DQ3 特定のアイテムを装備している場合に盗むが発動するようにする

久しぶりの質問回答コーナーです。お題は

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の行が抜けていたので、自戒の意味も込めて「とにかくデバッガ使っとけ」という言葉でこのエントリを〆ようと思います。

コメント

  1. ks より:

    迅速な回感謝いたします。
    スタックを使う方法も考えていたのですが、盗む発動アイテムを装備していなかった時のPULL Aを忘れていました(^_^;)

    今までデバックを使わずにやってきましたので、考えを改めたいと思います。

  2. DD より:

    盗賊は初期設定(盗むが発動する)のままで、特定のアイテムを装備したら盗むを発動させるにはどのようにしたらよいでしょうか?

    管理者より返信:

    Aレジスタにはもともと職業IDが入っているので6(盗賊の職業ID)だったらなにもしないでリターンすればいいのではないでしょうか。