DQ6戦闘部分解説14

戦闘コマンド入力もこれで最後です。「そうび」です。

  • SR:$023CFC 戦闘コマンド処理1人分_装備処理
023CFC JSL $C5F3FB SR: $05F3FB 戦闘中装備替え処理
023D00 JSR $3D05 SR: $023D05 装備変更に伴う攻撃力守備力素早さリセット
023D03 SEC c=on
023D04 RTS return
  • SR:$05F3FB 戦闘中装備替え処理
05F3FB PHP Push P Flag
05F3FC REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F3FE PHA Push A
05F3FF PHX Push X
05F400 PHY Push Y
05F401 PHB Push DB
05F402 PEA #$7E7E Push #$7E7E
05F405 PLB Pull DB
05F406 PLB Pull DB
05F407 JSL $C5F4A5 SR: $05F4A5 使用できる道具があるか(該当c=off)
05F40B BCC #$09 if(c==off) goto $05F416
05F40D PLB Pull DB
05F40E REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F410 PLY Pull Y
05F411 PLX Pull X
05F412 PLA Pull A
05F413 PLP Pull P Flag
05F414 SEC c=on
05F415 RTL return
05F416 LDA #$0076 A=#$0076 ウィンドウID
05F419 JSL $C37236 SR: $037236 ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
05F41D BCC #$09 if(c==off) goto $05F428
05F41F PLB Pull DB
05F420 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F422 PLY Pull Y
05F423 PLX Pull X
05F424 PLA Pull A
05F425 PLP Pull P Flag
05F426 CLC c=off
05F427 RTL return
05F428 PHA Push A
05F429 LDY $386E Y=$386E
05F42C JSL $C2BB34 SR: $02BB34 戦闘中キャラクターIDから通常キャラクターIDへ変換
05F430 STX $2555 $2555=X
05F433 LDX $386E X=$386E
05F436 PLA Pull A $05F419で取得した選択結果をAにセット
05F437 JSL $C451BA SR: $0451BA 引数:1#$01 引数:2#$FE 引数:3#$FF 引数:4#$FD キャラクターの指定位置のアイテムIDを取得
05F43F STY $5A2A $5A2A=Y
05F442 JSL $C4562D SR: $04562D 引数:1#$01 引数:2#$FE 引数:3#$FF アイテム装備処理(装備不能c=on)?
05F449 BCS #$23 if(c==on) goto $05F46E
05F44B LDA #$0061 A=#$0061 ウィンドウID
05F44E JSL $C37236 SR: $037236
05F452 JSL $C02A16 SR: $002A16 引数:1#$01B3 戦闘メッセージ表示「○○は ☓☓を そうびした。」
05F458 JSL $C31BD0 SR: $031BD0 キー入力を待つ(R,Y入力無視)
05F45C LDA $38B0 A=$38B0
05F45F DEC A–
05F460 DEC A–
05F461 JSL $C3B4F9 SR: $03B4F9 指定ページ以上の深さのバッファクリア
05F465 PLB Pull DB
05F466 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F468 PLY Pull Y
05F469 PLX Pull X
05F46A PLA Pull A
05F46B PLP Pull P Flag
05F46C SEC c=on
05F46D RTL return
05F46E LDX $5A2A X=$5A2A
05F471 LDA #$0061 A=#$0061 ウィンドウID
05F474 JSL $C37236 SR: $037236 ウィンドウ描画+ユーザー入力を得る(キャンセルc=on)
05F478 JSL $C4608D SR: $04608D アイテム種別取得+呪われているか
05F47C CMP #$0002 A==#$0002?
05F47F BEQ #$08 if(z==on) goto $05F489
05F481 JSL $C02A16 SR: $002A16 引数:1#$01B1 戦闘メッセージ表示「○○は ☓☓を そうびすることができない。」
05F487 BRA #$06 goto $05F48F
05F489 JSL $C02A16 SR: $002A16 引数:1#$01B2 戦闘メッセージ表示「☓☓を そうびすることは できません。」
05F48F JSL $C31BD0 SR: $031BD0 キー入力を待つ(R,Y入力無視)
05F493 LDA $38B0 A=$38B0
05F496 DEC A–
05F497 DEC A–
05F498 JSL $C3B4F9 SR: $03B4F9 指定ページ以上の深さのバッファクリア
05F49C PLB Pull DB
05F49D REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
05F49F PLY Pull Y
05F4A0 PLX Pull X
05F4A1 PLA Pull A
05F4A2 PLP Pull P Flag
05F4A3 SEC c=on
05F4A4 RTL return

実装を追っても特に特殊なことをやっているわけではありません。

  • SR:$023D05 装備変更に伴う攻撃力守備力素早さリセット
023D05 PHX Push X
023D06 PHY Push Y
023D07 LDX $258B X=$258B
023D0A JSL $C2EFA7 SR: $02EFA7 引数:1#$204F 引数:2#$01FF 戦闘中キャラクター情報取得 インデックス:X
023D12 AND #$00FF A&=#$00FF 下位1バイトでマスクしてキャラクターID取得
023D15 TAY Y=A
023D16 JSL $C450F1 SR: $0450F1 引数:1#$07 引数:2#$FD 引数:3#$FF 攻撃力取得
023D1D JSL $C2F034 SR: $02F034 引数:1#$205A 引数:2#$03FF 戦闘中キャラクター情報変更 インデックス:X
023D25 JSL $C45124 SR: $045124 引数:1#$07 引数:2#$FD 引数:3#$FF 守備力取得
023D2C JSL $C2F034 SR: $02F034 引数:1#$2058 引数:2#$03FF 戦闘中キャラクター情報変更 インデックス:X
023D34 JSL $C44A30 SR: $044A30 引数:1#$07 引数:2#$FD 引数:3#$FF 素早さ取得
023D3B JSL $C2F034 SR: $02F034 引数:1#$205B 引数:2#$0FFC 戦闘中キャラクター情報変更 インデックス:X
023D43 PLY Pull Y
023D44 PLX Pull X
023D45 RTS return

例によってDQ6もルカナンによって守備力が下げられても装備をし直すと下がった守備力がリセットされることがわかります。この部分でまたDQ6 Extendedの不具合を見つけてしまったので、近々rc3に差し替えます。