TOP > プログラミング関係解説&調査 > 回避属性

回避属性

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

回避属性については、ZsnsK's F**kin' Site様の説明が詳しい。
本攻略の戦闘関係の解説 > 回避属性も参照のこと。仕様がややわかりにくいので例も載せている。

まとめると、

  • 敵味方すべてのキャラクターに「回避属性」という隠しパラメータが設定されている。
    キャラクターが素で所持している他、味方キャラは一部装備品を装備することで回避属性が追加される。
  • 戦闘中は使用した技の属性が「場の属性」として記録される。
  • 場の属性と所持回避属性が一致しているキャラは、戦闘中、次に受ける技のダメージが、
    実際のダメージ量 = trunc(総ダメージ量 / 2) + 1
    で計算される。
  • ただし、敵が攻撃される場合のみ、「M・ボンバー」と「デーモンズダンス」以外の手属性技は回避属性の効果が適用されない。
    また、「ラブヒーリング」でHP回復後に使用者が受けるダメージ量は回避属性の効果が適用される。

最後の「敵が攻撃される場合のみ」の部分だけ、筆者が検証した結果追加した。
味方が攻撃される時は、無属性以外の全属性で、回避属性の効果が適用される。
だが、敵が攻撃される時(味方が敵を攻撃する時)は手属性技関係の条件が追加されるのである。

「ラブヒーリング」については特殊タイプの技処理を参照。

アドレス

回避属性関係のアドレスは以下の通り。

味方キャラの回避属性

シナリオ別キャラデータの$21$22にキャラクター自身の素の回避属性(2バイト)、$32$33に装備の合計の回避属性(2バイト)が入る。
下位バイトは手・足・突・鋭・鈍・締・飛・背、上位バイトは火・水・風・土・精・善・悪・無が1ビットずつ対応している。

例えばサンダウンのシナリオ別キャラデータは$00:0E00からだが、$00:0E21$00:0E22にサンダウン自身の素の回避属性、$00:0E32$00:0E33に装備の合計の回避属性が入る。
サンダウンは素で飛・背属性の回避属性を所持しているので、$00:0E21$00:0E22$0003が入る(%0000 0000 0000 0011)。
右装備が「ピースメーカー」(回避属性なし)、体装備が「げんじのよろい」(回避属性は飛,水)だと、$00:0E32$00:0E33$4002が入る(%0100 0000 0000 0010)。
$00:0E21$00:0E22と、$00:0E32$00:0E33の論理和を取ると、サンダウンの現在の回避属性の状態となる。

敵キャラの回避属性

敵データ30~31が回避属性(2バイト)で、戦闘中は敵種類1~4の+$3E$3Fに入る。

敵種類回避属性
1$00:1A3E$00:1A3F
2$00:1A7E$00:1A7F
3$00:1ABE$00:1ABF
4$00:1AFE$00:1AFF

サブルーチン(味方が回避属性で半減)

まず、味方キャラが回避属性でダメージを半減する場合について。
ここでは、素で飛属性の回避属性を所持しているサンダウンが、「シングルショット」を使用し場の属性が飛属性になった状態で、敵から攻撃を食らった時の処理を説明する。

$C1/D1D5 LDA $7E901D[$7E:901D]   ;Aに[$7E:901D](技データ13)をロード
$C1/D1D9 INC A                   ;Aをインクリメント +1
$C1/D1DA AND #$0F                ;Aと$0Fで論理積
$C1/D1DC STA $14    [$00:0314]   ;Aを[$00:0314]に書き込み
$C1/D1DE JSR $E061  [$C1:E061]   ;[$C1:E061]へジャンプ

技使用時(ここでは敵がサンダウンを攻撃する時の技)、$7E:9010$7E:9028に技データをコピーするサブルーチンが$C1:7852$C1:786Bにあたるが、ひとつ前に使った技(ここではサンダウンの「シングルショット」)の属性が何かを別に記録しておかないと、回避属性の判定ができない。
このため、まずは$C1:7852$C1:786Bの前に、上のサブルーチンでひとつ前に使った技の属性を[$00:0314]に残している。
[$7E:901D]に書き込まれているのは技データ13にあたるが、下4ビットに技の属性が入っている。
上処理だと、まず[$7E:901D]+1してから$0Fで論理積を取っている。
下4ビットに入っている属性の値は$0$Fになるが、+1すると無属性にあたる$Fは繰り上がって下1桁が0になる。
よって、無属性以外の属性は+1した値($01$0F)、無属性なら$00[$00:0314]に書き込まれることになる。

