次に幽霊船追加イベント中に傭兵が仲間に参加している場合の全滅判定です。傭兵を除いた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 |
もっと大変だろうと思ったのですが仕組みを理解出来れば意外と簡単に実装できてしまいました。というわけで次回からはより大変かつ危険な移動中メニューにゲストの概念を導入していきます。
コメント