TOP > プログラミング関係解説&調査 > キューブのバッテリーの判定

「逃げる」「テレポート」のフラグ

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

「テレポート」失敗時の飛び先の確率計算については既にテレポートの仕様解説で紹介している。
ここではもう少し踏み込んで、

  • 近未来編・最終編で、「テレポート」が失敗するタイミング(フラグ)は?
  • ついでに、最終編での「逃げる」「テレポート」回数のカウント方法は?

このあたりを紹介する。

近未来編も最終編も、「テレポート」が必ず成功するタイミングがある。
近未来編なら、筑波研究所内の戦闘や、無法松がパーティにいる時には「テレポート」が失敗しない。
最終編なら、「心のダンジョン」に飛んでからや、ヘッドプラッカー戦での「テレポート」、「逃げる」または「テレポート」累計が95~100回の間、つまり逃げた後にデスプロフェット関係のセリフが入ったり、デスプロフェット戦に強制移行する時である。

これらの解説の前に、各シナリオにおけるシナリオ進行フラグについて説明する。

シナリオ進行フラグ

各シナリオには進行度合いにより多数のフラグが存在している。
フラグは[$00:1200][$00:12FF]の256ヶ所のメモリアドレスで管理されている。
ストーリーの進行度合いであるから、もちろんセーブデータにも記録される。
フラグがONなら$01、OFFなら$00が入る。
シナリオ毎に異なるため、シナリオ開始時はすべて$00で埋まっていて、ストーリーの進行度合いなどによって変更される。
ただし一部フラグはシナリオで共通していることがある。
今回でいえば、戦闘中に「逃げる」ではなく「テレポート」コマンドを選択したかどうか、というフラグが該当する。
メモリのアドレス位置は[$00:12F7]で、「テレポート」コマンドを選択した直後に$01が入るようになっている。

筆者はどれが何のフラグか、全て確認はしていないが、今回の解説で関係してくるフラグを以下で紹介する。
シナリオ開始時は$00が入っているが、説明の条件を満たすと$01が入る。条件次第で、$00$01が切り替わる場合もある。

近未来編フラグ

アドレス条件
[$00:121D]カズ誘拐イベント発生直後、港マップに切り替わったタイミング以降。
[$00:122C]カズ誘拐イベントで港の敵とのバトルを終え、会話イベントが終わり無法松とカズが港から出ていったタイミング。
[$00:1234]無法松がパーティに加わる。筑波研究所クリア後も$01のまま。
[$00:1247]筑波研究所クリア後に、酒場に居る無法松の心を読んでから全体マップに出て、チビッコハウスで火災が発生する。
[$00:1271]筑波研究所入口で「そんなモンねー」と答えて黒フクとのバトルに入る、かつ筑波研究所内に居る(出ると$00)。液体人間W1号撃破後にチビッコハウス内で行動可能になってからは$00

最終編フラグ

アドレス条件
[$00:1207]アキラがパーティにいる(アキラ主人公ならファミリオ村で行動可能になった直後に$01)。
[$00:127D]デスプロフェットとの戦闘勝利時(経験値計算やアイテム入手計算のタイミング)。
[$00:12F6]心のダンジョンに到着する。
[$00:12F7]「逃げる」ではなく「テレポート」コマンドを選択した直後から$01。アキラが戦闘不能などで「テレポート」コマンドが使えない時は$00

本作に詳しい方なら、上のフラグを見ただけで、どんな条件で「テレポート」成功・失敗が起きるかだいたいわかるだろう。
また、フラグの判定の順序も重要である。
各シナリオ毎に説明する。

判定

近未来編

「テレポート」コマンドを実行すると以上の順で判定を行う。
条件を満たしている時は次へ進み、そうでない場合は判定を抜け、テレポート成功・失敗判定が行われない。
最後まで進めばテレポート成功・失敗判定が開始になる。

  1. [$00:1234]の値が$00(無法松が筑波研究所でパーティに加わる前)
  2. [$00:1271]の値が$00(筑波研究所入口で黒フクとのバトルに突入していない、または突入していても筑波研究所にはいない、または液体人間W1号撃破後)
  3. [$00:12F7]の値が$01(「テレポート」コマンド使用)
  4. [$00:1247]の値が$00(チビッコハウスで火災が発生するより前)
  5. [$00:121D]の値が$00(カズ誘拐イベント発生)、または[$00:121D]の値が$01かつ[$00:122C]の値が$00(カズ誘拐イベント発生後、港での戦闘を終えて無法松とカズが港から出ていく前)
  6. テレポート成功・失敗判定

実際にはアキラが戦闘不能などで「テレポート」コマンドが使えず「逃げる」コマンドになっている時にも、2. までの判定はするようだが、3. で「テレポート」コマンドを使ったかどうかの判定があるため、「テレポート」用の判定手順と考えていただいて差し支えない。

