DQ6戦闘部分解説4

1ヶ月前にDQ6 Extendedのデバッグをそのうち再開すると言っておきながら結局1秒たりとも時間を割いていない上に、相変わらずやる気がまるでわかないのを放置しているとここも何も書くことがなくなってしまうので、とりあえず途中で止めていたDQ6の戦闘部分の解析をすることでそのうちモチベが回復するのではという淡い期待をしつつ再開します。前回同様10月末ギリギリになっての更新です。一応しばらくネタには困らなそうなので次回以降はもうちょっと投下間隔は短くなる予定。

  • SR: $023555 戦闘開始時初期設定等処理
023555 PHP Push P Flag
023556 PHB Push DB
023557 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
023559 PEA #$7E7E Push #$7E7E
02355C PLB Pull DB
02355D PLB Pull DB
02355E JSR $3573 SR: $023573
023561 JSL $C2CA59 SR: $02CA59
023565 JSL $C0268F SR: $00268F
023569 JSR $35AD SR: $0235AD モンスター出現処理+強襲メッセージ表示
02356C JSR $3610 SR: $023610 出現時特殊ステータスセット
02356F PLB Pull DB
023570 PLP Pull P Flag
023571 CLC c=off
023572 RTL return

上3つのSRでは何をやっているのか、中を見てもよくわかりませんでした。

  • SR: $0235AD モンスター出現処理+強襲メッセージ表示
0235AD LDX #$0000 X=#$0000
0235B0 LDA $2577,X A=$2577+X
0235B3 BEQ #$19 if(z==on) goto $0235CE
0235B5 LDA #$0004 A=#$0004 戦闘メッセージID「○○が あらわれた!」
0235B8 PHA Push A
0235B9 LDA $2567,X A=$2567+X
0235BC STA $5A22 $5A22=A
0235BF CMP #$00F0 A==#$00F0? デスタムーア第2形態
0235C2 BNE #$05 if(z==off) goto $0235C9
0235C4 LDA #$0005 A=#$0005 戦闘メッセージID「○○が しょうたいを あらわした!」
0235C7 STA $01,S Stack($01)=A
0235C9 PLA Pull A
0235CA JSL $C02A29 SR: $002A29 戦闘メッセージ表示 メッセージID:A
0235CE INX X++
0235CF INX X++
0235D0 CPX #$0008 X>=#$0008?
0235D3 BCC #$DB if(c==off) goto $0235B0
0235D5 JSL $C02A16 SR: $002A16 引数:1#$0001 戦闘メッセージ表示
0235DB LDA #$0041 A=#$0041
0235DE STA $2555 $2555=A
0235E1 PEA #$2513 Push #$2513
0235E4 PEA #$0003 Push #$0003
0235E7 PEA #$7E00 Push #$7E00
0235EA JSL $C92965 SR: $092965 RAM上情報取得
0235EE BEQ #$17 if(z==on) goto $023607
0235F0 DEC A–
0235F1 ASL A< <1
0235F2 ASL A< <1
0235F3 TAX X=A
0235F4 JSL $C00E97 SR: $000E97 乱数発生(00-FF)
0235F8 AND #$0001 A&=#$0001
0235FB BEQ #$02 if(z==on) goto $0235FF
0235FD INX X++
0235FE INX X++
0235FF LDA $C23608,X A=$023608+X
023603 JSL $C02A29 SR: $002A29 戦闘メッセージ表示 メッセージID:A
023607 RTS return

ここではモンスターの出現テキストの表示、および強襲時のメッセージを表示しているようです。$0235F4の乱数は1/2の確率で「○○は こちらが みがまえるまえに おそいかかってきた!」か「○○は いきなり おそいかかってきた!」のどちらを表示するかを決定しているだけのようです。どっちも先手をとられることには変わりないので表現の違いだけです。

  • SR: $023610 出現時特殊ステータスセット
023610 JSL $C0268F SR: $00268F
023614 LDX #$0000 X=#$0000
023617 STX $2559 $2559=X
02361A JSL $C23625 SR: $023625 出現時眠り状態決定?
02361E INX X++
02361F CPX #$0018 X>=#$0018?
023622 BCC #$F3 if(c==off) goto $023617
023624 RTS return
  • SR: 023625 出現時眠り・マホカンタ状態決定?
