TOP > プログラミング関係解説&調査 > ざき3戦目の仕様

ざき3戦目の仕様

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

原始編におけるざきとの戦闘の3回目、つまりラストバトル前のポゴとの一騎打ちは、本作において特殊な仕様となっている。

  • ポゴの攻撃がざきに4回命中すると、「???????????????」と画面上メッセージウィンドウに表示されて戦闘が強制終了する。
  • ざきの残りHPは関係なく、残りHPを0にしても戦闘は終了しない。
  • 4回目の戦闘中、攻撃時にざきに「ばりぶる~ん」の反撃が出せる位置から攻撃すると、反撃で「ばりぶる~ん」を出すモーションだけ表示されてから戦闘が強制終了する。

以上から、この戦闘のみ、ざきのHPの計算方法が特殊であること、ポゴの攻撃回数をカウントしていること、ざきのステータスやフラグが戦闘をまたいで一部引き継ぎになっているであろうことが推測できる。
実際の処理は以下のようになっているが、ダメージ計算式の解説ダメージフィールドの敵へのダメージ量から残りHPを算出する処理と、反撃関係の処理も参照していただきたい。

なお、反撃の「ばりぶる~ん」の件は世界の合言葉は森部様に以下のように書かれている。以下引用。

ざき3戦目で4発目を前方から攻撃すると、
反撃ばりぶる~んが出るタイミングで戦闘が終了し、
おーでぃーおー戦でざき参戦時に反撃ばりぶる~んをおーでぃーおーに当てる。

「ばりぶる~ん」の反撃属性は手/足/鋭/鈍/飛/火/水なので、ポゴがこれらの属性で4回目の攻撃を行うと、ざきは「ばりぶる~ん」のモーションだけ出して戦闘が終了するのだが、実はその後のおーでぃーおー戦冒頭でざきが反撃の「ばりぶる~ん」を出すのは、
『ゲーム開始時からざき3戦目までに戦闘を行っている場合、敵が何かの技を出し、かつその戦闘後にメニュー画面を開いていない』
『ざき3戦目でポゴがざきから攻撃を食らっていない』
『ざき3戦目の最後にポゴからの攻撃で反撃の「ばりぶる~ん」のモーションのみ出ている』
という状況下のみである。
なお、この戦闘において、ざきが出せる反撃技は「ばりぶる~ん」のみである。反撃モーションだけ見せて戦闘が終わる場合、該当技は「ばりぶる~ん」のみとなっている。

これらの理由についても、この先説明していく。

ざき3戦目について

まず、ポゴが何らかの攻撃技で攻撃し命中した後の処理を見ていく。
ポゴが攻撃モーションを行った直後、命中時のモーション直前あたりの処理が以下のようになっている。
この戦闘は味方キャラ1人、敵1人だから、敵種類1、敵番号0でアドレスを見ていく。

$C1/CCA5 REP #$20                ;Aを16bit幅に変更、Mフラグをクリア
$C1/CCA7 LDA $7E8F00,x[$7E:AA00] ;Aに[$7E:AA01][$7E:AA00](ざきの現在HP)をロード
$C1/CCAB SEC                     ;キャリーフラグON
$C1/CCAC SBC $7E9200,x[$7E:AD00] ;A - [$7E:AD01][$7E:AD00](ポゴが与えたダメージ量)
$C1/CCB0 BCS $03    [$CCB5]      ;キャリーフラグが立っているとき[$CCB5]分岐
$C1/CCB2 LDA #$0000              ;Aに$0000をロード
$C1/CCB5 JSR $CE70  [$C1:CE70]   ;[$C1:CE70]へジャンプ

$C1/CE70 STA $20    [$00:0320]   ;Aを[$00:0320]に書き込み
;(中略)
$C1/CE87 LDA $20    [$00:0320]   ;Aに[$00:0320](残りHP)をロード
$C1/CE89 RTS                     ;サブルーチン戻り

$C1/CCB8 STA $7E8F00,x[$7E:AA00] ;A(残りHP)を[$7E:AA01][$7E:AA00](現在HP)に書き込み
$C1/CCBC TAY                     ;Aレジスタの値をYレジスタに転送
$C1/CCBD SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/CCBF JSR $0C14  [$C1:0C14]   ;[$C1:0C14]へジャンプ

