TOP > プログラミング関係解説&調査 > 行動異常

行動異常

当ページの内容は、ある程度のプログラミングの知識を必要とする。
まず、プログラミング関係解説&調査をひととおり読んでいただきたい。

行動異常については既に世界の合言葉は森部様がとても詳しく調べていらっしゃるため、ここでは、実際にどういう処理がなされているのかと、技で発生する行動異常以外、装備品で発生する戦闘開始時の行動異常についてざっくりと触れる。
戦闘関係 > 行動異常の説明も参照していただきたい。

行動異常は敵専用の状態異常であり、本作においては隠し要素である。
全16種類($0$F)存在しているが、$0番目は通常状態、それ以外が行動異常の状態ということになる。
行動異常は以下の状況で発生する。

  1. 特定の技で敵を攻撃する
  2. 敵が特定の技を使う(敵自身に発生)
  3. 敵が特定の属性の技を受ける
  4. 味方が特定の装備品を左に装備している時に、戦闘開始時、特定の敵種族に1/2の確率で発生
    (複数キャラが該当装備を装備していても、確率は変動しない)

1.~3.は必ず発生し、4.は1/2の確率で発生する。
行動異常は、敵ターンが回ってきた時に「敵の現在レベル/128」の確率で解除される。
また、BREAK DOWNする敵は敵味方いずれかのターンが回ってきた時に必ず回復する。

当コンテンツでは、各状況で、プログラム上では何が起きているかを紹介する。
まずは、1.について説明する。2.と処理は実質同じである。
3.以降は別ページで説明している。3.は戦闘開始時行動異常解説、4.は戦闘開始時行動異常解説のページを参照。

技データ内行動異常

これまでも説明したとおり、技データは、25バイト分の領域を使って記録されている。
便宜上25個のデータに順に0から24の番号を付けた場合、技データ22の上1桁が8以上の時、下1桁が行動異常の値である。
例えば「マザーイメージ」なら、技データ22の値は$89なので、行動異常$9が発生する。
岩間さまが使う「のたうち」なら、技データ22の値は$8Dなので、行動異常$Dが発生する。

行動異常データ

行動異常データ$0$Fのデータは、$D5:644B$D5:64CAに入っていて、必要な時にロードする。
16種類あるが、行動異常のデータはそれぞれ8バイトを使用している。
例えば「マザーイメージ」の行動異常$9だったら、$D5:6493$D5:649Aに以下のようにデータが入っている。

アドレス内容
$D5:6493$F0上4ビットが使用不能になる技番号
$D5:6494$00-
$D5:6495$02レベル変動値
$D5:6496$04行動順・発生時修正値
$D5:6497$01行動順・被ダメージ定数
$D5:6498$05行動順・攻撃以外の増加値
$D5:6499$05行動順・攻撃時の減少値
$D5:649A$00-

行動異常によってはレベル変動がマイナス補正になる場合があるが、その場合は$100からマイナス分を引いた値が入る。
実際には「符号付き8ビット整数」という表記方法であり、2進数で表記した時に一番上の桁が1の時には負の数を表現しているのだが、少しわかりにくいのでとりあえず「$100からマイナス分を引いた値」と思っておいてくださって構わない。
行動異常$Dだと以下のようになる。

アドレス内容
$D5:64B3$C0上4ビットが使用不能になる技番号
$D5:64B4$00-
$D5:64B5$FBレベル変動値
$D5:64B6$00行動順・発生時修正値
$D5:64B7$08行動順・被ダメージ定数
$D5:64B8$07行動順・攻撃以外の増加値
$D5:64B9$32行動順・攻撃時の減少値
$D5:64BA$00-

レベル変動が$FBとなっているが、$100 - $FB = $05だから、レベル変動は-5である。

符号付き8ビット整数