023625 PHP Push P Flag
023626 REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
023628 PHA Push A
023629 PHX Push X
02362A PHY Push Y
02362B PHB Push DB
02362C PEA #$7E7E Push #$7E7E
02362F PLB Pull DB
023630 PLB Pull DB
023631 LDX $2559 X=$2559
023634 JSL $C2EFA7 SR: $02EFA7 引数:1#$205F 引数:2#$0001 戦闘中キャラクター情報取得 インデックス:X
02363C BEQ #$5B if(z==on) goto $023699
02363E JSL $C2EFA7 SR: $02EFA7 引数:1#$204F 引数:2#$01FF 戦闘中キャラクター情報取得 インデックス:X
023646 CMP #$0100 A>=#$0100? キャラクターIDが味方ならスキップ
023649 BCS #$4E if(c==on) goto $023699
02364B TAY Y=A
02364C JSL $C2F13D SR: $02F13D 引数:1#$0170 引数:2#$000C モンスター基本データアクセス インデックス:Y
023654 PHX Push X
023655 ASL A< <1
023656 TAX X=A
023657 JSL $C00E97 SR: $000E97 乱数発生(00-FF)
02365B AND #$0003 A&=#$0003
02365E CMP $C236A1,X A==or>=$0236A1+X?
023662 PLX Pull X
023663 BCS #$34 if(c==on) goto $023699
023665 JSL $C2F13D SR: $02F13D 引数:1#$0176 引数:2#$0004 モンスター基本データアクセス インデックス:Y
02366D BEQ #$0D if(z==on) goto $02367C
02366F LDA #$0001 A=#$0001 マホカンタ設定
023672 JSL $C2F034 SR: $02F034 引数:1#$2059 引数:2#$0040 戦闘中キャラクター情報変更 インデックス:X
02367A BRA #$1D goto $023699
02367C LDA #$0004 A=#$0004 眠り深度設定
02367F JSL $C2F034 SR: $02F034 引数:1#$2050 引数:2#$00E0 戦闘中キャラクター情報変更 インデックス:X
023687 LDA $59AA A=$59AA
02368A CMP #$0007 A>=#$0007?
02368D BCC #$04 if(c==off) goto $023693
02368F JSL $C0268F SR: $00268F
023693 JSL $C02A16 SR: $002A16 引数:1#$000A 戦闘メッセージ表示「しかし ○○は ねむっている!」
023699 PLB Pull DB
02369A REP #$30 m=off(A/M:16b) x=off(X/Y:16b)
02369C PLY Pull Y
02369D PLX Pull X
02369E PLA Pull A
02369F PLP Pull P Flag
0236A0 RTL return

ここでは出現モンスターの初期状態異常を設定しています。まずは乱数で異常発生するかを決定し、状態異常がマホカンタであるかフラグを見てONが立っていればマホカンタ状態、そうでなければ眠り状態にするという処理をやっています。眠りかマホカンタかは排他のようです。乱数のところの実装がちょっとわかりにくいですが、乱数値を#$03でマスクをかけ(この時点で乱数値の取りうる範囲は0-3)、それと$0236A1から並んでいるしきい値と比較してしきい値より大きければ状態異常にしない、となっています。しきい値は#$00, #$02, #$03, #04なので、確率はそれぞれ0%, 50%, 75%, 100%となります。実際にモンスターに設定されている値を見てみると(一部抜粋)

モンスター名 確率 マホカンタ状態
テールイーター 75% OFF
いどまじん 50% ON
あくまのカガミ 75% ON
キラーマジンガ 50% ON
しれんその2 100% ON

と設定されているので、実際のゲームでの動作と一致してるっぽいです。キラーマジンガなんかは100%マホカンタのようなイメージでしたが、実際は50%だというのはあまり認識していませんでした。奇しくもDQ3 K.Mixにキラーマジンガを登場させたところで何度かの調整の後、キラーマジンガの初期マホカンタ率を25%にしたのですが(運によっては相方のバイキルトが攻撃力激高のキラーマジンガにはかからないようにするため)、オリジナルの実装に知らないうちに寄せていたことになります。

長くなったので今回はこの辺で。数ヶ月ぶりに解析をやったのですが、結構ポンコツになっていて、「強襲メッセージの表示」のところを最初「先制決定」だと思ってたりしてました(なんでドラゴンの職業レベルを取得するところがないんだと思っていましたが、先制強襲決定は戦闘に入る前に行われるのをすっかり忘れていました)。そういう意味でも表に出すエントリしてまとめる作業というのは自分の思考の整理が進んでいいのではと思ったりしています。