DQ3戦闘部分解説17

  • SR: $027F10 行動後追加メッセージ表示
027F10LDX #$0050X=#$0050オフセットの最後尾
027F13LDA $23EEA=$23EE現在の戦闘行動
027F16CMP $C27F25,XA==$027F25+X?追加メッセージ配列とのつきあわせ
027F1ABEQ #$05if(z==on) goto $027F21
027F1CDEXX–
027F1DDEXX–
027F1EBPL #$F6if(n==off) goto $027F16
027F20RTSreturn
027F21JSR $7F77SR: $($027F77+X)対応したSRを呼び出す
027F24RTSreturn

「行動後追加メッセージ」というのは王者の剣を使った直後に表示される「とどろく らいめいが くうきを ひきさく!」のメッセージ表示のことを指します。現在の戦闘行動と行動後追加メッセージを表示する戦闘行動配列($027F25-)を後ろからつきあわせ、一致するものがあった場合は、同じ順番で並んでいる行動後追加メッセージ表示用SR配列($027F77-)を呼び出す、というものです。この方式はほかにも何箇所か使われているので覚えておくといいでしょう。

  • SR: $027B52 ターゲット確定?(詳細不明のため省略)

  • SR: $027DD1 メガンテ実行時の結果選択処理
027DD1LDA $23EEA=$23EE
027DD4CMP #$001AA==#$001A?戦闘行動がメガンテか
027DD7BNE #$27if(z==off) goto $027E00
027DD9LDX $23E4X=$23E4
027DDCJSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FF
027DE4CMP #$0005A>=#$0005?行動主体がモンスターか
027DE7BCS #$17if(c==on) goto $027E00
027DE9JSL $C012D1SR: $0012D1乱数発生 $00-FF
027DEDLSRA>>1
027DEEBCS #$10if(c==on) goto $027E001/2の確率でくだけちる
027DF0LDA #$0001A=#$0001
027DF3PEA #$23ADPush #$23AD
027DF6PEA #$0040Push #$0040
027DF9PEA #$7E00Push #$7E00
027DFCJSL $C902E9SR: $0902E9RAM上情報変更
027E00RTSreturn

  • SR: $028426 戦闘行動が対象に有効か調べる(無効c=on)
028426PHYPush Y
028427LDX $23EEX=$23EE戦闘行動をXにセット
02842ALDY $23E8Y=$23E8行動対象をYにセット
02842DSTY $2428$2428=Y
028430JSL $C2CB32SR: $02CB32 引数:1#$2050 引数:2#$0002
028438BEQ #$2Aif(z==on) goto $028464
02843AJSR $84DESR: $0284DE戦闘行動の対象が生者のみの場合に対象が生きているか判定?
02843DBCS #$25if(c==on) goto $028464
02843FJSR $8467SR: $028467戦闘行動がくしゃみ($CA)で対象が行動主体か?
028442BCS #$20if(c==on) goto $028464
028444JSR $84BBSR: $0284BB
028447JSR $848ASR: $02848Aくしゃみメイン処理
02844AJSR $8475SR: $028475
02844DJSR $857ESR: $02857E行動対象がアストロン中の処理
028450BCS #$12if(c==on) goto $028464
028452JSR $85C5SR: $0285C5行動対象がマホカンタ中の処理
028455BCS #$D9if(c==on) goto $028430
028457JSR $8690SR: $028690直接攻撃回避判定
02845ABCS #$08if(c==on) goto $028464
02845CJSR $84F2SR: $0284F2直接攻撃ヒット判定
02845FBCS #$03if(c==on) goto $028464
028461PLYPull Y
028462CLCc=off
028463RTSreturn
028464PLYPull Y
028465SECc=on
028466RTSreturn

  • SR: $02857E 行動対象がアストロン中の処理
