Outpost 2 Dosya Formatları · bei.pm

Bu metin, OpenAI GPT-4o Mini tarafından otomatik olarak çevrilmiştir.

Bu sayfada tanımlanan dosya formatları, Dynamix, Inc. ve Sierra Entertainment tarafından yapılan teknik analizlere dayanmaktadır.
Bugün fikri mülkiyet, Activision Publishing, Inc. / Activision Blizzard, Inc. grubunun bir parçasıdır ve şu anda Microsoft Corp. tarafından sahiptir.

Bilgiler, arşivleme ve tarihsel verilerle birlikte çalışabilirlik amacıyla ters mühendislik ve veri analizi yoluyla derlenmiştir.
Hiçbir özel veya gizli spesifikasyon kullanılmamıştır.

Oyun şu anda gog.com üzerinden indirme olarak satın alınabilir.

Oyun sanat çalışması

Aşağıdaki makale dizisi, 1997 yılında Sierra tarafından yayımlanan ve Dynamix tarafından geliştirilen "Outpost 2: Divided Destiny" gerçek zamanlı strateji oyunundaki veri formatlarıyla ilgili edindiğim bilgileri belgelemektedir.

1 Kasım 2015'ten 14 Kasım 2015'e kadar, oyunun verilerini analiz etmekle ve bunlarla ne yapılabileceğiyle yoğun bir şekilde ilgilendim.

Şu ana kadar elde ettiğim bilgilere göre, Dynamix - birçok ticari şirket gibi - bazı veri formatlarını yalnızca Outpost 2 için değil, aynı zamanda Mechwarrior serisi gibi başka projelerde de (değiştirilmiş olarak) kullanmıştır.
Bunun yanı sıra, veri formatlarının yenilikçi potansiyelinin neredeyse sınırlı olduğu ve genellikle JFIF ve RIFF gibi yaygın formatlardan uzun süredir var olan kavramlara dayandığı da görülmektedir.

Tabloların ve veri formatlarının yorumlanmasıyla ilgili daha fazla bilgi için Bu nedir? adresine göz atabilirsiniz.
Burada verilen veriler genel olarak Little Endian olarak anlaşılmalıdır.

Son olarak, ters mühendislik çalışmalarının çok eğlenceli olduğunu söyleyebilirim, ancak bu çalışmalar tamamen tamamlanmış değildir.
Tabii ki, oyunu kendiniz oynamanızı da öneririm, çünkü ilginç oyun mekanikleri sunmaktadır.

Giriş

Outpost 2 tarafından kullanılan veri formatları JFIF / PNG'yi andıran bir yapıya sahiptir - bireysel veri blokları her zaman 8 baytlık bir başlığa sahiptir. Bu nedenle, ilgili spesifik yerlerde bireysel başlıkları belgelemekten kaçınıyorum ve sadece sapmaları belgelemeye karar verdim.

Format her zaman aşağıdaki gibidir; asıl veri iç içe yerleştirilmiştir:

Adres x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF karakter
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Büyülü Baytlar

Bir sonraki veri bloğunda nelerin beklenebileceği hakkında bilgi içerir.

Bilinmiş değerler:

  • 0x204C4F56 ('VOL '):
    Ses Seviyesi
  • 0x686C6F76 ('VOLH'):
    Ses Seviyesi Başlığı
  • 0x736C6F76 ('VOLS'):
    Ses Seviyesi Dizeleri
  • 0x696C6F76 ('VOLI'):
    Ses Seviyesi Bilgileri
  • 0x4B4C4256 ('BLCK'):
    Ses Seviyesi Bloğu
  • 0x504D4250 ('PBMP'):
    Grafik Verileri
  • 0x4C415050 ('PPAL'):
    Renk Paleti
  • 0x4C415043 ('CPAL'):
    Renk Paletleri Konteyneri
  • 0x64616568 ('head'):
    Başlık
  • 0x61746164 ('data'):
    Kullanıcı Verileri
0x0004 uint(24) Blok Uzunluğu

Aşağıdaki veri bloğunun boyutunun (byte cinsinden) ne kadar olduğunu gösteren bilgiyi içerir.

Burada yalnızca saf veri anlamına gelmektedir - 8 byte'lık başlık bu hesaplamaya dahil değildir.

