前々回示した戦闘メインループを順番に見ていきます。言い忘れましたが、解説はDQ3 Extended 1.43をベースに行ないます。戦闘行動にアクセスする部分がオリジナルと変わっている以外は同じはずです。
- SR: $025A55 戦闘中使用RAM領域初期化
025A56 | PHP | Push P Flag | |
---|---|---|---|
025A57 | PHB | Push DB | |
025A58 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
025A5A | PEA #$7E7E | Push #$7E7E | |
025A5D | PLB | Pull DB | |
025A5E | PLB | Pull DB | |
025A5F | LDX #$07CE | X=#$07CE | |
025A62 | STZ $2030,X | $2030+X=#$00 | |
025A65 | DEX | X– | |
025A66 | DEX | X– | |
025A67 | BPL #$F9 | if(n==off) goto $025A62 | |
025A69 | LDA #$FFFF | A=#$FFFF | |
025A6C | STA $2462 | $2462=A | |
025A6F | STA $2464 | $2464=A | |
025A72 | STA $2465 | $2465=A | |
025A75 | PLB | Pull DB | |
025A76 | PLP | Pull P Flag | |
025A77 | RTL | return |
RAMアドレス$7E2030~7E27FFを戦闘開始時に毎回#$00でリセットしているようです。というわけで戦闘中の使用RAMはこの範囲であると想定してよさそうです。
- SR: $025A78 パーティ戦闘中基本情報設定
025A78 | PHP | Push P Flag | |
---|---|---|---|
025A79 | PHB | Push DB | |
025A7A | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
025A7C | PEA #$7E7E | Push #$7E7E | |
025A7F | PLB | Pull DB | |
025A80 | PLB | Pull DB | |
025A81 | PEA #$2011 | Push #$2011 | |
025A84 | PEA #$0040 | Push #$0040 | |
025A87 | PEA #$7E00 | Push #$7E00 | |
025A8A | JSL $C9029E | SR: $09029E | RAM上情報取得 |
025A8E | BNE #$34 | if(z==off) goto $025AC4 | 格闘場モードならスキップ |
025A90 | JSL $C4297C | SR: $04297C 引数:1#$01 引数:2#$FE | パーティ人数をXにセット |
025A96 | LDY #$0000 | Y=#$0000 | |
025A99 | DEX | X– | |
025A9A | BMI #$28 | if(n==on) goto $025AC4 | |
025A9C | JSL $C429DA | SR: $0429DA 引数:1#$01 引数:2#$FD 引数:3#$FF | 対象キャラのフィールド上情報スタートアドレスをAにセット |
025AA3 | STA $2420 | $2420=A | |
025AA6 | STA $2424 | $2424=A | |
025AA9 | LDA #$0001 | A=#$0001 | |
025AAC | STA $241E | $241E=A | |
025AAF | STA $2422 | $2422=A | |
025AB2 | LDA #$0005 | A=#$0005 | |
025AB5 | STA $2426 | $2426=A | |
025AB8 | JSL $C2AB00 | SR: $02AB00 | キャラクター情報セット |
025ABC | LDA $2428 | A=$2428 | |
025ABF | BMI #$FE | if(n==on) goto $025ABF | |
025AC1 | INY | Y++ | |
025AC2 | BRA #$D5 | goto $025A99 | |
025AC4 | PLB | Pull DB | |
025AC5 | PLP | Pull P Flag | |
025AC6 | RTL | return |
- SR: $02AB00 キャラクター情報セット
02AB00 | PHP | Push P Flag | |
---|---|---|---|
02AB01 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
02AB03 | PHA | Push A | |
02AB04 | PHX | Push X | |
02AB05 | PHY | Push Y | |
02AB06 | PHB | Push DB | |
02AB07 | PEA #$7E7E | Push #$7E7E | |
02AB0A | PLB | Pull DB | |
02AB0B | PLB | Pull DB | |
02AB0C | JSL $C2AC31 | SR: $02AC31 | 新規キャラクター追加場所サーチ(追加不可c=on?) |
02AB10 | BCS #$64 | if(c==on) goto $02AB76 | |
02AB12 | JSL $C2AD55 | SR: $02AD55 | 戦闘中RAM領域を1キャラクター分0で初期化 |
02AB16 | LDX $2428 | X=$2428 | |
02AB19 | JSL $C2CB70 | SR: $02CB70 引数:1#$203B 引数:2#$00FF | 戦闘中キャラクター情報変更 |
02AB21 | LDA #$0001 | A=#$0001 | |
02AB24 | JSL $C2CB70 | SR: $02CB70 引数:1#$2050 引数:2#$0002 | 戦闘中キャラクター情報変更(存在フラグ?) |
02AB2C | LDA $2426 | A=$2426 | |
02AB2F | JSL $C2CB70 | SR: $02CB70 引数:1#$203C 引数:2#$00FF | 戦闘中キャラクター情報変更(グループ番号#$05) |
02AB37 | LDA $2420 | A=$2420 | |
02AB3A | JSL $C2CA98 | SR: $02CA98 引数:1#$2049 | 戦闘中キャラクター情報変更(元キャラ格納位置アドレス) |
02AB40 | LDA $2424 | A=$2424 | |
02AB43 | JSL $C2CA98 | SR: $02CA98 引数:1#$204B | 戦闘中キャラクター情報変更(モシャス後格納位置アドレス) |
02AB49 | LDA $241E | A=$241E | |
02AB4C | JSL $C2CB70 | SR: $02CB70 引数:1#$2050 引数:2#$0001 | 戦闘中キャラクター情報変更 |
02AB54 | LDA $2422 | A=$2422 | |
02AB57 | JSL $C2CB70 | SR: $02CB70 引数:1#$2051 引数:2#$0001 | 戦闘中キャラクター情報変更 |
02AB5F | JSR $ABA1 | SR: $02ABA1 | 戦闘中基礎ステータスセット |
02AB62 | LDA $2426 | A=$2426 | |
02AB65 | ASL | A<<1 | |
02AB66 | TAX | X=A | |
02AB67 | LDA $2420 | A=$2420 | |
02AB6A | STA $23FE,X | $23FE+X=A | |
02AB6D | INC $240E,X | $240E+X++ | |
02AB70 | JSR $BA12 | SR: $02BA12 | |
02AB73 | JSR $AB7E | SR: $02AB7E | |
02AB76 | PLB | Pull DB | |
02AB77 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
02AB79 | PLY | Pull Y | |
02AB7A | PLX | Pull X | |
02AB7B | PLA | Pull A | |
02AB7C | PLP | Pull P Flag | |
02AB7D | RTL | return |
- SR: $02ABA1 戦闘中基礎ステータスセット
02ABA1 | LDA $2422 | A=$2422 | 敵味方フラグ? |
---|---|---|---|
02ABA4 | BNE #$04 | if(z==off) goto $02ABAA | |
02ABA6 | JSR $ABAE | SR: $02ABAE | HPMP攻撃力守備力素早さセット |
02ABA9 | RTS | return | |
02ABAA | JSR $AC0C | SR: $02AC0C | 攻撃力守備力素早さセット |
02ABAD | RTS | return |
PC側のHPMP情報は戦闘中RAMにはセットされず、移動中キャラクター情報(7E3925-)を使うようになっています。情報のダブリを防ぐための措置と思われます。正しいですね。
- SR: $025AC7 モンスター戦闘中情報設定
025AC7 | PHP | Push P Flag | |
---|---|---|---|
025AC8 | PHB | Push DB | |
025AC9 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
025ACB | PEA #$7E7E | Push #$7E7E | |
025ACE | PLB | Pull DB | |
025ACF | PLB | Pull DB | |
025AD0 | LDA #$0001 | A=#$0001 | |
025AD3 | PEA #$23AC | Push #$23AC | |
025AD6 | PEA #$0080 | Push #$0080 | |
025AD9 | PEA #$7E00 | Push #$7E00 | |
025ADC | JSL $C902E9 | SR: $0902E9 | RAM上情報変更 |
025AE0 | LDA $4EE0 | A=$4EE0 | |
025AE3 | STA $2456 | $2456=A | |
025AE6 | LDX #$0000 | X=#$0000 | |
025AE9 | LDY $2008,X | Y=$2008+X | モンスター出現数 |
025AEC | BEQ #$3E | if(z==on) goto $025B2C | |
025AEE | LDA $2000,X | A=$2000+X | モンスターID |
025AF1 | BEQ #$39 | if(z==on) goto $025B2C | |
025AF3 | STA $2420 | $2420=A | |
025AF6 | STA $2424 | $2424=A | |
025AF9 | JSR $5B46 | SR: $025B46 | 怪しい影の実体モンスター決定 |
025AFC | TXA | A=X | |
025AFD | LSR | A>>1 | |
025AFE | STA $2426 | $2426=A | |
025B01 | LDA #$0000 | A=#$0000 | |
025B04 | STA $241E | $241E=A | |
025B07 | STA $2422 | $2422=A | |
025B0A | JSL $C2AB00 | SR: $02AB00 | キャラクター情報セット |
025B0E | LDA $2428 | A=$2428 | |
025B11 | BMI #$FE | if(n==on) goto $025B11 | |
025B13 | PHX | Push X | |
025B14 | LDX $2428 | X=$2428 | |
025B17 | LDA $2456 | A=$2456 | |
025B1A | JSL $C2CB70 | SR: $02CB70 引数:1#$203A 引数:2#$00FF | |
025B22 | INC $2456 | $2456++ | |
025B25 | INC $2456 | $2456++ | |
025B28 | PLX | Pull X | |
025B29 | DEY | Y– | |
025B2A | BNE #$DE | if(z==off) goto $025B0A | |
025B2C | INX | X++ | |
025B2D | INX | X++ | |
025B2E | CPX #$0008 | X>=#$0008? | |
025B31 | BCC #$B6 | if(c==off) goto $025AE9 | |
025B33 | LDA #$0000 | A=#$0000 | |
025B36 | PEA #$23AC | Push #$23AC | |
025B39 | PEA #$0080 | Push #$0080 | |
025B3C | PEA #$7E00 | Push #$7E00 | |
025B3F | JSL $C902E9 | SR: $0902E9 | RAM上変更 |
025B43 | PLB | Pull DB | |
025B44 | PLP | Pull P Flag | |
025B45 | RTL | return |
- SR: $025B46 怪しい影の実体モンスター決定
025B46 | LDA $2420 | A=$2420 | |
---|---|---|---|
025B49 | CMP #$0019 | A==#$0019? | |
025B4C | BNE #$3C | if(z==off) goto $025B8A | |
025B4E | PHX | Push X | |
025B4F | PHY | Push Y | |
025B50 | SEP #$30 | m=on(A/M:8b) x=on(X/Y:8b) | |
025B52 | LDA #$00 | A=#$00 | |
025B54 | JSL $C42FEB | SR: $042FEB 引数:1#$01 引数:2#$FF 引数:3#$FF | レベル取得 |
025B5B | INC | A++ | |
025B5C | PHA | Push A | |
025B5D | LDX #$83 | X=#$83 | キングヒドラのモンスターID |
025B5F | LDY #$00 | Y=#$00 | 同じレベルのモンスター数? |
025B61 | JSL $C2CC8B | SR: $02CC8B 引数:1#$0002 引数:2#$003F | モンスター情報取得(レベル) |
025B69 | CMP $01,S | A>=Stack($01)? | モンスターレベルが先頭PCより高ければスキップ |
025B6B | BCS #$05 | if(c==on) goto $025B72 | |
025B6D | TXA | A=X | |
025B6E | STA $2484,Y | $2484+Y=A | モンスターIDをテンポラリバッファにセット? |
025B71 | INY | Y++ | |
025B72 | DEX | X– | |
025B73 | BNE #$EC | if(z==off) goto $025B61 | |
025B75 | PLA | Pull A | |
025B76 | DEY | Y– | |
025B77 | TYA | A=Y | |
025B78 | JSL $C0133E | SR: $00133E | 乱数発生 00-A A(1B) |
025B7C | TAY | Y=A | |
025B7D | LDA $2484,Y | A=$2484+Y | |
025B80 | STA $2424 | $2424=A | |
025B83 | STZ $2425 | $2425=#$00 | |
025B86 | REP #$30 | m=off(A/M:16b) x=off(X/Y:16b) | |
025B88 | PLY | Pull Y | |
025B89 | PLX | Pull X | |
025B8A | RTS | return |
特につっこむ点は有りませんが、あやしいかげの場合に実体のモンスターを決める部分が面白いですね。これを見ると実体モンスターはモンスターID#$1から#$83まで(スライムからキングヒドラ)の中から先頭PCのレベルに応じて選択されるようです。当然同じレベルのモンスター(特に63)は何種類もいますが、ランダムで選択される実装になっています。
コメント