Outpost 2 Format Fail · bei.pm

Teks ini telah diterjemahkan secara automatik melalui OpenAI GPT-4o Mini.

Bentuk fail yang diterangkan di halaman ini berdasarkan analisis teknikal harta intelek daripada Dynamix, Inc. dan Sierra Entertainment.
Harta intelek ini kini adalah sebahagian daripada aset Activision Publishing, Inc. / Activision Blizzard, Inc. dan kini dimiliki oleh Microsoft Corp..

Informasi ini telah dikumpulkan melalui Rekayasa Balik dan Analisis Data untuk tujuan pengarsipan dan interoperabiliti dengan data sejarah.
Tiada spesifikasi proprietari atau rahsia yang digunakan.

Permainan ini kini boleh dibeli sebagai muat turun di gog.com.

Seni permainan

Siri artikel berikut mendokumentasikan pengetahuan saya tentang format data dalam permainan strategi masa nyata "Outpost 2: Divided Destiny", yang diterbitkan oleh Sierra pada tahun 1997 dan dikembangkan oleh Dynamix.

Saya telah berkecimpung dalam analisis data permainan ini dari 01 November 2015 hingga 14 November 2015.

Menurut maklumat yang saya perolehi setakat ini, Dynamix - seperti banyak syarikat komersial lain - tidak mengembangkan beberapa format data khusus untuk Outpost 2, tetapi juga digunakan dalam pembangunan lain seperti siri Mechwarrior (dengan beberapa pengubahsuaian).
Tanpa mengira itu, dapat juga diperhatikan bahawa daya inovasi format data hampir terhad dan sering dibina berdasarkan konsep yang telah ada dalam format biasa seperti JFIF dan RIFF.

Untuk tafsiran jadual dan format data, maklumat lanjut boleh didapati di Apa itu?.
Data yang diberikan di sini secara amnya boleh difahami sebagai Little Endian.

Kesimpulannya, boleh dikatakan bahawa rekayasa terbalik sangat menyeronokkan, walaupun tidak lengkap.
Saya juga boleh mengesyorkan untuk bermain permainan itu sendiri, kerana ia menawarkan mekanik permainan yang menarik.

Pengenalan

Format data yang digunakan oleh Outpost 2 mempunyai struktur yang mengingatkan kepada JFIF / PNG - setiap blok data sentiasa mempunyai header 8 Byte. Oleh itu, saya tidak akan mendokumentasikan setiap header di lokasi tertentu dan hanya akan mendokumentasikan penyimpangan di sana.

Formatnya sentiasa seperti berikut; data sebenar kemudiannya disisipkan di dalamnya:

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Bita Ajaib

Mengandungi maklumat tentang apa yang boleh dijangkakan dalam blok data seterusnya.

Nilai yang dikenali:

  • 0x204C4F56 ('VOL '):
    Volume
  • 0x686C6F76 ('VOLH'):
    Header Volume
  • 0x736C6F76 ('VOLS'):
    String Volume
  • 0x696C6F76 ('VOLI'):
    Maklumat Volume
  • 0x4B4C4256 ('BLCK'):
    Blok Volume
  • 0x504D4250 ('PBMP'):
    Data Grafik
  • 0x4C415050 ('PPAL'):
    Palet Warna
  • 0x4C415043 ('CPAL'):
    Container Palet Warna
  • 0x64616568 ('head'):
    Header
  • 0x61746164 ('data'):
    Data Berguna
0x0004 uint(24) Panjang blok

Mengandungi maklumat tentang saiz (dalam Byte) blok data berikut.

Di sini yang dimaksudkan adalah data yang sebenar - 8 Byte header tidak termasuk dalamnya.

0x0007 uint(8) Bendera?

Adalah tidak diketahui, untuk apa blok ini digunakan.

Dalam volume, nilai ini sering kali 0x80, manakala dalam fail lain sering kali 0x00. Ini menunjukkan bahawa ia adalah satu set bendera.

Volume