「符号付き8ビット整数」は、2進数8ビットの値の、一番上の1ビットを正負の記号(1なら負)、残り7ビットを絶対値(000 0000~111 1011、10進数なら0~127)として扱う数値の表現方法である。
この方法だと、10進数の-127から+127までを8ビットで表現できることになる。
ちょっとややこしいのは負の数の表現の場合で、10進法なら0を原点として、負の方向へ-1, -2, -3, ……と数値(絶対値)は増えていくのだが、符号付き8ビット整数だと、0を原点とした時に、%1111 1111, %1111 1110, %1111 1101, %1111 1100, ……と、数値(絶対値)が最大から最小へと減少していくのである。
よって、10進法「-1」は「%1111 1111」=「$FF」、10進法「-2」は「%1111 1110」=「$FE」……と、通常の16進数で見ると最大の$FFから減少していくように見える。
$FBを「符号付き8ビット整数」として解釈する場合、10進法「-5」ということになる。

という理屈は横に置いておくとしても、結局は、$100 - $FB = $05のように$100から引くとマイナス分の数値がわかりやすくなる、ということがわかる。

技による行動異常発生処理

味方側の技に行動異常が設定されており、敵を行動異常にした時の処理は以下のようになる。
技発動後、必要な部分のみ抜粋。
後々の説明でややこしくなるため、敵番号0の敵に技を当てた場合を記す。
(一度の戦闘で敵は最大15体出現するが、この敵に敵番号として0~Eを振った時の値)

$C1/D570 LDA $D50016,x           ;Aに[$D50016,x](技データ22)をロード
$C1/D574 STA $7E900A[$7E:900A]   ;Aを[$7E:900A]に書き込み
;
;(省略)
;
$C1/D9E7 LDA $7E900A[$7E:900A]   ;Aに[$7E:900A]をロード
$C1/D9EB BIT #$80                ;Aと$80で論理積(ステータスフラグ変更のみ)
$C1/D9ED BEQ $04    [$D9F3]      ;ゼロフラグが立っているとき[$D9F3]分岐
$C1/D9EF ORA #$80                ;Aと$80で論理和
$C1/D9F1 AND #$8F                ;Aと$8Fで論理積
$C1/D9F3 STA $7E9008,x[$7E:AB08] ;Aを[$7E:AB08]に書き込み X:1B00
$C1/D9F7 RTS                     ;サブルーチン戻り
;
;(省略)
;
$C1/CC2D LDA $7E9008,x[$7E:AB08] ;Aに[$7E:AB08]をロード X:1B00
$C1/CC31 BPL $0F    [$CC42]      ;ネガティブフラグが立っていないとき[$CC42]分岐
$C1/CC33 AND #$0F                ;Aと$0Fで論理積
$C1/CC35 CMP $7E8F02,x[$7E:AA02] ;Aと[$7E:AA02](行動異常)を減算比較(ステータスフラグ変更のみ)
$C1/CC39 BEQ $07    [$CC42]      ;ゼロフラグが立っているとき[$CC42]分岐
$C1/CC3B STA $7E8F02,x[$7E:AA02] ;Aを[$7E:AA02]に書き込み
$C1/CC3F JSR $1C8E  [$C1:1C8E]   ;[$C1:1C8E]へジャンプ

行動異常の値が格納されている技データ22は、まず[$7E:900A]に読み込まれる。
先に記した通り、技データ22は、上1桁が8以上の時、下1桁が行動異常の値になる。
$C1/D9EBで、技データ22と$80で論理積を取っているが、行動異常の値が入っているなら技データ22は$80以上だから、論理積を取った時ゼロフラグが立たない。
よって$C1/D9EF$C1/D9F1は、行動異常の値が入っている時の処理で、$80と論理和・$8Fと論理積を取っているが、「マザーイメージ」の$89のように、1桁目が8の場合はそのまま、$89で変わらない。
技データ22の1桁目が8ではない時に8に変更する処理のようである(例えば「キコキコ」だと技データ22が$E3だが、この処理で$83になる)。
計算後の値は[$7E:AB08](適番号0の時)に入り、下1桁が行動異常の値である。

最終的には、$C1/CC2D[$7E:AB08]が読み込まれ、$C1/CC35にて$0Fと論理積を取ることで下1桁のみを取り出している。
つまり$C1/CC35の処理でAには行動異常の値が入っている。
続いてAと[$7E:AA02]を減算比較しているが、[$7E:AA02]に入っているのは、敵番号0の行動異常の値になる。
減算比較してゼロフラグが立つのは、既に同じ行動異常にかかっている時になるが、そうでない場合は$C1/CC3Bに進み、行動異常の値を[$7E:AA02]に書き込む。
ここで、行動異常になったことが確定である。

