Розбираємо «Протистояння

Вступ

Добрий усім, хочу розповісти про теплу та лампову стратегію дитинства — Протистояння. Гра була випущена у 1996-98 рр. нашою українською фірмою Дока. Гра - стратегія в реальному часі про другу світову війну. Через багато років я вирішив спершу пройти її і записати проходження, а потім постаратися максимально продовжити задоволення від гри, розпаковуючи ресурси і намагаючись зрозуміти ігрову логіку.

зображення

Початковий план був - дістати музику і відключити туман війни, потім трохи захопився і розпакував 9 файлів (.ADW, .DAW, .RUS).

Я граю і рекомендую повну 2в1 версія (Протистояння: Військова хроніка) з п'ятьма cd-audio треками, тобто повний ріп останньої версії гри все-в-одному. Якби була можливість, то купив її ще раз, так як мого оригінального диска, купленого в 98г не збереглося.

Очевидне і просте рішення – запустити гру під dosbox та записати всю музику, що я й зробив насамперед. Плейлист з музикою.

Потім думав, що це неправильно. Виходить, що музика не оригінальна, а пропущена через фільтри dosbox. Вирішив розпакувати до wav стану, взявши оригінальні дані. Відкрив файл music.dat у winhex. Так як у музиці є голосові вставки, то припустив, що там є цифровий потік. Дякую форуму old-games де мені підказали, що найчастіше для аудіо використовували несжатий «сирий» потік даних, просто звук з певними параметрами(11025 Гц/22050 Гц як найчастіше використовувані, 8-16 біт, моно/стерео, Intel/Motorola) який надсилався безпосередньо в звукову карту.

Відкривши в hex побачив наступне:

протистояння
Початок файлу - 4 байти містять число 20 (00000014h). Треків у грі 20. Потім наступні 20груп по 4 байти це зміщення почав мелодій. Останні 4 байти (33 A5 4B 01 = 01 4B A5 33h ) дорівнюють розміру файлу music.dat, розмір кожного треку дорівнює різниці між двох зсувів. Все виявилося приємно та легко.

Таблицю зміщень легко визначити - це можуть бути цифри, що послідовно збільшуються, але іноді таблиця файлів містить непослідовні зміщення (Наприклад, таблиця шрифтів гри I have no mouth and I must scream). Число зміщення знаходиться в діапазоні від 0 до розміру файлу. У разі таблиця йде збільшення.

У шапці кожного треку простежуються назви треків за фіксованим зміщенням +16: Maintune, Technoish, Terrible, Requiem, Track 0, Lazy reggae, U97: Was is das, Hold, GETDOWN!, Scramble, Gone, Rainman, Guitar song, Fir plates plant, REGRET. Експерименти зі шматками у програмі Game Audio Player (GAP) показали, що музика відтворюється з такими параметрами - 22кГц, 8 bit, mono, unsigned. Причому, якщо виставити 11кГц, то музика все одно відтворюватиметься, але в 2 рази повільніше. Моно/стерео також змінює темп відтворення.

З графікою все виявилося трохи заплутанішим. Деякі зображення виявилися стислими по RLE, деякі не стиснуті, частина в заголовку файлу має дозвіл зображення, причому може потрапити послідовність як X,Y так і Y,X. Деякі зображення не містили жодних заголовків та були розміром 32х32 пікселя.

Вміст псевдоархіву та RLE стиск:

розбираємо

Спочатку йде заголовок - це групи з чотирьох байт, де вказані усунення початку блоку даних. Останні числа 67 A9 07 00 дорівнюють довжині файлу, число кінця першого блоку. Потім йде другий блок даних, безпосередньо для файлу adddata.adw - це зображення «вставте диск» для звичайної кампанії та обпаленогоснігу. (кількість файлів) і 4 усунення, 04 00 00 00 - 10 00 00 00 - C3 A3 01 00 - C3 A6 01 00 - 52 40 03 00 - 8002 E001 Останні числа 02 01E0h - це числа 640 і 480, тобто дозвіл. Числа задають цикл для процедури декодування блоку зі стисненням RLE. Алгоритм декодування: Число менше або дорівнює 7Fh (127) задає число повторів наступного байта, на прикладі вище - це 7Fh (127) разів повторити нуль. Якщо перше число більше 80h, то наступні (X-80h) байт - це просто байти, які потрібно скопіювати в нове місце. Послідовність 82h 01 02 означає, що це числа 01 і 02 без жодного стиснення. Якщо місце числа повторів потрапляє нуль, пропускаємо. Щодо долі числа 80h так і не зрозумів, воно має зустрічатися, т.к. різниця 80 та 80 дасть нуль).

