DQ6戦闘部分解説8

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

  • SR:$023E17 戦闘コマンド処理_SRアドレス_逃げる
023E17 JSL $C1F32A SR: $01F32A 引数:1#$00B1 BGM再生
023E1D LDA #$0042 A=#$0042
023E20 STA $2555 $2555=A
023E23 PEA #$2011 Push #$2011 イベント戦闘なら逃走不可
023E26 PEA #$0004 Push #$0004
023E29 PEA #$7E00 Push #$7E00
023E2C JSL $C92965 SR: $092965 RAM上情報取得
023E30 BNE #$49 if(z==off) goto $023E7B
023E32 JSR $3ECB SR: $023ECB 確実に逃げられるか(該当c=on)
023E35 BCS #$22 if(c==on) goto $023E59
023E37 PEA #$2514 Push #$2514
023E3A PEA #$0060 Push #$0060
023E3D PEA #$7E00 Push #$7E00
023E40 JSL $C92965 SR: $092965 RAM上情報取得
023E44 TAX X=A
023E45 LDA $C23EC7,X A=$023EC7+X 逃走確率閾値アクセス
023E49 AND #$00FF A&=#$00FF
023E4C STA $00 DP($00)=A
023E4E JSL $C00E97 SR: $000E97 乱数発生(00-FF)
023E52 AND #$0007 A&=#$0007
023E55 CMP $00 A>=DP($00)?
023E57 BCS #$12 if(c==on) goto $023E6B
023E59 LDA #$0005 A=#$0005
023E5C PEA #$2514 Push #$2514
023E5F PEA #$001E Push #$001E
023E62 PEA #$7E00 Push #$7E00
023E65 JSL $C929B0 SR: $0929B0 RAM上情報変更
023E69 CLC c=off
023E6A RTS return
023E6B JSR $3F24 SR: $023F24 レンジャーがいるときの追加逃走閾値取得
023E6E STA $00 DP($00)=A
023E70 JSL $C00E97 SR: $000E97 乱数発生(00-FF)
023E74 AND #$0007 A&=#$0007
023E77 CMP $00 A>=DP($00)?
023E79 BCC #$DE if(c==off) goto $023E59
023E7B PEA #$2514 Push #$2514
023E7E PEA #$0060 Push #$0060
023E81 PEA #$7E00 Push #$7E00
023E84 JSL $C92965 SR: $092965 RAM上情報取得
023E88 INC A++
023E89 CMP #$0004 A>=#$0004?
023E8C BCS #$0D if(c==on) goto $023E9B
023E8E PEA #$2514 Push #$2514
023E91 PEA #$0060 Push #$0060
023E94 PEA #$7E00 Push #$7E00
023E97 JSL $C929B0 SR: $0929B0 RAM上情報変更
023E9B LDA #$0002 A=#$0002
023E9E PEA #$2513 Push #$2513
023EA1 PEA #$0003 Push #$0003
023EA4 PEA #$7E00 Push #$7E00
023EA7 JSL $C929B0 SR: $0929B0 RAM上情報変更
023EAB JSL $C2CAC6 SR: $02CAC6
023EAF JSL $C2CA59 SR: $02CA59
023EB3 JSL $C02A16 SR: $002A16 引数:1#$0028 戦闘メッセージ表示「○○は にげだした!」
023EB9 JSL $C02A16 SR: $002A16 引数:1#$0001 戦闘メッセージ表示:プロンプト
023EBF JSL $C02A16 SR: $002A16 引数:1#$0029 戦闘メッセージ表示「しかし まわりこまれてしまった!」
023EC5 CLC c=off
023EC6 RTS return

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

逃走回数 閾値 成功率
1回目 4 50%
2回目 4 50%
3回目 6 75%
4回目以降 7 87.5%

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

  • SR:$023ECB 確実に逃げられるか(該当c=on)
