DQ3戦闘部分解説4

前々回示した戦闘メインループを順番に見ていきます。言い忘れましたが、解説は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)は何種類もいますが、ランダムで選択される実装になっています。