0x0007 uint(8) Bayraklar?

Bu bloğun tam olarak ne işe yaradığını bilmiyoruz.

Hacimlerde bu değerin genellikle 0x80, diğer dosyalarda ise genellikle 0x00 olduğu görülüyor. Bu, bir bayrak kümesi olduğu ihtimalini ortaya koyuyor.

Hacimler

Volume'lar, oyuna ait bir veri konteyneridir ve Tarball gibi arşiv formatlarına benzer. En azından Outpost 2'de bu format yalnızca dosyaları tanır - klasör yoktur. Bunlar, muhtemelen ilgili dosya adlarıyla simüle edilebilir.

Bir Volume, Volume başlığı ve belirli dosyalara karşılık gelen birden fazla Volume bloğundan oluşur.

"Volumes", oyun dizinindeki 'vol' uzantısına sahip dosyalardır.

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar

Hacim Başlığı

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar

Hacim Başlığı kendisi herhangi bir kullanıcı verisi içermez.
Sadece bir konteyner olarak hizmet eder.

Hacim Başlığındaki ilk veri, hacim dizgileri olmalıdır; ardından hacim bilgileri gelmektedir.

Ses Hacmi Dizeleri

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar
Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar
0x0008 uint(32) Yük Uzunluğu

Aşağıdaki verilerin gerçekten ne kadar baytının faydalı veri olduğunu belirtir.

Hacim dizileri listesinin geri kalan verileri açıkça çöplük olarak değerlendirilmektedir.

Daha sonraki tarihe sahip dosyalarda bu 'kalan veriler' 0x00'dır, bu da oyun geliştirme sürecinde kullanılan araç zincirinde yetersizliklere işaret edebilir; yani, bir geliştiricinin tamponların doğru bir şekilde başlatılmasına ancak çok geç bir aşamada odaklandığı, çünkü verilerin başlatılıp başlatılmamasının oyunun üzerinde bir etkisi olmadığı anlamına gelir.

0x000c uint(8)[] Dosya Adları Listesi

Burada, en azından mevcut veri bileşeninde, yalnızca ASCII karakterleri bekleyen 0 bayt ile sonlandırılmış bir dosya adı listesi söz konusudur.

Veri blokunu ayrıştırırken, dosya adlarının ofsetlerinin doğrudan hacim bilgileri içinde referans alındığından, bu veri bloğunu daha detaylı bir şekilde değerlendirmek gerekmez.

Volume Strings, hacim içinde bulunan dosya adlarının bir listesidir.

Ses Bilgileri

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar

Hacim bilgileri, dosyalarla ilgili daha ayrıntılı bilgileri alır. Bu, bir nevi FAT dizin girişi gibidir (FAT = Dosya Dağıtım Tablosu).

Dosya sayısı, blok boyutunun dizin girişlerinin uzunluğuna - 14 Bayt'a bölünmesiyle elde edilir.

Bireysel dizin girişleri ise şu yapıya sahiptir:

Adres x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF karakter
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Dosya Adı Kaydırma

Dosya adı listesindeki (Hacim Dizi) dosya adının hangi kaydırmada (!) bulunduğunu belirtir.

Bunun, veri bloğunun başlangıcına referans verdiğini belirtir.

0x0004 uint(32) Dosya Ofseti

Dosyanın tüm hacim dosyası içindeki konumunu belirten ofseti belirtir.

0x0008 uint(32) Dosya Boyutu

Dosyanın byte cinsinden ne kadar büyük olduğunu belirtir.

0x000c uint(16) Bayraklar?

Görünüşe göre dosya kodlaması hakkında ek bilgiler veriyor.

  • 0x03 dosya sıkıştırıldığında ayarlanır. Burada görünüşe göre bir Huffman ağacı kullanılıyor.
  • 0x80 görünüşe göre her zaman ayarlanmış durumda.

Hacim Bloğu

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar

Volume bloğu, dosyaları barındıran bir kapsayıcıdır. Sadece blok formatı nedeniyle dosya boyutunu tekrar - redunant olarak - içerir ve ardından doğrudan kullanım verileri gelir.

Karolar

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar

