基礎知識
戦闘関係
前ページの続き。
前ページでは技自体に設定されている行動異常の説明を行ったが、特定の属性の技で発生するカウンター行動異常について説明する。
技自体に行動異常の効果がない、つまり技データ22に行動異常の値が入っていない場合でも、敵に特定の属性の技を当てることで行動異常が発生することがある。
世界の合言葉は森部様の敵データでは「カウンター行動異常」として掲載されているが、すべての敵には、各属性に対しどの行動異常が発生するかが設定されている。
敵データでいうと、敵データ16~敵データ23が該当する。
各属性で行動異常8種類分のデータが必要なので、1バイト分の上8ビットと下8ビットに2種の属性、合計で8バイトの容量を使っている。
| 敵データ | 内容(上8ビット/下8ビット) |
|---|---|
| 16 | カウンター行動異常 手/足属性 |
| 17 | カウンター行動異常 突/鋭属性 |
| 18 | カウンター行動異常 鈍/締属性 |
| 19 | カウンター行動異常 飛/背属性 |
| 20 | カウンター行動異常 火/水属性 |
| 21 | カウンター行動異常 風/土属性 |
| 22 | カウンター行動異常 精/善属性 |
| 23 | カウンター行動異常 悪/無属性 |
カウンター行動異常は、味方キャラが敵に何かしらの技を当てた時、技の属性から該当のカウンター行動異常の敵データ番号を取り出し、該当の属性のカウンター行動異常に0以外の値が入っていたら行動異常の値がつく、という形で行われる。
処理は以下の通り。
$C1/D570 LDA $D50016,x ;Aに[$D50016,x](技データ22)をロード $C1/D574 STA $7E900A[$7E:900A] ;Aを[$7E:900A]に書き込み $C1/D578 LDA $D5000D,x ;Aに[$D5000D,x](技データ13)をロード $C1/D57C STA $7E9009[$7E:9009] ;Aを[$7E:9009]に書き込み
行動異常発生処理では、$C1/D570で行動異常の値が格納されている技データ22をロードし、[$7E:900A]に格納していたが、実はこの直後に技データ13をロードして[$7E:9009]に格納している。
技データ13の下1桁が、カウンター行動異常判定に必要となる、技の属性の値である。
| 属性 | 数値 |
|---|---|
| 手 | $0 |
| 足 | $1 |
| 突 | $2 |
| 鋭 | $3 |
| 鈍 | $4 |
| 締 | $5 |
| 飛 | $6 |
| 背 | $7 |
| 火 | $8 |
| 水 | $9 |
| 風 | $A |
| 土 | $B |
| 精 | $C |
| 善 | $D |
| 悪 | $E |
| 無 | $F |
ちなみに技データ13の上1桁は、技のタイプ関係の値が入っている。カウンター行動異常には関係ないが一応紹介しておく。
| 技データ13 上1桁 | 内容 |
|---|---|
| $0 | 通常 |
| $2 | 範囲が周囲 |
| $4 | 反撃専用 |
| $8 | 回復 |
周囲かつ回復技だと$2 + $8で$Aが入ることになる。
以下、処理の続き。
$C1/D9DA LDA $7E9009[$7E:9009] ;Aに[$7E:9009](技データ13)をロード $C1/D9DE BIT #$0F ;Aと$0Fで論理積(ステータスフラグのみ変更) $C1/D9E0 JSR $D9F8 [$C1:D9F8] ;[$C1:D9F8]へジャンプ ; $C1/D9F8 STA $12 [$00:0312] ;A(技データ13)を[$00:0312]に書き込み $C1/D9FA LSR A ;Aを論理右シフト(/2) $C1/D9FB STA $13 [$00:0313] ;A(「技データ13」/2)を[$00:0313]に書き込み $C1/D9FD LDA $7E900B,x ;Aに[$7E900B,x](初期値$00)をロード $C1/DA01 BPL $07 [$DA0A] ;ネガティブフラグが立っていないとき[$DA0A]分岐 $C1/DA0A LDA $13 [$00:0313] ;Aに[$00:0313](「技データ13」/2)をロード $C1/DA0C REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/DA0E AND #$0007 ;Aと$0007で論理積 $C1/DA11 ADC $0002,x ;A + [$0002,x] $C1/DA14 TAY ;Aレジスタの値をYレジスタに転送 $C1/DA15 SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/DA17 LDA $0030,y ;Aに[$0030,y](敵データXX カウンター行動異常)をロード
技データ13(下1桁に技の属性)は、[$7E:9009]→[$00:0312]と読み込まれている。
$C1/D9F8以降は、技を当てられた敵の、該当属性のカウンター行動異常のアドレス計算である。
$C1/D9FA~で、技データ13を論理右シフト(÷2)し、[$00:0313]に書き込んでいるが、敵のカウンター行動異常は1つのアドレスに2つ分の属性が記録されているため、アドレス計算用に2で割っている。小数点以下切り捨てなので、trunc(技データ13 / 2)である。
| 属性 | 数値 | 数値/2 |
|---|---|---|
| 手 | $0 | $0 |
| 足 | $1 | $0 |
| 突 | $2 | $1 |
| 鋭 | $3 | $1 |
| 鈍 | $4 | $2 |
| 締 | $5 | $2 |
| 飛 | $6 | $3 |
| 背 | $7 | $3 |
| 火 | $8 | $4 |
| 水 | $9 | $4 |
| 風 | $A | $5 |
| 土 | $B | $5 |
| 精 | $C | $6 |
| 善 | $D | $6 |
| 悪 | $E | $7 |
| 無 | $F | $7 |
例えば手と足属性のカウンター行動異常は、同じアドレス(敵データ16)に入っているから、trunc(技データ13 / 2)で同値が計算されている。
trunc(技データ13 / 2)により、技データ13の上1桁が何の値であれ、下1桁は上のように$0~$7のいずれかになるはずだ。
$C1/DA0Eでは16bitモードで$0007と論理積を取っているから、技データ13の上1桁がカットされて、$0000~$0007と、技の属性/2のみの値になる。
$C1/DA11で、この値と[$0002,x]を加算しYレジスタに送り、更に$C1/DA17で[$0030,y]を呼び出しているが、これが敵データ16~敵データ23のいずれか、カウンター行動異常の値である。先に算出した$0000~$0007で、属性によりどのデータを呼び出すかが決まる。
$C1/DA1A LSR $12 [$00:0312] ;[$00:0312](技データ13)を論理右シフト(/2) $C1/DA1C BCS $04 [$DA22] ;キャリーフラグが立っているとき[$DA22]分岐 $C1/DA1E LSR A ;Aを論理右シフト(/2) $C1/DA1F LSR A ;Aを論理右シフト(/2) $C1/DA20 LSR A ;Aを論理右シフト(/2) $C1/DA21 LSR A ;Aを論理右シフト(/2) $C1/DA22 AND #$0F ;Aと$0Fで論理積 $C1/DA24 RTS ;サブルーチン戻り
$C1/DA1Aで、技データ13が入っている[$00:0312]を論理右シフトで÷2している。
論理右シフトの際、割り算なので余りが出ることがあるが(2進法で見た時、一番下の位が1だと余りが出る)、この余りはキャリーフラグとして記録される。つまり、余りが出るとキャリーフラグが立つ。
| 属性 | 数値 | 数値/2 | Cフラグ |
|---|---|---|---|
| 手 | $0 | $0 | OFF |
| 足 | $1 | $0 | ON |
| 突 | $2 | $1 | OFF |
| 鋭 | $3 | $1 | ON |
| 鈍 | $4 | $2 | OFF |
| 締 | $5 | $2 | ON |
| 飛 | $6 | $3 | OFF |
| 背 | $7 | $3 | ON |
| 火 | $8 | $4 | OFF |
| 水 | $9 | $4 | ON |
| 風 | $A | $5 | OFF |
| 土 | $B | $5 | ON |
| 精 | $C | $6 | OFF |
| 善 | $D | $6 | ON |
| 悪 | $E | $7 | OFF |
| 無 | $F | $7 | ON |
カウンター行動異常の値は上1桁と下1桁で別の属性の値が記されているが、2で割った時に余りが1、つまりキャリーフラグが立つ時は、カウンター行動異常の値下1桁に該当属性が入っているということになる。
逆に、キャリーフラグが立たない場合は、カウンター行動異常の値上1桁に該当属性が入っている。
という判断をするための、キャリーフラグでの分岐である。
キャリーフラグが立たない場合は、カウンター行動異常の値から上1桁を取り出さなければならないので、$C1/DA1E~$C1/DA21で論理右シフトを4回繰り返し、上の桁を下の桁に移動させているのである。キャリーフラグが立つ場合はこの処理は必要がないので、[$DA22]にジャンプしている。
最終的に$C1/DA24にて、$0Fと論理積を取ったことで、実際のカウンター行動異常の値が算出できたことになる。
$C1/D9E3 AND #$0F ;Aと$0Fで論理積 $C1/D9E5 BNE $08 [$D9EF] ;ゼロフラグが立っていないとき[$D9EF]分岐 $C1/D9EF ORA #$80 ;Aと$80で論理和 $C1/D9F1 AND #$8F ;Aと$8Fで論理積 $C1/D9F3 STA $7E9008,x ;Aを[$7E9008,x]に書き込み(下1桁が行動異常) $C1/D9F7 RTS ;サブルーチン戻り ; $C1/CC29 PLX ;Xにスタックから値をプル $C1/CC2A PLY ;Yにスタックから値をプル $C1/CC2B STY $10 [$00:0310] ;Yを[$00:0310]に書き込み $C1/CC2D LDA $7E9008,x ;Aに[$7E9008,x](下1桁が行動異常)をロード $C1/CC31 BPL $0F [$CC42] ;ネガティブフラグが立っていないとき[$CC42]分岐 $C1/CC33 AND #$0F ;Aと$0Fで論理積 $C1/CC35 CMP $7E8F02,x ;Aと[$7E8F02,x](敵の行動異常)を比較(ステータスフラグのみ変更) $C1/CC39 BEQ $07 [$CC42] ;ゼロフラグが立っているとき[$CC42]分岐 $C1/CC3B STA $7E8F02,x ;Aを[$7E8F02,x](敵の行動異常)に書き込み $C1/CC3F JSR $1C8E [$C1:1C8E] ;[$C1:1C8E]へジャンプ
$C1/DA24までで実際のカウンター行動異常の値が計算できたのだが、実際にはその後に$80と論理和、$8Fと論理積を[$7E9008,x]に入れ、更にそれを$C1/CC33で$0Fと論理積を取ってカウンター行動異常の値に戻す、という作業を行っている。
何かしらの判定のための計算になるだろうが、とりあえず、$C1/CC35でようやく、敵の行動異常の値[$7E8F02,x]と減算比較している。
ゼロフラグが立つのは、現在の敵の行動異常の値と、カウンター行動異常の値が同一の時であるから、それ以外だとカウンター行動異常の値で上書きされる。
これでカウンター行動異常が発生である。
行動異常が発生していなくても、または既に何らかの行動異常が発生していた場合でも、カウンター行動異常で上書きされていることがわかる。
また、乱数などの計算もないので、カウンター行動異常は必ず発生することもわかる。
この後は、先に紹介した行動異常データの呼び出し及び該当の行動異常の処理が行われることになる。
なお、技により発生する行動異常と、カウンター行動異常が同時に発生する状況下では、技により発生する行動異常が優先のようである。
例えばアキラの「マザーイメージ」は技自体に行動異常$9の効果がついているが、精属性の技でもあるので、敵が精属性に対しカウンター行動異常を持っている場合、「マザーイメージ」を当てると、「マザーイメージ」の行動異常$9の効果が優先してつくようになっている。
次ページでは、装備品による戦闘開始時の行動異常について説明する。