Outpost 2 のファイル形式 · bei.pm

このテキストはOpenAI GPT-4o Miniによって自動的に翻訳されました。

このページに記載されているファイル形式は、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) マジックバイト

次のデータブロックで何が期待できるかに関する情報を含んでいます。

既知の値:

  • 0x204C4F56 ('VOL '):
    ボリューム
  • 0x686C6F76 ('VOLH'):
    ボリュームヘッダー
  • 0x736C6F76 ('VOLS'):
    ボリューム文字列
  • 0x696C6F76 ('VOLI'):
    ボリューム情報
  • 0x4B4C4256 ('BLCK'):
    ボリュームブロック
  • 0x504D4250 ('PBMP'):
    グラフィックデータ
  • 0x4C415050 ('PPAL'):
    カラーパレット
  • 0x4C415043 ('CPAL'):
    カラーパレットコンテナ
  • 0x64616568 ('head'):
    ヘッダー
  • 0x61746164 ('data'):
    ユーザーデータ
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) 旗?

ファイルのエンコーディングに関する追加情報があるようです。

  • 0x03はファイルが圧縮されているときに設定されます。ここではおそらくハフマン木が使用されています。
  • 0x80は常に設定されているようです。

ボリュームブロック

アドレス 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つのセクションで構成されています: headdata

タイルのヘッダー

アドレス 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) バージョン / フラグは?

これはファイル形式のバージョン情報かもしれません。私が持っているすべてのファイルでは、ここに値 0x02 がありました。

0x000c uint(32) 幅(横方向の解像度)

画像ファイルの幅を指定します(ピクセル単位)。

Outpost 2のすべてのウェルでは、ここに値 0x20 または 32 が期待されます。

0x0010 uint(32) 高さ(縦の解像度)

画像ファイルの高さを示します(ピクセル単位)。

Outpost 2のすべてのウェルでは、ここに値0x20または32が期待されます。

0x0014 uint(32) 色深度とは何ですか?

この値の意味は不明です。

すべてのチェックされたファイルに値 8 が含まれているため、色深度の指定である可能性があります。

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)

おそらく、いつも通り、フラグです。

しかし、私が知っているフラグはありません。私が知っているすべての値は 0x00 に対応しているので、パレットの数は単に uint(32) である可能性もあります。

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)

おそらく、いつものようにフラグでしょう。

ただし、私が知っているフラグはありません。私が知っているすべての値は 0x00 に対応しているため、パレットの数が単に uint(32) である可能性もあります。

パレット情報は非常に読みやすいです。
それぞれヘッダーとデータセグメントで構成されています。

パレットヘッダー

アドレス 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)

おそらく、いつものようにフラグでしょう。

ただし、私が知っているフラグはありません。私が知っているすべての値は 0x00 に対応しているため、パレットの数が単に uint(32) である可能性もあります。

0x0008 uint(32) パレットフォーマットのバージョンは?

おそらく、どのパレットフォーマットのバージョンに従っているかを定義します。

すべてのOutpost2パレットは、バージョン0x01を持っているようです。

パレットデータ

アドレス 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) 不明 - フラッグ?

この値が何を意味するのかは不明です。なぜなら、基本的に0x04であるように見えるからです。

パレットについては、アニメーション用のパレットには以下のルールが適用されることを付け加えます:

  • 最初の色は常に透明であり、そこに指定されている値に関係なくそうです。
  • パレットのエントリ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) タイプ

画像の種類を示します。ここではビットマスクであるようです:

  • 0x04は、1bppグラフィックの場合に設定されます。
  • 0x40は、ウィンドウ処理を行う必要があるグラフィックの場合に設定されます。
0x0012 uint(16) パレット

PRTファイルからどのパレットを使用するかを定義します

このPRTファイルのデータ構造は、スプライトに使用されるビットマップの構成を示しています。これらのビットマップは、スプライトのアニメーションフレームを構成するための単一の要素として機能します。

