DQ6戦闘部分解説3

前回からの続きです。まだ戦闘は始まっていません。

  • SR: $02BF22 時の砂使用時処理+戦闘終了判定?
02BF22 CLC c=off
02BF23 PHP Push P Flag
02BF24 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
02BF26 PHA Push A
02BF27 PHX Push X
02BF28 PHY Push Y
02BF29 PHB Push DB
02BF2A PEA #$7E7E Push #$7E7E
02BF2D PLB Pull DB
02BF2E PLB Pull DB
02BF2F LDA $255F A=$255F
02BF32 CMP #$00CC A==#$00CC? 時の砂の戦闘行動ID
02BF35 BEQ #$05 if(z==on) goto $02BF3C
02BF37 CMP #$0143 A==#$0143? 時の砂の戦闘行動ID
02BF3A BNE #$4C if(z==off) goto $02BF88
02BF3C LDA #$0007 A=#$0007 戦闘終了フラグセット(時の砂)
02BF3F PEA #$2514 Push #$2514
02BF42 PEA #$001E Push #$001E
02BF45 PEA #$7E00 Push #$7E00
02BF48 JSL $C929B0 SR: $0929B0 RAM上情報変更
02BF4C JSL $C47ABB SR: $047ABB 時の砂使用時に戦闘開始時の状態にリストアする
02BF50 LDA $255F A=$255F
02BF53 CMP #$0143 A==#$0143? 時の砂の戦闘行動ID
02BF56 BNE #$28 if(z==off) goto $02BF80
02BF58 LDX $2555 X=$2555
02BF5B JSL $C2EFA7 SR: $02EFA7 引数:1#$204F 引数:2#$01FF 戦闘中キャラクター情報取得 インデックス:X
02BF63 CMP #$0100 A>=#$0100? PC側なら#$100以上
02BF66 BCC #$18 if(c==off) goto $02BF80
02BF68 AND #$00FF A&=#$00FF
02BF6B LDY #$00D9 Y=#$00D9 時の砂のアイテムID
02BF6E JSL $C45217 SR: $045217 引数:1#$FD 引数:2#$07 引数:3#$FF 引数:4#$FE アイテム装備チェック
02BF76 BCS #$08 if(c==on) goto $02BF80
02BF78 JSL $C4535C SR: $04535C 引数:1#$07 引数:2#$FF 引数:3#$FE 引数:4#$40 アイテムをPCから削除する
02BF80 PLB Pull DB
02BF81 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
02BF83 PLY Pull Y
02BF84 PLX Pull X
02BF85 PLA Pull A
02BF86 PLP Pull P Flag
02BF87 RTL return
02BF88 PEA #$2514 Push #$2514
02BF8B PEA #$001E Push #$001E
02BF8E PEA #$7E00 Push #$7E00
02BF91 JSL $C92965 SR: $092965 RAM上情報取得
02BF95 CMP #$0005 A==#$0005?
02BF98 BEQ #$E6 if(z==on) goto $02BF80
02BF9A LDA #$0006 A=#$0006
02BF9D JSL $C2E939 SR: $02E939 引数:1#$02 ターゲット情報セット
02BFA2 JSL $C2E966 SR: $02E966 引数:1#$04 ターゲット情報セット
02BFA7 JSL $C2E966 SR: $02E966 引数:1#$00 ターゲット情報セット
02BFAC JSL $C2E9C6 SR: $02E9C6 引数:1#$28 ターゲット情報セット
02BFB1 JSL $C2E9C6 SR: $02E9C6 引数:1#$44 ターゲット情報セット
02BFB6 JSL $C2E9C6 SR: $02E9C6 引数:1#$54
02BFBB LDA $00 A=DP($00)
02BFBD ORA $02 Aor=DP($02)
02BFBF BNE #$62 if(z==off) goto $02C023
02BFC1 JSL $C2E939 SR: $02E939 引数:1#$4E
02BFC6 LDA $00 A=DP($00)
02BFC8 ORA $02 Aor=DP($02)
02BFCA BEQ #$20 if(z==on) goto $02BFEC
02BFCC LDA #$0006 A=#$0006
02BFCF JSL $C2E939 SR: $02E939 引数:1#$02
02BFD4 JSL $C2E9C6 SR: $02E9C6 引数:1#$28
02BFD9 JSL $C2E9C6 SR: $02E9C6 引数:1#$44
02BFDE JSL $C2E9C6 SR: $02E9C6 引数:1#$54
02BFE3 JSL $C252DF SR: $0252DF
02BFE7 CMP #$0002 A>=#$0002?
02BFEA BCS #$65 if(c==on) goto $02C051
02BFEC JSL $C2E939 SR: $02E939 引数:1#$52
02BFF1 LDA $00 A=DP($00)
02BFF3 ORA $02 Aor=DP($02)
02BFF5 BEQ #$27 if(z==on) goto $02C01E
02BFF7 LDA #$0006 A=#$0006
02BFFA JSL $C2E939 SR: $02E939 引数:1#$02
02BFFF JSL $C2E966 SR: $02E966 引数:1#$00
02C004 JSL $C2E9C6 SR: $02E9C6 引数:1#$28
02C009 JSL $C2E9C6 SR: $02E9C6 引数:1#$44
02C00E JSL $C2E9C6 SR: $02E9C6 引数:1#$54
02C013 LDA $00 A=DP($00)
02C015 ORA $02 Aor=DP($02)
02C017 BEQ #$05 if(z==on) goto $02C01E
02C019 JSR $C096 SR: $02C096 戦闘参加キャラクター生存チェック(z=off生存)
02C01C BNE #$33 if(z==off) goto $02C051
02C01E JSR $C0A5 SR: $02C0A5 全滅時馬車メンバー戦闘参加処理(参加不可c=on)
02C021 BCS #$4C if(c==on) goto $02C06F
02C023 JSR $C096 SR: $02C096 戦闘参加キャラクター生存チェック(z=off生存)
02C026 BNE #$42 if(z==off) goto $02C06A
02C028 PEA #$2513 Push #$2513
02C02B PEA #$00C0 Push #$00C0
02C02E PEA #$7E00 Push #$7E00
02C031 JSL $C92965 SR: $092965 RAM上情報取得
02C035 BEQ #$3D if(z==on) goto $02C074
02C037 PEA #$2513 Push #$2513
02C03A PEA #$0030 Push #$0030
02C03D PEA #$7E00 Push #$7E00
02C040 JSL $C92965 SR: $092965 RAM上情報取得
02C044 BEQ #$2E if(z==on) goto $02C074
02C046 DEC A–
02C047 BEQ #$30 if(z==on) goto $02C079
02C049 DEC A–
02C04A BEQ #$32 if(z==on) goto $02C07E
02C04C LDA #$0001 A=#$0001
02C04F BRA #$30 goto $02C081
02C051 STZ $2547 $2547=#$00
02C054 LDA #$0001 A=#$0001
02C057 PEA #$2516 Push #$2516
02C05A PEA #$0010 Push #$0010
02C05D PEA #$7E00 Push #$7E00
02C060 JSL $C929B0 SR: $0929B0 RAM上情報変更
02C064 LDA #$0002 A=#$0002 戦闘終了フラグ(全消し?)
02C067 STA $2545 $2545=A
02C06A LDA #$0000 A=#$0000 戦闘終了フラグ(フリーズ?)
02C06D BRA #$12 goto $02C081
02C06F LDA #$0004 A=#$0004 戦闘終了フラグ(全滅)
02C072 BRA #$0D goto $02C081
02C074 LDA #$0006 A=#$0006 戦闘終了フラグ(モンスター不在)
02C077 BRA #$08 goto $02C081
02C079 LDA #$0003 A=#$0003 戦闘終了フラグ(モンスター逃走)
02C07C BRA #$03 goto $02C081
02C07E LDA #$0002 A=#$0002 戦闘終了フラグ(勝利)
02C081 PEA #$2514 Push #$2514
02C084 PEA #$001E Push #$001E
02C087 PEA #$7E00 Push #$7E00
02C08A JSL $C929B0 SR: $0929B0 RAM上情報変更
02C08E PLB Pull DB
02C08F REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
02C091 PLY Pull Y
02C092 PLX Pull X
02C093 PLA Pull A
02C094 PLP Pull P Flag
02C095 RTL return