Tiles, Outpost-2'ye özgü bir Bitmap grafik formatıdır. 13 Tileset'e yayılmaktadır, "well" olarak adlandırılan (well0000.bmp ile well0012.bmp), maps.vol dosyasının içinde bulunmaktadır.

Tilesetler / Wells aşağıdakileri içermektedir:

Dosya Adı İçerik
well0000.bmp 32x32px boyutunda, mavi bir grafik - kendi görüntü yükleyicinizin çalışıp çalışmadığını test etmek için ideal
well0001.bmp Açık renkli taş, açık renkli taş üzerindeki sıradağlar ve açık renkli taşta sayısız krater varyasyonu içerir
well0002.bmp Açık renkli taş üzerindeki 'Doodads' - yani, açık renkli taşta yerleştirilebilecek, boşluk oluşturmak (veya kasıtlı olarak yapı, örneğin duvarlar) için tasarlanmış unsurlar, ayrıca bitki örtüsü de içerir
well0003.bmp Açık renkli taşta kabuk benzeri bir yapı içerir
well0004.bmp Koyu renkli taş, koyu renkli taş üzerindeki sıradağlar ve koyu renkli taşta sayısız krater varyasyonu içerir
well0005.bmp Koyu renkli taş üzerindeki 'Doodads' - yani, koyu renkli taşta yerleştirilebilecek, boşluk oluşturmak (veya kasıtlı olarak yapı, örneğin duvarlar) için tasarlanmış unsurlar içerir
well0006.bmp Koyu renkli taşta kabuk benzeri bir yapı ve açık ile koyu renkli taş arasında geçişler içerir
well0007.bmp Lava içerir ve her biri 4-5 kare animasyona sahiptir
well0008.bmp Kum ve kumda sayısız krater varyasyonu içerir
well0009.bmp Kum üzerindeki 'Doodads' - yani, kumda yerleştirilebilecek, boşluk oluşturmak (veya kasıtlı olarak yapı, örneğin duvarlar) için tasarlanmış unsurlar içerir
well0010.bmp Açık ve koyu taş arasında 48 geçiş içerir
well0011.bmp Haritanın kutup bölgelerini içerir, koyu taş zemin olarak kullanılır
well0012.bmp Haritanın kutup bölgelerini içerir, açık taş zemin olarak kullanılır

Verimli bir uygulama için, verilerin henüz işlenmesi gerektiğinden ve çok fazla veri oluşacağından, karoların önceden render edilip önbelleğe alınmaması tavsiye edilir.

Karolar, her biri 32x32 piksel çözünürlüğünde endeksli paletle 8bpp grafiklerdir ve birbirlerinin üzerine yerleştirilmiştir. Ancak, böyle oluşan bir karo setinde çok daha fazlası olabilir.

Ana konteyner, head ve data olmak üzere 2 bölümden oluşmaktadır.

Karolar Başlığı

Adres 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 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar
0x0008 uint(32) Sürüm / Bayraklar?

Burada bir dosya formatının versiyon numarası ile ilgili bir durum söz konusu olabilir; elimdeki tüm dosyalarda burada 0x02 değeri yer aldı.

0x000c uint(32) Genişlik (Yatay Çözünürlük)

Görüntü dosyasının ne kadar geniş olduğunu belirtir (piksel cinsinden).

Outpost 2'deki tüm kuyu için burada 0x20 veya 32 değeri beklenmelidir.

0x0010 uint(32) Yükseklik (Dikey Çözünürlük)

Resim dosyasının yüksekliğini (piksel cinsinden) belirtir.

Outpost 2'deki tüm kuyu için burada 0x20 ya da 32 değerinin beklenmesi gerekir.

0x0014 uint(32) Renk derinliği?

Bu değerin anlamı bilinmiyor.

Tüm kontrol edilen dosyalarda 8 değeri bulunduğundan, bu bir renk derinliği belirtimi olabilir.

0x0018 uint(32) Renk derinliği 2 mi?

Bu değerin anlamı bilinmiyor.

Muhtemelen bir 'hedef' renk derinliği ile ilgilidir.

Bu bilgilerin ardından, standartlaştırılmış RIFF formatında bir palet dosyası sunulacaktır. Tam spesifikasyon, paletlerin başka yerlerde de ortaya çıkması nedeniyle Paletler altında bulunmaktadır.

Karolar Verisi

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar

Sonunda, soldan yukarıdan sağa aşağıya doğru satır satır piksel verileri geliyor.
Genelde 8bpp bitmap olarak bulunan grafiklerdeki veri değeri, renk paletindeki rengin indeksine karşılık gelir.

Piksel verileri soldan yukarıdan başlar ve sağda aşağıda biter.

Oyun motoru, karoları *muhtemelen* talep üzerine çiziyor.
Bu, 32 farklı karonun bulunduğu gün-gece döngüsüne bağlı gibi görünüyor. Görünüşe göre, her seferinde parlaklık değerinden 'biraz' düşülüyor. Kesin değerler henüz belirlenemedi, hesaplama temeli üzerinde çalışıyorum.

v *= (daylight / 48) + 0.25;

Piksellerin HSV verileri ile birlikte, burada daylight 0-31 arasında bir değerdir ve v 0-1 arasında bir değerdir. Ayrıca, haritada her iki tarafa da 16 karodan oluşan bir kenar bulunduğunu dikkate almak önemlidir (bu, birimlerin görünmez bir şekilde doğmasını sağlamak için gereklidir).

Ayrıca, gün-gece döngüsü her oyun döngüsünde haritanın yalnızca bir sütununu güncellemektedir.
İleriye alınmış bir gün-gece döngüsü şu şekilde görünmektedir:

Gün-gece döngüsünün görselleştirilmesi

PRT

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Palet Uzunluğu

Bu dosyada bulunan paletlerin sayısını, normal blok formatının tersine, belirtir - blok uzunluğunu bayt cinsinden değil.

0x0007 uint(8) Bayraklar

Muhtemelen, her zamanki gibi, bayraklar.

Ancak benim bildiğim bayraklar yok; bildiğim tüm değerler 0x00 ile eşleştiğinden, palet sayısının basitçe bir uint(32) olması da potansiyel olarak mümkündür.

PRT tam olarak ne anlama geliyor bilmiyorum; örneğin 'Palette and Resource Table' olması düşünülebilir - çünkü bu dosya, op2_art.prt olarak maps.vol içinde bulunuyor ve bu, bir palet tablosu olduğu için veya işlevini iyi tanımlayabileceği için böyle bir isimlendirme mantıklı olabilir.

Bu dosya, paletlerin bir listesini, kullanılan tüm bitmap'lerin bir tablosunu, tüm animasyon tanımlarını ve ayrıca bir dizi bilinmeyen veriyi içermektedir. Şu ana kadar kullanılan konteyner formatına kısmen uymaktadır, çünkü tüm kayıtlar bu şemaya uymamaktadır.

CPAL bölümü (muhtemelen palet konteyneri anlamına geliyor) yalnızca palet verilerini içermekte, her biri genellikle 1052 byte boyutunda olan 8-bit paletlerin ne kadarının mevcut olduğunu belirtmektedir.

1052 byte'lık tanım bağlayıcı olarak kabul edilmez, çünkü palet formatı potansiyel olarak farklı palet boyutlarını içerebilir. Bu, sadece Outpost 2 ile birlikte sunulan veri seti için geçerlidir.

Palet listelerinden sonra hemen ve önceden bir başlık olmadan, bitmap'lerin listesi gelir; ardından animasyon listeleri hemen devam eder.
Her biri, kayıt sayısını içeren bir uint(32) (veya tekrar uint24+uint8 bayrakları?) ile başlar.

Paletler

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Palet uzunluğu

Normal blok formatına karşı, bu dosyada bulunan palet sayısını belirtir - bloğun byte cinsinden uzunluğunu değil.

0x0007 uint(8) Bayraklar

Muhtemelen, her zamanki gibi, bayraklar.

Bana tanıdık olan bayraklar yok; bildiğim tüm değerler 0x00 ile eşleştiğinden, palet sayısının basit bir uint(32) olabileceği de potansiyel olarak düşünülebilir.

Palet bilgileri oldukça kolay bir şekilde okunabilir.
Her biri bir başlık ve bir veri segmentinden oluşur.

Palet Başlığı

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Palet uzunluğu

Normal blok formatına karşı, bu dosyada bulunan palet sayısını belirtir - bloğun byte cinsinden uzunluğunu değil.

