変更点は大きく分けて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未満になっていれば成功です。
回復呪文は別のエントリーにします。
※本当は動画で変わった所を見せれればいいんですが、動画作成環境がないのでなんとか見れるようにしたいと思います。
コメント
お、なんかwktkするサイト発見
開発環境にアセンブラが無いですね。もし使うならTRASMもいいけどxkasお勧めしますよ、色々やりやすいので
SMWの改造だったり自作ROMだったりでDQには手を出してませんが応援させていただきますね
xkas見てみましたが、ラベルが使えるのがいいですね。現在プログラム部分の変更はアセンブラは使ってなくて、自作のDQ3SFCEditorで機械語ベタうちしてます(バイナリエディタでやるよりマシな程度)。この作業の手順についてはエントリで詳しく説明する予定です。