DQ3戦闘部分解説22

戦闘行動の実体の説明がひと通り終わったので、その後の処理に戻ります。SR: $027D53の後半部分$027DA8以降から続きを見ていきます。

  • SR: $0288CF 眠り毒麻痺追加攻撃処理
0288CFPHYPush Y
0288D0LDA $23FAA=$7E23FAダメージ値が0ならスキップ
0288D3BEQ #$27if(z==on) goto $0288FC
0288D5LDY $23E8Y=$7E23E8
0288D8STY $2428$7E2428=Y
0288DBJSL $02CB32SR: $02CB32 引数:1#$2050 引数:2#$0002生死判定?
0288E3BEQ #$17if(z==on) goto $0288FC死んでいたらスキップ
0288E5JSL $02BE8ASR: $02BE8A 引数:1#$1C生死判定?
0288EABCS #$10if(c==on) goto $0288FC死んでいたらスキップ
0288ECLDX #$0004X=#$0004
0288EFLDA $23EEA=$7E23EE
0288F2CMP $028903,XA==$028903+X?戦闘行動と眠り毒麻痺攻撃の戦闘行動IDとのマッチング
0288F6BEQ #$06if(z==on) goto $0288FE
0288F8DEXX–
0288F9DEXX–
0288FABPL #$F6if(n==off) goto $0288F2
0288FCPLYPull Y
0288FDRTSreturn
0288FEJSR $8909SR: $($028909+X)
028901PLYPull Y
028902RTSreturn

  • SR: $02890F 眠り攻撃
02890FJSL $02A406SR: $02A406成否判定?
028913BCC #$28if(c==off) goto $02893D
028915JSL $02B5D8SR: $02B5D8状態:眠り処理
028919BCS #$22if(c==on) goto $02893D
02891BJSL $02B977SR: $02B977パーティウィンドウ再描画?
02891FLDA #$0041A=#$0041戦闘メッセージ:「ねむってしまった!」
028922PHAPush A
028923LDY $23E8Y=$7E23E8
028926JSL $02CAE0SR: $02CAE0 引数:1#$203C 引数:2#$00FFグループID取得
02892ECMP #$0004A>=#$0004?PCor格闘場で賭けたモンスター
028931BCS #$05if(c==on) goto $028938
028933LDA #$0040A=#$0040戦闘メッセージ:「ねむらせた!」
028936STA $01,SStack($01)=A
028938PLAPull A
028939JSL $01A87ASR: $01A87A戦闘メッセージ表示
02893DRTSreturn
  • SR: $02893E 毒攻撃
  • SR: $028956 マヒ攻撃

ほとんど一緒なので省略

  • SR: $02896D もろはのつるぎ装備時の反射ダメージ処理
02896DLDA $23F2A=$7E23F2ダメージ値が0ならスキップ
028970BNE #$52if(z==off) goto $0289C4
028972LDX $23EEX=$7E23EE
028975JSL $02CC25SR: $02CC25 引数:1#$0079 引数:2#$0008戦闘行動がもろはのつるぎの反射ダメージが発生する戦闘行動か
02897DBEQ #$45if(z==on) goto $0289C4
02897FLDX $23E4X=$7E23E4
028982STX $2428$7E2428=X行動主体をセット
028985JSL $02CB2BSR: $02CB2B 引数:1#$2050 引数:2#$0002生死判定?
02898DBEQ #$35if(z==on) goto $0289C4死んでいたらスキップ
02898FJSL $02BE8ASR: $02BE8A 引数:1#$1C生死判定?
028994BCS #$2Eif(c==on) goto $0289C4死んでいたらスキップ
028996LDA #$0015A=#$0015もろはのつるぎのアイテムID
028999STA $242C$7E242C=A
02899CJSL $02B87ASR: $02B87Aアイテム装備チェック
0289A0BVC #$22if(v==off) goto $0289C4
0289A2LDA $23FAA=$7E23FA
0289A5BEQ #$1Dif(z==on) goto $0289C4
0289A7PHAPush A
0289A8LSRA>>1
0289A9LSRA>>1
0289AAINCA++ダメージ1/4(+1)化
0289ABSTA $23FA$7E23FA=Aダメージ値セット
0289AELDA $23E8A=$7E23E8
0289B1PHAPush A
0289B2LDA $23E4A=$7E23E4
0289B5STA $23E8$7E23E8=A行動主体を行動対象としてセット
0289B8JSL $029200SR: $029200ダメージ確定後の処理メイン
0289BCPLAPull A
0289BDSTA $23E8$7E23E8=A行動対象をもとに戻す
0289C0PLAPull A
0289C1STA $23FA$7E23FA=Aダメージ値をもとに戻す
0289C4RTSreturn
  • SR: $0289C5 やいばのよろい装備時の反射ダメージ処理
  • SR: $028A2C なげきのたて装備時の反射ダメージ処理

