DQ3 ゲストキャラクター概念の追加3(戦闘中編3)

次に幽霊船追加イベント中に傭兵が仲間に参加している場合の全滅判定です。傭兵を除いた3人、傭兵のみでの全滅判定をそれぞれ行い、該当していれば全滅扱いとする、という方針で作業します。ここで、$SR: $02C766の引数で指定できるアドレスの配列を拡張し、「傭兵のビットも生死にかかわらずOFFにする」「傭兵以外のビットも生死にかかわらずOFFにする」というSRを作れば従来の仕組みの中で対応出来ます。

  • SR: $05D8A0 幽霊船追加イベント中PC側全滅判定(新SR)
05D8A0 JSL $C2C739 SR: $02C739 引数:1#$08 行動可能チェック用マスクデータ作成
05D8A5 JSL $C2C766 SR: $02C766 引数:1#$2C 行動可能フラグセット(傭兵以外の生存チェック)
05D8AA LDA $00 A=DP($00)
05D8AC ORA $02 Aor=DP($02)
05D8AE BNE #$01 if(z==off) goto $05D8B1
05D8B0 RTS return
05D8B1 JSL $C2C739 SR: $02C739 引数:1#$08 行動可能チェック用マスクデータ作成
05D8B6 JSL $C2C766 SR: $02C766 引数:1#$2E 行動可能フラグセット(傭兵生存チェック)
05D8BB LDA $00 A=DP($00) このSRを出た後で判定するので不要
05D8BD ORA $02 Aor=DP($02) このSRを出た後で判定するので不要
05D8BF RTS return
  • SR: $02C7FB 呼び出し元の後の1バイトを引数として取得し行動可能フラグセット
省略
02C84D JSR $C866 SR: $($02C866+X) コールするSRの配列のアドレスを空き領域に移動
省略
  • SR: $02F3F5 傭兵以外生存フラグセット(新SR)
02F3F5 JSL $C2BE8A SR: $02BE8A 引数:1#$24 職業ID取得
02F3FA CMP #$000C A==#$000C? 職業IDが傭兵ならビットをOFFにする
02F3FD BEQ #$09 if(z==on) goto $02F408
02F3FF JSL $C2BE8A SR: $02BE8A 引数:1#$1C 生死判定
02F404 BCS #$02 if(c==on) goto $02F408 死んでいたらビットをOFFにする
02F406 SEC c=on
02F407 RTS return
02F408 CLC c=off
02F409 RTS return
  • SR: $02F40A 傭兵生存フラグセット(新SR)
02F40A JSL $C2BE8A SR: $02BE8A 引数:1#$24 職業ID取得
02F40F CMP #$000C A==#$000C? 職業IDが傭兵以外ならビットをOFFにする
02F412 BNE #$09 if(z==off) goto $02F41D
02F414 JSL $C2BE8A SR: $02BE8A 引数:1#$1C 生死判定
02F419 BCS #$02 if(c==on) goto $02F41D 死んでいたらビットをOFFにする
02F41B SEC c=on
02F41C RTS return
02F41D CLC c=off
02F41E RTS return

もっと大変だろうと思ったのですが仕組みを理解出来れば意外と簡単に実装できてしまいました。というわけで次回からはより大変かつ危険な移動中メニューにゲストの概念を導入していきます。