Распаковка базы Database(lmp).res
#1
Формат idb

Предисловие Smile
Разбирая очередной раздел наткнулся на такую вещь. Некоторые неиспользуемые запакованные поля(строка нулей) используются в других предметах (например в Armors поле 0х19 пустое, а в QuickItems закл прописан). Вот я и думаю что ниваловцы выложили не полную базу (некоторые поля вообще не прописали в TXT). Возможно они их просто и не использовали.
Я вот что думаю, что некоторые странные поля могут быть параметрами не прописанными в их исходных текстовиках, но работающие (как тоже поле 0х19, я думаю что в некоторых разделах там должно быть заклинание. или поле 0х02 возможно это код предмета, т.к. в Material он используется явно, а в остальных принимает какие-то странные значения)
Посмотрев сингловские исходники я заметил ту же проблему с Unknow. Возможно это часть параметров не объявленных в релизе DataBaselmp, которые выложили ниваловцы.
Так же я нашел одно поле в Armors (Stats Modifiers)которое 0x1A. (похожее поле есть в Weapons 0х1С, но это только догадки) Оно длинной в 8 байт и 7 из них не используются, а один отвечает за stealth. И запаковывается оно сюдя по всему по ключевому слову(в данном случае stealth), поэтому я думаю что там еще есть 7 необъявленных параметров...
Что это запараметр Crippled. За что он вобще отвечает в игре?

Введение Smile Smile
Цитата:в *.?db всё имеет схожий формат
{
byte: идентификатор или просто значение-разделитель  -  не используется
long: размер всего файла
byte: идентификатор или просто значение-разделитель  -  не используется
Далее идут блоки. Каждый блок состоит из
   long: размер блока. Блок - текстовый запакованный файл(Materials, Weapons, Armors).
   И записей (строк в текстовом файле). Которые имеют такую структуру
      byte: идентификатор или просто значение-разделитель  -  не используется
      short или long: размер записи  -  чтоб получит реальный размер надо сделать так: если short размер = short / 2, если long то размер = (long-1) / 2 ; Сначала надо читать 2 байта и если там будет значение больше 255 то значит там long
         Далее параметры в записи идут так-  byte: ID параметра, byte: размер параметра, long(float, string) параметр.
}

Комментарии:     
Все реальные размеры следует получать делением значения размера на 2


Описывать параметры я буду так: ID, тип, комментарий.

Использовал типы:
{
Long- целые 4 байта со знаком

Float- число с плавающей точкой

Array- идет подрят несколько значений Float, после ID поля указан размер всей записи. Количество параметров Float получаем делением размера на 4. 

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

String- Строка, заканчивающаяся двоичным нулем
}

ITEMS.IDB
Цитата:Для всех записей в файле
0x00 String, имя

Это для материалов
0x01 String, тип предмета
0x02 String, Code Name
0x03 Long иди Float, Не определен
0x04 Float, Price
0x05 Float, Weight
0x06 Float, Mana
0x07 Long, Slots
0x08 Float, Durability
0x09 Long, Skill
0x0A Float, Damage
0x0B Array, Absorbition
0x0C Float или Long, Не определен
0x0D Byte, Shop - это запакованный параметр. Там доступность в магазинах определяется положением битов.

Это общее для всех предметов (не материалов)
0x01 String, тип предмета
0x02 Float, кодовое имя или кодовый тип предмета
0x03 String, материал
0x04 Long или Float, возможно Figure Names
0x05 Long, Texture Type Index
0x06 Long,  Texture Type Index 2
0x07 Float, Price
0x08 Float, Weight
0x09 Float, Size
0x0A Float, Mana
0x0B Long, Slots
0x0C Float, Durability
0x0D Long, Components
0x0E Byte, Shop - это запакованный параметр. Там доступность в магазинах определяется положением битов.
0x0F Byte, Deconstructable

Из вышесказанного следует, что в некоторых предметах в исходных текстах не указаны все эти поля, но они реально существуют у всех предметов, хоть квестовые, хоть жезлы, хоть трофеи.

затем идут параметры индивидульные для разных типов предметов ID начинатеся с 0x15 и могут ити хоть до 0x1F и далее (зависит от количества индивидуальных полей)

Специальные поля для Weapons
0x15 Long, Actions
0x16 8 байт чего-то, возможно характеристик как в Armors 0x1A
0x17 Float, Range
0x18 Float, DamageMin для получения необходимо умножить на 10
0x19 Float, Additional Damage  этого параметра я не видел но для получения DamageMax надо сложить DamageMin и этот параметр (тоже умножается на 10)
0x1A Array, DamageProportions
0x1B String, Возможно Spells
0x1С 8 байт, см 0х16
0x1D Float, Attack
0x1E Float, Defence эти два параметра распаковываются в один StatsModifers