ほとんど一緒なので省略

DQ3SFC K.Mixで実装した「きせきのつるぎによる回復処理」はこの部分を真似ただけです。

次に、割と重要な「戦闘行動実行後追加処理を行う」部分について説明します。これは1回の行動で1回しか発生してはいけない部分を実装するようにします(例:メガンテ発動による術者死亡、パルプンテの並び替え処理、仲間を呼ぶ処理など)

  • SR: $028A96 戦闘行動実行後の追加処理
028A96LDX #$0024X=#$0024
028A99LDA $23EEA=$7E23EE
028A9CCMP $028AAB,XA==$028AAB+X?追加処理が必要な戦闘行動リストと現在の戦闘行動をマッチング
028AA0BEQ #$05if(z==on) goto $028AA7
028AA2DEXX–
028AA3DEXX–
028AA4BPL #$F6if(n==off) goto $028A9C
028AA6RTSreturn
028AA7JSR $8AD1SR: $($028AD1+X)対応した追加処理SRを実行する
028AAARTSreturn

オリジナルでは、追加処理が実行される戦闘行動は以下のとおりです。

00メガンテ
01アストロン
02フバーハ
03じかんとまる
04くらやみ
05びっくり
06キメラのつばさ
07ならびかたかえる
08仲間呼び(同種)
09仲間呼び(ホイミスライム)
0A仲間呼び(だいまじん)
0B仲間呼び(くさったしたい)
0C仲間呼び(ごくらくちょう)
0D仲間呼び(ゾンビマスター)
0Eいてつくはどう
0Fどうぐをつかう
10オールかいしん
11オールザオリク
12ルーラ

戦闘行動によっては、各キャラクターに対して実行される戦闘行動実体の中身が空で、こちらに実体が実装されているものも多いです。主に全体に影響を及ぼすものが多いですね。また例によっていくつかピックアップして解説します。

  • SR: $028B6A メガンテ追加処理
028B6AJSR $8B71SR: $028B71メガンテ術者死亡処理
028B6DJSR $8BA6SR: $028BA6意味なし?
028B70RTSreturn

  • SR: $028B71 メガンテ術者死亡処理
028B71PEA $23AEPush $23AE
028B74PEA $0004Push $0004
028B77PEA $7E00Push $7E00
028B7AJSL $09029ESR: $09029Eメガンテ発動フラグチェック
028B7EBEQ #$25if(z==on) goto $028BA5
028B80LDA $23E4A=$7E23E4行動主体を対象にセット
028B83STA $2428$7E2428=A
028B86LDA #$FFFFA=#$FFFF
028B89STA $00$000000=A65535を減算する
028B8BJSL $02BE8ASR: $02BE8A 引数:1#$06HP減算処理
028B90BCC #$13if(c==off) goto $028BA5
028B92JSL $02B977SR: $02B977パーティウィンドウ再描画?
028B96JSL $02D0C2SR: $02D0C2メガンテ実行時エフェクト処理
028B9ALDA #$0015A=#$0015戦闘メッセージID
028B9DJSL $01A87ASR: $01A87A戦闘メッセージ:「ちからつき いきたえた」
028BA1JSL $02B054SR: $02B054行動対象者を戦闘から離脱させる処理メイン
028BA5RTSreturn

  • SR: $028C22 ならびかえ(パルプンテ効果)