Volume adalah sebuah kontainer data untuk permainan, mirip dengan format arkib seperti Tarball. Setidaknya dalam Outpost 2, format ini hanya mengenal fail - tiada folder. Mungkin, ini boleh disimulasikan melalui nama fail yang sesuai.

Sebuah volume terdiri daripada header volume serta beberapa blok volume yang sepadan dengan fail-fail tertentu.

"Volumes" adalah fail dengan sambungan 'vol' dalam direktori permainan.

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 56 4f 4c 20 -- -- -- -- -- -- -- -- -- -- -- -- V O L . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera

Header Volume

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 76 6f 6c 68 -- -- -- -- -- -- -- -- -- -- -- -- v o l h . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera

Header Volume tidak mengandungi sebarang data berguna.
Ia hanya berfungsi sebagai bekas.

Dalam header Volume, yang pertama sekali seharusnya terdapat string Volume; diikuti dengan maklumat Volume.

Strim Volume

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera
Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 76 6f 6c 73 -- -- -- -- -- -- -- -- -- -- -- -- v o l s . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera
0x0008 uint(32) Panjang Payload

Nyatakan berapa banyak Bytes dari data berikut yang sebenarnya adalah data yang berguna.

Data yang tinggal dalam senarai volume-strings nampaknya harus dianggap sebagai sampah.

Dalam fail dengan tarikh yang lebih baru, 'data yang tinggal' ini adalah 0x00, yang mungkin menunjukkan kelemahan dalam rangka alat semasa pembangunan permainan, maksudnya, seorang pembangun hanya mengambil berat tentang penginisasian buffer dengan betul pada waktu yang sangat lewat, kerana ia tidak memberi kesan kepada permainan sama ada data diinisialisasi atau tidak.

0x000c uint(8)[] Senarai Nama Fail

Ini adalah senarai nama fail yang ditamatkan dengan 0-byte, yang - sekurang-kurangnya dalam bahan data yang ada - hanya dijangka mengandungi aksara ASCII.

Tidak perlu untuk menilai blok data ini dengan lebih tepat semasa memproses data, kerana dalam maklumat volume, offset bagi nama fail sudah dirujuk secara langsung.

Volume Strings adalah senarai nama fail yang terdapat dalam volume tersebut.

Maklumat Volume

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera

Informasi volume mengambil maklumat yang lebih terperinci berkenaan fail. Ini boleh dianggap sebagai sejenis entri direktori FAT (FAT = Jadual Pengagihan Fail)

Jumlah fail diperoleh daripada saiz blok dibahagi dengan panjang entri direktori - 14 bait.

Setiap entri direktori mempunyai struktur berikut:

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Offset nama fail

Menunjukkan pada offset (!) dalam senarai nama fail (Volume-Strings) di mana nama fail bagi fail itu dijumpai.

Ini merujuk kepada permulaan blok data pengguna.

0x0004 uint(32) Offset fail

Menunjukkan pada offset mana dalam keseluruhan fail volume file tersebut berada.

0x0008 uint(32) Saiz Fail

Menunjukkan saiz fail dalam byte.

0x000c uint(16) Bendera?

Memberikan maklumat tambahan tentang pengekodan fail.

  • 0x03 diaktifkan jika fail itu dimampatkan. Di sini nampaknya satu pokok Huffman digunakan.
  • 0x80 nampaknya sentiasa diaktifkan.

Blok Isipadu

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 56 42 4c 48 -- -- -- -- -- -- -- -- -- -- -- -- V B L H . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera

Blok volume adalah sebuah kontena, yang menyimpan fail. Ia hanya mengandungi sekali lagi - berdasarkan format blok - saiz fail secara redundan dan seterusnya diikuti terus oleh data yang digunakan.

Jubin

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 50 42 4d 50 -- -- -- -- -- -- -- -- -- -- -- -- P B M P . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Bita Ajaib
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera

Tile adalah format grafik bitmap yang khusus untuk Outpost-2. Ia terdiri daripada 13 set tile, yang dipanggil "wells" (well0000.bmp hingga well0012.bmp), yang terletak di dalam volume maps.vol.

Set tile / Wells mengandungi yang berikut:

Nama Fail Kandungan
well0000.bmp Grafik biru bersaiz 32x32px - ideal sebagai ujian untuk melihat sama ada pemuat gambar berfungsi
well0001.bmp Mengandungi batuan terang, rangkaian gunung di atas batuan terang dan pelbagai variasi kawah impak dalam batuan terang
well0002.bmp Mengandungi 'Doodads' batuan terang - elemen yang boleh ditempatkan untuk mempercantik (atau secara spesifik sebagai struktur, seperti dinding) di atas batuan terang, termasuk juga vegetasi
well0003.bmp Mengandungi struktur berbentuk kerak di atas batuan terang
well0004.bmp Mengandungi batuan gelap, rangkaian gunung di atas batuan gelap dan pelbagai variasi kawah impak dalam batuan gelap
well0005.bmp Mengandungi 'Doodads' batuan gelap - elemen yang boleh ditempatkan untuk mempercantik (atau secara spesifik sebagai struktur, seperti dinding) di atas batuan gelap
well0006.bmp Mengandungi struktur berbentuk kerak di atas batuan gelap, serta peralihan antara batuan terang dan gelap
well0007.bmp Mengandungi lava termasuk 4-5 bingkai animasi bagi lava tersebut
well0008.bmp Mengandungi pasir dan pelbagai variasi kawah impak dalam pasir
well0009.bmp Mengandungi 'Doodads' pasir - elemen yang boleh ditempatkan untuk mempercantik (atau secara spesifik sebagai struktur, seperti dinding) di atas pasir
well0010.bmp Mengandungi 48 peralihan dari pasir ke batuan terang dan gelap
well0011.bmp Mengandungi kutub peta, dengan batuan gelap sebagai latar
well0012.bmp Mengandungi kutub peta, dengan batuan terang sebagai latar

Adalah disarankan untuk melaksanakan dengan tepat, untuk tidak merender Tiles terlebih dahulu untuk menyimpannya dalam cache, kerana data untuk kitaran siang/malam masih perlu diproses - dan akan menghasilkan banyak data.

Tiles adalah grafik 8bpp dengan palet terindeks dengan resolusi 32x32 piksel, yang disusun secara berurutan. Dalam satu set Tiles yang dihasilkan, boleh terdapat jauh lebih banyak.

Kontainer utama terdiri daripada 2 bahagian: head dan data.

Tajuk Jubin

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Bita Ajaib
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera
0x0008 uint(32) Versi / Bendera?

Ini mungkin merujuk kepada penunjuk versi format fail; dalam semua fail yang saya miliki, nilai yang tertera di sini adalah 0x02

0x000c uint(32) Lebar (Resolusi Mendatar)

Menunjukkan seberapa lebar fail gambar tersebut (dalam piksel).

Untuk semua Wells di Outpost 2, nilai 0x20 atau 32 dijangka akan digunakan di sini.

0x0010 uint(32) Tinggi (Penyelesaian Menegak)

Menunjukkan berapa tinggi fail imej itu (dalam piksel).

Untuk semua Wells di Outpost 2, nilai 0x20 atau 32 dijangkakan di sini.

0x0014 uint(32) Kedalaman warna?

Makna nilai ini tidak diketahui.

Oleh kerana ia mengandungi nilai 8 dalam semua fail yang diperiksa, ia mungkin berkaitan dengan penunjuk kedalaman warna.

0x0018 uint(32) Kedalaman warna 2?

Maksud nilai ini tidak diketahui.

Mungkin ini adalah kedalaman warna 'sasaran'.

Setelah maklumat ini, akan ada juga fail palet yang berada dalam format RIFF yang standard. Spesifikasi yang tepat boleh didapati - kerana palet juga muncul di tempat lain - di bawah Palet.

Data Jubin

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Bita Ajaib
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera

Akhirnya, data piksel yang jelas mengikuti, dari kiri-atas secara baris ke kanan-bawah.
Nilai data dalam grafik yang biasanya dalam format bitmap 8bpp sepadan dengan indeks warna dalam palet warna.

Data piksel bermula dari atas kiri dan berakhir di bawah kanan.

Enjin permainan ini nampaknya *mungkin* menggambar Tiles secara on-demand.
Ini mungkin disebabkan oleh kitaran siang-malam, yang mempunyai 32 tahap bagi setiap Tile. Nampaknya, nilai kecerahan akan dikurangkan 'sedikit' setiap kali. Nilai yang tepat masih belum dapat ditentukan, saya bekerja berdasarkan pengiraan

v *= (daylight / 48) + 0.25;

dengan data HSV bagi pixel, di mana daylight adalah nilai antara 0-31 dan v adalah nilai antara 0-1. Selain itu, perlu diambil kira bahawa peta juga mempunyai sempadan 16 Tiles di kiri dan kanan (yang berfungsi untuk spawnen unit secara tidak terlihat).

Selain itu, nampaknya kitaran siang-malam hanya mengemas kini satu lajur peta setiap kitaran permainan.
Kitaran siang-malam yang dipercepat adalah seperti berikut:

Visualisasi kitaran siang-malam

PRT

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 43 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- C P A L . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang Palet

Memberitahu, berbeza dengan format blok biasa, jumlah palet yang terdapat dalam fail ini - bukan panjang blok dalam bait.

0x0007 uint(8) Bendera

Kemungkinan, seperti biasa, Flags.

Saya tidak mengenali sebarang Flags; kerana semua nilai yang saya tahu adalah 0x00, adalah juga mungkin bahawa bilangan palet hanyalah sebuah uint(32).

Saya tidak tahu dengan tepat apa yang dimaksudkan dengan PRT; mungkin ia bermaksud 'Palette dan Resource Table' - kerana fail ini - yang boleh didapati sebagai op2_art.prt dalam maps.vol - adalah sejenisnya, atau ini mungkin menggambarkan fungsinya dengan baik.

Fail ini mengandungi senarai palet, jadual untuk semua bitmap yang digunakan, semua definisi animasi dan beberapa data yang tidak diketahui. Ia mengikuti format kontena sebelum ini secara longgar, kerana tidak semua rekod mengikuti skema ini.

Seksi CPAL (mungkin bermaksud kontena palet) hanya merangkumi data palet, dengan menunjukkan berapa banyak palet 8-bit yang biasanya berukuran 1052 byte yang ada.

Pernyataan 1052-byte tidak dianggap sebagai wajib, kerana format palet mungkin mempunyai saiz palet yang berbeza. Ia hanya terpakai untuk data yang disertakan bersama Outpost 2.

Setelah senarai palet, senarai bitmap akan diikuti secara langsung dan tanpa header pengenalan; begitu juga senarai animasi akan mengikuti dengan segera.
Kedua-duanya dimulakan dengan uint(32) (atau sekali lagi uint24+uint8 bendera?) yang menunjukkan jumlah rekod yang ada.

Palet

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 50 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- P P A L . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang palet

Berikan, berbeza dengan format blok biasa, jumlah palet yang boleh didapati dalam fail ini - bukan panjang blok dalam bait.

0x0007 uint(8) Bendera

Kemungkinan, seperti biasa, Bendera.

Namun, saya tidak mengetahui sebarang Bendera; memandangkan semua nilai yang saya tahu adalah 0x00, adalah juga mungkin bahawa jumlah palet adalah sekadar uint(32).

Informasi palet sangat mudah untuk dibaca.
ianya terdiri daripada satu header dan satu segmen data.

Kepala Palet

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang palet

Berikan, berbeza dengan format blok biasa, jumlah palet yang boleh didapati dalam fail ini - bukan panjang blok dalam bait.

0x0007 uint(8) Bendera