サンダウンの「シングルショット」は飛属性で、技データ13は$06になるが、+1されて$07[$00:0314]に書き込まれる。

;サンダウンのシナリオ別キャラデータロード用、Y:0E00
$C1/D253 LDA $14    [$00:0314]   ;Aに[$00:0314](属性+1)をロード
$C1/D255 BEQ $1D    [$D274]      ;ゼロフラグが立っているとき[$D274]分岐
;ゼロフラグOFF(無属性以外)
$C1/D257 STA $08    [$00:0308]   ;A(ひとつ前の技属性+1)を[$00:0308]に書き込み
$C1/D259 LDY $0002,x             ;Yに[$00:1C02+40x]をロード
$C1/D25C REP #$21                ;Aを16bit幅に変更、キャリーフラグクリア
$C1/D25E LDA $0021,y[$00:0E21]   ;Aに[$00:0E22][$00:0E21](サンダウンの回避属性)をロード
$C1/D261 ORA $0032,y[$00:0E32]   ;Aと[$00:0E33][$00:0E32](装備の回避属性)で論理和
$C1/D264 XBA                     ;Aレジスタの上位バイトと下位バイトを交換
;Aにサンダウンの回避属性が入る
;(交換したので上位バイトが手足突鋭鈍締飛背、下位バイトは火水風土精善悪無)
;
;回避属性判定ループここから
$C1/D265 ASL A                   ;A(サンダウンの回避属性)を算術左シフト *2
$C1/D266 DEC $08    [$00:0308]   ;[$00:0309][$00:0308](ひとつ前の技属性+1)をデクリメント -1
$C1/D268 BNE $FB    [$D265]      ;ゼロフラグが立っていないとき[$D265]分岐
;回避属性判定ループここまで

$C1/D255で、[$00:0314]がゼロかどうかで分岐させている。
ひとつ前に使った技の属性が無属性の時のみ$00[$00:0314]に入っているから、無属性以外は$C1/D257に進む。
この先が回避属性判定になり、無属性技では回避属性判定自体がスキップされることがわかる。

$C1/D257で、[$00:0314][$00:0308]にコピーする。
$C1/D25Eは技をくらった味方キャラのシナリオ別キャラデータの$21$22をロードしており、キャラクター自身の素の回避属性(2バイト)にあたる。
$C1/D261で、この値と、シナリオ別キャラデータの$32$33、装備の合計の回避属性(2バイト)とで論理和を取る。
ここで、味方キャラの素の回避属性と装備の回避属性両方を加算した、戦闘中における実際の回避属性がAに入ったことになる。
論理和を取ったので、キャラ自身の回避属性と装備の回避属性に被りがあったとしても、そのまま維持される。
「回避属性を所持しているかどうか」しか記録されていないので、キャラ自身の回避属性と装備の回避属性が被ったから効果が倍になる、といったようなことは起こらない。

$C1/D264で、Aの上位バイトと下位バイトを交換している。
サンダウンの素の回避属性、つまり[$00:0E22][$00:0E21]$0003だから、装備で回避属性が追加されていない場合、$0300となる。
$0300 = %0000 0011 0000 0000
である。
上位バイトが手・足・突・鋭・鈍・締・飛・背、下位バイトは火・水・風・土・精・善・悪・無の順で回避属性が1ビットずつ記録された状態、ということである。

$C1/D265$C1/D268は回避属性判定用のループ処理。
キャラの回避属性の値2バイトを算術左シフト(*2)し、[$00:0309][$00:0308](ひとつ前の技属性+1)を-1してゼロフラグが立つかどうか判定、ゼロフラグが立たないなら$C1/D265に戻っている。
[$00:0309]にはこの少し前の処理($C1/E0A9)で$00を入れる処理をしているため、[$00:0309][$00:0308]には実質、ひとつ前の技属性+1$01$0F)が入った状態である。
飛属性なら$0007が入っているから、ループ7回目で0まで減ることになる。
では、ループ7回目でAはどうなっているか
$0300 = %0000 0011 0000 0000を7回算術左シフトするから、左に1ビットずつずれて、7回目では、

%1100 0000 0000 0000

