Распаковка базы Database(lmp).res, Форматы *.?db
Здравствуйте Гость ( Вход | Регистрация )
![]() ![]() ![]() |
Распаковка базы Database(lmp).res, Форматы *.?db
CAHEK7 |
![]() ![]()
Отправлено
#1
|
Conjurer ![]() Группа: Members Сообщений: 214 Регистрация: 20-Мар-03 Из: Domodedovo Пользователь №: 619 ![]() |
Формат idb
Предисловие ![]() Разбирая очередной раздел наткнулся на такую вещь. Некоторые неиспользуемые запакованные поля(строка нулей) используются в других предметах (например в 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. За что он вобще отвечает в игре? Введение ![]() ![]() QUOTE в *.?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 QUOTE Для всех записей в файле 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, Не определен Надеюсь я описал хоть немного понятно... Сообщение отредактировал CAHEK7 - Четверг, 11 Марта 2004, 23:12 -------------------- Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)" |
sun |
![]()
Отправлено
#2
|
Advocatus Diaboli ![]() Группа: Add-on Developers Сообщений: 1,563 Регистрация: 22-Дек-01 Пользователь №: 10 ![]() |
CAHEK7
Для всех таблиц предметов, кроме материалов, ядро игры использует один общий базовый класс предметов. Структура таблиц в базах данных одиночной игры и сетевой, одинакова. В базе данных, что выложил Нивал, отсутствуют некоторые поля в таблицах, которые не используются игрой, но есть в базовых классах и в расширенных параметрах предметов, а также есть поля, которые присутствуют, но все равно не используются игрой. В распакованной базе данных для одиночной игры, что мы выложили, мы, так же как и в сетевой базе решили не включать ненужные поля. Я приветствую такую работу! Спасибо, продолжай, интересно будет почитать. Я постараюсь включить твои изыскания в нашу Энциклопедию. |
CAHEK7 |
![]()
Отправлено
#3
|
Conjurer ![]() Группа: Members Сообщений: 214 Регистрация: 20-Мар-03 Из: Domodedovo Пользователь №: 619 ![]() |
Вот пример программы, которая это всё делает.
Надеюсь тут глюков поменьше будет... Для работы необходим файл msvbvm60.dll. Если у вас не WinXP, то придется его скачать тут. Исправил глюк. Программа не показывалась в панели задач. И еще глюк с путем распаковки и с записью Material.txt(там был лишний перевод строки)... Сообщение отредактировал CAHEK7 - Воскресенье, 14 Марта 2004, 22:11 Присоединённые файлы ![]() -------------------- Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)" |
Jet |
![]()
Отправлено
#4
|
Honor Guard ![]() Группа: Add-on Developers Сообщений: 1,061 Регистрация: 23-Фев-02 Из: gipat.ru Пользователь №: 116 ![]() |
QUOTE(CAHEK7 @ 12 Марта 2004, 22:32) Вот пример программы, которая это всё делает. Надеюсь тут глюков поменьше будет... Для работы необходим файл msvbvm60.dll. Если у вас не WinXP, то придется его скачать тут. VBRUN Лучше уж качать отсюда: Microsoft -------------------- |
CAHEK7 |
![]() ![]()
Отправлено
#5
|
Conjurer ![]() Группа: Members Сообщений: 214 Регистрация: 20-Мар-03 Из: Domodedovo Пользователь №: 619 ![]() |
PRINTS.DB
QUOTE Файл имеет стандартный формат, который описан в первом сообщении темы. А теперь разбор полей: 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". Его не было в исходных текстах Вот вроде все... Разбираю дальше, а теперь вторая утилита из пакета. Распаковывает описанный выше формат ![]() Все комментарии по всем утилитам можете оставлять тут: "Распаковщик *.idb" Сообщение отредактировал CAHEK7 - Суббота, 20 Марта 2004, 23:02 Присоединённые файлы ![]() -------------------- Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)" |
Jet |
![]()
Отправлено
#6
|
Honor Guard ![]() Группа: Add-on Developers Сообщений: 1,061 Регистрация: 23-Фев-02 Из: gipat.ru Пользователь №: 116 ![]() |
-
-------------------- |
CAHEK7 |
![]()
Отправлено
#7
|
Conjurer ![]() Группа: Members Сообщений: 214 Регистрация: 20-Мар-03 Из: Domodedovo Пользователь №: 619 ![]() |
PERKS.PDB
QUOTE Файл имеет стандартный формат, который описан в первом сообщении темы. А теперь разбор полей: 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 А вот и прога: Сообщение отредактировал CAHEK7 - Суббота, 20 Марта 2004, 20:38 Присоединённые файлы ![]() -------------------- Что есть то есть, того что было не вернуть, не изменить ни дня.
Черный Обелиск "Дом желтого сна (часть 2)" |
Jet |
![]()
Отправлено
#8
|
Honor Guard ![]() Группа: Add-on Developers Сообщений: 1,061 Регистрация: 23-Фев-02 Из: gipat.ru Пользователь №: 116 ![]() |
-
-------------------- |
ALtair |
![]()
Отправлено
#9
|
Wizard ![]() Группа: Members Сообщений: 473 Регистрация: 10-Сен-02 Из: Москва, черт ее дери. Пользователь №: 554 ![]() |
В догонку распаковщики квестовой и спелловой БДей.
Если найдете глюки, скажите ![]() Присоединённые файлы ![]() -------------------- Duty is everything, the greatest of joys, the deepest of sorrows.
|
ELF |
![]()
Отправлено
#10
|
Wizard ![]() Группа: Members Сообщений: 859 Регистрация: 14-Авг-03 Из: Краснодар Пользователь №: 878 ![]() |
Я копался в форматах ?DB и нашёл некоторые моменты, которые не говорил САНЕК7. В частности это касается того, что в конце каждой БДи есть "хвостик", который у них всех одинаковый и размер строчек рассчитывать надо немного иначе.
![]() Вот ещё раз формат ?DB: CODE 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 ![]() Y - Адрес очередного блока: Если блок первый, то равен 0005 ![]() (РазмерПредБлока/2)+АдресПредБлока+РазмерЗаголокаПредБлока, РазмерЗаголовкаПредБлока=5; Z - Адрес очередной строки: Если строка первая, то равен "АдресБлока+РазмерЗаголовкаБлока", иначе: (РазмерПредСтроки/2)+АдресПредСтроки+РазмерЗаголовкаПредСтроки; T - Адрес очередного параметра: Если параметр первый, то равен "АдресСтроки+РазмерЗаголовкаСтроки", иначе: (РазмерПредПараметра/2)+АдресПредПараметра+РазмерЗаголовкаПараметра РазмерЗаголовкаПараметра=2; E - Адрес после блока файла. Равен (РазмерФайла/2)+РазмерЗаголовкаФайла, РазмерЗаголовкаФайла=5, РазмерХвостаФайла=10. И ещё один нюанс: [*] - самый каверзный параметр. Расчитывается так: Считываем аж 4 байта!!! ![]() Естесственно, как писал Санёк7, Размеры типа long надо отнимать на 1 и делить на 2, а размеры типа byte надо просто делить на 2. Хотя в обоих случаях можно просто обойтись целочисленным делением на 2. ![]() ============================= М-да, зделал DBMerger.exe и уже его 2 раза успели скачать, а за день даже никто не сказал, что он не работал! ![]() ![]() Прошу прощения, за нерабочую программу. Теперь сделал вторую версию. На этот раз точно проверил её работоспособность. Работает вроде. DBMerger2 может объединить IDB, LDB, PDB, DB, SDB, UDB - остальные ещё не проверял. С его помощью станет гораздо легче объединять MOD'ы. ![]() Параметры DBMerger2 на примере: DBMerger2.exe EI-MOD\items.idb Evil-MOD\items.idb New\items.idb -info В итоге получим объединённую БДю. Если в EI-MOD'е и Evil-MOD'е будут одинаковые вещи (а они будут), то в объединённую БДю попадут вещи из Evil-MOD'а, т.к. он написан вторым. ![]() Размер проги большой, т.к. она работает только в DEBUG конфигурации. В RELEASE конфигурации она уже работает неверно, непонятно почему. ![]() ![]() Сообщение отредактировал ELF - Суббота, 05 Июня 2004, 21:05 Присоединённые файлы ![]() |
ALtair |
![]()
Отправлено
#11
|
Wizard ![]() Группа: Members Сообщений: 473 Регистрация: 10-Сен-02 Из: Москва, черт ее дери. Пользователь №: 554 ![]() |
Выдался у меня свободный вечер, написал парсер Леверов.
![]() QUOTE(ELF) [*] - самый каверзный параметр. Расчитывается так: Считываем аж 4 байта!!! ![]() Что-то гемор какой-то. Можно намного проще. Считать один байт. Проверить, четное ли число в нем записано или нечетное. Если четное, делим на два и работаем дальше. Если нечетное, возвращаемся на байт назад и считываем уже 4 байта. вычитаем из них 1-цу и делим опять на два, работаем опять дальше. Элементарная проверка первого байта на четность намного легче предложенного тобой варианта. Кстати такой же алгоритм подходит и для всех других "длин" в файле. Т.е. должен использоваться и при подсчете размеров блоков, подблоков, строк таблицы и ячеек таблицы. Присоединённые файлы ![]() -------------------- Duty is everything, the greatest of joys, the deepest of sorrows.
|
ELF |
![]()
Отправлено
#12
|
Wizard ![]() Группа: Members Сообщений: 859 Регистрация: 14-Авг-03 Из: Краснодар Пользователь №: 878 ![]() |
QUOTE(ALtair) Что-то гемор какой-то. Можно намного проще. Считать один байт. Проверить, четное ли число в нем записано или нечетное. Да... а я об этом и не подумал. ![]() Ктстаи, ALtair, ты не думал создать что-нить общее для всех ДатаБаз и с GUIнтерфейсом? |
ALtair |
![]()
Отправлено
#13
|
Wizard ![]() Группа: Members Сообщений: 473 Регистрация: 10-Сен-02 Из: Москва, черт ее дери. Пользователь №: 554 ![]() |
Думать думал, но пока времени на него нет.. Сессия.
![]() -------------------- Duty is everything, the greatest of joys, the deepest of sorrows.
|
PZIGOR |
![]()
Отправлено
#14
|
Conjurer ![]() Группа: Members Сообщений: 159 Регистрация: 14-Апр-04 Из: курган Пользователь №: 1,734 ![]() |
Вопрос к SUNу какие форматы файлов ещё не разобраны кроме *.?db. Хотелось бы паработать над не разобранными файлами. Сейчас изучаю adb формат.!!!!!!!
-------------------- Поклонник Baldurs gate, Neverwinter Nights, Проклятые земли.
|
Jet |
![]()
Отправлено
#15
|
Honor Guard ![]() Группа: Add-on Developers Сообщений: 1,061 Регистрация: 23-Фев-02 Из: gipat.ru Пользователь №: 116 ![]() |
QUOTE(PZIGOR @ 05 Июля 2004, 10:16) Вопрос к SUNу какие форматы файлов ещё не разобраны кроме *.?db. Хотелось бы паработать над не разобранными файлами. Сейчас изучаю adb формат.!!!!!!! ADB, уже разобрали, сейчас ELF делает утилитку. -------------------- |
ELF |
![]() ![]()
Отправлено
#16
|
Wizard ![]() Группа: Members Сообщений: 859 Регистрация: 14-Авг-03 Из: Краснодар Пользователь №: 878 ![]() |
Выдалось немного времени, захотелось написать утилитку для редактирования баз данных в ПЗ.
Так как полей всех не знаю, то сделал так, чтобы можно быть по ходу работы типы и названия полей поправлять (в текстовых файлах). Ну и пока что нормально описанных полей забито мало. Тестировал немного совсем, но вроде бы что-то редактирует. ![]() В проге используются текстовые файлы (db*.txt) для описания типов полей баз данных и их названий. Также в текстовых файлах задаются описания самих баз данных (файлов) и их блоков. В данный момент ещё не все типы и названия полей забиты в текстовые файлы. Но вы можете это сделать и самостоятельно. (изучая структуру файлов баз данных и сопоставляя значения между открытыми в этом редакторе данными и исходными данными в Toolkit-текстовиках). Если кто будет поправлять описания и типы полей в текстовых файлах, то выкладивайте здесь. Чтобы другим не делать тоже самое. ![]() ![]() Вот ссылка на прогу: EIDB Editor на SourceForge Сообщение отредактировал ELF - Среда, 22 Февраля 2012, 11:44 |
Demoth |
![]()
Отправлено
#17
|
Conjurer ![]() Группа: Add-on Developers Сообщений: 180 Регистрация: 14-Мар-11 Пользователь №: 5,879 ![]() |
Хм.. Походу порядок имен полей вообще никак не связан с ниваловской txt'шной запаковывалкой, а методом тыка заполнять - одно веселье. Кстати, возможности копи-пасты при работе с базой по хорошему надо бы расширить, сейчас же даже новую запись не добавить. А вообще выглядит не плохо. Побольше бы функционала и было бы вообще потрясно. Кстати, добавь в ini'шник путь к последней датабазе.
Сообщение отредактировал Demoth - Четверг, 16 Февраля 2012, 09:35 |
Guest |
![]()
Отправлено
#18
|
Unregistered ![]() |
Угу, нужно будет добавить функционала.
![]() И да, поля там нужно описать. ![]() А как опишем, так можно и экспорт в тхтшники сделать. ![]() |
ELF |
![]()
Отправлено
#19
|
Wizard ![]() Группа: Members Сообщений: 859 Регистрация: 14-Авг-03 Из: Краснодар Пользователь №: 878 ![]() |
Обновил чуточку версию.
Немного расписал полей (для Spell Prototypes, Spell Modifiers, Items Materials и частично для Items Weapons). Сделал в settings.ini запоминание путей папок и положения окна. Выложил прогу на соурсфорж. До клипбоарда и вставки/удаления строк руки пока не дошли. ![]() Сообщение отредактировал ELF - Среда, 22 Февраля 2012, 11:47 |
ELF |
![]()
Отправлено
#20
|
Wizard ![]() Группа: Members Сообщений: 859 Регистрация: 14-Авг-03 Из: Краснодар Пользователь №: 878 ![]() |
Добавил вставку/удаление и клипборд.
|
![]() ![]() ![]() |
Упрощённая версия | Сейчас: 19 Февраля 2019 - 22:18 |