Outpost 2 Format Fail · bei.pm
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.
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:
|
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.
|
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 |
0x000c | uint(32) | Lebar (Resolusi Mendatar) | Menunjukkan seberapa lebar fail gambar tersebut (dalam piksel). Untuk semua Wells di Outpost 2, nilai |
0x0010 | uint(32) | Tinggi (Penyelesaian Menegak) | Menunjukkan berapa tinggi fail imej itu (dalam piksel). Untuk semua Wells di Outpost 2, nilai |
0x0014 | uint(32) | Kedalaman warna? | Makna nilai ini tidak diketahui. Oleh kerana ia mengandungi nilai |
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.
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:
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 |
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 |
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 |
0x0008 | uint(32) | Versi format palet? | Menentukan kemungkinan versi format palet yang diikuti oleh palet tersebut. Semua palet Outpost2 nampaknya mempunyai versi |
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 |
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.
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. |
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:
|
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.
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:
-
Animasi
Satu animasi adalah instans tertinggi; ia menggambarkan animasi bagi satu unit, bangunan, atau 'animasi partikel' (kejadian meteor, cuaca, letupan) dalam keadaan tertentu. -
Frame
Satu frame adalah satu gambar dalam satu animasi. Satu animasi boleh mengandungi satu atau lebih frame. -
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:
|
0x0001 | uint(8) | Tidak diketahui 1 dan Togol untuk Pilihan 3, 4 | Nilai ini mengandungi:
|
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:
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 |