直前までダメージ量や行動ポイントの計算をしているが、そのあたりの処理は省略。
ポゴがざきを攻撃した時の総ダメージ量は、2バイトの容量で[$00:0321][$00:0320][$7E:AD01][$7E:AD00]とコピーされている。
敵種類1、敵番号0にあたるざきの現在HPは[$7E:AA01][$7E:AA00]に入っており、$C1/CCACで、「現在HP - ダメージ量」を計算している。
つまりダメージをくらった後のざきの残りHPの計算であるが、ダメージ量が現在HP以上だと、計算結果が0以下になってしまうため、$C1/CCB0でキャリーフラグで分岐し、減算結果が負の値ならA$0000をロードする。
ダメージ量が現在HP以上なら、現在HPを0にする処理ということになる。
$C1/CE70$C1/CE89はフィールドダメージ処理でも共通部分。
結局は計算したざきの残りHPが$C1/CCB8[$7E:AA01][$7E:AA00](現在HP)に書き込まれることになる。

つまり、ざき3戦目においても、通常通りにざきの残りHP計算を行っているし、ポゴの攻撃でざきのHPを0以下にした時、ざきのHPを0としている。
ただ、ここまではあくまでも計算の途中である。
続きの$C1:0C14以降の処理が肝になる。

$C1/0C14 LDA $0A00  [$00:0A00]   ;Aに[$00:0A00](シナリオID)をロード
$C1/0C17 CMP #$01                ;Aと$01を減算比較(ステータスレジスタ変更のみ)
$C1/0C19 BNE $0E    [$0C29]      ;ゼロフラグが立っていないとき[$0C29]分岐
$C1/0C1B LDA $0040  [$00:0040]   ;Aに[$00:0040]をロード
$C1/0C1E CMP #$A8                ;Aと$A8を減算比較(ステータスレジスタ変更のみ)
$C1/0C20 BNE $07    [$0C29]      ;ゼロフラグが立っていないとき[$0C29]分岐
$C1/0C22 LDA $0041  [$00:0041]   ;Aに[$00:0041]をロード
$C1/0C25 AND #$03                ;Aと$03で論理積
$C1/0C27 CMP #$03                ;Aと$03を減算比較(ステータスレジスタ変更のみ)
$C1/0C29 RTS                     ;サブルーチン戻り

ここがざき3戦目用の処理である。
$C1/0C14$C1/0C19で、シナリオIDが$01かどうかを判定しているが、シナリオIDが$01なのは原始編である。
その後は更に、[$00:0040][$00:0041]の値を判定しているが、このあたりはシナリオ進行と戦闘背景関係のメモリアドレスなので(詳細は未調査)、ざき3戦目かどうかの判定になる。
上の値から[$00:0040] = $A8[$00:0041] = $03の時のみ$C1/0C29まで進むことがわかる。
また、$C1/0C29の時点でゼロフラグが立っている。

$C1/CCC2 BNE $12    [$CCD6]      ;ゼロフラグが立っていないとき[$CCD6]分岐
$C1/CCC4 REP #$20                ;Aを16bit幅に変更、Mフラグをクリア
$C1/CCC6 PHY                     ;Yをスタックへプッシュ
$C1/CCC7 LDY $0002,x[$00:1B02]   ;Yに[$00:1B03][$00:1B02](敵番号0アドレス呼び出し)をロード
$C1/CCCA LDA $0010,y[$00:1A10]   ;Aに[$00:1A11][$00:1A10](敵種類1のHP)をロード
$C1/CCCD STA $7E8F00,x[$7E:AA00] ;Aを[$7E:AA01][$7E:AA00](現在HP)に書き込み
$C1/CCD1 PLY                     ;Yレジスタにスタックからプル
$C1/CCD2 SEP #$20                ;MフラグON Aレジスタは8bit幅
$C1/CCD4 BRA $2D    [$CD03]      ;フラグにかかわりなく常に分岐[$CD03]
$C1/CD03 LDA #$FF                ;Aに$FFをロード
$C1/CD05 RTS                     ;サブルーチン戻り

$C1/0C29のサブルーチンの戻り先$C1/CCC2で、ゼロフラグ判定がある。
$C1/0C29から戻った時点でゼロフラグが立っているのは、ざき3戦目のみになるから、ざき3戦目のみ$C1/CCC4~の処理を行う。
処理自体はシンプルであり、$C1/CCCAで敵種類1のHP、つまりざきの最大HP[$00:1A11][$00:1A10]を呼び出し、$C1/CCCDでざきの現在HP[$7E:AA01][$7E:AA00]に書き込む、というだけである。
ここまでの処理でざきのHPが0になっていようが、問答無用でざきの最大HPをざきの現在HPに上書きするのである。
つまり、この戦闘において、ざきのHPは実質満タンのまままったく減らないことになる。
これが、ざき3戦目では、ざきの残りHP以上のダメージを与えても倒せない仕組みである。

