Простейший HEXинг для "Чайников"

 

1. Что такое hex workshop?
Hex workshop (hex, гекс, хекс) - универсальный редактор файлов. Универсальный - значит может работать с любым типом файлов. С помощью этой программы можно редактировать что угодно, файлы mp3, jpg (теоретически можно, но на практике вряд ли кто будет заниматься этим), 4ds, bin, какие угодно. Но есть одна "досадная" особенность - вся информация представлена в 16-ричном коде. Поначалу кажется, что надо быть просто гением, чтобы научиться делать хоть что-то с помощью этой программы, но это не так, и скоро вы это поймете, хотя, конечно, немного пораскинуть мозгами - всегда нужно и важно. Особенно при работе с hex.

2. О 16-ричном коде...
Есть такой термин, система исчисления. Таких систем очень много, их можно создать бес конечное количество. Но реально мы сталкиваемся всего с несколькими. Наиболее привычна нам 10-ричная система исчисления. Ее символьная таблица состоит из 10 цифр - 0,1,2,3,4,5, 6,7,8,9. И когда у нас "заканчиваются" эти цифры для счета чего-либо, то для продолжения счета мы с помощью различных комбинаций этих цифр получаем какие-либо числа. У древних римлян тоже была своя система счисления, нам от нее достались римские цифры. С другими системами исчисления сталкиваются в основном люди, связанные с компьютерами. О каких системах идет речь? Двоичная, восьмеричная, шестнадцатиричная и прочее. Но все же наиболее распространенные - это 2- и 16-ричные системы. В двоичной системе символьная таблица состоит всего из двух элементов - 0 и 1. Поэтому этот код очень громоздкий, но зато - довольно однозначный, то есть существуют только 2 базовых состояния: есть сигнал - нет сигнала. И из-за такой однозначности, компьютеры способны работать только с ней. А все то, красивое, что мы видим на экране своего монитора - не более чем комбинация ноликов и единичек, представленная в доступном для человеческого восприятия виде. И, наконец, 16-ричная система исчисления.
Ее символьная таблица: 0 1 2 3 4 5 6 7 8 9 A B C D E F
В 10-ричной системе: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Вот именно со всем этим нагромождением (на первый взгляд) букв и цифр вам предстоит столкнуться при работе в среде hex workshop. Не страшно?
 

3. Ну тогда вперед!

Есть ли у вас еще нет hex workshop (далее - гекс), то надо бы скачать. Кстати, програм ма есть на сайте salieri-bar.narod.ru в разделе "редакторы, утилиты". Еще замечу, что данный сборник самой начальной информации для желающих освоить гекс ориентирован на тех, кто собирается использовать его при редактировании файлов компьютерной игры "Mafia". Кстати, хотелось бы выразить огромную благодарность сайту salieri-bar.narod.ru и форуму этого сайта, его администрации, а также всем участникам этого форума. Отдельная благодарность - Enemy, моему скромному учителю.  

 

4. Еще немного лирики...

Раз вас потянуло на гекс, то вы, должно быть, уже знакомы с файлами, используемыми игрой "Мафия", и знаете как их редактировать с помощью других редакторов. В данном обучении я остановлюсь подробно только на двух типах файлах - scene2.bin (главный миссионный файл, содержащий в себе объекты, которые используются в миссии) и predmety.def (характеристики оружия). На мой взгляд, эти файлы наиболее пригодны для обучения, первый - из-за своей важности, второй - из-за своей относительно несложной структуры.

 

5. Итак, давайте приступим.

Запускаем гекс. Нажимаем file-open, указываем путь к файлу, который будем редактировать. Примечание: нам нужен файл scene2.bin из миссии "Обучение" (X: games/mafia/missions/tutorial/scene2.bin, например).

 

 

