Разглобяваме „Конфронтацията

Въведение

Любезни всички, искам да ви разкажа за стратегията на детството - конфронтация. Играта е издадена през 1996-98 г. от нашата руска фирма Doca.
Играта е стратегическа игра в реално време за Втората световна война. Много години по-късно реших първо да премина през него и да запиша ръководството и след това да се опитам да максимизирам удоволствието от играта, разопаковайки ресурси и опитвайки се да разбера логиката на играта.

конфронтацията

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

Играя и препоръчвам пълната версия 2in1 (Confrontation: War Chronicle) с пет cd-аудио записи, т.е. пълен рип на най-новата версия на играта всичко в едно.
Ако имах възможност, щях да го купя отново, тъй като оригиналният ми диск, закупен в 98g, не е оцелял.

Очевидното и просто решение е да стартирате играта под dosbox и да запишете цялата музика, което направих първо. Плейлист с музика.

Тогава си помислих, че е грешно. Оказва се, че тази музика не е оригинална, а е преминала през dosbox филтри. Реших да го разопаковам в wav състояние, като взех оригиналните данни.
Отвори файла music.dat в winhex. Тъй като в музиката има гласови вложки, предположих, че има цифров поток.
Благодарение на форума за стари игри, където ми казаха, че най-често са използвали некомпресиран "суров" поток от данни за аудио, просто звук с определени параметри (11025 Hz/22050 Hz като най-често използваните, 8-16 бита, моно/стерео, Intel/Motorola), който е изпратен директно към звуковата карта.

Отварянето в шестнадесетичен вид видя следното:

8002 E001

Началото на файла е 4 байта, съдържащи числото 20 (00 00 00 14h). В играта има 20 песни. След това следващите 20 групи от 4 байта са компенсираните мелодии. Последните 4 байта (33 A5 4B 01 = 01 4B A5 33h) са равни на размера на файла music.dat, размерът на всяка песен е равен на разликата между двете отмествания. Всичко се оказа приятно и лесно.

Таблицата на отместването е лесна за идентифициране - може да увеличава последователно числата, но понякога файловата таблица съдържа противоречиви отмествания (например таблицата на шрифта на играта нямам уста и трябва да крещя). Номерът на отместването варира от 0 до размера на файла. В този случай таблицата се увеличава.

В заглавката на всяка песен имената на песните се проследяват с фиксирано отместване от +16: Maintune, Technoish, Terrible, Requiem, Track 0, Lazy reggae, U97: Was is das, Hold, GETDOWN!, Scramble, Gone, Rainman, Песен за китара, Cool Jazz, завод за плочи от ела, REGRET.
Експериментите с парчета в програмата Game Audio Player (GAP) показаха, че музиката се възпроизвежда със следните параметри - 22kHz, 8 бита, моно, без подпис. Освен това, ако го зададете на 11 kHz, музиката ще продължи да се възпроизвежда, но 2 пъти по-бавно. Mono/Stereo също променя темпото на възпроизвеждане.

С графиката всичко се оказа малко по-объркващо. Оказа се, че някои изображения са компресирани от RLE, някои не са компресирани, частта в заглавката на файла има разделителна способност на изображението и може да има последователност от X, Y и Y, X. Някои изображения не съдържаха заглавия и бяха с размери 32x32 пиксела.

Съдържание на псевдо архив и 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
Последните числа 0280h и 01E0h са 640 и 480, тоест резолюцията. Числата определят цикъла за процедурата за декодиране на RLE компресиран блок.
Алгоритъм за декодиране:
Число, по-малко или равно на 7Fh (127), задава броя повторения на следващия водещ байт, в горния пример това е 7Fh (127) пъти, за да се повтори нула.
Ако първото число е по-голямо от 80h, тогава следващите (X-80h) байта са просто байтове, които трябва да бъдат копирани на ново място.