Published on: 2021-06-11
Updated on: 2021-06-16
敵および敵弾の移動方向は、向き 16 通り、スピード 4 通りの計 64 通り。
方向は 6bit 値で表され、下位 4bit が向き、上位 2bit がスピードとなる。
敵と敵弾では各方向に対応する変位が異なる。敵は左下図のように粗い動きに、敵弾は右下図のように細かい動きになっている:
(敵弾の方は一部重複がある(0x21
と 0x31
など))
敵弾に関しては、通常のプレイではスピード 0 しか目にすることはない。弾高速化フラグを持つ敵はテュラのみだが、テュラは普通にプレイするとかなり早めに出現し、ランク上昇条件を満たさないため。
敵弾スピードの理論上の最大値は 2 と思われる。ルイドを利用して遅回しを行い、最初のテュラx2を9面以降で出現させてからわざと死んでテーブルを戻すことでこれを実現できる(movie)。
自機狙い弾などは2点間の向きを近似計算することで実現されている。
この近似計算は以下の不等式を利用している:
3||dy|-|dx|| >= min(|dx|,|dy|)
1.25||dy|-|dx|| >= min(|dx|,|dy|)
グラフにすると左下図のようになり、画面が 16 個の領域に分割されていることがわかる。
ゲーム上では 8bit 演算のみで処理するために値を丸めているので、右下図のようになる。
ある方向(ここでは mod 16
で考える。以下同様)に移動しているオブジェクトがあるとする。
このオブジェクトが自機に近づくように移動方向を +1 または -1 することを考える。
これは、((移動方向)-(自機への方向)) mod 16
が 8 より大きければ +1, 8 より小さければ -1 とすればよい(ちょうど 8 の場合は適当に決める)。
ルイドの移動はこのようなコードで実装されている。