Вот перед вами и предстала вся "изнанка" главного миссионного файла мафии. Что самое важное при редактировании гексом любого типа файлов? Знание структуры этого файла, то есть что он в себе содержит, и что в каком месте файла расположено. Структура scene2.bin (далее - сцена) известна давно, в таких случаях говорят, что файл расшифрован. Очень наглядно, красиво и правильно текстуру этого файла нам представляет программа Don City Editor 2 (dced). Но я расскажу о структуре чуть подробнее, чем dced. Но сначала остановимся на еще одном очень важном моменте. Я думаю, вам не нужно объяснять, что такое биты (не бейсбольные) и байты. Так вот, в гексе нам приходится иметь дело с от дельными байтами кода файла. Байт, грубо но понятно говоря, это 2 любые рядом стоящие цифры (буквы, комбинация буквы и цифры) в левом верхнем окне, в том самом, где вы видите столбики по 4 символа в каждом. В правом верхнем окне байт - это любой символ, будь то буква, цифра, точка или какой-либо знак. Текстовые данные (например, "Mission file - Copyright (c) 2000 programmers of ILLUSIONSOFTWORKS" в самом верху файла), представленные в правом окне, как текст, в левом видим в виде ASCII-кода (международный код обмена информацией. Содержится в ASCII-таблице, которая состоит из 3 частей: символы с номерами (кодами) от 0 до 32 - управляющие символы; кодировки символов латинского алфавита; ко дировки символов "местного" алфавита, эта часть у каждой страны своя, с символами своего алфавита. Кроме этого есть еще типы данных. Нажмите help-reference materials-data types. Так же в этом разделе хелпа (reference materials) можно найти и таблицу ASCII-кода, но она нам не нужна. А вот типы данных, их знание - одна из основ гексинга, так что смотрим!

(тип данных)      (размер)      (принимаемые значения)

 

 

Все эти типы данных встречаются при работе в hex, но при редактировании гексом файлов «Мафии» чаще всего мы будем иметь дело с типами long (L) и float (F). Оба типа занимают по 4 байта, то есть по 8 цифр в левом верхнем окне рабочего поля гекса. Long - всегда целые числа в промежутке от 0 до до 4 294 967 295, если нет знака; и в промежутке от -2 147 483 648 до 2 147 483 647, если знак есть. Как правило, его нет... Тип float используется гораздо реже, он нужен для представления нецелых чисел и чисел с плавающей точкой, это, как правило, координаты объектов. В основном пригодится long. Все, переходим непосредственно к структуре - вторая из основ гексинга. У каждого файла структура своя. Сцена, например, состоит из трех основных частей:

 

1. Objects
2. Object definitions
3. Init script

Рассмотрим первые 6 байт кода. То есть глядим в левое верхнее окно, и поднимаем полосу про крутки до самого верха, первые 6 байт это у нас: 534C 81B0 2200 Что это значит? Первые два байта (534C) - своего рода "ключ", с которого начинается любой файл scene2.bin. Он показывает, что следующие за ним 4 байта показывают размер всего файла scene2.bin. Итак, давайте посмотрим, какой размер имеет наш файл. Выделяем эти 4 байта (сразу после 534C), и смотрим в левое нижнее окно, data inspector, на строку long. 2273409 - вот что там написано, это и есть размер нашего файла в байтах. Проще говоря, наша сцена "весит" около 2,3 Мбайт. Можете проверить сей факт, глянув через контекстное меню в свойствах файла. Во время редактирования нам необходимо следить за размером файла, для этого посмотрите на самый низ рабочего окна программы, в четвертом поле справа мы видим все ту же цифру - 2273409 - размер файла в данный момент, для нас это важно. Вновь устремляем взоры на левое верхнее окно. В шестой строке ищем последовательность 0040. Нашли? Это тоже ключ, только он обозначает уже нечто другое. Он обозначает, что начинается раздел файла, который называется objects. И, конечно, следующие 4 байта пока- зывают нам размер этого раздела. Итак, выделяем следующие за 0040 4 байта (EA57 2200), и смотрим в data inspector (DI), так же тип long - 2250730. Для остальных разделов, то есть для object definitions и init-script принцип такой же. Только начинается каждый раздел со своих "ключей". Для раздела object definitions это - 20AE, для init-script это - 50AE. Размеры разделов очень важны для нас, так реальный размер каждого из разделов и всего файла в целом должен непременно соответствовать написанному в заголовках, иначе ваша сцена просто-напросто не будет работать, ее не будет корректно воспринимать ни любой другой редактор миссий, будь то dced или bsv, ни сама игра. Поэтому либо после каждого произведенного изменения, либо после всех произведенных изменений, необходимо сравнить получившийся размер каждого измененного раздела и всего файла с исходным, и изменить этот исходный размер на новый. То же самое касается и размеров кодов измененных объектов.

 

6. Теперь поговорим о объектах.

В игре есть люди, пешеходы на улицах, автомобильное движение (траффик), свет, скрипты и прочее. Это все объекты. Каждый из них имеет свои параметры. Объекты "разложены" по разделам. Объекты различаются своими типами. Ниже представлен список всех объектов:

Sector
Lightmap
02 Light
03 Camera
04 Sound
- No definition
- 05 Script
06 Standard Object
- No definition
- 05 Script
- 18 Pedestrian Setup
- 12 Traffic Setup
- 28 Race camera
09 Model Object
- No definition
- 01 Ghost object
- 02 Player
- 04 Car
- 05 Script
- 06 Door
- 08 Trolley
- 09 Object (villa)
- 21 Dog
- 22 Plane
- 24 Rail route
- 25 Pumpar
- 27 Enemy
- 30 Wagons
- 34 Clock
- 35 Phisical Object
- 36 Truck
12 Occluder
14 Sity Music


Каждый из них имеет свой тип, свои особенности, свои параметры. Наиболее простой пример - 27-й тип, Enemy. Enemy - это любой человек, не являющийся участником траффика пешеходов. То есть, например в нашей миссии "Обучение" тип Enemy имеет человек, на котором мы должны отработать удар битой и мужики, которые стоят на улице возле такси. Любой из этих людей "состоит" из двух частей: первая записана в разделе objects, в подразделе model object. Там содержится информация о координатах этого человека, его ротации, 3d модели и секторе, в котором он находится. Вторая часть этого человека содержится в разделе object definitions, в подразделе Enemy. Там находятся свойства этого человека, именно как человека, а не просто 3d модели. То есть информация о его энергии, силе, скорости, интеллекте, слухе, зрении, навыке владения оружием, навыке вождения автомобиля и прочем. Там же содержатся и приписанные этому человеку скрипты. Объект с типом Enemy немыслим без своего дефинишна. Так как если прописать такого человечка только в model objects, то в игре он будет все равно что мусорная корзина, просто будет стоять с разведенными руками. Но если прописать ему дефинишн, то это будет уже полноценный человек, которого можно скриптовать, изменять его свойства, и, разумеется, использовать его в игре для различных целей, сделать из него продавца оружия, гангстера и прочее. Model object - тело, а его дефиниш - душа. Теперь ближе к технической стороне вопроса. Разберемся на примере model object. Найдите в сцене начало раздела objects. Теперь, выделите от него 342 байта. Выделите от него - значит начиная последовательностью 0040, мышкой, в левом верхнем окне выделяем 342 байта. Для удобства этого действия посмотрите туда, где мы смотрели размер кода всего файла, в поле слева от него увидите поле, в котором написано "sel:" (если не написано, значит, вы еще не начали выделять, а чего ждем-то?!), там ображается количество выделенных байт, так вот, глядя в это поле выделяем 342 байта. Видите сразу после выделенного кода 1040? Вот, оно-то нам и нужно! 1040 - начало кода объекта, снова "ключ", только уже для кода конкретного объекта. Я думаю, вы уже знаете, что означают следующие 4 байта? Верно. Это размер кода данного объекта. Он равен 149 байтам. Давайте выделим весь этот код, то есть начиная с 1040 выделяем 149 байт.

 

 

Вот он, этот код. Пока не очень понятно... Сейчас я разложу этот код по полочкам, и вы все поймете. Итак, смотрите:

1040 9500 0000 - вы уже знаете этот код, 1040 - "ключ", с которого начинается код объекта, 4 байта после него - размер кода объекта;

1140 0A00 0000 0900 0000 - вновь "ключ" (1140), следующие 4 байта, по традиции - размер, равный в данном случае 10, и, как видите, в последовательности 1140 0A00 0000 0900 0000 и впрямь 10 байт. И оставшиеся 4 байта - суть этой строки - тип объекта.

1000 0C00 0000 456E 656D 7900 - традиционно, ключ, размер. Последние 6 байт - название (Enemy). Далее я не буду писать, что первые 2 байта - "ключ", а следующие 4 - размер кода, я думаю, вы уже это поняли.


2000 1200 0000 A9A5 3F42 C909 983E AB9F BF43 - position (координаты)
A9A5 3F42 - по оси X (тип данных - float!)
C909 983E - по оси Y (аналогично)
AB9F BF43 - по оси Z (аналогично)

2200 1600 0000 C86B AC3E 0000 0000 150C 71BF 0000 0000 - rotation (вращение по осям), тип float.
2D00 1200 0000 0000 803F 0000 803F 0000 803F - scalling (размер объекта по осям, float)
2C00 1200 0000 A9A5 3F42 C909 983E AB9F BF43 - additional (по осям, float)
2040 1B00 0000 - sector size размер сектора
1000 1500 0000 5072 696D 6172 7920 7365 6374 6F72 00 - primary sector
1220 1200 0000 456E 656D 7931 322E 4933 4400 - 3d модель объекта, Enemy12.I3D в данном случае

Думаю, с этим все понятно. Если вы, допустим, хотите выкинуть какой-либо объект, выделяете его код, начиная 1040 и до следующих 1040 и просто удаляете кнопочкой delete. Но не забудьте (!) изменить размеры кодов соответствующего раздела и всего файла! Для этого вначале раздела смотрим исходное значение его размера (после 0040, как вы уже знаете), вычитаете из этого числа размер удаленного объекта (не забудьте его посмотреть перед удалением!), потом, смотрим в Data inspector, предварительно выделив код размера. И в строке long меняем это значение на новое. Если вы забыли посмотреть перед удалением объекта размер его кода, то ничего страшного, просто прийдется выделить код всего раздела (или посмотрев его размер, или просто от "ключа" до "ключа", которые вам уже известны), посмотреть внизу, сколько байт вы выделили, и записать это значение в заголовок раздела так же, через Data inspector.


С размером всего файла проще, смотрим внизу (я уже объяснял выше, где именно) его
размер на данный момент, и также, выделяем 4 байта после 534C, и изменяем это значение на новое через Data inspector.

То же самое необходимо сделать, если вы изменили объект, допустим, модель человека
изменили с Enemy12.I3D на Enemy98K.I3D - размер кода объекта, раздела и файла потяжелел на 1 байт.
Аналогично все и при добавлении объектов.

7. Теперь немного об Object definitions.

Структура такая:

(снова первые 2 байта - "ключ", потом 4 байта, обозначающих размер)

21AE 0000 0000 - общий размер кода объекта

23AE 0000 0000 0000 0000 0000 00 - имя объекта

22AE 0000 0000 0000 0000 - тип дефинишна (последние 4 байта определяют этот самый тип, в виде числа. Помните, вначале 6-го раздела я приводил список всех объектов с номерами? Вот этот номер и определяет тип дефинишна, тип long)

24AE 0000 0000 - свойства. 24AE - "ключ", как всегда, потом 4 байта - размер, а вот уже за ними идут свойства, которых у каждого объекта разное количество. Вот как раз свойства - самое интересное в дефинишнах, на мой взгляд. Именно здесь изменяются такие параметры, как количество вагонов метро и трамваев, к примеру.

 

Есть объекты без свойств (01-Ghost object, 20-Unknown, 30-Wagons, 34-Clock), есть объекты, свойства для которых написаны, но игрой не используются (04-Car, 36-Truck), так как все автомобильные свойства содержатся в файле vehicles.bin. Вообще, свойства - вещь строго индивидуальная у каждого типа объектов, никакого универсального рецепта тут нет. Собственно, многие из свойств не имеют большой роли, или неинтересны. Но есть и важные свойста, вроде количества вагонов у метро и трамваев. Но как найти то или иное свойство, узнать, на что оно влияет - весьма важный вопрос. Как правило, свойства имеют тип long (то есть занимают 4 байта) и идут прямо друг за другом. Но это не всегда. Поэтому остается лишь брать свойство, изменять его значение, запускать игру, и смотреть, какие изменения произошли.
 

В качестве примера приведу 25-Pumpar (автозаправщик), его расшифровал Enemy, так же он расшифровал 24-Rail route. 02-Player и 27-Enemy - расшифрованы полностью; 21-Dog, 22-Plane, 08-Trolley, 06-Door, 35-Physical Object - частично.
 

Итак, собственно, автозаправщик (цитирую Enemy):
 

21AE 4C00 0000
23AE 0D00 0000 7075 6D70 6172 00 - pumpar (имя объекта)
22AE 0A00 0000 1900 0000 - 25 (тип дефинишна)
24AE 2F00 0000 - свойства
01
9A02 0000 9B02 0000 CC97 0400 0000 0000 1E00 0000
7900 0000 7A00 0000 7B00 0000 7C00 0000 7D00 0000

01 - const? (возможно имеется связь с срипт-командой pumper_canwork)
9A02 0000 - 666 (ID точки в check.bin)
9B02 0000 - 667 (ID точки в check.bin)
CC97 0400 - 00301004.vaw (имя файла в папке sound)
1E00 0000 Asfalt s011.wav - s015.wav (ID в tables/sounds.dat)
7900 0000 pumpa_hadice up - pumpa1.wav (ID в tables/sounds.dat)
7A00 0000 pumpa_open - pumpa2.wav (ID в tables/sounds.dat)
7B00 0000 pumpa_tankovani - pumpa3.wav (ID в tables/sounds.dat)
7C00 0000 pumpa_close - pumpa4.wav (ID в tables/sounds.dat)
7D00 0000 pumpa_hadice down - pumpa5.wav (ID в tables/sounds.dat)

Примерно так это все выглядит после расшифровки.

8. Вот еще приведу напоследок описания некоторых объектов (автор описаний - Enemy)

Standard Object отличается от Model Object тем, что вместо строки с именем модели находится строка с некими свойствами. Принято считать, что они определяют зону действия объекта. Я с этим не согласен, думаю что это наследие бета-версии. Можно смело удалить строку 5040 (не забыв изменить размер в 1040!)- никаких изменений не наблюдается.

Standard Object
1040 A700 0000
1140 0A00 0000 0600 0000
1000 1200 0000 7461 7869 5F70 6F69 6E74 3300 - taxi_point
2000 1200 0000 0921 DF43 494F 6DC0 6F45 3043
2200 1600 0000 2229 C03D 0000 0000 E1DE 7E3F 0000 0000
2D00 1200 0000 0000 803F 0000 803F 0000 803F
2C00 1200 0000 0921 DF43 494F 6DC0 6F45 3043
2040 1B00 0000
1000 1500 0000 5072 696D 6172 7920 7365 6374 6F72 00 - Primary sector
5040 1E00 0000 0000 00BF 0000 00BF 0000 00BF 0000 003F 0000 003F 0000 003F

Только общая часть, никаких свойств не имеет. Наследие бета-версии, в Мафии используется только во Фрирайде для камеры показывающей куда отвезти пассажира. Вместо объекта Camera вполне можно использовать Standard Object.

Camera
1040 8600 0000
1140 0A00 0000 0300 0000
1000 0F00 0000 6361 6D65 7261 3133 00 - camera13
2000 1200 0000 CCDD D0C4 6787 43C0 25ED B0C2
2200 1600 0000 7D08 213F 0000 0000 2302 473F 0000 0000
2D00 1200 0000 0000 803F 0000 803F 0000 803F
2C00 1200 0000 CCDD D0C4 6787 43C0 25ED B0C2
2040 1B00 0000
1000 1500 0000 5072 696D 6172 7920 7365 6374 6F72 00 - Primary sector

Sound
1040 6B00 0000
1140 0A00 0000 0400 0000
1000 0F00 0000 6361 6D65 7261 3133 00
2000 1200 0000 CCDD D0C4 6787 43C0 25ED B0C2
2200 1600 0000 7D08 213F 0000 0000 2302 473F 0000 0000
2D00 1200 0000 0000 803F 0000 803F 0000 803F
2C00 1200 0000 CCDD D0C4 6787 43C0 25ED B0C2
2040 1B00 0000
1000 1500 0000 5072 696D 6172 7920 7365 6374 6F72 00

1040 F400 0000 - сумма от начала строки и до конца
1140 0A00 0000 0400 0000 - тип 04 (sound)
1000 0C00 0000 0000 0000 0000 - имя объекта
2000 1200 0000 0000 0000 0000 0000 0000 0000 - координаты
2200 1600 0000 0000 0000 0000 0000 0000 0000 0000 0000 - ротация
2D00 1200 0000 0000 0000 0000 0000 0000 0000 - размер
2C00 1200 0000 0000 0000 0000 0000 0000 0000 - доп. координаты
2040 1B00 0000 - сумма от начала строки и до конца следующей строки
1000 1500 0000 5072 696D 6172 7920 7365 6374 6F72 00 - сектор (Primary sector)

Только для 04 (sound):
6040 7100 0000 - сумма от начала строки и до конца
1000 1300 0000 3033 5F6D 7573 6963 2E77 6176 00 - 03_music.wav
6140 0A00 0000 0100 0000 - тип источника (1 - локальный; 2 - ???; 3 - глобальный)
6240 0A00 0000 0000 803F - громкость (1; от 0 до 1)
6340 0A00 0000 0000 0000 - ??? (0)
6440 0E00 0000 0000 803F 0000 C03F - ??? (1.0 1.5)
6840 1600 0000 0000 2041 0000 C842 CDCC CC3D 3333 333F - F1 F2 F3 F4
F1 - расстояние от источника звука до F1 с постоянной громкостью (10);
F2 - расстояние от F1 до F2 c уменьшением громкости (100);
F3 - уровень громкости на расстоянии F2; (0.1)
F4 - уровень громкости на расстоянии F1 (0.7)
6640 0600 0000 - ???
6740 0600 0000 - ???
00B8 0A00 0000 0000 803F - скорость воспроизведения (1; от 0.1 до ...)

Опция, например:
00B2 1500 0000 5072 696D 6172 7920 7365 6374 6F72 00 - сектор (Primary sector)
или
01B2 0F00 0000 706F 646D 6F73 7432 00 - сектор (podmost2)

Occluder - не расшифрован.

Sity Music – определяет, какая музыка проигрывается в том или другом районе города. Писать про нее особо нечего.

Light
1040 9501 0000
1140 0A00 0000 0200 0000
1000 0E00 0000 6C69 6768 7430 3000 - light00
2000 1200 0000 5C1B 7342 2597 DA40 25C6 DB42
2200 1600 0000 F029 36BF 0000 0000 1ADE 333F 0000 0000
2D00 1200 0000 0000 803F 0000 803F 0000 803F
2C00 1200 0000 5C1B 7342 2597 DA40 25C6 DB42
2040 1B00 0000
1000 1500 0000 5072 696D 6172 7920 7365 6374 6F72 00 - Primary sector

4040 1001 0000
4140 0A00 0000 0500 0000 /5/ - Type (Fog)
2600 1200 0000 D7A3 703E AE47 613E A69B 443E /0.2349999994 0.2199999988 0.1920000017/
4240 0A00 0000 0000 8040 /4/ - Power
4340 0E00 0000 C2B8 B23E C2B8 323F /0.3490658402 0.6981316805/ Cone1 Cone2
4440 0E00 0000 CDCC CC3D 0000 A041 /0.1000000015 20/ Range: Near Far
4540 0A00 0000 6B00 0000 /107/

4640 1700 0000 7365 6374 6F72 2026 2620 7072 6168 3031 00 - sector && prah01
4640 1C00 0000 7365 6374 6F72 2026 2620 7363 686F 6469 7374 6520 3200 - sector
&& schodiste
4640 1700 0000 7365 6374 6F72 2026 2620 7361 6368 7461 00 - sector && sachta
4640 1700 0000 7365 6374 6F72 2026 2620 7072 6168 3034 00 - sector && prah04
4640 1500 0000 7365 6374 6F72 2026 2620 6861 6C61 00 - sector && hala
4640 1700 0000 7365 6374 6F72 2026 2620 6368 6F64 6261 00 - sector && chodba
4640 1700 0000 7365 6374 6F72 2026 2620 7072 6168 3032 00 - sector && prah02
4640 1A00 0000 7365 6374 6F72 2026 2620 7363 686F 6469 7374 6500 - sector &&
schodiste

Собственно, по гексингу scene2.bin все, конец. Это, конечно, далеко не все. Но это минимум знаний, с которым вы сможете двигаться дальше. По крайней мере я, зная столько, сколько вы узнали из этого обучения, смог самостоятельно расшифровать в качестве тренировки файл predmety.def. Не весь, конечно. Но основные моменты редактировать с помощью гекса умею. И научился этому сам. Enemy научил меня работать в гексе только со scene2.bin, и это послужило хорошей основой. Надеюсь, в вашем случае будет так же. Только я вам еще дам кое-какие начальные знания и по predmety.def, чтобы вы имели представление как работать с чем-то, кроме scene2.bin

9. Итак, predmety.def, поехали.

Файл находится в папке tables. Открываем его гексом, смотрим. У этого файла иная структура, попроще, чем у scene2.bin. Размер этого файла равен 6580 байтам, и до недавнего времени считалось, что добавлять в игру свое оружие нельзя, однако это оказалось не так. Размер характеристики каждого оружия равен 188 байтам. Так что никаких лишних трудностей в виде изменения размера файла здесь нет.

Структура простая:

Название оружия - 32 байта
Тип гильз - 1 байт (22 - крупные, ружьевые; 20 - маленькие)
Оптический прицел - 1 байт (00 - нет; 40 - есть)
Еще два не совсем понятных байта
Название 3d модели - 32 байта
30 свойств данного оружия - 120 байт

Каждое свойство "располагается" на 4 байтах, и имеет тип данных long или float. Эти свойства идут подряд, то есть сразу после модели: 4 байта - свойство, 4 байта - свойство, и т.д. после 30 свойства сразу начинается характеристика следующего оружия. Еще есть некоторые затруднения с тем, что не все свойства универсальны, даже для огнестрельного оружия некоторые параметры различаются по своим параметрам. Не говоря уже об остальных видах оружия. Я расскажу вам только самую малость и только по огнестрельному оружию, а все остальное, если будет желание (а оно, я думаю, у вас будет, раз дочитали до этих слов) разберете сами, ваших знаний уже вполне достаточно для этого.


Итак,пятое свойство, то есть пятые четыре байт от конца названия модели, которое, напомню, занимает 32 байта, обратите на это внимание! То есть, к примеру,название 3d модели револьвера S&W model 27 magnum - 2sw27.i3d - 9 байт, но после него - 23 нулевых байта, так вот они относятся к названию! Кстати, первые четыре параметра на что влияют в принципе известно, но они несколько сложные и непонятные в плане редактирования, поэтому трогать я их не буду. А вот вышеупомянутое мною 5-е свойство - это звук выстрела, тип long. Для редактирования этого параметра вам понадобиться такой вот списочек:


0 - нет звука 63 - звук удара бутылкой или кастетом
65 - нож
66 - бита
67 - colt detective special
68 - s&w model 27 magnum
69 - s&w model 10 m&p
70 - colt 1911
71 - thompson
72 - pump shotgun
73 - saw off shotgun (обрез)
74 - винтовка Спрингфилд
189 - винтовка Мосина

Просто и непринужденно меняете в Data inspector'е значение этих четырех байт на нужное вам.

Следующее свойство мне неизвестно (6-е), а вот седьмое (24 байта от конца названия модели) - это параметр, определяющий, как игрок будет держать оружие, тип long, и снова вам пригодится списочек:

0 - вещь (бомба, документы и пр.)
1 - держит одной рукой, как пистолет
2 - такой тип у винтовок Мосин и Спрингфилд
3 - так Томми держит томпсон, обрез и помповый дробовик
4 - оружие метательное, это гранаты и молотовы
5 - "на кулак" - кастет
6 - нож, бутылка, Томми держит их одной рукой
7 - это бита, доска, меч, их Томми держит двумя руками

Следующие 4 байт (8-е свойство) определяют количество патронов в магазине, ставьте
сколько захотите, long.


Следующее, 9-е свойство - количество патронов в запасе, long.

10, 11, 12 - неизвестны.
13 - максимальная дальность выстрела из этого оружия, тип float(!)
14 - урон, тип float(!)
15, 16 - неизвестно
17 - отдача, тип float(!), кстати, самая большая отдача равна 0.9, так что...
18, 19 - неизвестно
20 - время между выстрелами, long
21 - неизвестно
22 - время перезарядки, long

С расшифровкой остальных свойтв вы можете ознакомиться на форуме сайта salieri-bar.narod.ru в разделе "редактирование", в теме "оружие", здесь я привел только то, что расшифровал самостоятельно, но для того, чтобы побаловаться этого достаточно.

10. Дополнительная информация.

1. Про строки.
Строки бывают двух видов:

1. C завершающим нуль-байтом

Пример:

5072 696D 6172 7920 7365 6374 6F72 00 - это hex-код строки Primary sector.

То есть всегда важен завершающий ноль! Без него, то есть просто 5072 696D 6172 7920 7365 6374 6F72 - это не строка!

2. С предварительным проверочным размером строки

Пример:

0A 384D 4F53 5435 2E42 4D50 (8MOST5.BMP)

То есть 0A = 10(в десятичной системе) - это количество символов в строке 8MOST5.BMP

Как видите, в 0A входит только размер 384D 4F53 5435 2E42 4D50.

Без этого такая строка тоже не строка. Кстати, тут завершающий ноль не нужен.
И у таких строк есть ограничение на длину - максимум 255 символов!

2. Про битовые флажки. Довольно широко используются, и для непосвященных могут стать настоящей занозой. В чем их суть: берется несколько байт в файле, в которые сохраняется информация о «включенных» и «выключенных» свойствах. Делается это так: например есть hex-код A4. В десятичном представлении это – 10100100. Что это значит? Помните, я говорил про есть сигнал-нет сигнала? По тому же принципу:

 

свойство 1 – включено (10100100);
свойство 2 – выключено (10100100);

свойство 3 – включено (10100100); и так далее

3. Маленькая информация по структуре файла vehicles.bin (автор – Akay)

4 байта, long – постоянная
4 байта, long – количество автомобилей


затем начинается характеристика первого автомобиля, ее структура следующая:

4 байта, long – размер характеристики первого автомобиля
32 байта, string – системное(!) название автомобиля
4 байта, long – количество уровней в характеритике этого автомобиля
4 байта, long – размер первого уровня характеристики

затем идет непосредственно первый уровень характеристик, после него размер второй характеристики (если есть), и сама эта характеристика, и так далее. затем начинается характеристика следующего (второго) автомобиля, она построена по тому же принципу, что и характеристика первого автомобиля. Akay создал замечательную программу RHAM 3.0, которую вы можете найти на сайте salieri-bar.narod.ru. Эта программа редактирует практически все характеристики автомобилей из игры «Мафия», в том числе двухуровневые, и позволяет создавать второй уровень характеристик. К программе прилагается подробная справка. В самой «Мафии» нет автомобилей более чем с двумя уровнями характеристик, но иногда при создании каких-либо модификаций, их необходимо бывает создать, так вот данная программа не может работать с файлом vehicles.bin, в котором есть более чем двухуровневые характеристики, тогда-то вам и понадобится
гекс.

 

4. Как изменить количество вагонов у метро и трамваев (данное свойство нашел и расшифровал Golod55).

Что нужно сделать? Все просто, открываем в гексе, естественно, файл scene2.bin из нужной Вам миссии, например, из фрирайда. Жмем кнопочку найти, и задаем следующие параметры поиска:
 

 

Затем в поле результатов поиска выбираем из списка любой найденный результат (лучше из второй< половины списка, так как там находятся дефинишны метро). Так, теперь вспомните, чему я вас учил. Количество вагонов - это что? Свойство. А с чего начинаются свойства в definitions в файле scene2.bin? Правильно, с 24AE. Желтым выделено все найденное, синим – конкретно то, во что вы выбрали в результатах поиска. Нас НЕ интересует, то в котором после слова “metro” и числа стоит “.i3d”, смотрим только то, где написано просто “metro” и какое-то число (это его номер). Так вот, после этого ищите заветный 24AE. А после него отсчитайте 10 байт. А вот 11 и есть количество ДОПОЛНИТЕЛЬНЫХ вагонов, то есть не сколько их всего, а сколько вагонов, кроме первого. То есть в том 11-ом байте у вас должно стоять 01, вот и меняете это значение, 02 – 3 вагона, 03 – четыре, ну и так далее.

Если вам не совсем понятна суть данного метода, то вы можете скачать с сайта salieri-bar.narod.ru в разделе «статьи, туториалы» небольшую статью за авторством Александра Коняшина (Don Carleone), где данный метод описывается более подробно.
 

11. Итак, ваше обучение закончено:-)

 

Конечно, вы не стали супер-гексером, но база для того, чтобы им стать, при желании, у вас есть. Гекс - это долго, и трудновато, но гораздо ин тереснее обычных редакторов. Так что тренируйтесь, в мафии еще есть файлы, которые только и ждут, чтобы пришли Вы, и расшифровали их! Надо только захотеть!.. ну и подключить мозги, конечно, если они есть. А если вы дочитали до этих строк, и все поняли, то сомневаться в этом не приходится! У ВАС ВСЕ ПОЛУЧИТСЯ!!! Конечно, у вас могут возникнуть вопросы, это естественно. Поэтому со всеми вопросами ждем (я и остальное население Сальери-бара) Вас на нашем форуме!
 

Автор: Zero
Консультанты: Enemy, Zibob 32, Golod 55, Akay
Специально для сайта salieri-bar.narod.ru
 

Скриншот недели

 

[Скриншот недели]

 

 

Статистика

Hosted by uCoz