今回はルーレットで選択された戦闘行動を実行するかの判断をどうやっているか見ていきます。
- SR:$0267B5 行動パターンに応じた行動決定_SR_0000
略 | |||
---|---|---|---|
$0267C4 | STA $242A | $242A=A | |
$0267C7 | JSR $68ED | SR: $0268ED | |
$0267CA | BCS #$01 | if(c==on) goto $0267CD | |
$0267CC | RTS | return | |
略 |
- SR:$0268ED モンスター行動選択
$0268ED | PHX | Push X | |
---|---|---|---|
$0268EE | PHY | Push Y | |
$0268EF | LDX $242A | X=$242A | |
$0268F2 | PEA #$2011 | Push #$2011 | |
$0268F5 | PEA #$0040 | Push #$0040 | |
$0268F8 | PEA #$7E00 | Push #$7E00 | 格闘場の戦闘か? |
$0268FB | JSL $C9029E | SR: $09029E | RAM情報取得 |
$0268FF | BEQ #$0A | if(z==on) goto $02690B | |
$026901 | JSL $C2CC25 | SR: $02CC25 引数:1#$007C 引数:2#$0002 | 格闘場で選択対象になるフラグチェック |
$026909 | BEQ #$45 | if(z==on) goto $026950 | |
$02690B | JSL $C2C240 | SR: $02C240 引数:1#$0E | 知能パターン取得 |
$026910 | BEQ #$13 | if(z==on) goto $026925 | バカの場合 |
$026912 | DEC | A– | |
$026913 | BEQ #$1A | if(z==on) goto $02692F | 人間の場合 |
$026915 | JSL $C2B466 | SR: $02B466 | 現MPが選択呪文の消費MPより上か |
$026919 | BCC #$35 | if(c==off) goto $026950 | |
$02691B | JSL $C2CC25 | SR: $02CC25 引数:1#$0064 引数:2#$00FF | 知能パターン「神」の判定SR番号取得 |
$026923 | BRA #$25 | goto $02694A | |
$026925 | JSL $C2CC25 | SR: $02CC25 引数:1#$0062 引数:2#$00FF | 知能パターン「バカ」の判定SR番号取得 |
$02692D | BRA #$1B | goto $02694A | |
$02692F | LDY $2428 | Y=$2428 | |
$026932 | JSL $C2CAE0 | SR: $02CAE0 引数:1#$2052 引数:2#$0040 | MP切れ等で行動できない? |
$02693A | BEQ #$06 | if(z==on) goto $026942 | |
$02693C | JSL $C2B466 | SR: $02B466 | 現MPが選択呪文の消費MPより上か |
$026940 | BCC #$0E | if(c==off) goto $026950 | |
$026942 | JSL $C2CC25 | SR: $02CC25 引数:1#$0063 引数:2#$00FF | 知能パターン「人間」の判定SR番号取得 |
$02694A | JSR $695A | SR: $02695A | 個別戦闘行動実行判定 |
$02694D | PLY | Pull Y | |
$02694E | PLX | Pull X | |
$02694F | RTS | return | |
$026950 | PLY | Pull Y | |
$026951 | PLX | Pull X | |
$026952 | LDA #$0040 | A=#$0040 | |
$026955 | STA $2430 | $2430=A | |
$026958 | SEC | c=on | |
$026959 | RTS | return |
このSRはまだ枠組みの部分です。格闘場で使われない戦闘行動(仲間を呼ぶ、逃げるなど)は$026901での判定で実行されないことがわかります。長らく戦闘行動の28バイト目2ビット目は「対象選択ルーチンで有効」という謎の説明をしていましたが、正しくは「格闘場で選択対象になる」だったことがわかります。そこから先は知能パターンに応じた判定SRのIDを取得しているだけです。
- SR:$02695A 個別戦闘行動実行判定
$02695A | CMP #$0047 | A>=#$0047? | |
---|---|---|---|
$02695D | BCS #$FE | if(c==on) goto $02695D | |
$02695F | ASL | A< <1 | |
$026960 | TAX | X=A | |
$026961 | LDY $2428 | Y=$2428 | |
$026964 | JSR $6971 | SR: $($026971+X) | |
$026967 | BCC #$07 | if(c==off) goto $026970 | |
$026969 | LDA #$0040 | A=#$0040 | |
$02696C | STA $2430 | $2430=A | |
$02696F | SEC | c=on | |
$026970 | RTS | return |
ここから個別の判定SRがようやく呼ばれることになります。個別のSRの実装は「判定の結果実行するならc=off、しないならc=onを返す」という実装がされています。例としてばくだんいわのメガンテの実行判定を見てみます。
- SR:$026B7A メガンテ判定(人間)
$026B7A | JSL $C2C240 | SR: $02C240 引数:1#$00 | 最大HP取得 |
---|---|---|---|
$026B7F | LSR | A>>1 | |
$026B80 | LSR | A>>1 | |
$026B81 | PHA | Push A | |
$026B82 | JSL $C2BE8A | SR: $02BE8A 引数:1#$00 | 現在HP取得 |
$026B87 | CMP $01,S | A==or>=Stack($01)? | 現在HPが1/4を切っていたらメガンテ実行する |
$026B89 | PLA | Pull A | |
$026B8A | BCS #$03 | if(c==on) goto $026B8F | |
$026B8C | JSR $6A4B | SR: $026A4B | |
$026B8F | RTS | return |
爆弾岩の最大HPは500なので126以上のときは選択されない、ということになります。ちなみにメガンテ判定(神)はオリジナルでは設定されているモンスターは存在しません。DQ3 K.Mixではマントゴーア(知能:神)にメガンテを割り当て、さらにHPが半分を切ると選択されるように変えました。
コメント
お世話になっております。
質問すみません。
戦闘中のふっかつのいしの処理はどのようになっているのでしょうか?
実装したのがもうだいぶ前なんで記憶の彼方でしたが、死んだキャラを外す処理のところで復活の石を持っていたら復活処理+復活の石削除等の処理をやっていました。変更範囲は局所的です。
ありがとうございます。
探してみます。(´;ω;`)
すみません、StirlingでA9 12 01を検索にかけてみましたけどよくわかりませんでした。
/(^o^)\
よろしければ石削除処理を教えていただけないでしょうか?
$0EE5A1-近辺を見てください。キリがないので返信はこれで最後にします。
ありがとうございました。