残りHP以外に回復するステータスなどはなく、通常通りの処理が行われるため、ざきを状態異常などにすることはできるし、ざきも通常通りに行動してくる。もちろん反撃してくる条件を満たせば反撃技も出してくる。

更に、ポゴの攻撃が命中したモーションの後、もう一度判定がある。

$C1/0C14 LDA $0A00  [$00:0A00]   ;Aに[$00:0A00](シナリオID)をロード
$C1/0C17 CMP #$01                ;Aと$01を減算比較(ステータスレジスタ変更のみ)
$C1/0C19 BNE $0E    [$0C29]      ;ゼロフラグが立っていないとき[$0C29]分岐
$C1/0C1B LDA $0040  [$00:0040]   ;Aに[$00:0040]をロード
$C1/0C1E CMP #$A8                ;Aと$A8を減算比較(ステータスレジスタ変更のみ)
$C1/0C20 BNE $07    [$0C29]      ;ゼロフラグが立っていないとき[$0C29]分岐
$C1/0C22 LDA $0041  [$00:0041]   ;Aに[$00:0041]をロード
$C1/0C25 AND #$03                ;Aと$03で論理積
$C1/0C27 CMP #$03                ;Aと$03を減算比較(ステータスレジスタ変更のみ)
$C1/0C14 RTS                     ;サブルーチン戻り
;
$C1/0C2D BNE $1B    [$0C4A]      ;ゼロフラグが立っていないとき[$0C4A]分岐
$C1/0C2F LDX #$1B00              ;Xに$1B00をロード
$C1/0C32 LDA $7E9003,x[$7E:AB03] ;Aに[$7E:AB03](ざきへのヒット数)をロード
$C1/0C36 BEQ $12    [$0C4A]      ;ゼロフラグが立っているとき[$0C4A]分岐
$C1/0C38 LDA $7E9100[$7E:9100]   ;Aに[$7E:9100](ざきへの攻撃回数)をロード
$C1/0C3C INC A                   ;Aをインクリメント +1
$C1/0C3D STA $7E9100[$7E:9100]   ;Aを[$7E:9100](ざきへの攻撃回数)に書き込み
$C1/0C41 CMP #$04                ;Aと$04を減算比較(ステータスレジスタ変更のみ)
$C1/0C43 BNE $05    [$0C4A]      ;ゼロフラグが立っていないとき[$0C4A]分岐
;ゼロフラグON(攻撃4回目)
$C1/0C45 LDA #$55                ;Aに$55をロード
$C1/0C47 STA $047E  [$00:047E]   ;Aを[$00:047E]に書き込み
;処理合流
$C1/0C4A RTS                     ;サブルーチン戻り

$C1/0C14$C1/0C14は先に紹介したのとまったく同じ処理で、ざき3戦目のみゼロフラグがONになる。
その後の$C1/0C2Dからだが、ゼロフラグが立つざき3戦目のみ$C1/0C2Fに進む。
更に、[$7E:AB03]をロードしているが、これは敵番号0に攻撃した時の被ヒット数である。
ざきへの攻撃が命中していれば1ヒット以上なので、$C1/0C36でゼロフラグは立たず次の処理に進む。
そこでは[$7E:9100]をインクリメント(+1)する処理が入るが、この戦闘において[$7E:9100]にはざきへの攻撃回数が入っている(戦闘開始時は$00を入れる処理が入っている)。
つまり、ざきを攻撃し命中したらカウントアップするアドレスで、これでざきへの攻撃回数を判定できる。
$C1/0C41$04との減算比較でゼロフラグ判定であるから、4回攻撃したかどうかで分岐になる。
4回目の攻撃直後であれば$C1/0C45$C1/0C47[$00:047E]$55を書き込み、それ以外は何もせずサブルーチンが終わる。

ここから、[$00:047E]の値でざき3戦目を強制終了させるかどうかが決まることがわかる。
[$00:047E]は戦闘開始時に$00が書き込まれており、ざき3戦目では上のタイミングで$55が書き込まれるようになっている。

この後、[$00:047E]の値で分岐が起こるのは以下のサブルーチンである。

