戦闘行動の実体の説明がひと通り終わったので、その後の処理に戻ります。SR: $027D53の後半部分$027DA8以降から続きを見ていきます。
| 0288CF |
PHY |
Push Y |
|
| 0288D0 |
LDA $23FA |
A=$7E23FA |
ダメージ値が0ならスキップ |
| 0288D3 |
BEQ #$27 |
if(z==on) goto $0288FC |
|
| 0288D5 |
LDY $23E8 |
Y=$7E23E8 |
|
| 0288D8 |
STY $2428 |
$7E2428=Y |
|
| 0288DB |
JSL $02CB32 |
SR: $02CB32 引数:1#$2050 引数:2#$0002 |
生死判定? |
| 0288E3 |
BEQ #$17 |
if(z==on) goto $0288FC |
死んでいたらスキップ |
| 0288E5 |
JSL $02BE8A |
SR: $02BE8A 引数:1#$1C |
生死判定? |
| 0288EA |
BCS #$10 |
if(c==on) goto $0288FC |
死んでいたらスキップ |
| 0288EC |
LDX #$0004 |
X=#$0004 |
|
| 0288EF |
LDA $23EE |
A=$7E23EE |
|
| 0288F2 |
CMP $028903,X |
A==$028903+X? |
戦闘行動と眠り毒麻痺攻撃の戦闘行動IDとのマッチング |
| 0288F6 |
BEQ #$06 |
if(z==on) goto $0288FE |
|
| 0288F8 |
DEX |
X– |
|
| 0288F9 |
DEX |
X– |
|
| 0288FA |
BPL #$F6 |
if(n==off) goto $0288F2 |
|
| 0288FC |
PLY |
Pull Y |
|
| 0288FD |
RTS |
return |
|
| 0288FE |
JSR $8909 |
SR: $($028909+X) |
|
| 028901 |
PLY |
Pull Y |
|
| 028902 |
RTS |
return |
|
| 02890F |
JSL $02A406 |
SR: $02A406 |
成否判定? |
| 028913 |
BCC #$28 |
if(c==off) goto $02893D |
|
| 028915 |
JSL $02B5D8 |
SR: $02B5D8 |
状態:眠り処理 |
| 028919 |
BCS #$22 |
if(c==on) goto $02893D |
|
| 02891B |
JSL $02B977 |
SR: $02B977 |
パーティウィンドウ再描画? |
| 02891F |
LDA #$0041 |
A=#$0041 |
戦闘メッセージ:「ねむってしまった!」 |
| 028922 |
PHA |
Push A |
|
| 028923 |
LDY $23E8 |
Y=$7E23E8 |
|
| 028926 |
JSL $02CAE0 |
SR: $02CAE0 引数:1#$203C 引数:2#$00FF |
グループID取得 |
| 02892E |
CMP #$0004 |
A>=#$0004? |
PCor格闘場で賭けたモンスター |
| 028931 |
BCS #$05 |
if(c==on) goto $028938 |
|
| 028933 |
LDA #$0040 |
A=#$0040 |
戦闘メッセージ:「ねむらせた!」 |
| 028936 |
STA $01,S |
Stack($01)=A |
|
| 028938 |
PLA |
Pull A |
|
| 028939 |
JSL $01A87A |
SR: $01A87A |
戦闘メッセージ表示 |
| 02893D |
RTS |
return |
|
- SR: $02893E 毒攻撃
- SR: $028956 マヒ攻撃
ほとんど一緒なので省略
- SR: $02896D もろはのつるぎ装備時の反射ダメージ処理
| 02896D |
LDA $23F2 |
A=$7E23F2 |
ダメージ値が0ならスキップ |
| 028970 |
BNE #$52 |
if(z==off) goto $0289C4 |
|
| 028972 |
LDX $23EE |
X=$7E23EE |
|
| 028975 |
JSL $02CC25 |
SR: $02CC25 引数:1#$0079 引数:2#$0008 |
戦闘行動がもろはのつるぎの反射ダメージが発生する戦闘行動か |
| 02897D |
BEQ #$45 |
if(z==on) goto $0289C4 |
|
| 02897F |
LDX $23E4 |
X=$7E23E4 |
|
| 028982 |
STX $2428 |
$7E2428=X |
行動主体をセット |
| 028985 |
JSL $02CB2B |
SR: $02CB2B 引数:1#$2050 引数:2#$0002 |
生死判定? |
| 02898D |
BEQ #$35 |
if(z==on) goto $0289C4 |
死んでいたらスキップ |
| 02898F |
JSL $02BE8A |
SR: $02BE8A 引数:1#$1C |
生死判定? |
| 028994 |
BCS #$2E |
if(c==on) goto $0289C4 |
死んでいたらスキップ |
| 028996 |
LDA #$0015 |
A=#$0015 |
もろはのつるぎのアイテムID |
| 028999 |
STA $242C |
$7E242C=A |
|
| 02899C |
JSL $02B87A |
SR: $02B87A |
アイテム装備チェック |
| 0289A0 |
BVC #$22 |
if(v==off) goto $0289C4 |
|
| 0289A2 |
LDA $23FA |
A=$7E23FA |
|
| 0289A5 |
BEQ #$1D |
if(z==on) goto $0289C4 |
|
| 0289A7 |
PHA |
Push A |
|
| 0289A8 |
LSR |
A>>1 |
|
| 0289A9 |
LSR |
A>>1 |
|
| 0289AA |
INC |
A++ |
ダメージ1/4(+1)化 |
| 0289AB |
STA $23FA |
$7E23FA=A |
ダメージ値セット |
| 0289AE |
LDA $23E8 |
A=$7E23E8 |
|
| 0289B1 |
PHA |
Push A |
|
| 0289B2 |
LDA $23E4 |
A=$7E23E4 |
|
| 0289B5 |
STA $23E8 |
$7E23E8=A |
行動主体を行動対象としてセット |
| 0289B8 |
JSL $029200 |
SR: $029200 |
ダメージ確定後の処理メイン |
| 0289BC |
PLA |
Pull A |
|
| 0289BD |
STA $23E8 |
$7E23E8=A |
行動対象をもとに戻す |
| 0289C0 |
PLA |
Pull A |
|
| 0289C1 |
STA $23FA |
$7E23FA=A |
ダメージ値をもとに戻す |
| 0289C4 |
RTS |
return |
|
- SR: $0289C5 やいばのよろい装備時の反射ダメージ処理
- SR: $028A2C なげきのたて装備時の反射ダメージ処理
ほとんど一緒なので省略
DQ3SFC K.Mixで実装した「きせきのつるぎによる回復処理」はこの部分を真似ただけです。
次に、割と重要な「戦闘行動実行後追加処理を行う」部分について説明します。これは1回の行動で1回しか発生してはいけない部分を実装するようにします(例:メガンテ発動による術者死亡、パルプンテの並び替え処理、仲間を呼ぶ処理など)
| 028A96 |
LDX #$0024 |
X=#$0024 |
|
| 028A99 |
LDA $23EE |
A=$7E23EE |
|
| 028A9C |
CMP $028AAB,X |
A==$028AAB+X? |
追加処理が必要な戦闘行動リストと現在の戦闘行動をマッチング |
| 028AA0 |
BEQ #$05 |
if(z==on) goto $028AA7 |
|
| 028AA2 |
DEX |
X– |
|
| 028AA3 |
DEX |
X– |
|
| 028AA4 |
BPL #$F6 |
if(n==off) goto $028A9C |
|
| 028AA6 |
RTS |
return |
|
| 028AA7 |
JSR $8AD1 |
SR: $($028AD1+X) |
対応した追加処理SRを実行する |
| 028AAA |
RTS |
return |
|
オリジナルでは、追加処理が実行される戦闘行動は以下のとおりです。
| 00 |
メガンテ |
| 01 |
アストロン |
| 02 |
フバーハ |
| 03 |
じかんとまる |
| 04 |
くらやみ |
| 05 |
びっくり |
| 06 |
キメラのつばさ |
| 07 |
ならびかたかえる |
| 08 |
仲間呼び(同種) |
| 09 |
仲間呼び(ホイミスライム) |
| 0A |
仲間呼び(だいまじん) |
| 0B |
仲間呼び(くさったしたい) |
| 0C |
仲間呼び(ごくらくちょう) |
| 0D |
仲間呼び(ゾンビマスター) |
| 0E |
いてつくはどう |
| 0F |
どうぐをつかう |
| 10 |
オールかいしん |
| 11 |
オールザオリク |
| 12 |
ルーラ |
戦闘行動によっては、各キャラクターに対して実行される戦闘行動実体の中身が空で、こちらに実体が実装されているものも多いです。主に全体に影響を及ぼすものが多いですね。また例によっていくつかピックアップして解説します。
| 028B6A |
JSR $8B71 |
SR: $028B71 |
メガンテ術者死亡処理 |
| 028B6D |
JSR $8BA6 |
SR: $028BA6 |
意味なし? |
| 028B70 |
RTS |
return |
|
| 028B71 |
PEA $23AE |
Push $23AE |
|
| 028B74 |
PEA $0004 |
Push $0004 |
|
| 028B77 |
PEA $7E00 |
Push $7E00 |
|
| 028B7A |
JSL $09029E |
SR: $09029E |
メガンテ発動フラグチェック |
| 028B7E |
BEQ #$25 |
if(z==on) goto $028BA5 |
|
| 028B80 |
LDA $23E4 |
A=$7E23E4 |
行動主体を対象にセット |
| 028B83 |
STA $2428 |
$7E2428=A |
|
| 028B86 |
LDA #$FFFF |
A=#$FFFF |
|
| 028B89 |
STA $00 |
$000000=A |
65535を減算する |
| 028B8B |
JSL $02BE8A |
SR: $02BE8A 引数:1#$06 |
HP減算処理 |
| 028B90 |
BCC #$13 |
if(c==off) goto $028BA5 |
|
| 028B92 |
JSL $02B977 |
SR: $02B977 |
パーティウィンドウ再描画? |
| 028B96 |
JSL $02D0C2 |
SR: $02D0C2 |
メガンテ実行時エフェクト処理 |
| 028B9A |
LDA #$0015 |
A=#$0015 |
戦闘メッセージID |
| 028B9D |
JSL $01A87A |
SR: $01A87A |
戦闘メッセージ:「ちからつき いきたえた」 |
| 028BA1 |
JSL $02B054 |
SR: $02B054 |
行動対象者を戦闘から離脱させる処理メイン |
| 028BA5 |
RTS |
return |
|
- SR: $028C22 ならびかえ(パルプンテ効果)
| 028C22 |
LDA #$0000 |
A=#$0000 |
|
| 028C25 |
STA $2484 |
$7E2484=A |
|
| 028C28 |
STA $2486 |
$7E2486=A |
|
| 028C2B |
STA $2488 |
$7E2488=A |
|
| 028C2E |
STA $248A |
$7E248A=A |
|
| 028C31 |
STA $4054 |
$7E4054=A |
|
| 028C34 |
INC |
A++ |
|
| 028C35 |
STA $4056 |
$7E4056=A |
|
| 028C38 |
INC |
A++ |
|
| 028C39 |
STA $4058 |
$7E4058=A |
|
| 028C3C |
INC |
A++ |
|
| 028C3D |
STA $405A |
$7E405A=A |
|
| 028C40 |
JSL $04297C |
SR: $04297C 引数:1#$01 引数:2#$FE |
パーティ人数取得(人数をXにセット) |
| 028C46 |
DEX |
X– |
|
| 028C47 |
BMI #$0F |
if(n==on) goto $028C58 |
|
| 028C49 |
TXA |
A=X |
|
| 028C4A |
ASL |
A<<1 |
|
| 028C4B |
TAY |
Y=A |
|
| 028C4C |
JSL $043115 |
SR: $043115 引数:1#$01 引数:2#$FE 引数:3#$FF |
現在HP取得(HPをAにセット) |
| 028C53 |
STA $2484,Y |
$7E2484+Y=A |
|
| 028C56 |
BRA #$EE |
goto $028C46 |
|
| 028C58 |
LDX #$0000 |
X=#$0000 |
|
| 028C5B |
TXY |
Y=X |
|
| 028C5C |
LDA $2484,X |
A=$7E2484+X |
|
| 028C5F |
CMP $2486,Y |
A>=$7E2486+Y? |
|
| 028C62 |
BCS #$1C |
if(c==on) goto $028C80 |
|
| 028C64 |
LDA $2484,X |
A=$7E2484+X |
|
| 028C67 |
PHA |
Push A |
|
| 028C68 |
LDA $2486,Y |
A=$7E2486+Y |
|
| 028C6B |
STA $2484,X |
$7E2484+X=A |
|
| 028C6E |
PLA |
Pull A |
|
| 028C6F |
STA $2486,Y |
$7E2486+Y=A |
|
| 028C72 |
LDA $4054,X |
A=$7E4054+X |
|
| 028C75 |
PHA |
Push A |
|
| 028C76 |
LDA $4056,Y |
A=$7E4056+Y |
|
| 028C79 |
STA $4054,X |
$7E4054+X=A |
|
| 028C7C |
PLA |
Pull A |
|
| 028C7D |
STA $4056,Y |
$7E4056+Y=A |
|
| 028C80 |
INY |
Y++ |
|
| 028C81 |
INY |
Y++ |
|
| 028C82 |
CPY #$0006 |
Y>=#$0006 ? |
|
| 028C85 |
BCC #$D5 |
if(c==off) goto $028C5C |
|
| 028C87 |
INX |
X++ |
|
| 028C88 |
INX |
X++ |
|
| 028C89 |
CPX #$0006 |
X>=#$0006 ? |
|
| 028C8C |
BCC #$CD |
if(c==off) goto $028C5B |
|
| 028C8E |
JSL $042B6A |
SR: $042B6A |
並び替え? |
| 028C92 |
JSL $02B977 |
SR: $02B977 |
パーティウィンドウ再描画? |
| 028C96 |
LDA #$0042 |
A=#$0042 |
|
| 028C99 |
STA $23E8 |
$7E23E8=A |
|
| 028C9C |
JSL $01A867 |
SR: $01A867 引数:1#$0079 |
戦闘メッセージ:「ならびかたが かわった」 |
| 028CA2 |
RTS |
return |
|
この処理も最近まで謎だったのですが、完全ランダムではなく、どうやら「HPの高い順に並び替えをする」という処理をしているようです。言われてみるとたしかに、HPの高い順だったような。
- SR: $028CF1 仲間を呼ぶ(ホイミスライム)
| 028CF1 |
LDA #$000A |
A=#$000A |
ホイミスライムのモンスターID |
| 028CF4 |
JSR $8D14 |
SR: $028D14 |
仲間を呼んだ場合のモンスター追加メイン |
| 028CF7 |
RTS |
return |
|
- SR: $028D14 仲間を呼んだ場合のモンスター追加メイン
| 028D14 |
STA $2420 |
$7E2420=A |
|
| 028D17 |
STA $2424 |
$7E2424=A |
|
| 028D1A |
LDA #$0000 |
A=#$0000 |
|
| 028D1D |
STA $241E |
$7E241E=A |
|
| 028D20 |
STA $2422 |
$7E2422=A |
|
| 028D23 |
JSL $02B7ED |
SR: $02B7ED |
モンスターを追加できるか判定(追加できないc=on)? |
| 028D27 |
BCS #$1D |
if(c==on) goto $028D46 |
|
| 028D29 |
JSL $02AB00 |
SR: $02AB00 |
新規キャラクター追加 |
| 028D2D |
LDA $2428 |
A=$7E2428 |
|
| 028D30 |
CMP #$FFFF |
A==#$FFFF? |
|
| 028D33 |
BEQ #$11 |
if(z==on) goto $028D46 |
|
| 028D35 |
STA $23E8 |
$7E23E8=A |
|
| 028D38 |
JSL $01A867 |
SR: $01A867 引数:1#$008F |
戦闘メッセージ:「〇〇が あらわれた」 |
| 028D3E |
LDX $2428 |
X=$7E2428 |
|
| 028D41 |
JSL $02B52D |
SR: $02B52D |
戦闘中キャラクター行動情報初期化 |
| 028D45 |
RTS |
return |
|
| 028D46 |
JSL $01A867 |
SR: $01A867 引数:1#$0090 |
戦闘メッセージ:「しかし たすけはこなかった」 |
| 028D4C |
RTS |
return |
|
SR: $02B7EDより下は画面中にモンスターを新しく表示するだけのスペースが有るかどうかの判定をしているようで、用途の分からないRAMアドレスが頻出します。自分も何をやってるかいまいちよくわかりません。
コメント