前回の実装でメガザルを実行したときの効果の実装は終わりました。残りは術者を死亡させる処理ですが、これはとても簡単です。まず、SR: $028A96を見てください。
- SR: $028A96 特殊戦闘行動追加処理
028A96 | LDX #$0046 | X=#$0024 | |
---|---|---|---|
028A99 | LDA $23EE | A=$23EE | |
028A9C | CMP $C236E0,X | A==$023AAB+X? | |
028AA0 | BEQ #$05 | if(z==on) goto $028AA7 | |
028AA2 | DEX | X– | |
028AA3 | DEX | X– | |
028AA4 | BPL #$F6 | if(n==off) goto $028A9C | |
028AA6 | RTS | return | |
028AA7 | JSR $8AAB | SR: $($028AAB+X) | |
028AAA | RTS | return |
このSRは通常の戦闘行動の実行が終わった後呼び出されます。$7E23EEはもはやおなじみ「現在実行中の戦闘行動ID」です。何をしているかというと、「現在の戦闘行動IDが$028AAB-$028AD0の戦闘行動IDの配列のどれかと一致している場合は$028AD1-$028AF6に並んでいるSRのアドレスリストの中から対応するSRのアドレスを呼び出す」ということをしています。現在の戦闘行動IDが$028AAB-の配列にない場合は何も処理をしません。この手のSRはDQ3にはよくある実装なので覚えて置いてください。さて、これをどう変更するかというと配列の要素数を増やして追加処理をする戦闘行動IDとSRの数をもっと増やしてやればいいわけです。とはいえ周囲に空き領域はないので戦闘行動IDの配列の場所を$0236E0($028AABから移動)に移動し、実行するSRの配列を$023AAB($028AD1から移動)に移動します。これで実質サイズは2倍になりました。空いている部分は#$00で埋めておきましょう。そして、戦闘行動IDの配列の最後にメガザル(#$0112)を追加し、実行するSRの配列の最後にメガンテと同じSRのアドレス8B6A($028B6A)を設定します。次にSR: $028A96を少し変更して変更完了です。
- SR: $028A96 特殊戦闘行動追加処理
028A96 | LDX #$0046 | X=#$0046 | |
---|---|---|---|
028A99 | LDA $23EE | A=$23EE | |
028A9C | CMP $C236E0,X | A==$0236E0+X? | |
028AA0 | BEQ #$05 | if(z==on) goto $028AA7 | |
028AA2 | DEX | X– | |
028AA3 | DEX | X– | |
028AA4 | BPL #$F6 | if(n==off) goto $028A9C | |
028AA6 | RTS | return | |
028AA7 | JSR $8AAB | SR: $($028AAB+X) | |
028AAA | RTS | return |
ループする回数を1回増やし、2つの配列の移動に伴って調べる場所を変えています。というわけで、さっそくテストしてみます。
※使ってるPCが非力すぎて動画がうまくとれません。最終的にはあきらめるかもしれませんがしばし時間をください。
コメント