04 00 00 00 - 4 файли. 10 00 00 00 + 1Ch який вказує на початок блоку зображення 8002(640), E001(480), тобто задаємо цикл декодування, не довше 640×480 C3 A3 01 00 + 1Ch вказує на палітру 256 кольорів RGB, 768 байт. Докладніше тут. C3 A6 01 00 + 1Ch вказує на зображення, знову 640х480 52 40 03 00 + 1Ch вказує на палітру

Справа залишилася за малим, розібрати файли на блоки, розпакувати стислі ділянки та склеїти з палітрою. Декодоване стисло зображення:

розбираємо

Ігрові спрайти:

розбираємо

Вийняті з ресурсів зображення виявилися темними, потрібно зробити бітовий зсув вліво на 2 кожному каналі R, G, B. r=r shl 2; (ну або помножити на 4, кому більше подобається) g=g shl2; b=b shl 2;

Небагато картинок для розслаблення. Оригінальні, без фільтрів, тру. Ці картинки намальовані праворуч на панелі, коли вибираєш юніта.

розбираємо

Копав файл CD:DATAMISSIONS73UNITS.DAT, з'ясував наступне [DEUTCHE] [TIGER] 6,80,3,50,100,0,142

Інформація про юніти на карті: - Перші два числа через кому - це координати X і Y юніту, нуль починається в лівому-верхньому кутку. Максимум дорівнює 128, розмір карти 128х128, як би фіксований; ціле число, 0-128 - Третє число - спрайт повороту юніта, в 8 напрямках повинні бути + поворот вежі теж анімований; ціле число 0-7. Башта повернена за напрямом погляду юніта. - Четверте число - кількість життя юніта, ціле число 0-100, схоже у відсотках від максимуму кожного юніта; — П'яте число — кількість боєприпасів, схожа на відсотки від максимуму. 0-100. - Останні два не зрозумів що за числа, міняв на 1, 142 і на 2, 12, в юніті нічого не змінилося. Чи не атака/захист, перевірив. (шостий, передостанній - у ворожих юнітів позначає видимість, 0 - не видно гравцю, 1 - бачимо) - Останнє сьоме число поки що хз. Схоже якось пов'язане з патрулюванням, від початку гри їздять по-різному ворожі танки. Схоже на скрипт поведінки за номером. Від 0 до хз 255

Для будинків параметри такі: [DOMES] 29,33,70,100,1

1) Тип будівлі, значення від 0 до 35. 2,3) Координати X, Y лівого верхнього початку будівлі, малюється вправо та вниз. Значення приблизно від 1 до 128. 4) Кількість «життя» будівлі, в %. 0-100. Пробував і 1000%, тоді будівлю можна знищити з 6 динамітами, замість 2х за звичайну велику. 5) Умова, чи потрібно знищити будівлю, щоб перемогти в місії. 1 – звичайна будівля, за знищення немає бонусів, 2 – будівлю необхідно знищити для перемоги в місії.

опис юнітів з файлу units.dat [RUSSIAN] — Гілка опису українських юнітів, розділ [RBTANK] — Радянський Т34, середній танк, [RLTANK] — Легкий танк, Т26, [RGUN] — українська гармата проти піхоти татанків, [RTROOP] — українська піхота, [RSAMO] — українська ПТ, типу су100 [IS] — важкий український танк ІВ [BAT] — Скорострельна некерована гармата, [RGAUB] — українська керована гаубиця, [KATYA] — катюша, [RBTR] — кулеметна бтр, маленька машинка, [RFURG] — вантажівка для піхоти, [TOWER] - вежа з кулеметом, [RZENIT] - українська зенітка проти літаків, [CAR] - машина з vip персоною, [RMZ] - українська пересувна машина з зеніткою проти літаків

[DEUTCHE] - гілка опису німецьких юнітів, розділ [DGUN] - німецька гарматка, [DLTANK] - німецький легкий танк, [DBTANK] - німецький середній танк, [TIGER] - Тигр , [DBIKE] — мотоциклетка, [DTROOP] — піхота, [RFURG] — фургон-вантажівка, українська, можна захоплювати або використовувати як свою. [DBTR] - кулеметна бтр-машинка [DSAMO] - німецька пт, типу фердинанда [DGAUB] - німецька керована гаубиця [ART] - Швидкісна, точна гармата, якою можна керувати. [DZENIT] — Зенітні гармати проти літаків, [DMZ] — Пересувна зенітка проти літаків, [STIG] — Німецький убер-танк із потужною гарматою та слабкою бронею , Штурмтигр,

А ще, наприклад, якщо граєш за німців, гілку описів ІС кладеш під своїм описом, під [DEUTCHE], то всі ІС стають під твій контроль.

У результаті накидав мінімод - Дружба народів:

протистояння

Тема на форумі old-games, раптом хтось допоможе допиляти недопилене. Вихідники доступні, на жаль, на Делфі7.