DQ6戦闘部分解説7

だいぶ間が空きましたが、続きをやっていきます。まずは戦闘方針ウィンドウ(?)の部分です。具体的にはこの画面のコマンドです。「たたかう」は内部に通常戦闘コマンド処理を含むので後回しにします。

  • SR:$023E05 戦闘コマンド処理_SRアドレス_入れ替え
023E05 JSL $C5EF55 SR: $05EF55 戦闘中入れ替え処理
023E09 SEC c=on
023E0A RTS return
  • SR:$05EF55 戦闘中入れ替え処理
05EF55 PHP Push P Flag
05EF56 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05EF58 PHA Push A
05EF59 PHX Push X
05EF5A PHY Push Y
05EF5B PHB Push DB
05EF5C JSL $C1CEDA SR: $01CEDA
05EF60 BCC #$22 if(c==off) goto $05EF84
05EF62 LDA #$0061 A=#$0061
05EF65 JSL $C37236 SR: $037236 ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
05EF69 JSL $C02A16 SR: $002A16 引数:1#$0179 戦闘メッセージ表示「ここでは いれかえは できない!」
05EF6F JSL $C31BD0 SR: $031BD0
05EF73 LDA $38B0 A=$38B0
05EF76 DEC A–
05EF77 JSL $C3B5DB SR: $03B5DB
05EF7B PLB Pull DB
05EF7C REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05EF7E PLY Pull Y
05EF7F PLX Pull X
05EF80 PLA Pull A
05EF81 PLP Pull P Flag
05EF82 SEC c=on
05EF83 RTL return
05EF84 JSL $C42B1C SR: $042B1C 引数:1#$08 引数:2#$FF パーティ人数取得
05EF8A CMP #$0001 A==#$0001?
05EF8D BNE #$22 if(z==off) goto $05EFB1
05EF8F LDA #$0061 A=#$0061
05EF92 JSL $C37236 SR: $037236 ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
05EF96 JSL $C02A16 SR: $002A16 引数:1#$0177 戦闘メッセージ表示「いれかえられる なかまがいない!」
05EF9C JSL $C31BD0 SR: $031BD0
05EFA0 LDA $38B0 A=$38B0
05EFA3 DEC A–
05EFA4 JSL $C3B5DB SR: $03B5DB
05EFA8 PLB Pull DB
05EFA9 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05EFAB PLY Pull Y
05EFAC PLX Pull X
05EFAD PLA Pull A
05EFAE PLP Pull P Flag
05EFAF SEC c=on
05EFB0 RTL return
05EFB1 LDA #$0079 A=#$0079
05EFB4 JSL $C37236 SR: $037236 ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
05EFB8 BCC #$11 if(c==off) goto $05EFCB
05EFBA LDA $38B0 A=$38B0
05EFBD DEC A–
05EFBE JSL $C3B5DB SR: $03B5DB
05EFC2 PLB Pull DB
05EFC3 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05EFC5 PLY Pull Y
05EFC6 PLX Pull X
05EFC7 PLA Pull A
05EFC8 PLP Pull P Flag
05EFC9 SEC c=on
05EFCA RTL return
05EFCB ASL A<<1
05EFCC TAX X=A
05EFCD JMP $EFD0 ($05EFD0) goto $($05EFD0+X)

DQ3と比べて低レベルの処理がまぜこぜになってるような印象を受けます。一番最後では、選んだメニュー「いれかえ」「そうがえ」「みる」に応じた処理にジャンプするようになっています。

  • SR:$023E0B 戦闘コマンド処理_SRアドレス_作戦
023E0B JSL $C5F4F3 SR: $05F4F3
023E0F BCS #$04 if(c==on) goto $023E15
023E11 JSL $C5F395 SR: $05F395 戦闘中作戦替え処理
023E15 SEC c=on
023E16 RTS return
  • SR:$05F395 戦闘中作戦替え処理
05F395 PHP Push P Flag
05F396 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F398 PHA Push A
05F399 PHX Push X
05F39A PHY Push Y
05F39B PHB Push DB
05F39C LDX $38B0 X=$38B0
05F39F JSL $C43488 SR: $043488 引数:1#$FF 作戦取得
05F3A4 STA $3AE4 $3AE4=A
05F3A7 STA $3AE6 $3AE6=A
05F3AA STZ $3AF8 $3AF8=#$00
05F3AD STZ $3AC4 $3AC4=#$00
05F3B0 JSL $C92B4D SR: $092B4D 引数:1#$00 引数:2#$0020 引数:3#$7E38B4 引数:4#$0016 構造体アクセス(変更)
05F3BC LDA #$0087 A=#$0087
05F3BF JSL $C37313 SR: $037313 ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
05F3C3 BCC #$11 if(c==off) goto $05F3D6
05F3C5 LDA $38B0 A=$38B0
05F3C8 DEC A–
05F3C9 JSL $C3B5DB SR: $03B5DB
05F3CD PLB Pull DB
05F3CE REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F3D0 PLY Pull Y
05F3D1 PLX Pull X
05F3D2 PLA Pull A
05F3D3 PLP Pull P Flag
05F3D4 SEC c=on
05F3D5 RTL return
05F3D6 JSL $C434B2 SR: $0434B2 引数:1#$FF 作戦変更
05F3DB LDA $38B0 A=$38B0
05F3DE DEC A–
05F3DF JSL $C3B5DB SR: $03B5DB
05F3E3 LDA #$00D5 A=#$00D5
05F3E6 JSL $C31DFD SR: $031DFD ウィンドウ描画処理
05F3EA JSL $C5CC76 SR: $05CC76
05F3EE JSL $C37581 SR: $037581
05F3F2 PLB Pull DB
05F3F3 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F3F5 PLY Pull Y
05F3F6 PLX Pull X
05F3F7 PLA Pull A
05F3F8 PLP Pull P Flag
05F3F9 CLC c=off
05F3FA RTL return

基本的には特にコメントすることはなく、ストレートな実装になっていると思います。「逃げる」についてはそこそこ掘り下げる箇所があるので、キリが悪いですが次回に回します。