Вход
Приветствую Вас Гость
 

easy.database.qsp v. 0.2

Библиотека организации базы данных для Quest Soft Player

Разрабатывалась для плееров версий 5.8.0 — это: классический плеер версии 5.8.0 и qSpider версии 0.12.0 и выше. Не гарантируется правильная работа на плеерах иных версий. Некоторые функции имеют ограничения на значение числовых аргументов, это связано с используемыми плеером библиотеками. Для разных версий плеера могут быть разные ограничения, поэтому внимательно читайте документацию к плееру, под который разрабатываете игру.

Система управления базой данных "easy.database" — это модуль (библиотека), предназначенный для простого редактирования нереляционной базы данных на QSP.

Существует модуль Олегуса, реализующий то же самое, но через другие механизмы: https://forum.ifiction.ru/viewtopic.php?id=1522.

Исходный код "easy.database" всегда доступен по адресу: https://github.com/AleksVersus/easy.nrBD

Подключение

"easy.database" подключается как любой другой модуль QSP, то есть с использованием команды inclib. Скачайте архив со страницы релизов, распакуйте и скопируйте папку "lib" в папку с вашей игрой. Тогда на самой первой локации в игре достаточно будет прописать такую команду подключения:

inclib 'lib/easy.database.qsp'

Для работы модуля требуется так же подключить и библиотеку "easy.math". Она поставляется вместе с модулем. Подключение аналогичное:

inclib 'lib/easy.math.qsp'

Если вы уже используете библиотеку "easy.math" в своей игре, убедитесь, что версия "easy.math" совместима с "easy.database". Для этого в любом месте вашей игры используйте команду:

*pl @edb.start('em-version')

При запуске игры вы увидите на экране текущую и необходимую версии модуля "easy.math".

Работа с исходниками

Если вы пишете игру, используя Sublime Text с подключённым пакетом QSP, у вас есть возможность самостоятельно собирать модуль из исходников.

В папке " [source] " размещены исходные тексты модуля, а так же файл " project.json ", отредактировав который вы наладите сборку модуля в папку с вашей игрой.

Так же вы можете собирать игру, напрямую включая в неё все локации модуля, если это необходимо. В этом случае вам не потребуется подключать модуль к игре — он уже будет в неё встроен.

В исходниках предусмотрены два режима сборки: без обработки препроцессором и с обработкой препроцессором.

В первом случае модуль будет собран, как есть, включая все служебные комментарии и наборы "предохранителей" — сообщений, которые всплывают в виде модальных окон и предупреждают о некоторых наиболее распространённых ошибках при работе с модулем. Данный режим сборки необходим на этапе разработки, отладки и тестирования игры.

Во втором случае необходимо включить препроцессор в " project.json ", тогда из собранного модуля будут удалены все служебные комментарии, а так же блоки "предохранителей". Данный режим рекомендуется использовать при сборке релизной версии игры, когда большая часть ошибок уже отловлена.

Вы также можете включить препроцессор, но сохранить блоки предохранителей в конечной сборке модуля. Для этого в исходном файле " 00_edb.start.qsps " в любом месте пропишите строку:

!@pp:var(edb_fuse)

Обратите внимание! Исходники библиотеки "easy.math" необходимо скачивать отдельно: easy.math на github

Подключение встроенного отладчика

Вы можете подключить отладочные команды модуля к командной строке (полю ввода), прописав в самом начале игры следующую команду:

$usercom[] = 'edb.usercom'

Это добавит новый обработчик строки ввода к уже работающим. Обратите внимание на квадратные скобки. Если вы используете свой собственный обработчик строки ввода и хотите, чтобы обработчик модуля работал совместно (параллельно) с вашим, обязательно ставьте квадратные скобки после $usercom.

Все команды модуля должны начинаться с ключевого слова edb. Для вывода списка всех доступных команд, введите в строке ввода edb help.

Также список всех доступных команд для поля ввода представлен в разделе данной документации "Команды отладки".

Особенности работы

