基礎知識
戦闘関係
前ページの続き。
ここでは、武器の追加効果として発生する状態異常について説明する。
世界の合言葉は森部様によれば、状態異常の発生条件は以下の通りである。
・武器固有状態異常発生条件:
技が武器影響ありで、技自体に状態異常がない時?
・武器固有状態異常発生率:
((0~15)>敵LV)のとき状態異常(異常時間は自LV*8)
まず、武器の追加効果についてだが、アイテムデータの15番目に状態異常追加効果の値が入っている。
といっても、値が入っているのは以下の2種類のみで、他のアイテムには$00が入っている。
| アイテム名 | アイテムデータ15 | 状態異常 |
|---|---|---|
| ヨシユキ | $10 | マヒ |
| ムラサメ | $20 | 眠り |
値は8ビットが上から石化・酔い・眠り・マヒ・毒・腕かため・足かため・首かために対応しているので、「ヨシユキ」(%0001 0000)はマヒ、「ムラサメ」(%0010 0000)は眠りである。
「ヨシユキ」はとらわれの男と最終編のおぼろ丸、「ムラサメ」は最終編のおぼろ丸しか装備できない。
幕末編なら実質とらわれの男専用能力で、最終編なら実質おぼろ丸専用能力のようなものである。
また、シナリオ別キャラデータ$02には、右装備のアイテムデータ15の値、つまり追加効果の値が入るようになっている。この値は戦闘開始時に更新されるようになっており、装備変更だけでは変わらないようである。
おぼろ丸のシナリオ別キャラデータ$02のアドレスは$00:0EC2で、とらわれの男だと幕末編の$00:0F02である。
つまり、幕末編において、とらわれの男がパーティに居る時、$00:0F02には常に「ヨシユキ」の追加効果の値$10が入ったままになっている。
状態異常発生率の計算から、武器による状態異常は、敵のレベルが一定値以下でなければ全く効果がない、ということがわかる。
ただし敵のレベルは、バフ・デバフなどの値が反映された現在値なので、レベルが高い相手でも、デバフによりレベルダウンできるのであれば、武器による状態異常を発生させることは可能となっている。
更に発生条件は、使用技が「攻撃力依存」あり、かつ状態異常を発生させない時、のようである。
該当する技は、とらわれの男の「北辰一刀流」、おぼろ丸の「忍び斬り」「十文字斬り」「忍法矢車草」ということになる。
攻撃力依存ありの「影一文字」は石化の状態異常を発生させるので、武器の追加効果は発動しない。
以上より、シナリオ別キャラデータ$02の値、技データ15(下1ビットが攻撃力依存のON・OFF)及び、技データ08(発生させる状態異常)か技データ18(状態異常関連値)が判定に使われるはずである。
技で発生する状態異常と異なるのは、使用者のレベルから状態異常継続時間が計算される点である。
戦闘中の味方キャラ4人分のデータは、順に$00:1C00~、$00:1C40~、$00:1C80~、$00:1CC0~に入るが、各アドレスに+$38すると「レベル(現在値)」である。
敵キャラデータは引き続き以下のアドレスの値を使う。
| アドレス | 数値 |
|---|---|
$7E:AA07 | 状態異常 |
$7E:AA08 | 首かため 状態異常継続時間 |
$7E:AA09 | 足かため 状態異常継続時間 |
$7E:AA0A | 腕かため 状態異常継続時間 |
$7E:AA0B | 毒 状態異常継続時間 |
$7E:AA0C | マヒ 状態異常継続時間 |
$7E:AA0D | 眠り 状態異常継続時間 |
$7E:AA0E | 酔い 状態異常継続時間 |
$7E:AB00 | レベル(現在値) |
例として、最終編にて、「ムラサメ」装備のおぼろ丸が「十文字斬り」で眠り耐性のない敵「影」を攻撃する時の処理を見てみよう。
影はレベル9なので、何らかのバフでレベル増加が起きていない限り、乱数次第で眠り状態にできる。
先に説明した通り、$00:0EC2にはおぼろ丸のシナリオ別キャラデータ$02・右装備のアイテムデータ15の値が入っている。
つまり「ムラサメ」装備のおぼろ丸の場合、[$00:0EC2] = $20である。
$C1/DC66 LDA $7E9019[$7E:9019] ;Aに[$7E:9019](技データ09)をロード $C1/DC6A STA $12 [$00:0312] ;A(技データ09)を[$00:0312]に書き込み $C1/DC6C LDA $7E9022[$7E:9022] ;Aに[$7E:9022](技データ18)をロード $C1/DC70 STA $14 [$00:0314] ;A(技データ18)を[$00:0314]に書き込み ; ;(中略) ; $C1/DBF7 JSR $DF27 [$C1:DF27] ;[$C1:DF27]にジャンプ
サブルーチンは、技の状態異常発生処理の途中から分岐する。
「十文字斬り」には技による状態異常が設定されていないため、技データ09と技データ18に入っている値は$00である。
そのため、$C1/DC66~から開始になる、技の状態異常発生処理によって、技データ09と技データ18がそれぞれ[$00:0312]と[$00:0314]に書き込みされる処理が行われた後、とりあえずゼロフラグにより、「十文字斬り」の状態異常依存ステータスが「使用者依存ステータスが力」という判断だけされて先に進む。
この直後に分岐が発生する。
$C1/DB38 LDA $12 [$00:0312] ;Aに[$00:0312](技データ09)をロード $C1/DB3A BEQ $F5 [$DB31] ;ゼロフラグが立っているとき[$DB31]分岐 $C1/DB31 JSR $DBF5 [$C1:DBF5] ;[$C1:DBF5]にジャンプ ; $C1/DBF5 LDX $68 [$00:0368] ;Xに[$00:0368]をロード $C1/DBF7 JSR $DF27 [$C1:DF27] ;[$C1:DF27]にジャンプ ; $C1/DF27 LDA $7E901F[$7E:901F] ;Aに[$7E:901F](技データ15)をロード $C1/DF2B BIT #$01 ;Aと$01で論理積(ステータスフラグのみ変更) $C1/DF2D BEQ $0D [$DF3C] ;ゼロフラグが立っているとき[$DF3C]分岐 $C1/DF2F LDX $78 [$00:0378] ;Xに[$00:0378]をロード $C1/DF31 CMP #$00 ;Aと$00を減算比較 $C1/DF33 BCC $07 [$DF3C] ;キャリーフラグが立っていないとき[$DF3C]分岐 $C1/DF35 LDY $0002,x[$00:1C42] ;Yに[$0002,x]をロード $C1/DF38 LDA $0002,y[$00:0EC2] ;Aに[$00:0EC2](おぼろ丸のシナリオ別キャラデータ$02)をロード $C1/DF3B RTS ;サブルーチン戻り ; $C1/DBFA BNE $09 [$DC05] ;ゼロフラグが立っていないとき[$DC05]分岐 $C1/DC05 STA $20 [$00:0320] ;Aを[$00:0320]に書き込み $C1/DC07 JSR $DC4B [$C1:DC4B] ;[$C1:DC4B]へジャンプ
$C1/DB3Aで、改めて技データ09をロードして、ゼロフラグ判定をしている。
「十文字斬り」には状態異常効果がないのでゼロフラグが立ち、ここからは技の状態異常発生処理とは別処理になる。
つまり、「技自体に状態異常の効果がついている場合、装備による状態異常は発生しない」という分岐が、ここで行われている。
この先は[$7E:901F]がロードされているが、これは技データ15である。
技データ00~24は、この処理より前に一通り呼び出されており、下のようなループ処理で[$7E:9010]~[$7E:9028]に入っている。
$C1/785C LDA $D50000,x[$D5:2C46] ;Aに[$D5:2C46](十文字斬り 技データ15)をロード $C1/7860 STA $0000,y[$7E:901F] ;Aを[$7E:901F]に書き込み
技データ15に入っているのは、上7ビットが反撃属性(火・水・風・土・精・善・悪)、下1ビットが技の攻撃力依存の有無である。
$C1/DF2Bで、$01と論理積を取っている(論理積の値はAには入らず、計算値の判断だけ)。つまり下1ビットの攻撃力依存の有無の値の取り出しである。
$C1/DF2Dでゼロフラグ判定をしており、攻撃力依存ありなら下1ビットの値は1なので、ゼロフラグが立たない。
「十文字斬り」は攻撃力依存ありのため、このまま処理が進む。
$C1/DF2FのXへのロードは、おぼろ丸のステータス関係アドレスの呼び出し用の値である。
$C1/DF31では、技データ15と$00を減算比較している。
キャリーフラグが立たないのは減算比較の結果が負の時である(が、技データ15から$00を引いて負になる場合があるのかはよくわからない)。
「十文字斬り」だとキャリーフラグが立つ。
続けて、$C1/DF38で[$00:0EC2]、おぼろ丸のシナリオ別キャラデータ$02をAにロードしている。
シナリオ別キャラデータ$02には、該当キャラの右装備のアイテムデータ15の値が入っている。
先に記した通り、アイテムデータ15の値は、アイテムの状態異常追加効果の値であり、「ムラサメ」装備のおぼろ丸の場合、[$00:0EC2]には$20が入っている。
$C1/DBFAでゼロフラグ判定を行っている。つまり右装備のアイテムデータ15の値が0かどうかの判定で、ここでゼロフラグが立たないのは「ムラサメ」「ヨシユキ」だけである。
つまり、ここでゼロフラグが立たない場合の$C1/DC05以降の処理が、「武器の追加効果としての状態異常発生処理」である。
$C1/DC4B LDX $78 [$00:0378] ;Xに[$00:0378]をロード $C1/DC4D CMP #$00 ;Aと$00を減算比較 $C1/DC4F BCC $10 [$DC61] ;キャリーフラグが立っていないとき[$DC61]分岐 $C1/DC51 LDA $0001,x[$00:1C01] ;Aに[$00:1C01](おぼろ丸の戦闘状態)をロード $C1/DC54 CMP #$40 ;Aと$40を減算比較 $C1/DC56 BNE $05 [$DC5D] ;ゼロフラグが立っていないとき[$DC5D]分岐 $C1/DC5D LDA $0038,x[$00:1C08] ;Aに[$00:1C08](おぼろ丸のLV(現在値))をロード $C1/DC60 RTS ;サブルーチン戻り
ややこしくなるのを避けるため、ここから先はおぼろ丸が戦闘中の味方キャラデータ1番目ということにしてアドレスなどを記す。
ここでは、おぼろ丸の状況を呼び出している。
[$00:1C01]は戦闘状態で、戦闘離脱なら$00、敵操作状態(ブリキ大王操作時など)なら$40、通常なら$FFが入る。
おぼろ丸が戦闘離脱状態でなければ$FFが入るので、$40と減算比較した場合にゼロフラグが立つことはない。
続いて、[$00:1C08]、つまりおぼろ丸のLV(現在値)をAにロードする。
$C1/DC0A BEQ $F0 [$DBFC] ;ゼロフラグが立っているとき[$DBFC]分岐 $C1/DC0C ASL A ;算術左シフト *2 $C1/DC0D ASL A ;算術左シフト *2 $C1/DC0E ASL A ;算術左シフト *2 $C1/DC0F STA $21 [$00:0321] ;A(LV(現在値)*8)を[$00:0321]に書き込み $C1/DC11 LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DC13 LDA $7E9000,x[$7E:AB00] ;Aに[$7E:AB00](敵番号1 LV(現在値))をロード $C1/DC17 STA $22 [$00:0322] ;A(敵番号1 LV(現在値))を[$00:0322]に書き込み $C1/DC19 LDA #$08 ;Aに$08をロード $C1/DC1B STA $08 [$00:0308] ;A($08)を[$00:0308]に書き込み $C1/DC1D STZ $23 [$00:0323] ;[$00:0323]に$00を書き込み
$C1/DC0Aでゼロフラグの判断をしている。つまり、この時点でデバフの効果でレベルが0なら、武器による状態異常は発生しない。
レベルが1以上の時は処理が続く。
$C1/DC0C~の処理で、算術左シフトを3回行うので、LV(現在値)×$8の計算が行われたことになる。
この値は[$00:0321]に書き込まれる。
ただし、もしおぼろ丸のレベルが32($20)以上だと、ここで3桁目への繰り上がり(桁溢れ、キャリーオーバー)が起きる。
レベルが$20の時、$20×$8 = $100なので、Aの下2桁は$00でキャリーフラグが立つ。
なのだが、特にキャリーフラグの処理もなく、16bitモードに移ることもなく、下2桁を[$00:0321]に書き込んでいる。
この値は後に状態異常継続時間にそのまま書き込まれてしまう。具体的な処理は後述する。
続いて、敵のレベルの現在値[$7E:AB00]をロードし、[$00:0322]に書き込む。
その後の、[$00:0308]に$08を書き込み、[$00:0323]に$00を書き込むのは、この後のループ処理の回数処理及び、状態異常の値の記録用である。
この後のループ処理は、技による状態異常発生と似た処理になる。前ページの処理方法を踏まえた上でお読みいただきたい。
$C1/DC1F LSR $20 [$00:0320] ;[$00:0320](武器の状態異常追加効果)を論理右シフト(/2) $C1/DC21 BCC $10 [$DC33] ;キャリーフラグが立っていないとき[$DC33]分岐 $C1/DC33 ROR $23 [$00:0323] ;[$00:0323]をキャリーフラグを含めた9bitで右ローテート $C1/DC35 INX ;X+1 $C1/DC36 DEC $08 [$00:0308] ;[$00:0308]-1 $C1/DC38 BNE $E5 [$DC1F] ;ゼロフラグが立っていないとき[$DC1F]分岐
ここからは、「ムラサメ」による眠りの状態異常が発生するかどうか、状態異常発生の判定になる。
実質、技による状態異常発生における、石化・酔い・眠り・マヒ・毒・腕かため・足かため・首かためを下の桁から判定していくのと同じ処理を行っていることがわかる。
つまり、状態異常の値が入っている[$00:0320]を論理右シフトした時に、一番下の位が0だとキャリーフラグが立たず、1ならキャリーフラグが立つので該当の状態異常が記録されている、という判定である。
[$00:0323]の初期値$00は、キャリーフラグ含めて右ローテートしていくので、該当の状態異常が発生した桁だけ1が立った状態になる。
[$00:0308]の初期値$08は、ループ回数で、$C1/DC36で1ずつ減っていく。
上の処理は最初のループなので、首かための処理である。「ムラサメ」は眠りの状態異常しか発生しないため、首かための処理で[$00:0323]に入る値は0である。
以降、足かため・腕かため・毒・マヒまでは同じ処理になるので省略する。
眠り状態の判定は以下のようになる。
$C1/DC1F LSR $20 [$00:0320] ;[$00:0320](武器の状態異常追加効果)を論理右シフト(/2) $C1/DC21 BCC $10 [$DC33] ;キャリーフラグが立っていないとき[$DC33]分岐 $C1/DC23 JSR $6150 [$C1:6150] ;[$C1:6150]へジャンプ ; $C1/6150 PHX ;戦闘乱数計算 $C1/6151 PHB ;↓ ;(省略) $C1/61A3 PLX ;↓ $C1/61A4 RTS ;乱数がAと[$00:033B]に入る ; $C1/DC26 AND #$0F ;A(乱数)と$0Fで論理積 $C1/DC28 CMP $22 [$00:0322] ;Aと[$00:0322](敵番号1 LV(現在値))を減算比較 $C1/DC2A BCC $07 [$DC33] ;キャリーフラグが立っていないとき[$DC33]分岐 $C1/DC2C LDA $21 [$00:0321] ;Aに[$00:0321](LV(現在値)*8)をロード $C1/DC2E STA $7E8F08,x[$7E:AA0D] ;Aを[$7E:AA0D](眠り 状態異常継続時間)に書き込み $C1/DC32 SEC ;キャリーフラグON $C1/DC33 ROR $23 [$00:0323] ;[$00:0323]をキャリーフラグを含めた9bitで右ローテート $C1/DC35 INX ;X+1 $C1/DC36 DEC $08 [$00:0308] ;[$00:0308]-1 $C1/DC38 BNE $E5 [$DC1F] ;ゼロフラグが立っていないとき[$DC1F]分岐
眠りの状態異常の判定時はキャリーフラグが立ち、戦闘乱数を生成する。サブルーチンの説明は省略する。
$C1/DC26にて、乱数と$0Fで論理積を取っている。
つまり、$00~$FFの乱数の下1桁だけを取り出している。
これは、乱数を$10で割った余りに相当し、剰余演算子の「mod」を使うと「乱数 mod $10」と表記できる。
これで乱数は$0~$Fのいずれかになる。
この値と、[$00:0322](敵番号1 LV(現在値))を減算比較し、キャリーフラグが立つ場合、つまり減算の結果が0か正の数の時は状態異常が発生する。
つまり、敵のLV(現在値)が$0~$Fの乱数以下なら、状態異常が発生する。
キャリーフラグが立たない時は状態異常が発生せず、[$DC33]にジャンプする。
続いて、Aに[$00:0321]をロードする。
[$00:0321]には先に計算した「LV(現在値)*8」が入っているのだが、掛け算結果に繰り上がり分を考慮していない。
だが、そのままAを[$7E:AA0D](眠り 状態異常継続時間)に書き込んでいる。
もしおぼろ丸のレベルが31($1F)なら、$1F×$8 = $F8、状態異常継続時間として[$7E:AA0D]に$F8が書き込まれる。
だがひとつレベルを上げて32($20)なら、先に述べた通りに$20×$8 = $100で、繰り上がりを考慮しない下2桁の$00が[$7E:AA0D]に書き込まれてしまう。
実質、「LV(現在値)*8を$100で割った余り」、剰余演算子の「mod」を使うと「LV(現在値)*8 mod $100」が状態異常継続時間扱いにされていることになる。
技の状態異常の発生処理の時は、このように状態異常継続時間の計算でキャリーが起きる時には、状態異常継続時間に$FFを書き込む処理をしていたが、武器での状態異常の処理にはない、というのはどうも妙な気がする。何かしらのミスなのか、これが仕様なのかは筆者にはわからない。
とにかく、このために味方キャラのレベル(現在値)が32以上だと、逆に状態異常継続時間が短くなってしまう可能性がある。レベル32だと状態異常にしてもすぐ解除されてしまうことになる。
味方キャラのレベルを32以上にまで上げることは、最終編でも通常プレイの範囲ではあまりないだろうし、武器の状態異常をあてにする状況もさほどではないだろうから、悪影響があるかというとそんなにないかもしれないが。
また、技の状態異常処理とは異なり、[$7E:AA0D]に状態異常継続時間を書き込む前に、[$7E:AA0D]の値を確認していない。
技の状態異常処理の時には、
「状態異常継続時間を確認し、値が1以上、つまり既に該当の状態異常で継続時間が残っている場合は該当の状態異常にする処理をスキップ」
だったのだが、武器の状態異常処理では、該当の状態異常にする処理をしてから継続時間を上書きしている。
手順が異なるのは、継続時間などの計算方法が異なるからかもしれないが、実際の理由はよくわからない。
とにかく、武器の状態異常処理では、状態異常継続時間を上書きするため、状況次第で状態異常継続時間をずっと1以上に保つこともできる、ということになる。
話がやや逸れたが、状態異常継続時間をセットしたら、キャリーフラグをONにして、[$00:0323]をキャリーフラグを含めた9bitで右ローテートする。
これは技の状態異常の処理と同じである。
%1 0000 0000→%0 1000 0000
となって、[$00:0323] = %1000 0000となる。
これで眠り状態の処理は終了で、残りの酔い・石化の処理に続く。
以下、ループ部分の解説は少し省略した。
$C1/DC1F LSR $20 [$00:0320] ;酔い状態の処理: $C1/DC21 BCC $10 [$DC33] ; $C1/DC33 ROR $23 [$00:0323] ;%0 1000 0000→%0 0100 0000 $C1/DC35 INX ; $C1/DC36 DEC $08 [$00:0308] ; $C1/DC38 BNE $E5 [$DC1F] ; $C1/DC1F LSR $20 [$00:0320] ;酔い石化の処理: $C1/DC21 BCC $10 [$DC33] ; $C1/DC33 ROR $23 [$00:0323] ;%0 0100 0000→%0 0010 0000 $C1/DC35 INX ; $C1/DC36 DEC $08 [$00:0308] ; $C1/DC38 BNE $E5 [$DC1F] ;ループ処理終了 $C1/DC3A LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DC3C LDY $0002,x[$00:1B02] ;Yに[$00:1B02]をロード $C1/DC3F LDA $002A,y[$00:1A2A] ;Aに[$00:1A2A](敵データ10 無効状態異常)をロード $C1/DC42 EOR #$FF ;Aと$FFで排他的論理和 $C1/DC44 AND $23 [$00:0323] ;Aと[$00:0323]で論理積 $C1/DC46 STA $7E900C,x[$7E:AB0C] ;Aを[$7E:AB0C]に書き込み $C1/DC4A RTS ;サブルーチン戻り
この処理も技の状態異常と同じで、敵の無効状態異常の値をロードし、$FFと排他的論理和を取ることで無効化できる状態異常に0、無効化できない状態異常に1が入る。
この値と、状態異常処理ループで状態異常にできるビットに1が入っている[$00:0323]と論理積を取り、[$7E:AB0C]に書き込む。
$C1/BD6C LDA $7E9003,x[$7E:AB03] ;Aに[$7E:AB03]をロード $C1/BD70 BEQ $10 [$BD82] ;ゼロフラグが立っているとき[$BD82]分岐 $C1/BD72 LDA $7E900C,x[$7E:AB0C] ;Aに[$7E:AB0C]をロード $C1/BD76 BEQ $0A [$BD82] ;ゼロフラグが立っているとき[$BD82]分岐 $C1/BD78 ORA $7E8F07,x[$7E:AA07] ;Aと[$7E:AA07](敵番号1の状態異常)で論理和 $C1/BD7C STA $7E8F07,x[$7E:AA07] ;Aを[$7E:AA07](敵番号1の状態異常)に書き込み $C1/BD80 INC $0F [$00:030F] ;[$00:030F]をインクリメント $C1/BD82 RTS ;サブルーチン戻り
最後の処理は、技の状態異常と同じ$C1/BD6C~$C1/BD82の処理である。
[$7E:AB0C]に書き込んだ状態異常の値と、[$7E:AA07]の敵番号1の状態異常とで論理和をとって、新たな状態異常として[$7E:AA07]に書き込み終了となる。
ということで、武器による状態異常には、技による状態異常とは異なる点があり、何か妙な点もあることがわかった。
まとめると以下のようになる。
状態異常の発生条件が、敵のレベルが15以下であることから、敵も味方もレベルがさほど高くはない、通常プレイの範囲内くらいで発生させることを考えているようである。
レベル32以上での状態異常発生時間のキャリー分が考慮されていないのも同じ理由なのだろうか。
今となっては、仕様なのか何かのミスなのかわからない。
ただ、少なくともバグの類は発生しないようである。