間は省略したが、以上の処理の間、技使用者のステータスや敵側のステータスは関与せず、乱数計算もないので何らかの確率で行動異常が発生するのでもない。
つまり行動異常を発生させられる技は必ず相手を行動異常にできるということになる。
ただし、あくまでも技を当てた時点では発生するというだけである。

敵が複数の場合、つまり敵番号1、敵番号2、……がいる場合は、[$7E:AB08][$7E:AA02]のアドレスは+10ずつされた値になる。ここでは省略する。

この後は、該当の行動異常データを呼び出し、最初の処理として順序ポイントの計算が行われる。
順序ポイントの説明はZsnsK's F**kin' Site様が詳しいが、敵に行動順が回ってきた時、順序ポイントが一番高い敵が行動する仕組みがある。
以降の敵番号は0とする。

;行動異常データの呼び出し
$C1/1CF7 PHX                     ;Xをスタックにプッシュ
$C1/1CF8 LDA $7E8F02,x[$7E:AA02] ;Aに敵番号0の行動異常[$7E:AA02]を読み込み
$C1/1CFC ASL A                   ;算術左シフト(*2)
$C1/1CFD ASL A                   ;算術左シフト(*2)
$C1/1CFE ASL A                   ;算術左シフト(*2)
$C1/1CFF REP #$21                ;Aを16bit幅に変更、キャリーフラグクリア
$C1/1D01 AND #$00F8              ;Aと$00F8で論理積
$C1/1D04 ADC $D50060[$D5:0060]   ;A+[$D5:0061][$D5:0060]
$C1/1D08 TAX                     ;Aレジスタの値をXレジスタに転送
$C1/1D09 SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/1D0B LDY #$0320              ;Yに$0320をロード
;
;ループ処理開始
$C1/1D0E LDA $D50000,x           ;Aに行動異常データ0x[$D50000,x]をロード
$C1/1D12 STA $0000,y             ;Aを[$0000,y]([$00:0320]~)に書き込み
$C1/1D15 INX                     ;Xをインクリメント(+1)
$C1/1D16 INY                     ;Yをインクリメント(+1)
$C1/1D17 CPY #$0328              ;Yと$0328を減算比較(ステータスレジスタのみ変更)
$C1/1D1A BNE $F2    [$1D0E]      ;ゼロフラグが立っていないとき[$1D0E]分岐(ループ頭へ)
;ループ処理ここまで
;
$C1/1D1C PLX                     ;Xにスタックからプル
$C1/1D1D RTS                     ;サブルーチン戻り

ループ処理までの処理は、[$7E:AA02]に入った行動異常の値から、行動異常データのアドレスを計算している。
つまり、行動異常の値*8 & $00F8 + [$D5:0061][$D5:0060]$D50000を足すと、該当の行動異常の行動異常データの最初のアドレスになる、ということである。
なお、[$D5:0061] = $64, [$D5:0060] = $4Bなので、

行動異常の値*$8 & $00F8 + $644B + $D50000

が、行動異常データの最初のアドレスである。
例えば、「マザーイメージ」の行動異常$9なら、

$09*$8 & $00F8 + $644B + $D50000 = $D56493

なので、行動異常$9の行動異常データのアドレスは[$D5:6493]から開始になっている、ということである。

行動異常データのアドレスが計算できたら、ループ処理を行うことで、行動異常データ8バイト分を読み出し、[$00:0320][$00:0327]に書き込みしている。

