Я копался в форматах ?DB и нашёл некоторые моменты, которые не говорил САНЕК7. В частности это касается того, что в конце каждой БДи есть "хвостик", который у них всех одинаковый и размер строчек рассчитывать надо немного иначе.
Вот ещё раз формат ?DB:
Далее слово "Пред" обозначает "Предыдущий"...
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 (Хотя бы в PM написали бы).
Прошу прощения, за нерабочую программу. Теперь сделал вторую версию. На этот раз точно проверил её работоспособность. Работает вроде.
DBMerger2 может объединить IDB, LDB, PDB, DB, SDB, UDB - остальные ещё не проверял. С его помощью станет гораздо легче объединять MOD'ы. Уже смог с её помощью объединить Evil-MOD с EI-MOD'ом.
Параметры DBMerger2 на примере:
DBMerger2.exe EI-MODitems.idb Evil-MODitems.idb Newitems.idb -info
В итоге получим объединённую БДю. Если в EI-MOD'е и Evil-MOD'е будут одинаковые вещи (а они будут), то в объединённую БДю попадут вещи из Evil-MOD'а, т.к. он написан вторым. Параметры -info заставляет программу очень подробно описывать свои действия.
Размер проги большой, т.к. она работает только в DEBUG конфигурации. В RELEASE конфигурации она уже работает неверно, непонятно почему. :unsure: А никто не знает, почему такое может быть в Visual C++? (Если нет возможности ответить, то, pls, напишите в PM)
Вот ещё раз формат ?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 ;
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 (Хотя бы в PM написали бы).
Прошу прощения, за нерабочую программу. Теперь сделал вторую версию. На этот раз точно проверил её работоспособность. Работает вроде.
DBMerger2 может объединить IDB, LDB, PDB, DB, SDB, UDB - остальные ещё не проверял. С его помощью станет гораздо легче объединять MOD'ы. Уже смог с её помощью объединить Evil-MOD с EI-MOD'ом.
Параметры DBMerger2 на примере:
DBMerger2.exe EI-MODitems.idb Evil-MODitems.idb Newitems.idb -info
В итоге получим объединённую БДю. Если в EI-MOD'е и Evil-MOD'е будут одинаковые вещи (а они будут), то в объединённую БДю попадут вещи из Evil-MOD'а, т.к. он написан вторым. Параметры -info заставляет программу очень подробно описывать свои действия.
Размер проги большой, т.к. она работает только в DEBUG конфигурации. В RELEASE конфигурации она уже работает неверно, непонятно почему. :unsure: А никто не знает, почему такое может быть в Visual C++? (Если нет возможности ответить, то, pls, напишите в PM)