02857EJSL $C2CC47SR: $02CC47 引数:1#$007A 引数:2#$0004戦闘行動がアストロンに依存するか
028586CLCc=off
028587BEQ #$3Bif(z==on) goto $0285C4
028589JSL $C2BE8ASR: $02BE8A 引数:1#$20アストロン残りターン数取得
02858EBCC #$34if(c==off) goto $0285C4
028590PEA #$23AEPush #$23AE
028593PEA #$0008Push #$0008
028596PEA #$7E00Push #$7E00
028599JSL $C9029ESR: $09029ERAM上情報取得
02859DBNE #$24if(z==off) goto $0285C3
02859FLDA $23E8A=$23E8
0285A2PHAPush A
0285A3LDA $23E6A=$23E6
0285A6STA $23E8$23E8=A
0285A9JSL $C1A867SR: $01A867 引数:1#$006E「てつのかたまりとなり…」メッセージ表示
0285AFPLAPull A
0285B0STA $23E8$23E8=A
0285B3LDA #$0001A=#$0001
0285B6PEA #$23AEPush #$23AE
0285B9PEA #$0008Push #$0008
0285BCPEA #$7E00Push #$7E00
0285BFJSL $C902E9SR: $0902E9RAM上情報変更
0285C3SECc=on
0285C4RTSreturn

  • SR: $0285C5 行動対象がマホカンタ中の処理
0285C5PEA #$23ADPush #$23AD
0285C8PEA #$0004Push #$0004
0285CBPEA #$7E00Push #$7E00
0285CEJSL $C9029ESR: $09029Eすでにマホカンタ中ならもう反射しない?
0285D2CLCc=off
0285D3BNE #$2Fif(z==off) goto $028604
0285D5JSL $C2BE8ASR: $02BE8A 引数:1#$00HP取得(なぜ?)
0285DASTA $247C$247C=A
0285DDJSR $8659SR: $028659行動種別がマホカンタに影響されるか?
0285E0BCC #$22if(c==off) goto $028604
0285E2JSR $867BSR: $02867B行動対象がマホカンタ中?
0285E5BCC #$1Dif(c==off) goto $028604
0285E7JSR $8605SR: $028605マホカンタ処理前半
0285EALDY $23E4Y=$23E4
0285EDSTY $2428$2428=Y
0285F0STY $23E8$23E8=Y
0285F3LDA #$0001A=#$0001
0285F6PEA #$23ADPush #$23AD
0285F9PEA #$0004Push #$0004
0285FCPEA #$7E00Push #$7E00
0285FFJSL $C902E9SR: $0902E9マホカンタ中フラグON?
028603SECc=on
028604RTSreturn

ちょっと中途半端ですが、今回はここまでにします。

(11/25追記)
エントリを分けるのはどうかと思ったのでここに追記。

  • SR: $028690 直接攻撃回避判定
028690LDA $23F2A=$23F2
028693BNE #$38if(z==off) goto $0286CD
028695JSL $C2CC47SR: $02CC47 引数:1#$0079 引数:2#$0010攻撃により我に返る(直接攻撃扱い?)
02869DBEQ #$2Eif(z==on) goto $0286CD
02869FJSL $C2B774SR: $02B774会心・毒針ヒット関連?
0286A3CMP #$0001A==#$0001?
0286A6BEQ #$25if(z==on) goto $0286CD
0286A8JSL $C2BE8ASR: $02BE8A 引数:1#$16マヒ状態取得
0286ADBCS #$1Eif(c==on) goto $0286CD
0286AFJSL $C2CB32SR: $02CB32 引数:1#$2047 引数:2#$00FF眠りの深さ取得
0286B7BNE #$14if(z==off) goto $0286CD
0286B9JSR $86ECSR: $0286EC行動主体者が混乱している場合のターゲット変更?
0286BCBCS #$0Fif(c==on) goto $0286CD
0286BEJSR $873ESR: $02873E回避判定(通常)
0286C1BCC #$0Cif(c==off) goto $0286CF
0286C3JSR $875FSR: $02875F回避判定(特殊)
0286C6BCC #$07if(c==off) goto $0286CF
0286C8JSR $86DBSR: $0286DBタップダンス中の回避判定?
0286CBBCC #$02if(c==off) goto $0286CF
0286CDCLCc=off
0286CERTSreturn
0286CFJSL $C2B6D9SR: $02B6D9直接攻撃ミス効果音
0286D3JSL $C1A867SR: $01A867 引数:1#$0010「すばやくみをかわした!」メッセージ表示
0286D9SECc=on
0286DARTSreturn

  • SR: $02869F 会心・毒針ヒット関連?