$C1/014C LDA $047E  [$00:047E]   ;Aに[$00:047E]をロード
$C1/014F BMI $66    [$01B7]      ;ネガティブフラグが立っているとき[$01B7]分岐
;ネガティブフラグOFF
$C1/0151 BEQ $0C    [$015F]      ;ゼロフラグが立っているとき[$015F]分岐
;ゼロフラグOFF
$C1/0153 CMP #$55                ;Aと$55を減算比較(ステータスレジスタ変更のみ)
$C1/0155 BNE $14    [$016B]      ;ゼロフラグが立っていないとき[$016B]分岐
;ゼロフラグON
$C1/0157 JSR $256E  [$C1:256E]   ;[$C1:256E]へジャンプ

[$00:047E]の値の判定になる。
$C1/014Fでネガティブフラグ判定、つまり$80以上かどうかの判定があるため、他の戦闘で[$00:047E]$80以上の値を入れる何かしらの処理があると思われるが、未確認。
$55が入っている場合はネガティブフラグは立たないので次に進む。
$C1/0151はゼロフラグ判定で、通常の戦闘では最初に[$00:047E]$00が書き込まれてから特に何かの値が入ることはないので、ここでゼロフラグ分岐となり[$015F]へジャンプ、$C1/0153以降の処理を抜ける。
次で$55かどうか判定を行っているから、ここがざき3戦目で4回ざきに攻撃を当てた場合の分岐であり、該当すれば$C1/0157$C1:256Eにジャンプする。

ちなみに$55ではない時の分岐先$C1/016Bでは$11かどうかの判定があるため、[$00:047E]$11が入る分岐もあるようだが詳細は未確認。

以上の処理のタイミングが、ざきがポゴから攻撃をくらい、反撃判定を行って、「ばりぶる~ん」が出せる場合はメッセージウィンドウに「反撃:ばりぶる~ん」の文字列表示と「ばりぶる~ん」のモーション(範囲表示)だけ行われた直後になる。
つまり、そのタイミングまでは、[$00:047E]への数値書き込み以外、通常の戦闘と同じ処理が進められていた、ということになる。
画面上でも、技の出す位置まで表示されることからわかるが、反撃を出すマスの位置(ポゴの位置)まできちんと計算をしている。
だがこの後に、地面が揺れる(画面が上下に揺れる)処理が入り、メッセージウィンドウに「???????????????」と表示されて、戦闘が強制終了する。
戦闘終了後からはイベントが始まり、ラストバトルまで続くので、プレイヤーが間に何らかの操作を行うことはできない。

ラストバトル開始時処理

味方との戦闘では、味方キャラが敵として登場する場合の戦闘開始時のステータス処理について紹介した。
ざき3戦目は、ざきは本来味方キャラとして登録されているため、味方キャラが敵として登場する場合の戦闘にあたる。
ラストバトル開始時、画面上のメッセージウィンドウにおーでぃーおーの名前が表示されてからざきが戦闘フィールドに登場するが、ざきのステータス自体は戦闘開始時に味方キャラ4人目としてセットされている。

ではなぜ、条件によってはざきが反撃の「ばりぶる~ん」をおーでぃーおーに出すことがあるのだろうか?
通常、戦闘開始時に反撃に関する処理が入ることはない。
だが、原始編ラストバトル冒頭では、直前のざき3戦目ラストでざきが反撃「ばりぶる~ん」のモーションを出した時だけ、反撃の仕様で紹介した、習得技で反撃可能かチェックするサブルーチンが、ループ処理されるようになっている。
反撃関係の処理が最初から行われるのではなく、途中の処理から開始になるという妙な手順であることと、直前の戦闘でざきが反撃「ばりぶる~ん」のモーションを出した時だけ処理が入ることから、ざき3戦目の戦闘終了処理において、反撃関係の何かしらの不具合があり、次の戦闘で反撃処理の続きが行われてしまうのだろう、ということが推測されるが、詳しい処理は筆者にはよくわからない。

本来、反撃するかどうかの判定は、

  1. 敵から攻撃を食らった時、味方キャラ番号に対応したアドレス[$7E:EA20][$7E:EA60][$7E:EAA0][$7E:EAE0]に、敵からの攻撃のヒット数を書き込む(攻撃を食らっていないキャラは$00が入る)
  2. 敵からの攻撃のヒット数が1以上の味方キャラのみ、敵からの攻撃の属性と、味方キャラが覚えている技の反撃属性が一致するか、すべての習得技を判定
  3. 味方キャラの状態異常が、反撃で出す技を出せない状態にないか判定
  4. 反撃で出せる技の範囲を1マスずつチェックし、技の範囲内に、攻撃してきた敵がいるマスがあるなら反撃を出す

