DQ6戦闘部分解説8

今回は「逃げる」の時の処理です。

  • SR:$023E17 戦闘コマンド処理_SRアドレス_逃げる
023E17JSL $C1F32ASR: $01F32A 引数:1#$00B1BGM再生
023E1DLDA #$0042A=#$0042
023E20STA $2555$2555=A
023E23PEA #$2011Push #$2011イベント戦闘なら逃走不可
023E26PEA #$0004Push #$0004
023E29PEA #$7E00Push #$7E00
023E2CJSL $C92965SR: $092965RAM上情報取得
023E30BNE #$49if(z==off) goto $023E7B
023E32JSR $3ECBSR: $023ECB確実に逃げられるか(該当c=on)
023E35BCS #$22if(c==on) goto $023E59
023E37PEA #$2514Push #$2514
023E3APEA #$0060Push #$0060
023E3DPEA #$7E00Push #$7E00
023E40JSL $C92965SR: $092965RAM上情報取得
023E44TAXX=A
023E45LDA $C23EC7,XA=$023EC7+X逃走確率閾値アクセス
023E49AND #$00FFA&=#$00FF
023E4CSTA $00DP($00)=A
023E4EJSL $C00E97SR: $000E97乱数発生(00-FF)
023E52AND #$0007A&=#$0007
023E55CMP $00A>=DP($00)?
023E57BCS #$12if(c==on) goto $023E6B
023E59LDA #$0005A=#$0005
023E5CPEA #$2514Push #$2514
023E5FPEA #$001EPush #$001E
023E62PEA #$7E00Push #$7E00
023E65JSL $C929B0SR: $0929B0RAM上情報変更
023E69CLCc=off
023E6ARTSreturn
023E6BJSR $3F24SR: $023F24レンジャーがいるときの追加逃走閾値取得
023E6ESTA $00DP($00)=A
023E70JSL $C00E97SR: $000E97乱数発生(00-FF)
023E74AND #$0007A&=#$0007
023E77CMP $00A>=DP($00)?
023E79BCC #$DEif(c==off) goto $023E59
023E7BPEA #$2514Push #$2514
023E7EPEA #$0060Push #$0060
023E81PEA #$7E00Push #$7E00
023E84JSL $C92965SR: $092965RAM上情報取得
023E88INCA++
023E89CMP #$0004A>=#$0004?
023E8CBCS #$0Dif(c==on) goto $023E9B
023E8EPEA #$2514Push #$2514
023E91PEA #$0060Push #$0060
023E94PEA #$7E00Push #$7E00
023E97JSL $C929B0SR: $0929B0RAM上情報変更
023E9BLDA #$0002A=#$0002
023E9EPEA #$2513Push #$2513
023EA1PEA #$0003Push #$0003
023EA4PEA #$7E00Push #$7E00
023EA7JSL $C929B0SR: $0929B0RAM上情報変更
023EABJSL $C2CAC6SR: $02CAC6
023EAFJSL $C2CA59SR: $02CA59
023EB3JSL $C02A16SR: $002A16 引数:1#$0028戦闘メッセージ表示「○○は にげだした!」
023EB9JSL $C02A16SR: $002A16 引数:1#$0001戦闘メッセージ表示:プロンプト
023EBFJSL $C02A16SR: $002A16 引数:1#$0029戦闘メッセージ表示「しかし まわりこまれてしまった!」
023EC5CLCc=off
023EC6RTSreturn

$023EC7から1バイトずつ逃走確率の閾値が格納されています。

逃走回数閾値成功率
1回目450%
2回目450%
3回目675%
4回目以降787.5%

となっているので、DQ6では通常時は確実に逃げられることはありません。

  • SR:$023ECB 確実に逃げられるか(該当c=on)
