DQ3戦闘部分解説7

ずいぶん更新をサボってしまいました。サボっている間にもそこそこアクセスをして頂き空振りで申し訳ありませんでした。言い訳をしておくとwww、例の自己満足以外の何者でもないDQ3(6)SFCPlugin.dllのマップ系の描画速度の改善作業をポチポチとやっていました。一応クソ遅かった戦闘背景、サブマップ、フィールドマップの描画時間を最大で2秒(手元の遅いPCベース。改善前は最低20秒くらいかかっていた)くらいまで改善することができたので、目標は達成できました。はっきり言ってこの作業は別の本丸の作業が嫌になったので気晴らしにやっていただけなので、本来の作業に戻ります。

前回PC側のコマンド入力のところまで解説しましたが、1点重要な部分が抜けていました。今回はそこだけを説明して終わりです。

  • SR: $025EC3 戦闘コマンド処理_SR_0000(直接攻撃コマンド入力処理)
025EC3JSR $5F39SR: $025F39直接攻撃戦闘行動セット(対象選択不要c=on)
025EC6BCC #$02if(c==off) goto $025ECA
025EC8CLCc=off
025EC9RTSreturn
パーティアタックに関する処理なので割愛
025F2CORA #$0020Aor=#$0020ターゲット指定(対象不確定?
025F2FJSL $C2CB70SR: $02CB70 引数:1#$2035 引数:2#$00FE
025F37CLCc=off
025F38RTSreturn

  • SR: $025F39 直接攻撃戦闘行動セット
025F39LDA #$0000A=#$0000アイテム種別:武器をセット
025F3CJSL $C2B8AASR: $02B8AA装備アイテムID取得
025F40LDA $242CA=$242C
025F43LDX #$0012X=#$0012
025F46CMP $C25F83,XA==$025F83+X?複数対象武器リスト
025F4ABEQ #$14if(z==on) goto $025F60
025F4CDEXX–
025F4DDEXX–
025F4EBPL #$F6if(n==off) goto $025F46
025F50LDA #$0001A=#$0001直接攻撃戦闘行動ID
025F53LDX $2428X=$2428
025F56JSL $C2CB70SR: $02CB70 引数:1#$2034 引数:2#$01FF戦闘中PC情報変更
025F5ECLCc=off
025F5FRTSreturn
025F60LDA #$00ACA=#$00ACグループ攻撃戦闘行動ID
025F63CPX #$000CX>=#$000C?全体攻撃武器の$025F83からのオフセット
025F66BCC #$EBif(c==off) goto $025F53
025F68LDX $2428X=$2428
025F6BLDA #$00ADA=#$00AD全体攻撃戦闘行動ID
025F6EJSL $C2CB70SR: $02CB70 引数:1#$2034 引数:2#$01FF戦闘中PC情報変更
025F76LDA #$0041A=#$0041攻撃対象も「全体」でセット
025F79JSL $C2CB70SR: $02CB70 引数:1#$2035 引数:2#$00FE戦闘中PC情報変更
025F81SECc=on
025F82RTSreturn

直接攻撃部分を見ると$7E2034-35の上位7ビットの意味がわかってしまいます(下位9ビットは戦闘行動ID)。簡単に言ってしまうと

対象確定#0x(xはキャラID)
単体、グループ(対象未確定)#2x(xはグループID)
全体攻撃#$41

ということのようです。実際にどのキャラクターに対して行動を実行するかは実行時に決定するのがほとんどです。

(2010-11-04追記)

  • SR: $02629D 戦闘コマンド処理_SR_0005(「にげる」コマンド選択)
