物理命中率のバグについて
閲覧、拍手、コメントありがとうございます。
命中の判定処理を見る機会があったのでネタに記載です。
解析自体は不完全ですが…
;=======================================
; 命中判定処理
; X = 8bit 行動者キャラ番号
; Y = 8bit 対象者キャラ番号
;=======================================
LAB_C222E7:
LDX $11A8 ; X = $11A8 魔法データ命中率を取得
TDC ; A=D A = 0
LDA $3B18,y ; A = $3B18,y
JSR LAB_C2477A ;
TXA ; A=X
BNE LAB_C222CC ;
BRA LAB_C222E3 ;
LAB_C222F6:
PEA $8040 ; 戦闘中キャラ状態異常1、2状態の比較対象設定(上位:睡眠 下位:石化)
PEA $0210 ; 戦闘中キャラ状態異常3、4状態の比較対象設定(上位:氷漬け 下位:ストップ)
JSR LAB_C2584C ; アクティブ行動者の状態異常チェック
BCC LAB_C222E3 ; 対象者の状態異常が「睡眠、石化、氷漬け、ストップ」のどれかの場合
REP #$20 ; A_16bit
LDA $3018,y ; A = $3018,y 対象者の戦闘中キャラビットを取得
BIT $3A54 ; A = Ab&$3A54 ▼※戦闘中キャラビットと$3A54を内部論理積:ゼロフラグON
SEP #$20 ; A_8bit
BNE LAB_C222E3 ; ゼロフラグOFFの場合
LDA $11A8 ; A = $11A8 魔法データ命中率を取得
CMP #$FF ; A == #$FF 魔法データ命中率と最大値を比較
BEQ LAB_C222E3 ; 魔法データ命中率が最大の場合
STA $EE ; $EE = A 一時変数に命中率を代入
LDA $11A2 ; A = $11A2 魔法データ攻撃の種類を取得
LSR ; A>> 物理/魔法攻撃タイプ判定のため右シフト
BCC LAB_C2233A ; 魔法攻撃の場合
LDA $3E4C,y ; A = $3E4C,y ▼※対象者の$3E4C,yを取得:0x00(あばれる状態ビット?)
LSR ; A>> ※対象者の$3E4C,yを右シフト
BCS LAB_C222E3 ; ※対象者の$3E4C,yの最下位ビットが1の場合
LDA $3EE5,y ; A = $3EE5,y 対象者の戦闘中キャラ状態異常2状態を取得
BIT #$04 ; A = A b& #$04 分身状態ビットで内部論理積
BEQ LAB_C2233A ; 対象者が分身状態でない場合
;-----------------------------
; 対象者が分身状態の場合
;-----------------------------
JSR LAB_C24B42 ; 乱数取得処理
CMP #$40 ; A == #$40
BCS LAB_C222CC ;
LDA $3DFD,y ; A = $3DFD,y
ORA #$04 ; A = A | #$04
STA $3DFD,y ; $3DFD,y = A
BRA LAB_C222CC ;
;-----------------------------
; 対象者が分身状態でない場合
;-----------------------------
LAB_C2233A:
LDA $3B54,y ; A = $3B54,y 対象者の回避率を取得
BCS LAB_C22342 ; キャリーフラグONの場合
; ; 【原因】 ↑の分岐は「物理系、魔法系」のキャリーフラグが正常に機能していた場合を前提とした処理だが
; ; 「物理系」の処理の場合、$3E4C,yの右シフトによって大抵がキャリーフラグOFFになり、物理回避率が
; ; 魔法回避率に上書きされ機能していない
LDA $3B55,y ; A = $3B55,y 対象者の魔法回避率を取得
LAB_C22342:
PHA ; A->S Aレジスタをスタックへ格納
BCC LAB_C22383 ; キャリーフラグOFFの場合
LDA $3EE4,x ; A = $3EE4,x 行動者の戦闘中キャラ状態異常1状態を取得
LSR ; A>> 右シフトし暗闇状態か判定
BCC LAB_C2234D ; 行動者が暗闇状態でない場合
;-----------------------------
; 行動者が暗闇状態の場合
;-----------------------------
LSR $EE ; $EE>> 命中率半減
以下ステータスなどによる命中補正処理
不具合の原因は以下の通り
・物理攻撃か魔法攻撃を判定をキャリーフラグのON/OFFで見ている(文字が黄色の部分)
・対象者の物理回避率か魔法回避率を参照するのは上記のキャリーフラグをそのまま残し参照している(文字が黄緑の部分)
・物理攻撃の場合のみ対象者の謎の状態(解析不十分)の最下位ビットを判定しようとしているが、ここで右シフトしている
この右シフトによって、物理攻撃なのか魔法攻撃なのかを判定しているキャリーフラグをつぶしている。
この謎の状態の最下位ビットはおそらく、ほとんどの場合0であるため、物理攻撃のはずが、ここで魔法攻撃に切り替わってしまう。(文字がピンクの部分)
こういう解析も面白いですね。
今後もFF6の有名な不具合を解析した場合は、このように記事にしようと思います。
本日の解析結果のほうは、上の解析が全部ですw
夜の1時間弱と通勤の1時間半弱ではこの程度です。
すみません。
現在はモンスター行動処理の解析に戻り、F1の解析がほぼ終わったので、F2行動の解析に入ります。
以上
命中の判定処理を見る機会があったのでネタに記載です。
解析自体は不完全ですが…
;=======================================
; 命中判定処理
; X = 8bit 行動者キャラ番号
; Y = 8bit 対象者キャラ番号
;=======================================
LAB_C222E7:
LDX $11A8 ; X = $11A8 魔法データ命中率を取得
TDC ; A=D A = 0
LDA $3B18,y ; A = $3B18,y
JSR LAB_C2477A ;
TXA ; A=X
BNE LAB_C222CC ;
BRA LAB_C222E3 ;
LAB_C222F6:
PEA $8040 ; 戦闘中キャラ状態異常1、2状態の比較対象設定(上位:睡眠 下位:石化)
PEA $0210 ; 戦闘中キャラ状態異常3、4状態の比較対象設定(上位:氷漬け 下位:ストップ)
JSR LAB_C2584C ; アクティブ行動者の状態異常チェック
BCC LAB_C222E3 ; 対象者の状態異常が「睡眠、石化、氷漬け、ストップ」のどれかの場合
REP #$20 ; A_16bit
LDA $3018,y ; A = $3018,y 対象者の戦闘中キャラビットを取得
BIT $3A54 ; A = Ab&$3A54 ▼※戦闘中キャラビットと$3A54を内部論理積:ゼロフラグON
SEP #$20 ; A_8bit
BNE LAB_C222E3 ; ゼロフラグOFFの場合
LDA $11A8 ; A = $11A8 魔法データ命中率を取得
CMP #$FF ; A == #$FF 魔法データ命中率と最大値を比較
BEQ LAB_C222E3 ; 魔法データ命中率が最大の場合
STA $EE ; $EE = A 一時変数に命中率を代入
LDA $11A2 ; A = $11A2 魔法データ攻撃の種類を取得
LSR ; A>> 物理/魔法攻撃タイプ判定のため右シフト
BCC LAB_C2233A ; 魔法攻撃の場合
LDA $3E4C,y ; A = $3E4C,y ▼※対象者の$3E4C,yを取得:0x00(あばれる状態ビット?)
LSR ; A>> ※対象者の$3E4C,yを右シフト
BCS LAB_C222E3 ; ※対象者の$3E4C,yの最下位ビットが1の場合
LDA $3EE5,y ; A = $3EE5,y 対象者の戦闘中キャラ状態異常2状態を取得
BIT #$04 ; A = A b& #$04 分身状態ビットで内部論理積
BEQ LAB_C2233A ; 対象者が分身状態でない場合
;-----------------------------
; 対象者が分身状態の場合
;-----------------------------
JSR LAB_C24B42 ; 乱数取得処理
CMP #$40 ; A == #$40
BCS LAB_C222CC ;
LDA $3DFD,y ; A = $3DFD,y
ORA #$04 ; A = A | #$04
STA $3DFD,y ; $3DFD,y = A
BRA LAB_C222CC ;
;-----------------------------
; 対象者が分身状態でない場合
;-----------------------------
LAB_C2233A:
LDA $3B54,y ; A = $3B54,y 対象者の回避率を取得
BCS LAB_C22342 ; キャリーフラグONの場合
; ; 【原因】 ↑の分岐は「物理系、魔法系」のキャリーフラグが正常に機能していた場合を前提とした処理だが
; ; 「物理系」の処理の場合、$3E4C,yの右シフトによって大抵がキャリーフラグOFFになり、物理回避率が
; ; 魔法回避率に上書きされ機能していない
LDA $3B55,y ; A = $3B55,y 対象者の魔法回避率を取得
LAB_C22342:
PHA ; A->S Aレジスタをスタックへ格納
BCC LAB_C22383 ; キャリーフラグOFFの場合
LDA $3EE4,x ; A = $3EE4,x 行動者の戦闘中キャラ状態異常1状態を取得
LSR ; A>> 右シフトし暗闇状態か判定
BCC LAB_C2234D ; 行動者が暗闇状態でない場合
;-----------------------------
; 行動者が暗闇状態の場合
;-----------------------------
LSR $EE ; $EE>> 命中率半減
以下ステータスなどによる命中補正処理
不具合の原因は以下の通り
・物理攻撃か魔法攻撃を判定をキャリーフラグのON/OFFで見ている(文字が黄色の部分)
・対象者の物理回避率か魔法回避率を参照するのは上記のキャリーフラグをそのまま残し参照している(文字が黄緑の部分)
・物理攻撃の場合のみ対象者の謎の状態(解析不十分)の最下位ビットを判定しようとしているが、ここで右シフトしている
この右シフトによって、物理攻撃なのか魔法攻撃なのかを判定しているキャリーフラグをつぶしている。
この謎の状態の最下位ビットはおそらく、ほとんどの場合0であるため、物理攻撃のはずが、ここで魔法攻撃に切り替わってしまう。(文字がピンクの部分)
こういう解析も面白いですね。
今後もFF6の有名な不具合を解析した場合は、このように記事にしようと思います。
本日の解析結果のほうは、上の解析が全部ですw
夜の1時間弱と通勤の1時間半弱ではこの程度です。
すみません。
現在はモンスター行動処理の解析に戻り、F1の解析がほぼ終わったので、F2行動の解析に入ります。
以上
スポンサーサイト
コメント
コメントの投稿