この値を算術左シフトする。一番上の桁が1なので、算術左シフトするとキャリーオーバー、桁溢れとなる。
つまり、ループが終わった時、キャリーフラグが立つ。
ひとつ前の技の属性と回避属性が一致した時だけ、ループ処理終了時にキャリーフラグが立つことになる。
ループ後の処理が以下の通り。

$C1/D26A SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/D26C BCC $04    [$D272]      ;キャリーフラグが立っていないとき[$D272]分岐
;キャリーフラグON (ひとつ前の技の属性と回避属性が一致)
$C1/D26E LDA #$FF                ;Aに$FFをロード
$C1/D270 BRA $02    [$D274]      ;フラグにかかわりなく常に分岐[$D274]
;キャリーフラグOFF (ひとつ前の技の属性と回避属性が一致しない)
$C1/D272 LDA #$00                ;Aに$00をロード
$C1/D274 STA $7ECE35,x           ;Aを[$7ECE35,x]に書き込み

$C1/D26Cがキャリーフラグでの分岐になる。
この後の処理の通り、ひとつ前の技の属性と回避属性が一致した時、[$7ECE35,x]$FFを書き込み、一致しないなら[$7ECE35,x]$00を書き込む。
仲間キャラ1~4人目に対応したアドレス$7ECE35,xは以下の通り。

仲間キャラ回避属性判定アドレス
1$7E:EA35
2$7E:EA75
3$7E:EAB5
4$7E:EAF5

ここで、回避属性による半減が起こるかどうかが決まった、ということである。

実際のダメージ量計算についてのサブルーチンは省く。
[$00:2135][$00:2134]の2バイトに総ダメージ量が入っている状態の、$C1/CD9F~の処理が以下。

$C1/CD9F REP #$20                ;Aを16bit幅に変更、Mフラグをクリア
$C1/CDA1 LDA $2134  [$00:2134]   ;Aに[$00:2135][$00:2134](総ダメージ量)をロード
$C1/CDA4 SEC                     ;キャリーフラグON
$C1/CDA5 SBC $20    [$00:0320]   ;A(総ダメージ量) - [$00:0321][$00:0320](防御合計値)
$C1/CDA7 BCS $03    [$CDAC]      ;キャリーフラグが立っているとき[$CDAC]分岐
$C1/CDAC STA $20    [$00:0320]   ;A(総ダメージ量)を[$00:0321][$00:0320]に書き込み
$C1/CDAE LDA $7ECE35,x           ;Aに[$7ECE35,x+1][$7ECE35,x]をロード
$C1/CDB2 AND #$00FF              ;Aと$00FFで論理積
$C1/CDB5 BEQ $04    [$CDBB]      ;ゼロフラグが立っているとき[$CDBB]分岐
;ゼロフラグOFF(回避属性あり)
$C1/CDB7 LSR $20    [$00:0320]   ;[$00:0321][$00:0320](総ダメージ量)を論理右シフト (/2)
$C1/CDB9 INC $20    [$00:0320]   ;[$00:0321][$00:0320](総ダメージ量)をインクリメント +1
;ゼロフラグON(回避属性なし)
$C1/CDBB LDA $20    [$00:0320]   ;Aに[$00:0321][$00:0320](総ダメージ量)をロード
$C1/CDBD CLC                     ;キャリーフラグクリア
$C1/CDBE ADC $22    [$00:0322]   ;A(総ダメージ量) + [$00:0323][$00:0322]($0000)
$C1/CDC0 CMP #$03E7              ;Aと$03E7を減算比較(ステータスレジスタ変更のみ)
$C1/CDC3 BCC $03    [$CDC8]      ;キャリーフラグが立っていないとき[$CDC8]分岐
;キャリーフラグON
$C1/CDC5 LDA #$03E7              ;Aに$03E7をロード
;キャリーフラグOFF
$C1/CDC8 STA $7ECE2E,x           ;Aを[$7ECE2E,x+1][$7ECE2E,x]に書き込み

$C1/CDAE[$7ECE35,x+1][$7ECE35,x]をロードし、$C1/CDB2$00FFと論理積を取るから、実質下1バイト、[$7ECE35,x]の呼び出しである。
回避属性ありなら$FF、なしなら$00が入っているから、ゼロフラグ判定で分岐し、回避属性あり・なしで処理を分けることができる。
上では$C1/CDB5でゼロフラグ判定し、$C1/CDB7$C1/CDB9で回避属性ありの処理をする。
総ダメージ量を論理右シフト(/2)してインクリメント(+1)だから、回避属性ありだと、

