DQ3 きせきのつるぎ実装

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

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

  • SR: $027D53 戦闘行動実行処理メイン
027DB1JSR $D580SR: $02D580
027DB4-9NOP

  • SR: $02D580 直接攻撃反射ダメージ計算等(新SR)
02D580JSR $896DSR: $02896D
02D583JSR $89C5SR: $0289C5
02D586JSR $8A2CSR: $028A2C
02D589JSR $D385SR: $02D385
02D58ARTSreturn

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

  • SR: $02D385 きせきのつるぎ装備時の回復処理(新SR)
02D385LDA $23F2A=$23F2
02D388BNE #$4Bif(z==off) goto $02D3D5
02D38ALDX $23EEX=$23EE
02D38DJSL $C2CC25SR: $02CC25 引数:1#$0079 引数:2#$0008
02D395BEQ #$3Eif(z==on) goto $02D3D5
02D397LDX $23E4X=$23E4
02D39ASTX $2428$2428=X
02D39DJSL $C2CB2BSR: $02CB2B 引数:1#$2050 引数:2#$0002
02D3A5BEQ #$2Eif(z==on) goto $02D3D5
02D3A7LDA #$00E5A=#$00E5
02D3AASTA $242C$242C=A
02D3ADJSL $C2B87ASR: $02B87Aアイテム装備チェック
02D3B1BVC #$22if(v==off) goto $02D3D5
02D3B3LDA $23FAA=$23FAダメージが0なら回復処理はなし
02D3B6BEQ #$1Dif(z==on) goto $02D3D5
02D3B8JSR $DF94SR: $02DF94
02D3BBJSL $C2BE8ASR: $02BE8A 引数:1#$04HP加算処理
02D3C0JSL $C2BE8ASR: $02BE8A 引数:1#$00不要?
02D3C5JSL $C1E32ESR: $01E32E 引数:1#$00C4BGM再生
02D3CBJSL $C2B977SR: $02B977パーティウィンドウ再描画
02D3CFJSL $C1A867SR: $01A867 引数:1#$01AA戦闘メッセージ
02D3D5RTSreturn

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

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

20090506012634.jpg

コメント

  1. J より:

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

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

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

    管理者より返信:

    その通りです。

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