今までの変更はパクり他からの移植でしたが、今回の変更は完全オリジナルです。実装はともかく、「実戦で役に立つか」という意味では未知数です。
他の職業に比べて職業特性がない戦士。「守備力の高い防具を装備できる」というのが当初の触れ込みでしたが、SFC版では女尊男卑のあおりを食らって防具に女性専用で職業を選ばない高性能のものが増えたためにますますその地位が低下しました。今回は戦士の「防御」に特性を与え、「戦士が防御しているとそれより後ろの仲間への全体攻撃によるダメージが低減する」となるようにします。防御することによりパーティの盾となることを意図しています。とりあえず低減率は複数対象攻撃の低減率を使用することにします。これによりパーティの先頭に戦士を置いて防御させた場合、一番後ろの仲間は1/2のダメージになることになります。また、話がややこしくなるので、戦士2人が防御しても効果は2重になりません。あまり効果を高くすると「戦士は先頭で常に防御」ということにもなりかねないので、バランスには注意しないといけません。
- SR: $028EFB ダメージ計算処理
略 | |||
---|---|---|---|
028F3C | JSR $D800 | SR: $02D800 | |
略 |
- SR: $02D800 戦士防御・フバーハ時のダメージ軽減処理(新SR)
02D800 | JSR $D807 | SR: $02D807 | |
---|---|---|---|
02D803 | JSR $9179 | SR: $029179 | |
02D806 | RTS | return |
思いのほか修正個所は1ヵ所で済みます。ダメージ系の攻撃のダメージ値の計算は最終的にSR: $028EFBを通ります。従ってこのなかに処理を割り込ませればいいことになります。ただし、攻撃の対象が「一人」である場合は処理をスキップする必要があります。
- SR: $02D807 戦士防御時のダメージ軽減処理(新SR)
02D807 | LDY $23EE | Y=$23EE | |
---|---|---|---|
02D80A | JSL $C2CC2C | SR: $02CC2C 引数:1#$0075 引数:2#$0003 | |
02D812 | CMP #$0002 | A>=#$0002? | |
02D815 | BCC #$7E | if(c==off) goto $02D895 | |
02D817 | LDA $2428 | A=$2428 | |
02D81A | STA $2600 | $2600=A | |
02D81D | LDY #$0000 | Y=#$0000 | |
02D820 | LDA $243E,Y | A=$243E+Y | |
02D823 | AND #$00FF | A&=#$00FF | |
02D826 | CMP $2600 | A==$2600? | |
02D829 | BEQ #$03 | if(z==on) goto $02D82E | |
02D82B | INY | Y++ | |
02D82C | BRA #$F2 | goto $02D820 | |
02D82E | STY $2604 | $2604=Y | |
02D831 | LDY #$0000 | Y=#$0000 | |
02D834 | LDA $243E,Y | A=$243E+Y | |
02D837 | AND #$00FF | A&=#$00FF | |
02D83A | CMP #$0018 | A>=#$0018? | |
02D83D | BCS #$14 | if(c==on) goto $02D853 | |
02D83F | TAX | X=A | |
02D840 | STX $2428 | $2428=X | |
02D843 | JSL $C2CAD9 | SR: $02CAD9 引数:1#$203C 引数:2#$00FF | |
02D84B | CMP #$0005 | A>=#$0005? | |
02D84E | BCS #$03 | if(c==on) goto $02D853 | |
02D850 | INY | Y++ | |
02D851 | BRA #$E1 | goto $02D834 | |
02D853 | STY $2602 | $2602=Y | |
02D856 | LDA $243E,Y | A=$243E+Y | |
02D859 | AND #$00FF | A&=#$00FF | |
02D85C | CMP #$0018 | A>=#$0018? | |
02D85F | BCS #$2E | if(c==on) goto $02D88F | |
02D861 | TAX | X=A | |
02D862 | STX $2428 | $2428=X | |
02D865 | JSL $C2BE8A | SR: $02BE8A 引数:1#$24 | |
02D86A | CMP #$0000 | A==#$0000? | |
02D86D | BNE #$1A | if(z==off) goto $02D889 | |
02D86F | LDA $243E,Y | A=$243E+Y | |
02D872 | AND #$00FF | A&=#$00FF | |
02D875 | STA $2428 | $2428=A | |
02D878 | JSL $C2BE8A | SR: $02BE8A 引数:1#$1C | |
02D87D | BCS #$0A | if(c==on) goto $02D889 | |
02D87F | JSL $C2CB2B | SR: $02CB2B 引数:1#$2050 引数:2#$0080 | |
02D887 | BNE #$0D | if(z==off) goto $02D896 | |
02D889 | INY | Y++ | |
02D88A | CPY #$0018 | Y>=#$0018? | |
02D88D | BCC #$C7 | if(c==off) goto $02D856 | |
02D88F | LDA $2600 | A=$2600 | |
02D892 | STA $2428 | $2428=A | |
02D895 | RTS | return | |
02D896 | CPY $2604 | Y>=$2604? | |
02D899 | BCS #$F4 | if(c==on) goto $02D88F | |
02D89B | STY $2606 | $2606=Y | |
02D89E | LDA $2604 | A=$2604 | |
02D8A1 | INC | A++ | |
02D8A2 | SBC $2606 | A-=($2606+c) | |
02D8A5 | ASL | A<<1 | |
02D8A6 | TAX | X=A | |
02D8A7 | LDA $C23CB2,X | A=$023CB2+X | |
02D8AB | LDX #$0000 | X=#$0000 | |
02D8AE | JSL $C01146 | SR: $001146 | |
02D8B2 | LDA $01 | A=DP($01) | |
02D8B4 | STA $00 | DP($00)=A | |
02D8B6 | BRA #$D7 | goto $02D88F |
長々と書いていますが、部分で見ていけばそれほど複雑な事をしているわけではありません。
- 現在の戦闘行動($7E23EE)の対象が一人の場合は何もしないですぐリターンする。($02D807-15)
- 現在の行動対象者インデックス($7E2428)を$7E2600にバックアップしておき、並び順を$7E243E-55の中から探し、その番号を$7E2604に保存する。($02D81A-30)
- 次に並び順の中での味方の先頭インデックスを探し、$7E2602に保存します。($02D831-55)
- 味方の先頭インデックスより後ろに「防御をしている生きている戦士」がいるかを調べ、存在している場合は低減処理に飛ばす。($02D856-8E)
- 「防御をしている生きている戦士」と自分の並び順を比較し、自分が後ろであれば何人後かを調べ、その数に応じて複数攻撃武器のダメージ低減率に応じてダメージを軽減させる。($02D89B-B7)
ここで1点ミスに気が付きました。処理の頭で「自分のグループ番号を調べて5以上でなかったらすぐにリターン」という処理が抜けています。これがなくても並び順的にモンスターがパーティの先頭にいる「防御をしている戦士」より後ろになることはないので実害はないですが。後ろに別のSRを詰めてしまったのでもうこの処理を追加する余裕がないのでとりあえず放置します。
思いのほかあっさり実装が終わりました。実装が終わったので次回はいよいよテストです。
コメント