Outpost 2 Формати на файлове · bei.pm

Текстът е автоматично преведен чрез OpenAI GPT-4o Mini.

Форматите на файловете, описани на тази страница, се основават на техническия анализ на интелектуалната собственост на Dynamix, Inc. и Sierra Entertainment.
Интелектуалната собственост днес е част от масата на Activision Publishing, Inc. / Activision Blizzard, Inc. и в момента е собственост на Microsoft Corp..

Информацията е събрана чрез обратен инженеринг и анализ на данни с цел архивиране и интероперативност с исторически данни.
Не са използвани собствени или конфиденциални спецификации.

Играта може в момента да бъде закупена за изтегляне на gog.com.

Изкуство от играта

Следната серия статии документира моите открития относно данните формати в реално времевата стратегия "Outpost 2: Divided Destiny", която беше публикувана през 1997 г. от Sierra и разработена от Dynamix.

От 1 ноември 2015 г. до 14 ноември 2015 г. се занимавах основно с анализа на данните от играта - и какво може да се направи с тях.

Според информацията, която успях да събера до момента, Dynamix - както много търговски компании - не е разработила някои от данните формати специално за Outpost 2, а също така е използвала (модифицирани) в други разработки, например от поредицата Mechwarrior.
Независимо от това, може да се отбележи, че иновационната сила на формата на файловете е практически ограничена и често се основава на дългогодишни концепции от обичайни формати като JFIF и RIFF.

За интерпретация на таблиците и данните формати са налични допълнителни информации на Какво е какво?.
Данните, посочени тук, обикновено трябва да се разбират като Little Endian.

В заключение, може да се каже, че обратното инженерство беше много забавно, макар и не напълно завършено.
Разбира се, мога да препоръчам и да играете самата игра, тъй като предлага интересни игрови механики.

Въведение

Данните формати, използвани от Outpost 2, имат структура, напомняща на JFIF / PNG - отделните блокове данни винаги разполагат с 8-байтов заглавен блок. Затова ще спестя усилията си да документирам отделните заглавия на съответните специфични места и ще документирам само отклоненията там.

Форматът винаги е следният; действителните полезни данни са вградени в него:

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове

Съдържа информация относно това, какво да се очаква в следващия блок данни.

Известни стойности:

  • 0x204C4F56 ('VOL '):
    Обем
  • 0x686C6F76 ('VOLH'):
    Хедър на обема
  • 0x736C6F76 ('VOLS'):
    Стрингове на обема
  • 0x696C6F76 ('VOLI'):
    Информация за обема
  • 0x4B4C4256 ('BLCK'):
    Обемен блок
  • 0x504D4250 ('PBMP'):
    Графични данни
  • 0x4C415050 ('PPAL'):
    Цветова палитра
  • 0x4C415043 ('CPAL'):
    Контейнер за цветови палитри
  • 0x64616568 ('head'):
    Хедър
  • 0x61746164 ('data'):
    Полезни данни
0x0004 uint(24) Дължина на блока

Съдържа информация за това колко голям (в байтове) е следният данен блок.

Тук се имат предвид само полезните данни - 8-те байта на заглавката не са включени.

0x0007 uint(8) Знамена?

Не е известно каква точно е функцията на този блок.

В обемите тази стойност често е 0x80, а в други файлове често е 0x00. Това предполага, че става въпрос за набор от флагове.

Томове

Обемите представляват контейнер за данни за играта, подобен на архивен формат като например Tarball. Поне в Outpost 2 форматът познава само файлове - без папки. Възможно е обаче те да бъдат симулирани чрез съответни имена на файлове.

Едно обемче се състои от заглавката на обема, както и от няколко обемни блока, които съответстват на конкретни файлове.

"Обемите" са файловете с разширение 'vol' в директорията на играта.

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 56 4f 4c 20 -- -- -- -- -- -- -- -- -- -- -- -- V O L . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена

Обем Заглавие

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 76 6f 6c 68 -- -- -- -- -- -- -- -- -- -- -- -- v o l h . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена

Обемният хедър от своя страна не съдържа никакви данни за употреба.
Той служи единствено като контейнер.

Като първи данни в обемния хедър трябва да се намират обемните низове; след това следват информацията за обема.

Обемни низове

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена
Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 76 6f 6c 73 -- -- -- -- -- -- -- -- -- -- -- -- v o l s . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена
0x0008 uint(32) Дължина на полезния товар

Посочва колко байта от следните данни всъщност са полезни данни.

Останалите, непреработени данни от списъка на обемните низове явно трябва да се считат за боклук.

В файловете с по-късна дата тези 'останалите данни' са 0x00, което може да индикира недостатъци в инструменти по време на разработката на играта, а именно, че разработчикът се е погрижил за коректната инициализация на буферите едва много късно, тъй като няма влияние върху играта дали данните са инициализирани или не.

0x000c uint(8)[] Списък с имена на файлове

Това е списък от имена на файлове, завършващ с 0 байта, който - поне в текущия компонент на данните - само очаква ASCII символи.

Не е необходимо при парсиране на данните да се анализира този блок с данни по-подробно, тъй като в информацията за тома все пак директно се реферират офсетите на имената на файловете.

Обемните низове представляват списък с имена на файлове, които са включени в обема.

Информация за обема

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 76 6f 6c 69 -- -- -- -- -- -- -- -- -- -- -- -- v o l i . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена

Информацията за обема съдържа по-подробни данни за файловете. По някакъв начин това представлява вид запис в директорията на FAT (FAT = File Allocation Table)

Броят на файловете се определя от размера на блока, разделен на дължината на записите в директорията - 14 байта.

Отделните записи в директорията имат следната структура:

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Име на файл - офсет

Посочва на кой отместване (!) в списъка с имена на файлове (низове на тома) се намира името на файла.

Отнася се до началото на блока с полезни данни.

0x0004 uint(32) Файл-офсет

Указва на кой офсет в цялостния обемен файл се намира файлът.

0x0008 uint(32) Размер на файла

Посочва колко е голям файлът в байтове.

0x000c uint(16) Знамена?

Очевидно предоставя допълнителна информация за кодировката на файла.

  • 0x03 е зададено, когато файлът е компресиран. Явно тук се използва Хъфманово дърво.
  • 0x80 изглежда винаги е зададено.

Обемна блок

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 56 42 4c 48 -- -- -- -- -- -- -- -- -- -- -- -- V B L H . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена

Обемният блок е контейнер, който съдържа файлове. Той включва само отново - поради формата на блока - редундантно размера на файла и след това директно следват полезните данни.

Плочки

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 50 42 4d 50 -- -- -- -- -- -- -- -- -- -- -- -- P B M P . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена

Тиловете представляват специфичен за Outpost-2 bitmap графичен формат. Те обхващат 13 набора от тилове, наречени "well" (well0000.bmp до well0012.bmp), които се намират в обема maps.vol.

Наборите от тилове / well съдържат следното:

Име на файла Съдържание
well0000.bmp Синя графика с размери 32x32 пиксела - идеална за тестване на собствения имидж лоадер
well0001.bmp Съдържа светла скала, планински вериги върху светла скала и безброй варианти на кратери върху светла скала
well0002.bmp Съдържа 'Doodads' от светла скала - елементи, които могат да се поставят за обогатяване (или умишлено като структура, например стени) върху светла скала, включително и растителност
well0003.bmp Съдържа коралова структура върху светла скала
well0004.bmp Съдържа тъмна скала, планински вериги върху тъмна скала и безброй варианти на кратери върху тъмна скала
well0005.bmp Съдържа 'Doodads' от тъмна скала - елементи, които могат да се поставят за обогатяване (или умишлено като структура, например стени) върху тъмна скала
well0006.bmp Съдържа коралова структура върху тъмна скала, както и преходи между светла и тъмна скала
well0007.bmp Съдържа лава, включваща 4-5 кадъра анимация на същата
well0008.bmp Съдържа пясък и безброй варианти на кратери върху пясък
well0009.bmp Съдържа 'Doodads' от пясък - елементи, които могат да се поставят за обогатяване (или умишлено като структура, например стени) върху пясък
well0010.bmp Съдържа 48 прехода от пясък към светла и тъмна скала
well0011.bmp Съдържа полярните шапки на картата, с тъмна скала като основа
well0012.bmp Съдържа полярните шапки на картата, с светла скала като основа