023ECBPEA #$2010Push #$2010エリアレベルを取得
023ECEPEA #$00FFPush #$00FF
023ED1PEA #$7E00Push #$7E00
023ED4JSL $C92965SR: $092965
023ED8CLCc=off
023ED9ADC #$0005A+=(#$0005+c)エリアレベル+5が閾値
023EDCSTA $00DP($00)=A
023EDELDA #$0001A=#$0001主人公のキャラクターID
023EE1JSL $C4494ESR: $04494E 引数:1#$07 引数:2#$FF 引数:3#$FFレベル取得
023EE8CMP $00A>=DP($00)?主人公のレベルが閾値以上なら逃走成功
023EEABCS #$36if(c==on) goto $023F22
023EECPEA #$2513Push #$2513
023EEFPEA #$0003Push #$0003
023EF2PEA #$7E00Push #$7E00
023EF5JSL $C92965SR: $092965
023EF9CMP #$0001A==#$0001?先制中なら逃走成功
023EFCBEQ #$24if(z==on) goto $023F22
023EFEJSL $C2E939SR: $02E939 引数:1#$06モンスターのみフラグを立てる
023F03JSL $C2E966SR: $02E966 引数:1#$00生存中以外はフラグを落とす
023F08JSL $C2E9C6SR: $02E9C6 引数:1#$18睡眠中はフラグを落とす
023F0DJSL $C2E9C6SR: $02E9C6 引数:1#$28麻痺中はフラグを落とす
023F12JSL $C2E9C6SR: $02E9C6 引数:1#$44凍りつき中(パルプンテ効果)はフラグを落とす
023F17JSL $C252DFSR: $0252DF動けるキャラクターがいるか
023F1BCMP #$0000A==#$0000?動けるモンスターがいないなら逃走成功
023F1EBEQ #$02if(z==on) goto $023F22
023F20CLCc=off
023F21RTSreturn
023F22SECc=on
023F23RTSreturn

ここでは確実に逃げられる条件判断を行っています。$023EFE-$023F1Dでは今となってはおなじみになった「各キャラクターをbitに見立てて条件に合わないbitのフラグを落とす」処理をやって、該当する条件のキャラクターがいるかを最後にチェックしています。ちなみにDQ3ではこの判定は行っていませんでした。というわけで、確実に逃げられるのは

  • 主人公のレベルがエリアレベル+5以上の時
  • 先制時
  • モンスターが全て睡眠中・麻痺中・凍りつき中の時

ということになります。エリアレベルの最大は60(デスコッドの先の2番目のフロア以降)なので、主人公のレベルが65あればどこでも確実に逃げられることになります。

  • SR:$023F24 レンジャーがパーティにいる場合の追加逃走閾値取得
023F24LDA #$0000A=#$0000パーティ中レンジャー最大熟練度初期化
023F27PHAPush A
023F28JSL $C42B1CSR: $042B1C 引数:1#$01 引数:2#$FDパーティ人数取得
023F2EDEYY–
023F2FTYAA=Y
023F30JSL $C2BB76SR: $02BB76ステータス取得
023F34AND #$0001A&=#$0001死亡中ならスキップ
023F37BNE #$24if(z==off) goto $023F5D
023F39AND #$0008A&=#$0008マヒ中ならスキップ
023F3CBNE #$1Fif(z==off) goto $023F5D
023F3EAND #$0010A&=#$0010睡眠中ならスキップ
023F41BNE #$1Aif(z==off) goto $023F5D
023F43JSL $C43641SR: $043641 引数:1#$01 引数:2#$FD 引数:3#$FF職業ID取得
023F4ACMP #$000FA==#$000F?職業IDがレンジャーか
023F4DBNE #$0Eif(z==off) goto $023F5D
023F4FJSL $C4391DSR: $04391D 引数:1#$01 引数:2#$FD 引数:3#$FF職業熟練度取得
023F56INCA++
023F57CMP $01,SA>=Stack($01)?
023F59BCC #$02if(c==off) goto $023F5D
023F5BSTA $01,SStack($01)=A
023F5DDEYY–
023F5EBPL #$CFif(n==off) goto $023F2F
023F60PLAPull A
023F61TAXX=A
023F62LDA $C23F6A,XA=$023F6A+X
023F66AND #$00FFA&=#$00FF
023F69RTSreturn

ここではパーティ内に存在するレンジャーの最高熟練度を取得し、それに応じた閾値を返して追加で逃走判定を行っています。馬車の中の仲間は対象外なので職業レベルの高いレンジャーを馬車に突っ込んでおけば逃げ放題というわけにはいかないようです。

熟練度閾値追加成功率
100%
200%
3225%
4225%
5425%
6450%
7450%
8787.5%
スポンサーリンク

コメント

  1. 匿名 より:

    HP主に憧れて、私もドラクエ6をいじり始めました。ツール有効活用させていただいています。さて、一点知りたいのですが、主人公の勇者転職条件を、魔法戦士、パラデインマスターでも可となるよう変更したいと思っています。難度は高めでしょうか?具体的な変更手順の情報お持ちでしたら公開して欲しいです。

    管理者より返信:

    DQ6は解析がまるで終わっていないのでおそらく転職処理のどこかでキャラクターIDをみて上級職への転職条件を判断しているのでその辺をいじればできるのではないかと思いますが、どこで転職処理をやっているか情報がないので現状わかりません。おそらくプログラムの変更が必要です。そのうち解析が進んで場所がわかれば記事にします。

コメントを書く

メールアドレスが公開されることはありません。コメントは管理者の承認後表示されます。