DQ6戦闘部分解説4

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

  • SR: $023555 戦闘開始時初期設定等処理
023555PHPPush P Flag
023556PHBPush DB
023557REP #$30m=off(A/M:16b) x=off(X/Y:16b)
023559PEA #$7E7EPush #$7E7E
02355CPLBPull DB
02355DPLBPull DB
02355EJSR $3573SR: $023573
023561JSL $C2CA59SR: $02CA59
023565JSL $C0268FSR: $00268F
023569JSR $35ADSR: $0235ADモンスター出現処理+強襲メッセージ表示
02356CJSR $3610SR: $023610出現時特殊ステータスセット
02356FPLBPull DB
023570PLPPull P Flag
023571CLCc=off
023572RTLreturn

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

  • SR: $0235AD モンスター出現処理+強襲メッセージ表示
0235ADLDX #$0000X=#$0000
0235B0LDA $2577,XA=$2577+X
0235B3BEQ #$19if(z==on) goto $0235CE
0235B5LDA #$0004A=#$0004戦闘メッセージID「○○が あらわれた!」
0235B8PHAPush A
0235B9LDA $2567,XA=$2567+X
0235BCSTA $5A22$5A22=A
0235BFCMP #$00F0A==#$00F0?デスタムーア第2形態
0235C2BNE #$05if(z==off) goto $0235C9
0235C4LDA #$0005A=#$0005戦闘メッセージID「○○が しょうたいを あらわした!」
0235C7STA $01,SStack($01)=A
0235C9PLAPull A
0235CAJSL $C02A29SR: $002A29戦闘メッセージ表示 メッセージID:A
0235CEINXX++
0235CFINXX++
0235D0CPX #$0008X>=#$0008?
0235D3BCC #$DBif(c==off) goto $0235B0
0235D5JSL $C02A16SR: $002A16 引数:1#$0001戦闘メッセージ表示
0235DBLDA #$0041A=#$0041
0235DESTA $2555$2555=A
0235E1PEA #$2513Push #$2513
0235E4PEA #$0003Push #$0003
0235E7PEA #$7E00Push #$7E00
0235EAJSL $C92965SR: $092965RAM上情報取得
0235EEBEQ #$17if(z==on) goto $023607
0235F0DECA–
0235F1ASLA< <1
0235F2ASLA< <1
0235F3TAXX=A
0235F4JSL $C00E97SR: $000E97乱数発生(00-FF)
0235F8AND #$0001A&=#$0001
0235FBBEQ #$02if(z==on) goto $0235FF
0235FDINXX++
0235FEINXX++
0235FFLDA $C23608,XA=$023608+X
023603JSL $C02A29SR: $002A29戦闘メッセージ表示 メッセージID:A
023607RTSreturn

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

  • SR: $023610 出現時特殊ステータスセット
023610JSL $C0268FSR: $00268F
023614LDX #$0000X=#$0000
023617STX $2559$2559=X
02361AJSL $C23625SR: $023625出現時眠り状態決定?
02361EINXX++
02361FCPX #$0018X>=#$0018?
023622BCC #$F3if(c==off) goto $023617
023624RTSreturn
  • SR: 023625 出現時眠り・マホカンタ状態決定?
023625PHPPush P Flag
023626REP #$30m=off(A/M:16b) x=off(X/Y:16b)
023628PHAPush A
023629PHXPush X
02362APHYPush Y
02362BPHBPush DB
02362CPEA #$7E7EPush #$7E7E
02362FPLBPull DB
023630PLBPull DB
023631LDX $2559X=$2559
023634JSL $C2EFA7SR: $02EFA7 引数:1#$205F 引数:2#$0001戦闘中キャラクター情報取得 インデックス:X
02363CBEQ #$5Bif(z==on) goto $023699
02363EJSL $C2EFA7SR: $02EFA7 引数:1#$204F 引数:2#$01FF戦闘中キャラクター情報取得 インデックス:X
023646CMP #$0100A>=#$0100?キャラクターIDが味方ならスキップ
023649BCS #$4Eif(c==on) goto $023699
02364BTAYY=A
02364CJSL $C2F13DSR: $02F13D 引数:1#$0170 引数:2#$000Cモンスター基本データアクセス インデックス:Y
023654PHXPush X
023655ASLA< <1
023656TAXX=A
023657JSL $C00E97SR: $000E97乱数発生(00-FF)
02365BAND #$0003A&=#$0003
02365ECMP $C236A1,XA==or>=$0236A1+X?
023662PLXPull X
023663BCS #$34if(c==on) goto $023699
023665JSL $C2F13DSR: $02F13D 引数:1#$0176 引数:2#$0004モンスター基本データアクセス インデックス:Y
02366DBEQ #$0Dif(z==on) goto $02367C
02366FLDA #$0001A=#$0001マホカンタ設定
023672JSL $C2F034SR: $02F034 引数:1#$2059 引数:2#$0040戦闘中キャラクター情報変更 インデックス:X
02367ABRA #$1Dgoto $023699
02367CLDA #$0004A=#$0004眠り深度設定
02367FJSL $C2F034SR: $02F034 引数:1#$2050 引数:2#$00E0戦闘中キャラクター情報変更 インデックス:X
023687LDA $59AAA=$59AA
02368ACMP #$0007A>=#$0007?
02368DBCC #$04if(c==off) goto $023693
02368FJSL $C0268FSR: $00268F
023693JSL $C02A16SR: $002A16 引数:1#$000A戦闘メッセージ表示「しかし ○○は ねむっている!」
023699PLBPull DB
02369AREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02369CPLYPull Y
02369DPLXPull X
02369EPLAPull A
02369FPLPPull P Flag
0236A0RTLreturn

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

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

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

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

コメント

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