また、[$00:121D](カズ誘拐イベント発生)の判定は更に分岐がある。
要するに「カズ誘拐イベントが起きてから解決するまで」は次の判定には進まず、テレポート成功・失敗判定は起こらないという処理が5. で起きている。
[$00:121D]のカズ誘拐イベント発生フラグは、ここで$01が立つと、近未来編終了まで立ったままである。
カズ誘拐イベントが終了したことは、別途[$00:122C]で$01を立てることで判断している。
ただ、[$00:121D]に入っている値が$00なら、[$00:122C]の確認を続けてする必要はないので、6. の判定は[$00:121D]が$01の時しか発生しない。
要するに、

[$00:121D][$00:122C]状況
$00$00カズ誘拐イベント発生前
$01$00カズ誘拐イベント発生中
$01$01カズ誘拐イベント終了

ということである。イベントの進行上、$00$01の順でフラグが立つことはない。

以上の判定をまとめると、戦闘で「テレポート」を使った時にテレポート成功・失敗判定が発生しないのは、以下の条件である。

  • カズ誘拐イベントが発生してから、港での戦闘を終えて無法松とカズが港から出ていくまで
  • 筑波研究所内の戦闘
  • 無法松がパーティに居る

[$00:1247]は、最終盤のチビッコハウスでの火災発生でフラグが立つが、これより後はアキラ本人ではなくブリキ大王での戦闘しかないため、「テレポート」コマンド自体が戦闘で選べない。
結果としてフラグ判定する必要がないようにも思えるが、何かしらの意味があっての判定であろうから、例えばゲーム開発中はこの時点でも全体マップでザコ戦が発生するようにしていたのかもしれない。

最終編

最終編はテレポートのみならず、100回逃げることでデスプロフェットが出現することや、ボス敵であるヘッドプラッカーからも「逃げる」または「テレポート」が可能であることから、「逃げる」または「テレポート」後の処理は「テレポート」の話だけではなく、他もまとめて紹介しておく。
上に、最終編フラグの中で4種類が関わると説明をしたが、他にも重要な数値がある。

逃げた回数

[$00:11F6]には、戦闘から逃げた回数が記録される。
逃げた回数にカウントされない戦闘もあるが、「100(16進数$64)まで増加したらデスプロフェット戦に入る」フラグのためのアドレスである。

[$00:0200]

[$00:0200]には通常、「マップ上でキャラクターを移動させることが可能」の時に$00、それ以外(戦闘含め)に$01以上が入る。
だが最終編では、逃げることが可能なザコ戦だと$00が入ったままのようである。
ボス戦などイベント戦闘では$01、それ以外のザコ戦は$00、と異なる値が入るようになっている。

以上から、最終編で「逃げる」または「テレポート」コマンドを実行すると以上の順で処理・判定を行う。
条件を満たしている時は次へ進み、そうでない場合は判定を抜けて専用の処理を行う。

  1. [$00:0200]の値が$00である(ヘッドプラッカー戦ではない)
  2. [$00:127D]の値が$00である(デスプロフェットを撃破していない)
  3. [$00:11F6](デスプロフェット戦用の逃げる回数)を+1する
  4. [$00:11F6]の値が$64(10進数100)ではない
  5. [$00:11F6]の値が$63(10進数99)ではない
  6. [$00:11F6]の値が$62(10進数98)ではない
  7. [$00:11F6]の値が$61(10進数97)ではない
  8. [$00:11F6]の値が$60(10進数96)ではない
  9. [$00:11F6]の値が$5F(10進数95)ではない
  10. [$00:1207]の値が$01(アキラがパーティにいる)
  11. [$00:12F7]の値が$01(「テレポート」コマンド使用)
  12. [$00:12F6]の値が$00(心のダンジョンに行ったことがない)
  13. テレポート成功・失敗判定

9. までは、「逃げる」「テレポート」どちらも共通の処理である。
4. で[$00:11F6]$64の場合は、言うまでもなくデスプロフェット戦に強制突入である。
5. ~9. の分岐では、「デスプロフェット戦用の逃げる回数」によって、逃げた後にデスプロフェットの警告セリフが変更されることになる。

10. からが「テレポート」専用の判定である。最後まで進めばテレポート成功・失敗判定が開始になる。

以上をまとめると、

  • ヘッドプラッカー戦では「逃げる」「テレポート」を行っても、「デスプロフェット戦用の逃げる回数」が加算されない。「心のダンジョン」に飛んでいない場合、「心のダンジョン」に飛ぶこともない。
  • 「心のダンジョン」に飛んでいない、かつ、「デスプロフェット戦用の逃げる回数」が95~99回の時に「テレポート」しても、「心のダンジョン」に飛ぶことはない。

