DQ6戦闘部分解説12

長らくサボっていましたが、とりあえず再開します。改造作業も完全にサボってますwww。モチベ回復にはもうしばらく掛かりそうです。

dq6戦闘画面5

  • SR:$023A0A 特技呪文対象選択処理
023A0ALDA $3874A=$3874
023A0DSTA $258D$258D=A
023A10CMP #$0012A==#$0012?戦闘行動がミナデインか
023A13BEQ #$34if(z==on) goto $023A49
023A15JSL $C2C1ECSR: $02C1EC現MPが消費MP以上か(該当c=on)
023A19BCS #$0Dif(c==on) goto $023A28
023A1BLDA #$0060A=#$0060戦闘メッセージ「MPが たりない!」
023A1ESTA $303E$303E=A
023A21JSL $C5F58BSR: $05F58B戦闘メッセージ表示
023A25SEP #$40v=on
023A27RTSreturn
023A28JSR $3AA5SR: $023AA5対象行動情報セット
023A2BBCC #$07if(c==off) goto $023A34
023A2DJSL $C3B0B9SR: $03B0B9ウィンドウ消去(フェードなし)
023A31SEP #$40v=on
023A33RTSreturn
023A34LDA $258DA=$258D
023A37CMP #$0012A==#$0012?
023A3ABNE #$03if(z==off) goto $023A3F
023A3CJSR $3A54SR: $023A54ミナデインフラグON
023A3FLDA $38B0A=$38B0
023A42DECA–
023A43JSL $C3B4F9SR: $03B4F9指定ページ以上の深さのバッファクリア
023A47CLVv=off
023A48RTSreturn
023A49JSL $C26590SR: $026590ミナデインが実行可能か(該当c=on)
023A4DBCC #$D9if(c==off) goto $023A28
023A4FLDA #$0089A=#$0089戦闘メッセージ「いまは となえられない!」
023A52BRA #$CAgoto $023A1E
  • SR:$02C1EC 現MPが消費MP以上か(該当c=on)
02C1ECPHPPush P Flag
02C1EDREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02C1EFPHAPush A
02C1F0PHXPush X
02C1F1PHYPush Y
02C1F2PHBPush DB
02C1F3PEA #$7E7EPush #$7E7E
02C1F6PLBPull DB
02C1F7PLBPull DB
02C1F8STZ $00DP($00)=#$00
02C1FALDA $2516A=$2516
02C1FDAND #$0008A&=#$0008やまびこ発動中なら現MPは無視
02C200BNE #$40if(z==off) goto $02C242
02C202LDA $2515A=$2515
02C205AND #$0080A&=#$0080まねまねによる反撃なら現MPは無視
02C208BNE #$38if(z==off) goto $02C242
02C20ALDA $258BA=$258B
02C20DASLA< <1
02C20ETAXX=A
02C20FLDA $C2F092,XA=$02F092+X
02C213TAXX=A
02C214LDA $204F,XA=$204F+X
02C217AND #$01FFA&=#$01FF
02C21ACMP #$0100A>=#$0100?発動者がPC側か
02C21DBCS #$08if(c==on) goto $02C227
02C21FLDY #$FFFFY=#$FFFF
02C222LDA $2032,XA=$2032+Xモンスター側現MPを取得
02C225BRA #$0Bgoto $02C232
02C227LDA $2061,XA=$2061+X
02C22AAND #$001FA&=#$001F仲間になった順を取得
02C22DTAYY=A
02C22EJSL $C46F13SR: $046F13現MPを取得
02C232PHAPush A
02C233LDX $258DX=$258D
02C236JSR $C254SR: $02C254消費MP計算
02C239STA $00DP($00)=A
02C23BPLAPull A
02C23CBCS #$0Dif(c==on) goto $02C24B
02C23ECMP $00A>=DP($00)?
02C240BCC #$09if(c==off) goto $02C24B
02C242PLBPull DB
02C243REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02C245PLYPull Y
02C246PLXPull X
02C247PLAPull A
02C248PLPPull P Flag
02C249SECc=on
02C24ARTLreturn
02C24BPLBPull DB
02C24CREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02C24EPLYPull Y
02C24FPLXPull X
02C250PLAPull A
02C251PLPPull P Flag
02C252CLCc=off
02C253RTLreturn

ここで重大なことを発見してしまいました。戦闘中アドレスの$2061の下位5ビットは「仲間になった順番」を意味しています。RAM中ではこの順番で移動中のPC情報を保存しているので、5ビットの最大値31体までしかこの情報を正しくこの領域に保持できません。DQ6 Extendedでは36体まで仲間を持てるようにしてしまったので32体目以降この部分の判定が正しくできないことになります(まだ確認していませんが)。恐らく32体目以降は1-5番目の仲間の現MP情報が使用されてしまうことになります。他に同様の箇所がどれくらいあるのかわかりませんが、全部別の方法で対象PCの開始アドレスを取得する方法に差し替える必要がありそうです。解決策としては$204F-50に保持しているキャラクターID(同じ種族の仲間モンスターでもIDが別になっているので特定可能)から開始アドレスを取得するという変換SRを使う(なければ新規作成)ことで対応することはできそうです。こういう発見があるので記事にするべく真面目に解析をするのは意味があると再認識しましたwww。

  • SR:$02C254 消費MP計算