という手順で進む。
ところが、原始編ラストバトル開始のタイミング(ざきが登場した直後あたり)で、上の2.の処理から反撃の判定が開始になってしまう。

ポイントは[$7E:EA20][$7E:EA60][$7E:EAA0][$7E:EAE0]の値である。
本来ならば、これらのアドレスには上の1.の処理で書き込まれた、直前の敵の攻撃のヒット数が入っているはずである。
だが、これらアドレスは、ゲームを開始した時点ではヒット数とはまったく関係のない以下の値が入る。

アドレス初期値
[$7E:EA20]$F8
[$7E:EA60]$46
[$7E:EAA0]$B4
[$7E:EAE0]$30

$7E:EA20~には、ゲーム開始時に$4F:0100あたりの値がコピーされるようである。内容は未確認)

上の値は先に説明した通り、戦闘で敵が何かの攻撃(回復技含む)を行うことにより、敵が攻撃技なら食らった時のヒット数が入り、次に何か攻撃を食らうまで変わらない。
戦闘終了しても戦闘中の値は残るが、メニュー画面を開くと上の初期値に戻る。

反撃判定時は上のアドレスの数値から、敵から攻撃をくらったかどうかを判定する。
サブルーチンでは、ゼロフラグが立つかどうかの判定である。
1以上の値が入っていれば、敵から攻撃されたと判断し、反撃判定に進む。
通常、反撃判定時には、上のアドレスに初期値の$F8, $46, $B4, $30は入っておらず、敵からの攻撃のヒット数で上書きされているので、問題なく処理されるのだが、原始編ラストバトルだけはおかしなことになる。
ざき3戦目の開始直前でゲームを開始したり、メニュー画面を開くと、[$7E:EA20]~に上の初期値が入った状態で戦闘が開始される。
更に、ざき3戦目でポゴがざきから一切攻撃をくらわずに4回攻撃を当てると、そのままラストバトルに突入する。
そして、なぜか原始編ラストバトル開始時、[$7E:EA20]~の値を参照しながら習得技で反撃可能かチェックするサブルーチンが開始になるのである(ただし味方2キャラ目から開始)。
この時、味方2キャラ目以降は、

アドレス初期値
[$7E:EA60]$46
[$7E:EAA0]$B4
[$7E:EAE0]$30

と、値が入っているから、ゴリ・べる・ざき3キャラとも「敵から1ヒット以上の攻撃をくらった状態」と判定され、3キャラとも習得技で反撃可能かチェックすることになる。
しかし、原始編の味方キャラで、反撃技を習得できる(している)キャラはざきのみである。
このため、原始編ラストバトル開始時、反撃技を出せる可能性があるのはざきのみであり、しかもおーでぃーおーとの方向・距離から、「ばりぶる~ん」しか出せない(もうひとつの反撃技「ばりききゅーん」は後方3方向にしか出せない)。

以上から、原始編ラストバトル開始時にざきが反撃の「ばりぶる~ん」を出す条件は、

[$7E:EA20][$7E:EA60][$7E:EAA0][$7E:EAE0]に、初期値の$F8, $46, $B4, $30が入っている状態で、ざき3戦目の4回目の攻撃時、「ばりぶる~ん」の反撃属性に当たる技を当てる。

ということになる。

ゲーム開始時からざき3戦目開始までに戦闘を行い、敵が何かの技を出した場合、[$7E:EA20][$7E:EA60][$7E:EAA0][$7E:EAE0]には味方側の被ヒット数が書き込まれる。
原始編終盤の戦闘だから、通常はポゴとゴリの2人パーティであり、味方3人目・4人目はいないため、[$7E:EAA0][$7E:EAE0]には必ず$00が入る。
その状態のまま、ざき3戦目に突入した場合は、[$7E:EAA0][$7E:EAE0]$00のままラストバトルなので、ざき3戦目の最後に反撃「ばりぶる~ん」が出るよう技の属性を調整しても、原始編ラストバトル開始時にざきが反撃の「ばりぶる~ん」を出さないことになる。

