あけましておめでとうございます。今年もどうぞよろしくお願いします。
さて、実装に移ります。スクルト系のSRは$029A23で全部まとめられているわけですが、オリジナルの大まかな処理の流れは
- 増加分の値を決定
- 現在の守備力値に1を加算
- 2が最大値(1023)を超えていたら1023でクリップ
- 現在の守備力値を変更
- メッセージ表示
となっています。従って、詠唱者の職業によって効果を変化させるには1の決定後の値をいじればよいことになり、素の守備力値の2倍に上限を設けるには3の1023のクリップ前に素の守備力値の2倍の値と比較してクリップすればよい、ということになります。
- SR: $029992 守備力変更処理メイン?
略 | |||
---|---|---|---|
0299AE | JSR $E7F0 | SR: $02E7F0 | 職業による守備力変更量調整 |
0299B1 | NOP | ||
略 |
- SR: $02E7F0 職業による守備力変更量調整(新SR)
02E7F0 | STA $00 | $000000=A | 守備力変更量を$00に移動 |
---|---|---|---|
02E7F2 | CPX #$0000 | X==#$0000 ? | 戦闘行動がスカラ(味方) |
02E7F5 | BEQ #$36 | if(z==on) goto $02E82D | |
02E7F7 | CPX #$0006 | X==#$0006 ? | 戦闘行動がスクルト(味方) |
02E7FA | BEQ #$31 | if(z==on) goto $02E82D | |
02E7FC | CPX #$000E | X==#$000E ? | 戦闘行動がルカニ(味方) |
02E7FF | BEQ #$06 | if(z==on) goto $02E807 | |
02E801 | CPX #$0010 | X==#$0010 ? | 戦闘行動がルカナン(味方) |
02E804 | BEQ #$01 | if(z==on) goto $02E807 | |
02E806 | RTS | return | それ以外は調整対象外 |
02E807 | LDX $23E4 | X=$7E23E4 | ルカナン系調整 |
02E80A | STX $2428 | $7E2428=X | |
02E80D | JSL $02CAD9 | SR: $02CAD9 引数:1#$203C 引数:2#$00FF | グループIDを取得 |
02E815 | CMP #$0005 | A>=#$0005? | |
02E818 | BCC #$EC | if(c==off) goto $02E806 | |
02E81A | JSL $02BE8A | SR: $02BE8A 引数:1#$24 | 職業IDを取得 |
02E81F | CMP #$0007 | A==#$0007? | 職業が賢者か |
02E822 | BEQ #$E2 | if(z==on) goto $02E806 | |
02E824 | CMP #$0002 | A==#$0002? | 職業が魔法使いか |
02E827 | BEQ #$DD | if(z==on) goto $02E806 | |
02E829 | NOP | ||
02E82A | NOP | ||
02E82B | BRA #$24 | goto $02E851 | |
02E82D | LDX $23E4 | X=$7E23E4 | スクルト系調整 |
02E830 | STX $2428 | $7E2428=X | |
02E833 | JSL $02CAD9 | SR: $02CAD9 引数:1#$203C 引数:2#$00FF | |
02E83B | CMP #$0005 | A>=#$0005? | |
02E83E | BCC #$11 | if(c==off) goto $02E851 | |
02E840 | JSL $02BE8A | SR: $02BE8A 引数:1#$24 | |
02E845 | CMP #$0007 | A==#$0007? | 職業が賢者か |
02E848 | BEQ #$07 | if(z==on) goto $02E851 | |
02E84A | CMP #$0003 | A==#$0003? | 職業が僧侶か |
02E84D | BEQ #$02 | if(z==on) goto $02E851 | |
02E84F | NOP | ||
02E850 | NOP | ||
02E851 | LDX $23E8 | X=$7E23E8 | |
02E854 | STX $2428 | $7E2428=X | |
02E857 | RTS | return |
このSRは職業による効果調整を行うSRですが、実質何もしていません。また、スクルト系とルカナン系を覚える職業を魔法使いと僧侶で入れ替えているので判定が逆になっています。効果を半減させるには、LSR $00を$02E829、$02E84Fにセットしてやればいい、ということになります。
- SR: $0299F5 守備力MAX判定
0299F5 | PHX | Push X | |
---|---|---|---|
0299F6 | PHY | Push Y | |
0299F7 | LDX $2428 | X=$7E2428 | |
0299FA | PHA | Push A | |
0299FB | LDA #$0000 | A=#$0000 | |
0299FE | JSL $02CB70 | SR: $02CB70 引数:1#$2052 引数:2#$0008 | 守備力MAXフラグOFF |
029A06 | PLA | Pull A | |
029A07-16 | NOP | ||
029A17 | JSR $E858 | SR: $02E858 | スクルト系の結果守備力が上限を超えている場合の守備力値設定 |
029A1A | JSL $02CA98 | SR: $02CA98 引数:1#$2041 | |
029A20 | PLY | Pull Y | |
029A21 | PLX | Pull X | |
029A22 | RTS | return |
- SR: $2E858 スクルト系の結果守備力が上限を超えている場合の守備力値設定(新SR)
02E858 | PHA | Push A | Aにはスクルトによる守備力加算後の合計値がセットされている |
---|---|---|---|
02E859 | JSR $E876 | SR: $02E876 | 対象者の守備力の取り得る上限値を返す(最大1023) |
02E85C | CMP $01,S | A>=Stack($01)? | |
02E85E | BCS #$02 | if(c==on) goto $02E862 | |
02E860 | STA $01,S | Stack($01)=A | 加算後の合計値が上限値をオーバーしている場合は上限値に差し替え |
02E862 | LDA $01,S | A=Stack($01) | |
02E864 | CMP #$03FF | A>=#$03FF? | 1023と比較 |
02E867 | BCC #$0B | if(c==off) goto $02E874 | |
02E869 | LDA #$0001 | A=#$0001 | |
02E86C | JSL $02CB70 | SR: $02CB70 引数:1#$2052 引数:2#$0008 | 守備力MAXフラグON |
02E874 | PLA | Pull A | |
02E875 | RTS | return |
- SR: $02E876 対象者の守備力の取り得る上限値を返す(新SR)
02E876 | JSL $02C240 | SR: $02C240 引数:1#$06 | 守備力取得 |
---|---|---|---|
02E87B | STA $04 | $000004=A | |
02E87D | LDA #$0002 | A=#$0002 | |
02E880 | PHX | Push X | |
02E881 | LDX #$0004 | X=#$0004 | |
02E884 | JSL $001146 | SR: $001146 | $00,x=A(1Byte)*$00,x |
02E888 | PLX | Pull X | |
02E889 | LDA #$03FF | A=#$03FF | 1023と比較 |
02E88C | CMP $04 | A>=$000004? | |
02E88E | BCC #$02 | if(c==off) goto $02E892 | |
02E890 | LDA $04 | A=$000004 | |
02E892 | RTS | return |
ずいぶん前に実装したので今見ると何でこんなまどろっこしい実装にしていたのか忘れましたが、おそらく上限値を素の守備力の3倍、4倍などを変えて試す場合に$02E87DのLDA #$0002をLDA #$0003,#$0004とすればいいだけにするためにこのような実装にしたのだと思います。
これで実装は終わりです。戦闘中の守備力の上限を素の守備力の2倍に制限されたわけですが、2倍というのはスクルト2発分です。中盤まではともかく、終盤になってしまうとスクルト2発なら通常戦闘は安泰になってしまうので、ボス戦以外は意味がないかもしれません。
コメント