Технически база данных представляет собой наборы массивов, описывающих таблицы данных, а так же массивы, реализующие поведение колонок в таблицах данных. Основные свойства базы данных записываются в массив $EASY_DATABASE.

Поскольку все массивы, входящие в базу данных являются глобальными, недопустимо использовать их в других местах игры. Ввиду чего необходимо чётко понимать, какие имена будут заняты под базу данных. Эту информацию можно проверить, воспользовавшись функцией edb.print, или через встроенный отладчик, введя команду edb >.

При создании таблицы данных инициализируется массив, название которого совпадает с названием идентификатора таблицы данных, поэтому требования к такому идентификатору такие же, как и к названию массива, плюс идентификатор не должен начинаться с символа $.

Также при создании таблицы данных автоматически генерируется колонка первичных ключей. Она является служебной, и с ней нельзя напрямую взаимодействовать, хотя технически это такой же массив, как и все прочие, поэтому при желании вы можете изменять колонку первичных ключей, используя чистый QSP. Колонка первичных ключей всегда представляет собой массив, название которого состоит из идентификатора таблицы данных и слова ' _id '.

Примеры имён массивов, представляющих колонки первичных ключей для разных таблиц данных:

$objects_id
$dialogs_id
$potions_id
$temp_id

Основные функции, реализующие работу с базой данных, представленны в виде локаций-функций. Названия всех таких локаций начинаются с edb. Для удобства чтения кода названия локаций содержат точки, это не мешает использовать их при неявном вызове func :

@edb.row.fill('Старый меч', 'сумка', 1, ($i, 'objects'))

Также для улучшения семантики в названиях локаций-функций указывается сущность, с которой они работают, и только затем непосредственно названия функций. Исключение составляют функции, работающие непосредственно с сущностью базы данных:

@edb.init()
@edb.print('[all arrays]')

В базе данных работает система указателей, которые позволяют не писать каждый раз в каждой команде полностью, с какой строкой, колонкой и таблицей сейчас нужно работать. Указатели автоматически изменяются по последнему явно прописанному значению.

Сущности

В модуле реализована работа с некоторыми абстрактными сущностями, представляя которые легче работать с подобной псевдо-базой данных. В данном разделе приводится краткое описание этих сущностей, а так же общее описание функций для работы с ними. Можно представить, что такие функции являются неотъемлемым свойством указанных сущностей, поэтому эти функции в рамках руководства называются методами. Технически они методами не являются.

База данных. Data Base

QSP не позволяет организовать полноценную базу данных, но в большинстве игр она и не нужна. Тем не менее можно реализовать некий аналог базы данных, чтобы облегчить себе работу с различными игровыми объектами.

Технически База данных в QSP — это набор массивов, которым мы можем тем или иным образом управлять через специальные механизмы Системы Управления Базой Данных. Последнее воплощено в данном модуле.

Непосредственно База Данных, как сущность, представлена в виде глобального массива $EASY_DATABASE[], в котором хранятся некоторые настройки, позволяющие Базой Данных управлять.

Чтобы использовать Базу Данных в своей игре, её необходимо инициализировать, то есть создать. А в дальнейшем применять методы для управления составляющими этой базы данных.

Методы

Методы Базы Данных представлены в виде соответствующих функций. С подробным описанием можно ознакомиться в разделе "Функции модуля".

  • init - инициализация базы данных. Требуется в самом начале игры, чтобы заполнить массив $EASY_DATABASE[] исходными значениями. ( edb.init).
  • print — вывод на экран, или в виде возвращаемого результата, человекочитаемой информации о базе данных. ( edb.print).
  • new_table — создание таблицы данных с указанным идентификатором в базе данных. ( edb.new_table).
  • del_table — удаление таблицы данных с указанным идентификатором из базы данных. ( edb.del_table).

Свойства

Свойства базы данных соответствуют значениям в массиве $EASY_DATABASE. См. функцию edb.init .

Таблица Данных. Data Table

Таблица данных — это наибольшая структурная единица базы данных. Именно из множества таблиц данных состоит вся база данных игры.