実際のダメージ量 = trunc(総ダメージ量 / 2) + 1

となることがわかった。
その後はダメージ量が$03E7999)を越えていないかどうかの判定をして、被ダメージ量の値として[$7ECE2E,x+1][$7ECE2E,x]に書き込み、処理終了である。

以上の処理を見るだけだと、手属性で特別なことが起こるようには見えない。
実際、味方が手属性の回避属性を所持している時、場の属性が手属性なら、敵からの攻撃は半減できる。
味方キャラがダメージを受ける時は、手属性であっても、回避属性によるダメージ軽減はきちんと発生するのである。
手属性が特殊な扱いになるのは、「敵が回避属性で半減」の時だけである。

サブルーチン(敵が回避属性で半減)

では、敵の処理を見ていく。
味方と似た処理が大半だが、途中で変わっていく。
また、味方と同じ処理の部分でも、サブルーチンのアドレスは変わる。

$C1/E0A2 LDA $7E901D[$7E:901D]   ;Aに[$7E:901D](技データ13)をロード
$C1/E0A6 INC A                   ;Aをインクリメント +1
$C1/E0A7 AND #$0F                ;Aと$0Fで論理積
$C1/E0A9 STA $14    [$00:0314]   ;Aを[$00:0314](属性+1)に書き込み
$C1/E0AB STZ $09    [$00:0309]   ;[$00:0309]に$00を書き込み
$C1/E0AD JSR $E061  [$C1:E061]   ;[$C1:E061]へジャンプ

技データ13をロードして、[$00:0314]にひとつ前の技の属性を+1した値を書き込む。
ここは味方キャラと同じ処理だが、$C1/E0AB[$00:0309]$00を書き込む処理も一緒に行っている。
以降、敵種類1(Y:1A00)でアドレスを記す。

$C1/E0D6 LDA $14    [$00:0314]   ;Aに[$00:0314](属性+1)をロード
$C1/E0D8 BEQ $1A    [$E0F4]      ;ゼロフラグが立っているとき[$E0F4]分岐
;ゼロフラグOFF(無属性以外)
$C1/E0DA STA $08    [$00:0308]   ;A(ひとつ前の技属性+1)を[$00:0309][$00:0308]に書き込み
$C1/E0DC LDY $0002,x             ;Yに[$00:1Bx2]をロード
$C1/E0DF REP #$21                ;Aを16bit幅に変更、キャリーフラグクリア
$C1/E0E1 LDA $003E,y[$00:1A3E]   ;Aに[$00:1A3F][$00:1A3E](回避属性)をロード
$C1/E0E4 XBA                     ;Aレジスタの上位バイトと下位バイトを交換

;回避属性判定ループここから
$C1/E0E5 ASL A                   ;Aを算術左シフト *2
$C1/E0E6 DEC $08    [$00:0308]   ;[$00:0309][$00:0308]をデクリメント -1
$C1/E0E8 BNE $FB    [$E0E5]      ;ゼロフラグが立っていないとき[$E0E5]分岐
;回避属性判定ループここまで

$C1/E0EA SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/E0EC BCC $06    [$E0F4]      ;キャリーフラグが立っていないとき[$E0F4]分岐
;キャリーフラグON
$C1/E0EE LDA #$FF                ;Aに$FFをロード
$C1/E0F0 STA $7E920A,x           ;Aを[$7E:ADxA]に書き込み
$C1/E0F4 JSR $E127  [$C1:E127]   ;[$C1:E127]へジャンプ

$C1/E0E1で、敵の回避属性をロードしている。
敵種類0の回避属性2バイトは、[$00:1A3F][$00:1A3E]に入る。敵種類1以降は+$40したアドレスである。
以降の処理は味方とほぼ同じ。
ただし、回避属性が一致した時、つまり$C1/E0ECでキャリーフラグがONの時、[$7E:ADxA]xは敵番号)に$FFを書き込むが、回避属性が一致しない時に[$7E:ADxA]$00を書き込む処理がない。
だが、実は、$C1/E0D6の寸前の処理が、

