ボスまでの道のり

GARUDAは、ステージの終わりにボスが待っていて、ボスを倒すとLVアップという見た目になっていますが、
内部的にはボスはステージ最初に既に生成されており、ボスの生成でLVアップというロジックにしています。
今回は、その辺を解説。


ボスは、ゲーム中かどうかも無関係で、未発生であれば発生するという生成ルールになっています。
(自機はゲームスタート時に発生、敵雑魚は乱数を含めた諸条件によって発生)
したがって、ボスは、プログラム実行開始時やステージ最初の1フレーム目で必ず生成されます。
これを利用して、ボスの生成時にLVを1加算、ということをやっています。
つまり、ゲームスタート時のLVは0なのですが、すぐにボス生成となってLVに1加算されてLV1。
以降、ボスが倒されると即ボス生成となるので、LVがあがります。
ステージLVアップのときにLV+という処理はどうやっても必要なのですが、LV加算のためだけに
破壊されたキャラクターがボスかどうかをチェックするよりは、「ボスを生成する」という既存の
ロジックでやる方が、新たな判定が不要なのでサイズを減らせるというのが、こうした理由。
また、初期化時も、LV=1とするよりは lpoke LV として0に初期化した方が4バイト得します。
そして、もう一つの理由が、次に説明するボス出現までの道のりゲージの仕組みにあります。


ボスはステージ最初に生成されていますが、▲が道のりゲージの天辺に到達するまでいったい
何をやっているのでしょう。
以前、中ボスの説明のところで
>ゲーム中のキャラクターは1つの2次元配列 dim ev,8,256 で情報を管理しています。
>この配列は1キャラあたり8個の整数型変数(32バイトの連続領域)を使えるように割当てが決まっています。
>使い道は順に、キャラクターの状態カウンタ、X座標、Y座標、向き、速度、属性値、耐久値、点数。
と書いています。
自機を含めたすべてのキャラは、状態カウンタ(以降、状態値と書きます)によって、発生しているか、
未発生かを制御しています。未発生でないとき、状態値は通常は1フレームごとに1減ります。

0 1〜120 121〜1400 1401〜3980 3981〜
状態 未発生 爆発中 画面外へ退避 活動中 待機


ボス生成時の状態値は6000としています。3980に下がっていくまで画面外で待機です。
待機状態では、弾の発射も移動も表示もされません。状態値が減算されるだけです。
このボスの長い待機の間は、雑魚や中ボスとだけ戦う「ボスまでの道のり」状態にあるわけです。
ということは、ボス出現までの道のりゲージ表示には待機中の状態値の変化を利用すれば十分で、
専用のカウンターは要らなくなります。
コーディング上は、4000以上は道のりゲージ(Y座標=状態値/5-715 の位置に赤▲)を表示します。
状態値4000未満はボス耐久ゲージとして、480-耐久値の高さまで赤でBOXF表示しています。


ボスの状態値については、もう一つ仕掛けがあります。
通常のキャラクターは状態値1400以下になると、画面外で消滅してもらうために、そのときの向きで
まっすぐ画面外へ移動します。弾を撃たず、反射も、誘導も行わないようにしています。
GARUDAではボスは逃げない設定のため、状態値が1400以下になるとちょっとまずいわけです。
ということで状態値が1800未満(1799)になったら倍の3598に強制的に戻し、ループさせています。
値のループというと、通常は A+B:A\B のような処理で、Aが0以上B未満 になるように制限するところ
なのですが、B以上の値を持つ必要がある今回の用途には使えません。
かといって、IF A<1800 :A=3598 とそのまま書くのもサイズが無駄。
実は、この動作は、A<<=(A<1800) という式を使って実現しています。AXにして20バイト分。
比較の式、A<1800 の値は、Aが1800未満なら1で、そうでないときは0です。
A<<=xはAに対するビットシフト演算の自己代入で、A<<=1はAを2倍(Aが正の場合)し、A<<=0なら変化ありません。
というわけで、Aが1799になると、倍の3598に戻されるわけです。
A*=((A<1800)+1) や A+=((A<1800)*1799) でも同じことができますが、これらは28バイト。