Технически Таблица Данных — это набор массивов, каждый из которых является столбцом такой таблицы. Соответственно строкой можно считать ряд записей во все массивы Таблицы Данных под одним индексом.

Непосредственно, как сущность, Таблица Данных представлена в виде массива, имя которого совпадает с названием идентификатора таблицы данных. В этом массиве хранятся некоторые настройки, позволяющие управлять таблицей данных.

Методы

Методы Таблицы Данных представлены в виде соответствующих функций. С подробным описанием можно ознакомиться в разделе "Функции модуля".

  • set_cur - устанавливает указанную таблицу данных в качестве текущей. ( edb.dt.set_cur).
  • print - выводит на экран, или возвращает в виде результата, человекочитаемую информацию об указанной таблице данных. ( edb.dt.).
  • new_col - создаёт в таблице данных колонку с указанным идентификатором. ( edb.dt.new_col).
  • del_col - удаляет из таблицы данных колонку с указанным идентификатором. ( edb.dt.del_col).
  • new_row - создаёт в таблице данных строку и возвращает её идентификатор. ( edb.dt.new_row).
  • del_row - удаляет из таблицы данных строку с указанным идентификатором. ( edb.dt.del_row).
  • height - возвращает высоту таблицы данных, то есть число строк. ( edb.dt.height).
  • width - возвращает ширину таблицы данных, то есть число колонок. ( edb.dt.width).
  • find - возвращает идентификатор строки, в которой найдено указанное значение. Данный метод позволяет использовать дополнительные фильтры для более точного поиска информации в таблице данных. ( edb.dt.find).
  • clear - удаляет все строки в указанной таблице данных. ( edb.dt.clear).
  • clone - копирует таблицу данных, или её часть, в новую таблицу данных. ( edb.dt.clone).

Свойства

Свойства таблицы данных соответствуют значениям в массиве, имя которого совпадает с идентификатором таблицы данных. См. функцию edb.new_table. Помимо этого механизмы "easy.database" используют не обозначенные в данном массиве свойства:

  • высота таблицы данных — определяется числом строк в таблице данных. Технически получается из размера массива, соответствующего колонке первичных ключей.
  • ширина таблицы данных — число колонок в таблице данных.
  • последний первичный ключ — индекс последней в таблице данных строки.

Колонка. Column

Таблица данных разбивается на колонки для удобства размещения информации. Как правило, колонка используется для хранения неких однотипных данных, реализующих какое-либо свойство для хранимой записи. Например, в таблице предметов может быть создана отдельная колонка для хранения названия, отдельная — для хранения веса, для хранения количества, и так далее.

Технически колонка представляет собой массив, название которого состоит из идентификатора таблицы данных и идентификатора колонки, разделённых символом нижнего подчёркивания. В нулевой ячейке такого массива прописывается тип данных, которые можно хранить в колонке (тип колонки). Возможные типы колонок можно посмотреть в описании функции edb.dt.new_col.

Примеры массивов, реализующих колонки:

  • $objects_sid - колонка таблицы данных objects под именем sid.
  • $objects_body - колонка таблицы данных objects под именем body

Колонки в данном руководстве могут называться столбцами.

Методы

  • set_cur - устанавливает указанную колонку в качестве текущей. ( edb.col.set_cur).
  • print - выводит на экран, или возвращает в виде результата, содержимое колонки или части колонки. ( edb.col.print).
  • set_next - в указанной колонке присваивает значение ячейке текущей строки, затем перемещает указатель на следующую строку. ( edb.col.set_next).

Свойства

У любой колонки есть всего два свойства:

  • высота — совпадает с размером массива, описывающего колонку.
  • тип данных, хранящихся в колонке.

Строка. Row

Таблица данных разбивается на отдельные записи — строки — для удобства размещения информации. Как правило, строка используется для хранения отдельных сложных записей. Например, в таблице предметов каждая отдельная запись соответствует одному предмету.

Технически строки в таблице данных представляют собой записи в ячейки всех массивов, описывающих столбцы, под одним (одинаковым) индексом.