023ECB PEA #$2010 Push #$2010 エリアレベルを取得
023ECE PEA #$00FF Push #$00FF
023ED1 PEA #$7E00 Push #$7E00
023ED4 JSL $C92965 SR: $092965
023ED8 CLC c=off
023ED9 ADC #$0005 A+=(#$0005+c) エリアレベル+5が閾値
023EDC STA $00 DP($00)=A
023EDE LDA #$0001 A=#$0001 主人公のキャラクターID
023EE1 JSL $C4494E SR: $04494E 引数:1#$07 引数:2#$FF 引数:3#$FF レベル取得
023EE8 CMP $00 A>=DP($00)? 主人公のレベルが閾値以上なら逃走成功
023EEA BCS #$36 if(c==on) goto $023F22
023EEC PEA #$2513 Push #$2513
023EEF PEA #$0003 Push #$0003
023EF2 PEA #$7E00 Push #$7E00
023EF5 JSL $C92965 SR: $092965
023EF9 CMP #$0001 A==#$0001? 先制中なら逃走成功
023EFC BEQ #$24 if(z==on) goto $023F22
023EFE JSL $C2E939 SR: $02E939 引数:1#$06 モンスターのみフラグを立てる
023F03 JSL $C2E966 SR: $02E966 引数:1#$00 生存中以外はフラグを落とす
023F08 JSL $C2E9C6 SR: $02E9C6 引数:1#$18 睡眠中はフラグを落とす
023F0D JSL $C2E9C6 SR: $02E9C6 引数:1#$28 麻痺中はフラグを落とす
023F12 JSL $C2E9C6 SR: $02E9C6 引数:1#$44 凍りつき中(パルプンテ効果)はフラグを落とす
023F17 JSL $C252DF SR: $0252DF 動けるキャラクターがいるか
023F1B CMP #$0000 A==#$0000? 動けるモンスターがいないなら逃走成功
023F1E BEQ #$02 if(z==on) goto $023F22
023F20 CLC c=off
023F21 RTS return
023F22 SEC c=on
023F23 RTS return

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

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

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

  • SR:$023F24 レンジャーがパーティにいる場合の追加逃走閾値取得
023F24 LDA #$0000 A=#$0000 パーティ中レンジャー最大熟練度初期化
023F27 PHA Push A
023F28 JSL $C42B1C SR: $042B1C 引数:1#$01 引数:2#$FD パーティ人数取得
023F2E DEY Y–
023F2F TYA A=Y
023F30 JSL $C2BB76 SR: $02BB76 ステータス取得
023F34 AND #$0001 A&=#$0001 死亡中ならスキップ
023F37 BNE #$24 if(z==off) goto $023F5D
023F39 AND #$0008 A&=#$0008 マヒ中ならスキップ
023F3C BNE #$1F if(z==off) goto $023F5D
023F3E AND #$0010 A&=#$0010 睡眠中ならスキップ
023F41 BNE #$1A if(z==off) goto $023F5D
023F43 JSL $C43641 SR: $043641 引数:1#$01 引数:2#$FD 引数:3#$FF 職業ID取得
023F4A CMP #$000F A==#$000F? 職業IDがレンジャーか
023F4D BNE #$0E if(z==off) goto $023F5D
023F4F JSL $C4391D SR: $04391D 引数:1#$01 引数:2#$FD 引数:3#$FF 職業熟練度取得
023F56 INC A++
023F57 CMP $01,S A>=Stack($01)?
023F59 BCC #$02 if(c==off) goto $023F5D
023F5B STA $01,S Stack($01)=A
023F5D DEY Y–
023F5E BPL #$CF if(n==off) goto $023F2F
023F60 PLA Pull A
023F61 TAX X=A
023F62 LDA $C23F6A,X A=$023F6A+X
023F66 AND #$00FF A&=#$00FF
023F69 RTS return

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

熟練度 閾値 追加成功率
1 0 0%
2 0 0%
3 2 25%
4 2 25%
5 4 25%
6 4 50%
7 4 50%
8 7 87.5%

コメント

  1. 匿名 より:

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

    管理者より返信:

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