DQ3 きせきのつるぎ実装

DQ4-6でおなじみのきせきのつるぎを導入します。効果は与えたダメージの1/4を回復するというものです。まず、アイテムにきせきのつるぎを追加します。アイテムID#$E5に追加します。攻撃力はオリジナル(100)よりちょっと落として90にしました(後で調整するかもしれません)。勇者、戦士、賢者、商人を装備可能にしました。

次は攻撃時の効果の実装です。ダメージが確定したときに刃の鎧の反射やもろはの剣の反射などを実装している部分に紛れ込ませたいのですが、例によって空きがありません。というわけで別の部分に処理を飛ばすことにします。

  • SR: $027D53 戦闘行動実行処理メイン
027DB1 JSR $D580 SR: $02D580
027DB4-9 NOP
  • SR: $02D580 直接攻撃反射ダメージ計算等(新SR)
02D580 JSR $896D SR: $02896D
02D583 JSR $89C5 SR: $0289C5
02D586 JSR $8A2C SR: $028A2C
02D589 JSR $D385 SR: $02D385
02D58A RTS return

$02D580-88までのSRはもともと$027DB1-B9にあったものをそのまま移動しただけです。まとめて移動する必要は特にないのですが、プログラム上の意味としてひとまとめにしたほうがいいと思いまとめて移動させました。

  • SR: $02D385 きせきのつるぎ装備時の回復処理(新SR)
02D385 LDA $23F2 A=$23F2
02D388 BNE #$4B if(z==off) goto $02D3D5
02D38A LDX $23EE X=$23EE
02D38D JSL $C2CC25 SR: $02CC25 引数:1#$0079 引数:2#$0008
02D395 BEQ #$3E if(z==on) goto $02D3D5
02D397 LDX $23E4 X=$23E4
02D39A STX $2428 $2428=X
02D39D JSL $C2CB2B SR: $02CB2B 引数:1#$2050 引数:2#$0002
02D3A5 BEQ #$2E if(z==on) goto $02D3D5
02D3A7 LDA #$00E5 A=#$00E5
02D3AA STA $242C $242C=A
02D3AD JSL $C2B87A SR: $02B87A アイテム装備チェック
02D3B1 BVC #$22 if(v==off) goto $02D3D5
02D3B3 LDA $23FA A=$23FA ダメージが0なら回復処理はなし
02D3B6 BEQ #$1D if(z==on) goto $02D3D5
02D3B8 JSR $DF94 SR: $02DF94
02D3BB JSL $C2BE8A SR: $02BE8A 引数:1#$04 HP加算処理
02D3C0 JSL $C2BE8A SR: $02BE8A 引数:1#$00 不要?
02D3C5 JSL $C1E32E SR: $01E32E 引数:1#$00C4 BGM再生
02D3CB JSL $C2B977 SR: $02B977 パーティウィンドウ再描画
02D3CF JSL $C1A867 SR: $01A867 引数:1#$01AA 戦闘メッセージ
02D3D5 RTS return

実装は特に目新しいところはありません。$02D38Dの処理は戦闘行動のもろはのつるぎ・なげきのたて・やいばのよろいで反応するか(25バイト目4ビット)がOFFのときは回復処理を飛ばすためのものです。$02D39Dの処理は行動主体者($7E23E4)が敵であれば回復処理を飛ばすためのものです。一点気をつけるのは$02D3C7のあたりの処理です。行動主体者($7E23E4)が回復処理の行動対象となるように行動対象者($7E23E8)にセットする必要があるのですが、回復処理を終えた後にこれらの情報を元の情報に戻すためにスタックを使っています。スタックはSRに入る前と出る直前で基本同じ状態に戻しておく必要があるので分岐命令等でスタックをPULLする部分の処理を飛ばさないようにしてください。こういったバグを入れるとゲームはすぐフリーズします。

さて、きせきのつるぎはしっぷうのバンダナのかわりにメダル80枚の賞品に設定しました。もともと80枚の賞品だったドラゴンクロウは70枚の賞品に移動しました。

コメント

  1. J より:

    既存の武器に上記機能を実装する場合ですが、

    02D3A7 LDA #$00E5 A=#$00E5

    のE5を実装させたい武器のIDに変更すれば良いのでしょうか?

    管理者より返信:

    その通りです。