Распаковка базы 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)"
Ответ


Сообщения в этой теме
Распаковка базы Database(lmp).res - от CAHEK7 - 11.03.2004, 23:56
Распаковка базы Database(lmp).res - от Guest - 16.02.2012, 14:39
Распаковка базы Database(lmp).res - от Guest - 07.03.2012, 18:50
Распаковка базы Database(lmp).res - от Guest - 16.03.2012, 19:02

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


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