Kemungkinan, seperti biasa, Bendera.

Namun, saya tidak mengetahui sebarang Bendera; memandangkan semua nilai yang saya tahu adalah 0x00, adalah juga mungkin bahawa jumlah palet adalah sekadar uint(32).

0x0008 uint(32) Versi format palet?

Menentukan kemungkinan versi format palet yang diikuti oleh palet tersebut.

Semua palet Outpost2 nampaknya mempunyai versi 0x01.

Data Palet

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Magic Bytes
0x0004 uint(24) Panjang Blok
0x0007 uint(8) Bendera

Bahagian data mengambil entri palet yang berasingan. Jumlah entri palet adalah berdasarkan panjang blok / 4.

Setiap entri mempunyai struktur yang ringkas seperti berikut;

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 -- -- -- 04 -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(8) Komponen Merah

Menunjukkan bahagian merah warna

0x0001 uint(8) Komponen Hijau

Memberikan peratusan hijau bagi warna tersebut

0x0002 uint(8) Komponen Biru

Memberi petunjuk tentang bahagian biru warna

0x0003 uint(8) Tidak Dikenali - Bendera?

Ia tidak jelas apa maksud nilai ini, kerana ia nampaknya pada asasnya 0x04.

Berkaitan dengan palet, hanya ada satu lagi yang perlu dikatakan, iaitu untuk palet yang digunakan untuk animasi, aturan berikut terpakai:

  • Warna pertama SENTIASA transparan, tidak kira apa nilai yang diberikan di situ.
  • Entiti palet 1-24 dianggap sebagai warna pemain dalam palet 1-8.
    Apa yang menjadikan warna selain daripada pemain 1 tidak jelas bagi saya.
    Saya mengesyaki bahawa warna yang lain adalah hardcoded.

Rujukan Palet

Peta Bit

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Lebar yang terarah

Menunjukkan lebar baris data piksel dalam Byte - kerana ini diselaraskan kepada had 4-Byte.

Oleh itu, adalah cepat untuk melompat ke baris gambar tertentu.

Kenapa nilai ini disimpan secara berasingan, walaupun ia boleh dikira, tidak jelas.
Mungkin ini adalah pengoptimuman untuk kod render.

0x0004 uint(32) Offset

Menunjukkan offset bagi baris pertama dalam bitmap

0x0008 uint(32) Tinggi

Nyatakan ketinggian gambar dalam piksel

0x000c uint(32) Lebar

Berikan lebar gambar dalam piksel

0x0010 uint(16) Typ

Menunjukkan jenis gambar. Ini nampaknya adalah bitmask:

  • 0x04 ditetapkan jika ia adalah grafik 1bpp.
  • 0x40 ditetapkan jika ia adalah grafik yang perlu melaksanakan penggambaran tetingkap.
0x0012 uint(16) Palet

Menentukan palet mana dari fail PRT yang akan digunakan

Struktur data PRT ini menunjukkan bagaimana bitmap yang digunakan untuk sprite dibentuk. Bitmap ini berfungsi sebagai komponen tunggal, di mana beberapa disusun menjadi satu bingkai animasi sprite.

Data gambar yang konkret tersembunyi dalam op2_art.BMP di direktori permainan.
Sebab mengapa fail bitmap ini mempunyai header RIFF-bitmap (yang kebanyakannya betul) tidak jelas. Mungkin Outpost 2 menggunakan API sistem untuk memuat grafik, dengan mengambil alih header ini secara sementara dan menimpa medan yang berkaitan dan berbeza.

Data piksel boleh ditemui dalam fail BMP pada Posisi Offset + uint32-Offset, yang boleh dijumpai dalam fail BMP pada alamat 0x000A (offset data RIFF-bitmap), dan sekali lagi menyusunnya baris demi baris dari atas kiri ke bawah kanan.

Grafik monokrom 1bpp boleh dilukis sedemikian rupa, di mana warna 0 adalah ketelusan penuh, dan warna 1 adalah hitam/kelabu separuh telus, kerana grafik monokrom biasanya digunakan untuk bayangan kenderaan dan bangunan dalam animasi.

