DQ3 スクルトによる守備力上限を制限する2

あけましておめでとうございます。今年もどうぞよろしくお願いします。

さて、実装に移ります。スクルト系のSRは$029A23で全部まとめられているわけですが、オリジナルの大まかな処理の流れは

  1. 増加分の値を決定
  2. 現在の守備力値に1を加算
  3. 2が最大値(1023)を超えていたら1023でクリップ
  4. 現在の守備力値を変更
  5. メッセージ表示

となっています。従って、詠唱者の職業によって効果を変化させるには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発なら通常戦闘は安泰になってしまうので、ボス戦以外は意味がないかもしれません。