$C1/1C91 STZ $24    [$00:0324]   ;[$00:0324]に0を書き込み
$C1/1C93 REP #$20                ;Mフラグをクリア Aは16bit幅
$C1/1C95 LDA $7E9104,x[$7E:AC04] ;Aに[$7E:AC05][$7E:AC04](順序ポイント)をロード
$C1/1C99 LSR A                   ;論理右シフト(/2)
$C1/1C9A CLC                     ;キャリーフラグクリア
$C1/1C9B ADC $23    [$00:0323]   ;A + [$00:0323]
$C1/1C9D BCC $03    [$1CA2]      ;キャリーフラグが立っていないとき[$1CA2]分岐
$C1/1CA2 STA $7E9104,x[$7E:AC04] ;Aを[$7E:AC05][$7E:AC04](順序ポイント)に書き込み
$C1/1CA6 SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/1CA8 RTS                     ;サブルーチン戻り

$C1/1C95は、16bitモードなので、敵番号0の順序ポイント[$7E:AC05][$7E:AC04]Aにロードしている。
$C1/1C99で、論理右シフトで÷2(小数点以下切り捨て)し、$C1/1C9B[$00:0323]を加えている。
この[$00:0323]は、先のループ処理で読み込んだ行動異常データの中の「行動順・発生時修正値」である。
加算後に、[$7E:AC05][$7E:AC04]に計算値を書き込みしたので、順序ポイントがここで変更されたことになる。
つまり、行動異常により、

trunc(順序ポイント/2) + 「行動順・発生時修正値」

順序ポイントが以上のように計算され更新された。
元の順序ポイントを半減してから、「行動順・発生時修正値」を加算するので、順序ポイントが元の値より増えるか減るかは状況による。
ただし発生時修正値は$0$Fであり、順序ポイントは初期値(戦闘開始時)が「$100 - 知の値」なので、ほとんどのケースで半減での減少の方が影響が大きく、行動異常を起こすとだいたいの場合で順序ポイントが減る。

レベル変動処理は以下のとおり。引き続き敵番号0とする。
行動異常データの呼び出しで、[$00:0322]にはレベル変動値が入った状態である。

$C1/17E6 LDA #$00                ;Aに$00をロード
$C1/17E8 SEC                     ;キャリーフラグON
$C1/17E9 SBC $22    [$00:0322]   ;A($00) - [$00:0322]
$C1/17EB CMP #$80                ;Aと$80を減算比較(フラグ変更)
$C1/17ED BNE $02    [$17F1]      ;ゼロフラグが立っていないとき[$17F1]分岐
$C1/17F1 STA $22    [$00:0322]   ;Aに[$00:0322]を書き込み
$C1/17F3 BRA $CD    [$17C2]      ;フラグにかかわりなく常に分岐[$17C2]
$C1/17C2 LDA $22    [$00:0322]   ;Aに[$00:0322]をロード
$C1/17C4 BMI $0D    [$17D3]      ;ネガティブフラグが立っているとき[$17D3]分岐

;$C1/17C4でネガティブフラグが立っていないときの処理
$C1/17C6 LDA $7E9000,x[$7E:AB00] ;Aに[$7E:AB00]をロード
$C1/17CA CLC                     ;キャリーフラグクリア
$C1/17CB ADC $22    [$00:0322]   ;A + [$00:0322]
$C1/17CD BCC $0F    [$17DE]      ;キャリーフラグが立っていないとき[$17DE]分岐
$C1/17CF LDA #$FF                ;キャリーフラグONならAに$FF書き込み
$C1/17D1 BRA $0B    [$17DE]      ;フラグにかかわりなく常に分岐[$17DE]

$C1/17D3 LDA $7E9000,x[$7E:AB00] ;Aに[$7E:AB00]をロード
$C1/17D7 CLC                     ;キャリーフラグクリア
$C1/17D8 ADC $22    [$00:0322]   ;A + [$00:0322]
$C1/17DA BCS $02    [$17DE]      ;キャリーフラグが立っているとき[$17DE]分岐

$C1/17DC LDA #$00                ;キャリーフラグOFFならAに$00書き込み

$C1/17DE STA $7E9000,x[$7E:AB00] ;Aを[$7E:AB00]に書き込み
$C1/17E2 RTS                     ;サブルーチン戻り

$C1/17E9では、キャリーフラグONで減算をしているので、実際には、

$100 - [$00:0322](レベル変動値)

