今回は割と重要なモンスター行動の決定部分です。実は自分も真面目に見たことがないので泥縄で理解しながらの投下です。
- SR: $026464 モンスター行動決定
026464 | PHP | Push P Flag | |
---|---|---|---|
026465 | PHB | Push DB | |
026466 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
026468 | PEA #$7E7E | Push #$7E7E | |
02646B | PLB | Pull DB | |
02646C | PLB | Pull DB | |
02646D | LDY #$0000 | Y=#$0000 | |
026470 | LDA $23B8,Y | A=$23B8+Y | |
026473 | AND #$00FF | A&=#$00FF | |
026476 | CMP #$0018 | A>=#$0018? | |
026479 | BCS #$07 | if(c==on) goto $026482 | |
02647B | STA $2428 | $2428=A | |
02647E | JSL $C2648B | SR: $02648B | モンスター行動決定(個別) |
026482 | INY | Y++ | |
026483 | CPY #$0018 | Y>=#$0018? | |
026486 | BCC #$E8 | if(c==off) goto $026470 | |
026488 | PLB | Pull DB | |
026489 | PLP | Pull P Flag | |
02648A | RTL | return |
- SR: $02648B モンスター行動決定(個別)
02648B | PHP | Push P Flag | |
---|---|---|---|
02648C | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
02648E | PHA | Push A | |
02648F | PHX | Push X | |
026490 | PHY | Push Y | |
026491 | PHB | Push DB | |
026492 | PEA #$7E7E | Push #$7E7E | |
026495 | PLB | Pull DB | |
026496 | PLB | Pull DB | |
026497 | LDX $2428 | X=$2428 | |
02649A | JSL $C2CAD9 | SR: $02CAD9 引数:1#$2050 引数:2#$0002 | 行動可能か? |
0264A2 | BEQ #$4E | if(z==on) goto $0264F2 | |
0264A4 | JSL $C2B416 | SR: $02B416 | 行動主体者が味方かつドラゴラム中かチェック |
0264A8 | BCC #$48 | if(c==off) goto $0264F2 | |
0264AA | JSR $64FA | SR: $0264FA | 強襲or逃げる失敗時に各モンスターが行動するか決める |
0264AD | BCS #$43 | if(c==on) goto $0264F2 | |
0264AF | JSL $C2BE8A | SR: $02BE8A 引数:1#$1C | 生死判定 |
0264B4 | BCS #$3C | if(c==on) goto $0264F2 | |
0264B6 | JSL $C2BE8A | SR: $02BE8A 引数:1#$20 | アストロン残りターン数 |
0264BB | BCS #$31 | if(c==on) goto $0264EE | |
0264BD | JSL $C2BE8A | SR: $02BE8A 引数:1#$16 | 麻痺チェック |
0264C2 | BCS #$2A | if(c==on) goto $0264EE | |
0264C4 | JSL $C2CAD9 | SR: $02CAD9 引数:1#$2047 引数:2#$00FF | 眠りの深さ取得 |
0264CC | BNE #$20 | if(z==off) goto $0264EE | |
0264CE | JSL $C2CAD9 | SR: $02CAD9 引数:1#$2052 引数:2#$0002 | ? |
0264D6 | BNE #$16 | if(z==off) goto $0264EE | |
0264D8 | JSL $C2BE8A | SR: $02BE8A 引数:1#$26 | 時間を止めたキャラクターか? |
0264DD | BCS #$0F | if(c==on) goto $0264EE | |
0264DF | JSL $C2C240 | SR: $02C240 引数:1#$0E | 知能パターン取得 |
0264E4 | CMP #$0002 | A==#$0002? | 神なら行動直前に決める? |
0264E7 | BEQ #$05 | if(z==on) goto $0264EE | |
0264E9 | JSR $6557 | SR: $026557 | モンスター行動決定 |
0264EC | BRA #$04 | goto $0264F2 | |
0264EE | JSL $C2B4F1 | SR: $02B4F1 | 戦闘中キャラクター行動リセット? |
0264F2 | PLB | Pull DB | |
0264F3 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
0264F5 | PLY | Pull Y | |
0264F6 | PLX | Pull X | |
0264F7 | PLA | Pull A | |
0264F8 | PLP | Pull P Flag | |
0264F9 | RTL | return |
- SR: $026557 モンスター行動決定
026557 | LDX $2428 | X=$2428 | |
---|---|---|---|
02655A | JSL $C2B52D | SR: $02B52D | 戦闘中キャラクター行動情報初期化 |
02655E | JSL $C2C240 | SR: $02C240 引数:1#$10 | 行動回数取得 |
026563 | TAY | Y=A | |
026564 | JSL $C265DA | SR: $0265DA | 戦闘行動決定 |
026568 | LDA $242A | A=$242A | |
02656B | JSL $C2CB70 | SR: $02CB70 引数:1#$2034 引数:2#$01FF | 戦闘行動ID指定 |
026573 | LDA $2430 | A=$2430 | |
026576 | JSL $C2CB70 | SR: $02CB70 引数:1#$2035 引数:2#$00FE | ターゲット情報指定 |
02657E | LDA $2470 | A=$2470 | |
026581 | JSL $C2CB70 | SR: $02CB70 引数:1#$204D 引数:2#$00FF | モンスターが何番目の行動を使うか |
026589 | DEY | Y– | |
02658A | BEQ #$4D | if(z==on) goto $0265D9 | |
02658C | JSL $C265DA | SR: $0265DA | 戦闘行動決定 |
026590 | LDA $242A | A=$242A | |
026593 | JSL $C2CB70 | SR: $02CB70 引数:1#$2036 引数:2#$01FF | 戦闘行動ID指定 |
02659B | LDA $2430 | A=$2430 | |
02659E | JSL $C2CB70 | SR: $02CB70 引数:1#$2037 引数:2#$00FE | |
0265A6 | LDA $2470 | A=$2470 | |
0265A9 | JSL $C2CB70 | SR: $02CB70 引数:1#$204E 引数:2#$00FF | |
0265B1 | DEY | Y– | |
0265B2 | BEQ #$25 | if(z==on) goto $0265D9 | |
0265B4 | JSL $C265DA | SR: $0265DA | 戦闘行動決定 |
0265B8 | LDA $242A | A=$242A | |
0265BB | JSL $C2CB70 | SR: $02CB70 引数:1#$2038 引数:2#$01FF | 戦闘行動ID指定 |
0265C3 | LDA $2430 | A=$2430 | |
0265C6 | JSL $C2CB70 | SR: $02CB70 引数:1#$2039 引数:2#$00FE | ターゲット情報指定 |
0265CE | LDA $2470 | A=$2470 | |
0265D1 | JSL $C2CB70 | SR: $02CB70 引数:1#$204F 引数:2#$00FF | モンスターが何番目の行動を使うか |
0265D9 | RTS | return |
ここまでは枠組みの話で、これといって特筆するべき点はありません。次回は戦闘行動決定の部分を詳しく見ていくことにします。
(2010-11-04追記)
- SR: $0264FA 強襲or逃げる失敗時に各モンスターが行動するか決める
0264FA | PEA #$23AB | Push #$23AB | |
---|---|---|---|
0264FD | PEA #$0030 | Push #$0030 | |
026500 | PEA #$7E00 | Push #$7E00 | |
026503 | JSL $C9029E | SR: $09029E | RAM上情報取得 |
026507 | BEQ #$1E | if(z==on) goto $026527 | 通常 |
026509 | DEC | A– | |
02650A | BEQ #$1D | if(z==on) goto $026529 | 先制時 |
02650C | DEC | A– | |
02650D | BEQ #$29 | if(z==on) goto $026538 | 強襲時 |
02650F | JSL $C2CAD9 | SR: $02CAD9 引数:1#$203C 引数:2#$00FF | グループID取得 |
026517 | CMP #$0004 | A>=#$0004? | PC側or格闘場で賭けたモンスター |
02651A | BCS #$09 | if(c==on) goto $026525 | |
02651C | LDA #$0002 | A=#$0002 | |
02651F | JSL $C0133E | SR: $00133E | 乱数発生 00-A A(1B) |
026523 | BNE #$02 | if(z==off) goto $026527 | |
026525 | SEC | c=on | |
026526 | RTS | return | |
026527 | CLC | c=off | |
026528 | RTS | return | |
026529 | JSL $C2CAD9 | SR: $02CAD9 引数:1#$203C 引数:2#$00FF | グループID取得 |
026531 | CMP #$0004 | A>=#$0004? | PC側or格闘場で賭けたモンスター |
026534 | BCC #$EF | if(c==off) goto $026525 | |
026536 | BRA #$EF | goto $026527 | |
026538 | JSL $C2CAD9 | SR: $02CAD9 引数:1#$203C 引数:2#$00FF | グループID取得 |
026540 | CMP #$0004 | A>=#$0004? | PC側or格闘場で賭けたモンスター |
026543 | BCS #$E0 | if(c==on) goto $026525 | |
026545 | LDA #$0003 | A=#$0003 | |
026548 | PEA #$23AB | Push #$23AB | |
02654B | PEA #$0030 | Push #$0030 | |
02654E | PEA #$7E00 | Push #$7E00 | |
026551 | JSL $C902E9 | SR: $0902E9 | RAM上情報変更 |
026555 | BRA #$D0 | goto $026527 |
ここで注目すべきは$02651Cから$026524の部分です。この実装により、強襲時or逃走失敗時にモンスターが行動する確率は2/31/3になっています。例えば$026523をF0 02に変えると、これが2/3となり、逃走失敗時に攻撃されるリスクが倍になります。FC版ではどうなっていたのかわかりませんが、1/3はちょっと低すぎでは、と思います。3体いても攻撃してくるのは平均1体しかいないわけで、逃げる連発でも何とかなってしまう可能性が高いと思われます。この実装ではDQ2であったような「ドラゴンフライ4体に先制されて炎吐きまくられて何もできないうちに全滅」という悲劇は起こりようがなさそうです。自分の中の感触では、3/4くらいが妥当な気がするので、
02651C | LDA #$0002 | A=#$0003 | |
---|---|---|---|
02651F | JSL $C0133E | SR: $00133E | 乱数発生 00-A A(1B) |
026523 | BNE #$02 | if(z==off) goto $026527 |
としようかと思います。
コメント