Outpost 2 のファイル形式 · bei.pm
このページに記載されているファイル形式は、Dynamix, Inc. と Sierra Entertainment の知的財産に関する技術分析に基づいています。
この知的財産は現在、Activision Publishing, Inc. / Activision Blizzard, Inc. に属しており、現在は Microsoft Corp. に所有されています。
情報は、アーカイブと歴史的データとの相互運用性を目的とした リバースエンジニアリング と データ分析 によって収集されました。
独自の機密仕様は使用されていません。
現在、このゲームは gog.com でダウンロード購入できます。
以下の記事シリーズは、1997年にシエラからリリースされ、ダイナミックスによって開発されたリアルタイムストラテジーゲーム「アウトポスト2:分断された運命」におけるデータフォーマットに関する私の知見を文書化しています。
私は2015年11月1日から2015年11月14日まで、このゲームのデータの分析とその扱いについて主に取り組んでいました。
私がこれまでに得た情報によると、ダイナミックスは多くの商業企業と同様に、アウトポスト2のために特別にデータフォーマットを開発したわけではなく、メックウォーリアシリーズなどの他のプロジェクトでも(変更を加えて)使用しています。
それに加えて、データフォーマットの革新性は限られており、一般的なフォーマットであるJFIFやRIFFなどの既存のコンセプトに基づいていることが多いと考えられます。
テーブルやデータフォーマットの解釈についてのさらなる情報は、何が何ですか?で確認できます。
ここに示されたデータは、一般的にリトルエンディアンとして理解されます。
最後に、リバースエンジニアリングは非常に楽しかったと言えますが、完全ではありません。
もちろん、ゲーム自体をプレイすることをお勧めします。興味深いゲームメカニクスを提供しています。
導入
Outpost 2で使用されるデータ形式は、JFIFやPNGに似た構造を持っています。各データブロックには常に8バイトのヘッダーがあります。そのため、各ヘッダーを特定の場所で文書化するのは省略し、そこでは異常のみを文書化します。
フォーマットは常に以下の通りです。その中に実際のデータが埋め込まれています:
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | 次のデータブロックで何が期待できるかに関する情報を含んでいます。 既知の値:
|
0x0004 | uint(24) | ブロック長 | 次のデータブロックのサイズ(バイト単位)に関する情報が含まれています。 ここで言うのは純粋なデータ部分で、8バイトのヘッダーは含まれていません。 |
0x0007 | uint(8) | 旗? | このブロックが正確に何のためにあるのかは不明です。 ボリュームではこの値がよく0x80で、他のファイルではよく0x00です。これはフラグセットであることを示唆しています。 |
ボリューム
ボリュームは、ゲームのためのデータコンテナで、アーカイブ形式のようなものです。例えば、タールボールのように。 少なくともアウトポスト2では、この形式はファイルだけを扱い、フォルダーはありません。 ただし、適切なファイル名を使うことで、これを模倣することができるでしょう。
ボリュームは、ボリュームヘッダーと、特定のファイルに対応するいくつかのボリュームブロックで構成されています。
「ボリューム」は、ゲームディレクトリ内の'vol'
という拡張子を持つファイルです。
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 |
ボリュームヘッダー
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 |
ボリュームヘッダーには、実際のデータは含まれていません。
これは単なるコンテナとして機能します。
ボリュームヘッダーの最初のデータにはボリューム文字列があり、その後にボリューム情報が続きます。
ボリューム文字列
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 |
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 | |
0x0008 | uint(32) | ペイロードの長さ | 以下のデータのうち、実際に有効なバイト数を示してください。 ボリュームストリングリストの残りのデータは、明らかにゴミデータと見なされます。 後日付のファイルでは、これらの「残りのデータ」は0x00であり、これはゲームの開発中にツールチェーンに問題があったことを示唆しているかもしれません。つまり、データが初期化されているかどうかはゲームに影響を与えないため、開発者がバッファの正しい初期化を行ったのは非常に遅かったということです。 |
0x000c | uint(8)[] | ファイル名のリスト | これは、0バイトで終わるファイル名のリストであり、少なくともこのデータの部分ではASCII文字のみを期待しています。 データを解析する際に、このデータブロックを詳しく評価する必要はありません。なぜなら、ボリューム情報においてファイル名のオフセットが直接参照されているからです。 |
ボリューム文字列は、ボリューム内に含まれている ファイル名のリストです。
ボリューム情報
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 |
ボリューム情報は、ファイルに関する詳細な情報を含みます。 これは、ある意味でFAT(ファイルアロケーションテーブル)の ディレクトリエントリのようなものです。
ファイルの数は、ブロックサイズをディレクトリエントリの長さ(14バイト)で割ったものになります。
各ディレクトリエントリは、以下の構成を持っています:
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | ファイル名オフセット | ファイル名のリスト(ボリューム文字列)のどのオフセット (!) にファイル名があるかを示します。 これは、データブロックの開始に関連しています。 |
0x0004 | uint(32) | ファイルオフセット | ファイルが全体のボリュームファイルの中でどのオフセットに位置しているかを示します。 |
0x0008 | uint(32) | ファイルサイズ | ファイルのサイズをバイト単位で示します。 |
0x000c | uint(16) | 旗? | ファイルのエンコーディングに関する追加情報があるようです。
|
ボリュームブロック
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 |
ボリュームブロックは、ファイルを格納するコンテナです。 ブロック形式のため、ファイルサイズが冗長にもう一度含まれ、 その後に直接利用データが続きます。
タイル
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 |
タイルはOutpost-2特有のビットマップグラフィックフォーマットです。
それは13のタイルセット、つまり「ウェル」と呼ばれるもので構成されています
(well0000.bmp
からwell0012.bmp
まで)、
これらはmaps.volのボリューム内にあります。
これらのタイルセット/ウェルには次のものが含まれています:
ファイル名 | 内容 |
---|---|
well0000.bmp | 32x32ピクセルの青いグラフィック - 自分のイメージローダーが機能するかのテストに最適 |
well0001.bmp | 明るい岩、明るい岩の山脈、明るい岩にある無数のクレーターのバリエーションを含む |
well0002.bmp | 明るい岩の「ドゥダッツ」を含む - 明るい岩に配置できる要素で、緩和や構造(例:壁)として使用されるもの、植生も含む |
well0003.bmp | 明るい岩の上にある殻のような構造を含む |
well0004.bmp | 暗い岩、暗い岩の山脈、暗い岩にある無数のクレーターのバリエーションを含む |
well0005.bmp | 暗い岩の「ドゥダッツ」を含む - 暗い岩に配置できる要素で、緩和や構造(例:壁)として使用されるもの |
well0006.bmp | 暗い岩の上にある殻のような構造と、明るい岩と暗い岩の間の遷移を含む |
well0007.bmp | 溶岩を含み、それぞれ4-5フレームのアニメーションも含む |
well0008.bmp | 砂と砂にある無数のクレーターのバリエーションを含む |
well0009.bmp | 砂の「ドゥダッツ」を含む - 砂に配置できる要素で、緩和や構造(例:壁)として使用されるもの |
well0010.bmp | 砂から明るい岩と暗い岩へのそれぞれ48の遷移を含む |
well0011.bmp | 地図の極冠を含み、暗い岩が基盤 |
well0012.bmp | 地図の極冠を含み、明るい岩が基盤 |
正確な実装のためには、日夜サイクルのデータをまだ処理する必要があるため、タイルを事前にレンダリングしてキャッシュしないことが推奨されます。そうしないと、非常に多くのデータが発生します。
タイルは32x32ピクセルの解像度を持つインデックス付きパレットの8bppグラフィックで、縦に配置されています。しかし、このように作成されたタイルセットには、さらに多くのものが含まれる可能性があります。
メインコンテナは2つのセクションで構成されています: head
と data
。
タイルのヘッダー
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 | |
0x0008 | uint(32) | バージョン / フラグは? | これはファイル形式のバージョン情報かもしれません。私が持っているすべてのファイルでは、ここに値 |
0x000c | uint(32) | 幅(横方向の解像度) | 画像ファイルの幅を指定します(ピクセル単位)。 Outpost 2のすべてのウェルでは、ここに値 |
0x0010 | uint(32) | 高さ(縦の解像度) | 画像ファイルの高さを示します(ピクセル単位)。 Outpost 2のすべてのウェルでは、ここに値 |
0x0014 | uint(32) | 色深度とは何ですか? | この値の意味は不明です。 すべてのチェックされたファイルに値 |
0x0018 | uint(32) | 色深度 2? | この値の意味は不明です。 おそらく「ターゲット」カラーデプスかもしれません。 |
これらの情報に基づいて、標準化されたRIFF形式のパレットファイルが作成されます。正確な仕様は、パレットが他の場所にも存在するため、パレットの下にあります。
タイルデータ
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロック長 | |
0x0007 | uint(8) | 旗 |
最後に、左上から右下に向かって行ごとに並んだ生のピクセルデータが続きます。
通常8bppビットマップとして存在するグラフィックのデータ値は、カラーパレット内の色のインデックスに対応しています。
ゲームエンジンはタイルを*おそらく*オンデマンドで描画します。
これは32段階のタイルがある昼夜サイクルに起因しているようです。その際、明るさの値から「少し」引かれているようです。正確な値はまだ特定できていませんが、計算の基準は
v *= (daylight / 48) + 0.25;
で、HSVデータを使ったピクセルの計算を行っています。ここで、daylightは0から31の値で、vは0から1の値です。さらに、マップの左右にはそれぞれ16タイルの境界が存在し(これはユニットの見えないスポーンに役立ちます)、その点も考慮する必要があります。
加えて、昼夜サイクルはゲームサイクルごとにマップの一列だけを更新するようです。
加速された昼夜サイクルは以下のようになります:
PRT
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | パレットの長さ | 通常のブロック形式とは異なり、このファイルに含まれるパレットの数を示します - ブロックのバイト数ではありません。 |
0x0007 | uint(8) | 旗 | おそらく、いつも通り、フラグです。 しかし、私が知っているフラグはありません。私が知っているすべての値は |
PRT
が正確に何を意味するのかはわかりませんが、例えば 'パレットとリソーステーブル' のようなことが考えられます。このファイルは op2_art.prt として maps.vol に存在し、まさにそのようなものであり、この機能をよく説明していると思います。
このファイルにはパレットのリスト、使用されているビットマップのテーブル、すべてのアニメーション定義、そしていくつかの不明なデータが含まれています。データはこれまでのコンテナ形式に緩やかに従っており、すべてのデータセットがこのスキーマに従っているわけではありません。
CPAL
セクション(おそらくパレットコンテナを意味する)は、通常1052バイトの8ビットパレットの数を示すことによって、パレットデータだけを囲んでいます。
1052バイトの指定は必ずしも厳密ではなく、パレット形式は潜在的に異なるパレットサイズを考慮する可能性があります。これは、Outpost 2が配布されるデータセットにのみ適用されます。
パレットリストの後には、すぐに前置きのヘッダーなしでビットマップのリストが続き、その後すぐにアニメーションリストが続きます。
どちらも、それぞれ< i>uint(32)(または再びuint24+uint8フラグ?)で始まり、データセットの数を含んでいます。
パレット
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | パレットの長さ | このファイルに見つかるパレットの数を示します - ブロックのバイト数ではありません。 |
0x0007 | uint(8) | 旗 | おそらく、いつものようにフラグでしょう。 ただし、私が知っているフラグはありません。私が知っているすべての値は |
パレット情報は非常に読みやすいです。
それぞれヘッダーとデータセグメントで構成されています。
パレットヘッダー
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | パレットの長さ | このファイルに見つかるパレットの数を示します - ブロックのバイト数ではありません。 |
0x0007 | uint(8) | 旗 | おそらく、いつものようにフラグでしょう。 ただし、私が知っているフラグはありません。私が知っているすべての値は |
0x0008 | uint(32) | パレットフォーマットのバージョンは? | おそらく、どのパレットフォーマットのバージョンに従っているかを定義します。 すべてのOutpost2パレットは、バージョン |
パレットデータ
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | マジックバイト | |
0x0004 | uint(24) | ブロックの長さ | |
0x0007 | uint(8) | 旗 |
データセクションは各パレットエントリを受け取ります。 パレットエントリの数はブロックの長さを4で割ったものから決まります。
各エントリは以下のようなシンプルな構造を持っています;
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(8) | 赤の成分 | 色の赤の割合を示します |
0x0001 | uint(8) | 緑の成分 | 色の緑の割合を示します。 |
0x0002 | uint(8) | 青の成分 | 色の青の割合を示します |
0x0003 | uint(8) | 不明 - フラッグ? | この値が何を意味するのかは不明です。なぜなら、基本的に |
パレットについては、アニメーション用のパレットには以下のルールが適用されることを付け加えます:
- 最初の色は常に透明であり、そこに指定されている値に関係なくそうです。
-
パレットのエントリ1-24は、パレット1-8でプレイヤーの色として扱われます。
プレイヤー1以外の色がどこから来ているのかは不明です。
残りの色はハードコーディングされていると思われます。
ビットマップ
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | 整列された幅 | ピクセルデータの行の幅をバイトで示します - これは4バイト境界に合わせて調整されています。 そのため、特定の画像行に迅速にアクセスすることができます。 なぜこの値が別に保存されるのか、計算できるにもかかわらずは不明です。 |
0x0004 | uint(32) | オフセット | ビットマップの最初の行のオフセットを指定します |
0x0008 | uint(32) | 高さ | 画像の高さをピクセルで示します |
0x000c | uint(32) | 幅 | 画像の幅をピクセル単位で指定します |
0x0010 | uint(16) | タイプ | 画像の種類を示します。ここではビットマスクであるようです:
|
0x0012 | uint(16) | パレット | PRTファイルからどのパレットを使用するかを定義します |
このPRTファイルのデータ構造は、スプライトに使用されるビットマップの構成を示しています。これらのビットマップは、スプライトのアニメーションフレームを構成するための単一の要素として機能します。
具体的な画像データは、ゲームディレクトリ内の
op2_art.BMPに隠れています。
なぜこのビットマップファイルが(主に正しい)RIFFビットマップヘッダーを持っているのかは不明です。おそらく、Outpost 2はグラフィックを読み込むためにシステムAPIを使用しており、このヘッダーが一時的に取得され、対応する変化するフィールドが上書きされています。
ピクセルデータは、BMPファイルの オフセット + uint32オフセットの位置にあり、 BMPファイルのアドレス0x000A(RIFFビットマップデータオフセット)に見つかります。これは再び、左上から右下への行単位の配置に対応します。
モノクロ1bppグラフィックは、色0が完全な透明で、色1が半透明の黒/灰色として描画されることがあります。モノクログラフィックは、アニメーション内の車両および建物の影に通常使用されます。
これにより、多くのグラフィックを組み合わせることができます。
アニメーション
さて、Outpost 2のデータフォーマットの中で最も重要な分野に来ました:
アニメーションです。
アニメーションリストは、主にデータの検証のためのグローバルヘッダーで始まります。 その後、具体的なアニメーション定義が3つの段階に分かれて続きます:
-
アニメーション
アニメーションとは、ユニット、建物、または「パーティクルアニメーション」(彗星の衝突、天候、爆発)を特定の状況で表す最上位のインスタンスです。 -
フレーム
フレームとは、アニメーション内の1つの画像です。アニメーションには1つ以上のフレームが含まれることがあります。 -
サブフレーム
サブフレームとは、特定のビットマップを特定の条件でフレームの特定の位置に描画する情報です。フレームには1つ以上のサブフレームが含まれることがあります。
その後、すぐに各アニメーション定義が続きます。
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | アニメーションの数 | いくつのアニメーションデータセットがありますか |
0x0004 | uint(32) | フレーム数 | 全体で何フレームが必要ですか |
0x0008 | uint(32) | サブフレームの数 | 全体でいくつのサブフレームが必要ですか? |
0x000c | uint(32) | オプションのエントリー数 | どれくらいの「オプションのエントリー」がありますか。 |
アニメーション
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(32) | 不明 1 | 未知の情報 |
0x0004 | uint(32) | バウンディングボックス:左 | バウンディングボックスの左端(ピクセル単位)を指定します。 |
0x0008 | uint(32) | バウンディングボックス:上 | バウンディングボックスの上部の開始位置(ピクセル単位)を指定します。 |
0x000c | uint(32) | バウンディングボックス:幅 | バウンディングボックスの幅(ピクセル単位)を指定します。 |
0x0010 | uint(32) | バウンディングボックス: 高さ | バウンディングボックスの高さ(ピクセル単位)を示します。 |
0x0014 | uint(32) | オフセット: X | アニメーションの水平中心を示します |
0x0018 | uint(32) | オフセット: Y | アニメーションの垂直中央を示します |
0x001c | uint(32) | 未知 2 | 未知の情報 |
0x0020 | uint(32) | フレーム数 | このアニメーションに含まれているアニメーションフレームの数を示します。 |
0x0024 | uint(32) | ウィンドウの数 | 描画する際に使用するウィンドウの数を指定します。 |
最上層のデータ、アニメーションのデータは主に管理データです - バウンディングボックスは、車両や建物を選択した際のマークの座標を示し、 同時にクリック可能な領域も示します。
オフセットは主に「ゼロポイント」を決定します;ゲーム内の座標に対して加算または減算される点です。 数学的に言うと、オフセットはここで座標の原点を示します。
ウィンドウは、オフセットと同様に、それぞれのウィンドウに対して4つのuint(32)値を持ち、 それにより個々のサブフレームに使用可能な領域を指定します。ビットマップに適切に指定されている限り、 ウィンドウの外側には描画してはいけません。
フレーム
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(8) | サブフレームの数とオプション1、2のトグル | この値には次のものが含まれています:
|
0x0001 | uint(8) | 不明な1とオプション3、4のトグル | この値には以下が含まれています:
|
0x0002 | uint(8) | オプション1 | 不明 |
0x0003 | uint(8) | オプション 2 | 不明 |
0x0004 | uint(8) | オプション3 | 不明 |
0x0005 | uint(8) | オプション4 | 不明 |
サブフレーム
アドレス | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | 文字 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
オフセット | データタイプ | 名称 | 説明 |
---|---|---|---|
0x0000 | uint(16) | ビットマップID | このサブフレームに使用するビットマップを指定します |
0x0002 | uint(8) | 不明 1 | 不明ですが、これはレンダープライオリティ(Zレイヤー)に関係していると思います。 |
0x0003 | uint(8) | サブフレームID | 現在どのサブフレームにいるかを示します |
0x0004 | sint(16) | オフセット - 水平方向 | フレーム内のどこにサブフレームを配置するか、またはビットマップを横に何ピクセル移動させるかを指定します。 |
0x0006 | sint(16) | オフセット - 垂直 | フレーム内のどこにサブフレームを配置するか、またはビットマップを垂直に何ピクセル移動させるかを指定します。 |
これにより、個々のフレームや完全なアニメーションを組み合わせることができ、ここではインデックス 500 の複雑なアニメーションを例に示します。
アニメーション 500
アニメーション500は、通常の鉱石を積んだプリマスのトランスポーターが荷降ろしされる様子を示しています。このアニメーションは、ウィンドウ機能を利用した数少ないアニメーションの一つです。
これで完全なアニメーションを組み合わせることができます。
残念ながら、上の荷物のハッチには問題があり、グラフィックタイプ情報に対応するビットが設定されていません。
ここに、ゲームからの他の美しいアニメーションスプライトをいくつか紹介します:
ユーザーインターフェース
今、ゲームのユーザーインターフェースが必要です。これはブラッシュメタルの外観になっています。
しかし、ここでもDynamixは新しいものを考え出す必要はなかったことがわかります。ここでは、Windowsが提供するUser32およびGDI32 APIを単に利用しているだけでなく、特にUser32のリソース管理も使用されています。
これらのリソースは、Angus Johnsonによってフリーウェアとして開発されたResource Hackerのようなプログラムを使って抽出することができます。また、LinuxやMac OSでWineを使いたくない場合は、icoutilsに含まれているwrestoolを利用することもできます。
ファイル名 | 内容 |
---|---|
Outpost2.exe | ゲームのアイコンのみが含まれており、New Terraの前にある宇宙ステーションを示しています |
op2shres.dll | ボタンやチェックボックスなどの操作要素のグラフィック、ダイアログの背景、ストーリーのミッションテキスト用の画像、メインメニューの背景グラフィックが含まれています |
out2res.dll | ゲーム内のウィンドウ装飾、通常および特別な金属のアイコン、ロード画面、ダイアログ用のグラフィック、さらにゲームディレクトリ内のアニメーションされたカーソルグラフィックも含まれています |