とはいえ、通常プレイであれば、ラストバトル前にはメニュー画面を開いて装備を確認したりセーブをするだろう。
だいたいの場合、ざき3戦目開始では[$7E:EA20][$7E:EA60][$7E:EAA0][$7E:EAE0]に初期値が入った状態ではないだろうか。
ざき3戦目は「ブンブン」の吹き飛ばしや範囲攻撃を使えばざきに一切攻撃させずに4回攻撃することもでき、4回目のみ「ばりぶる~ん」の反撃を誘うことはさほど難しくはない。
このため、原始編ラストバトル開始時、ざきが「ばりぶる~ん」を出すのを見たプレイヤーは、皆無というほどではないが少なくないと思われる。

もし、ゴリかべるが反撃技を使用可能で、ラストバトル開始時にざきのように反撃技を出してくるようなら、デバッグ時に発見されて修正されていたかもしれないが、そうではなかったのでそのまま放置されたのか、開発陣が気づかなかったのかはわからない。

なお、反撃するかどうかの判定に必要な、被攻撃技属性は、ポゴが最後にざきを攻撃した時の属性の計算値が[$00:0387][$00:0386]に入ったままである。
「ばりぶる~ん」の反撃属性は手/足/鋭/鈍/飛/火/水なので、これらの中のどれかが[$00:0387][$00:0386]に入った状態で判定を行っている。
(ポゴは水属性の技を所持しておらず、原始編の攻撃アイテムにも水属性の技がないので、実質手/足/鋭/鈍/飛/火の6種のどれかになる)
確実に「ばりぶる~ん」を発生させたいのなら真正面1マスにざきを誘導して「ボコボコ」(鈍属性)「ドカドカ」(足属性)か、正面2マスで「ブンブン」(飛属性)が無難。

サブルーチン

具体的な処理は以下の通りだが、サブルーチンについては既に反撃の仕様で説明済みなので、重要な箇所の解説を行う。
本来ならば、反撃属性チェック~習得技で反撃可能かチェック~習得技で反撃できるか確認するループ処理は、$C1/A12C$C1/A179$C1/A1BD$C1/A21Bと一連のサブルーチン内での処理である。
習得技で反撃できるか確認するループ処理は、キャラ1人目から順に判定であり、$C1/A1C4$C1/A1FFで1人分の処理なのだが、以降は$C1/A1BD$C1/A1C2の処理を入れてから$C1/A1C4$C1/A1FF、と進んでいく。
原始編ラストバトル開始時なのだが、この2人目以降の処理開始位置の$C1/A1BDの判定から判定が始まっており、味方1人目の処理が飛ばされている。
(もし味方1人目のポゴの処理が入ったとしても、ポゴも反撃技を所持していないため、反撃を行うことはないが)

;反撃処理 味方2人目 ゴリ
$C1/A1BD LDA $8D    [$00:038D]   ;Aに[$00:038D]をロード
$C1/A1BF CLC                     ;キャリーフラグクリア
$C1/A1C0 ADC #$40                ;A + $40
$C1/A1C2 BEQ $B7    [$A17B]      ;ゼロフラグが立っているとき[$A17B]分岐
$C1/A1C4 STA $8D    [$00:038D]   ;Aを[$00:038D]に書き込み
$C1/A1C6 STA $10    [$00:0310]   ;Aを[$00:0310]に書き込み
$C1/A1C8 LDA #$1C                ;Aに$1Cをロード
$C1/A1CA STA $11    [$00:0311]   ;Aを[$00:0311]に書き込み
$C1/A1CC LDX $5A    [$00:035A]   ;Xに[$00:035A]をロード
$C1/A1CE PHX                     ;Xをスタックにプッシュ
$C1/A1CF LDX $10    [$00:0310]   ;Xに[$00:0310]をロード
$C1/A1D1 STX $5A    [$00:035A]   ;Xを[$00:035A]に書き込み
$C1/A1D3 LDA $0001,x[$00:1C41]   ;Aに[$00:1C41]をロード
$C1/A1D6 BIT #$40                ;Aと$40で論理積(ステータスフラグ変更のみ)
$C1/A1D8 BEQ $22    [$A1FC]      ;ゼロフラグが立っているとき[$A1FC]分岐
$C1/A1DA LDA $7ECE20,x[$7E:EA60] ;Aに[$7E:EA60](=$46)(被ダメージのヒット数)をロード
$C1/A1DE BEQ $1C    [$A1FC]      ;ゼロフラグが立っているとき[$A1FC]分岐
;
;習得技で反撃できるか確認ループ処理(味方2人目)
$C1/A1E0 LDA $7ECD00,x[$7E:E940] ;Aに[$7E:E940+n](技ID)をロード
$C1/A1E4 BEQ $10    [$A1F6]      ;ゼロフラグが立っているとき[$A1F6]分岐
$C1/A1E6 LDA $7ECD20,x[$7E:E960] ;Aに[$7E:E960+n](技データ14 反撃属性1)をロード
$C1/A1EA AND $86    [$00:0386]   ;Aと[$00:0386]で論理積
$C1/A1EC BNE $14    [$A202]      ;ゼロフラグが立っていないとき[$A202]分岐→反撃技確定
$C1/A1EE LDA $7ECD30,x[$7E:E970] ;Aに[$7E:E970+n](技データ15 反撃属性2)をロード
$C1/A1F2 AND $87    [$00:0387]   ;Aと[$00:0387]で論理積
$C1/A1F4 BNE $0C    [$A202]      ;ゼロフラグが立っていないとき[$A202]分岐→反撃技確定
$C1/A1F6 INX                     ;Xをインクリメント +1
$C1/A1F7 TXA                     ;Xレジスタの値をAレジスタに転送
$C1/A1F8 AND #$0F                ;Aと$0Fで論理積
$C1/A1FA BNE $E4    [$A1E0]      ;ゼロフラグが立っていないとき[$A1E0]分岐
;ループここまで
;
$C1/A1FC PLX                     ;Xレジスタにスタックからプル
$C1/A1FD STX $5A    [$00:035A]   ;Xを[$00:035A]に書き込み
$C1/A1FF BRL $FFBB  [$A1BD]      ;フラグにかかわりなく常に分岐[$A1BD]