02629DJSL $C1E32ESR: $01E32E 引数:1#$0067逃げたSE再生
0262A3LDA #$0042A=#$0042
0262A6STA $23E4$23E4=A
0262A9PEA #$2011Push #$2011
0262ACPEA #$0010Push #$0010
0262AFPEA #$7E00Push #$7E00
0262B2JSL $C9029ESR: $09029Eイベント戦闘かチェック
0262B6BNE #$48if(z==off) goto $026300
0262B8JSR $636FSR: $02636F確実に逃げられるか調べる(逃げられるc=on)
0262BBBCS #$22if(c==on) goto $0262DF
0262BDJSL $C012D1SR: $0012D1
0262C1AND #$0003A&=#$0003
0262C4STA $00DP($00)=A
0262C6PEA #$23AFPush #$23AF
0262C9PEA #$0003Push #$0003
0262CCPEA #$7E00Push #$7E00
0262CFJSL $C9029ESR: $09029E
0262D3TAXX=A
0262D4LDA $C2636B,XA=$02636B+X
0262D8AND #$00FFA&=#$00FF
0262DBCMP $00A>=DP($00)?
0262DDBCC #$21if(c==off) goto $026300
0262DFLDA #$0003A=#$0003
0262E2PEA #$23ABPush #$23AB
0262E5PEA #$000FPush #$000F
0262E8PEA #$7E00Push #$7E00
0262EBJSL $C902E9SR: $0902E9
0262EFJSL $C1A867SR: $01A867 引数:1#$0023戦闘メッセージ表示「○○は にげだした!」
0262F5JSL $C1A867SR: $01A867 引数:1#$0003
0262FBLDY #$0004Y=#$0004
0262FECLCc=off
0262FFRTSreturn
026300PEA #$23AFPush #$23AF
026303PEA #$0003Push #$0003
026306PEA #$7E00Push #$7E00
026309JSL $C9029ESR: $09029E
02630DINCA++
02630ECMP #$0004A>=#$0004?
026311BCC #$03if(c==off) goto $026316
026313LDA #$0004A=#$0004
026316PEA #$23AFPush #$23AF
026319PEA #$0003Push #$0003
02631CPEA #$7E00Push #$7E00
02631FJSL $C902E9SR: $0902E9
026323LDA #$0002A=#$0002
026326PEA #$23ABPush #$23AB
026329PEA #$0030Push #$0030
02632CPEA #$7E00Push #$7E00
02632FJSL $C902E9SR: $0902E9
026333LDX #$0017X=#$0017
026336JSL $C2CAD9SR: $02CAD9 引数:1#$2050 引数:2#$0002
02633EBEQ #$11if(z==on) goto $026351
026340JSL $C2CAD9SR: $02CAD9 引数:1#$203C 引数:2#$00FF
026348CMP #$0004A>=#$0004?
02634BBCC #$04if(c==off) goto $026351
02634DJSL $C2B52DSR: $02B52D
026351DEXX–
026352BPL #$E2if(n==off) goto $026336
026354JSL $C1A867SR: $01A867 引数:1#$0023戦闘メッセージ表示「○○は にげだした!」
02635AJSL $C1A867SR: $01A867 引数:1#$0001
026360JSL $C1A867SR: $01A867 引数:1#$0024戦闘メッセージ表示「しかし まわりこまれた!」
026366LDY #$0004Y=#$0004
026369CLCc=off
02636ARTSreturn

  • SR: $02636F 確実に逃げられるか調べる(逃げられるc=on)
02636FPEA #$23ABPush #$23AB
026372PEA #$0030Push #$0030
026375PEA #$7E00Push #$7E00
026378JSL $C9029ESR: $09029E
02637CCMP #$0001A==#$0001?
02637FBEQ #$1Fif(z==on) goto $0263A0
026381JSL $C2C739SR: $02C739 引数:1#$06モンスター側のビットを立てる
026386JSL $C2B9CESR: $02B9CEモンスター最高レベル取得
02638ACLCc=off
02638BADC #$000AA+=(#$000A+c)パーティとのレベル差
02638EPHAPush A
02638FLDA #$0000A=#$0000
026392JSL $C42FEBSR: $042FEB 引数:1#$01 引数:2#$FF 引数:3#$FFレベル取得
026399CMP $01,SA==or>=Stack($01)?
02639BPLAPull A
02639CBCS #$02if(c==on) goto $0263A0
02639ECLCc=off
02639FRTSreturn
0263A0SECc=on
0263A1RTSreturn

もう1点「にげる」を選んだ場合の処理を説明するのを忘れていました。この実装を見ると確実に逃げるためには(おそらく先頭のキャラクターの)レベルがモンスターの最高レベル+10以上であれば確実に逃げられるようです。モンスターの最高レベルは63なので、レベル73以上であればどこでも逃げられることになります。手軽に難易度を変更したい場合はこの部分をいじるといいでしょう。

コメント

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