Dengan itu, banyak grafik dapat disusun.

Modul kediaman terlindung (Plymouth)

Animasi

Sekarang kita masuk ke kelas utama disiplin dalam format data Outpost 2:
Animasi.

Senarai animasi dimulakan dengan header global yang berfungsi terutamanya untuk pengesahan data. Seterusnya adalah definisi animasi yang terperinci, yang dibahagikan kepada 3 tahap:

  1. Animasi
    Satu animasi adalah instans tertinggi; ia menggambarkan animasi bagi satu unit, bangunan, atau 'animasi partikel' (kejadian meteor, cuaca, letupan) dalam keadaan tertentu.
  2. Frame
    Satu frame adalah satu gambar dalam satu animasi. Satu animasi boleh mengandungi satu atau lebih frame.
  3. Subframe
    Satu subframe adalah maklumat yang menunjukkan bahawa bitmap tertentu harus dilukis pada posisi tertentu dalam satu frame berdasarkan kriteria tertentu. Satu frame boleh mengandungi satu atau lebih subframe.

Seterusnya adalah definisi animasi yang spesifik.

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Jumlah animasi

Berapa banyak rekod animasi yang ada

0x0004 uint(32) Bilangan Frame

Berapa banyak bingkai yang seharusnya ada secara keseluruhan

0x0008 uint(32) Jumlah Subframe

Berapa banyak subframe yang sepatutnya ada secara keseluruhan

0x000c uint(32) Bilangan entri pilihan

Berapa banyak "entri pilihan" yang ada.

Animasi

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0020 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(32) Tidak dikenali 1

Maklumat tidak diketahui

0x0004 uint(32) Kotak Pembatas: Kiri

Memberikan permulaan kiri (dalam piksel) bagi Bounding Box.

0x0008 uint(32) Kotak Batas: Atas

Menunjukkan permulaan atas (dalam piksel) bagi Bounding Box.

0x000c uint(32) Kotak Pembatas: Lebar

Menunjukkan lebar (dalam Piksel) Bounding Box.

0x0010 uint(32) Kotak Pembatas: Tinggi

Memberikan ketinggian (dalam Piksel) bagi Bounding Box.

0x0014 uint(32) Offset: X

Menunjukkan titik tengah mendatar animasi

0x0018 uint(32) Offset: Y

Menunjukkan titik tengah menegak bagi animasi

0x001c uint(32) Tidak diketahui 2

Maklumat Tidak Dikenali

0x0020 uint(32) Bilangan Frame

Nyatakan berapa banyak bingkai animasi yang terdapat dalam animasi ini

0x0024 uint(32) Bilangan Tingkap

Tunjukkan berapa banyak tingkap yang perlu digunakan semasa melukis

Data daripada lapisan teratas, animasi, adalah terutamanya data pengurusan - Boundingbox merujuk kepada koordinat tanda di sekitar kenderaan/bangunan, apabila ia dipilih dan juga menunjukkan kawasan yang boleh diklik.

Offset menentukan terutamanya "titik null"; titik yang perlu diselaraskan atau ditolak daripada koordinat dalaman permainan. Kita juga boleh katakan secara matematik: offset merujuk kepada asal koordinat di sini.

Bagi tingkap, sama seperti offset, terdapat 4 nilai uint(32) bagi setiap tingkap, yang menunjukkan kawasan yang boleh digunakan untuk subframe tertentu. Di luar tingkap, sepanjang ia diperuntukkan untuk bitmap, tidak boleh dilukis.

Rangka

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(8) Bilangan subframe dan toggle untuk Pilihan 1, 2

Nilai ini mengandungi:

  • 0x7F (Mask bit): Jumlah subframe yang digunakan dalam bingkai ini
  • 0x80: Maklumat mengenai sama ada Pilihan 1 dan 2 tersedia