また、上の処理順序から、デスプロフェットを撃破した後、つまり[$00:11F6]の値が$64(10進数100)に達したら、それ以降はどれだけ逃げても、[$00:11F6]の値が増えることはないということもわかる。

サブルーチン

実際のゲームプレイでは以上がわかれば充分だが、おまけで実際のプログラムも紹介しておく。
といってもフラグチェックばかりであり、大半はループ処理の一部分である。
以下ではフラグでの分岐だけ抜粋したが、その間はシナリオ進行フラグ[$00:1200][$00:12FF]のどれを呼び出すかのアドレス位置の計算である。

近未来編


$C0/21F4 LDA $00,x  [$00:1234]   ;[$00:1234](無法松が筑波研究所でパーティに加わると$01)
$C0/21F6 BEQ $0E    [$2206]      ;ゼロフラグが立っているとき[$2206]分岐
$C0/2206 LDY $30    [$00:0030]   ;
;(中略)
$C0/2730 LDA $00,x  [$00:1271]   ;[$00:1271](筑波研究所での戦闘だと$01)
$C0/2732 BEQ $06    [$273A]      ;ゼロフラグが立っているとき[$273A]分岐
;(中略)
$C0/2730 LDA $00,x  [$00:12F7]   ;[$00:12F7](「テレポート」コマンド使用で$01)
$C0/2732 BEQ $06    [$273A]      ;ゼロフラグが立っているとき[$273A]分岐
;(中略)
$C0/2730 LDA $00,x  [$00:1247]   ;[$00:1247](チビッコハウスで火災発生以降$01)
$C0/2732 BEQ $06    [$273A]      ;ゼロフラグが立っているとき[$273A]分岐
;(中略)
$C0/21F4 LDA $00,x  [$00:121D]   ;[$00:121D](カズ誘拐イベント発生以降$01)
$C0/21F6 BEQ $0E    [$2206]      ;ゼロフラグが立っているとき[$2206]分岐→★
$C0/21F8 BRA $04    [$21FE]      ;キャリーフラグが立っていないとき[$21FE]分岐
$C0/21FE INY                     ;
;(中略)
$C0/21FA LDA $00,x  [$00:122C]   ;[$00:122C](カズ誘拐イベントで港の敵を撃破すると$01)
$C0/21FC BNE $08    [$2206]      ;ゼロフラグが立っていないとき[$2206]分岐
$C0/2206 LDY $30    [$00:0030]   ;(★→$C0/21F6でゼロフラグが立った時のジャンプ先)
$C0/2208 BRL $F996  [$1BA1]      ;フラグにかかわりなく常に分岐[$1BA1]
;(中略、テレポート成功・失敗判定へ)

フラグの判定はゼロフラグが立っているかどうかである。
フラグ判定の度に、次のフラグ呼び出し先アドレスを計算してループ処理の繰り返しになる。
[$00:121D]の値の判定だけ、ゼロフラグが立ったら次の[$00:122C]の判定はスキップされる。
最後まで進むとテレポート成功・失敗判定の乱数計算に進む。

最終編