$C1/E0B6 BEQ $FB    [$E0B3]      ;ゼロフラグが立っているとき[$E0B3]分岐
$C1/E0B8 BMI $6C    [$E126]      ;ネガティブフラグが立っているとき[$E126]分岐
$C1/E0BA LDA #$00                ;Aに$00をロード
$C1/E0BC STA $7E9001,x           ;Aを[$7E:ABx1]に書き込み
$C1/E0C0 STA $7E9002,x           ;Aを[$7E:ABx2]に書き込み
$C1/E0C4 STA $7E9003,x           ;Aを[$7E:ABx3]に書き込み
$C1/E0C8 STA $7E920A,x           ;Aを[$7E:ADxA]に書き込み
$C1/E0CC STA $7E900C,x           ;Aを[$7E:ABxC]に書き込み
$C1/E0D0 LDA $7E9000,x           ;Aに[$7E:ABx0](LV(現在値))をロード
$C1/E0D4 STA $10    [$00:0310]   ;Aを[$00:0310]に書き込み

このようになっており、$C1/E0C8[$7E:ADxA]に必ず$00を書き込んでいる。
よって、$C1/E0EE$C1/E0F0は、「初期値$00[$7E:ADxA]に、回避属性ありの時だけ$FFを上書き」ということになり、実質、味方キャラの時と処理は同じである。

これ以降が、味方キャラの処理と大きく変わってくる。

$C1/D1B2 LDA $7E901D[$7E:901D]   ;Aに[$7E:901D](技データ13)をロード
$C1/D1B6 STA $81    [$00:0381]   ;Aを[$00:0381]に書き込み

上で、[$7E:901D](技データ13)を[$00:0381]にも書き込む。
そこからしばらく飛んで、$C1/CC8F~の処理が重要である。

$C1/CC8F LDA $7E920A,x           ;Aに[$7E:ADxA]をロード
$C1/CC93 AND $81    [$00:0381]   ;Aと[$00:0381]で論理積
$C1/CC95 STA $7E920A,x           ;Aを[$7E:ADxA]に書き込み
$C1/CC99 JSR $CD2F  [$C1:CD2F]   ;[$C1:CD2F]へジャンプ

上で、[$7E:ADxA][$00:0381]の論理積が、新たな[$7E:ADxA]という処理がなされてしまうのである。
回避属性ありの場合、[$7E:ADxA]には$FFが入っている。
[$00:0381]には技データ13が入っているから、$FFと技データ13で論理積を取ると、実質技データ13の値しか残らない。
技データ13は、上4ビットに技のタイプ関係の値の合計値が入っており、下4ビットに属性が入っている。

上4ビット内容
$0通常
$2範囲が周囲
$4反撃専用
$8回復

下4ビット属性
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
$A
$B
$C
$D
$E
$F

手属性技は下4ビットが必ず0である。
更に、上4ビットに技のタイプの値が入るが、周囲攻撃や反撃専用、回復技でない限り0が入る。
よって、手属性技の大半は技データ13の値が$00なのである。
この場合、[$7E:ADxA][$00:0381]の論理積をとると$FF$00の論理積だから$00となり、[$7E:ADxA]$00が書き込まれる。
この後の処理を見るとわかるが、[$7E:ADxA]$00が入っていると「回避属性の効果なし」という判定になる。
これが、「敵に手属性技を当てた場合、回避属性の条件を満たしていても回避属性のダメージ軽減が起こらない」原因である。

ただし、手属性技かつ、周囲攻撃や反撃専用なら、技データ13の値は$00以外だから、敵に手属性技を当てた場合でも回避属性のダメージ軽減が起こる。
味方が敵に攻撃できる技、かつ、周囲攻撃や反撃専用の手属性技は、「M・ボンバー」「デーモンズダンス」しかない。
どちらも技データ13は$20である。
「M・ボンバー」「デーモンズダンス」だけが例外となるのは、このふたつが周囲攻撃だからなのである。

なお、手属性以外の他の属性であれば、技データ13は$01以上の値が入るので、[$7E:AD0A]に入る値は$00以外である。

