Outpost 2 Format File · bei.pm

Teks ini telah diterjemahkan secara otomatis oleh OpenAI GPT-4o Mini.

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.

Karya seni dari permainan

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:

  • 0x204C4F56 ('VOL '):
    Volume
  • 0x686C6F76 ('VOLH'):
    Header Volume
  • 0x736C6F76 ('VOLS'):
    String Volume
  • 0x696C6F76 ('VOLI'):
    Informasi Volume
  • 0x4B4C4256 ('BLCK'):
    Blok Volume
  • 0x504D4250 ('PBMP'):
    Data Grafis
  • 0x4C415050 ('PPAL'):
    Pallet Warna
  • 0x4C415043 ('CPAL'):
    Kontainer Palet Warna
  • 0x64616568 ('head'):
    Header
  • 0x61746164 ('data'):
    Data Berguna
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.

  • 0x03 diatur jika file terkompresi. Di sini tampaknya menggunakan pohon Huffman.
  • 0x80 tampaknya selalu diatur.

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 0x02

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 0x20 atau 32.

0x0010 uint(32) Tinggi (Resolusi Vertikal)

Menunjukkan seberapa tinggi file gambar tersebut (dalam piksel).

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

0x0014 uint(32) Kedalaman warna?

Makna nilai ini tidak diketahui.

Karenanya, karena ia mengandung nilai 8 di semua file yang diperiksa, ini bisa jadi merupakan indikasi kedalaman warna.

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.

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

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:

Visualisasi siklus siang-malam

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 0x00, mungkin juga bisa jadi bahwa jumlah palet hanyalah sebuah uint(32).

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 0x00, mungkin juga bisa jadi jumlah palet hanya berupa uint(32).

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 0x00, mungkin juga bisa jadi jumlah palet hanya berupa uint(32).

0x0008 uint(32) Versi format palet?

Menentukan kemungkinan versi format palet mana yang diikuti oleh palet tersebut.

Semua palet Outpost2 tampaknya memiliki versi 0x01.

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 0x04.

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.

Referensi Palet

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.
Mungkin ini adalah optimasi untuk kode render.

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:

  • 0x04 diatur jika itu adalah grafik 1bpp.
  • 0x40 diatur jika itu adalah grafik yang harus menerapkan windowing.
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.

Modul hunian terlindungi (Plymouth)

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:

  1. Animasi
    Sebuah animasi adalah instansi tertinggi; ia mewakili animasi dari sebuah unit, bangunan, atau 'animasi partikel' (benturan komet, cuaca, ledakan) dalam keadaan tertentu.
  2. Frame
    Sebuah frame adalah satu gambar tunggal dalam sebuah animasi. Sebuah animasi dapat terdiri dari satu atau lebih frame.
  3. 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:

  • 0x7F (Bitmask): Jumlah subframe yang digunakan dalam frame ini
  • 0x80: Informasi tentang apakah Opsional 1 dan 2 ada
0x0001 uint(8) Tidak dikenal 1 dan Toggle untuk Opsional 3, 4

Nilai ini berisi:

  • 0x7F (Bitmask): Tidak diketahui - Saya sangat menduga bahwa ini adalah jumlah Gameticks yang berlalu hingga frame berikutnya ditampilkan
  • 0x80: Informasi tentang apakah Optional 3 dan 4 tersedia
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:

Penampilan dari Animasi 500 yang diilustrasikan

Animasi 500 selesai disatukan

Pabrik Bangunan Plymouth

Pangkalan Luar Angkasa Eden

Pusat Medis Eden

SCAT

Pangkalan Luar Angkasa Plymouth

Easteregg:
Santa Claus

Easteregg:
Dans Dog

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