これが最初の処理、味方キャラ2人目のゴリの反撃判定にあたる。
戦闘開始直後であるから、ゴリ含め誰も攻撃を受けていないのに、$C1/A1DAでロードされる[$7E:EA60](被ダメージのヒット数)に$46が入っているため、$C1/A1DEのゼロフラグ判定が立たず、ゴリの習得技に反撃可能な技があるかを判定する処理に入ってしまう。
ヒット数が$46(10進数70)はさすがにおかしいので、$10(10進数16)以上なら分岐、のような処理も入っていれば、ここの妙な反撃判定も避けられたのだろうが。
そもそも戦闘開始時に反撃判定のサブルーチンに入ること自体が妙なので、ざきが加わる時点でサブルーチンの読み込み順に何らかの支障があったのだろう(そこまでは未確認)。

とにかく、ゴリもべるも反撃技を所持していないので反撃は行わない処理となる。べるの処理については省略する。
問題は仲間キャラ4人目のざきである。
ここではざき3戦目ラストで、ポゴが鈍属性の「ボコボコ」をざきに当て、属性判定の入るアドレス[$00:0386][$00:0387] = $0800と値が入っているものとする。
ちなみに「ばりききゅーん」も反撃属性に鈍属性が含まれるので、判定はするが、後方3方向1マス距離にしか出せないので、ざきの初期配置の都合上、ざきのすぐ右のマスにしか出せないことになり、おーでぃーおーがいないため、「ばりききゅーん」は出ない。

