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

Published on: 2021-06-15
Updated on: 2021-06-25

地形データの形式

地形は1行あたり 20 セルで、各面につき 256 行ある。
RAM 上では現在位置の 15 行のみ保持しており、16F ごとに ROM から行を読み込んで内容を更新する。

地形データは各面ごとに前半 128 行、後半 128 行のチャンクに分かれており、「ランレングス」「内容が同一の行への参照」を用いて圧縮されている。
また、128 行のチャンクごとに「地形のローテート設定」があり、これが有効な場合行の左半分と右半分が入れ替わる。これによりデータ量を増やさずに地形のバリエーションを増やしている。

なお、ワープや裏パワーなどの特殊セルは圧縮データ内には格納されておらず、各面ごとに位置データを持つ形になっている。

地形データ関連の PRG-ROM アドレスを示す:

アドレス内容
$D48D各面の地形設定(前半、後半)
$D50D地形パレットエントリ (4*43 Byte)
$D5B9各面の特殊セルデータへのポインタテーブル
$D5D9各面の圧縮データ(前半、後半)へのポインタテーブル

地形セルID

ID内容
0x00列依存特殊セル 初期状態 (列 mod 4 の値により内容変化: (0:クジラ, 1:黄金の指, 2:ミロン, 3:レーザー))
0x04野沢プログラマー 初期状態
0x05裏パワー 初期状態
0x061UP 初期状態
0x07ワープ 初期状態
0x09..=0x0Dゼグ 初期状態 (IDにより外観が異なる)
0x0E2x2地上ザコ (300点) 左上
0x0F2x2地上ザコ (300点) 右上
0x102x2地上ザコ (300点) 左下
0x112x2地上ザコ (300点) 右下
0x122x2地上ザコ (200点) 左上
0x132x2地上ザコ (200点) 右上
0x142x2地上ザコ (200点) 左下
0x152x2地上ザコ (200点) 右下
0x16地上ザコ1 (100点)
0x17地上ザコ2 (100点)
0x18パワーアップ箱
0x19..=0x1Cトルード 初期状態 (値が小さい方が固い)
0x1Dデライラ 初期状態 左上
0x1Eデライラ 初期状態 右上
0x1Fデライラ 初期状態 左下
0x20デライラ 初期状態 右下
0x26空白
0x27外観変更中
0x96トラップゾーン
0xA01UP 出現後
0xA1ワープ 出現後
0xA8..=0xAF1UP 撃ち込み中状態
0xB0..=0xC7デライラ 撃ち込み中状態
0xC8..=0xCFゼグ 撃ち込み中状態
0xD0..=0xD7トルード 撃ち込み中状態
0xD8..=0xDFワープ 撃ち込み中状態
0xE0..=0xEF野沢プログラマー 撃ち込み中状態
0xF0..=0xFF列依存特殊セル 撃ち込み中状態

地形データの圧縮

1行ずつ RAM へ展開する都合上、行ごとに圧縮されたデータが並んでいる。

行データの先頭 Byte が 0xDB の場合、内容が同一の行への参照を表す。
この場合、後続 2Byte をポインタと解釈し、そのアドレスから行データを読み込む。

行データの先頭 Byte が 0xDB 以外なら圧縮データ。この場合、ちょうど 20 セル読み込むまで以下を繰り返す:

ちなみに、ゲーム内のデータはこの方式の下で最適な圧縮となっている(筆者作の動的計画法による最適圧縮プログラムと出力サイズが一致する)。
圧縮率は 9930 / 23040 (約 43 %)。

地形設定

各面の前半、後半について以下の設定を持っている:

ローテートフラグが立っている場合、地形の行の左半分と右半分が入れ替わる。ただし行インデックス 240 以降は入れ替わらない(つまり、デライラ周辺の地形は固定)。

地形設定データは1つあたり 4Byte:

Byte内容
0bit0-5:パレットエントリ0, bit7:地形ローテートフラグ
1bit0-5:パレットエントリ1
2bit0-5:パレットエントリ2
3bit0-5:パレットエントリ3, bit6-7:パレットアニメーション種別

パレットアニメーション種別:

意味
0アニメーションなし
1パレットエントリ3 の色1-3 をローテート
2パレットエントリ3 の色1 を明滅

特殊セルデータ

特殊セルデータは以下の要素の配列:

Byte内容
0地形内の行インデックス。0 で終端
1bit0-4:列インデックス, bit5-7:セルID