$C1/CD32 REP #$20                ;Aを16bit幅に変更、Mフラグをクリア
$C1/CD34 LDA $2134  [$00:2134]   ;Aに[$00:2135][$00:2134]をロード
$C1/CD37 STA $20    [$00:0320]   ;Aを[$00:0321][$00:0320]に書き込み
$C1/CD39 LDA $7E920A,x           ;Aに[$7E:ADxB][$7E:ADxA]をロード
$C1/CD3D AND #$00FF              ;Aと$00FFで論理積
$C1/CD40 BEQ $04    [$CD46]      ;ゼロフラグが立っているとき[$CD46]分岐
;ゼロフラグOFF(回避属性あり)
$C1/CD42 LSR $20    [$00:0320]   ;[$00:0321][$00:0320]を論理右シフト (/2)
$C1/CD44 INC $20    [$00:0320]   ;[$00:0321][$00:0320]をインクリメント +1
;ゼロフラグON(回避属性なし)
$C1/CD46 LDA $20    [$00:0320]   ;Aに[$00:0321][$00:0320]をロード
$C1/CD48 CLC                     ;キャリーフラグクリア
$C1/CD49 ADC $22    [$00:0322]   ;A + [$00:0323][$00:0322]
$C1/CD4B CMP #$03E7              ;Aと$03E7を減算比較(ステータスレジスタ変更のみ)
$C1/CD4E BCC $03    [$CD53]      ;キャリーフラグが立っていないとき[$CD53]分岐
;キャリーフラグON
$C1/CD50 LDA #$03E7              ;Aに$03E7をロード
;キャリーフラグOFF
$C1/CD53 STA $7E9200,x[$7E:AD00] ;Aを[$7E9200,x+1][$7E9200,x]に書き込み

最後のダメージ計算は味方キャラの処理とほぼ同じである。
回避属性判定は[$7E:ADxA]に入る値が0かどうかであるから、手属性技かつ周囲攻撃・反撃専用でない場合だけ、回避属性が一致しても回避属性半減が行われない。

以上が味方・敵それぞれの回避属性判定である。
敵が攻撃される時だけ意図的に手属性関係の別処理を入れている理由は不明だが、味方側、つまりプレイヤー側に有利な処理となっている。
敵が手属性の回避属性を所持していても、実質無視できてしまうのと同じだからである。
ただし、手属性の回避属性を所持している敵はごく少ないし(そもそも回避属性持ちの敵自体が少ない)、役立ちそうなのは、現代編のグレートエイジャ戦で、エイジャが手属性の回避属性を所持しているが、「M・ボンバー」以外の手属性技はダメージ軽減されずダメージを与えられることくらいだろうか。
他は、比較的幕末編の敵に手属性の回避属性持ちがいるが、幕末編の味方キャラの手属性技は「忍法コマまわし」のみで、どちらかといえば追加効果を期待する「忍法コマまわし」は威力を重視するものではないし、おぼろ丸なら他に強力な攻撃技を多数使えるので、あまり旨味はない。

ということで、手属性関係の処理のおかげでプレイヤーが助かるのは、現代編のグレートエイジャ戦くらいなのでは……という気がしなくもない。
(筆者にはわからないだけで他に役立つポイントもあるかもしれない)

戦闘開始直後の場の属性

戦闘で何かしらの技を使えば、[$7E:901D]に技データ13が入って技の属性を記録していけるのだが、戦闘開始直後はどうなるのか。

まず、[$7E:901D]だが、このメモリは戦闘中だけでなくフィールドでも読み書きされる値で、マップ切り替え毎に書き込まれる数値が異なる。
マップ切り替え時、$7E:8???$7E:9???あたりのメモリに値が書き込まれる。
例えば近未来編のワールドマップに移動した時は、$7E:901Dに入る値の処理は以下のようになっている。
下はループ処理の一部でもある($CE/D4B2$CE/D4BD)。

$CE/D4B2 LDA [$60],y[$CA:3791]   ;A:6E0B Aに[$CA:3791]をロード
$CE/D4B4 STA $0000,x[$7E:901D]   ;A:6E01 Aを[$7E:901D]に書き込み
$CE/D4B7 INX                     ;A:6E01 Xをインクリメント +1
$CE/D4B8 INX                     ;A:6E01 Xをインクリメント +1
$CE/D4B9 INY                     ;A:6E01 Yをインクリメント +1
$CE/D4BA INY                     ;A:6E01 Yをインクリメント +1
$CE/D4BB DEC $66    [$00:0066]   ;A:6E01 [$00:0066]をデクリメント -1
$CE/D4BD BNE $F3    [$D4B2]      ;A:6E01 ゼロフラグが立っていないとき[$D4B2]分岐

