.::Russian Blood Community Forum::. »Blood: The Game We Playing In » Editing Center » Структура MAP
Страниц (3): [1] 2 3 »
1. Slava - 11 Августа, 2004 - 03:14:00
Кто-нибудь встречал информацию о формате файла MAP? О его внутренней структуре.
Отличаются ли форматы в разных внутренних версиях игры? Я имею ввиду 1.0, PP, CP.
Что-то слышал о сжатом и не сжатом MAP. Может кто подскажет что это такое?

2. LifeKILLED - 11 Августа, 2004 - 19:02:00
Может, у Кена Сильвермана что-то об этом есть?

3. DeadFire - 13 Августа, 2004 - 11:18:00
Насколько я знаю Ken Silverman не поддерживает свой сайт...
Вообще его уже не найти в инете...

А формат *.Map - формат карт для Duke Nukem... Для него может чё и есть на эту тему... Но я ничё не видел...
Вообще в поставку с Duke должен был входить файл разбайтовки... Но это Duke... а Blood исп. модифицированный формат и
не был сделан opensource ом... так что такого документа для него нет, а если и есть, то его придётся ОЧЕНЬ ДОЛГО И НАПРЯЖЁННО
искать на англицких ресурсах....

Подобный документ был в игруле Подземелья Кремля...

4. Victor - 13 Августа, 2004 - 22:38:00
http://www.planetblood.co...bloodsource/rebuild.shtml

5. Victor - 13 Августа, 2004 - 22:49:00
Структура MAP:
http://www.planetblood.co...bloodsource/innards.shtml

6. Slava - 14 Августа, 2004 - 14:29:00
О! Огромное спасибо! Какой интересный ресурс.

7. Victor - 14 Августа, 2004 - 20:58:00
to Slava
Что собрался делать с этим?

8. LifeKILLED - 14 Августа, 2004 - 22:23:00
Вот и я тоже хочу это знать.

9. Slava - 16 Августа, 2004 - 00:28:00
Да так, глупые идеи залетают в голову. Думал: а можно ли создать программу, которая автоматически просчитывает заданные тени и вставляет их в MAP. Скажем наваял карту. Потом засунул в эту программу, указал откуда светит солнце и прочие параметры, а программа покопавшись в MAP нарежет там сектора, затемнит где нужно.
Но что-то слишком сложно все это...

10. LifeKILLED - 16 Августа, 2004 - 20:38:00
А я вон движок свой хочу сляпать... С размытыми тенями... Покруче дума3... Но все никак директ хэ программирование не освою... Вот так хожу по улицам и своей квартире, смотрю на тени и уже знаю, как это сделать легко и просто... С растяжением текстуры градиента, например... Тормозить будет, но зато еще и работать... Только все никак не запрограммирую... Уже статьи в нете откопал по азам директа хэ... Вообще, все в жизни сложно... Кармак вон с колобка игрушки делать начинал... Опыт... Старый он уже, дряхлый, зато дум3 наконец сделал... И ведь один он сделал 3д движок... Везет же людям...

11. LifeKILLED - 16 Августа, 2004 - 20:53:00
А если серьезно, мне так кажется, что если все-таки разобраться в системе, можно и цвет освещения вычислять (хотя, если честно, паллитр всего-то 4) и отражения от стен... Я это знаю и понимаю, сам люблю тени расставлять. Еще в 3ds max есть система Radiosity, которая вычисляет все отражения от всех плоскостей, но если попробовать такое извращение сделать для мапэдита, то число секторов на карте раза в 3 возрастет, если не в 10. А ведь это увеличение будет сложнее, чем в редакторе insertом точки вставил и линию нарисовал. Здесь придется вручную делать новый сектор, старый отодвигать, располагать их рядом... Жуть...

12. Victor - 20 Августа, 2004 - 02:12:00
Читал, у Кармака ужасный стиль программирования. И для многих начинающих программистов он кумир...

13. CHARMED - 30 Октября, 2004 - 17:44:41
Кармак - это круто?

Сложно сказать...

Quake3 - просто супер!

