今回はモンスター戦闘行動決定部分を詳しく見ていきます。
- SR: $0265DA モンスター行動決定
| 0265DA | PHP | Push P Flag | |
|---|---|---|---|
| 0265DB | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
| 0265DD | PHA | Push A | |
| 0265DE | PHX | Push X | |
| 0265DF | PHY | Push Y | |
| 0265E0 | PHB | Push DB | |
| 0265E1 | PEA #$7E7E | Push #$7E7E | |
| 0265E4 | PLB | Pull DB | |
| 0265E5 | PLB | Pull DB | |
| 0265E6 | JSR $672D | SR: $02672D | モンスター行動決定+対象決定 |
| 0265E9 | JSR $65F7 | SR: $0265F7 | 並び順に依存する戦闘行動の対象決定補正 |
| 0265EC | JSR $66AB | SR: $0266AB | 集中攻撃時のターゲット確定? |
| 0265EF | PLB | Pull DB | |
| 0265F0 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
| 0265F2 | PLY | Pull Y | |
| 0265F3 | PLX | Pull X | |
| 0265F4 | PLA | Pull A | |
| 0265F5 | PLP | Pull P Flag | |
| 0265F6 | RTL | return |
- SR: $02672D モンスター行動決定+対象決定
| 02672D | LDY $2428 | Y=$2428 | |
|---|---|---|---|
| 026730 | JSL $C2CAE0 | SR: $02CAE0 引数:1#$2051 引数:2#$0040 | ドラゴラム中? |
| 026738 | BEQ #$12 | if(z==on) goto $02674C | |
| 02673A | LDA #$00AA | A=#$00AA | 戦闘行動はドラゴラムの炎に固定 |
| 02673D | STA $242A | $242A=A | |
| 026740 | JSR $68ED | SR: $0268ED | モンスター行動決定 |
| 026743 | BCS #$58 | if(c==on) goto $02679D | |
| 026745 | LDA #$0008 | A=#$0008 | |
| 026748 | STA $2470 | $2470=A | |
| 02674B | RTS | return | |
| 02674C | JSL $C2CAE0 | SR: $02CAE0 引数:1#$203C 引数:2#$00FF | グループ番号取得 |
| 026754 | TAX | X=A | |
| 026755 | LDA $23B0,X | A=$23B0+X | |
| 026758 | AND #$00FF | A&=#$00FF | 同一グループの連発不可行動情報を取得 |
| 02675B | STA $246C | $246C=A | |
| 02675E | JSL $C2C573 | SR: $02C573 引数:1#$02 | 行動パターン取得 |
| 026763 | STA $246E | $246E=A | |
| 026766 | ASL | A<<1 | |
| 026767 | ASL | A<<1 | |
| 026768 | ASL | A<<1 | |
| 026769 | STA $2472 | $2472=A | |
| 02676C | LDA $246E | A=$246E | |
| 02676F | ASL | A<<1 | |
| 026770 | TAX | X=A | |
| 026771 | JSR $67AD | SR: $($0267AD+X) | 行動パターンに応じた行動取得 |
| 026774 | BCS #$27 | if(c==on) goto $02679D | |
| 026776 | LDA $2470 | A=$2470 | |
| 026779 | STA $00 | DP($00)=A | |
| 02677B | JSL $C2C573 | SR: $02C573 引数:1#$04 | 各行動インデックスの複数回行動可をチェック |
| 026780 | BEQ #$1A | if(z==on) goto $02679C | |
| 026782 | JSL $C2CAE0 | SR: $02CAE0 引数:1#$203C 引数:2#$00FF | グループ番号取得 |
| 02678A | TAX | X=A | |
| 02678B | LDA $2470 | A=$2470 | |
| 02678E | JSL $C014F2 | SR: $0014F2 | 1ビットのビットマスク作成 |
| 026792 | SEP #$20 | m=on(A/M:8b) | |
| 026794 | ORA $23B0,X | Aor=$23B0+X | |
| 026797 | STA $23B0,X | $23B0+X=A | |
| 02679A | REP #$20 | m=off(A/M:16b) | |
| 02679C | RTS | return | |
| 02679D | LDA #$0001 | A=#$0001 | 行動が決められない場合は直接攻撃 |
| 0267A0 | STA $242A | $242A=A | |
| 0267A3 | JSR $6A07 | SR: $026A07 | 敵の対象決定処理SR_SR_0001 |
| 0267A6 | LDA #$0008 | A=#$0008 | |
| 0267A9 | STA $2470 | $2470=A | |
| 0267AC | RTS | return |
このSRでは各行動パターン(均等・坂・崖・ローテ)に加え、各グループの連発不可情報($7E23B0-B3)を加味、更に知能パターンによる取捨選択を再帰で行って行動を決定します。決定した行動が連発不可の対象であれば$7E23B0に情報を追記します。
- SR: $0268ED モンスター行動選択
| 0268ED | PHX | Push X | |
|---|---|---|---|
| 0268EE | PHY | Push Y | |
| 0268EF | LDX $242A | X=$242A | 戦闘行動IDをXにセット |
| 0268F2 | PEA #$2011 | Push #$2011 | |
| 0268F5 | PEA #$0040 | Push #$0040 | |
| 0268F8 | PEA #$7E00 | Push #$7E00 | |
| 0268FB | JSL $C9029E | SR: $09029E | RAM上情報取得 |
| 0268FF | BEQ #$0A | if(z==on) goto $02690B | 格闘場でない |
| 026901 | JSL $C2CC25 | SR: $02CC25 引数:1#$007C 引数:2#$0002 | 対象選択ルーチンが有効か |
| 026909 | BEQ #$45 | if(z==on) goto $026950 | |
| 02690B | JSL $C2C240 | SR: $02C240 引数:1#$0E | 知能パターン取得 |
| 026910 | BEQ #$13 | if(z==on) goto $026925 | 0はバカ |
| 026912 | DEC | A– | 取得した知能パターンをデクリメント |
| 026913 | BEQ #$1A | if(z==on) goto $02692F | 0は人間 |
| 026915 | JSL $C2E71C | SR: $02E71C | 現MPが選択呪文の消費MPより上か |
| 026919 | BCC #$35 | if(c==off) goto $026950 | |
| 02691B | JSL $C2CC25 | SR: $02CC25 引数:1#$0064 引数:2#$00FF | 対象選択ルーチンインデックス(神)取得 |
| 026923 | BRA #$25 | goto $02694A | |
| 026925 | JSL $C2CC25 | SR: $02CC25 引数:1#$0062 引数:2#$00FF | 対象選択ルーチンインデックス(バカ)取得 |
| 02692D | BRA #$1B | goto $02694A | |
| 02692F | LDY $2428 | Y=$2428 | |
| 026932 | JSL $C2CAE0 | SR: $02CAE0 引数:1#$2052 引数:2#$0040 | ?フラグ取得 |
| 02693A | BEQ #$06 | if(z==on) goto $026942 | |
| 02693C | JSL $C2E71C | SR: $02E71C | 現MPが選択呪文の消費MPより上か |
| 026940 | BCC #$0E | if(c==off) goto $026950 | |
| 026942 | JSL $C2CC25 | SR: $02CC25 引数:1#$0063 引数:2#$00FF | 対象選択ルーチンインデックス(人間)取得 |
| 02694A | JSR $695A | SR: $02695A | 対象決定 |
| 02694D | PLY | Pull Y | |
| 02694E | PLX | Pull X | |
| 02694F | RTS | return | |
| 026950 | PLY | Pull Y | |
| 026951 | PLX | Pull X | |
| 026952 | LDA #$0040 | A=#$0040 | |
| 026955 | STA $2430 | $2430=A | |
| 026958 | SEC | c=on | |
| 026959 | RTS | return |
正直この部分については変更の必要性をあまり感じていなかったせいもあって、深く調べていなかったため、今初めて真面目に見ていますがなんとなくわかりますが、細かくは不明です。ターン開始前にどうするかを決める部分なので、最終的なターゲット決定は行動直前に決めるようです。



コメント