DQ3 専門職以外の呪文の効果を3/4にする1(戦闘中攻撃呪文編)

変更点は大きく分けて4つです。

  1. 攻撃呪文の基礎値を取得した直後に職業と戦闘行動を見て値の調整を行う
  2. 回復呪文の基礎値を取得した直後に職業と戦闘行動を見て値の調整を行う(戦闘中)
  3. 回復呪文の基礎値を取得した直後に職業と戦闘行動を見て値の調整を行う(移動中)
  4. 回復魔法の呪文の行動説明文を変える

2番目がベホマの場合にキャラクターの賢さを取得しないといけないのでちょっと厄介です。見る限り戦闘中に賢さを取得するSRは見当たらないのであるものを組み合わせて作ると言うわけには行かないようです。

ではまず攻撃呪文のダメージ値の調整を行います。攻撃呪文の実際のダメージ値の計算は全てSR:$028E66で行っています。この中の実装はオリジナルは以下のようになっています。

  • SR: $028E66 呪文・ブレス等ダメージ攻撃
028E66 JSL $C90AF7 SR:$090AF7
028E6A STA $00 DP($00)=A
028E6C JSR $87E0 SR:$028E70
028E6F RTL return

設定範囲からランダムで値を決定するSR:$090AF7でダメージ値の素値(?)を取得後、耐性・防御等による最終ダメージ値を決定するSR:$028E70を実行してダメージ値を決定します。というわけで、$028E70を呼ぶ前に$00の値をいじってしまえば目的を達成できそうです。というわけで、以下のように変更します。

  • SR: $028E66 呪文・ブレス等ダメージ攻撃
028E66 JSL $C90AF7 SR: $090AF7
028E6A STA $00 DP($00)=A
028E6C JSR $D260 SR: $02D260 職業別攻撃呪文ダメージ調整
028E6F RTL return
  • SR: $02D260 職業別攻撃呪文ダメージ調整(新SR)
02D260 PHA Push A
02D261 PHX Push X
02D262 PHP Push P Flag
02D263 JSR $E362 SR: $02E362 戦闘行動が呪文ダメージ調整対象か(該当c=on)
02D266 BCC #$08 if(c==off) goto $02D270
02D268 LDA $00 A=DP($00)
02D26A LSR A>>1
02D26B ADC $00 A+=(DP($00)+c)
02D26D LSR A>>1
02D26E STA $00 DP($00)=A
02D270 PLP Pull P Flag
02D271 PLX Pull X
02D272 PLA Pull A
02D273 JSR $8E70 SR: $028E70
02D276 RTS return
  • SR: $02E362 戦闘行動が呪文ダメージ調整対象か(該当c=on)
02E362 LDX $23EE X=$23EE
02E365 CPX #$012C X==#$012C?
02E368 BEQ #$57 if(z==on) goto $02E3C1
02E36A CPX #$012D X==#$012D?
02E36D BEQ #$52 if(z==on) goto $02E3C1
02E36F JSL $C2CC47 SR: $02CC47 引数:1#$0078 引数:2#$0040
02E377 BEQ #$48 if(z==on) goto $02E3C1
02E379 LDX $23E4 X=$23E4
02E37C STX $2428 $2428=X
02E37F JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02E387 CMP #$0005 A>=#$0005?
02E38A BCC #$35 if(c==off) goto $02E3C1
02E38C JSL $C2BE8A SR: $02BE8A 引数:1#$24
02E391 CMP #$0008 A==#$0008?
02E394 BEQ #$2B if(z==on) goto $02E3C1
02E396 CMP #$0007 A==#$0007?
02E399 BEQ #$26 if(z==on) goto $02E3C1
02E39B CMP #$0002 A==#$0002?
02E39E BNE #$0F if(z==off) goto $02E3AF
02E3A0 LDA $23EE A=$23EE
02E3A3 CMP #$0013 A>=#$0013?
02E3A6 BCC #$19 if(c==off) goto $02E3C1
02E3A8 CMP #$0015 A>=#$0015?
02E3AB BCS #$14 if(c==on) goto $02E3C1
02E3AD BRA #$14 goto $02E3C3
02E3AF CMP #$0003 A==#$0003?
02E3B2 BNE #$0F if(z==off) goto $02E3C3
02E3B4 LDA $23EE A=$23EE
02E3B7 CMP #$0013 A>=#$0013?
02E3BA BCC #$07 if(c==off) goto $02E3C3
02E3BC CMP #$0016 A>=#$0016?
02E3BF BCS #$02 if(c==on) goto $02E3C3
02E3C1 CLC c=off
02E3C2 RTS return
02E3C3 SEC c=on
02E3C4 RTS return

・・・長いですね。さて、やること自体はそれほど難しいわけではありません。まず行動主体($7E23E4)が敵か味方かSR: $02CAD9で調べて、敵であれば(A<5)、調整はしないので処理を飛ばします。次に職業IDをSR: $02BE8Aで取得して勇者であるか(A==8)賢者であれば(A==7)調整はしないので処理を飛ばします。次に魔法使いの場合(A==2)、戦闘行動($7E23EE)がバギ(#$0013)からバギクロス(#$0015)でなければ調整しないで処理を飛ばします。僧侶の場合はその反対です。それ以外の場合は本業でない職業による呪文であるため、全て調整の対象となります。ダメージ素値を3/4にする部分については基本的に賢者の消費MPを3/4にするのと同じなので解説は省きます。その後処理をSR: $028E70に渡して終わりです。

専門職以外のメラゾーマのダメージが160未満になっていれば成功です。

回復呪文は別のエントリーにします。

※本当は動画で変わった所を見せれればいいんですが、動画作成環境がないのでなんとか見れるようにしたいと思います。

コメント

  1. p より:

    お、なんかwktkするサイト発見
    開発環境にアセンブラが無いですね。もし使うならTRASMもいいけどxkasお勧めしますよ、色々やりやすいので
    SMWの改造だったり自作ROMだったりでDQには手を出してませんが応援させていただきますね

    管理者より返信:

    xkas見てみましたが、ラベルが使えるのがいいですね。現在プログラム部分の変更はアセンブラは使ってなくて、自作のDQ3SFCEditorで機械語ベタうちしてます(バイナリエディタでやるよりマシな程度)。この作業の手順についてはエントリで詳しく説明する予定です。