基礎知識
戦闘関係
本作の技には追加効果として、ステータス変動、つまりバフやデバフの効果がついていることがある。
これらの発生確率については、既に世界の合言葉は森部様にて説明されている。
・能力値増減判定:
(0~63)の乱数>敵LV+16■能力値変動
技によって能力値変化後の値が変わる
減(大):0
減(中):[1/2]
減(小):[3/4]
増 :[5/4]+1
(吸収技の場合は敵をこの値で下げて、下げた値の分だけ自分を増やす)復元
○Lv:
敵or味方が技使用:1○力速体知:
敵or味方が技使用:16
味方が移動orY:4
LR:2
味方行動可能者不在:1 (1Fにつき)技使用は技発動前に復元処理
溜め時間経過や状態異常継続時間経過も、力速体知と同量
上の通り、判定は技の標的のレベルと乱数しか関わらない。
つまり、味方が敵に技を仕掛ける場合、味方のステータスは関係しないし、敵が味方に技を仕掛ける場合、敵のステータスは関係しない。
また、技についているステータス増減のステータスが複数ある場合は、各ステータスで判定をする。
なお、上は敵がステータス変動を起こす場合の判定になる。
実は、味方がステータス変動する場合の判定は少し計算式が異なり、
(0~63)の乱数 > 味方のレベル - 背後補正 + 16
で、成功判定が行われていることがわかったので、合わせて紹介する。
(判定が異なるだけで、能力値変動の倍率は変わらない)
ここでは、
を紹介する。
ステータス変動のサブルーチンはこのページで、復元処理は次ページで紹介する。
ステータス変動に関係するメモリアドレスは以下のとおり。
各技の技データ23には、その技がステータス変動するかどうか、どのステータスが変動するかが記録されている。
$00ならステータス変動なし。
上1ビット:%0なら変動するのは標的、%1なら変動するのは使用者
上2~3ビット:下降か上昇か
| 数値 | 内容 |
|---|---|
| %00 | 下降・大 |
| %01 | 下降・中 |
| %10 | 下降・小 |
| %11 | 上昇 |
上4~8ビット:変動するステータス、合計値が入る。
| 数値 | 内容 |
|---|---|
| %00001 | レベル |
| %00010 | 知 |
| %00100 | 体 |
| %01000 | 速 |
| %10000 | 力 |
技使用時、技データ23は[$7E:9027]に入る。
成功・失敗判定に使われるレベルの値は、技使用時のレベルである。
また、味方の場合は背後補正値を引いた値を計算に使う。
つまり、レベルの値が既にバフ・デバフされている場合は、その値が計算時に使用される。
味方は、以下アドレス(開始アドレス+$2E)に、技使用時での「レベル(現在値) - 背後補正値」が入る仕組みである。
| 味方 | アドレス |
|---|---|
| 1 | $7E:1C2E |
| 2 | $7E:1C6E |
| 3 | $7E:1CAE |
| 4 | $7E:1CEE |
敵なら、レベル(現在値)は、計算途中の値が$7E:AB?A(?は敵番号0~E)、計算値が$7E:AB?0に入る。
増減するステータス。
味方キャラのステータスは、以下アドレスに、各ステータスの値を加算したアドレスになる。
| 味方キャラ番号 | アドレス |
|---|---|
| 1 | $7E:1C00 |
| 2 | $7E:1C40 |
| 3 | $7E:1C80 |
| 4 | $7E:1CC0 |
| アドレス 加算値 | ステータス |
|---|---|
| $34 | 力(現在値) |
| $35 | 速(現在値) |
| $36 | 体(現在値) |
| $37 | 知(現在値) |
| $38 | LV(現在値) |
敵番号xのステータスは以下。
| アドレス | ステータス |
|---|---|
$7E:AAx3 | 力(現在値) |
$7E:AAx4 | 速(現在値) |
$7E:AAx5 | 体(現在値) |
$7E:AAx6 | 知(現在値) |
$7E:ABx0 | レベル(現在値) |
$7E:ABxA | レベル(現在値)(計算値) |
処理は、敵がステータス変動するか、味方がステータス変動するかで変わる。
技を使ったのが誰なのかは関係ない。
処理の開始は少し変わるが、「敵が味方を攻撃した時にデバフでステータス変動」も、「味方が味方を回復した時にバフでステータス変動」も、処理方法は同一になる。
ここではまず、敵がステータス変動する場合を紹介する。
という3パターンが該当する。
敵に対しバフ・デバフが入るかどうかは、ステータス変動を起こす敵のレベルでのみ決まる。
ステータス変動計算前に、おそらく以下の処理で、計算途中の値を$7E:9EF0~$7E:9EF6に入れるための初期化をしている。
下で$7E:9EF0~$7E:9EF6すべてに00を書き入れているが、$7E:9EF2~からがレベル・力・速・体・知に対応したアドレスである。
$C1/D29D LDA #$00 ;Aに$00をロード $C1/D29F STA $7E9EF0[$7E:9EF0] ;Aを[$7E:9EF0]に書き込み $C1/D2A3 STA $7E9EF1[$7E:9EF1] ;Aを[$7E:9EF1]に書き込み $C1/D2A7 STA $7E9EF2[$7E:9EF2] ;Aを[$7E:9EF2]に書き込み $C1/D2AB STA $7E9EF3[$7E:9EF3] ;Aを[$7E:9EF3]に書き込み $C1/D2AF STA $7E9EF4[$7E:9EF4] ;Aを[$7E:9EF4]に書き込み $C1/D2B3 STA $7E9EF5[$7E:9EF5] ;Aを[$7E:9EF5]に書き込み $C1/D2B7 STA $7E9EF6[$7E:9EF6] ;Aを[$7E:9EF6]に書き込み $C1/D2BB RTS ;サブルーチン戻り
また、敵が技を使用する場合は、味方または敵へのステータス変動かを判定するため、最初に以下の判定を通る。
$C1/DCD6 LDA $7E9027[$7E:9027] ;Aに[$7E:9027](技データ23 ステータス変動)をロード $C1/DCDA STA $12 [$00:0312] ;Aを[$00:0312]に書き込み $C1/DCDC BIT #$80 ;Aと$80で論理積(ステータスフラグ変更のみ)※上1ビット判定 $C1/DCDE BEQ $03 [$DCE3] ;ゼロフラグが立っているとき[$DCE3]分岐 ;ゼロフラグOFF 使用者のステータスが変動 $C1/DCE0 LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DCE2 RTS ;サブルーチン戻り
「敵が味方を攻撃して自身にステータス変動」「敵が敵を回復してステータス変動」は、技データ23の上1ビットに1が立っているため、この処理でサブルーチンを抜ける。
「敵が味方を攻撃して味方にステータス変動」は、味方へのステータス変動になるため、ゼロフラグがONになり別処理に進むが、それは後述する。
ステータス変動の判定は$C1/DCC1から開始。
;敵が味方を攻撃して自身にステータス変動 開始位置 $C1/DCC1 LDA $79 [$00:0379] ;Aに[$00:0379]をロード $C1/DCC3 CMP #$1C ;Aと$1Cを減算比較(ステータスレジスタ変更のみ) $C1/DCC5 BEQ $03 [$DCCA] ;ゼロフラグが立っているとき[$DCCA]分岐 $C1/DCC7 BRL $00B9 [$DD83] ;フラグにかかわりなく常に分岐[$DD83] $C1/DD83 LDX $78 [$00:0378] ;Xに[$00:0378]をロード $C1/DD85 STX $10 [$00:0310] ;Xを[$00:0310]に書き込み $C1/DD87 LDA $7E9027[$7E:9027] ;Aに[$7E:9027](技データ23 ステータス変動)をロード $C1/DD8B EOR #$80 ;Aと$80で排他的論理和XOR $C1/DD8D BRA $04 [$DD93] ;フラグにかかわりなく常に分岐[$DD93] ;味方が敵を攻撃してステータス変動 開始位置 ;敵が敵を回復してステータス変動 開始位置 $C1/DD8F LDA $7E9027[$7E:9027] ;Aに[$7E:9027](技データ23 ステータス変動)をロード ;処理合流 $C1/DD93 STA $12 [$00:0312] ;Aを[$00:0312]に書き込み
敵がステータス変動する場合の3パターンだが、「敵が味方を攻撃して自身にステータス変動」の時だけ、$C1/DCC1~$C1/DD8Dを処理してから$C1/DD93に飛ぶ。
$C1/DCC1~$C1/DD8Dは何をしているのか。
$C1/DD87で技データ23が入っている[$7E:9027]をロードし、$80(%1000 0000)と排他的論理和XORを取っている。
これは、技データ23の上1ビットだけ値を逆にする、という意味である。
先に$C1/DCD6~$C1/DCE2にて、上1ビット判定をして、上1ビットが1だから使用者のステータスが変動する技である、という判定済みである。
だがここで、上1ビットだけ逆になるから、「対象のステータスを変動させる技」に変えてしまうことになる。
どうしてこのような処理をするのかというと、以降の処理は、「味方が敵を攻撃してステータス変動」「敵が敵を回復してステータス変動」と合流するためである。
「味方が敵を攻撃してステータス変動」「敵が敵を回復してステータス変動」はどちらも、対象の敵のステータスを変動させる技だから、ここで技データ23の上1ビットを逆にして、「敵に対してステータス変動を行う処理」と共通サブルーチンを使用する前処理を行った、ということである。
この値は$C1/DD93で[$00:0312]に書き込まれる。
一方、「味方が敵を攻撃してステータス変動」「敵が敵を回復してステータス変動」は、$C1/DD8Fで[$7E:9027]をロードし、その値をそのまま[$00:0312]に書き込む。
$C1/DD93 STA $12 [$00:0312] ;Aを[$00:0312]に書き込み $C1/DD95 BIT #$80 ;Aと$80で論理積(ステータスフラグ変更のみ)※上1ビット判定 $C1/DD97 BEQ $03 [$DD9C] ;ゼロフラグが立っているとき[$DD9C]分岐 ;ゼロフラグOFF 使用者のステータスが変動 $C1/DD99 LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DD9B RTS ;サブルーチン戻り ;ゼロフラグON 標的のステータスが変動か、ステータス変動なし $C1/DD9C LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DD9E LDA #$00 ;Aに$00をロード $C1/DDA0 STA $7E900D,x ;A($00)を[$7E900D,x]に書き込み $C1/DDA4 JSR $03F1 [$C1:03F1] ;[$C1:03F1]へジャンプ ; $C1/03F1 LDY $0002,x ;Yに[$00:1B02+x]をロード $C1/03F4 LDA $002F,y ;Aに[$00:1A2F+y](敵データ15 タイプ 04はOBJECT)をロード $C1/03F7 BIT #$04 ;Aと$04で論理積(ステータスフラグ変更のみ) $C1/03F9 RTS ;サブルーチン戻り $C1/DDA7 BEQ $01 [$DDAA] ;ゼロフラグが立っているとき[$DDAA]分岐 ;ゼロフラグOFFだとOBJECTなのでステータス変動しない $C1/DDA9 RTS ;サブルーチン戻り
[$00:0312]にコピーされた[$7E:9027](「敵が味方を攻撃して自身にステータス変動」の時だけ上1ビットが逆転)は、$80と論理積を取ってゼロフラグ判定する。
$80(%1000 0000)との論理積だから、上1ビットの値が1かどうかの判定である。
技データ23の上1ビットは、%0ならステータス変動するのは標的、%1ならステータス変動するのは使用者である。
また、そもそもステータス変動しないという場合も0が入っている。
よって、ここでゼロフラグが立たない場合は、上1ビットの値 = 1ということになり、技使用者がステータス変動する場合のみ。
ゼロフラグが立つ、つまり上1ビットの値 = 0なら、技を受けた標的側がステータス変動か、ステータス変動自体が設定されていない。
ここでステータス変動が技使用者の場合は$C1/DD99に進みサブルーチンを抜けて、「味方へのステータス変動処理」を行うことになる。こちらは後述。
たとえば「通打」であれば技データ23の値は$1F = %0001 1111で、上1ビットは0、つまり標的がステータス変動なので、ゼロフラグが立って$C1/DD9C以降の処理に進む。
その先の$C1/03F1~$C1/03F9では、敵の敵データ15をロードし、$04との論理積を取っている。
敵データ15は敵のタイプで、$04は敵タイプがOBJECT、つまり岩やしょく台などの障害物のこと。
戻り先の$C1/DDA7でゼロフラグ判定をしているが、ゼロフラグが立たない時はOBJECTということであり、$C1/DDA9に進んでサブルーチンを抜け、ステータス変動判定をスキップする。
つまり、敵タイプがOBJECTの敵には、ステータス変動を起こすことができない。
それ以外の場合は処理が続く。
この時点でも、技データ23の値が0、つまりステータス変動なしでも処理は同一である。
;$C1/DDA7でゼロフラグON $C1/DDAA STZ $15 [$00:0315] ;[$00:0315]に$00を書き込み $C1/DDAC STZ $20 [$00:0320] ;[$00:0320]に$00を書き込み $C1/DDAE LDA $12 [$00:0312] ;Aに[$00:0312](技データ23 ステータス変動)をロード $C1/DDB0 AND #$60 ;Aと$60(%0110 0000)で論理積 $C1/DDB2 BEQ $10 [$DDC4] ;ゼロフラグが立っているとき[$DDC4]分岐(下降・大) $C1/DDB4 CMP #$20 ;Aと$20(%0010 0000)を減算比較(ステータスレジスタ変更のみ) $C1/DDB6 BEQ $10 [$DDC8] ;ゼロフラグが立っているとき[$DDC8]分岐(下降・中) $C1/DDB8 CMP #$40 ;Aと$40(%0100 0000)を減算比較(ステータスレジスタ変更のみ) $C1/DDBA BEQ $10 [$DDCC] ;ゼロフラグが立っているとき[$DDCC]分岐(下降・小) ;ステータス上昇処理 $C1/DDBC LDA #$01 ;Aに$01をロード $C1/DDBE STA $15 [$00:0315] ;Aを[$00:0315]に書き込み $C1/DDC0 LDA #$50 ;Aに$50をロード $C1/DDC2 BRA $0A [$DDCE] ;フラグにかかわりなく常に分岐[$DDCE] ;ステータス下降・大の処理 $C1/DDC4 LDA #$00 ;Aに$00をロード $C1/DDC6 BRA $06 [$DDCE] ;フラグにかかわりなく常に分岐[$DDCE] ;ステータス下降・中の処理 $C1/DDC8 LDA #$20 ;Aに$20をロード $C1/DDCA BRA $02 [$DDCE] ;フラグにかかわりなく常に分岐[$DDCE] ;ステータス下降・小の処理 $C1/DDCC LDA #$30 ;Aに$30をロード ;処理合流 $C1/DDCE STA $14 [$00:0314] ;A(処理値 $50/$00/$10/$30)を[$00:0314]に書き込み
ここが、技データ23に格納された上2~3ビットの、ステータス下降・上昇の判定を行っている。
上2~3ビットは以下の通り。
| 数値 | 内容 |
|---|---|
| %00 | 下降・大 |
| %01 | 下降・中 |
| %10 | 下降・小 |
| %11 | 上昇 |
技データ23と一定の値で論理積を取ってゼロフラグ判定での分岐である。
まず、上2~3ビットを取り出すため、$C1/DDB0で技データ23と$60(%0110 0000)で論理積を取っている。
この時点でゼロフラグが立つ場合は上表から、「ステータス下降・大」なので、$C1/DDB2でゼロフラグが立ち、$C1/DDC4に進む。
$C1/DDB4は$20(%0010 0000)との減算比較だから、ゼロフラグが立つのは「ステータス下降・中」。
$C1/DDB8は$40(%0100 0000)との減算比較だから、ゼロフラグが立つのは「ステータス下降・小」。
$C1/DDBCまで判定が進む場合は「ステータス上昇」ということになる。
その後の処理を含め整理してみると、分岐によりAにロードする値が異なる。
| 内容 | Aにロードする値 |
|---|---|
| 下降・大 | $00 |
| 下降・中 | $20 |
| 下降・小 | $30 |
| 上昇 | $50 (かつ [$00:0315]に$01) |
上のようにAに値をロードした後は、$C1/DDCEで処理が合流し、Aの値を[$00:0314]に書き込んで処理が続く。
$C1/DDD0 LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DDD2 LDA $7E900A,x ;Aに[$7E:ABnA](敵番号n レベル現在値)をロード $C1/DDD6 CLC ;キャリーフラグクリア $C1/DDD7 ADC #$10 ;A + $10 (LV + $10 = LV + 16) = $2C $C1/DDD9 BCC $01 [$DDDC] ;キャリーフラグが立っていないとき[$DDDC]分岐 ;キャリーフラグON レベル+16が256を越えたらステータス増減なし $C1/DDDB RTS ;サブルーチン戻り ;キャリーフラグOFF $C1/DDDC CMP #$40 ;Aと$40を減算比較(ステータスレジスタ変更のみ) $C1/DDDE BCC $01 [$DDE1] ;キャリーフラグが立っていないとき[$DDE1]分岐 ;キャリーフラグON 「レベル+16 - $40(64)」 が0か正の数の時、ステータス増減なし $C1/DDE0 RTS ;サブルーチン戻り ;キャリーフラグOFF $C1/DDE1 STA $13 [$00:0313] ;A(LV + $10)を[$00:0313]に書き込み $C1/DDE3 LSR $12 [$00:0312] ;[$00:0312](技データ23 ステータス変動)を論理右シフト (/2) $C1/DDE5 BCC $23 [$DE0A] ;キャリーフラグが立っていないとき[$DE0A]分岐(下1ビットに1だとキャリーフラグ) $C1/DDE7 JSR $DE7B [$C1:DE7B] ;[$C1:DE7B]へジャンプ ; $C1/DE7B JSR $6150 [$C1:6150] ;[$C1:6150]へジャンプ
$C1/DDD2で、技を当てた敵のレベル現在値をロードする。つまり[$7E:ABnA](敵番号n)の呼び出しである。
$C1/DDD7~で、ロードしたレベルに$10を加算し、キャリーフラグ判定をしている。
加算でのキャリーフラグ判定だから$FFを越えたかどうかの判定である。
キャリーフラグが立つ、つまり「レベル + $10」が$FF以上だと、$C1/DDDBに抜けてサブルーチン戻りだから、ステータス増減処理なし。
ここでまず、最大レベル99 - 16($10) = 83以上だとステータス増減が行われないことがわかる。
続いて、$C1/DDDCで、LV + $10と$40を減算比較している。
ここでも、キャリーフラグが立つと$C1/DDE0でサブルーチンを抜けている。
減算でキャリーフラグが立つのは、減算の結果が0か正の数の時である。
LV + 16($10) - 64($40)が0以上になるのは、レベルが48以上の時である。
よって、レベルが48以上だと、$C1/DDE0に抜けてサブルーチン戻りだから、ステータス増減処理なし。
結局、「現在のレベルが48以上だと、ステータス増減処理は行われない」ということがわかった。
$C1/DDE1で、LV + $10を[$00:0313]に書き込む。
$C1/DDE3以降で、各ステータスについて判定していく。
技データ23をコピーした、[$00:0312]を論理右シフト(/2)して、キャリーフラグが立っている場合は$C1/DDE7~の処理に進む。
キャリーフラグが立っていない場合は$C1/DE0Aまでスキップされる。
[$00:0312]を論理右シフトすることで何が起きるのか。
「通打」なら、[$00:0312]に入っている技データ23は$1F(%0001 1111)であるが、技データ23下5ビットは変動するステータスの合計値である。
| 数値 | 内容 |
|---|---|
| %00001 | レベル |
| %00010 | 知 |
| %00100 | 体 |
| %01000 | 速 |
| %10000 | 力 |
論理右シフトは÷2であるが、2進数で見た時に右に1桁動かすことでもある。
一番右の桁、つまり下1ビットの値は、これ以上右に動かせないため、1だったらキャリーフラグが立ち、0だったらキャリーフラグを立てない、という処理を行い、値自体は消える。
%0001 1111だったら、論理右シフトすると、%0000 1111と全体が右にひとつズレて、一番下の桁が1だったからキャリーフラグが立つことになる。
一番下の桁は「レベル」に対応しているから、キャリーフラグが立つ場合、該当技は「レベル」を変動させるということになり、「レベルがステータス変動するか」の判定を行うため、$C1/DDE7に進む。
その次の$C1/DE7Bは、[$C1:6150]へジャンプするのだが、このジャンプ先は戦闘乱数計算サブルーチンの$C1/6150~$C1/61A4である。
つまり、判定時に戦闘乱数を1つ生成して、先に進む。
$C1/6150 PHX ;↓戦闘乱数計算 ;(中略) $C1/61A4 RTS ;乱数がAと[$00:033B]に入る ; $C1/DE7E AND #$3F ;A(乱数$00~$FF)と$3F(%0011 1111)で論理積 $C1/DE80 CMP $13 [$00:0313] ;Aと[$00:0313](LV + $10)を減算比較(ステータスレジスタ変更のみ) $C1/DE82 RTS ;サブルーチン戻り $C1/DDEA BCC $1E [$DE0A] ;キャリーフラグが立っていないとき[$DE0A]分岐(失敗) $C1/DDEC BEQ $1C [$DE0A] ;ゼロフラグが立っているとき[$DE0A]分岐(失敗) $C1/DDEE LDA #$01 ;Aに$01をロード $C1/DDF0 STA $20 [$00:0320] ;A($01)を[$00:0320]に書き込み $C1/DDF2 LDA $7E9000,x ;Aに[$7E:ABn0](LV(現在値))をロード $C1/DDF6 JSR $DE4D [$C1:DE4D] ;[$C1:DE4D]へジャンプ
$C1/6150~$C1/61A4の戦闘乱数計算サブルーチンの詳細は既に説明しているため、省略。
$C1/61A4でサブルーチンが戻る際、生成した乱数$00~$FFは、Aと[$00:033B]に入る。
$C1/DE7Eでサブルーチンが戻るが、ここではA(乱数$00~$FF)と$3Fで論理積を取り、その値と[$00:0313](LV + $10)を減算比較している。
乱数$00~$FFと$3F(%0011 1111, 10進数63)の論理積は、乱数÷64の余り(0~63)と同値である。
乱数÷64の余りを、乱数 mod 64とすると、
(乱数 mod 64) - (現在LV + 16)
という値を計算したことになる。
この計算をした上で、$C1/DDEAはキャリーフラグOFFなら$C1/DE0A、$C1/DDECではゼロフラグONなら$C1/DE0Aと、同じアドレスに飛ぶのだが、これは要するにステータス変動に失敗した判定である。
(乱数 mod 64) - (現在LV + 16)
の減算の結果が負または0なら、失敗判定ということである。
よって、
乱数 mod 64 > 現在LV + 16
かつ
現在LV < 48
が、ステータス変動成功条件である。
成功した場合は$C1/DDF0に進み、[$00:0320]に$01を書き込む。
Aに[$7E:AB00](LV(現在値))を読み込み、[$C1:DE4D]へジャンプする。
失敗時の飛び先の$C1/DE0Aは、ステータス変動計算をし終えたアドレスになる。
成功時はステータス変動処理を行う。
つまりここでは、変動後のレベルの値を計算する。
Aに[$7E:AB00](LV(現在値))を読み込んだ状態である。
$C1/DE4D REP #$21 ;Aを16bit幅に変更、キャリーフラグクリア $C1/DE4F AND #$00FF ;Aと$00FFで論理積 $C1/DE52 ASL A ;Aを算術左シフト *2 $C1/DE53 ASL A ;Aを算術左シフト *2 $C1/DE54 SEP #$20 ;MフラグON Aレジスタは8bit幅 ;符号付16bit x 8bit LV(現在値)*4 * (処理値 $50/$00/$10/$30) $C1/DE56 STA $211B [$00:211B] ;Aを[$00:211B]に書き込み $C1/DE59 XBA ;Aレジスタの上位バイトと下位バイトを交換 $C1/DE5A STA $211B [$00:211B] ;Aを[$00:211B]に書き込み $C1/DE5D LDA $14 [$00:0314] ;Aに[$00:0314](処理値 $50/$00/$10/$30)をロード $C1/DE5F STA $211C [$00:211C] ;Aを[$00:211C]に書き込み $C1/DE62 STA $211C [$00:211C] ;Aを[$00:211C]に書き込み $C1/DE65 REP #$20 ;Aを16bit幅に変更、Mフラグをクリア $C1/DE67 LDA $2135 [$00:2135] ;Aに[$00:2135](乗算結果 中位1バイト)をロード $C1/DE6A CMP #$00FF ;Aと$00FFを減算比較(ステータスレジスタ変更のみ) $C1/DE6D BCC $06 [$DE75] ;キャリーフラグが立っていないとき[$DE75]分岐 $C1/DE75 SEP #$20 ;MフラグON Aレジスタは8bit幅 $C1/DE77 CLC ;キャリーフラグクリア $C1/DE78 ADC $15 [$00:0315] ;A + [$00:0315](上昇の時1) $C1/DE7A RTS ;サブルーチン戻り
まず、$C1/DE52~でAを2回算術左シフトで*2する。つまり*4である。
$C1/DE56~は、符号付16bit x 8bitの計算になる。
処理を追っていくと、被乗数が「LV(現在値)*4」、乗数が[$00:0314]の掛け算である。
[$00:0314]は先の処理で、上昇・下降度合いにより入っている値が変わる。
| 内容 | [$00:0314] |
|---|---|
| 下降・大 | $00 |
| 下降・中 | $20 |
| 下降・小 | $30 |
| 上昇 | $50 (かつ [$00:0315]に$01) |
計算結果は3バイト分[$00:2134][$00:2135][$00:2136]で出力されるが、$C1/DE67でロードされるのは[$00:2135]、つまり中央の1バイトである。
乗算結果を/$100した値に等しい。
実際には割り算の余りを切り捨て処理だから、trunc()で切り捨てである。
例えば、ホラーシップ(レベルは$1C)に「通打」を当てて、レベルダウンできた場合、下降・大だから、
●下降・大
LV(現在値)*4 * [$00:0314] / $100
= trunc($1C*4 * $00 / $100)
= trunc($70 * $00 / $100)
= $00
下降・大が成功すると、0を掛け算するので、0までステータスを落としてしまう、ということがわかる。
これが、下降・中や、下降・小、上昇だとそれぞれどうなるか。
●下降・中
LV(現在値)*4 * [$00:0314] / $100
= trunc($1C*4 * $20 / $100)
= trunc($70 * $20 / $100)
= $0E(14)
●下降・小
LV(現在値)*4 * [$00:0314] / $100
= trunc($1C*4 * $30 / $100)
= trunc($70 * $30 / $100)
= $15(21)
●上昇
LV(現在値)*4 * [$00:0314] / $100
= trunc($1C*4 * $50 / $100)
= trunc($70 * $50 / $100)
= $23(35)
更に、$C1/DE78で、この計算結果に、A + [$00:0315](上昇の時1)がなされるから、ステータス上昇の時だけ+1されることになる。
整理してみると、下降/上昇値は以下のように計算されることがわかる。
| 内容 | 下降/上昇値 |
|---|---|
| 下降・大 | LV(現在値)*4 * 0 |
| 下降・中 | trunc(LV(現在値)*4 * 32/256) = trunc(LV(現在値) * 1/2) |
| 下降・小 | trunc(LV(現在値)*4 * 48/256) = trunc(LV(現在値) * 3/4) |
| 上昇 | trunc(LV(現在値)*4 * 80/256)+1 = trunc(LV(現在値) * 5/4)+1 |
元ステータスに対し、下降・大は0まで落とす、下降・中は1/2、下降・小は3/4、上昇は×5/4+1(いずれも小数点以下切り捨て)ということがわかった。
$C1/DDF9 LDY #$9EF2 ;Yに$9EF2をロード $C1/DDFC PHA ;Aをスタックにプッシュ $C1/DDFD SEC ;キャリーフラグON $C1/DDFE SBC $7E9000,x[$7E:AB00] ;A - [$7E:AB00](LV(現在値)) $C1/DE02 JSR $DE83 [$C1:DE83] ;[$C1:DE83]へジャンプ ; $C1/DE83 BCS $07 [$DE8C] ;キャリーフラグが立っているとき[$DE8C]分岐 ;キャリーフラグOFF $C1/DE85 STA $16 [$00:0316] ;Aを[$00:0316]に書き込み $C1/DE87 LDA #$00 ;Aに$00をロード $C1/DE89 SEC ;キャリーフラグON $C1/DE8A SBC $16 [$00:0316] ;A - [$00:0316] ;キャリーフラグON $C1/DE8C PHX ;Xをスタックにプッシュ $C1/DE8D TYX ;Yレジスタの値をXレジスタに転送 $C1/DE8E CLC ;キャリーフラグクリア $C1/DE8F ADC $7E0000,x[$7E:9EF2] ;A + [$7E:9EF2] $C1/DE93 BCC $02 [$DE97] ;キャリーフラグが立っていないとき[$DE97]分岐 ;キャリーフラグON $C1/DE95 LDA #$FF ;Aに$FFをロード ;キャリーフラグOFF $C1/DE97 STA $7E0000,x[$7E:9EF2] ;Aを[$7E:9EF2]に書き込み $C1/DE9B PLX ;Xレジスタにスタックからプル $C1/DE9C RTS ;サブルーチン戻り
ここまでの計算値を$C1/DDFCで一度Aをスタックに入れてから、キャリーフラグを立ててA - [$7E:AB00](LV(現在値))を計算している。
[$7E:AB00](LV(現在値))にはデバフで落ちるより前の値が入ったままである
通打だとゼロまでレベルが落ちているから、0-(LV(現在値))であり、符号付き8ビット整数の計算で考えると必ず負の数になる。
下降・中や下降・小でも、計算から考えて必ず負の数になるはずである。
一方、上昇の場合は、trunc(LV(現在値) * 5/4)+1 - LV(現在値)だから、正の数になるはずである。
よって、$C1/DE83でのキャリーフラグ分岐は、ステータス増加か減少かで分かれる。
ステータス減少なら、A - [$7E:AB00](LV(現在値))は[$00:0316]に書き込み、改めて、$00 - [$00:0316]を計算して、ここで元レベルに計算値が戻る。
一方、ステータス増加だと$C1/DE85~$C1/DE8Aをスキップするため、$C1/DE8Cに進む(ステータス減少とも処理合流)。
$C1/DE8Fで、Aと[$7E:9EF2]を加算し、キャリーフラグが立つなら、つまり加算結果が$FF以上ならAを$FFとしてから[$7E:9EF2]に書き戻している。
[$7E:9EF2]~[$7E:9EF6]は最初に記した通りに、ステータス変動計算用の途中計算の値を入れるアドレスである、と思われる。初期値は$00。
上昇後の値が$FF以上になっていたら$C1/DE95で$FFに処理、ということであり、ステータス上昇時に桁溢れがおきたら(256を越えたら)$FFに変更という意味になるから、バフの上限が255であることがわかる。
とはいえ、現在レベルが47以下でなければステータス変動は起こせないはずなので、レベルについてはバフで255まで上がることはない、と思われる。
力・体・速・知はオーバーフローすることがあり得るため、オーバーフローしないよう処理が必要。
$C1/DE05 PLA ;Aレジスタに値をプル $C1/DE06 STA $7E9000,x[$7E:AB00] ;Aを[$7E:AB00](LV(現在値))に書き込み ;ここで失敗分岐と合流 $C1/DE0A LDY #$9EF6 ;Yに$9EF6をロード $C1/DE0D LDA #$02 ;Aに$02をロード $C1/DE0F STA $21 [$00:0321] ;Aを[$00:0321]に書き込み $C1/DE11 LDA #$04 ;Aに$04をロード $C1/DE13 STA $08 [$00:0308] ;Aを[$00:0308]に書き込み $C1/DE15 LSR $12 [$00:0312] ;[$00:0312]を論理右シフト (/2) $C1/DE17 BCC $23 [$DE3C] ;キャリーフラグが立っていないとき[$DE3C]分岐 $C1/DE19 JSR $DE7B [$C1:DE7B] ;[$C1:DE7B]へジャンプ ; $C1/DE7B JSR $6150 [$C1:6150] ;[$C1:6150]へジャンプ
最終的には一度スタックに入れたAを$C1/DE05でスタックから戻して、[$7E:AB00](LV(現在値))に書き込むため、実質途中計算値を[$7E:9EF2]に入れたことになる。
$C1/DE0Aが乱数計算後の失敗時分岐との合流アドレスである。
[$00:0321]に$02、[$00:0308]に$04を書き込み、再び[$00:0312](技データ23)を論理右シフト(/2)、キャリーフラグ分岐で乱数計算[$C1:6150]へと、次のステータス判定に進んでいる。
レベルの次なので力の判定になる。
レベルの判定と異なるのは、乱数計算後の処理である。
JSRで飛んでRTSで戻る、という部分だけ取り出すと、レベル判定では、
$C1/DDE7 JSR ━━┓ $C1/DE7B JSR ━┓┃ $C1/6150 JSR ┓┃┃ $C1/61A4 RTS ┛┃┃ $C1/DE82 RTS ━┛┃ $C1/DDEA BCC ←┛
こうなるのだが、力以降は、
$C1/DE19 JSR ━━┓ $C1/DE7B JSR ━┓┃ $C1/6150 JSR ┓┃┃ $C1/61A4 RTS ┛┃┃ $C1/DE7E RTS ━┛┃ $C1/DE1C BCC ←┛
乱数計算をして($C1/6150~$C1/61A4)、乱数で成功判定をする($C1/DE7B~$C1/DE7E)、のRTS戻り先が、$C1/DE1Cになる。
また、知→体→速→力で4回のループ処理である。
実際の処理は以下。
$C1/6150 PHX ;↓戦闘乱数計算 ;(中略) $C1/61A4 RTS ;乱数がAと[$00:033B]に入る ; $C1/DE7E AND #$3F ;Aと$3Fで論理積 $C1/DE80 CMP $13 [$00:0313] ;Aと[$00:0313](LV + $10)を減算比較(ステータスレジスタ変更のみ) $C1/DE82 RTS ;サブルーチン戻り ; $C1/DE1C BCC $1E [$DE3C] ;キャリーフラグが立っていないとき[$DE3C]分岐(失敗) $C1/DE1E BEQ $1C [$DE3C] ;ゼロフラグが立っているとき[$DE3C]分岐(失敗) $C1/DE20 LDA $20 [$00:0320] ;Aに[$00:0320]をロード $C1/DE22 CLC ;キャリーフラグクリア $C1/DE23 ADC $21 [$00:0321] ;A + [$00:0321] $C1/DE25 STA $20 [$00:0320] ;Aを[$00:0320]に書き込み $C1/DE27 LDA $7E8F06,x[$7E:AA05] ;Aに[$7E:AA05]をロード X:1AFF $C1/DE2B JSR $DE4D [$C1:DE4D] ;[$C1:DE4D]へジャンプ
$C1/DE82まではレベルとの共通処理で、$C1/DE1C~が知→体→速→力での戻り先になる。
$C1/DE1Cと$C1/DE1Eは、レベルでも行った、乱数によるステータス変動成功・失敗判定。
失敗時は$C1/DE3Cまでジャンプする。
成功時は$C1/DE20~の処理だが、先にレベルでの処理で、[$00:0320]に0か1(レベル変動成功時は1)、[$00:0321]に$02が入ったので、[$00:0320] + [$00:0321]を新たに[$00:0320]に入れてから、$7E8F06,xをロードする。
これは敵のステータスのアドレスを呼び出すための値で、
| アドレス | 内容 |
|---|---|
$7E:AAx3 | 力(現在値) |
$7E:AAx4 | 速(現在値) |
$7E:AAx5 | 体(現在値) |
$7E:AAx6 | 知(現在値) |
となっており、ループ毎にxを-1してステータスを知→体→速→力と変えていく仕組みである。
初回のループで成功した場合は知のステータス増減にあたるから、$7E:AAx6のロードであり、敵番号0なら$7E:AA06である。
$C1/DE2Bのジャンプ先$C1/DE4D~$C1/DE7Aは、レベル処理と同一である。
つまり、
| 内容 | 下降/上昇値 |
|---|---|
| 下降・大 | ステータス(現在値)*4 * 0 |
| 下降・中 | trunc(ステータス(現在値)*4 * 32/256) = trunc(ステータス(現在値) * 1/2) |
| 下降・小 | trunc(ステータス(現在値)*4 * 48/256) = trunc(ステータス(現在値) * 3/4) |
| 上昇 | trunc(ステータス(現在値)*4 * 80/256)+1 = trunc(ステータス(現在値) * 5/4)+1 |
という計算は共通ということになる。
;$C1/DE4D~$C1/DE7A処理 $C1/DE7A RTS ;サブルーチン戻り ; $C1/DE2E PHA ;Aをスタックにプッシュ $C1/DE2F SEC ;キャリーフラグON $C1/DE30 SBC $7E8F06,x[$7E:AA05] ;A - [$7E:AA05] $C1/DE34 JSR $DE83 [$C1:DE83] ;[$C1:DE83]へジャンプ ; ;レベル処理と共通$C1/DE83~$C1/DE9C $C1/DE83 BCS $07 [$DE8C] ;キャリーフラグが立っているとき[$DE8C]分岐 $C1/DE85 STA $16 [$00:0316] ;Aを[$00:0316]に書き込み $C1/DE87 LDA #$00 ;Aに$00をロード $C1/DE89 SEC ;キャリーフラグON $C1/DE8A SBC $16 [$00:0316] ;A - [$00:0316] $C1/DE8C PHX ;Xをスタックにプッシュ $C1/DE8D TYX ;Yレジスタの値をXレジスタに転送 $C1/DE8E CLC ;キャリーフラグクリア $C1/DE8F ADC $7E0000,x[$7E:9EF5] ;A + [$7E:9EF5] X:9EF5 $C1/DE93 BCC $02 [$DE97] ;キャリーフラグが立っていないとき[$DE97]分岐 $C1/DE97 STA $7E0000,x[$7E:9EF5] ;Aを[$7E:9EF5]に書き込み $C1/DE9B PLX ;Xレジスタにスタックからプル $C1/DE9C RTS ;サブルーチン戻り ; $C1/DE37 PLA ;Aレジスタに値をプル $C1/DE38 STA $7E8F06,x[$7E:AA05] ;Aを[$7E:AA05]に書き込み X:1AFF ;失敗時との合流 $C1/DE3C ASL $21 [$00:0321] ;[$00:0321]を算術左シフト *2 $C1/DE3E DEX ;Xをデクリメント -1 $C1/DE3F DEY ;Yをデクリメント -1 $C1/DE40 DEC $08 [$00:0308] ;[$00:0308]をデクリメント -1 $C1/DE42 BNE $D1 [$DE15] ;ゼロフラグが立っていないとき[$DE15]分岐 ;ループ処理ここまで $C1/DE44 LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DE46 LDA $20 [$00:0320] ;Aに[$00:0320]をロード $C1/DE48 STA $7E900D,x ;Aを[$7E:ABnD]に書き込み $C1/DE4C RTS ;サブルーチン戻り
$C1/DE2E~$C1/DE34、$C1/DE37~$C1/DE42が力・体・速・知用の処理だが、結局、レベルの処理との違いは呼び出すアドレスである。
[$00:0321]を*2、XとYをデクリメント-1して、ループ前に$04を入れた[$00:0308]をデクリメント-1して、ゼロフラグが立つまで$C1/DE15~$C1/DE42をループ処理する。つまり知→体→速→力の処理をする。
以上で、
| アドレス | 内容 |
|---|---|
$7E:ABx0 | LV(現在値) |
$7E:AAx3 | 力(現在値) |
$7E:AAx4 | 速(現在値) |
$7E:AAx5 | 体(現在値) |
$7E:AAx6 | 知(現在値) |
が、更新されたことになる。
以上が、敵がステータス変動する時のステータス変動処理になる。
ここまでの通り、実は、技データ23($7E:9027)が$00、つまりステータス変動が設定されていない場合は処理しない、といった専用の分岐処理はない。
ただ単純に、技データ23の下5ビットすべてが0だから判定スキップという処理だけで、ステータス変動処理を終わらせているのである。
これは、味方がステータス変動する場合の処理でも同じ。
続いて、味方がステータス変動する場合を紹介する。
という3パターンが該当する。
3.だが、味方が敵に攻撃した時、味方(使用者自身)にデバフが入る、ポゴの「ブンブン」やサモの「ちんじゃおろーす」は、上で紹介したサブルーチンの初期段階で分岐が発生していた。
$C1/DD8F LDA $7E9027[$7E:9027] ;Aに[$7E:9027](技データ23 ステータス変動)をロード $C1/DD93 STA $12 [$00:0312] ;Aを[$00:0312]に書き込み $C1/DD95 BIT #$80 ;Aと$80で論理積(ステータスフラグ変更のみ)※上1ビット判定 $C1/DD97 BEQ $03 [$DD9C] ;ゼロフラグが立っているとき[$DD9C]分岐 ;ゼロフラグOFF 使用者のステータスが変動 $C1/DD99 LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DD9B RTS ;サブルーチン戻り
この時点でサブルーチンが一度終了しており、しばらく別処理が続く。
続きは以下であり、これが味方がステータス変動を起こす際の処理になる。
;味方が敵を攻撃して味方自身にステータス変動を起こす 開始位置 $C1/DCC1 LDA $79 [$00:0379] ;Aに[$00:0379]をロード $C1/DCC3 CMP #$1C ;Aと$1Cを減算比較(ステータスレジスタ変更のみ) $C1/DCC5 BEQ $03 [$DCCA] ;ゼロフラグが立っているとき[$DCCA]分岐 $C1/DCCA LDX $78 [$00:0378] ;Xに[$00:0378]をロード $C1/DCCC STX $10 [$00:0310] ;Xを[$00:0310]に書き込み $C1/DCCE LDA $7E9027[$7E:9027] ;Aに[$7E:9027](技データ23 ステータス変動)をロード $C1/DCD2 EOR #$80 ;Aと$80で排他的論理和XOR $C1/DCD4 BRA $04 [$DCDA] ;フラグにかかわりなく常に分岐[$DCDA] ;味方が味方を回復してステータス変動 ;及び 敵が味方を攻撃してステータス変動 開始位置 $C1/DCD6 LDA $7E9027[$7E:9027] ;Aに[$7E:9027](技データ23 ステータス変動)をロード ;処理合流 $C1/DCDA STA $12 [$00:0312] ;Aを[$00:0312]に書き込み $C1/DCDC BIT #$80 ;Aと$80で論理積(ステータスフラグ変更のみ) $C1/DCDE BEQ $03 [$DCE3] ;ゼロフラグが立っているとき[$DCE3]分岐
味方が敵を攻撃して、味方自身がステータス変動する場合だけ、$C1/DCC1~$C1/DCD4の処理をしてから$C1/DCDAに飛ぶ。
それ以外、味方が味方を回復や、敵が味方を攻撃する場合の味方のステータス変動は、$C1/DCD6から開始になる。
上の処理は、敵の場合における、「敵が味方を攻撃して自身にステータス変動」だけ最初に別処理するのとほぼ同じ。
味方パターンの場合、「味方が敵を攻撃して味方自身にステータス変動を起こす」だけ$C1/DCC1~の処理で、データ23の上1ビットだけ値を逆にする。
その後の処理は敵へのステータス変動のサブルーチンと似ている。
ただ、味方側のステータス処理なので、サブルーチンのアドレスは異なる。
また、ひとつだけ重大な変更点がある。
飛び先の$C1/DCE3からの処理は以下の通り。味方番号は1とする。
$C1/DCE3 LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DCE5 STZ $001C,x[$00:1C1C] ;[$00:1C1C]に$00を書き込み※味方キャラデータ+$1C $C1/DCE8 STZ $15 [$00:0315] ;[$00:0315]に$00を書き込み $C1/DCEA STZ $20 [$00:0320] ;[$00:0320]に$00を書き込み $C1/DCEC LDA $12 [$00:0312] ;Aに[$00:0312]をロード $C1/DCEE AND #$60 ;Aと$60で論理積 $C1/DCF0 BEQ $10 [$DD02] ;ゼロフラグが立っているとき[$DD02]分岐(下降・大) $C1/DCF2 CMP #$20 ;Aと$20を減算比較(ステータスレジスタ変更のみ) $C1/DCF4 BEQ $10 [$DD06] ;ゼロフラグが立っているとき[$DD06]分岐(下降・中) $C1/DCF6 CMP #$40 ;Aと$40を減算比較(ステータスレジスタ変更のみ) $C1/DCF8 BEQ $10 [$DD0A] ;ゼロフラグが立っているとき[$DD0A]分岐(下降・小) ;ステータス上昇処理 $C1/DCFA LDA #$01 ;Aに$01をロード $C1/DCFC STA $15 [$00:0315] ;Aを[$00:0315]に書き込み $C1/DCFE LDA #$50 ;Aに$50をロード $C1/DD00 BRA $0A [$DD0C] ;フラグにかかわりなく常に分岐[$DD0C] ;ステータス下降・大の処理 $C1/DD02 LDA #$00 ;Aに$00をロード $C1/DD04 BRA $06 [$DD0C] ;フラグにかかわりなく常に分岐[$DD0C] ;ステータス下降・中の処理 $C1/DD06 LDA #$20 ;Aに$20をロード $C1/DD08 BRA $02 [$DD0C] ;フラグにかかわりなく常に分岐[$DD0C] ;ステータス下降・小の処理 $C1/DD0A LDA #$30 ;Aに$30をロード ;処理合流 $C1/DD0C STA $14 [$00:0314] ;Aを[$00:0314]に書き込み $C1/DD0E LDX $10 [$00:0310] ;Xに[$00:0310]をロード $C1/DD10 LDA $002E,x[$00:1C2E] ;Aに[$00:1C2E]をロード ;[$00:1C2E] = 味方キャラデータ+$2E = LV(現在値) - 背面補正 $C1/DD13 CLC ;キャリーフラグクリア $C1/DD14 ADC #$10 ;A + $10 $C1/DD16 BCC $01 [$DD19] ;キャリーフラグが立っていないとき[$DD19]分岐 ;キャリーフラグON レベル - 背面補正+16が256を越えたらステータス増減なし $C1/DD18 RTS ;サブルーチン戻り ;キャリーフラグOFF $C1/DD19 CMP #$40 ;Aと$40を減算比較(ステータスレジスタ変更のみ) $C1/DD1B BCC $01 [$DD1E] ;キャリーフラグが立っていないとき[$DD1E]分岐 ;キャリーフラグON 「レベル - 背面補正+16 - $40(64)」 が0か正の数の時、ステータス増減なし $C1/DD1D RTS ;サブルーチン戻り ;キャリーフラグOFF $C1/DD1E STA $13 [$00:0313] ;Aを[$00:0313]に書き込み $C1/DD20 LSR $12 [$00:0312] ;A[$00:0312]を論理右シフト (/2) $C1/DD22 BCC $20 [$DD44] ;キャリーフラグが立っていないとき[$DD44]分岐 $C1/DD24 JSR $DE7B [$C1:DE7B] ;[$C1:DE7B]へジャンプ ; $C1/6150 PHX ;↓戦闘乱数計算 ;(中略) $C1/61A4 RTS ;乱数がAと[$00:033B]に入る ; $C1/DE7E AND #$3F ;A(乱数$00~$FF)と$3Fで論理積 $C1/DE80 CMP $13 [$00:0313] ;Aと[$00:0313](LV - 背面補正 + $10)を減算比較(ステータスレジスタ変更のみ) $C1/DE82 RTS ;サブルーチン戻り
以上がステータス増減成功判定のための乱数計算・判定までのサブルーチンであるが、だいたいの流れは敵と変わらないことがわかる。
だが、相違点もある。
ステータス増減の中で上昇/下降・小/下降・中/下降・大のいずれかを判定した後の処理合流後、敵のサブルーチンでは、敵のレベル(現在値)を読み出していた。
だが、味方の場合、$C1/DD10でロードするのは、味方1人目なら[$00:1C2E]である。
これは味方キャラデータ+$2Eにあたり、「LV(現在値) - 背面補正」(減算結果が負の場合は0)の計算値が入っている。
味方のステータス増減成功判定は、味方キャラの「LV(現在値) - 背面補正」、つまり背面補正込の値になるのである。
例えば、レベル16のポゴが「ブンブン」を使う場合、自身に速ダウン(小)の効果があるが、成功判定は、ポゴの背面補正6を引いたレベル10で判定を行うということになる。
回復技での処理も共通なので、例えばレベル22の高原が「気合いため」を使う場合は、高原の背面補正4を引いたレベル18でバフの判定を行うということになる。
背面補正の値が高いキャラほど、成功率が下がることがわかる。
「ブンブン」のように、自身にデバフが入る場合は、成功率が下がる方が有利であるが、「気合いため」など、自身にバフが入る場合、成功率が下がるのは不利ということである。
また、敵から攻撃を食らう場合も、背面補正が高いほど成功率が下がるためデバフが入りにくいことになり有利ということがわかる。
まとめると、味方に対しバフ・デバフを行う場合、
乱数 mod 64 > 現在LV - 背面補正 + 16
かつ
現在LV - 背面補正 < 48
この計算式で成功判定を行っている。
背面補正を引いてレベル0だった場合でも右辺は16になるから、例えば現代編の高原(レベル2)でも「気合いため」でステータス変動が起こる。
(ただ、現代編の高原だと、変動が少ないので、すぐに元に戻ってしまうが)
また、敵はレベル47以下しかステータス変動成功判定を行わないが、味方から味方の場合、「47 + 背面補正」以下ならステータス変動成功判定を行うこともわかる。
高原なら47 + 4 = レベル51まで、ステータス変動成功判定を行うことになる。
後の処理手順もだいたい敵の時と同じで、計算後に書き込むアドレスが、味方1人目なら、
$00:1C34 | 力(現在値) |
|---|---|
$00:1C35 | 速(現在値) |
$00:1C36 | 体(現在値) |
$00:1C37 | 知(現在値) |
$00:1C38 | LV(現在値) |
に変わることになる。
処理は$C1/D7BAまで。
次ページでは、ステータス変動後の復元処理について説明する。