DQ3戦闘部分解説4

前々回示した戦闘メインループを順番に見ていきます。言い忘れましたが、解説はDQ3 Extended 1.43をベースに行ないます。戦闘行動にアクセスする部分がオリジナルと変わっている以外は同じはずです。

  • SR: $025A55 戦闘中使用RAM領域初期化
025A56PHPPush P Flag
025A57PHBPush DB
025A58REP #$30m=off(A/M:16b) x=off(X/Y:16b)
025A5APEA #$7E7EPush #$7E7E
025A5DPLBPull DB
025A5EPLBPull DB
025A5FLDX #$07CEX=#$07CE
025A62STZ $2030,X$2030+X=#$00
025A65DEXX–
025A66DEXX–
025A67BPL #$F9if(n==off) goto $025A62
025A69LDA #$FFFFA=#$FFFF
025A6CSTA $2462$2462=A
025A6FSTA $2464$2464=A
025A72STA $2465$2465=A
025A75PLBPull DB
025A76PLPPull P Flag
025A77RTLreturn

RAMアドレス$7E2030~7E27FFを戦闘開始時に毎回#$00でリセットしているようです。というわけで戦闘中の使用RAMはこの範囲であると想定してよさそうです。

  • SR: $025A78 パーティ戦闘中基本情報設定
025A78PHPPush P Flag
025A79PHBPush DB
025A7AREP #$30m=off(A/M:16b) x=off(X/Y:16b)
025A7CPEA #$7E7EPush #$7E7E
025A7FPLBPull DB
025A80PLBPull DB
025A81PEA #$2011Push #$2011
025A84PEA #$0040Push #$0040
025A87PEA #$7E00Push #$7E00
025A8AJSL $C9029ESR: $09029ERAM上情報取得
025A8EBNE #$34if(z==off) goto $025AC4格闘場モードならスキップ
025A90JSL $C4297CSR: $04297C 引数:1#$01 引数:2#$FEパーティ人数をXにセット
025A96LDY #$0000Y=#$0000
025A99DEXX–
025A9ABMI #$28if(n==on) goto $025AC4
025A9CJSL $C429DASR: $0429DA 引数:1#$01 引数:2#$FD 引数:3#$FF対象キャラのフィールド上情報スタートアドレスをAにセット
025AA3STA $2420$2420=A
025AA6STA $2424$2424=A
025AA9LDA #$0001A=#$0001
025AACSTA $241E$241E=A
025AAFSTA $2422$2422=A
025AB2LDA #$0005A=#$0005
025AB5STA $2426$2426=A
025AB8JSL $C2AB00SR: $02AB00キャラクター情報セット
025ABCLDA $2428A=$2428
025ABFBMI #$FEif(n==on) goto $025ABF
025AC1INYY++
025AC2BRA #$D5goto $025A99
025AC4PLBPull DB
025AC5PLPPull P Flag
025AC6RTLreturn

  • SR: $02AB00 キャラクター情報セット
02AB00PHPPush P Flag
02AB01REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02AB03PHAPush A
02AB04PHXPush X
02AB05PHYPush Y
02AB06PHBPush DB
02AB07PEA #$7E7EPush #$7E7E
02AB0APLBPull DB
02AB0BPLBPull DB
02AB0CJSL $C2AC31SR: $02AC31新規キャラクター追加場所サーチ(追加不可c=on?)
02AB10BCS #$64if(c==on) goto $02AB76
02AB12JSL $C2AD55SR: $02AD55戦闘中RAM領域を1キャラクター分0で初期化
02AB16LDX $2428X=$2428
02AB19JSL $C2CB70SR: $02CB70 引数:1#$203B 引数:2#$00FF戦闘中キャラクター情報変更
02AB21LDA #$0001A=#$0001
02AB24JSL $C2CB70SR: $02CB70 引数:1#$2050 引数:2#$0002戦闘中キャラクター情報変更(存在フラグ?)
02AB2CLDA $2426A=$2426
02AB2FJSL $C2CB70SR: $02CB70 引数:1#$203C 引数:2#$00FF戦闘中キャラクター情報変更(グループ番号#$05)
02AB37LDA $2420A=$2420
02AB3AJSL $C2CA98SR: $02CA98 引数:1#$2049戦闘中キャラクター情報変更(元キャラ格納位置アドレス)
02AB40LDA $2424A=$2424
02AB43JSL $C2CA98SR: $02CA98 引数:1#$204B戦闘中キャラクター情報変更(モシャス後格納位置アドレス)
02AB49LDA $241EA=$241E
02AB4CJSL $C2CB70SR: $02CB70 引数:1#$2050 引数:2#$0001戦闘中キャラクター情報変更
02AB54LDA $2422A=$2422
02AB57JSL $C2CB70SR: $02CB70 引数:1#$2051 引数:2#$0001戦闘中キャラクター情報変更
02AB5FJSR $ABA1SR: $02ABA1戦闘中基礎ステータスセット
02AB62LDA $2426A=$2426
02AB65ASLA<<1
02AB66TAXX=A
02AB67LDA $2420A=$2420
02AB6ASTA $23FE,X$23FE+X=A
02AB6DINC $240E,X$240E+X++
02AB70JSR $BA12SR: $02BA12
02AB73JSR $AB7ESR: $02AB7E
02AB76PLBPull DB
02AB77REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02AB79PLYPull Y
02AB7APLXPull X
02AB7BPLAPull A
02AB7CPLPPull P Flag
02AB7DRTLreturn

  • SR: $02ABA1 戦闘中基礎ステータスセット