$C0/071B LDA $0200  [$00:0200]   ;Aに[$00:0200](雑魚戦は$00、ヘッドプラッカー戦だと$01)をロード
$C0/071E BEQ $26    [$0746]      ;ゼロフラグが立っているとき[$0746]分岐
$C0/0720 CMP #$FF                ;
$C0/0722 BNE $0F    [$0733]      ;
$C0/0733 RTS                     ;テレポート成功・失敗判定を抜ける
;(中略)
$C0/0746 LDA $010F  [$00:010F]   ;$C0/071Eでゼロフラグが立った時の分岐先
;(以降、判定が続く。中略)
;
$C0/2730 LDA $00,x  [$00:127D]   ;[$00:127D](デスプロフェットを撃破したら$01)
$C0/2732 BEQ $06    [$273A]      ;ゼロフラグが立っているとき[$273A]分岐
;(中略)
;
;ここから「逃げる」回数関係
$C0/263E LDA #$01                ;Aに$01をロード
$C0/2640 BRA $10    [$2652]      ;フラグにかかわりなく常に分岐[$2652]
$C0/2652 STA $30    [$00:0030]   ;A(=$01)を[$00:0030]に書き込み
;(中略)
$C0/2664 LDA $00,x  [$00:11F6]   ;Aに[$00:11F6](逃げる回数)をロード
$C0/2666 CLC                     ;キャリーフラグクリア
$C0/2667 ADC $30    [$00:0030]   ;[$00:11F6]+[$00:0030]($01)
$C0/2669 STA $00,x  [$00:11F6]   ;Aを[$00:11F6]に書き込み(逃げる回数更新)
$C0/266B BRL $F533  [$1BA1]      ;フラグにかかわりなく常に分岐[$1BA1]
;(中略)
$C0/2704 LDA $00,x  [$00:11F6]   ;Aに[$00:11F6](逃げる回数)をロード
$C0/2706 CMP $8E01,y[$7F:CFA9]   ;Aと[$7F:CFA9](=$64)を減算比較
$C0/2709 BNE $07    [$2712]      ;
;(中略)
$C0/2704 LDA $00,x  [$00:11F6]   ;Aに[$00:11F6](逃げる回数)をロード
$C0/2706 CMP $8E01,y[$7F:D017]   ;Aと[$7F:D017](=$63)を減算比較
$C0/2709 BNE $07    [$2712]      ;ゼロフラグが立っていないとき[$2712]分岐
;(中略)
$C0/2704 LDA $00,x  [$00:11F6]   ;Aに[$00:11F6](逃げる回数)をロード
$C0/2706 CMP $8E01,y[$7F:D027]   ;Aと[$7F:D027](=$62)を減算比較
$C0/2709 BNE $07    [$2712]      ;ゼロフラグが立っていないとき[$2712]分岐
;(中略)
$C0/2704 LDA $00,x  [$00:11F6]   ;Aに[$00:11F6](逃げる回数)をロード
$C0/2706 CMP $8E01,y[$7F:D037]   ;Aと[$7F:D037](=$61)を減算比較
$C0/2709 BNE $07    [$2712]      ;ゼロフラグが立っていないとき[$2712]分岐
;(中略)
$C0/2704 LDA $00,x  [$00:11F6]   ;Aに[$00:11F6](逃げる回数)をロード
$C0/2706 CMP $8E01,y[$7F:D047]   ;Aと[$7F:D047](=$60)を減算比較
$C0/2709 BNE $07    [$2712]      ;ゼロフラグが立っていないとき[$2712]分岐
;(中略)
$C0/2704 LDA $00,x  [$00:11F6]   ;Aに[$00:11F6](逃げる回数)をロード
$C0/2706 CMP $8E01,y[$7F:D057]   ;Aと[$7F:D057](=5F)を減算比較
$C0/2709 BNE $07    [$2712]      ;ゼロフラグが立っていないとき[$2712]分岐
;「逃げる」回数処理ここまで
;(中略)
$C0/2730 LDA $00,x  [$00:1207]   ;[$00:1207](アキラがパーティにいると$01)
$C0/2732 BEQ $06    [$273A]      ;ゼロフラグが立っているとき[$273A]分岐
;(中略)
$C0/2730 LDA $00,x  [$00:12F7]   ;[$00:12F7](「テレポート」コマンド使用で$01)
$C0/2732 BEQ $06    [$273A]      ;ゼロフラグが立っているとき[$273A]分岐
;(中略)
$C0/2730 LDA $00,x  [$00:12F6]   ;[$00:12F6](心のダンジョンに行ったことがない場合$01)
$C0/2732 BEQ $06    [$273A]      ;ゼロフラグが立っているとき[$273A]分岐
;(中略、テレポート成功・失敗判定へ)

最初にヘッドプラッカー戦かどうか判定をして、ヘッドプラッカー戦なら逃げる回数の変動もテレポート判定も行わない。
ついでデスプロフェット撃破済みかを判定し、撃破していない場合は現在の逃げる回数が99回以下ということなので、逃げる回数が記録された[$00:11F6]+1する。
その先は逃げる回数95~100回の時用のループ処理。ここでループ処理を抜ける場合、テレポート判定はなし。つまり、デスプロフェットがカウントダウンしている間だと、心のダンジョンに飛ぶことはない。
以降の処理は近未来編と似たようなループ処理になり、ゼロフラグが立っているかどうかでの分岐で、最後まで処理が続けばテレポート成功・失敗判定の乱数計算に進む。

なお、「心のダンジョン」に飛ぶことが決まった場合、心のダンジョンに行ったかどうかのフラグ[$00:12F6]の値が$01になる他に、[$00:12D1]または[$00:12D2]の値がチェックされる。
この値は何なのかというと、[$00:12D1]~には「心のダンジョン」の各宝箱が開いているかどうかのフラグが記録されており、[$00:12D1]が「悪夢のヘルメット」で、[$00:12D2]が「血の魔装」に対応している。
「心のダンジョン」に飛ぶ場合は、「心のダンジョン」のマップがロードされるが、その際に宝箱の状態を描画しなければならないため、「心のダンジョン」内の飛び先によりどちらかをチェックすることになる。
シナリオ進行フラグ[$00:1200][$00:12FF]には、単純にストーリーの進行状況だけでなく、これら拾えるアイテムの取得状況もすべて記録されている、ということである。
中世編から最終編にかけてのルクレチア城・魔王山の宝箱獲得状況は、該当箇所のフラグがシナリオをまたいで引き継がれることになる。



このページをシェアする

上へ