今回は「逃げる」の時の処理です。
- 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% |
コメント
HP主に憧れて、私もドラクエ6をいじり始めました。ツール有効活用させていただいています。さて、一点知りたいのですが、主人公の勇者転職条件を、魔法戦士、パラデインマスターでも可となるよう変更したいと思っています。難度は高めでしょうか?具体的な変更手順の情報お持ちでしたら公開して欲しいです。
DQ6は解析がまるで終わっていないのでおそらく転職処理のどこかでキャラクターIDをみて上級職への転職条件を判断しているのでその辺をいじればできるのではないかと思いますが、どこで転職処理をやっているか情報がないので現状わかりません。おそらくプログラムの変更が必要です。そのうち解析が進んで場所がわかれば記事にします。