Например, наша таблица данных objects состоит из трёх колонок id, body, position, это означает, что строки в такой таблице можно сформировать следующим образом:

$objects_id ['001'] = '001' & $objects_body [ '001' ] = 'Старый меч' & $objects_position [ '001' ] = 'loc1'
$objects_id [ '002' ] = '002' & $objects_body [ '002' ] = 'Сумка для продуктов' & $objects_position [ '002' ] = 'hero:inventory'
$objects_id [ '003' ] = '003' & $objects_body [ '003' ] = 'Яблоко' & $objects_position [ '003' ] = '002'

Методы

  • set_cur — устанавливает указанную строку в качестве текущей. ( edb.row.set_cur).
  • fill — заполняет строку группой значений. ( edb.row.fill). Значения могут быть перечисленны по порядку в соответствующих аргументах (и таким образом будут размещены в колонках соответственно порядку идентификаторов колонок в списке колонок таблицы данных), либо в качестве аргументов можно указывать кортежи, состоящие из значения и идентификатора колонки. В последнем случае значения не обязательно передавать в порядке, соответствующем списку колонок. Если будут переданы одновременно аргументы в виде кортежей и отдельных значений, это может привести к ошибкам заполнения вроде перезаписи только что внесённых значений.
  • print — выводит на экран, или возвращает в виде результата, содержимое строки, которое оформляется в виде списка. ( edb.row.print). Данный метод подходит только для контроля содержимого строк со стороны разработчика, и его нельзя использовать для получения содержимого строки в механизмах игры, т.к. многие ячейки могут содержать в себе списки.
  • set_next — присваивает ячейке (в текущей колонке и указнной строке) значение, а затем сдвигает указатель на следующую строку. Когда указатель достигает последнего столбца, он больше не сдвигается. Таким образом при постоянном обращении к этой функции происходит выход за пределы таблицы данных, а значит значение будет присваиваться всегда последней ячейке в строке.. ( edb.row.set_next).
  • exchange — обменивает содержимое строк, но сами строки позициями не меняются. Т.е. их идентификаторы в таблице данных не перемещаются. ( edb.row.exchange).
  • extract — извлекает из строки содержимое, помещая значения в указанный массив, при этом индексами элементов массива выступают названия колонок. ( edb.row.extract).
  • inject — вводит в указанную строку данные из указанного массива. При этом предполагается, что данные лежат в ячейках, индексы которых соответствуют названиям колонок таблицы данных. ( edb.row.inject).
  • clone — дублирует строку в таблице данных. То есть создаётся новая строка, идентичная указанной, но с отличающимся идентификатором. ( edb.row.clone).

Ячейка. Cell

Ячейка — наименьшая структурная единица таблицы данных. Ячейки создаются в пересечениях строк и столбцов.

Технически Ячейка Таблицы Данных представляет собой ячейку массива, соответствующего колонке, под указанным индексом, являющимся идентификатором строки. Каждая ячейка содержит лишь одно значение.

Методы

  • set_value — устанавливает значение ячейки. Если в ячейке уже было значение, оно затирается. При этом не важно, какой тип имеет столбец, в ячейку технически записываются либо число (для столбцов типа 'num'), либо строка (для столбцов всех остальных типов). ( edb.cell.set_value).
  • get_value — извлекает значение из ячейки. ( edb.cell.get_value).
  • add — добавляет значение к значению ячейки. Результат работы данной функции будет отличаться в зависимости от типа колонки. ( edb.cell.add).
  • del — вычитает значение из значения ячейки. Результат работы данной функции будет отличаться в зависимости от типа колонки. ( edb.cell.del).

Список. List

Список — это сложное структурированное значение, позволяющее упаковать несколько значений в одну ячейку таблицы данных.

Технически список — это строка, состоящая из подстрок, разделённых вертикальной чертой. Это означает, что значения, хранящиеся в списке, не должны содержать символа вертикальной черты. Поэтому списки целесообразно использовать там, где вы точно знаете, какие данные будут в этот список помещены. Например, списки удобны для хранения перечня идентификаторов таблиц данных, или для хранения перечня колонок, и т.д.