Препоръчително е за точна реализация да не се рендират тайловете предварително, за да се кешират, тъй като данните за цикъла ден/нощ все още трябва да бъдат обработени - и биха възникнали много, много данни.

Тайловете са 8bpp графики с индексирана палитра с размер 32x32 пиксела, които са подредени една под друга. В така създадения тайлсет обаче могат да се съдържат значително повече

Основният контейнер се състои от 2 секции: head и data.

Заглавие на плочките

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена
0x0008 uint(32) Версия / Флагове?

Тук може да става въпрос за версия на файловия формат; във всички налични файлове стойността беше 0x02

0x000c uint(32) Ширина (Хоризонтално разрешение)

Посочва колко широк е файловият образ (в пиксели).

При всички кладенци в Outpost 2 тук се очаква стойността 0x20 или 32.

0x0010 uint(32) Височина (Вертикална резолюция)

Посочва колко висока е изображенската файл (в пиксели).

При всички кладенци от Outpost 2 тук се очаква стойността да бъде 0x20 или 32.

0x0014 uint(32) Дълбочина на цвета?

Значението на тази стойност е неизвестно.

Тъй като тя съдържа стойността 8 във всички проверени файлове, може да става въпрос за указание за дълбочина на цвета.

0x0018 uint(32) Цветова дълбочина 2?

Значението на тази стойност е неизвестно.

Възможно е да става въпрос за 'целева' дълбочина на цвета.

След тази информация ще последва и файл с палети, представен в стандартизирания формат RIFF. Точната спецификация може да бъде намерена - тъй като палетите се появяват и на други места - под Палети.

Данни за плочките

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена

Накрая следват чистите пикселни данни, ред по ред от горе вляво надясно долу.
Данните при графиките, които обикновено са с 8bpp-битмап формат, съответстват на индекса на цвета в цветната палитра.

Pикселните данни започват от горе вляво и завършват долу вдясно.

Игровият енджин вероятно рисува тайловете *въз основа на запитвания*.
Това изглежда е свързано с цикъла ден-нощ, който познава 32 степени на отделните тайлове. Очевидно от стойността на яркостта се отнема 'малко'. Точните стойности все още не могат да бъдат установени, работя на основата на изчисленията

v *= (daylight / 48) + 0.25;

с HSV-данните на пикселите, като daylight е стойност от 0-31, а v е стойност между 0-1. Освен това трябва да се има предвид, че на картата съществува и граница от 16 тайла наляво и надясно (която служи за невидимо появяване на единици).

Допълнително, цикълът ден-нощ изглежда актуализира само една колона от картата за всеки игрови цикъл.
Ускореният цикъл ден-нощ изглежда по следния начин:

Визуализация на цикъла ден-нощ

ПРТ

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 43 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- C P A L . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на палетите

Посочва, за разлика от нормалния блоков формат, броя на палетите, които могат да бъдат намерени в този файл - не дължината на блока в байтове.

0x0007 uint(8) Флагове

Вероятно, както обикновено, флагове.

Обаче не ми известни флагове; тъй като всички известни стойности са равни на 0x00, също е възможно броят на палетите просто да е uint(32).

За какво точно означава PRT не ми е известно; възможно е, например, 'Таблица на палетите и ресурсите' - тъй като този файл - намерен като op2_art.prt в maps.vol - представлява такава таблица, или би могъл да опише функцията доста добре.