028C22LDA #$0000A=#$0000
028C25STA $2484$7E2484=A
028C28STA $2486$7E2486=A
028C2BSTA $2488$7E2488=A
028C2ESTA $248A$7E248A=A
028C31STA $4054$7E4054=A
028C34INCA++
028C35STA $4056$7E4056=A
028C38INCA++
028C39STA $4058$7E4058=A
028C3CINCA++
028C3DSTA $405A$7E405A=A
028C40JSL $04297CSR: $04297C 引数:1#$01 引数:2#$FEパーティ人数取得(人数をXにセット)
028C46DEXX–
028C47BMI #$0Fif(n==on) goto $028C58
028C49TXAA=X
028C4AASLA<<1
028C4BTAYY=A
028C4CJSL $043115SR: $043115 引数:1#$01 引数:2#$FE 引数:3#$FF現在HP取得(HPをAにセット)
028C53STA $2484,Y$7E2484+Y=A
028C56BRA #$EEgoto $028C46
028C58LDX #$0000X=#$0000
028C5BTXYY=X
028C5CLDA $2484,XA=$7E2484+X
028C5FCMP $2486,YA>=$7E2486+Y?
028C62BCS #$1Cif(c==on) goto $028C80
028C64LDA $2484,XA=$7E2484+X
028C67PHAPush A
028C68LDA $2486,YA=$7E2486+Y
028C6BSTA $2484,X$7E2484+X=A
028C6EPLAPull A
028C6FSTA $2486,Y$7E2486+Y=A
028C72LDA $4054,XA=$7E4054+X
028C75PHAPush A
028C76LDA $4056,YA=$7E4056+Y
028C79STA $4054,X$7E4054+X=A
028C7CPLAPull A
028C7DSTA $4056,Y$7E4056+Y=A
028C80INYY++
028C81INYY++
028C82CPY #$0006Y>=#$0006 ?
028C85BCC #$D5if(c==off) goto $028C5C
028C87INXX++
028C88INXX++
028C89CPX #$0006X>=#$0006 ?
028C8CBCC #$CDif(c==off) goto $028C5B
028C8EJSL $042B6ASR: $042B6A並び替え?
028C92JSL $02B977SR: $02B977パーティウィンドウ再描画?
028C96LDA #$0042A=#$0042
028C99STA $23E8$7E23E8=A
028C9CJSL $01A867SR: $01A867 引数:1#$0079戦闘メッセージ:「ならびかたが かわった」
028CA2RTSreturn

この処理も最近まで謎だったのですが、完全ランダムではなく、どうやら「HPの高い順に並び替えをする」という処理をしているようです。言われてみるとたしかに、HPの高い順だったような。

  • SR: $028CF1 仲間を呼ぶ(ホイミスライム)
028CF1LDA #$000AA=#$000AホイミスライムのモンスターID
028CF4JSR $8D14SR: $028D14仲間を呼んだ場合のモンスター追加メイン
028CF7RTSreturn

  • SR: $028D14 仲間を呼んだ場合のモンスター追加メイン
028D14STA $2420$7E2420=A
028D17STA $2424$7E2424=A
028D1ALDA #$0000A=#$0000
028D1DSTA $241E$7E241E=A
028D20STA $2422$7E2422=A
028D23JSL $02B7EDSR: $02B7EDモンスターを追加できるか判定(追加できないc=on)?
028D27BCS #$1Dif(c==on) goto $028D46
028D29JSL $02AB00SR: $02AB00新規キャラクター追加
028D2DLDA $2428A=$7E2428
028D30CMP #$FFFFA==#$FFFF?
028D33BEQ #$11if(z==on) goto $028D46
028D35STA $23E8$7E23E8=A
028D38JSL $01A867SR: $01A867 引数:1#$008F戦闘メッセージ:「〇〇が あらわれた」
028D3ELDX $2428X=$7E2428
028D41JSL $02B52DSR: $02B52D戦闘中キャラクター行動情報初期化
028D45RTSreturn
028D46JSL $01A867SR: $01A867 引数:1#$0090戦闘メッセージ:「しかし たすけはこなかった」
028D4CRTSreturn

SR: $02B7EDより下は画面中にモンスターを新しく表示するだけのスペースが有るかどうかの判定をしているようで、用途の分からないRAMアドレスが頻出します。自分も何をやってるかいまいちよくわかりません。

コメント

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