Специальные поля для Armors
0x15 Array, Main (Absorbitions)
0x16 Array, Additional (Absorbitions)
0x17 Long, ApplyWounds
0x18 Long, Wear Order
0x19 String, Возможно Spells
0x1A 8 байт, Stats Modifers. Каждый байт отвечает за один параметр (8-й за Stealth)

Специальные поля для QuickItems
0x15 Long, Не определен
0x16 Long, Skilll
0x17 Float, Damage
0x18 Long, DamageType (0-piercing, 1-slashing, 2-bludgeoning, 3-termal, 4-chemic, 5-electric, 6-general)
0x19 String, Spells
0x1A String, Не определен
0x1B 8 байт чего-то, возможно характеристик как в Armors 0x1A

Специальные поля для QuestItems
0x15 Long, ScriptID
0x16 String, Zones. Там разделитель 0x01 вместо запятой в исходниках.

Специальные поля для LootItems
0x15 Long, Не определен
0x16 Long, Не определен
0x17 Long, Не определен
Надеюсь я описал хоть немного понятно...
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ
#2
CAHEK7
Для всех таблиц предметов, кроме материалов, ядро игры использует один общий базовый класс предметов.
Структура таблиц в базах данных одиночной игры и сетевой, одинакова. В базе данных, что выложил Нивал, отсутствуют некоторые поля в таблицах, которые не используются игрой, но есть в базовых классах и в расширенных параметрах предметов, а также есть поля, которые присутствуют, но все равно не используются игрой. В распакованной базе данных для одиночной игры, что мы выложили, мы, так же как и в сетевой базе решили не включать ненужные поля.

Я приветствую такую работу! Спасибо, продолжай, интересно будет почитать. Я постараюсь включить твои изыскания в нашу Энциклопедию.
Ответ
#3
Вот пример программы, которая это всё делает.
Надеюсь тут глюков поменьше будет...
Для работы необходим файл msvbvm60.dll. Если у вас не WinXP, то придется его скачать тут.
Исправил глюк. Программа не показывалась в панели задач.
И еще глюк с путем распаковки и с записью Material.txt(там был лишний перевод строки)...


Файлы вложений
.rar   IdbUnpacker.rar (Размер: 24 KB / Загрузок: 897)
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ
#4
CAHEK7,12 Марта 2004, 22:32 Написал:Вот пример программы, которая это всё делает.
Надеюсь тут глюков поменьше будет...
Для работы необходим файл msvbvm60.dll. Если у вас не WinXP, то придется его скачать тут.
VBRUN Лучше уж качать отсюда: Microsoft
Ответ
#5
PRINTS.DB
Цитата:Файл имеет стандартный формат, который описан в первом сообщении темы.
А теперь разбор полей:
ID 0x01 String, TerrainType

Далее идут массивы параметров они имеют следующую структуру:

ID : Byte идентификатор массива параметров
Size : Byte размер массива параметров

     ID : Byte идентификатор параметра 1
     Size : Byte размер параметра 1
     Parametr : Long (Float, String) значение параметра 1

     ID : Byte идентификатор параметра 2
     Size : Byte размер параметра 2
     Parametr : Long (Float, String) значение параметра 2

     ID : Byte идентификатор параметра 3
     Size : Byte размер параметра 3
     Parametr : Long (Float, String) значение параметра 3
  ......................................................................................
     ID : Byte идентификатор параметра n
     Size : Byte размер параметра n
     Parametr : Long (Float, String) значение параметра n


Вот эти параметры:

ID 0x02 - Массив параметров Clear Weather
         0x01 Float, Opacity (*100)
         0x02 Long, Lifetime (15)
         0x03 Long, Fadeout (15)

ID 0x03 - Массив параметров Weather Precipitation
         0x01 Float, Opacity (*100)
         0x02 Long, Lifetime (15)
         0x03 Long, Fadeout (15)

Этот параметр только для FootPrints:

ID 0x0A - Массив параметров Bloody
         0x01 Float, Opacity (*100)
         0x02 Long, Lifetime (15)
         0x03 Long, Fadeout (15)
Я еще заметил ошибку связанную с ним. У меня он неверно запаковывался, там все параметры были 60.

Также у меня почемуто запаковывался пустой элемент, у которого нет названия и все параметры = "0". Его не было в исходных текстах

Вот вроде все... Разбираю дальше, а теперь вторая утилита из пакета. Распаковывает описанный выше формат Smile
Все комментарии по всем утилитам можете оставлять тут: "Распаковщик *.idb"


Файлы вложений
.rar   dbUnpacker.rar (Размер: 17.68 KB / Загрузок: 712)
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ
#6
-
Ответ
#7
PERKS.PDB
Цитата:Файл имеет стандартный формат, который описан в первом сообщении темы.
А теперь разбор полей:

Perks

