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

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

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

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

となっています。従って、詠唱者の職業によって効果を変化させるには1の決定後の値をいじればよいことになり、素の守備力値の2倍に上限を設けるには3の1023のクリップ前に素の守備力値の2倍の値と比較してクリップすればよい、ということになります。

  • SR: $029992 守備力変更処理メイン?
0299AEJSR $E7F0SR: $02E7F0職業による守備力変更量調整
0299B1NOP

  • SR: $02E7F0 職業による守備力変更量調整(新SR)
02E7F0STA $00$000000=A守備力変更量を$00に移動
02E7F2CPX #$0000X==#$0000 ?戦闘行動がスカラ(味方)
02E7F5BEQ #$36if(z==on) goto $02E82D
02E7F7CPX #$0006X==#$0006 ?戦闘行動がスクルト(味方)
02E7FABEQ #$31if(z==on) goto $02E82D
02E7FCCPX #$000EX==#$000E ?戦闘行動がルカニ(味方)
02E7FFBEQ #$06if(z==on) goto $02E807
02E801CPX #$0010X==#$0010 ?戦闘行動がルカナン(味方)
02E804BEQ #$01if(z==on) goto $02E807
02E806RTSreturnそれ以外は調整対象外
02E807LDX $23E4X=$7E23E4ルカナン系調整
02E80ASTX $2428$7E2428=X
02E80DJSL $02CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FFグループIDを取得
02E815CMP #$0005A>=#$0005?
02E818BCC #$ECif(c==off) goto $02E806
02E81AJSL $02BE8ASR: $02BE8A 引数:1#$24職業IDを取得
02E81FCMP #$0007A==#$0007?職業が賢者か
02E822BEQ #$E2if(z==on) goto $02E806
02E824CMP #$0002A==#$0002?職業が魔法使いか
02E827BEQ #$DDif(z==on) goto $02E806
02E829NOP
02E82ANOP
02E82BBRA #$24goto $02E851
02E82DLDX $23E4X=$7E23E4スクルト系調整
02E830STX $2428$7E2428=X
02E833JSL $02CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FF
02E83BCMP #$0005A>=#$0005?
02E83EBCC #$11if(c==off) goto $02E851
02E840JSL $02BE8ASR: $02BE8A 引数:1#$24
02E845CMP #$0007A==#$0007?職業が賢者か
02E848BEQ #$07if(z==on) goto $02E851
02E84ACMP #$0003A==#$0003?職業が僧侶か
02E84DBEQ #$02if(z==on) goto $02E851
02E84FNOP
02E850NOP
02E851LDX $23E8X=$7E23E8
02E854STX $2428$7E2428=X
02E857RTSreturn

このSRは職業による効果調整を行うSRですが、実質何もしていません。また、スクルト系とルカナン系を覚える職業を魔法使いと僧侶で入れ替えているので判定が逆になっています。効果を半減させるには、LSR $00を$02E829、$02E84Fにセットしてやればいい、ということになります。

  • SR: $0299F5 守備力MAX判定
0299F5PHXPush X
0299F6PHYPush Y
0299F7LDX $2428X=$7E2428
0299FAPHAPush A
0299FBLDA #$0000A=#$0000
0299FEJSL $02CB70SR: $02CB70 引数:1#$2052 引数:2#$0008守備力MAXフラグOFF
029A06PLAPull A
029A07-16NOP
029A17JSR $E858SR: $02E858スクルト系の結果守備力が上限を超えている場合の守備力値設定
029A1AJSL $02CA98SR: $02CA98 引数:1#$2041
029A20PLYPull Y
029A21PLXPull X
029A22RTSreturn

  • SR: $2E858 スクルト系の結果守備力が上限を超えている場合の守備力値設定(新SR)
02E858PHAPush AAにはスクルトによる守備力加算後の合計値がセットされている
02E859JSR $E876SR: $02E876対象者の守備力の取り得る上限値を返す(最大1023)
02E85CCMP $01,SA>=Stack($01)?
02E85EBCS #$02if(c==on) goto $02E862
02E860STA $01,SStack($01)=A加算後の合計値が上限値をオーバーしている場合は上限値に差し替え
02E862LDA $01,SA=Stack($01)
02E864CMP #$03FFA>=#$03FF?1023と比較
02E867BCC #$0Bif(c==off) goto $02E874
02E869LDA #$0001A=#$0001
02E86CJSL $02CB70SR: $02CB70 引数:1#$2052 引数:2#$0008守備力MAXフラグON
02E874PLAPull A
02E875RTSreturn

  • SR: $02E876 対象者の守備力の取り得る上限値を返す(新SR)
02E876JSL $02C240SR: $02C240 引数:1#$06守備力取得
02E87BSTA $04$000004=A
02E87DLDA #$0002A=#$0002
02E880PHXPush X
02E881LDX #$0004X=#$0004
02E884JSL $001146SR: $001146$00,x=A(1Byte)*$00,x
02E888PLXPull X
02E889LDA #$03FFA=#$03FF1023と比較
02E88CCMP $04A>=$000004?
02E88EBCC #$02if(c==off) goto $02E892
02E890LDA $04A=$000004
02E892RTSreturn

ずいぶん前に実装したので今見ると何でこんなまどろっこしい実装にしていたのか忘れましたが、おそらく上限値を素の守備力の3倍、4倍などを変えて試す場合に$02E87DのLDA #$0002をLDA #$0003,#$0004とすればいいだけにするためにこのような実装にしたのだと思います。

これで実装は終わりです。戦闘中の守備力の上限を素の守備力の2倍に制限されたわけですが、2倍というのはスクルト2発分です。中盤まではともかく、終盤になってしまうとスクルト2発なら通常戦闘は安泰になってしまうので、ボス戦以外は意味がないかもしれません。

コメント

タイトルとURLをコピーしました