Outpost 2 Format File · bei.pm
Format file yang dijelaskan di halaman ini didasarkan pada analisis teknis dari kekayaan intelektual oleh Dynamix, Inc. dan Sierra Entertainment.
Kekayaan intelektual ini saat ini merupakan bagian dari massa Activision Publishing, Inc. / Activision Blizzard, Inc. dan saat ini dimiliki oleh Microsoft Corp..
Informasi ini telah dikumpulkan melalui Reverse Engineering dan analisis data untuk tujuan pengarsipan dan interoperabilitas dengan data historis.
Tidak ada spesifikasi yang bersifat kepemilikan atau rahasia yang digunakan.
Game ini saat ini dapat dibeli sebagai unduhan di gog.com.
Seri artikel berikut mendokumentasikan pengetahuan saya tentang format data dalam permainan strategi waktu nyata "Outpost 2: Divided Destiny", yang dirilis oleh Sierra pada tahun 1997 dan dikembangkan oleh Dynamix.
Saya telah fokus pada analisis data permainan - dan apa yang dapat dilakukan dengannya - dari sekitar 1 November 2015 hingga 14 November 2015.
Berdasarkan informasi yang telah saya kumpulkan sejauh ini, Dynamix - seperti banyak perusahaan komersial lainnya - tidak mengembangkan beberapa format data secara khusus untuk Outpost 2, melainkan juga menggunakannya dalam pengembangan lain seperti seri Mechwarrior (dimodifikasi).
Terlepas dari itu, dapat juga dicatat bahwa inovasi dalam format data praktis terbatas dan sering kali dibangun di atas konsep yang sudah ada dari format umum seperti JFIF dan RIFF.
Untuk interpretasi tabel dan format data, informasi lebih lanjut tersedia di Apa itu?.
Data yang diberikan di sini umumnya harus dipahami sebagai Little Endian.
Sebagai kesimpulan, dapat dikatakan bahwa rekayasa balik sangat menyenangkan, meskipun tidak sepenuhnya lengkap.
Tentu saja, saya juga merekomendasikan untuk memainkan permainan itu sendiri, karena menawarkan mekanika permainan yang menarik.
Pengantar
Format data yang digunakan oleh Outpost 2 memiliki struktur yang mirip dengan JFIF / PNG - setiap blok data selalu dilengkapi dengan header 8 byte. Oleh karena itu, saya tidak akan mendokumentasikan setiap header di tempat yang sesuai dan hanya mendokumentasikan penyimpangan.
Formatnya selalu seperti berikut; data yang sebenarnya kemudian tersemat di dalamnya:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | Berisi informasi tentang apa yang diharapkan di blok data berikutnya. Nilai yang dikenal:
|
0x0004 | uint(24) | Panjang blok | Berisi informasi tentang seberapa besar (dalam Byte) blok data berikut. Yang dimaksud di sini adalah data yang sebenarnya - 8 Byte header tidak termasuk di dalamnya. |
0x0007 | uint(8) | Bendera? | Tidak diketahui dengan pasti apa fungsi blok ini. Di dalam Volume, nilai ini sering kali 0x80, sedangkan di file lain sering kali 0x00. Ini menunjukkan bahwa ini mungkin merupakan pengaturan flag. |
Volume
Volume adalah sebuah wadah data untuk permainan, mirip dengan format arsip seperti Tarball. Setidaknya di Outpost 2, format ini hanya mengenal file - tidak ada folder. Mungkin saja folder tersebut dapat disimulasikan melalui nama file yang sesuai.
Sebuah Volume terdiri dari header Volume serta beberapa blok Volume yang sesuai dengan file-file konkret.
"Volumes" adalah file dengan akhiran 'vol'
di direktori permainan.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 4f | 4c | 20 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | O | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera |
Judul Volume
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 68 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | h | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera |
Header Volume tidak mengandung data berguna apapun.
Ia hanya berfungsi sebagai wadah.
Tanggal pertama dalam Header Volume seharusnya berisi string Volume; diikuti oleh informasi Volume.
String Volume
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe 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 | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 73 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | s | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera | |
0x0008 | uint(32) | Panjang Payload | Menunjukkan berapa banyak byte dari data berikut yang sebenarnya adalah data berguna. Sisa data dari daftar volume-string tampaknya dianggap sebagai sampah. Pada file dengan tanggal yang lebih baru, 'sisa data' ini adalah 0x00, yang mungkin menunjukkan kekurangan dalam toolchain selama pengembangan permainan, maksudnya, seorang pengembang baru memperhatikan inisialisasi buffer dengan benar sangat terlambat, karena tidak ada pengaruh terhadap permainan apakah data diinisialisasi atau tidak. |
0x000c | uint(8)[] | Daftar nama file | Ini adalah daftar nama file yang diakhiri dengan 0-byte, yang - setidaknya dalam komponen data yang ada - hanya mengharapkan karakter ASCII. Tidak perlu untuk menganalisis blok data ini lebih dalam saat parsing data, karena dalam informasi volume sudah langsung direferensikan offset dari nama-nama file tersebut. |
Volume Strings adalah daftar nama file yang terdapat dalam volume tersebut.
Informasi Volume
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 76 | 6f | 6c | 69 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | v | o | l | i | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera |
Informasi volume mencakup informasi yang lebih rinci tentang file-file. Ini dapat dianggap sebagai semacam entri direktori FAT (FAT = Tabel Alokasi File).
Jumlah file diperoleh dari ukuran blok dibagi dengan panjang entrinya direktori - 14 byte.
Setiap entri direktori memiliki struktur sebagai berikut:
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Offset Nama Berkas | Menunjukkan pada offset (!) mana di dalam daftar nama file (Volume-Strings) nama file dari berkas tersebut berada. Ini merujuk pada awal blok data yang digunakan. |
0x0004 | uint(32) | Offset berkas | Menunjukkan pada offset mana dalam keseluruhan file volume file tersebut berada. |
0x0008 | uint(32) | Ukuran file | Menunjukkan seberapa besar file dalam byte. |
0x000c | uint(16) | Bendera? | Jelas memberikan informasi tambahan tentang pengkodean file.
|
Blok Volume
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 56 | 42 | 4c | 48 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | V | B | L | H | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera |
Sebuah Volume-Block adalah sebuah wadah yang menyimpan file. Ia hanya mengandung sekali lagi - karena format blok - ukuran file secara redundan dan setelah itu langsung diikuti oleh data yang digunakan.
Ubin
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 42 | 4d | 50 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | B | M | P | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera |
Tiles adalah format grafik bitmap yang spesifik untuk Outpost-2.
Mereka terdiri dari 13 set tiles, yang disebut "wells"
(well0000.bmp
hingga well0012.bmp
),
yang berada di dalam volume maps.vol.
Set tiles / Wells ini berisi hal-hal berikut:
Nama File | Kandungan |
---|---|
well0000.bmp | Sebuah grafik berukuran 32x32px berwarna biru - ideal untuk menguji apakah pemuat gambar Anda berfungsi |
well0001.bmp | Berisi batuan terang, pegunungan di atas batuan terang, dan berbagai variasi kawah benturan di batuan terang |
well0002.bmp | Berisi 'Doodads' batuan terang - yaitu elemen yang dapat ditempatkan untuk mempercantik (atau sengaja sebagai struktur, seperti dinding) di atas batuan terang, termasuk vegetasi |
well0003.bmp | Berisi struktur seperti kerak di atas batuan terang |
well0004.bmp | Berisi batuan gelap, pegunungan di atas batuan gelap, dan berbagai variasi kawah benturan di batuan gelap |
well0005.bmp | Berisi 'Doodads' batuan gelap - yaitu elemen yang dapat ditempatkan untuk mempercantik (atau sengaja sebagai struktur, seperti dinding) di atas batuan gelap |
well0006.bmp | Berisi struktur seperti kerak di atas batuan gelap, serta transisi antara batuan terang dan gelap |
well0007.bmp | Berisi lava termasuk masing-masing 4-5 bingkai animasi dari lava tersebut |
well0008.bmp | Berisi pasir dan berbagai variasi kawah benturan di pasir |
well0009.bmp | Berisi 'Doodads' pasir - yaitu elemen yang dapat ditempatkan untuk mempercantik (atau sengaja sebagai struktur, seperti dinding) di atas pasir |
well0010.bmp | Berisi masing-masing 48 transisi dari pasir ke batuan terang dan gelap |
well0011.bmp | Berisi kutub peta, dengan batuan gelap sebagai dasar |
well0012.bmp | Berisi kutub peta, dengan batuan terang sebagai dasar |
Sangat disarankan untuk pelaksanaan yang akurat, agar tidak merender Tiles sebelumnya untuk di-cache, karena data untuk siklus siang/malam masih harus diproses - dan akan ada sangat banyak data yang dihasilkan.
Tiles adalah grafik 8bpp dengan palet terindeks dengan resolusi 32x32 piksel, yang disusun satu sama lain. Dalam sebuah tileset yang dihasilkan, namun bisa jauh lebih banyak
Kontainer utama terdiri dari 2 seksi: head
dan data
.
Judul Ubin
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera | |
0x0008 | uint(32) | Versi / Bendera? | Ini mungkin merujuk pada versi format file; di semua file yang saya miliki, nilai yang tertera di sini adalah |
0x000c | uint(32) | Lebar (Resolusi Horizontal) | Menunjukkan seberapa lebar file gambar tersebut (dalam piksel). Untuk semua sumur di Outpost 2, nilai yang diharapkan di sini adalah |
0x0010 | uint(32) | Tinggi (Resolusi Vertikal) | Menunjukkan seberapa tinggi file gambar tersebut (dalam piksel). Untuk semua Wells dari Outpost 2, nilai |
0x0014 | uint(32) | Kedalaman warna? | Makna nilai ini tidak diketahui. Karenanya, karena ia mengandung nilai |
0x0018 | uint(32) | Kedalaman warna 2? | Makna dari nilai ini tidak diketahui. Ini mungkin merupakan kedalaman warna 'tujuan'. |
Setelah informasi ini, akan ada file palet yang tersedia dalam format RIFF yang distandarisasi. Spesifikasi yang tepat dapat ditemukan - karena palet tersebut juga muncul di tempat lain - di Palet.
Data Ubin
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera |
Akhirnya, data piksel mentah mengikuti, dari kiri atas ke kanan bawah secara baris.
Nilai data pada grafik yang biasanya berupa bitmap 8bpp ini sesuai dengan indeks warna dalam palet warna.
Engine permainan menggambar Tiles *kemungkinan* sesuai permintaan.
Ini tampaknya terkait dengan siklus siang-malam, yang memiliki 32 tingkatan untuk setiap Tile. Tampaknya, setiap kali nilai kecerahan 'sedikit' dikurangi. Nilai yang tepat masih belum dapat ditentukan, saya bekerja berdasarkan perhitungan
v *= (daylight / 48) + 0.25;
dari data HSV piksel, di mana daylight adalah nilai dari 0-31 dan v adalah nilai antara 0-1. Selain itu, perlu diperhatikan bahwa di peta terdapat batas masing-masing 16 Tile di kiri dan kanan (yang digunakan untuk pemunculan unit secara tak terlihat).
Selain itu, siklus siang-malam sepertinya hanya memperbarui satu kolom peta per siklus permainan.
Siklus siang-malam yang dipercepat terlihat seperti berikut:
PRT
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 43 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | C | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang palet | Berikan, berbeda dengan format blok normal, jumlah palet yang dapat ditemukan dalam file ini - bukan panjang blok dalam byte. |
0x0007 | uint(8) | Bendera | Sepertinya, seperti biasa, ada Flags. Namun, saya tidak mengetahui adanya Flags; karena semua nilai yang saya tahu sesuai dengan |
Saya tidak tahu apa sebenarnya yang dimaksud dengan PRT
; bisa jadi itu berarti 'Palette dan Resource Table' - karena file ini - yang dapat ditemukan sebagai op2_art.prt di dalam maps.vol - adalah seperti itu, atau ini bisa menggambarkan fungsinya dengan cukup baik.
File ini berisi daftar palet, tabel tentang semua bitmap yang digunakan, semua definisi animasi, dan sejumlah data yang tidak diketahui. File ini mengikuti format kontainer yang ada sebelumnya secara longgar, karena tidak semua catatan mengikuti skema ini.
Seksi CPAL
(yang mungkin berarti Paletten-Container) hanya mencakup data palet dengan menyatakan berapa banyak dari palet 8-bit yang biasanya berukuran 1052 byte yang ada.
Pernyataan ukuran 1052 byte ini tidak dianggap wajib, karena format palet dapat memungkinkan ukuran palet yang berbeda. Ini hanya berlaku untuk data yang disertakan dengan Outpost 2.
Setelah daftar palet, diikuti langsung dan tanpa header pengantar, adalah daftar bitmap; begitu juga, daftar animasi mengikuti dengan segera.
Keduanya masing-masing diawali dengan uint(32) (atau mungkin uint24+uint8 flags?) yang berisi jumlah catatan.
Palet
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 50 | 50 | 41 | 4c | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | P | P | A | L | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Palet | Menunjukkan jumlah palet yang dapat ditemukan dalam file ini, bertentangan dengan format blok normal - bukan panjang blok dalam byte. |
0x0007 | uint(8) | Bendera | Sepertinya, seperti biasa, adalah Flags. Namun, saya tidak mengetahui adanya Flags; karena semua nilai yang saya ketahui sesuai dengan |
Informasi palet sangat mudah dibaca.
Mereka terdiri dari header dan segmen data.
Header Palet
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 68 | 65 | 61 | 64 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | h | e | a | d | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Palet | Menunjukkan jumlah palet yang dapat ditemukan dalam file ini, bertentangan dengan format blok normal - bukan panjang blok dalam byte. |
0x0007 | uint(8) | Bendera | Sepertinya, seperti biasa, adalah Flags. Namun, saya tidak mengetahui adanya Flags; karena semua nilai yang saya ketahui sesuai dengan |
0x0008 | uint(32) | Versi format palet? | Menentukan kemungkinan versi format palet mana yang diikuti oleh palet tersebut. Semua palet Outpost2 tampaknya memiliki versi |
Data Palet
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | 64 | 61 | 74 | 61 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | d | a | t | a | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Magic Bytes | |
0x0004 | uint(24) | Panjang Blok | |
0x0007 | uint(8) | Bendera |
Seksi data mencakup setiap entri palet. Jumlah entri palet diperoleh dari panjang blok / 4.
Setiap entri memiliki struktur sederhana sebagai berikut;
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | 04 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(8) | Komponen Merah | Menunjukkan proporsi warna merah |
0x0001 | uint(8) | Komponen hijau | Menunjukkan proporsi hijau dari warna |
0x0002 | uint(8) | Komponen Biru | Memberikan proporsi warna biru |
0x0003 | uint(8) | Tidak Dikenal - Bendera? | Belum jelas apa arti nilai ini, karena tampaknya pada dasarnya adalah |
Tentang palet, hanya bisa dikatakan bahwa untuk palet yang digunakan untuk animasi, aturan berikut berlaku:
- Warna pertama SELALU transparan, terlepas dari nilai apa yang diberikan di sana.
-
Entri palet 1-24 dianggap sebagai warna pemain dalam palet 1-8.
Asal warna di luar pemain 1 saya tidak tahu.
Saya menduga warna-warna lainnya sudah di-hardcode.
Bitmaps
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Lebar yang diarahkan | Menunjukkan lebar baris data piksel dalam Byte - karena ini disesuaikan dengan batas 4-Byte. Dengan demikian, menjadi cepat untuk melompat ke baris gambar tertentu. Alasan mengapa nilai ini disimpan secara terpisah, meskipun dapat dihitung, tidak jelas. |
0x0004 | uint(32) | Offset | Menunjukkan offset dari baris pertama dalam bitmap |
0x0008 | uint(32) | Tinggi | Menunjukkan tinggi gambar dalam piksel |
0x000c | uint(32) | Lebar | Berikan lebar gambar dalam piksel |
0x0010 | uint(16) | Tipe | Menunjukkan jenis gambar. Di sini tampaknya ini adalah sebuah bitmask:
|
0x0012 | uint(16) | Palet | Menentukan palet mana yang akan digunakan dari file PRT |
Struktur data dari file PRT ini menunjukkan bagaimana bitmap yang digunakan untuk sprite dibangun. Bitmap ini berfungsi sebagai komponen tunggal, yang beberapa di antaranya dirakit menjadi satu frame animasi dari sprite.
Data gambar konkret terdapat dalam op2_art.BMP di direktori game.
Alasan mengapa file bitmap ini memiliki header RIFF-Bitmap (yang sebagian besar benar) masih belum jelas. Mungkin Outpost 2 menggunakan API sistem untuk memuat grafik, dengan cara sementara mengambil header ini dan menimpa bidang yang sesuai dan bervariasi.
Data piksel dapat ditemukan di dalam file BMP pada posisi Offset + uint32-Offset, yang dapat ditemukan di alamat 0x000A dalam file BMP (offset data RIFF-Bitmap), dan kembali sesuai dengan pengaturan per baris dari kiri atas ke kanan bawah.
Grafik monokrom 1bpp dapat digambar sedemikian rupa, hingga warna 0 mewakili transparansi penuh, sedangkan warna 1 adalah hitam/abu-abu setengah transparan, karena grafik monokrom biasanya digunakan untuk bayangan kendaraan dan bangunan dalam animasi.
Dengan demikian, banyak grafik sudah dapat dirakit.
Animasi
Sekarang kita sampai pada kelas utama disiplin dalam format data Outpost 2:
Animasi.
Daftar animasi dimulai dengan header global yang terutama digunakan untuk verifikasi data. Selanjutnya adalah definisi animasi konkret yang dibagi menjadi 3 tingkatan:
-
Animasi
Sebuah animasi adalah instansi tertinggi; ia mewakili animasi dari sebuah unit, bangunan, atau 'animasi partikel' (benturan komet, cuaca, ledakan) dalam keadaan tertentu. -
Frame
Sebuah frame adalah satu gambar tunggal dalam sebuah animasi. Sebuah animasi dapat terdiri dari satu atau lebih frame. -
Subframe
Sebuah subframe adalah informasi tentang bahwa bitmap tertentu harus digambar pada posisi tertentu dari sebuah frame berdasarkan kriteria tertentu. Sebuah frame dapat terdiri dari satu atau lebih subframe.
Selanjutnya adalah definisi animasi yang spesifik.
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Jumlah Animasi | Berapa banyak data animasi yang tersedia |
0x0004 | uint(32) | Jumlah Frame | Berapa banyak frame yang seharusnya ada secara total |
0x0008 | uint(32) | Jumlah Subframe | Berapa banyak subframe yang seharusnya ada secara keseluruhan |
0x000c | uint(32) | Jumlah entri opsional | Berapa banyak "entri opsional" yang tersedia. |
Animasi
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0010 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
0x0020 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(32) | Tidak Dikenal 1 | Informasi yang Tidak Dikenal |
0x0004 | uint(32) | Kotak Pembatas: Kiri | Menunjukkan awal kiri (dalam piksel) dari Bounding Box. |
0x0008 | uint(32) | Bounding Box: Atas | Menunjukkan awal atas (dalam piksel) dari Bounding Box. |
0x000c | uint(32) | Bounding Box: Lebar | Menunjukkan lebar (dalam piksel) dari Bounding Box. |
0x0010 | uint(32) | Kotak Pembatas: Tinggi | Menunjukkan tinggi (dalam Piksel) dari Bounding Box. |
0x0014 | uint(32) | Offset: X | Menunjukkan titik tengah horizontal dari animasi |
0x0018 | uint(32) | Offset: Y | Menunjukkan titik tengah vertikal dari animasi |
0x001c | uint(32) | Tidak Dikenal 2 | Informasi Tidak Dikenal |
0x0020 | uint(32) | Jumlah Frame | Menunjukkan berapa banyak frame animasi yang terdapat dalam animasi ini |
0x0024 | uint(32) | Jumlah Jendela | Menunjukkan berapa banyak jendela yang harus digunakan saat menggambar |
Data dari lapisan tertinggi, yaitu animasi, terutama adalah data administratif - Boundingbox merujuk pada koordinat penanda di sekitar kendaraan/bangunan, kapan pun itu dipilih dan juga menunjukkan area mana yang dapat diklik.
Offset terutama menentukan "titik nol"; titik yang harus ditambahkan atau dikurangkan pada koordinat internal permainan. Dapat juga dikatakan secara matematis: offset di sini merujuk pada asal koordinat.
Windows terdiri dari 4 nilai uint(32) untuk setiap window, yang menunjukkan area yang dianggap dapat digunakan untuk subframe tertentu. Di luar windows, tidak boleh digambar, jika tidak ditentukan untuk bitmap tersebut.
Kerangka
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(8) | Jumlah subframe dan toggle untuk Opsional 1, 2 | Nilai ini mencakup:
|
0x0001 | uint(8) | Tidak dikenal 1 dan Toggle untuk Opsional 3, 4 | Nilai ini berisi:
|
0x0002 | uint(8) | Opsional 1 | Tidak Dikenal |
0x0003 | uint(8) | Opsional 2 | Tidak Dikenal |
0x0004 | uint(8) | Opsional 3 | Tidak Dikenal |
0x0005 | uint(8) | Opsional 4 | Tidak Dikenal |
Subframe
Adr | x0 | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | xA | xB | xC | xD | xE | xF | karakter | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x0000 | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . | . |
Offset | Tipe Data | Nama | Penjelasan |
---|---|---|---|
0x0000 | uint(16) | Bitmap-Id | Menunjukkan bitmap mana yang akan digunakan untuk subframe ini |
0x0002 | uint(8) | Tidak Dikenal 1 | Tidak diketahui - namun saya sangat menduga bahwa ini berkaitan dengan prioritas render (Z-Layer). |
0x0003 | uint(8) | Subframe-Id | Menunjukkan di subframe mana kita berada |
0x0004 | sint(16) | Offset - Horizontal | Menunjukkan di mana dalam bingkai subframe harus ditempatkan, atau berapa banyak piksel bitmap harus digeser secara horizontal |
0x0006 | sint(16) | Offset - Vertikal | Menunjukkan di mana dalam frame subframe harus ditempatkan, atau seberapa banyak piksel bitmap harus dipindahkan secara vertikal. |
Dengan ini, kita sekarang dapat menyusun frame individu maupun animasi lengkap, di sini sebagai contoh pada animasi yang lebih kompleks, animasi dengan indeks 500, diperagakan
Animasi 500
Animasi 500 menunjukkan bagaimana sebuah Plymouth-Transporter, yang dimuat dengan bijih biasa, dibongkar. Ini adalah salah satu dari sedikit animasi yang memanfaatkan fungsionalitas windowing.
Dan inilah cara untuk menyatukan seluruh animasi.
Sayangnya, masih ada masalah dengan pintu atas, karena bit yang sesuai dalam informasi jenis grafik tidak diatur.
Ini beberapa sprite yang sangat indah dan dianimasikan dari permainan:
Antarmuka Pengguna
Sekarang masih perlu antarmuka pengguna dari permainan, yang memiliki tampilan logam yang disikat.
Tetapi di sini juga terlihat bahwa Dynamix tidak perlu menciptakan kembali roda; di sini tidak hanya menggunakan secara sederhana API User32 dan GDI32 yang disediakan oleh Windows - terutama juga menggunakan manajemen sumber daya dari User32.
Ini dapat diekstraksi menggunakan program seperti Resource Hacker yang dikembangkan oleh Angus Johnson sebagai perangkat lunak gratis, atau - jika Anda menghindari penggunaan Wine di Linux / Mac OS - dengan bantuan wrestool yang terdapat dalam icoutils.
Nama Berkas | Isi |
---|---|
Outpost2.exe | Hanya berisi ikon permainan yang menampilkan stasiun luar angkasa di New Terra |
op2shres.dll | Selain grafik untuk kontrol seperti batas, tombol, tombol radio, dan kotak centang, juga berisi latar belakang dialog, gambar pendukung untuk teks misi cerita, dan grafik latar belakang menu utama |
out2res.dll | Berisi dekorasi jendela dalam permainan, ikon untuk logam biasa dan khusus, layar pemuatan, grafik untuk dialog serta grafik kursor lainnya, selain yang animasi di direktori permainan |