Този файл съдържа списък с палети, таблица за всички използвани битмапи, всички анимационни дефиниции и още редица неизвестни данни. Той следва досегашния контейнерен формат свободно, тъй като не всички записи спазват тази схема.

Секцията CPAL (вероятно означаваща контейнер на палетите) включва единствено данните за палетите, като посочва колко от обикновено 1052-байтовите 8-битови палети са налични.

Посочването на 1052 байта не се счита за задължително, тъй като форматът на палетите потенциално предвижда различни размери на палетите. То важи единствено за данните, с които Outpost 2 е доставен.

След списъка с палетите незабавно и без предварителен заглавен ред следва списъкът с битмапи; точно толкова незабавно следват и списъците с анимации.
И двата списъка започват с uint(32) (или отново uint24+uint8 флагове?), който съдържа броя на записите.

Палети

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 50 50 41 4c -- -- -- -- -- -- -- -- -- -- -- -- P P A L . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на палетите

Посочва, в противовес на нормалния блоков формат, броя на палетите, които могат да се намерят в този файл - а не дължината на блока в байтове.

0x0007 uint(8) Знамена

Вероятно, както обикновено, флагове.

Обаче не ми е известен нито един флаг; тъй като всички известни ми стойности съответстват на 0x00, е възможно и палетите просто да бъдат представени като uint(32).

Информацията за палетите е много лесна за прочитане.
Тя се състои от заглавие и сегмент данни.

Заглавие на палетите

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 68 65 61 64 -- -- -- -- -- -- -- -- -- -- -- -- h e a d . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на палетите

Посочва, в противовес на нормалния блоков формат, броя на палетите, които могат да се намерят в този файл - а не дължината на блока в байтове.

0x0007 uint(8) Знамена

Вероятно, както обикновено, флагове.

Обаче не ми е известен нито един флаг; тъй като всички известни ми стойности съответстват на 0x00, е възможно и палетите просто да бъдат представени като uint(32).

0x0008 uint(32) Версия на палетния формат?

Вероятно определя коя версия на формата на палетите следва палетата.

Всички палети на Outpost2 изглежда имат версия 0x01.

Данни за палетите

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 64 61 74 61 -- -- -- -- -- -- -- -- -- -- -- -- d a t a . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Магически байтове
0x0004 uint(24) Дължина на блока
0x0007 uint(8) Знамена

Данните секция съдържа отделните записи на палетите. Броят на записите на палетите се определя от дължината на блока / 4.

Отделните записи имат следната, проста структура;

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 -- -- -- 04 -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(8) Червен компонент

Посочва червения дял на цвета

0x0001 uint(8) Зелена компонента

Посочва зеления дял на цвета

0x0002 uint(8) Синя компонента

Посочва синята част на цвета

0x0003 uint(8) Непознато - Флагове?

Не е ясно какво означава тази стойност, тъй като изглежда, че основно е 0x04.

Относно палетите, единственото, което трябва да се каже, е, че за палетите, използвани за анимации, важат следните правила:

  • Първият цвят е ВИНАГИ прозрачен, независимо каква стойност е посочена там.
  • Записите на палетите 1-24 се считат за цветове на играчите в палетите 1-8.
    Откъде точно произлизат цветовете извън играч 1, не ми е ясно.
    Предполагам, че останалите цветове са хардкодирани.

Референция на палетите

Битмапи

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Направена ширина

Посочва ширината на пикселните данни в байтове - тъй като те са подредени по 4-байтови граници.

Така е бързо възможно да се прескочи до определен ред на изображението.

Защо тази стойност се съхранява отделно, въпреки че може да бъде изчислена, не е ясно.
Възможно е да става въпрос за оптимизация на рендериращия код.

0x0004 uint(32) Отклонение

Посочва офсета на първия ред в битовата карта

0x0008 uint(32) Височина

Посочва височината на изображението в пиксели

0x000c uint(32) Ширина

Посочва ширината на изображението в пиксели

0x0010 uint(16) Тип

