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

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

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

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

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

  • SR: $028E66 呪文・ブレス等ダメージ攻撃
028E66JSL $C90AF7SR:$090AF7
028E6ASTA $00DP($00)=A
028E6CJSR $87E0SR:$028E70
028E6FRTLreturn

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

  • SR: $028E66 呪文・ブレス等ダメージ攻撃
028E66JSL $C90AF7SR: $090AF7
028E6ASTA $00DP($00)=A
028E6CJSR $D260SR: $02D260職業別攻撃呪文ダメージ調整
028E6FRTLreturn

  • SR: $02D260 職業別攻撃呪文ダメージ調整(新SR)
02D260PHAPush A
02D261PHXPush X
02D262PHPPush P Flag
02D263JSR $E362SR: $02E362戦闘行動が呪文ダメージ調整対象か(該当c=on)
02D266BCC #$08if(c==off) goto $02D270
02D268LDA $00A=DP($00)
02D26ALSRA>>1
02D26BADC $00A+=(DP($00)+c)
02D26DLSRA>>1
02D26ESTA $00DP($00)=A
02D270PLPPull P Flag
02D271PLXPull X
02D272PLAPull A
02D273JSR $8E70SR: $028E70
02D276RTSreturn

  • SR: $02E362 戦闘行動が呪文ダメージ調整対象か(該当c=on)
02E362LDX $23EEX=$23EE
02E365CPX #$012CX==#$012C?
02E368BEQ #$57if(z==on) goto $02E3C1
02E36ACPX #$012DX==#$012D?
02E36DBEQ #$52if(z==on) goto $02E3C1
02E36FJSL $C2CC47SR: $02CC47 引数:1#$0078 引数:2#$0040
02E377BEQ #$48if(z==on) goto $02E3C1
02E379LDX $23E4X=$23E4
02E37CSTX $2428$2428=X
02E37FJSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02E387CMP #$0005A>=#$0005?
02E38ABCC #$35if(c==off) goto $02E3C1
02E38CJSL $C2BE8ASR: $02BE8A 引数:1#$24
02E391CMP #$0008A==#$0008?
02E394BEQ #$2Bif(z==on) goto $02E3C1
02E396CMP #$0007A==#$0007?
02E399BEQ #$26if(z==on) goto $02E3C1
02E39BCMP #$0002A==#$0002?
02E39EBNE #$0Fif(z==off) goto $02E3AF
02E3A0LDA $23EEA=$23EE
02E3A3CMP #$0013A>=#$0013?
02E3A6BCC #$19if(c==off) goto $02E3C1
02E3A8CMP #$0015A>=#$0015?
02E3ABBCS #$14if(c==on) goto $02E3C1
02E3ADBRA #$14goto $02E3C3
02E3AFCMP #$0003A==#$0003?
02E3B2BNE #$0Fif(z==off) goto $02E3C3
02E3B4LDA $23EEA=$23EE
02E3B7CMP #$0013A>=#$0013?
02E3BABCC #$07if(c==off) goto $02E3C3
02E3BCCMP #$0016A>=#$0016?
02E3BFBCS #$02if(c==on) goto $02E3C3
02E3C1CLCc=off
02E3C2RTSreturn
02E3C3SECc=on
02E3C4RTSreturn

・・・長いですね。さて、やること自体はそれほど難しいわけではありません。まず行動主体($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で機械語ベタうちしてます(バイナリエディタでやるよりマシな程度)。この作業の手順についてはエントリで詳しく説明する予定です。

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。