IPB

Здравствуйте Гость ( Вход | Регистрация )

Reply to this topicStart new topicStart Poll

Каскадный · [ Стандартный ] · Линейный

> Распаковка базы Database(lmp).res, Форматы *.?db

Robin
post Среда, 21 Марта 2012, 12:40
Отправлено #41


Knight
Group Icon

Группа: Members
Сообщений: 130
Регистрация: 20-Фев-02
Из: Харьков
Пользователь №: 104



res

Присоединённые файлы
Присоединённый файл  res.zip ( 2.25кб ) Кол-во скачиваний: 156
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ELF
post Среда, 21 Марта 2012, 18:55
Отправлено #42


Wizard
Group Icon

Группа: Members
Сообщений: 859
Регистрация: 14-Авг-03
Из: Краснодар
Пользователь №: 878



Robin, спасибо большое! smile.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ELF
post Среда, 04 Апреля 2012, 01:43
Отправлено #43


Wizard
Group Icon

Группа: Members
Сообщений: 859
Регистрация: 14-Авг-03
Из: Краснодар
Пользователь №: 878



Обновил версию проги. smile.gif

* Сделал прямую запись в RES
* Сделал прямую запись в XLSX
* Соответственно сделал возможным вызывать прогу с параметрами командной строки smile.gif