Примеры списков:

aaaa|bbbb|....|zzzzz
AAA|BBB|CCC|AAA|BBB|DDD|EEE
sid|uid|body|position|include|charge|count|run

Методы

  • remove - заменяет указанное значение в списке на новое значение. Позволяет заменить самое первое указанное значение в списке, либо сразу все значения в списке. ( edb.list.remove).
  • is_el - проверяет, является ли указанное значение элементом списка. ( edb.list.is_el).
  • first - получает первое значение в списке. ( edb.list.first).
  • last - получает последнее значение в списке. ( edb.list.last).
  • append - добавляет элемент в конец списка. ( edb.list.append).
  • diff - возвращает разницу двух списков. ( edb.list.diff).
  • for_each - перебирает элементы списка, и для каждого вызывает переданный в качестве аргумента код. В этот код нулевым аргументом передаётся значение элемента списка. Таким образом можно довольно гибко обрабатывать любые списки. ( edb.list.for_each)
  • length - возвращает длину списка. ( edb.list.length).

Свойства

Единственным свойством списка является его длина.

Команды отладки

Внимание!!! Отладчик ещё не доработан. Команды могут отличаться от версии к версии. Если вы вводите команду, а она не работает, или работает некорректно, проверьте локацию edb.usercom, чтобы убедиться, что ваша версия модуля поддерживает данную команду.

Все команды отладки начинаются с ключевого слова edb. Без этого ключевого слова отладчик просто не сработает. Ниже команды отладки приводятся без этого ключевого слова. Пример правильно введённой команды к отладчику:

edb help
  • help - вывод справки по модулю easy.database.
  • run - выполнить следующий после run текст, как строку кода QSP.
  • verison — текущая версия модуля.
  • required em — информация по используемому и необходимому easy.math.
  • gen id - генерирует uuid.
  • init - инициализирует базу данных.
  • > - выводит информацию о базе данных.

Последняя команда может быть расширена через доп инструкции, идентификаторы сущностей и инструкции к ним. Большинство инструкций к сущностям совпадают с названиями методов для этих сущностей. Однако не все методы можно использовать. Ниже приводится список, соответствующий расширениям команды. Идентификаторы сущностей и инструкций должны разделяться символом >. Пример:

edb > objects > body > 000005 > get_value
  • new_table - создать новую таблицу данных. Идентификатор указывается далее через >.
  • del_table - удалить таблицу данных. Идентификатор указывается далее через >.
  • идентификатор таблицы данных - работа с указанной таблицей данных. Через > указывается:
    • set_cur — установить таблицу данных текущей.
    • print - распечатать информацию по таблице данных в основном описании.
    • new_col - создать новую колонку в таблице данных. Идентификатор колонки указывается далее через >.
    • del_col - удалить колонку из таблицы данных. Идентификатор колонки указывается далее через >.
    • new_row - создать новую строку в таблице данных. Идентификатор строки указывается далее через >.
    • del_row - удалить строку из таблицы данных. Идентификатор строки указывается далее через >.
    • height - получить высоту таблицы данных.
    • width - получить ширину таблицы данных.
    • clear - очистить таблицу данных от строк.
    • clone - полное клонирование таблицы данных в новую таблицу данных. Идентификатор новой таблицы данных указывается далее через >.
    • идентификатор строки - работа с указанной строкой в таблице данных. Через > указывается:
      • set_cur — установить строку текущей.
      • print — вывести на экран содержимое строки в виде списка.
    • идентификатор колонки - работа с указанной колонкой в таблице данных. Через > указывается:
      • set_cur — установить колонку текущей.
      • print — вывести на экран содержимое колонки. идентификатор строки - работа с ячейкой в указанных колонке и строке. Через > указывается:
        • set_value - установить значение ячейки. Значение указывается через > без пробелов. Все последующие символы > считаются относящимися к значению.
        • get_value - вывести на экран значение ячейки. Значение можно сразу записать в глобальную переменную, для этого через > указывается название переменной.

Подробнее:

Наверх