DQ3戦闘部分解説16

  • SR: $027D53 戦闘行動実行処理メイン
027D53STZ $23DA$23DA=#$00
027D56STZ $2458$2458=#$00
027D59STZ $245A$245A=#$00
027D5CJSR $7E9DSR: $027E9Dパルプンテ結果決定
027D5FJSR $7F10SR: $027F10行動後追加Msg表示?
027D62JSR $7B52SR: $027B52
027D65LDA $00A=DP($00)
027D67STA $23EA$23EA=A
027D6ALDA $02A=DP($02)
027D6CSTA $23EC$23EC=A
027D6FJSL $C2CE9ASR: $02CE9Aエフェクト描画
027D73JSR $7DC4SR: $027DC4遊び人の火遊び処理
027D76JSL $C28375SR: $0283751キャラクター行動開始時変数初期化処理
027D7ALDY #$0000Y=#$0000
027D7DSTZ $23FA$23FA=#$00
027D80LDA #$0000A=#$0000
027D83PEA #$23ADPush #$23AD
027D86PEA #$007FPush #$007F
027D89PEA #$7E00Push #$7E00
027D8CJSL $C902E9SR: $0902E9RAM上情報変更
027D90JSR $7DD1SR: $027DD1メガンテ実行時の効果決定(即死かダメージか)
027D93JSR $8400SR: $0284001キャラクター行動開始時変数初期化処理
027D96BCS #$22if(c==on) goto $027DBA
027D98JSR $8426SR: $028426戦闘行動が対象に有効か調べる(無効c=on)
027D9BBCS #$1Dif(c==on) goto $027DBA
027D9DJSR $8795SR: $028795
027DA0JSR $87B9SR: $0287B9一撃必殺武器ヒット判定(ヒットc=on)
027DA3BCS #$15if(c==on) goto $027DBA
027DA5JSR $885ESR: $02885E戦闘行動実体SR実行
027DA8JSR $88B3SR: $0288B3攻撃により目が覚めた・我に返った処理
027DABJSR $7E01SR: $027E01眠り毒麻痺追加攻撃処理
027DAEJSR $88CFSR: $0288CFもろはのつるぎ装備時の反射ダメージ処理
027DB1JSR $896DSR: $02896Dやいばのよろい装備時の反射ダメージ処理
027DB4JSR $89C5SR: $0289C5なげきのたて装備時の反射ダメージ処理
027DB7JSR $8A2CSR: $028A2C
027DBAINYY++
027DBBCPY #$0018Y>=#$0018?
027DBEBCC #$BDif(c==off) goto $027D7D
027DC0JSR $8A96SR: $028A96戦闘行動追加処理
027DC3RTSreturn

ここが実際の戦闘行動を実行している部分です。ポイントは「戦闘行動は参加キャラクター分全部に対して実行するかどうかの判断を行う」という点です。$027D7D-BEまでが1キャラクター分の実行部分に相当します。ターゲット情報(1体,グループ, 全体など)と照らし合わせて、#$01~$17までのキャラクターが実行対象になるかを判断して($027D98)、対象である場合のみ実行する、というようになっています。戦闘行動($020060-)の「行動プログラムアドレス」で指定している開始アドレスは$027DA5で呼ばれます。つまり、「行動プログラムアドレス」に記述されている処理は「対象1体に対してのみの処理」を記述することが期待されます。対象選択は「対象数」「選択対象」の値でコントロールすることになります。また、メガンテの術者死亡処理など1回だけ実行させたい処理は$027DC0で呼ばれるように設定する必要があります。

  • SR: $027E9D パルプンテ結果決定
027E9DLDA $23EEA=$23EE
027EA0CMP #$0048A==#$0048?戦闘行動がパルプンテの場合
027EA3BNE #$07if(z==off) goto $027EAC
027EA5JSL $C2CE9ASR: $02CE9Aエフェクト描画
027EA9JSR $7EADSR: $027EADパルプンテ結果選択処理
027EACRTSreturn

  • SR: $027EAD パルプンテ結果選択処理
027EADLDA #$FFFFA=#$FFFF
027EB0STA $00DP($00)=A
027EB2STZ $02DP($02)=#$00
027EB4PEA #$2011Push #$2011
027EB7PEA #$0020Push #$0020
027EBAPEA #$7E00Push #$7E00
027EBDJSL $C9029ESR: $09029Eイベント戦闘かチェック
027EC1BEQ #$07if(z==on) goto $027ECA
027EC3LDA $00A=DP($00)
027EC5AND #$E504A&=#$E504イベント戦闘の場合は一部の結果は選択対象外にする
027EC8STA $00DP($00)=A
027ECALDX #$0000X=#$0000
027ECDJSL $C01407SR: $001407乱数発生 $0000-FFFF dp,Xの1になっているビットをランダムで0にする?
027ED1BCC #$FEif(c==off) goto $027ED1
027ED3ASLA<<1
027ED4TAXX=A
027ED5LDA $C27EF0,XA=$027EF0+Xパルプンテ結果配列から結果の戦闘行動を取得する
027ED9JSR $75C6SR: $0275C6
027EDCSTA $242A$242A=A
027EDFLDA $23E4A=$23E4
027EE2STA $2428$2428=A
027EE5JSL $C270F2SR: $0270F2
027EE9LDA $2430A=$2430
027EECSTA $23E6$23E6=A
027EEFRTSreturn

パルプンテ実行時の結果の選択は、SR: $001407をコールして、#$FFFFの中からランダムでビットをOFFにしていき、ONになっているビットが1つだけになるまで繰り返し(c=onで判定)、その際にONになっているビットの下から数えて何番目か(例:0008なら3、1000なら12)をAレジスタにセットさせることで、パルプンテ結果戦闘行動IDの配列($027EF0-)へのオフセット作っています。イベント戦闘フラグがONになっている場合は、都合の悪い結果(全員会心、くだけちる)などはビットをOFFにして元から選択されないようになっています。$E504=1110010100000100なので、実行されるのはべホイミ(味方)、べホマラー(味方)、オールザオリク、ならびかたかえる、やまびこ、オールキアリクだけ、ということになります。ちなみにK.Mixで実装した「遊び人の使える遊び」の選択はこの部分をパクった参考にしたものです。次回以降のエントリで説明しますが、毒針等の一撃死も同様で、イベント戦闘中には発生しないようになっています。

コメント

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