の計算になる。
先に記したが、レベル変動は、プラス補正が入る場合とマイナス補正が入る場合がある。
行動異常$9だとプラス補正で$02、行動異常$Dだとマイナス補正で$FB(レベル補正値-5)である。
つまり、

$100 - [$00:0322](レベル変動値)

を計算すると、プラス補正の行動異常$9の場合は$FEに、マイナス補正の行動異常$Dだと$05になる。
この値が新たに[$00:0322]に書き込みされるので、正負逆になった値が入るようなものである。
$C1/17C4[$00:0322]のネガティブフラグを判定しているが、2進法で一番上の桁が1ならネガティブフラグが立つので、レベル変動値がプラス補正ならネガティブフラグが立ち、マイナス補正ならネガティブフラグが立たない。

その後の処理を見ると似たようなことをしているのだが、行っている計算は、キャリーフラグクリア後に、

[$7E:AB00] + [$00:0322]

である。
[$7E:AB00]は敵番号0の現在のレベルなので、

敵の現在のレベル + ($100 - レベル変動値)

の計算となる。
例えば、敵の現在のレベルが$14だとしたら、行動異常$9の場合(ネガティブフラグが立っている)、

$14 + $FE = $112

8bitモードなのでキャリー分は考慮せず、新たにAに入るのは$12である。元のレベルから-2されたことになる。
もし、敵の現在のレベルが$01だったら、

$01 + $FE = $FF

結果はキャリーフラグが立たず$FF(255)になるが、この時の処理が$C1/17DCである。
ネガティブフラグONかつ加算でキャリーフラグが立たないということは、上の通りに、「レベルを-2する処理をしたら0以下になってしまった」場合にあたる。
よって、$C1/17DCA$00を書き込んで、行動異常でのレベル補正でレベルが減少する場合、下限は0という処理をしている。

一方、行動異常$Dの場合(ネガティブフラグが立っていない)、

$14 + $05 = $19

通常の加算で考えれば良いので、元のレベルを+5したことになる。
また、ネガティブフラグが立っていない時はこの後に$C1/17CDでキャリーフラグの分岐があるが、これは加算の結果レベルが$FF(255)を越えてしまった場合を意味しており、加算の結果レベルが$FF(255)を越えたらA$FFを書き込んでいる。つまり、行動異常でのレベル補正でレベルが増加する場合、上限は255ということになる。

以上が行動異常発生直後のレベル変動処理である。
本来ならプラス補正が入るはずの「マザーイメージ」の行動異常$9で、なぜかレベルが-2されているし、その逆も起きているが、これが仕様である。
この後に敵を攻撃などする場合は、攻撃直前に変動分が1戻り、更に+2された値でダメージ量諸々が計算されることになるので、最終的にはレベルアップ補正が起きたことになるのだが、以下で記すとおり、BREAK DOWNする敵だと妙な現象が起きてしまうことになる。

BREAK DOWNする敵の処理

上で記した行動異常発生処理自体はどの敵にも入るが、先に述べた通りに、BREAK DOWNする敵は、敵味方のいずれかのターンが回った時点で行動異常から回復する。
よって、BREAK DOWNする敵は、実質行動異常にならないのと同じである。
ただし、「行動異常から回復」というのは、行動異常が記録されたメモリアドレスの値を$00に変更する、という処理だけであり、レベル変動処理はそのままである。
このために、BREAK DOWNする敵にレベル変動する行動異常を発生させると、本来のレベル変動の正負逆の処理だけ残したまま行動異常から回復するという奇妙な現象が起きてしまう。
たとえば「マザーイメージ」を当てると、行動異常$9の効果でレベルが-2された直後に行動異常から回復し、レベルが-2されたという処理だけが残る、というような具合である。

まず、敵のタイプについて説明をする。
敵のタイプは、COLLAPSE、BREAKDOWN、OBJECT、LEADER、NAMEの5種類で、それ以外は当てはまらないタイプ「なし」ということになる。
この中の「BREAKDOWN」が、BREAK DOWN可能な戦闘におけるBREAK DOWN対象の敵である。
敵のタイプは、敵データ15に入っており、「BREAKDOWN」だと$02である。
敵データ15の詳細な解説も参照。

