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 | 内容 |
---|---|
0x00 | 列依存特殊セル 初期状態 (列 mod 4 の値により内容変化: (0:クジラ, 1:黄金の指, 2:ミロン, 3:レーザー)) |
0x04 | 野沢プログラマー 初期状態 |
0x05 | 裏パワー 初期状態 |
0x06 | 1UP 初期状態 |
0x07 | ワープ 初期状態 |
0x09..=0x0D | ゼグ 初期状態 (IDにより外観が異なる) |
0x0E | 2x2地上ザコ (300点) 左上 |
0x0F | 2x2地上ザコ (300点) 右上 |
0x10 | 2x2地上ザコ (300点) 左下 |
0x11 | 2x2地上ザコ (300点) 右下 |
0x12 | 2x2地上ザコ (200点) 左上 |
0x13 | 2x2地上ザコ (200点) 右上 |
0x14 | 2x2地上ザコ (200点) 左下 |
0x15 | 2x2地上ザコ (200点) 右下 |
0x16 | 地上ザコ1 (100点) |
0x17 | 地上ザコ2 (100点) |
0x18 | パワーアップ箱 |
0x19..=0x1C | トルード 初期状態 (値が小さい方が固い) |
0x1D | デライラ 初期状態 左上 |
0x1E | デライラ 初期状態 右上 |
0x1F | デライラ 初期状態 左下 |
0x20 | デライラ 初期状態 右下 |
0x26 | 空白 |
0x27 | 外観変更中 |
0x96 | トラップゾーン |
0xA0 | 1UP 出現後 |
0xA1 | ワープ 出現後 |
0xA8..=0xAF | 1UP 撃ち込み中状態 |
0xB0..=0xC7 | デライラ 撃ち込み中状態 |
0xC8..=0xCF | ゼグ 撃ち込み中状態 |
0xD0..=0xD7 | トルード 撃ち込み中状態 |
0xD8..=0xDF | ワープ 撃ち込み中状態 |
0xE0..=0xEF | 野沢プログラマー 撃ち込み中状態 |
0xF0..=0xFF | 列依存特殊セル 撃ち込み中状態 |
1行ずつ RAM へ展開する都合上、行ごとに圧縮されたデータが並んでいる。
行データの先頭 Byte が 0xDB
の場合、内容が同一の行への参照を表す。
この場合、後続 2Byte をポインタと解釈し、そのアドレスから行データを読み込む。
行データの先頭 Byte が 0xDB
以外なら圧縮データ。この場合、ちょうど 20 セル読み込むまで以下を繰り返す:
b
として読み取る。b < 0xDC
ならば b
をそのままセル ID として扱う。0xDC <= b < 0xE0
ならば、後続 4Byte を b-0xDA
回繰り返すランレングスとして展開する(繰り返し回数: 2..=5
)。0xE0 <= b < 0xE5
ならば、後続 3Byte を b-0xDE
回繰り返すランレングスとして展開する(繰り返し回数: 2..=6
)。0xE5 <= b < 0xEE
ならば、後続 2Byte を b-0xE3
回繰り返すランレングスとして展開する(繰り返し回数: 2..=10
)。0xEE <= b
ならば、後続 1Byte を b-0xEB
回繰り返すランレングスとして展開する(繰り返し回数: 3..=20
)。ちなみに、ゲーム内のデータはこの方式の下で最適な圧縮となっている(筆者作の動的計画法による最適圧縮プログラムと出力サイズが一致する)。
圧縮率は 9930 / 23040 (約 43 %)。
各面の前半、後半について以下の設定を持っている:
ローテートフラグが立っている場合、地形の行の左半分と右半分が入れ替わる。ただし行インデックス 240 以降は入れ替わらない(つまり、デライラ周辺の地形は固定)。
地形設定データは1つあたり 4Byte:
Byte | 内容 |
---|---|
0 | bit0-5:パレットエントリ0, bit7:地形ローテートフラグ |
1 | bit0-5:パレットエントリ1 |
2 | bit0-5:パレットエントリ2 |
3 | bit0-5:パレットエントリ3, bit6-7:パレットアニメーション種別 |
パレットアニメーション種別:
値 | 意味 |
---|---|
0 | アニメーションなし |
1 | パレットエントリ3 の色1-3 をローテート |
2 | パレットエントリ3 の色1 を明滅 |
特殊セルデータは以下の要素の配列:
Byte | 内容 |
---|---|
0 | 地形内の行インデックス。0 で終端 |
1 | bit0-4:列インデックス, bit5-7:セルID |