前半は時の砂を使った時の処理です。時の砂を手持ちのアイテムから削除し、退避しておいた戦闘開始直後の状態をりすとあしています。後半はどうやらパーティの状態に応じて戦闘終了フラグをセットしているようです。また、パーティが全滅していたら馬車待機中のキャラクターを戦闘に参加させたりしているようです。

  • 全滅時馬車メンバー戦闘参加処理(参加する仲間がいないc=on)
02C0A5 PHX Push X
02C0A6 PHY Push Y
02C0A7 JSL $C2E939 SR: $02E939 引数:1#$00
02C0AC JSL $C2E9C6 SR: $02E9C6 引数:1#$04
02C0B1 JSL $C2E9C6 SR: $02E9C6 引数:1#$28
02C0B6 JSL $C2E9C6 SR: $02E9C6 引数:1#$44
02C0BB JSL $C2E9C6 SR: $02E9C6 引数:1#$54
02C0C0 LDA $00 A=DP($00)
02C0C2 ORA $02 Aor=DP($02) 馬車にいる仲間がいないor全員死んでいる
02C0C4 BEQ #$06 if(z==on) goto $02C0CC
02C0C6 JSL $C2C6B1 SR: $02C6B1 馬車が使える状態か(使えるz=on)
02C0CA BEQ #$04 if(z==on) goto $02C0D0
02C0CC PLY Pull Y
02C0CD PLX Pull X
02C0CE SEC c=on
02C0CF RTS return
02C0D0 JSL $C2CA59 SR: $02CA59
02C0D4 JSL $C0268F SR: $00268F
02C0D8 SEP #$20 m=on(A/M:8b)
02C0DA LDA #$00 A=#$00
02C0DC STA $04 DP($04)=A
02C0DE STA $05 DP($05)=A
02C0E0 STA $06 DP($06)=A
02C0E2 STA $07 DP($07)=A
02C0E4 REP #$20 m=off(A/M:16b)
02C0E6 JSL $C42B1C SR: $042B1C 引数:1#$05 引数:2#$08 パーティ人数取得?
02C0EC LDX #$0000 X=#$0000
02C0EF LDY #$0000 Y=#$0000
02C0F2 JSL $C42C26 SR: $042C26 引数:1#$05 引数:2#$FD 引数:3#$FF キャラクターインデックス取得?
02C0F9 STA $2587 $2587=A
02C0FC PHX Push X
02C0FD PHY Push Y
02C0FE JSL $C2C3BA SR: $02C3BA 主人公が戦闘に参加しているか(該当c=off)
02C102 STX $258B $258B=X
02C105 PLY Pull Y
02C106 PLX Pull X
02C107 BCS #$20 if(c==on) goto $02C129
02C109 JSR $C14D SR: $02C14D 指定したキャラクターが戦闘に参加できるか(不可c=on)
02C10C BCS #$1B if(c==on) goto $02C129
02C10E SEP #$20 m=on(A/M:8b)
02C110 LDA $2587 A=$2587
02C113 STA $04,X DP($04)+X=A
02C115 REP #$20 m=off(A/M:16b)
02C117 AND #$00FF A&=#$00FF
02C11A STA $5A24 $5A24=A キャラクター名をセット
02C11D JSL $C02A16 SR: $002A16 引数:1#$0173 戦闘メッセージ表示「馬車から飛び出した」
02C123 INX X++
02C124 CPX #$0004 X>=#$0004?
02C127 BCS #$0A if(c==on) goto $02C133
02C129 INY Y++
02C12A CPY $08 Y>=DP($08)?
02C12C BCC #$C4 if(c==off) goto $02C0F2
02C12E CPX #$0001 X>=#$0001?
02C131 BCC #$99 if(c==off) goto $02C0CC
02C133 JSL $C42FDC SR: $042FDC 引数:1#$04
02C138 JSL $C2C631 SR: $02C631 パーティウィンドウ再描画
02C13C JSL $C0268F SR: $00268F
02C140 LDA #$0000 A=#$0000
02C143 STA $255B $255B=A
02C146 STA $255D $255D=A
02C149 PLY Pull Y
02C14A PLX Pull X
02C14B CLC c=off
02C14C RTS return

ここでは馬車が使える状態で生存者がいれば4人まで駆り出すという処理をしているようです。