また、敵データ15は、敵種類1だと[$00:1A2F]に、以降は+$40したアドレスに入る。

BREAK DOWNする敵が行動異常から回復する処理は、以下の通りである。
敵番号0、敵種類1としておく。

$C1/92D0 LDY $0002,x[$00:1B02]   ;Yに[$00:1B02]をロード
$C1/92D3 LDA $002F,y[$00:1A2F]   ;Aに[$00:1A2F](敵種類1の敵データ15)をロード
$C1/92D6 BIT #$04                ;Aと$04で論理積(ステータスフラグ変更のみ)
$C1/92D8 BNE $EF    [$92C9]      ;ゼロフラグが立っていないとき[$92C9]分岐
$C1/92DA BIT #$02                ;Aと$02で論理積(ステータスフラグ変更のみ)
$C1/92DC BEQ $0C    [$92EA]      ;ゼロフラグが立っているとき[$92EA]分岐
$C1/92DE LDA #$00                ;Aに$00をロード
$C1/92E0 STA $7E8F02,x[$7E:AA02] ;Aを[$7E:AA02](敵番号0の行動異常)に書き込み
$C1/92E4 LDA $16    [$00:0316]   ;Aに[$00:0316]をロード(この時点で$FF)
$C1/92E6 BEQ $E1    [$92C9]      ;ゼロフラグが立っているとき[$92C9]分岐
$C1/92E8 BRA $00    [$92EA]      ;フラグにかかわりなく常に分岐[$92EA]
$C1/92EA LDA $7E9104,x[$7E:AC04] ;Aに[$7E:AC04](順序ポイント下1バイト)をロード
$C1/92EE STA $10    [$00:0310]   ;Aを[$00:0310]に書き込み
$C1/92F0 LDA $7E9105,x[$7E:AC05] ;Aに[$7E:AC04](順序ポイント下1バイト)をロード
$C1/92F4 STA $11    [$00:0311]   ;Aを[$00:0311]に書き込み
$C1/92F6 STX $14    [$00:0314]   ;Xを[$00:0314]に書き込み
$C1/92F8 JSR $E1A9  [$C1:E1A9]   ;[$C1:E1A9]へジャンプ

実際の処理は$C1/92D3$C1/92E0の部分である。
$C1/92D3で、敵データ15をロードしている。

まず、敵データ15と$04で論理積を取ってゼロフラグが立つかどうかを判定している。
敵データ15と$04でゼロフラグが立たないのは、敵データ15が$04になる、敵タイプ「OBJECT」のみである。
敵タイプ「OBJECT」は、木のはしらや岩といった障害物の敵にあたり、「OBJECT」についてはここで処理から除外されて[$92C9]へジャンプする。

続いて敵データ15と$02で論理積を取って、$C1/92DCにてゼロフラグが立つか判定しているが、上で説明した通り、敵データ15が$02だと敵タイプは「BREAKDOWN」であり、論理積を取るとゼロフラグは立たない。他の敵タイプはゼロフラグが立つ。
よって、$C1/92DEの処理に進むのは、敵タイプ「BREAKDOWN」だけである。

$C1/92DEではA$00をロードし、$C1/92E0$00[$7E:AA02](敵番号0の行動異常)に書き込みしているので、ここで行動異常が$00に変更されている。つまり行動異常から回復したことになる。
ここまで乱数などの計算もないので、敵タイプ「BREAKDOWN」のみ、必ず行動異常から回復する、という処理が入っていることがわかる。
それ以外のタイプは[$92EA]にジャンプしているので、行動異常回復処理は入っていない。

行動異常の継続・回復

行動異常状態の敵にターンが回ってきた時の処理について紹介する。
行動異常から回復するかどうかは、以下のように判定される。