ID 0x00 String, Name
ID 0x01 String, Code
ID 0x02 Long, Texture Type Index
ID 0x0A String, Perk
ID 0x0B String, Skill
ID 0x0C Не определен
ID 0x0D Не определен
ID 0x0E Long, SL
ID 0x0F Float, Str
ID 0x10 Float, Dex
ID 0x11 Float, Int
ID 0x12 Long, Cost
ID 0x13 Long, Modifier
ID 0x14 Long, Mult
ID 0x15 Long, Add
ID 0x16 Не определен
ID 0x17 Long, Perk Exclusive


Skills
ID 0x00 String, Name
ID 0x01 String, Code
ID 0x02 Long, Texture Type Index

ID 0x0A Массив параметров(описан в пердыдущем сообщении) Base Attributes
       ID 0x01 String
А вот и прога:


Файлы вложений
.rar   pdbUnpacker.rar (Размер: 18.13 KB / Загрузок: 682)
Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)"
Ответ
#8
-
Ответ
#9
В догонку распаковщики квестовой и спелловой БДей.

Если найдете глюки, скажите Wink


Файлы вложений
.rar   qs_parsers.rar (Размер: 45.54 KB / Загрузок: 715)
Duty is everything, the greatest of joys, the deepest of sorrows.
Ответ
#10
Я копался в форматах ?DB и нашёл некоторые моменты, которые не говорил САНЕК7. В частности это касается того, что в конце каждой БДи есть "хвостик", который у них всех одинаковый и размер строчек рассчитывать надо немного иначе. Smile

Вот ещё раз формат ?DB:
Код:
X+0000 - ID файла [1Байт];
X+0001 - Размер файла [4Байта];
 Y+0000 - ID-номерок блока [1Байт];
 Y+0001 - Размер блока [4Байта];
   Z+0000 - ID строки [1Байт];
   Z+0001 - Размер строки [*];
     T+0000 - ID-номерок параметра [1Байт];
     T+0001 - Размер параметра [1Байт];
     T+0002 - Сам параметр;
...
E+0000 - 00,00,02,0C,02,08,01,00,00,00.
Далее слово "Пред" обозначает "Предыдущий"...

X - Адрес начала файла:
Всегда равен 0000 Smile ;

Y - Адрес очередного блока:
Если блок первый, то равен 0005 Smile , а если не первый, то вычислается так:
(РазмерПредБлока/2)+АдресПредБлока+РазмерЗаголокаПредБлока,
РазмерЗаголовкаПредБлока=5;

Z - Адрес очередной строки:
Если строка первая, то равен "АдресБлока+РазмерЗаголовкаБлока", иначе:
(РазмерПредСтроки/2)+АдресПредСтроки+РазмерЗаголовкаПредСтроки;

T - Адрес очередного параметра:
Если параметр первый, то равен "АдресСтроки+РазмерЗаголовкаСтроки", иначе:
(РазмерПредПараметра/2)+АдресПредПараметра+РазмерЗаголовкаПараметра
РазмерЗаголовкаПараметра=2;

E - Адрес после блока файла.
Равен (РазмерФайла/2)+РазмерЗаголовкаФайла,
РазмерЗаголовкаФайла=5, РазмерХвостаФайла=10.

И ещё один нюанс:
[*] - самый каверзный параметр. Расчитывается так:
Считываем аж 4 байта!!! :o Если второй байт больше 0, третий байт не равен 2, а четвёртый байт равен 0, то размер длины строки long, иначе размер длины строки byte.

Естесственно, как писал Санёк7, Размеры типа long надо отнимать на 1 и делить на 2, а размеры типа byte надо просто делить на 2. Хотя в обоих случаях можно просто обойтись целочисленным делением на 2. Wink

=============================
М-да, зделал DBMerger.exe и уже его 2 раза успели скачать, а за день даже никто не сказал, что он не работал! :o Blush (Хотя бы в PM написали бы).
Прошу прощения, за нерабочую программу. Теперь сделал вторую версию. На этот раз точно проверил её работоспособность. Работает вроде.

DBMerger2 может объединить IDB, LDB, PDB, DB, SDB, UDB - остальные ещё не проверял. С его помощью станет гораздо легче объединять MOD'ы. Wink Уже смог с её помощью объединить Evil-MOD с EI-MOD'ом.

Параметры DBMerger2 на примере:
DBMerger2.exe EI-MODitems.idb Evil-MODitems.idb Newitems.idb -info
В итоге получим объединённую БДю. Если в EI-MOD'е и Evil-MOD'е будут одинаковые вещи (а они будут), то в объединённую БДю попадут вещи из Evil-MOD'а, т.к. он написан вторым. Smile Параметры -info заставляет программу очень подробно описывать свои действия.