02C254PHAPush A
02C255TXAA=X
02C256ASLA< <1
02C257TAXX=A
02C258LDA $C8EE67,XA=$08EE67+X
02C25CTAXX=A
02C25DLDA $C8C660,XA=$08C660+X
02C261AND #$003FA&=#$003F対象の戦闘行動の消費MPを取得
02C264CMP #$003FA==#$003F?#$3FならMP全消費
02C267BEQ #$0Fif(z==on) goto $02C278
02C269STA $01,SStack($01)=A
02C26BPLAPull A
02C26CBEQ #$08if(z==on) goto $02C276
02C26ECPY #$FFFFY==#$FFFF?
02C271BEQ #$03if(z==on) goto $02C276
02C273JSR $C27DSR: $02C27D職業が賢者の場合の消費MP調整
02C276CLCc=off
02C277RTSreturn
02C278PLAPull A
02C279BNE #$FBif(z==off) goto $02C276
02C27BSECc=on
02C27CRTSreturn
  • SR:$02C27D 職業が賢者の場合の消費MP調整
02C27DPHAPush A
02C27EJSL $C476C8SR: $0476C8職業ID取得
02C282CMP #$000EA==#$000E?職業IDが賢者か?
02C285BNE #$0Eif(z==off) goto $02C295
02C287TYAA=Y
02C288ASLA< <1
02C289TAXX=A
02C28APLAPull A
02C28BJSR $C297SR: $($02C297+X)
02C28ECMP #$0000A==#$0000?
02C291BNE #$01if(z==off) goto $02C294
02C293INCA++消費MPが0なら1にする
02C294PHAPush A
02C295PLAPull A
02C296RTSreturn

ここでは行動主体者が賢者の場合に熟練度に応じてMPを調整する処理を行っています。処理の解析は省略しますが、以下のようになっています。さらに、計算の結果消費MPが0になる戦闘行動は消費MP1に強制的に変更しています。

熟練度消費MP
1100%
2100%
387.5%
487.5%
575%
675%
762.5%
850%
  • SR:$026590 ミナデインが実行可能か(該当c=on)
026590CLCc=off
026591PHPPush P Flag
026592REP #$30m=off(A/M:16b) x=off(X/Y:16b)
026594LDA $2516A=$2516
026597AND #$0008A&=#$0008やまびこ中なら可能だから判定スキップ?
02659ABNE #$36if(z==off) goto $0265D2
02659CLDA #$0006A=#$0006グループ番号6を指定してマスク情報作成
02659FJSL $C2E939SR: $02E939 引数:1#$02指定グループのキャラクターのみ残す
0265A4JSL $C2E966SR: $02E966 引数:1#$04馬車内のキャラクターを外す
0265A9JSL $C2E966SR: $02E966 引数:1#$00死人を外す
0265AEJSL $C2E9C6SR: $02E9C6 引数:1#$28麻痺中を外す
0265B3JSL $C2E9C6SR: $02E9C6 引数:1#$14混乱中を外す
0265B8JSL $C2E9C6SR: $02E9C6 引数:1#$0Cマホトーン中を外す
0265BDJSL $C2E966SR: $02E966 引数:1#$3A現MPが10未満を外す
0265C2JSL $C252DFSR: $0252DFマスク情報から行動可能キャラクター数を取得
0265C6CMP #$0004A>=#$0004?4人全員行動可能でないとミナデインは実行できない
0265C9BCS #$07if(c==on) goto $0265D2
0265CBLDA $01,SA=Stack($01)
0265CDORA #$0001Aor=#$0001
0265D0STA $01,SStack($01)=A
0265D2PLPPull P Flag
0265D3RTLreturn

ミナデインという呪文は自分はDQ6で使った記憶がないのでよく知らなかったのですが、発動させるには条件があることがわかりました。

  • 4人全員生存
  • 麻痺中のPCがいない
  • マホトーン中のPCがいない
  • 混乱中のPCがいない
  • 全員のMPが10以上

1番目と5番目はともかくとして、マホトーン中や混乱中の仲間がいると発動できないとは知りませんでした。逆に睡眠中の仲間はいてもいいようですwww。ミナデインは実行ターンでは仲間全員の行動もできなくなるので、回復が必要なボス戦では危なっかしくて使う気にならないのですが(イメージ的にはそれで正しいとは思うけど)、これまたなんとかしたいところではあります。術者以外は動けるけど発動まで3ターン必要とかならいいかなと思います(もちろんその間別の術者がミナデインは使えない、発動ターンに上記条件を満たしていなかったら不発にするとか)。

コメント

タイトルとURLをコピーしました