02B774PHPPush P Flag
02B775PHBPush DB
02B776REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02B778PEA #$7E7EPush #$7E7E
02B77BPLBPull DB
02B77CPLBPull DB
02B77DPHXPush X
02B77EPHYPush Y
02B77FLDA $2428A=$2428
02B782PHAPush A
02B783LDX $23E4X=$23E4
02B786STX $2428$2428=X
02B789LDY $23EEY=$23EE
02B78CLDA $23F2A=$23F2
02B78FBNE #$52if(z==off) goto $02B7E3
02B791JSL $C2CC2CSR: $02CC2C 引数:1#$0079 引数:2#$0040会心の一撃が発生する行動か
02B799BEQ #$48if(z==on) goto $02B7E3
02B79BLDA #$0000A=#$0000アイテム種別:武器をセット
02B79EJSL $C2B8AASR: $02B8AA装備アイテムID取得
02B7A2LDA $242CA=$242C
02B7A5CMP #$0009A==#$0009?装備アイテムが毒針か
02B7A8BNE #$0Aif(z==off) goto $02B7B4
02B7AAJSL $C2CC2CSR: $02CC2C 引数:1#$007A 引数:2#$0020毒針で即死が発生する行動か
02B7B2BNE #$2Fif(z==off) goto $02B7E3
02B7B4JSL $C2CAD9SR: $02CAD9 引数:1#$2051 引数:2#$0008バイキルト中?
02B7BCBEQ #$0Aif(z==on) goto $02B7C8
02B7BEJSL $C2CC2CSR: $02CC2C 引数:1#$0079 引数:2#$0020バイキルトの対象になる行動か
02B7C6BNE #$1Bif(z==off) goto $02B7E3
02B7C8JSL $C2CAD9SR: $02CAD9 引数:1#$2052 引数:2#$0001オール会心中?
02B7D0BNE #$16if(z==off) goto $02B7E8
02B7D2CPY #$00B6Y==#$00B6?戦闘行動が「ころぶ」か
02B7D5BEQ #$11if(z==on) goto $02B7E8
02B7D7LDA #$0000A=#$0000
02B7DAPLXPull X
02B7DBSTX $2428$2428=X
02B7DEPLYPull Y
02B7DFPLXPull X
02B7E0PLBPull DB
02B7E1PLPPull P Flag
02B7E2RTLreturn
02B7E3LDA #$0002A=#$0002
02B7E6BRA #$F2goto $02B7DA
02B7E8LDA #$0001A=#$0001ヒット?
02B7EBBRA #$EDgoto $02B7DA
02B7EDPHPPush P Flag
02B7EEREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02B7F0PHAPush A
02B7F1PHXPush X
02B7F2PHYPush Y
02B7F3PHBPush DB
02B7F4PEA #$7E7EPush #$7E7E
02B7F7PLBPull DB
02B7F8PLBPull DB
02B7F9LDX #$0000X=#$0000
02B7FCLDA $23FE,XA=$23FE+X
02B7FFCMP $2420A==$2420?
02B802BEQ #$40if(z==on) goto $02B844
02B804INXX++
02B805INXX++
02B806CPX #$0008X>=#$0008?
02B809BCC #$F1if(c==off) goto $02B7FC
02B80BLDX #$0000X=#$0000
02B80ETXAA=X
02B80FJSL $C2C739SR: $02C739 引数:1#$02
02B814LDA $00A=DP($00)
02B816ORA $02Aor=DP($02)
02B818BEQ #$1Eif(z==on) goto $02B838
02B81AINXX++
02B81BCPX #$0004X>=#$0004?
02B81EBCC #$EEif(c==off) goto $02B80E
02B820LDX #$0000X=#$0000
02B823LDA $240E,XA=$240E+X
02B826BEQ #$2Aif(z==on) goto $02B852
02B828INXX++
02B829INXX++
02B82ACPX #$0008X>=#$0008?
02B82DBCC #$F4if(c==off) goto $02B823
02B82FPLBPull DB
02B830REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02B832PLYPull Y
02B833PLXPull X
02B834PLAPull A
02B835PLPPull P Flag
02B836SECc=on
02B837RTLreturn
02B838STX $2426$2426=X
02B83BPLBPull DB
02B83CREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02B83EPLYPull Y
02B83FPLXPull X
02B840PLAPull A
02B841PLPPull P Flag
02B842CLCc=off
02B843RTLreturn
02B844TXAA=X
02B845LSRA>>1
02B846STA $2426$2426=A
02B849PLBPull DB
02B84AREP #$30m=off(A/M:16b) x=off(X/Y:16b)
02B84CPLYPull Y
02B84DPLXPull X
02B84EPLAPull A
02B84FPLPPull P Flag
02B850CLCc=off
02B851RTLreturn
02B852TXAA=X
02B853LSRA>>1
02B854STA $2426$2426=A
02B857LDY #$0017Y=#$0017
02B85AJSL $C2CAE0SR: $02CAE0 引数:1#$203C 引数:2#$00FF
02B862CMP $2426A==$2426?
02B865BNE #$07if(z==off) goto $02B86E
02B867STY $2428$2428=Y
02B86AJSL $C2AD55SR: $02AD55戦闘中RAM領域を1キャラクター分0で初期化
02B86EDEYY–
02B86FBPL #$E9if(n==off) goto $02B85A
02B871PLBPull DB
02B872REP #$30m=off(A/M:16b) x=off(X/Y:16b)
02B874PLYPull Y
02B875PLXPull X
02B876PLAPull A
02B877PLPPull P Flag
02B878CLCc=off
02B879RTLreturn

