![]() |
Распаковка базы Database(lmp).res - Версия для печати +- Город Джунов (https://www.gipat.ru/forum) +-- Форум Аддон для Проклятых Земель (https://www.gipat.ru/forum/forum-20.html) +--- Форум Программирование (https://www.gipat.ru/forum/forum-6.html) +--- Темы: Распаковка базы Database(lmp).res (/thread-1870.html) |
Распаковка базы Database(lmp).res - CAHEK7 - 11.03.2004 Формат 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. За что он вобще отвечает в игре? Введение ![]() ![]() Цитата:в *.?db всё имеет схожий формат ITEMS.IDB Цитата:Для всех записей в файлеНадеюсь я описал хоть немного понятно... Распаковка базы Database(lmp).res - sun - 12.03.2004 CAHEK7 Для всех таблиц предметов, кроме материалов, ядро игры использует один общий базовый класс предметов. Структура таблиц в базах данных одиночной игры и сетевой, одинакова. В базе данных, что выложил Нивал, отсутствуют некоторые поля в таблицах, которые не используются игрой, но есть в базовых классах и в расширенных параметрах предметов, а также есть поля, которые присутствуют, но все равно не используются игрой. В распакованной базе данных для одиночной игры, что мы выложили, мы, так же как и в сетевой базе решили не включать ненужные поля. Я приветствую такую работу! Спасибо, продолжай, интересно будет почитать. Я постараюсь включить твои изыскания в нашу Энциклопедию. Распаковка базы Database(lmp).res - CAHEK7 - 12.03.2004 Вот пример программы, которая это всё делает. Надеюсь тут глюков поменьше будет... Для работы необходим файл msvbvm60.dll. Если у вас не WinXP, то придется его скачать тут. Исправил глюк. Программа не показывалась в панели задач. И еще глюк с путем распаковки и с записью Material.txt(там был лишний перевод строки)... Распаковка базы Database(lmp).res - Jet - 13.03.2004 CAHEK7,12 Марта 2004, 22:32 Написал:Вот пример программы, которая это всё делает.VBRUN Лучше уж качать отсюда: Microsoft Распаковка базы Database(lmp).res - CAHEK7 - 16.03.2004 PRINTS.DB Цитата:Файл имеет стандартный формат, который описан в первом сообщении темы. Также у меня почемуто запаковывался пустой элемент, у которого нет названия и все параметры = "0". Его не было в исходных текстах Вот вроде все... Разбираю дальше, а теперь вторая утилита из пакета. Распаковывает описанный выше формат ![]() Все комментарии по всем утилитам можете оставлять тут: "Распаковщик *.idb" Распаковка базы Database(lmp).res - Jet - 20.03.2004 - Распаковка базы Database(lmp).res - CAHEK7 - 20.03.2004 PERKS.PDB Цитата:Файл имеет стандартный формат, который описан в первом сообщении темы.А вот и прога: Распаковка базы Database(lmp).res - Jet - 28.03.2004 - Распаковка базы Database(lmp).res - ALtair - 10.05.2004 В догонку распаковщики квестовой и спелловой БДей. Если найдете глюки, скажите ![]() Распаковка базы Database(lmp).res - ELF - 31.05.2004 Я копался в форматах ?DB и нашёл некоторые моменты, которые не говорил САНЕК7. В частности это касается того, что в конце каждой БДи есть "хвостик", который у них всех одинаковый и размер строчек рассчитывать надо немного иначе. ![]() Вот ещё раз формат ?DB: Код: X+0000 - ID файла [1Байт]; X - Адрес начала файла: Всегда равен 0000 ![]() Y - Адрес очередного блока: Если блок первый, то равен 0005 ![]() (РазмерПредБлока/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. ![]() ============================= М-да, зделал DBMerger.exe и уже его 2 раза успели скачать, а за день даже никто не сказал, что он не работал! :o ![]() Прошу прощения, за нерабочую программу. Теперь сделал вторую версию. На этот раз точно проверил её работоспособность. Работает вроде. DBMerger2 может объединить IDB, LDB, PDB, DB, SDB, UDB - остальные ещё не проверял. С его помощью станет гораздо легче объединять MOD'ы. ![]() Параметры DBMerger2 на примере: DBMerger2.exe EI-MODitems.idb Evil-MODitems.idb Newitems.idb -info В итоге получим объединённую БДю. Если в EI-MOD'е и Evil-MOD'е будут одинаковые вещи (а они будут), то в объединённую БДю попадут вещи из Evil-MOD'а, т.к. он написан вторым. ![]() Размер проги большой, т.к. она работает только в DEBUG конфигурации. В RELEASE конфигурации она уже работает неверно, непонятно почему. :unsure: А никто не знает, почему такое может быть в Visual C++? ![]() Распаковка базы Database(lmp).res - ALtair - 09.06.2004 Выдался у меня свободный вечер, написал парсер Леверов. ![]() ELF Написал:[*] - самый каверзный параметр. Расчитывается так:Что-то гемор какой-то. Можно намного проще. Считать один байт. Проверить, четное ли число в нем записано или нечетное. Если четное, делим на два и работаем дальше. Если нечетное, возвращаемся на байт назад и считываем уже 4 байта. вычитаем из них 1-цу и делим опять на два, работаем опять дальше. Элементарная проверка первого байта на четность намного легче предложенного тобой варианта. Кстати такой же алгоритм подходит и для всех других "длин" в файле. Т.е. должен использоваться и при подсчете размеров блоков, подблоков, строк таблицы и ячеек таблицы. Распаковка базы Database(lmp).res - ELF - 09.06.2004 ALtair Написал:Что-то гемор какой-то. Можно намного проще. Считать один байт. Проверить, четное ли число в нем записано или нечетное.Да... а я об этом и не подумал. ![]() Ктстаи, ALtair, ты не думал создать что-нить общее для всех ДатаБаз и с GUIнтерфейсом? Распаковка базы Database(lmp).res - ALtair - 09.06.2004 Думать думал, но пока времени на него нет.. Сессия. :unsure: Распаковка базы Database(lmp).res - PZIGOR - 05.07.2004 Вопрос к SUNу какие форматы файлов ещё не разобраны кроме *.?db. Хотелось бы паработать над не разобранными файлами. Сейчас изучаю adb формат.!!!!!!! Распаковка базы Database(lmp).res - Jet - 07.07.2004 PZIGOR,05 Июля 2004, 10:16 Написал:Вопрос к SUNу какие форматы файлов ещё не разобраны кроме *.?db. Хотелось бы паработать над не разобранными файлами. Сейчас изучаю adb формат.!!!!!!!ADB, уже разобрали, сейчас ELF делает утилитку. Распаковка базы Database(lmp).res - ELF - 16.02.2012 Выдалось немного времени, захотелось написать утилитку для редактирования баз данных в ПЗ. Так как полей всех не знаю, то сделал так, чтобы можно быть по ходу работы типы и названия полей поправлять (в текстовых файлах). Ну и пока что нормально описанных полей забито мало. Тестировал немного совсем, но вроде бы что-то редактирует. ![]() В проге используются текстовые файлы (db*.txt) для описания типов полей баз данных и их названий. Также в текстовых файлах задаются описания самих баз данных (файлов) и их блоков. В данный момент ещё не все типы и названия полей забиты в текстовые файлы. Но вы можете это сделать и самостоятельно. (изучая структуру файлов баз данных и сопоставляя значения между открытыми в этом редакторе данными и исходными данными в Toolkit-текстовиках). Если кто будет поправлять описания и типы полей в текстовых файлах, то выкладивайте здесь. Чтобы другим не делать тоже самое. ![]() ![]() Вот ссылка на прогу: EIDB Editor на SourceForge Распаковка базы Database(lmp).res - Demoth - 16.02.2012 Хм.. Походу порядок имен полей вообще никак не связан с ниваловской txt'шной запаковывалкой, а методом тыка заполнять - одно веселье. Кстати, возможности копи-пасты при работе с базой по хорошему надо бы расширить, сейчас же даже новую запись не добавить. А вообще выглядит не плохо. Побольше бы функционала и было бы вообще потрясно. Кстати, добавь в ini'шник путь к последней датабазе. Распаковка базы Database(lmp).res - Guest - 16.02.2012 Угу, нужно будет добавить функционала. ![]() И да, поля там нужно описать. ![]() А как опишем, так можно и экспорт в тхтшники сделать. ![]() Распаковка базы Database(lmp).res - ELF - 22.02.2012 Обновил чуточку версию. Немного расписал полей (для Spell Prototypes, Spell Modifiers, Items Materials и частично для Items Weapons). Сделал в settings.ini запоминание путей папок и положения окна. Выложил прогу на соурсфорж. До клипбоарда и вставки/удаления строк руки пока не дошли. ![]() Распаковка базы Database(lmp).res - ELF - 07.03.2012 Добавил вставку/удаление и клипборд. |