$C1/90A2 LDA $7E8F02,x[$7E:AA02] ;Aに[$7E:AA02](行動異常)をロード
$C1/90A6 BEQ $1C    [$90C4]      ;ゼロフラグが立っているとき[$90C4]分岐
$C1/90A8 LDA $0005,x[$00:1B05]   ;Aに[$00:1B05](敵0の05番目データ)をロード
$C1/90AB BNE $17    [$90C4]      ;ゼロフラグが立っていないとき[$90C4]分岐
$C1/90AD LDA $7E9106,x[$7E:AC06] ;Aに[$7E:AC06]をロード
$C1/90B1 BNE $11    [$90C4]      ;ゼロフラグが立っていないとき[$90C4]分岐
$C1/90B3 JSR $6150  [$C1:6150]   ;[$C1:6150]へ
;
$C1/6150 PHX                     ;戦闘乱数計算
$C1/6151 PHB                     ;↓
$C1/6152 LDA #$00                ;↓
$C1/6154 PHA                     ;↓
$C1/6155 PLB                     ;↓
$C1/6156 LDA $38    [$00:0338]   ;↓
$C1/6158 ORA $39    [$00:0339]   ;↓
$C1/615A ORA $3A    [$00:033A]   ;↓
$C1/615C ORA $3B    [$00:033B]   ;↓
$C1/615E BNE $24    [$6184]      ;↓
$C1/6184 LDX $38    [$00:0338]   ;↓
$C1/6186 STX $4204  [$00:4204]   ;↓
$C1/6189 LDA #$0D                ;↓
$C1/618B STA $4206  [$00:4206]   ;↓
$C1/618E JSR $46C8  [$C1:46C8]   ;↓
;
$C1/46C8 NOP                     ;↓
$C1/46C9 RTS                     ;↓
;
$C1/6191 LDA $39    [$00:0339]   ;↓
$C1/6193 STA $38    [$00:0338]   ;↓
$C1/6195 LDA $3A    [$00:033A]   ;↓
$C1/6197 STA $39    [$00:0339]   ;↓
$C1/6199 LDA $3B    [$00:033B]   ;↓
$C1/619B STA $3A    [$00:033A]   ;↓
$C1/619D LDA $4214  [$00:4214]   ;↓
$C1/61A0 STA $3B    [$00:033B]   ;↓
$C1/61A2 PLB                     ;↓
$C1/61A3 PLX                     ;↓
$C1/61A4 RTS                     ;乱数がAと[$00:033B]に入る
;
$C1/90B6 AND #$7F                ;A(乱数)と$7Fで論理積
$C1/90B8 CMP $7E9000,x[$7E:AB00] ;Aと[$7E:AB00](LV現在値)で減算比較
$C1/90BC BCS $06    [$90C4]      ;キャリーフラグが立っているとき[$90C4]分岐
;
;キャリーフラグが立っていない時処理
$C1/90BE LDA #$00                ;Aに$00をロード
$C1/90C0 STA $7E8F02,x[$7E:AA02] ;Aを[$7E:AA02]に書き込み(行動異常解除)

$C1/90C4 RTS                     ;キャリーフラグON(引き算結果が正)で行動異常継続

行動異常の継続・回復判定は、戦闘乱数($00$FF)を1回生成して行う。
乱数生成処理の説明は省く。
生成された乱数は、$C1/90B6$7F(10進数127)と論理積を取っている。
乱数を128で割った余りを算出しているのと同じで、乱数が$00$7Fならそのまま、$80$FF$00$7Fになる。
結局のところ、乱数が$00$7Fに変更されたのと同じである。

$C1/90B8では、$00$7Fの乱数から、敵番号0の現在のレベル[$7E:AB00]を減算することで比較している。
計算してキャリーフラグが立った時、つまり減算結果が0か正の値の時は、行動異常は継続。
キャリーフラグが立たなかった時、つまり減算結果が負の値の時は、$C1/90BE$C1/90C0の処理で、[$7E:AA02](行動異常)に$00を書き込み、行動異常を解除している。

以上から、敵の現在レベルが高いほど、行動異常は解除されやすい。
例えばレベル5の敵なら、乱数が5~127だと行動異常継続、0~4なら行動異常解除である。行動異常解除の確率は5/128(約4%)である。
レベル30の敵なら、乱数が30~127だと行動異常継続、0~29なら行動異常解除である。行動異常解除の確率は30/128(約23.4%)である。

次ページでは、特定の属性の技で発生するカウンター行動異常について説明する。



このページをシェアする

上へ