0x0007 uint(8) Bayraklar

Muhtemelen, her zamanki gibi, bayraklar.

Bana tanıdık olan bayraklar yok; bildiğim tüm değerler 0x00 ile eşleştiğinden, palet sayısının basit bir uint(32) olabileceği de potansiyel olarak düşünülebilir.

0x0008 uint(32) Palet formatı sürümü?

Muhtemelen hangi palet formatı versiyonunun paleti takip ettiğini tanımlar.

Tüm Outpost2 paletlerinin 0x01 versiyonuna sahip olduğu görülüyor.

Palet Verileri

Adres 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 . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Sihirli Baytlar
0x0004 uint(24) Blok Uzunluğu
0x0007 uint(8) Bayraklar

Veri bölümü, bireysel palet kayıtlarını alır. Palet kayıtlarının sayısı, blok uzunluğu / 4 ile belirlenir.

Bireysel kayıtların basit bir yapısı vardır;

Adres x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF karakter
0x0000 -- -- -- 04 -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(8) Kırmızı Bileşen

Rengin kırmızı oranını belirtir

0x0001 uint(8) Yeşil Bileşeni

Rengin yeşil oranını belirtir

0x0002 uint(8) Mavi Bileşen

Rengin mavi oranını belirtir

0x0003 uint(8) Bilinmeyen - Bayraklar?

Bu değerin ne anlama geldiği belirsizdir, çünkü görünüşe göre temel olarak 0x04'tür.

Paletler hakkında söyleyebileceğim tek şey, animasyonlarda kullanılacak paletler için aşağıdaki kuralların geçerli olduğudur:

  • İlk renk HER ZAMAN şeffaftır, orada belirtilen değere bakılmaksızın.
  • Palet girişleri 1-24, palet 1-8'de oyuncu rengi olarak değerlendirilmektedir.
    Renklerin oyuncu 1 dışında tam olarak nereden geldiği belirsiz.
    Diğer renklerin sabit kodlandığını tahmin ediyorum.

Palet Referansı

Bit haritaları

Adres x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF karakter
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Hedeflenmiş Genişlik

Pixel veri satırlarının bayt cinsinden genişliğini belirtir - çünkü bu, 4 bayt sınırlarına hizalanmıştır.

Bu sayede belirli bir resim satırına hızlıca atlamak mümkündür.

Bu değerin neden ayrı bir şekilde saklandığı, oysa hesaplanabileceği belirsizdir.
Muhtemelen bu, render kodu için bir optimizasyondur.

0x0004 uint(32) Ofset

Bitmap'teki ilk satırın ofsetini belirtir

0x0008 uint(32) Yükseklik

Resmin yüksekliğini piksel cinsinden belirtir

0x000c uint(32) Genişlik

Resmin genişliğini piksel cinsinden belirtir

0x0010 uint(16) Türü

Resmin türünü belirtir. Burada bir bit maskesi olduğu görülmektedir:

  • 0x04, 1bpp grafik olduğunda ayarlıdır.
  • 0x40, pencereleme uygulaması gereken bir grafik olduğunda ayarlıdır.
0x0012 uint(16) Palet

Hangi PRT dosyasının paletinin kullanılacağını tanımlar

PRT dosyasının bu veri yapısı, sprite'lar için kullanılan bitmap'lerin nasıl yapılandırıldığını belirtir. Bu bitmap'ler, bir sprite'ın animasyon karesi için bir araya getirilen birçok parçadan biri olarak hizmet eder.

Belirli resim verileri ise oyunun dizininde bulunan op2_art.BMP dosyasında gizlidir.
Neden bu bitmap dosyası (genelde doğru olan) bir RIFF bitmap başlığına sahip olduğu belirsizdir. Muhtemelen Outpost 2, bu başlığı geçici olarak alarak ve ilgili değişken alanları üst üste yazarak grafiklerin yüklenmesi için sistem API'lerini kullanıyor.

Piksel verileri BMP dosyasında, BMP dosyasında 0x000A adresinde bulunan uint32 ofseti ile ofset toplamında, bulunabilir - ve bu, yukarıdan sola doğru aşağıya sıralı düzenlemeye karşılık gelir.

