前回に引き続き、今回は戦闘中の回復呪文の回復値の調整をすることにします。戦闘中の回復処理は全てSR: $029610で行っています。このSRの前半ではターゲットが光ゾーマ(#$0088)であればダメージを与える処理を行っています。今回は空き領域の都合もあり、この部分も一緒に削り光ゾーマに回復行動でダメージを与えられないようにもしてしまいます。今回も回復行動の素値を取得した直後に調整用のSRをはさんで回復量を調整します。
- SR: $029610 回復系処理(戦闘中)
029610 | LDA $23F2 | A=$23F2 | |
---|---|---|---|
029613 | BEQ #$27 | if(z==on) goto $02963C | |
029615 | LDX $23E8 | X=$23E8 | |
029618 | JSL $C2CAD9 | SR: $02CAD9 引数:1#$2050 引数:2#$0001 | |
029620 | BNE #$1A | if(z==off) goto $02963C | |
029622 | NOP | ||
略 | |||
02963C | LDA $23E8 | A=$23E8 | |
02963F | STA $2428 | $2428=A | |
029642 | JSL $C2BE8A | SR: $02BE8A 引数:1#$00 | |
029647 | STA $02 | DP($02)=A | |
029649 | JSL $C90AF7 | SR: $090AF7 | |
02964D | STA $00 | DP($00)=A | |
02964F | JSR $D2BE | SR: $02D2BE | 職業別回復呪文回復量調整 |
略 |
略の部分は全て$EA(NOP)で埋めています。さて、今回ちょっと違うのが、$029642で取得した現在HPを$02にセットしています。これは後で回復時に加算するもとのHPとして使うようです。従ってこの部分には手を触れてはいけません。回復量は攻撃呪文同様$00にセットされるのでその直後に新規に定義した調整用のSRをコールして$00の値を変えることにします。
- SR: $02D2BE 職業別回復呪文回復量調整(新SR)
02D2BE | PHA | Push A | |
---|---|---|---|
02D2BF | PHX | Push X | |
02D2C0 | PHP | Push P Flag | |
02D2C1 | LDA $2428 | A=$2428 | |
02D2C4 | PHA | Push A | |
02D2C5 | LDX $23E4 | X=$23E4 | |
02D2C8 | STX $2428 | $2428=X | |
02D2CB | JSL $C2CAD9 | SR: $02CAD9 引数:1#$203C 引数:2#$00FF | |
02D2D3 | CMP #$0005 | A>=#$0005? | 行動主体がPC側か |
02D2D6 | BCC #$40 | if(c==off) goto $02D318 | |
02D2D8 | JSL $C2BE8A | SR: $02BE8A 引数:1#$24 | 職業IDを取得する |
02D2DD | CMP #$0008 | A==#$0008? | 勇者か |
02D2E0 | BEQ #$36 | if(z==on) goto $02D318 | |
02D2E2 | CMP #$0007 | A==#$0007? | 賢者か |
02D2E5 | BEQ #$31 | if(z==on) goto $02D318 | |
02D2E7 | CMP #$0003 | A==#$0003? | 僧侶か |
02D2EA | BEQ #$2C | if(z==on) goto $02D318 | |
02D2EC | LDA $23EE | A=$23EE | |
02D2EF | CMP #$001F | A==#$001F? | 戦闘行動がホイミ(味方)か |
02D2F2 | BEQ #$1C | if(z==on) goto $02D310 | |
02D2F4 | CMP #$0022 | A==#$0022? | 戦闘行動がべホイミ(味方)か |
02D2F7 | BEQ #$17 | if(z==on) goto $02D310 | |
02D2F9 | CMP #$0028 | A==#$0028? | 戦闘行動がベホマラー(味方)か |
02D2FC | BEQ #$12 | if(z==on) goto $02D310 | |
02D2FE | CMP #$0025 | A==#$0025? | 戦闘行動がベホマ(味方)か |
02D301 | BEQ #$03 | if(z==on) goto $02D306 | |
02D303 | JMP $D318 ($02D318) | goto $02D318 | |
02D306 | JSL $C2C240 | SR: $02C240 引数:1#$18 | 行動主体の賢さを取得 |
02D30B | STA $00 | DP($00)=A | 本業以外はベホマの回復量は術者の賢さの値になる |
02D30D | JMP $D318 ($02D318) | goto $02D318 | |
02D310 | LDA $00 | A=DP($00) | |
02D312 | LSR | A>>1 | |
02D313 | ADC $00 | A+=(DP($00)+c) | |
02D315 | LSR | A>>1 | |
02D316 | STA $00 | DP($00)=A | 回復量を3/4にする |
02D318 | PLA | Pull A | |
02D319 | STA $2428 | $2428=A | |
02D31C | PLP | Pull P Flag | |
02D31D | PLX | Pull X | |
02D31E | PLA | Pull A | |
02D31F | RTS | return |
前回にまして長いです。さて、やることは基本的に変わりません。行動主体($7E23E4)が敵か味方かSR: $02CAD9で調べて、敵であれば(A<5)、調整はしないので処理を飛ばします。次に職業IDをSR: $02BE8Aで取得して勇者か(#$08)賢者か(#$07)僧侶(#$03)であれば調整はしないので処理を飛ばします。次に戦闘行動を調べてホイミ(#$001F9)かべホイミ(#$0022)かベホマラー(#$0028)であれば効果を3/4にする処理をおこないます。さらにベホマ(#$0025)であれば、行動主体の賢さを取得してその値を$00にセットします。しかし、この記事をみればわかるとおり、賢さを取得するSRがありません。というわけで追加することにします。
- SR: $02C240の拡張
$02C240は、引数(1バイト)をオフセットにしてSRアドレスの配列から指定個所のアドレスのSRを呼ぶ、というものです。具体的には$FC(JML (addr,x))を使っています。今回のケースでは$02C2A0から24バイト(2バイトx12)を敵用の情報を取得するSRアドレス群として、$02C2B8から24バイト(2バイトx12)を味方用の情報を取得するSRアドレス群として使用しています。本当はよくないのですが、事実上敵の賢さを取得する意味がないので味方側のアドレス群のみ拡張することにします。まず、空きがないのでアドレス群の場所を$02D320に移動します。そして、その最後に対象の賢さを取得する新SRのアドレスを追加します。追加後には以下のようになります。
アドレス | 値 |
---|---|
02D320 | C2D7 |
02D322 | C2F0 |
02D324 | C301 |
02D326 | C312 |
02D328 | C323 |
02D32A | C334 |
02D32C | C345 |
02D32E | C352 |
02D330 | C37E |
02D332 | C3AE |
02D334 | C3BB |
02D336 | C4EC |
02D338 | D33A |
そして$02D33Aに賢さを取得するSRを実装します。
- $02D33A PC(Player Character)の賢さを取得する
02D33A | JSL $C437C1 | SR: $0437C1 引数:1#$06 引数:2#$FD 引数:3#$FF |
---|---|---|
02D341 | RTS | return |
これでベホマ時の回復量が術者の賢さと等しくなるはずです。この一連の変更で専門職以外のベホマラーの効果がとたんに低くなります。これにあわせて賢者の石の回復量も抑えれば本職のベホマラーの価値がぐっと高まると思われます。ためしに勇者+戦士+盗賊+ぶとうかのほぼLv99のパーティでしんりゅうに挑んでみたところ、勇者のベホマズン以外はほとんど役立たずでした。通しでプレイしてないのでまだわかりませんが、ある程度職業間のバランスがとれているような感触を得ました。
コメント