やたらと長いこのSRですが、おそらくはヒット判定でしょう。後半はパーティアタック時のヒット判定なのでは、と推測します。

  • SR: $02873E 回避判定(通常)
02873EJSL $C2C240SR: $02C240 引数:1#$0C回避率分子取得
028743PHAPush A
028744JSL $C2CAE0SR: $02CAE0 引数:1#$203C 引数:2#$00FFグループID取得
02874CCMP #$0004A==or>=#$0004?PCor格闘場で賭けたモンスターか
02874FLDA #$003FA=#$003F回避率分母に63をセット
028752BCS #$03if(c==on) goto $028757
028754LDA #$002FA=#$002F回避率分母に47をセット
028757JSL $C0133ESR: $00133E乱数発生 00-A A(1B)
02875BCMP $01,SA==or>=Stack($01)?
02875DPLAPull A
02875ERTSreturn

$02873Eで取得した回避率分子よりも$028757で作成した乱数が小さければ回避ということになります。これを見ると、モンスターのほうが回避確率が高い(分母が小さいので)、ということがわかります。回避率分子はモンスター側は各モンスターに設定されている回避率分子の値を、PC側は1を固定で返すようになっています。K.Mixではこの部分をいじってすばやさに応じた分子を返すように変えました。

  • SR: $02875F 回避判定(特殊)
02875FPHXPush X
028760LDA #$0001A=#$0001アイテム種別:鎧をセット
028763JSL $C2B8AASR: $02B8AA装備アイテムID取得
028767LDA $242CA=$242C
02876ALDX #$003CX=#$003C
02876DCMP $C2D220,XA==$02D220+X?特殊回避防具配列のアイテムIDとマッチしているか
028771BEQ #$08if(z==on) goto $02877B
028773DEXX–
028774DEXX–
028775DEXX–
028776DEXX–
028777BPL #$F4if(n==off) goto $02876D
028779BRA #$0Bgoto $028786
02877BLDA $C2D222,XA=$02D222+Xマッチしていれば回避率(分母)を取得
02877FJSL $C0133ESR: $00133E乱数発生 00-A A(1B)
028783CLCc=off
028784BEQ #$01if(z==on) goto $028787
028786SECc=on
028787PLXPull X
028788RTSreturn