02ABA1LDA $2422A=$2422敵味方フラグ?
02ABA4BNE #$04if(z==off) goto $02ABAA
02ABA6JSR $ABAESR: $02ABAEHPMP攻撃力守備力素早さセット
02ABA9RTSreturn
02ABAAJSR $AC0CSR: $02AC0C攻撃力守備力素早さセット
02ABADRTSreturn

PC側のHPMP情報は戦闘中RAMにはセットされず、移動中キャラクター情報(7E3925-)を使うようになっています。情報のダブリを防ぐための措置と思われます。正しいですね。

  • SR: $025AC7 モンスター戦闘中情報設定
025AC7PHPPush P Flag
025AC8PHBPush DB
025AC9REP #$30m=off(A/M:16b) x=off(X/Y:16b)
025ACBPEA #$7E7EPush #$7E7E
025ACEPLBPull DB
025ACFPLBPull DB
025AD0LDA #$0001A=#$0001
025AD3PEA #$23ACPush #$23AC
025AD6PEA #$0080Push #$0080
025AD9PEA #$7E00Push #$7E00
025ADCJSL $C902E9SR: $0902E9RAM上情報変更
025AE0LDA $4EE0A=$4EE0
025AE3STA $2456$2456=A
025AE6LDX #$0000X=#$0000
025AE9LDY $2008,XY=$2008+Xモンスター出現数
025AECBEQ #$3Eif(z==on) goto $025B2C
025AEELDA $2000,XA=$2000+XモンスターID
025AF1BEQ #$39if(z==on) goto $025B2C
025AF3STA $2420$2420=A
025AF6STA $2424$2424=A
025AF9JSR $5B46SR: $025B46怪しい影の実体モンスター決定
025AFCTXAA=X
025AFDLSRA>>1
025AFESTA $2426$2426=A
025B01LDA #$0000A=#$0000
025B04STA $241E$241E=A
025B07STA $2422$2422=A
025B0AJSL $C2AB00SR: $02AB00キャラクター情報セット
025B0ELDA $2428A=$2428
025B11BMI #$FEif(n==on) goto $025B11
025B13PHXPush X
025B14LDX $2428X=$2428
025B17LDA $2456A=$2456
025B1AJSL $C2CB70SR: $02CB70 引数:1#$203A 引数:2#$00FF
025B22INC $2456$2456++
025B25INC $2456$2456++
025B28PLXPull X
025B29DEYY–
025B2ABNE #$DEif(z==off) goto $025B0A
025B2CINXX++
025B2DINXX++
025B2ECPX #$0008X>=#$0008?
025B31BCC #$B6if(c==off) goto $025AE9
025B33LDA #$0000A=#$0000
025B36PEA #$23ACPush #$23AC
025B39PEA #$0080Push #$0080
025B3CPEA #$7E00Push #$7E00
025B3FJSL $C902E9SR: $0902E9RAM上変更
025B43PLBPull DB
025B44PLPPull P Flag
025B45RTLreturn

  • SR: $025B46 怪しい影の実体モンスター決定
025B46LDA $2420A=$2420
025B49CMP #$0019A==#$0019?
025B4CBNE #$3Cif(z==off) goto $025B8A
025B4EPHXPush X
025B4FPHYPush Y
025B50SEP #$30m=on(A/M:8b) x=on(X/Y:8b)
025B52LDA #$00A=#$00
025B54JSL $C42FEBSR: $042FEB 引数:1#$01 引数:2#$FF 引数:3#$FFレベル取得
025B5BINCA++
025B5CPHAPush A
025B5DLDX #$83X=#$83キングヒドラのモンスターID
025B5FLDY #$00Y=#$00同じレベルのモンスター数?
025B61JSL $C2CC8BSR: $02CC8B 引数:1#$0002 引数:2#$003Fモンスター情報取得(レベル)
025B69CMP $01,SA>=Stack($01)?モンスターレベルが先頭PCより高ければスキップ
025B6BBCS #$05if(c==on) goto $025B72
025B6DTXAA=X
025B6ESTA $2484,Y$2484+Y=AモンスターIDをテンポラリバッファにセット?
025B71INYY++
025B72DEXX–
025B73BNE #$ECif(z==off) goto $025B61
025B75PLAPull A
025B76DEYY–
025B77TYAA=Y
025B78JSL $C0133ESR: $00133E乱数発生 00-A A(1B)
025B7CTAYY=A
025B7DLDA $2484,YA=$2484+Y
025B80STA $2424$2424=A
025B83STZ $2425$2425=#$00
025B86REP #$30m=off(A/M:16b) x=off(X/Y:16b)
025B88PLYPull Y
025B89PLXPull X
025B8ARTSreturn

特につっこむ点は有りませんが、あやしいかげの場合に実体のモンスターを決める部分が面白いですね。これを見ると実体モンスターはモンスターID#$1から#$83まで(スライムからキングヒドラ)の中から先頭PCのレベルに応じて選択されるようです。当然同じレベルのモンスター(特に63)は何種類もいますが、ランダムで選択される実装になっています。

コメント

タイトルとURLをコピーしました