14. Slava - 11 Декабря, 2004 - 22:18:02
К сожалению вышеуказанные ссылки больше не работают - видимо проект убрали с глаз долой. То, что я там накопал, к сожалению не сохранил. Но накопал я на самом деле не много. Ничего конкретного насчет структуры файлов MAP там не было - только общее описание.

15. ledon - 12 Декабря, 2004 - 20:55:28
Плохо Недовольство, огорчение
Я сегодня решил раскопать структуру используя сам редактор потому, что заметил, что он часто сообщает что где меняется вплоть до названия членов структуры (например, когда меняешь высоту или наклон потолка или пола в 3D-режиме) да ещё и текстуры пронумерованы. Вот думаю, как можно просто раскрыть структуру. Нарисовал пару секторов, положил на каждую стену разные текстуры, задал уникальные высоты и наклоны полов и потолков, всё аккуратно на бумажку выписал и с предвкушением открыл сохранённую карту в HEX-редакторе... Ага, ШАЗ! Пытаюсь найти высоту пола, не нахожу, как не изворачивался, ищу другие параметры, та же беда. Почесав репу решил, что может эти числа как-то сохраняются подругому - типа сдвигаются или ещё что... Ладно думаю, попробую изменить всего один какой-нибудь параметр, сохранить в другом файле и путём сравнения найти место изменения (если получиться можно хоть так выкопать что где хранится)... Изменил, сохранил, сравниваю и у меня глаза на лоб лезут - кроме нескольких десятков первых байт и небольшого блока далее, файлы абсолютно разные - причём я сравнивал повсякому. Теперь я подумал, что возможно файл архивируется... Дальше больше. Когда я просто пересохранил файл под другим именем, даже ничего не меняя и не двигая мышью - файлы также кроме размера ничего общего друг с другом не имеют. В общем я понял, что похоже Сильверман эти файлы кодирует (вначале я думал, что он их сжимает, но раз файлы меняются даже тогда когда карты идентичны...). Есть правда небольшие зацепки но это требует долгой кропотливой работы. Там после заголовка идёт один байт который меняется, у меня такая идея, что может он используется как ключ и в простейшем случае прибавляется или вычетается. Плюс в данных наблюдается схожесть - т.е. если в одном файле идут числа например 1B, 1C, 20 то в другом например так AB, AC, B0, т.е. на 90 больше, но это не всегда так, потому что в следующей цепочке могут идти числа совершенно с другой разницей причём даже не большие, а меньшие. Короче... жо...
Меня вот только одно удивляет - на кой чёрт было так извращаться? К примеру ни DOOM-а ни дюка так не шифровали... Там меня даже удивляла такая безумная простота - типа все сектора читаются из файла за один вызов функции read.

Может кто ещё посоветует как раскопать формат карт BLOOD-а?

16. Slava - 13 Декабря, 2004 - 14:14:20
Да уж. Сложновато будет что-то достать из этих файлов если они действительно шифруются. Наверняка где-то на буржуйских форумах есть информация. Хотя если даже на PlanetBlood нет ничего конкретного, то тут только самому разбираться. Может даже без SoftIce не обойтись. Но это уже для маньяков, у которых реверсивный инжениринг - хобби, и есть куча времени.

(Добавление)
http://blood.sourceforge.net/rebuild.php#fileformats-section

(Добавление)
Судя по написанному - используется XOR алгоритм шифрования.

17. ledon - 17 Декабря, 2004 - 02:35:25
Блин!
Slava, ты меня опередил! Я сам начал расшифровывать, даже понял, что основной принцип шифрования заключается в том, что в зависимости от 33-го ключевого байта берётся определённое число, которое как-то комбинируется последовательно с каждым байтом каждого сектора и одновременно увеличивается на 1. В начале каждого сектора оно устанавливается в первоначальное значение. Я вначале думал, что комбинация заключается в сложении и дабы получить исходный байт нужно вычесть это число из зашифрованного, но это не всегда работало и в определённых случаях помогало обратное вычитание. Но всё равно не всегда. До XOR-я я так и не допетрил, а тут ты коварно подкинул мне этот сайт Улыбка. И я, поддавшись искушению, посмотрел как там расшифровывается, а так хотелось самому дойти тем более, что был совсем близко. Шутка, конечно, и я конечно же очень тебе благодарен, тем более, что есть ещё заголовок файла, который расшифровать это можно застрелиться и сам бы я ни вжисть не догадался.
Однако шифровку стен я потом всё же сам решил прошарить из принципа и прошарил. До спрайтов пока не дошёл.