具体的な画像データは、ゲームディレクトリ内の op2_art.BMPに隠れています。
なぜこのビットマップファイルが(主に正しい)RIFFビットマップヘッダーを持っているのかは不明です。おそらく、Outpost 2はグラフィックを読み込むためにシステムAPIを使用しており、このヘッダーが一時的に取得され、対応する変化するフィールドが上書きされています。

ピクセルデータは、BMPファイルの オフセット + uint32オフセットの位置にあり、 BMPファイルのアドレス0x000A(RIFFビットマップデータオフセット)に見つかります。これは再び、左上から右下への行単位の配置に対応します。

モノクロ1bppグラフィックは、色0が完全な透明で、色1が半透明の黒/灰色として描画されることがあります。モノクログラフィックは、アニメーション内の車両および建物の影に通常使用されます。

これにより、多くのグラフィックを組み合わせることができます。

保護された居住モジュール (プリマス)

アニメーション

さて、Outpost 2のデータフォーマットの中で最も重要な分野に来ました:
アニメーションです。

アニメーションリストは、主にデータの検証のためのグローバルヘッダーで始まります。 その後、具体的なアニメーション定義が3つの段階に分かれて続きます:

  1. アニメーション
    アニメーションとは、ユニット、建物、または「パーティクルアニメーション」(彗星の衝突、天候、爆発)を特定の状況で表す最上位のインスタンスです。
  2. フレーム
    フレームとは、アニメーション内の1つの画像です。アニメーションには1つ以上のフレームが含まれることがあります。
  3. サブフレーム
    サブフレームとは、特定のビットマップを特定の条件でフレームの特定の位置に描画する情報です。フレームには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のトグル

この値には次のものが含まれています:

  • 0x7F(ビットマスク):このフレームで使用されるサブフレームの数
  • 0x80:オプション1と2が存在するかどうかの情報
0x0001 uint(8) 不明な1とオプション3、4のトグル

この値には以下が含まれています:

  • 0x7F(ビットマスク):不明 - 次のフレームが表示されるまでに経過するゲームティックの数であると強く推測します
  • 0x80:オプショナル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は、通常の鉱石を積んだプリマスのトランスポーターが荷降ろしされる様子を示しています。このアニメーションは、ウィンドウ機能を利用した数少ないアニメーションの一つです。

これで完全なアニメーションを組み合わせることができます。
残念ながら、上の荷物のハッチには問題があり、グラフィックタイプ情報に対応するビットが設定されていません。

ここに、ゲームからの他の美しいアニメーションスプライトをいくつか紹介します:

アニメーション500のレンダリングを示しています

完成したアニメーション500

プリマス 建物工場

エデン 宇宙港

エデン 医療センター

SCAT

プリマス 宇宙港

イースターエッグ:
サンタクロース

イースターエッグ:
ダンス ドッグ

ユーザーインターフェース

今、ゲームのユーザーインターフェースが必要です。これはブラッシュメタルの外観になっています。

しかし、ここでもDynamixは新しいものを考え出す必要はなかったことがわかります。ここでは、Windowsが提供するUser32およびGDI32 APIを単に利用しているだけでなく、特にUser32のリソース管理も使用されています。

これらのリソースは、Angus Johnsonによってフリーウェアとして開発されたResource Hackerのようなプログラムを使って抽出することができます。また、LinuxやMac OSでWineを使いたくない場合は、icoutilsに含まれているwrestoolを利用することもできます。

ファイル名 内容
Outpost2.exe ゲームのアイコンのみが含まれており、New Terraの前にある宇宙ステーションを示しています
op2shres.dll ボタンやチェックボックスなどの操作要素のグラフィック、ダイアログの背景、ストーリーのミッションテキスト用の画像、メインメニューの背景グラフィックが含まれています
out2res.dll ゲーム内のウィンドウ装飾、通常および特別な金属のアイコン、ロード画面、ダイアログ用のグラフィック、さらにゲームディレクトリ内のアニメーションされたカーソルグラフィックも含まれています