スターソルジャー (FC) 解析資料

Published on: 2021-06-15

小ネタ

ラザロ最速撃破

ラザロは出現直後に256発撃ち込むと横移動開始前に撃破できる。
これは座標y を適切に調整しながらレーザーを撃つことで実現可能(movie / encode)。

ボス属性のリューク

まれに分裂したリュークが無敵化したり、倒したとき画面上の敵が全滅することがある。

これの原因は、リュークは本来ザコ(ボス属性を持たない)なのに、分裂した個体がボス属性を持ってしまうことがあるため。
リュークが分裂して新たな個体が作られるとき、ボス属性の初期化が行われていない。
そのため、以前ボス属性を持つ敵が入っていたスロットにその個体が格納されると、ボス属性が引き継がれてしまう。

ボス属性の敵は撃破時に画面上の敵を全滅させる性質があるため、ボス属性のリュークを倒した際も同じことが起こる。

ボス属性のリュークが無敵化する原因はリュークのHP管理方式にある。
本来ザコにはHPの概念が存在せず、被弾時は単に撃破されるか、仮想マシン内で被弾時ジャンプ先へジャンプするかのいずれかである。
しかしリュークはバイトコードでなく専用ルーチンで動いており、仮想マシンのプログラムカウンタと被弾時ジャンプ先に対応するメモリをHP管理に流用している。
具体的には、(プログラムカウンタ)=(HP), (被弾時ジャンプ先)=HP-1 と初期化する。すると、ザコの被弾処理の性質より、プログラムカウンタと被弾時ジャンプ先が一致しているかどうかで被弾判定ができ、被弾したら被弾時ジャンプ先を 1 減らすことでHP管理ができる。

ところが、ボス属性のリュークの場合は被弾処理が異なり、被弾時ジャンプ先に対応するアドレスを(本来の)HPとして扱う。
つまり被弾しても被弾時ジャンプ先が 1 減るだけで、プログラムカウンタは更新されない。よって、リュークの行動ルーチン内では常に被弾していないものと判定される。
そして、リュークの行動ルーチンは被弾していないとき毎回 (被弾時ジャンプ先)=(プログラムカウンタ)-1 の再初期化を行う。これは毎フレームHPが回復していることに相当し、その結果無敵化してしまう。
ボス属性のリュークのHPが少ない場合は、同一フレームで複数の弾を撃ち込むことでHP回復前に倒せることもある。

ボス属性のリュークが発生しやすいのは敵編隊出現テーブルの 0xFC だと思われる(2つ前にボス属性を持つジェリコが出る)。