Посочва типа на изображението. Изглежда, че става въпрос за битова маска:

  • 0x04 е зададено, ако става въпрос за 1bpp графика.
  • 0x40 е зададено, ако става въпрос за графика, която трябва да реализира прозоречно управление.
0x0012 uint(16) Палитра

Определя коя палитра от PRT файла да бъде използвана

Структурата на данните в PRT файла указва как са изградени битмапите, използвани за спрайтовете. Тези битмапи служат като отделен компонент, от който се сглобяват няколко за анимационен кадър на спрайта.

Конкретните изображения се намират в op2_art.BMP в директорията на играта.
Защо този битмап файл разполага с (предимно коректен) RIFF заглавен битмап, е неясно. Вероятно Outpost 2 използва системни API за зареждане на графики, като временно приема този заглавен файл и презаписва съответните вариращи полета.

Пикселните данни в BMP файла се намират на позиция Offset + uint32-Offset, който може да бъде намерен на адрес 0x000A в BMP файла (RIFF-Bитмап данни offset), и отново отговарят на редовното подреждане от горе ляво надясно надолу.

Монохромните 1bpp графики могат да бъдат нарисувани по такъв начин, че цвят 0 да бъде напълно прозрачен, а цвят 1 да е полупрозрачно черно/сиво, тъй като монохромните графики обикновено се използват за сянка на превозни средства и сгради в анимациите.

Така може да се сглобят много графики.

Защитен жилищен модул (Плимут)

Анимации

Сега преминаваме към кралския клас на дисциплините в данните на Outpost 2:
Анимациите.

Списъците с анимации започват с глобален заглавен ред, който служи основно за верификация на данните. Следват конкретните определения на анимациите, които се разделят на 3 нива:

  1. Анимация
    Анимацията е най-висшата инстанция; тя представлява анимация на единица, сграда или "частична анимация" (кометен удар, време, взрив) в определена изходна ситуация.
  2. Кадър
    Кадърът е едно единствено изображение в рамките на анимацията. Анимацията може да включва един или повече кадри.
  3. Подкадър
    Подкадрите съдържат информация за това, че определена битмап трябва да бъде нарисувана на определена позиция на кадъра при определени критерии. Един кадър може да включва един или повече подкадри.

След това следват самите определения на анимацията.

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Брой анимации

Колко анимационни набора данни има

0x0004 uint(32) Брой кадри

Колко кадъра трябва да има общо

0x0008 uint(32) Брой подрамки

Колко подрамки общо трябва да присъстват

0x000c uint(32) Брой на опционалните записи

Колко "опционални записи" са налични.

Анимация

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0010 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
0x0020 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(32) Неизвестен 1

Неизвестна информация

0x0004 uint(32) Граници: Ляво

Посочва лявото начало (в пиксели) на Bounding Box.

0x0008 uint(32) Ограничителна кутия: Горна

Посочва горния ръб (в пиксели) на ограничителната кутия.

0x000c uint(32) Ограничителна кутия: Ширина

Посочва ширината (в пиксели) на Bounding Box.

0x0010 uint(32) Граници на кутията: Височина

Посочва височината (в пиксели) на ограничителния правоъгълник.

0x0014 uint(32) Офсет: X

Посочва хоризонталния център на анимацията

0x0018 uint(32) Отместване: Y

Посочва вертикалната среда на анимацията

0x001c uint(32) Неизвестен 2

Неизвестна информация

0x0020 uint(32) Брой кадри

Посочва колко анимационни кадъра са включени в тази анимация

0x0024 uint(32) Брой прозорци

Посочва колко прозорци да се използват при рисуване

Данните на най-горния слой, анимацията, представляват предимно административни данни - Boundingbox обозначава координатите на маркировката около превозното средство/сградата, когато то е избрано, и също така указва коя област трябва да бъде кликаема.

Офсетът определя предимно "нулевата точка"; точката, която трябва да се изчисли спрямо вътрешните координати на играта или да се извади. Може да се каже и математически: офсетът тук обозначава координатния произход.