Monokrom 1bpp grafikler, renk 0'ın tam saydamlık ve renk 1'in yarı saydam siyah/gri olacak şekilde çizilebilir, çünkü monokrom grafikler genellikle animasyonlarda araç ve bina gölgeleri için kullanılır.

Böylece birçok grafiği bir araya getirmek mümkündür.

Korunan Konut Modülü (Plymouth)

Animasyonlar

Şimdi Outpost 2 veri formatları içindeki disiplinlerin kraliyet sınıfına geliyoruz:
Animasyonlar.

Animasyon listeleri, öncelikle veri doğrulama amacı taşıyan bir küresel başlık ile başlar. Bunun ardından üç aşamada yapılandırılmış somut animasyon tanımları gelir:

  1. Animasyon
    Bir animasyon en üst düzeydeki varlıktır; bir birimin, bir binanın veya bir 'parçacık animasyonu'nun (kuyruklu yıldız çarpması, hava durumu, patlama) belirli bir başlangıç durumundaki animasyonunu temsil eder.
  2. Çerçeve
    Bir çerçeve, bir animasyon içindeki tek bir görüntüdür. Bir animasyon bir veya daha fazla çerçeve içerebilir.
  3. Alt Çerçeve
    Bir alt çerçeve, belirli bir bitmap'ın belirli kriterler altında bir çerçevenin belirli bir konumuna çizilmesi gerektiği bilgilerini içerir. Bir çerçeve bir veya daha fazla alt çerçeve içerebilir.

Bundan sonra doğrudan bireysel animasyon tanımları geliyor.

Adres x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF karakter
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Animasyon sayısı

Kaç tane animasyon veri seti mevcut

0x0004 uint(32) Kare Sayısı

Toplamda kaç kare bulunması gerektiği

0x0008 uint(32) Alt çerçeve sayısı

Toplamda kaç tane alt çerçevenin bulunması gerektiği

0x000c uint(32) Opsiyonel girişlerin sayısı

Kaç tane "isteğe bağlı giriş" mevcut.

Animasyon

Adres x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF karakter
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0020 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(32) Bilinmeyen 1

Bilinmeyen Bilgiler

0x0004 uint(32) Sınırlayıcı Kutu: Sol

Bir Bounding Box in sol başlangıcını (piksel cinsinden) belirtir.

0x0008 uint(32) Sınır Kutusu: Üst

İçindeki Bounding Box’ın üst başlangıcını (piksel cinsinden) belirtir.

0x000c uint(32) Sınır Kutusu: Genişlik

Bounding Box'ın genişliğini (piksel cinsinden) belirtir.

0x0010 uint(32) Sınır Kutusu: Yükseklik

Bir Bounding Box'ın yüksekliğini (piksel cinsinden) belirtir.

0x0014 uint(32) Ofset: X

Animasyonun yatay ortasını belirtir

0x0018 uint(32) Ofset: Y

Animasyonun dikey ortasını belirtir

0x001c uint(32) Bilinmeyen 2

Bilinmeyen Bilgi

0x0020 uint(32) Kare Sayısı

Bu animasyonda kaç tane animasyon karesi bulunduğunu belirtir

0x0024 uint(32) Windows sayısı

Çizim yaparken kaç pencere kullanılacağını belirtir

Üst katmanın, animasyonun verileri öncelikle yönetim verileridir - Boundingbox, aracın/binanın etrafındaki işaretlemenin koordinatlarını belirtir; bu, seçildiğinde gösterilir ve aynı zamanda hangi alanın tıklanabilir olduğunu belirtir.

Offset, öncelikle "sıfır noktasını" belirler; oyun içindeki koordinatlarla hesaplanması veya çıkarılması gereken noktadır. Daha matematiksel bir ifadeyle, offset burada koordinatların kökünü belirtir.

Windows, offset gibi, her biri 4 uint(32) değeri olan ve belirli alt çerçeveler için kullanılabilir olan bir alanı belirtir. Windows dışında, bitmap için uygun olduğu sürece çizim yapılamaz.

Çerçeve

Adres x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF karakter
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(8) Alt çerçeve sayısı ve Opsiyonel 1, 2 için Değiştirici

Bu değer şunları içerir:

  • 0x7F (Bitmaskesi): Bu çerçevede kullanılan alt çerçeve sayısı
  • 0x80: Opsiyonel 1 ve 2'nin mevcut olup olmadığına dair bilgi
