DQ6戦闘部分解説2

前回からの続きです。まだ初期化処理中です。

  • SR: $023474 PC側戦闘中情報セット
023474 PHP Push P Flag
023475 PHB Push DB
023476 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
023478 PEA #$7E7E Push #$7E7E
02347B PLB Pull DB
02347C PLB Pull DB
02347D JSL $C42B1C SR: $042B1C 引数:1#$08 引数:2#$FE パーティ人数取得
023483 LDY #$0000 Y=#$0000
023486 JSL $C42C26 SR: $042C26 引数:1#$08 引数:2#$FD 引数:3#$FF キャラクターインデックス取得
02348D ORA #$0100 Aor=#$0100 キャラクターIDに+#$0100する
023490 STA $2587 $2587=A
023493 LDA #$0006 A=#$0006 グループIDをセット
023496 STA $2589 $2589=A
023499 JSL $C2B573 SR: $02B573 戦闘中情報初期化
02349D INY Y++
02349E DEX X–
02349F BNE #$E5 if(z==off) goto $023486
0234A1 PLB Pull DB
0234A2 PLP Pull P Flag
0234A3 RTL return

まずはPC側からの初期化です。得られたキャラクターID(主人公:1、ハッサン:2…)に+#$0100してモンスターIDと区別しています。DQ3ではここは各キャラクターの移動中のアドレスでした。モンスターをあと256体追加する場合にはここを+#$0200すればいいということになります(他も変える必要はありますが)。グループIDには6がセットされるようです。(4は召喚モンスター,5は?)

  • SR: $0234A4 モンスター側戦闘中情報セット
0234A4 PHP Push P Flag
0234A5 PHB Push DB
0234A6 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
0234A8 PEA #$7E7E Push #$7E7E
0234AB PLB Pull DB
0234AC PLB Pull DB
0234AD LDA #$0001 A=#$0001
0234B0 PEA #$2517 Push #$2517
0234B3 PEA #$0040 Push #$0040
0234B6 PEA #$7E00 Push #$7E00
0234B9 JSL $C929B0 SR: $0929B0 RAM上情報変更
0234BD LDA $574E A=$574E
0234C0 STA $25D5 $25D5=A
0234C3 LDX #$0000 X=#$0000
0234C6 LDY $2008,X Y=$2008+X
0234C9 BEQ #$2B if(z==on) goto $0234F6
0234CB LDA $2000,X A=$2000+X
0234CE BEQ #$26 if(z==on) goto $0234F6
0234D0 STA $2587 $2587=A
0234D3 TXA A=X
0234D4 LSR A>>1
0234D5 STA $2589 $2589=A グループIDをセット
0234D8 JSL $C2B573 SR: $02B573 戦闘中情報初期化
0234DC JSR $3510 SR: $023510 デスタムーア出現時特殊処理?
0234DF PHX Push X
0234E0 LDX $258B X=$258B
0234E3 LDA $25D5 A=$25D5
0234E6 JSL $C2EF6B SR: $02EF6B 引数:1#$203A 戦闘中キャラクター情報変更 インデックス:X
0234EC INC $25D5 $25D5++
0234EF INC $25D5 $25D5++
0234F2 PLX Pull X
0234F3 DEY Y–
0234F4 BNE #$E2 if(z==off) goto $0234D8
0234F6 INX X++
0234F7 INX X++
0234F8 CPX #$0008 X>=#$0008?
0234FB BCC #$C9 if(c==off) goto $0234C6
0234FD LDA #$0000 A=#$0000
023500 PEA #$2517 Push #$2517
023503 PEA #$0040 Push #$0040
023506 PEA #$7E00 Push #$7E00
023509 JSL $C929B0 SR: $0929B0 RAM上情報変更
02350D PLB Pull DB
02350E PLP Pull P Flag
02350F RTL return

やっていることはPC側とだいたい同じです。各出現グループに応じてグループIDをセットしているくらいなのと、デスタムーア出現時に特別な処理をしているくらいです。

  • SR: $023510 デスタムーア出現時特殊処理
023510 PEA #$2518 Push #$2518
023513 PEA #$0060 Push #$0060
023516 PEA #$7E00 Push #$7E00
023519 JSL $C92965 SR: $092965 RAM上情報取得
02351D BNE #$35 if(z==off) goto $023554
02351F LDA $2587 A=$2587
023522 CMP #$00EE A==#$00EE? デスタムーア第1形態
023525 BEQ #$0F if(z==on) goto $023536
023527 CMP #$00F0 A==#$00F0? デスタムーア第2形態
02352A BEQ #$13 if(z==on) goto $02353F
02352C CMP #$00F2 A==#$00F2? デスタムーア第3形態
02352F BEQ #$13 if(z==on) goto $023544
023531 LDA #$0000 A=#$0000
023534 BRA #$11 goto $023547
023536 JSL $C49D30 SR: $049D30 デスタムーア第1形態出現時アニメーション
02353A LDA #$0001 A=#$0001
02353D BRA #$08 goto $023547
02353F LDA #$0002 A=#$0002
023542 BRA #$03 goto $023547
023544 LDA #$0003 A=#$0003
023547 PEA #$2518 Push #$2518
02354A PEA #$0060 Push #$0060
02354D PEA #$7E00 Push #$7E00
023550 JSL $C929B0 SR: $0929B0 RAM上情報変更
023554 RTS return

これで7E2518の4,5ビットは1:デスタムーア第1形態、2:デスタムーア第2形態、3:デスタムーア第3形態を意味している事がわかります。とはいえ、$023519でこの値が0以外ならこのSRを抜けてしまうので、第2形態以降はどこでセットするんだという感じはしますが(それぞれ前の形態を倒した時に値がリセットされるのかもしれません)。