При прозорците става въпрос, както и при офсета, за по 4 uint(32)-стойности за всяко прозорче, които определят област, която е валидна за отделни субфреймове. Извън прозорците не трябва, освен ако не е предвидено за битовата карта, да се рисува.

Рамка

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(8) Брой подрамки и превключвател за Опция 1, 2

Тази стойност съдържа:

  • 0x7F (битова маска): Броят на субфреймовете, които се използват в този фрейм
  • 0x80: Информация за наличието на Опционален 1 и 2
0x0001 uint(8) Неизвестно 1 и превключвател за Опционален 3, 4

Тази стойност съдържа:

  • 0x7F (Битова маска): Непознато - Силно подозирам, че става въпрос за броя на игровите тикове, които минават, преди да се покаже следващият кадър
  • 0x80: Информация за наличието на Опционални 3 и 4
0x0002 uint(8) Опционално 1

Непознат

0x0003 uint(8) Опционално 2

Непознат

0x0004 uint(8) Опционален 3

Непознат

0x0005 uint(8) Опционално 4

Непознат

Подрамка

Адрес x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA xB xC xD xE xF символи
0x0000 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- . . . . . . . . . . . . . . . .
Офсет Тип данни Надпис Обяснение
0x0000 uint(16) Битмап-ID

Указва коя битмап да се използва за този подрамка

0x0002 uint(8) Неизвестен 1

Не е известно - обаче силно подозирам, че става въпрос за приоритет на рендиране (Z-слой).

0x0003 uint(8) Подрамка-ИД

Указва в кой подрамка се намираме

0x0004 sint(16) Офсет - Хоризонтален

Посочете къде в рамката да бъде поставен субрамката, или с колко пиксела да бъде преместена битовата карта хоризонтално.

0x0006 sint(16) Офсет - Вертикален

Посочва къде в рамката да бъде поставен подрамката, или с колко пиксела да бъде вертикално преместена битмапът

С това можем да комбинираме отделни рамки, както и цели анимации, тук ще демонстрираме на примера на една по-сложна анимация, анимацията с индекс 500

Анимация 500

Анимация 500 показва как един Plymouth транспортен автомобил, натоварен с обикновен рудник, се разтоварва. Това е една от малкото анимации, които използват функционалността на прозорците.

И така, можем да съберем цялата анимация заедно.
За съжаление, все още има проблем с горния товарен люк, тъй като съответният бит в информацията за графичния тип не е зададен.

Ето и няколко допълнителни, прекрасно анимирани спрайта от играта:

Рендериране на анимация 500 илюстрирано

Анимация 500 готова и събрана

Фабрика за сгради Плимут

Космическо пристанище Едем

Медицински център Едем

SCAT

Космическо пристанище Плимут

Яйце за великден:
Дядо Коледа

Яйце за великден:
Кучето на Данс

Потребителски интерфейс

Сега остава само потребителският интерфейс на играта, който е в обработен метал стил.

Но и тук е видно, че Dynamix не е трябвало да открива отново колелото; тук не се използват само стандартните User32 и GDI32 API, предоставени от Windows - особено се използва и управлението на ресурсите от User32.

Те могат да бъдат извлечени например с програми като разработения от Angus Johnson безплатен Resource Hacker, или - ако избягвате използването на Wine под Linux / Mac OS - с помощта на wrestool, включен в icoutils.

Име на файла Съдържание
Outpost2.exe Съдържа само иконата на играта, която показва космическата станция пред Нова Терра
op2shres.dll Съдържа графики за елементи на управление, като рамки, бутони, радио-бутон и чекбоксове, както и фонове на диалози, илюстрации за текстовете на основните мисии и фоновата графика на главното меню
out2res.dll Съдържа декорация на инграунд прозорци, икони за обикновен и специален метал, екрана за зареждане, графики за диалози, както и допълнителни графики за курсори, в допълнение към анимираните в директорията на играта