Ещё раз огромное спасибо!

18. Slava - 20 Декабря, 2004 - 04:26:19
Зашибись, ledon! Чувствуется - у тебя мозги на месте. Одобряю Так что давай доводи это дело до конца. Эта инфа будет очень полезна.

19. LifeKILLED - 08 Марта, 2005 - 16:52:40
Я тут подумал... Вы разобрались с шифровкой, а нельзя ли теперь достать, хотя бы, координаты секторов (может, на основе структуры Дюка, которые, наверно, есть, а если нет, то всегда можно попросить создателя JFDuk'а). Можно будет создать конвертер карт в bsp, и цены ему не будет!

20. Slava - 08 Марта, 2005 - 18:34:33
Еще рано... Подмигивание
BTW: А зачем тебе? т.е. что такое вообще bsp?

21. DeadFire - 08 Марта, 2005 - 20:55:51
BSP - стандарт карт, который использует, например, Quake...

22. LifeKILLED - 09 Марта, 2005 - 02:18:54
По-моему, код bsp тоже открыт, так что конвертер сделать было бы очень даже полезно. Хотя нет ли такого конвертера у Tranfusionцев? Они там где-то половину карт сделали, и везде чьи-то имена. То ли они их заново строят в редакторе Кваки, то ли доделывают после конвертера. Раз готова только половина, значит, мне кажется, они делают их заново. Значит им нужен конвертер!

(Добавление)
И нам нужен.

Кстати, а что значит "рано"?

23. Slava - 09 Марта, 2005 - 06:03:28
Формат карты раскрыт. Я просто составляю полную инструкцию. Мне нужно еще время, чтобы дописать разделы с extra-информацией. А обычные координаты секторов, так они уже давно представлены в исходниках утилиты blud2b со страницы проекта Transfusion.

24. DeadFire - 09 Марта, 2005 - 14:32:37
Конечно, они их доделывают!
Т.к. нужно текстуры наложить на все объекты... Расставить SFXсектора - т.е. там всякие двери и т.п.... Ну а это конечно львиная часть всей работы над картами...

(Добавление)
Если у них есть конвертор - то это ещё ничего не значит...
Ведь они создают Transfusion как самостоятельный проект лишь с использованием Вселенной Blood... Так что, их работа, по большому счёту, представляет из себя НЕ ПОРТИРОВАНИЕ BLOOD НА ДВИЖОК QUAKE, а создание подстройка QUAKE под материал: графику, эффекты, карты, атмосферу BLOOD. Что, скажу я, у них средненько получается... Но, если они перейдут на другой движок, а с Quake это вполне возможно, то тогда мы может и увидим что-то интересненькое...

BSP - открытый стандарт... Его, кажется, открыли с публикацией исходников к Quake 1... Именно на этом движке делают сейчас Transfusion...

25. LifeKILLED - 10 Марта, 2005 - 22:00:00
Цитата:
НЕ ПОРТИРОВАНИЕ


Тогда в чем их цель? Изгадить Blood?

26. Slava - 19 Марта, 2005 - 05:04:48
Цитата:
Меня вот только одно удивляет - на кой чёрт было так извращаться?
А уж что там с экстра-разделами! Они хоть и не шифруются, но в таком беспорядке все биты с байтами перепутаны. Может для экономии места...

27. jm - 19 Марта, 2005 - 12:42:34
Сам BSP формат был открыт задолго до публикации исходников Q1.
Причем в Q3 он не слишком то и изменился.

ps В случае чего готов оказать посильную помощь ( сам писал рендереры q1,q2 и q3 уровней, http://www.gamedev.ru/articles/?id=30128 )

28. Slava - 20 Марта, 2005 - 03:08:26
Цитата:
http://www.gamedev.ru/articles/?id=30128

РРУЛЬ!

29. jm - 20 Марта, 2005 - 11:11:06
А вообще сделать римейк блада ну очень соблазнительная мысль... гы-гы!

30. Hellen - 20 Марта, 2005 - 11:34:21
Уже делают...Ухмылка

31. jm - 20 Марта, 2005 - 13:53:45
Это вы про трансклюжн ? Улыбка

Ну так они его уже один раз делали Подмигивание Как в том анекдоте:

- (мечтательно) хотел бы я её ещё раз...
- а ты что уже ... ?
- нет, я её уже один раз хотел

Буквально вчера был на страницах Трансклюжен-Трансклюжен 2-ребилд - все проекты заморожены. Да и вообще ребята по моему погорячились взяв за основу ку1 (трансклюжн)-ку2(трансклюжн 2). Надо же сохранить оригинальный вид, не очень уверен что без должно профессионализма и только на голом энтузиазме удасться создать качественные 3д модели. Подобное уже проходили на римейках дума в 3д - модели хоть и в полном 3д смотрятся гораздо хуже оригинальных спрайтов.

Или речь о чем то другом ?

32. jm - 11 Апреля, 2005 - 19:55:18
Начал ковырять формат. Большая часть ковыряния базируются на email'е Matt'а и исходникам утилит rebuild'а. Есть и мои мысли и исправления. Так что это не один в один blud2b Улыбка

Числа начинающиеся с 0x подразумевают шестнадцатеричное представление.

Итак, описание заголовка:

4 байта - magic ( unsigned int ) - всегда должно быть равно 0x1a4d4c42 или в строковом представлении BLM\0x1a ( последний код это стрелка)
2 байта - версия ( unsigned short ) - для моего Blood 1.10 равно 0x700 - старший байт означает версию ( 7 в моему случае ), младший саб версию. Версия 7 закриптована, версия 6.03 нет судя по описанию на blood.sourceforge.net

Далее идет закриптованный блок информации. Криптуется банально - побайтово xor'ится с ключем. Ключ один байт. На каждый новый байт информации ключ инкрементируется. Для этого блока ключ 0x4d

4 байта - x координата старта игрока ( int )
4 байта - y координата старта игрока ( int )
4 байта - z координата старта игрока ( int )
2 байта - угол игрока ( short ) - значение от 0 до 2048 на сколько я понял
2 байта - сектор в котором начинает игрок (?) ( short )

Далее идет информация, которая не описана на rebuild. Ключ все тот же.
Возможно размерности и отличаются (то есть не 2 байта, 4 байта, 4 байта а например 2, 2, 2 и 4) однако визуально очень похоже что не ошибаюсь...

2 байта - неизвестно (unsigned short) содержит обычно очень небольшие значения - карты криптик пассэйджа и многие стандартные обычно содержат значение 4, а некоторые ноль.

4 байта - неизвестно (unsigned int) очень часто содержит значение 800, 768, либо все тот же ноль.

4 байта - неизвестно (unsigned int) а вот это ну очень интересно Улыбка Я не знаю, что это - в стандартных картах оно поголовно сброшено в ноль, а вот в картах что произвел на свет mapedit из комплекта оно заполнено и равно 0x7474614d Это ключ для дальнейшей декриптовки, судя по описаниям с rebuild. А ещё это строчка 'Matt' Подмигивание То бишь по сути в качестве ключа используется имя разработчика. Увековечил себя тыкскызыть хлопец Улыбка

1 байт - неизвестно (unsigned char) не знаю что это, обычно равно двум. Причем и в стандартных уровнях и самодельных.

Идущая далее информация закриптована на другом ключе - 0x68
Описание есть на ребилде ( вернее легко догадаться что это Улыбка)
4 байта ( int ) - ревизия карты, меняется постоянно при сохранении я так понимаю.
2 байта - количество секторов на уровне (unsigned short)
2 байта - количество стен на уровне (unsigned short )
2 байта - количество спрайтов на уровне ( unsigned short )

Если нужно, могу приложить свою утилитку - она выдает информацию по заголовку + сбрасывает в dump.out расшифрованный заголовок чтобы удобнее было изучать Улыбка

33. jm - 12 Апреля, 2005 - 08:53:51
Вобщем сегодня плотно сел за дизассемблер и mapedit. Нашел и начал реверсировать функцию загрузки/выгрузки карт. По исходному тексту могу сказать следующее:

1. Там, где я по исходникам rebuild утилит разбивал информацию на два блока с разными ключами декриптовки (0x4d и 0x68) этого можно было не делать. На самом деле это всё единая структура размером в 37 байт. Ключ для расшифровки 0x7474614d ( тот самый Matt Улыбка) Но поскольку криптование побайтное достаточно использовать лишь 0x4d.

2. В размерностях я не ошибся, то есть те самый неизвестные куски идут именно в такой последовательности - 2 байта, 4 байта, 4 байта и 1 байт. Mapedit (версии 1.10) ВСЕГДА в последние 4 байта пишет строчку 'Matt'.

3. Криптовка применяется как и писал Matt в своем email'е rebuild'овцам только в случае версии >= 0x0700.

4. Опять же по email Matt'а если версия >= 0x0700 то после всей этой информации читается ещё 128 байт. Закриптовано по тому же инкрементальному xor'у на numwalls - количеству стен. Вначале там банальная строка копирайтов. Далее какой то набор информации, пока до него не дошел.

Подведу предварительный итог - заголовок map файла:

* 6 байт - сигнатура (magic) и версия, незакриптовано
* 37 байт - информация по карте, закриптовано, xor на инкрементирующемся ключе 0x4d
* если версия выше или равна семи 128 байт экстра информации, закриптовано, xor на инкрементирующемся ключе ( ключ - количество стен , полученный из заголовка )

Slava если инетерсно и есть познания в ассемблере, могу выложить куда нибудь откомментированные мною листинги...

34. Slava - 12 Апреля, 2005 - 17:51:33
Мне осталось немного...

(Добавление)
Ты лучше узнай, что такое moving skies offset. Этот блок идет прямо перед разделами с секторами. Он бывает длиной эээ.. 1 2 16 байт, сейчас точно не помню. В blood2b они просто тупо читают значение и не декриптуя его по условию if переходят на определенный адрес попадая к секторам. На самом деле если декриптовать, то там как раз и будет смещение на которое надо перейти, чтобы попасть на раздел с секторами. Но вот что в этом блоке? Там обычно идут числа 0000 0100 0200 и т.д. по возрастанию максимум до 0F00 т.е. в нормальном представлении от 0 до 15.

35. jm - 12 Апреля, 2005 - 19:04:16
Хах, легко сказать узнай что это. Одно дело когда пытаешь разобрать сериализацию (сохранение) уровня - там почти все навиду. Другое дело реверсировать сам движок. Попробую конечно, но вряд ли что получится - слишком комплексная задача. Смещения для подвижного неба... В принципе по названию можно погадать Подмигивание

Кстати, а ты разобрался со всей информацией ? К примеру почему в экстра блоке ( тот который 128 байт ) после 64 байт копирайтов идет несколько фиксированных значений:

Код:

typedef struct
{
char copyright[64];   // Строка копирайтов
unsigned int unk0;   // mapedit (1.10) всегда пишет 0x38
unsigned int unk1;   // mapedit (1.10) всегда пишет 0x18
unsigned int unk2;   // mapedit (1.10) всегда пишет 0x3c


Вот что это за 0x38, 0x18, 0x3c ? Что это может быть ? Мне сложно судить.

А вот это в заголовке:

Код:

typedef struct
{
int startx;
int starty;
int startz;      
unsigned short startangle;
unsigned short sectornum;    
unsigned short unk0;
unsigned int unk1;
unsigned int unk2;// mapedit (1.10) всегда пишет значение 0x7474614d (Matt) !
unsigned char unk3;
unsigned int revisions;
unsigned short numsectors;
unsigned short numwalls;
unsigned short numsprites;
} mapinfo;


Что это за unk0, unk1, unk2 и unk3 ? Господа с rebuild эти числа просто игнорировали и поставили в todo. Есть какие либо мысли ? Размерности соотвтетствуют (как я уже говорил я проверил). Мне сложно судить - я мало знаю редактор - так бы взял и методично наворачивая уровень пытался бы сравнивать изменения.


(Отредактировано автором: 12 Апреля, 2005 - 19:07:23)


Powered by ExBB 1.9.1
Original Style v1.5a2 created by Daemon.XP