0x0001 uint(8) Tidak diketahui 1 dan Togol untuk Pilihan 3, 4

Nilai ini mengandungi:

  • 0x7F (Maska bit): Tidak diketahui - Saya sangat mengesyaki bahawa ini berkaitan dengan jumlah gameticks yang berlalu sebelum bingkai seterusnya ditunjukkan
  • 0x80: Maklumat mengenai sama ada Pilihan 3 dan 4 ada
0x0002 uint(8) Pilihan 1

Tidak Dikenali

0x0003 uint(8) Pilihan 2

Tidak Dikenali

0x0004 uint(8) Opsyen 3

Tidak Dikenali

0x0005 uint(8) Pilihan 4

Tidak Dikenali

Subframe

Adr x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF watak
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Offset Jenis Data Nama Penjelasan
0x0000 uint(16) Bitmap-Id

Nyatakan bitmap mana yang akan digunakan untuk subframe ini

0x0002 uint(8) Tidak dikenali 1

Adalah tidak diketahui - tetapi saya sangat mengesyaki bahawa ini berkaitan dengan keutamaan render (Z-Lapisan).

0x0003 uint(8) Id Subframe

Nyatakan dalam subframe mana kita berada

0x0004 sint(16) Offset - Mendatar

Menunjukkan di mana dalam bingkai subbingkaian harus diletakkan, atau berapa banyak piksel bitmap harus dipindahkan secara mendatar

0x0006 sint(16) Offset - Vertikal

Nyatakan di mana dalam bingkai subbingkai harus diletakkan, atau berapa banyak piksel bitmap perlu dipindahkan secara menegak

Dengan ini, kita kini boleh menggabungkan bingkai individu serta animasi lengkap, di sini sebagai contoh pada animasi yang lebih kompleks, animasi dengan indeks 500, didemonstrasikan

Animasi 500

Animasi 500 menunjukkan bagaimana sebuah Plymouth-transport yang dipenuhi dengan bahan mentah biasa sedang dibongkar. Ini adalah salah satu dari sedikit animasi yang menggunakan fungsi pengendalian tetingkap.

Dan dengan itu, animasi lengkap dapat disatukan.
Malangnya, masih ada masalah dengan pintu muatan atas, kerana bit yang berkaitan dalam maklumat jenis grafik tidak ditetapkan.

Sini ada beberapa sprite lain yang dianimasikan dengan indah dari permainan:

Penjanaan animasi 500 yang diilustrasikan

Animasi 500 siap disatukan

Plymouth Kilang Bangunan

Eden Pangkalan Angkasa

Eden Pusat Perubatan

SCAT

Plymouth Pangkalan Angkasa

Easteregg:
Santa Claus

Easteregg:
Dog Dans

Antaramuka Pengguna

Sekarang hanya tinggal antaramuka pengguna permainan yang mempunyai rupa logam berus.

Tetapi di sini juga jelas bahawa Dynamix tidak perlu mencipta semula roda; di sini bukan sahaja menggunakan API User32 dan GDI32 yang disediakan oleh Windows - khususnya juga pengurusan sumber dari User32 digunakan.

Ini boleh diekstrak menggunakan program seperti Resource Hacker yang dibangunkan oleh Angus Johnson sebagai perisian percuma, atau - jika anda menghindari penggunaan Wine di Linux / Mac OS - dengan menggunakan wrestool yang terdapat dalam icoutils.

Nama Fail Isi
Outpost2.exe Hanya mengandungi ikon permainan yang menunjukkan stesen angkasa di New Terra
op2shres.dll Mengandungi grafik untuk elemen kawalan seperti bingkai, butang, butang radio dan kotak semak, serta latar belakang dialog, gambar sokongan untuk teks misi cerita dan grafik latar belakang menu utama
out2res.dll Mengandungi hiasan tingkap dalam permainan, ikon untuk logam biasa dan khas, skrin pemuatan, grafik untuk dialog serta grafik kursor tambahan, di samping kursor animasi dalam direktori permainan