Outpost 2 Dosya Formatları · bei.pm
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.
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:
|
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.
|
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 |
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 |
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 |
0x0014 | uint(32) | Renk derinliği? | Bu değerin anlamı bilinmiyor. Tüm kontrol edilen dosyalarda |
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.
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:
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 |
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 |
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 |
0x0008 | uint(32) | Palet formatı sürümü? | Muhtemelen hangi palet formatı versiyonunun paleti takip ettiğini tanımlar. Tüm Outpost2 paletlerinin |
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 |
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.
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. |
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:
|
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.
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:
-
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. -
Ç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. -
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:
|
0x0001 | uint(8) | Bilinmeyen 1 ve Opsiyonel 3, 4 için Toggle | Bu değer şunları içerir:
|
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:
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 |