$CA:3791に入っている値は$01であり、戦闘開始時にこの値がそのまま場の属性となって[$7E:901D]から読み出される。
つまり、近未来編のワールドマップにおける戦闘開始直後の場の属性は$01、足属性である。
実際、戦闘開始直後に適当な技を使ってみると、

$C1/E0A2 LDA $7E901D[$7E:901D]    ;A:1C00 Aに[$7E:901D]をロード
$C1/E0A6 INC A                    ;A:1C01 Aをインクリメント +1
$C1/E0A7 AND #$0F                 ;A:1C02 Aと$0Fで論理積
$C1/E0A9 STA $14    [$00:0314]    ;A:1C02 Aを[$00:0314]に書き込み
$C1/E0AB STZ $09    [$00:0309]    ;A:1C02 [$00:0309]に$00を書き込み
$C1/E0AD JSR $E061  [$C1:E061]    ;A:1C02 [$C1:E061]へジャンプ

[$7E:901D]には戦闘開始直後なのに$01が入っていて、場の属性が足属性の扱いになっていることがわかる。

マップ毎に決まった値がそのまま戦闘開始直後の場の属性扱いになることもあるのだが、そうではない場合の方が大半のようである。
例えば最終編の勇者の山だと、マップ切り替え時の[$7E:901D]の値は以下のようになる。

$CE/D4B2 LDA [$60],y[$C7:461E]   ;A:0CA0 Aに[$C7:461E]をロード
$CE/D4B4 STA $0000,x[$7E:901D]   ;A:02FC Aを[$7E:901D]に書き込み
$CE/D4B7 INX                     ;A:02FC Xをインクリメント +1
$CE/D4B8 INX                     ;A:02FC Xをインクリメント +1
$CE/D4B9 INY                     ;A:02FC Yをインクリメント +1
$CE/D4BA INY                     ;A:02FC Yをインクリメント +1
$CE/D4BB DEC $66    [$00:0066]   ;A:02FC [$00:0066]をデクリメント -1
$CE/D4BD BNE $F3    [$D4B2]      ;A:02FC ゼロフラグが立っていないとき[$D4B2]分岐

[$7E:901D]$FCが書き込まれる。
この時、下1桁の$C、精属性が戦闘開始直後の場の属性になるかというとそうではない。
戦闘開始すると別途[$7E:901D]に値が書き込まれるのである。

$C1/6BF5 LDA #$00                ;A:7007 Aに$00をロード
$C1/6BF7 STA $10    [$00:0310]   ;A:7000 Aを[$00:0310]に書き込み
;(中略)
$C1/6BF9 LDA $10    [$00:0310]   ;A:700D Aに[$00:0310]をロード
$C1/6BFB STA $7E2000,x[$7E:900D] ;A:7000 Aを[$7E:900D]に書き込み
;(中略)
$C1/6D82 LDA $7E1FF0,x[$7E:900D] ;A:701D Aに[$7E:900D]をロード
$C1/6D86 EOR #$FF                ;A:7000 Aと$FFで排他的論理和XOR
$C1/6D88 STA $7E2000,x[$7E:901D] ;A:70FF Aを[$7E:901D]に書き込み
;(中略)
$C1/E0A2 LDA $7E901D[$7E:901D]   ;A:1B00 Aに[$7E:901D]をロード
$C1/E0A6 INC A                   ;A:1BFF Aをインクリメント +1
$C1/E0A7 AND #$0F                ;A:1B00 Aと$0Fで論理積
$C1/E0A9 STA $14    [$00:0314]   ;A:1B00 Aを[$00:0314]に書き込み
$C1/E0AB STZ $09    [$00:0309]   ;A:1B00 [$00:0309]に$00を書き込み
$C1/E0AD JSR $E061  [$C1:E061]   ;A:1B00 [$C1:E061]へジャンプ

$C1/6BF5Aにロードされた$00[$7E:900D]に書き込まれ、$C1/6D86[$7E:900D]$FFで排他的論理和を取った$FF[$7E:901D]に書き込まれる。
下1桁が$F、つまり無属性という扱いである。
マップにより上のように無属性扱いの処理がされたりされなかったりと決まっているが、そのあたりの判定までは未調査。



このページをシェアする

上へ