* Сделал одну кнопку для загрузки всех форматов (RES/XLSX/*db)

* Теперь когда прога сохраняет в RES, она оставляет оригинальные неподдерживаемые файлы (например пока что adb) из оригинального RES. А если оригинального RES не было (т.е. например работали изначально с XLSX), то сохраняются оригинальные неподдерживаемые файлы конечного RES файла (если он уже был).

* Добавил функцию последних 5-ти загрузок smile.gif
* Дописал названия полей
* Написал readme.txt о том, что может быть непонятно smile.gif

С командной строкой работать так:
dbeditor.exe path\to\filename.res <- сделает path\to\filename.xlsx
dbeditor.exe path\to\filename.xlsx <- сделает path\to\filename.res

Так как прога не консольная, то нужно учитывать, что она сразу же после вызова возвращает управление, не дожидаясь своего завершения. Если нужно дождаться завершения работы проги в консоле, тогда нужно, например, вызывать так:
start /wait dbeditor.exe path\to\filename.res

Соответственно получается ещё один сценарий работы с прогой:
* Бросаем res файл на прогу и получаем рядом с ним xlsx
* Бросаем xlsx файл на прогу и получаем рядом с ним res

Сообщение отредактировал ELF - Среда, 04 Апреля 2012, 01:48
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Alecron
post Среда, 04 Апреля 2012, 14:34
Отправлено #44


Wizard
Group Icon

Группа: Members
Сообщений: 452
Регистрация: 4-Мая-03
Из: г.Ростов-на-Дону
Пользователь №: 645



Молодец! Отличная прога!!! Так держать!
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ELF
post Среда, 04 Апреля 2012, 16:05
Отправлено #45


Wizard
Group Icon

Группа: Members
Сообщений: 859
Регистрация: 14-Авг-03
Из: Краснодар
Пользователь №: 878



Си-иба smile.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Demoth
post Пятница, 13 Апреля 2012, 10:11
Отправлено #46


Conjurer
Group Icon

Группа: Add-on Developers
Сообщений: 193
Регистрация: 14-Мар-11
Пользователь №: 5,879



ELF, в последней версии EIDB Editor'а довольно странный и противный баг с SignedLong полями. А именно при редактировании или импортировании из xlsx он прибавляет к отрицательным числам 1. В итоге хочешь к примеру записать -1 а он выдает 0, хочешь записать -2 а на деле -1. ><

Сообщение отредактировал Demoth - Пятница, 13 Апреля 2012, 10:16
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ELF
post Пятница, 13 Апреля 2012, 15:19
Отправлено #47


Wizard
Group Icon

Группа: Members
Сообщений: 859
Регистрация: 14-Авг-03
Из: Краснодар
Пользователь №: 878



Гы) вот так баг smile.gif попробуем разобраться на досуге =)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
KnightL
post Пятница, 13 Апреля 2012, 22:56
Отправлено #48


Conjurer
Group Icon

Группа: Members
Сообщений: 204
Регистрация: 5-Июн-04
Пользователь №: 2,079



Забавная программа smile.gif я даже попытался почитать исходный код...) Правда что-то там всего много. Неужели в Qt нету встроенных таблиц? Кстати я удивлён, увидев, что pragma влияет на g++. Если верить тому, что я читал раньше, он должен был бы их игнорить. (я не говорю что я собирал твою программу под Linux. Никогда не собирал ничего под Qt. Под GTK+ да, под XLib да, под Qt - никогда smile.gif ) В коде кстати есть довольно странное условие, не знаю, так и надо или нет... if( offset < 0 || size < 0 )... бессмысленный код smile.gif вроде if(false). Ведь offset и size по типу quint32, беззнаковые. (строки 79-81 файла qresreader.cpp ). И перевод из чисел в адрес клетки и из клетки в адрес можно было бы написать проще, за один проход и без дополнительных переменных.
Кстати, а где вообще нужны signed long? я посмотрел таблицы, там не было чисел больше 2^31-1.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Demoth
post Пятница, 13 Апреля 2012, 23:10
Отправлено #49


Conjurer
Group Icon

Группа: Add-on Developers
Сообщений: 193
Регистрация: 14-Мар-11
Пользователь №: 5,879



Невнимательно смотрел значит. smile.gif К примеру (первое что пришло в голову) это номер волос - значение от -1 до 1(или двух, не помнюsmile.gif)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
ELF
post Пятница, 13 Апреля 2012, 23:52
Отправлено #50


Wizard
Group Icon

Группа: Members
Сообщений: 859
Регистрация: 14-Авг-03
Из: Краснодар
Пользователь №: 878



Поправил баг с отрицательными значениями.
Проблема была в том, что это я так округлял значения... по-эльфийски. Сделал по-человечески (возможно). smile.gif


KnightL, сиба большое за отзыв. smile.gif

QUOTE(KnightL @ Пятница, 13 Апреля 2012, 22:56)
я даже попытался почитать исходный код...) Правда что-то там всего много.
*
Код действительно написан довольно грязно. smile.gif Где-то по-началу ещё было стремление, чтобы всё было аккуратно и красиво, но потом захотелось побыстрее, да и изучение форматов *db постепенно подбрасывало такие сюрпризы, которые изначальную концепцию чтения данных ставили с ног на голову ( или с головы на ноги, если смотреть относительно хода мыслей разработчиков игры smile.gif ). Поэтому я решил сначала добиться полного чтения db-файлов, а потом уже отдельно посмотреть на это с позиции "когда уже всё известно".

Сейчас я пришёл к выводу, что вообще *db-файлы лучше считывать по принципу загрузки XML (родитель->дочерние элементы->братья родителя...). Это бы, думаю, упростило бы структуру считывателя с точки зрения восприятия кода. Соответственно настройку разбора формата (текстовые файлы) нужно было бы делать иначе (или теперь вообще уже не делать, так как все структуры уже довольно ясно выреверсированы). Но пока что всё осталось вот так, в виде спагетти внутри методов. smile.gif

А вообще я сейчас в промежутках между жизнью делаю сферический в вакууме класс для работы с большими Res-архивами... smile.gif Как сделаю - выложу. Может быть кому пригодится.

Потом думаю сделать такой же сферический для *db-файлов... но пока что не знаю, как этот класс функционально оформить... в играх, как я понял, такие вещи оформляют в виде "системы работы с ресурсами" - некий класс фабрика объектов, который когда нужно грузит ресурсы и даёт нам доступ к ним в виде различных игровых объектов (или ссылок на них)...
Вообще у кого есть опыт в разработке игр, было бы неплохо узнать мнение, как лучше грузить такие *db в гипотетическую игру. smile.gif

QUOTE(KnightL @ Пятница, 13 Апреля 2012, 22:56)
Неужели в Qt нету встроенных таблиц?
*
А вот хороший вопрос... =)
Как понял, разработчики библиотеки желают сразу же приобщить пользователя библиотеки к парадигме: модель->представление. Т.е. создаётся модель в виде таблицы, которая подключается к представлению в виде таблицы.
В самом общем (сферическом) случае модель в Qt позволяет создать, так скажем, табличную иерархию таблиц (где ячейка таблицы может адресовать вложенную таблицу). Соответственно, частными случаями этой мега-модели являются список, таблица и просто дерево.
В принципе "создать таблицу в Qt" -- это создать табличную модель. Хотя интерфейс управления такой таблицей мне не пришёлся по вкусу, так как он слишком универсален и неудобен для плотной работы с таблицей. Поэтому я сделал враппер (класс-обёртку) с более дружественным интерфейсом для работы с таблицами.

С одной стороны, плюсом подхода модель-представление является гибкость: не обязательно держать в памяти данные таблицы как есть, можно некоторые из них вычислять и применять динамически. Что порой очень удобно и эффективно. Но, с другой стороны, в простых случаях такой подход довольно громоздкий.

QUOTE(KnightL @ Пятница, 13 Апреля 2012, 22:56)
Кстати я удивлён, увидев, что pragma влияет на g++. Если верить тому, что я читал раньше, он должен был бы их игнорить.
*
Не знаю. Mingw под винду сделал это. А вообще, интересно, если pragma полностью игнорится, то как тогда в структуре адекватно считать 2-байтовые поля?

QUOTE(KnightL @ Пятница, 13 Апреля 2012, 22:56)
В коде кстати есть довольно странное условие, не знаю, так и надо или нет... if( offset < 0 || size < 0 )... бессмысленный код вроде if(false). Ведь offset и size по типу quint32, беззнаковые. (строки 79-81 файла qresreader.cpp ).
*
Есть такой момент. %) Забито автоматом на автопилоте, скорее всего. %) Всё-таки нужно в Индию съездить... вдруг там родственники есть. biggrin.gif

QUOTE(KnightL @ Пятница, 13 Апреля 2012, 22:56)
И перевод из чисел в адрес клетки и из клетки в адрес можно было бы написать проще, за один проход и без дополнительных переменных.
*
Ты имеешь ввиду способ чтения/записи ячеек рабочих таблиц программы? Там пришлось в некоторых местах прибегнуть к дополнительным конвертациям. Вообще для чтения/записи ячеек используются variant-переменные, но почему-то (точню не припомню с ходу почему) при попытке записи чисел с точкой в ячейку с целым числом, когда я извлекал integer, почему-то из variant возвращался ноль вместо округлённого числа. Поэтому пришлось делать дополнительную конвертацию. Здесь я и сделал баг с округлением... =)

QUOTE(KnightL @ Пятница, 13 Апреля 2012, 22:56)
Кстати, а где вообще нужны signed long? я посмотрел таблицы, там не было чисел больше 2^31-1.
*
SignedLong'и попадаются по-идее там, где имеются поля типа FFFFFFFF или FFFFFFFE, ну и т.п... smile.gif Порой такие поля попадаются.


Вообще очень приятно было услышать твоё мнение. Спасибо за замечания. rolleyes.gif

Сообщение отредактировал ELF - Суббота, 14 Апреля 2012, 00:01
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Aleks Murf
post Пятница, 24 Августа 2012, 04:45
Отправлено #51


Knight
Group Icon

Группа: Members
Сообщений: 132
Регистрация: 14-Янв-04
Из: Минск
Пользователь №: 1,286



Замечательная программа. ))
После нехитрых манипуляций с параметрами ритуального ножа Зак оказался в стартовой локации не с бронзовым ножом, а с луком. laugh.gif Вот и убилась "бессмертная" лягушка, сидящая на недоступном возвышении. ))

Вот только одно я не понял - что это за хитрые значения в столбцах "Damage min" и "Damage max" на вкладке оружия? У Unique sword они равны 2,02234 и 0,977664 соответственно (минимальный дамаг больше максимального?! О_о). В старых таблицах (например, в "db_SP_toolkit") значения совершенно другие: 20,223362 и 30.


--------------------
Не бойтесь неприятностей. Если они еще не случились, то они где-то в будущем,
а если уже случились - то в прошлом. То есть сейчас и здесь их нет.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Demoth
post Пятница, 24 Августа 2012, 07:18
Отправлено #52


Conjurer
Group Icon

Группа: Add-on Developers
Сообщений: 193
Регистрация: 14-Мар-11
Пользователь №: 5,879



Хмм, такое чувство, что damage max это число, которое прибавляется к damage min. Например, 2,02234 + 0,977664 = 3,000004, что очень похоже на правду. Так что damage max правильно было бы переименовать в damage range наверное. А то что в 10 раз меньше - наверное там это сделали для удобства.

Сообщение отредактировал Demoth - Пятница, 24 Августа 2012, 07:22
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Demoth
post Четверг, 22 Октября 2015, 16:04
Отправлено #53


Conjurer
Group Icon

Группа: Add-on Developers
Сообщений: 193
Регистрация: 14-Мар-11
Пользователь №: 5,879



Прошло много времени с последнего релиза EI DB Editor'а на SourceForge.
С тех пор, DB Editor успел переехать на github: https://github.com/chemmalion/EIDBEditor.
А также вышло несколько багфиксовых релизов.

Из интересного, касательно формата базы: два "новых" поля в таблице Quick Items, которые позволяют увеличить скил воровства (stealing) и взлома замков (science), если предмет одет у персонажа. Эти значения не складываются, а берётся наибольший модификатор. Т.е. если одето два итема на +10 и +20 к воровству соответственно, то в результате будет +20.

На этом всё. Обо всех багах и замечаниях пишите сюда или на github, пофиксаю, когда будет время.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Тайсон
post Четверг, 22 Октября 2015, 19:15
Отправлено #54


Wizard
Group Icon

Группа: Members
Сообщений: 625
Регистрация: 28-Июл-14
Пользователь №: 6,122



По удобству и качеству оптимально. Спасибо создателям, причем огромное.
Вопрос 1 - фиксы по багам по мелочи, либо есть серьезные правки?
Просто явных накладок не встречалось.

Сообщение отредактировал Тайсон - Четверг, 22 Октября 2015, 22:13


--------------------
Accept-Aiming High
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Demoth
post Четверг, 22 Октября 2015, 20:00
Отправлено #55


Conjurer
Group Icon

Группа: Add-on Developers
Сообщений: 193
Регистрация: 14-Мар-11
Пользователь №: 5,879



Для тех, кто пользуется xlsx<->res, фиксы критические. Для остальных в целом тоже довольно важные.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Тайсон
post Воскресенье, 04 Сентября 2016, 10:14
Отправлено #56


Wizard
Group Icon

Группа: Members
Сообщений: 625
Регистрация: 28-Июл-14
Пользователь №: 6,122



По просьбе Siniy 481 - вот тема с простым и качественным редактором базы. За подробностями
лучше обратиться к создателям редактора.


--------------------
Accept-Aiming High
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Demoth
post Пятница, 25 Января 2019, 20:40
Отправлено #57


Conjurer
Group Icon

Группа: Add-on Developers
Сообщений: 193
Регистрация: 14-Мар-11
Пользователь №: 5,879



Вышел ещё один багфикс-релиз 1.4.4:
https://github.com/chemmalion/EIDBEditor/re...g/release_1.4.4

Связан он с обработкой юникодных-символов. Из-за бага база могла постепенно увеличиваться в размерах и накапливать мусор в тех строках, где эти символы использовались.

В частности, такую проблему вызывает символ неразрывного пробела (код 0xA0).
Визуально он выглядит так же как обычный пробел, но технически это другой символ. Для ПЗ эта разница принципиальна.

TL;DR. Баг стреляет редко, но метко. Лучше от греха подальше обновиться.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicTopic OptionsStart new topic
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
 

Упрощённая версия Сейчас: 22 Апреля 2019 - 03:20