0x0001 uint(8) Bilinmeyen 1 ve Opsiyonel 3, 4 için Toggle

Bu değer şunları içerir:

  • 0x7F (Bitmaskesi): Bilinmiyor - Bunun, bir sonraki kare gösterilene kadar geçen Gametick sayısı olduğundan güçlü bir şekilde şüpheleniyorum
  • 0x80: Opsiyonel 3 ve 4'ün mevcut olup olmadığına dair bilgi
0x0002 uint(8) Opsiyonel 1

Bilinmeyen

0x0003 uint(8) Opsiyonel 2

Bilinmeyen

0x0004 uint(8) Opsiyonel 3

Bilinmeyen

0x0005 uint(8) Opsiyonel 4

Bilinmeyen

Alt Çerçeve

Adres x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF karakter
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Kaydırma Veri Türü Tanım Açıklama
0x0000 uint(16) Bitmap-Id

Bu alt çerçeve için hangi Bitmap'ın kullanılacağını belirtir

0x0002 uint(8) Bilinmeyen 1

Bilinmiyor - ancak bunun bir Render önceliği (Z-Katmanı) olduğunu güçlü bir şekilde tahmin ediyorum.

0x0003 uint(8) Alt çerçeve kimliği

Hangi alt çerçevede bulunduğumuzu belirtir

0x0004 sint(16) Ofset - Yatay

Çerçevenin içinde alt çerçevenin nerede yer alacağını veya bitmap'in kaç piksel yatay olarak kaydırılacağını belirtir.

0x0006 sint(16) Offset - Dikey

Çerçeve içinde alt çerçevenin nereye yerleştirileceğini veya bit haritasının kaç piksel dikey olarak kaydırılacağını belirtir.

Bununla şimdi tekil kareleri ve aynı zamanda tamamı animasyonları uygun şekilde bir araya getirebiliriz. Burada, 500 indeksine sahip daha karmaşık bir animasyon örneği ile gösterilmektedir.

Animasyon 500

Animasyon 500, sıradan madenle yüklü bir Plymouth taşıyıcısının nasıl boşaltıldığını gösteriyor. Bu, pencereleme işlevselliğini kullanan az sayıda animasyondan biridir.

Ve böylece tam animasyonu birleştirebiliriz.
Maalesef, üst yükleme kapağıyla ilgili bir sorun var, çünkü burada grafik türü bilgilerinde ilgili bit ayarlanmamış.

Oyundan birkaç başka güzel animasyonlu sprite daha burada:

Animasyon 500'ün render'ı ile gösterilmiştir

Animasyon 500 tamamlanmış hali

Plymouth Bina-Fabrikası

Eden Uzay Limanı

Eden Tıbbi Merkez

SCAT

Plymouth Uzay Limanı

Sürpriz:
Noel Baba

Sürpriz:
Dans Köpeği

Kullanıcı Arayüzü

Artık oyunun fırçalanmış metal görünümüne sahip kullanıcı arayüzü eksik.

Ama burada da Dynamix'in tekerleği yeniden icat etmesi gerekmiyor; burada yalnızca Windows'un sağladığı User32 ve GDI32 API'leri basit bir şekilde kullanılmıyor - özellikle User32'nin kaynak yönetimi de kullanılıyor.

Bunlar, örneğin Angus Johnson tarafından geliştirilmiş olan Resource Hacker gibi programlar aracılığıyla veya Linux / Mac OS'ta Wine kullanımından kaçınıyorsanız, icoutils içinde bulunan wrestool yardımıyla çıkarılabilir.

Dosya Adı İçerik
Outpost2.exe Sadece New Terra önündeki uzay istasyonunun simgesini içerir
op2shres.dll Kenarlıklar, butonlar, radyo butonları ve onay kutuları gibi kontrol elemanları için grafiklerin yanı sıra, hikaye görev metinleri için yan resimler ve ana menü arka plan grafiği de içerir
out2res.dll Oyun içi pencere dekorasyonu, sıradan ve özel metal için simgeler, yükleme ekranı, diyaloglar için grafikler ve daha fazla imleç grafiği, ayrıca oyun dizininde animasyonlu olanlar ile birlikte içerir