DQ3戦闘部分解説5

前回に続いてメインループを見ていきます。こんだけ書いてるのにまだ入り口。ネタがまだ続くという意味ではいいのですが、よく調べないといけないので時間も取られるという諸刃の剣。

  • SR: $025B8B モンスター関連戦闘開始時処理
025B8B PHP Push P Flag
025B8C PHB Push DB
025B8D REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
025B8F PEA #$7E7E Push #$7E7E
025B92 PLB Pull DB
025B93 PLB Pull DB
025B94 JSR $5BCE SR: $025BCE モンスターが現れたメッセージ表示
025B97 JSR $5C61 SR: $025C61 格闘場で自分が賭けたモンスターにグループID4をセット
025B9A JSR $5C02 SR: $025C02 戦闘基礎情報をコピー
025B9D JSR $5C3C SR: $025C3C 先制・強襲メッセージ表示
025BA0 JSR $5BA6 SR: $025BA6 デバッグモンスター用ウィンドウ表示
025BA3 PLB Pull DB
025BA4 PLP Pull P Flag
025BA5 RTL return
  • SR: $025C61 格闘場で自分が賭けたモンスターにグループID4をセット
025C61 PEA #$2011 Push #$2011
025C64 PEA #$0040 Push #$0040
025C67 PEA #$7E00 Push #$7E00
025C6A JSL $C9029E SR: $09029E RAM上情報取得
025C6E BEQ #$4F if(z==on) goto $025CBF 格闘場で無ければスキップ
025C70 PEA #$2011 Push #$2011
025C73 PEA #$000C Push #$000C
025C76 PEA #$7E00 Push #$7E00
025C79 JSL $C9029E SR: $09029E RAM上情報取得
025C7D STA $2426 $2426=A 格闘場で自分がかけたグループID取得?
025C80 ASL A<<1
025C81 TAX X=A
025C82 LDY #$0008 Y=#$0008
025C85 LDA $23FE,X A=$23FE+X
025C88 STZ $23FE,X $23FE+X=#$00
025C8B STA $23FE,Y $23FE+Y=A
025C8E LDA $240E,X A=$240E+X
025C91 STZ $240E,X $240E+X=#$00
025C94 STA $240E,Y $240E+Y=A
025C97 LDX #$0017 X=#$0017
025C9A JSL $C2CAD9 SR: $02CAD9 引数:1#$2050 引数:2#$0002 存在フラグ取得?
025CA2 BEQ #$18 if(z==on) goto $025CBC
025CA4 JSL $C2CAD9 SR: $02CAD9 引数:1#$203C 引数:2#$00FF グループID取得
025CAC CMP $2426 A==$2426?
025CAF BNE #$0B if(z==off) goto $025CBC
025CB1 LDA #$0004 A=#$0004
025CB4 JSL $C2CB70 SR: $02CB70 引数:1#$203C 引数:2#$00FF グループID変更
025CBC DEX X–
025CBD BPL #$DB if(n==off) goto $025C9A
025CBF RTS return
  • SR: $025C02 戦闘基礎情報をコピー
025C02 LDA #$0000 A=#$0000
025C05 PEA #$23AB Push #$23AB
025C08 PEA #$0030 Push #$0030
025C0B PEA #$7E00 Push #$7E00
025C0E JSL $C902E9 SR: $0902E9 戦闘中先制強襲フラグ変更
025C12 PEA #$2011 Push #$2011
025C15 PEA #$0020 Push #$0020
025C18 PEA #$7E00 Push #$7E00
025C1B JSL $C9029E SR: $09029E イベント戦闘フラグ取得
025C1F BNE #$1A if(z==off) goto $025C3B
025C21 PEA #$2011 Push #$2011
025C24 PEA #$0003 Push #$0003
025C27 PEA #$7E00 Push #$7E00
025C2A JSL $C9029E SR: $09029E 先制強襲フラグ取得
025C2E PEA #$23AB Push #$23AB
025C31 PEA #$0030 Push #$0030
025C34 PEA #$7E00 Push #$7E00
025C37 JSL $C902E9 SR: $0902E9 先制強襲フラグ変更
025C3B RTS return

ここでは先制・強襲情報を戦闘中使用領域にコピーします。イベント戦闘の場合は先制・強襲フラグはコピーしません。つまり、ボス戦では先制・強襲は発生しないということですね。

またメインループに戻って次のSRを見ます。

  • SR: $02B32F 戦闘終了時フラグセット?
02B32F CLC c=off
02B330 PHP Push P Flag
02B331 PHB Push DB
02B332 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
02B334 PEA #$7E7E Push #$7E7E
02B337 PLB Pull DB
02B338 PLB Pull DB
02B339 PHX Push X
02B33A PHY Push Y
02B33B PHA Push A
02B33C PEA #$23AB Push #$23AB
02B33F PEA #$000F Push #$000F
02B342 PEA #$7E00 Push #$7E00
02B345 JSL $C9029E SR: $09029E RAM上情報取得
02B349 CMP #$0000 A==#$0000?
02B34C BEQ #$05 if(z==on) goto $02B353
02B34E CMP #$0006 A==#$0006?
02B351 BNE #$61 if(z==off) goto $02B3B4
02B353 LDX #$0000 X=#$0000
02B356 JSR $B3C5 SR: $02B3C5
02B359 BEQ #$07 if(z==on) goto $02B362
02B35B INX X++
02B35C INX X++
02B35D JSR $B3E8 SR: $02B3E8
02B360 BNE #$59 if(z==off) goto $02B3BB
02B362 PEA #$2011 Push #$2011
02B365 PEA #$0040 Push #$0040
02B368 PEA #$7E00 Push #$7E00
02B36B JSL $C9029E SR: $09029E
02B36F BEQ #$01 if(z==on) goto $02B372
02B371 INX X++
02B372 LDA $C2B3C1,X A=$02B3C1+X
02B376 PEA #$23AB Push #$23AB
02B379 PEA #$000F Push #$000F
02B37C PEA #$7E00 Push #$7E00
02B37F JSL $C902E9 SR: $0902E9
02B383 PEA #$2011 Push #$2011
02B386 PEA #$0040 Push #$0040
02B389 PEA #$7E00 Push #$7E00
02B38C JSL $C9029E SR: $09029E
02B390 BEQ #$22 if(z==on) goto $02B3B4
02B392 JSL $C2C739 SR: $02C739 引数:1#$00 生存者ビットを残す
02B397 JSL $C270E1 SR: $0270E1 対象数カウント
02B39B BNE #$12 if(z==off) goto $02B3AF
02B39D LDA #$0007 A=#$0007
02B3A0 PEA #$23AB Push #$23AB
02B3A3 PEA #$000F Push #$000F
02B3A6 PEA #$7E00 Push #$7E00
02B3A9 JSL $C902E9 SR: $0902E9
02B3AD BRA #$05 goto $02B3B4
02B3AF CMP #$0002 A>=#$0002?
02B3B2 BCS #$07 if(c==on) goto $02B3BB
02B3B4 LDA $08,S A=Stack($08)
02B3B6 ORA #$0001 Aor=#$0001
02B3B9 STA $08,S Stack($08)=A
02B3BB PLA Pull A
02B3BC PLY Pull Y
02B3BD PLX Pull X
02B3BE PLB Pull DB
02B3BF PLP Pull P Flag
02B3C0 RTL return

このSRはいまいち詳細が不明ですが、おそらく戦闘参加者が(片側全部)死亡orマヒしていたら戦闘終了フラグを立てる、ということをしているんでしょうかね。格闘場かどうかで立てるフラグが若干変わるようです。