回避判定(通常)で回避できなかった場合は回避判定(特殊)が実行されます。したがって、PC側の回避率は

1-(1-通常回避率)*(1-特殊回避率)

という式になることになります(多分)。また、このSRを見てわかるとおり、特殊回避防具としてセットできるのは鎧のみです。DQ3 Extended1.44では特殊回避防具を拡張できるようになっていますが、鎧以外のアイテムに特殊回避率をセットしても意味がないので注意してください。

  • SR: $0284F2 直接攻撃ヒット判定
0284F2PHYPush Y
0284F3LDY $23E4Y=$23E4
0284F6JSR $8525SR: $028525攻撃主体がマヌーサ時の攻撃ヒット判定(c=onヒット)
0284F9BCC #$08if(c==off) goto $028503
0284FBJSR $854BSR: $02854Bまじんのおの装備時の攻撃ヒット判定(c=onヒット)
0284FEBCC #$03if(c==off) goto $028503
028500PLYPull Y
028501CLCc=off
028502RTSreturn
028503PLYPull Y
028504JSL $C2B6D9SR: $02B6D9直接攻撃ミス効果音
028508LDA #$000EA=#$000E
02850BPHAPush A
02850CJSL $C2CAE0SR: $02CAE0 引数:1#$203C 引数:2#$00FF
028514CMP #$0004A>=#$0004?
028517BCS #$05if(c==on) goto $02851E
028519LDA #$000DA=#$000D
02851CSTA $01,SStack($01)=A
02851EPLAPull A
02851FJSL $C1A87ASR: $01A87A戦闘メッセージID
028523SECc=on
028524RTSreturn

  • SR: $028525 攻撃主体がマヌーサ時の攻撃ヒット判定(c=onヒット)
028525LDA $23F2A=$23F2
028528BNE #$1Fif(z==off) goto $028549
02852AJSL $C2CC47SR: $02CC47 引数:1#$0079 引数:2#$0002戦闘行動がマヌーサに影響されるか
028532BEQ #$15if(z==on) goto $028549
028534JSL $C2CB32SR: $02CB32 引数:1#$2051 引数:2#$0004行動主体がマヌーサ中か
02853CBEQ #$0Bif(z==on) goto $028549
02853EJSL $C012D1SR: $0012D1乱数発生 $00-FF
028542AND #$0001A&=#$00011/2の確率でミス
028545BNE #$02if(z==off) goto $028549
028547CLCc=offミス
028548RTSreturn
028549SECc=onヒット
02854ARTSreturn

  • SR: $02854B まじんのおの装備時の攻撃ヒット判定(c=onヒット)
02854BLDA $23F2A=$23F2
02854EBNE #$2Cif(z==off) goto $02857C
028550JSL $C2CC47SR: $02CC47 引数:1#$007A 引数:2#$0008戦闘行動がまじんのおのに依存するか
028558BEQ #$22if(z==on) goto $02857C
02855ALDA $2428A=$2428
02855DPHAPush A
02855ESTY $2428$2428=Y
028561LDA #$0010A=#$0010まじんのおののアイテムID
028564STA $242C$242C=A
028567JSL $C2B87ASR: $02B87Aアイテム装備チェック
02856BPLAPull A
02856CSTA $2428$2428=A
02856FBVC #$0Bif(v==off) goto $02857Cv=onで装備している
028571JSL $C012D1SR: $0012D1乱数発生 $00-FF
028575AND #$0007A&=#$00071/8の確率でミス
028578BNE #$02if(z==off) goto $02857C
02857ACLCc=offミス
02857BRTSreturn
02857CSECc=onヒット
02857DRTSreturn

どちらもダメージが発生しない回避とミスですが、「すばやく みをかわした」は攻撃対象の回避が成功したことを意味し、「ミス! ダメージを受けない」は攻撃主体の攻撃が空振りした、という違いがあることがわかります。

コメント

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