;反撃処理 味方4人目 ざき
$C1/A1BD LDA $8D    [$00:038D]   ;Aに[$00:038D]をロード
$C1/A1BF CLC                     ;キャリーフラグクリア
$C1/A1C0 ADC #$40                ;A + $40
$C1/A1C2 BEQ $B7    [$A17B]      ;ゼロフラグが立っているとき[$A17B]分岐
$C1/A1C4 STA $8D    [$00:038D]   ;Aを[$00:038D]に書き込み
$C1/A1C6 STA $10    [$00:0310]   ;Aを[$00:0310]に書き込み
$C1/A1C8 LDA #$1C                ;Aに$1Cをロード
$C1/A1CA STA $11    [$00:0311]   ;Aを[$00:0311]に書き込み
$C1/A1CC LDX $5A    [$00:035A]   ;Xに[$00:035A]をロード
$C1/A1CE PHX                     ;Xをスタックにプッシュ
$C1/A1CF LDX $10    [$00:0310]   ;Xに[$00:0310]をロード
$C1/A1D1 STX $5A    [$00:035A]   ;Xを[$00:035A]に書き込み
$C1/A1D3 LDA $0001,x[$00:1CC1]   ;Aに[$00:1CC1]をロード
$C1/A1D6 BIT #$40                ;Aと$40で論理積(ステータスフラグ変更のみ)
$C1/A1D8 BEQ $22    [$A1FC]      ;ゼロフラグが立っているとき[$A1FC]分岐
$C1/A1DA LDA $7ECE20,x[$7E:EAE0] ;Aに[$7E:EAE0](=$30)(被ダメージのヒット数)をロード
$C1/A1DE BEQ $1C    [$A1FC]      ;ゼロフラグが立っているとき[$A1FC]分岐
;
;習得技で反撃できるか確認ループ処理(味方3人目)
;ループ1回目~5回目省略、6回目処理
$C1/A1E0 LDA $7ECD00,x[$7E:E9C5] ;Aに[$7E:E9C5](ばりぶる~ん技ID$3A)をロード
$C1/A1E4 BEQ $10    [$A1F6]      ;ゼロフラグが立っているとき[$A1F6]分岐
$C1/A1E6 LDA $7ECD20,x[$7E:E9E5] ;Aに[$7E:E9E5](技データ14)をロード
$C1/A1EA AND $86    [$00:0386]   ;Aと[$00:0386]($08)で論理積
$C1/A1EC BNE $14    [$A202]      ;ゼロフラグが立っていないとき[$A202]分岐
;「ばりぶる~ん」と反撃属性一致
$C1/A202 STX $0B    [$00:030B]   ;Xを[$00:030B]に書き込み
$C1/A204 LDA $7ECD00,x[$7E:E9C5] ;Aに[$7E:E9C5](ばりぶる~ん技ID$3A)をロード
$C1/A208 STA $6A    [$00:036A]   ;Aを[$00:036A]に書き込み
$C1/A20A LDA $7ECD10,x[$7E:E9D5] ;Aに[$7E:E9D5](技データ08)をロード
$C1/A20E LDX $5A    [$00:035A]   ;Xに[$00:035A]をロード
$C1/A210 AND $0039,x[$00:1CF9]   ;Aと[$00:1CF9](味方キャラ4・状態異常)で論理積
$C1/A213 BEQ $04    [$A219]      ;ゼロフラグが立っているとき[$A219]分岐
$C1/A219 LDA $6A    [$00:036A]   ;Aに[$00:036A]をロード
$C1/A21B JSR $3D7A  [$C1:3D7A]   ;[$C1:3D7A]へジャンプ

本来なら被ダメージのヒット数が入る[$7E:EAE0]に初期値の$30が入っているため、習得技で反撃できるかの確認が開始になり、「ばりききゅーん」の判定時に技範囲の処理まで行うが、技範囲内におーでぃーおーがいないので反撃は出ない。
6個目の技「ばりぶる~ん」で反撃属性が一致するので、技の範囲判定に進む。
マス目計算値が入る$00:0488$00:04BEを1マスずつ判定し、射程範囲のマスにだけ$F0を書き込むが、左上位置を$00:0488として7マス区切りで数値だけ表示すると以下のようになる。
赤背景マスがざきの初期位置(左上向き)、黄色背景マスが射程、太字はおーでぃーおーがいるマス(横3マス×縦4マス)である。

$00$00$00$00$00$00$00
$00$00$00$00$00$00$00
$00$00$00$00$00$00$00
$00$F0$00$00$F0$00$00
$00$00$F0$00$F0$00$00
$00$00$00$F0$F0$00$00
$00$00$00$00$00$00$00

以上の状態を、戦闘フィールドの状態$00:04C8$00:04FEと比較して、敵がいるマスと射程マスが一致したら反撃を行う。
上の図の通り、1マスだけ($00:04C8$00:04FEに対応したアドレスでいえば$00:04E1にあたる)、おーでぃーおーのいるマスと「ばりぶる~ん」の射程が被っているので、反撃が出ることになる。

以上が、ざき3戦目~ラストバトルにおける特殊仕様の解説である。
プログラム的に見ると、ラストバトル開始時に「ばりぶる~ん」が出るのはバグの類のように思えるが、進行不能になるような致命的な問題ではない。

リメイク版では、ざき3戦目において、ざきのHPを一定値まで減らさないと強制終了しないように変更されている。
反撃における妙な挙動も起こさなくなった。
3戦目の最後に、ざきが反撃を出す属性の技で攻撃しても、反撃が出ずに戦闘が終了するようになっている。



このページをシェアする

上へ