Размер проги большой, т.к. она работает только в DEBUG конфигурации. В RELEASE конфигурации она уже работает неверно, непонятно почему. :unsure: А никто не знает, почему такое может быть в Visual C++? Huh (Если нет возможности ответить, то, pls, напишите в PM)


Файлы вложений
.zip   DBmerger2.zip (Размер: 31.63 KB / Загрузок: 645)
Ответ
#11
Выдался у меня свободный вечер, написал парсер Леверов. Smile Ловите прилепленный файл.

ELF Написал:[*] - самый каверзный параметр. Расчитывается так:
Считываем аж 4 байта!!!  :o  Если второй байт больше 0, третий байт не равен 2, а четвёртый байт равен 0, то размер длины строки long, иначе размер длины строки byte.
Что-то гемор какой-то. Можно намного проще. Считать один байт. Проверить, четное ли число в нем записано или нечетное. Если четное, делим на два и работаем дальше. Если нечетное, возвращаемся на байт назад и считываем уже 4 байта. вычитаем из них 1-цу и делим опять на два, работаем опять дальше.
Элементарная проверка первого байта на четность намного легче предложенного тобой варианта.
Кстати такой же алгоритм подходит и для всех других "длин" в файле. Т.е. должен использоваться и при подсчете размеров блоков, подблоков, строк таблицы и ячеек таблицы.


Файлы вложений
.rar   lparser.rar (Размер: 22.39 KB / Загрузок: 615)
Duty is everything, the greatest of joys, the deepest of sorrows.
Ответ
#12
ALtair Написал:Что-то гемор какой-то. Можно намного проще. Считать один байт. Проверить, четное ли число в нем записано или нечетное.
Да... а я об этом и не подумал. Blush
Ктстаи, ALtair, ты не думал создать что-нить общее для всех ДатаБаз и с GUIнтерфейсом?
Ответ
#13
Думать думал, но пока времени на него нет.. Сессия. :unsure:
Duty is everything, the greatest of joys, the deepest of sorrows.
Ответ
#14
Вопрос к SUNу какие форматы файлов ещё не разобраны кроме *.?db. Хотелось бы паработать над не разобранными файлами. Сейчас изучаю adb формат.!!!!!!!
Поклонник Baldurs gate, Neverwinter Nights, Проклятые земли.
Ответ
#15
PZIGOR,05 Июля 2004, 10:16 Написал:Вопрос к SUNу какие форматы файлов ещё не разобраны кроме *.?db. Хотелось бы паработать над не разобранными файлами. Сейчас изучаю adb формат.!!!!!!!
ADB, уже разобрали, сейчас ELF делает утилитку.
Ответ
#16
Выдалось немного времени, захотелось написать утилитку для редактирования баз данных в ПЗ.
Так как полей всех не знаю, то сделал так, чтобы можно быть по ходу работы типы и названия полей поправлять (в текстовых файлах).
Ну и пока что нормально описанных полей забито мало.

Тестировал немного совсем, но вроде бы что-то редактирует. Smile

В проге используются текстовые файлы (db*.txt) для описания типов полей баз данных и их названий. Также в текстовых файлах задаются описания самих баз данных (файлов) и их блоков.

В данный момент ещё не все типы и названия полей забиты в текстовые файлы. Но вы можете это сделать и самостоятельно. (изучая структуру файлов баз данных и сопоставляя значения между открытыми в этом редакторе данными и исходными данными в Toolkit-текстовиках).

Если кто будет поправлять описания и типы полей в текстовых файлах, то выкладивайте здесь. Чтобы другим не делать тоже самое. Smile Также я буду это делать сам, но только когда будет время. Smile Так что вы можете успеть вперёд.

Вот ссылка на прогу:
EIDB Editor на SourceForge
Ответ
#17
Хм.. Походу порядок имен полей вообще никак не связан с ниваловской txt'шной запаковывалкой, а методом тыка заполнять - одно веселье. Кстати, возможности копи-пасты при работе с базой по хорошему надо бы расширить, сейчас же даже новую запись не добавить. А вообще выглядит не плохо. Побольше бы функционала и было бы вообще потрясно. Кстати, добавь в ini'шник путь к последней датабазе.
Ответ
#18
Угу, нужно будет добавить функционала. Smile
И да, поля там нужно описать. Smile Это как раз повеселиться чтобы =))
А как опишем, так можно и экспорт в тхтшники сделать. Smile
Ответ
#19
Обновил чуточку версию.
Немного расписал полей (для Spell Prototypes, Spell Modifiers, Items Materials и частично для Items Weapons).
Сделал в settings.ini запоминание путей папок и положения окна.
Выложил прогу на соурсфорж.

До клипбоарда и вставки/удаления строк руки пока не дошли. Smile
Ответ
#20
Добавил вставку/удаление и клипборд.
Ответ


Перейти к форуму:


Пользователи, просматривающие эту тему: 5 Гость(ей)