В последнее время, очень часто появляются вопросы типа "Как отследить стоимость предмета", "Как сделать требование у предмета по способностям героя" и т.д. И поэтому я решил вам рассказать вам, о током интересном способе, который поможет вам реализовать много различных дополнений к вашим предметам. Это конечно же База Данных.
Небольшая теория
Что такое База Данных (далее сокр. БД)? Это таблица, которая содержит нужные вам значения. Она состоит из полей и записей. Поля содержат заголовки ваших параметров, они не несут никакой игровой информации, кроме как тип данного поля, и задаются при первоначальном планировании и построении БД. Запись - самая важная часть. В них хранятся значения полей, которые мы можем редактировать в ходе игры.
Первые шаги
Планирование
Для того, чтобы начать строить БД надо назначить себе четкую цель. Например мы хотим расширить информацию о наших предметах. Я хочу ввести еще 2 вида ресурсов в игре (гномье золото и рубины). Не важно как они будут реализованы. Теперь начнем планирование БД. По скольку нам надо 2 новых ресурса, значит нам надо создать 2 поля, значения этих полей должны быть целыми. После планирования БД нужно начать реализовывать, нам известны и какие поля нужны и какие данные будут в них храниться.
Конструирование
Для создания БД заходим в создание переменных и создаем нужные нам поля, при этом не забывайте ставить галочку напротив параметра Массив, т.к. массив в WC3 - это однострочная таблица, а таблица это и есть БД. Продолжая пример с новыми ресурсами, я создаю 2 новых переменных типа Целое и названиями Item_GGoldCost и Item_RubinCost. На этом этапе и завершается наше конструирование БД.
Инициализация
После того, как структура БД готова, мы можем её заполнять. Для этого создаем триггер с событием Инициализация карты. И в действиях начинаем указывать значения полей. Например у меня есть предмет "Мешочек с золотом", который имеет Raw Code I001 (Ctrl + D в РО показывает Raw Code объектов), делаем так
set Item_GGoldCost ['I001' - 'I000'] = 15
set Item_RubinCost ['I001' - 'I000'] = 2
Обратите внимание, вместо того, чтобы писать в индексе массива Raw Code предмета, мы еще вычитаем значение 'I000'. Это делается лишь для того, чтобы индекс массива не выходил за предельное значение 8191. При инициализации можно посчитать значение индекса вручную
'I000' - 'I000' = 0
'I001' - 'I000' = 1
'I002' - 'I000' = 2
// ...
'I009' - 'I000' = 9
//Но
'I00A' - 'I000' = 13
//И т.д.
Теперь мы можем в любое время получить нужное нам значение любого поля. Наша БД закончена.
Итоги
Теперь подведу некоторые итоги. БД даёт большие возможности, за предметом можно сохранять разные данные, Требование к предметам, уровню способности и т.д. Этот список можно продолжать долго. Но так же БД имеет ряд не удобств.
- Кол-во записей не может превышать 8191 (но в принципе с хорошими мозгами и это можно обойти, но вряд ли вам потребуется такое большое кол-во предметов)
- Не очень удобно использовать в GUI (выход: учить vJass)
Базы Данных на vJass
Для этого понадобиться Jass New Gen Pack (JNPG)
И так, вы уже познакомились с БД, и знаете что они из себя представляют. Теперь перейдем непосредственно к коду. БД очень просто создаются структурами. Очень удобно для записи и доступа. Создадим БД для наших предметов, с теме же полями, что и в первой части статьи.
И так, вы уже познакомились с БД, и знаете что они из себя представляют. Теперь перейдем непосредственно к коду. БД очень просто создаются структурами. Очень удобно для записи и доступа. Создадим БД для наших предметов, с теме же полями, что и в первой части статьи.
struct TItemDB
integer GGoldCost
integer RubinCost
endstruct
Вот мы и создали структуру нашей базы данных. Теперь нам надо инициализировать данные. Для удобства я буду использовать библиотеку.
library ItemAddingDB initializer InitDB
globals
TItemDB array Items
endglobals
struct TItemDB
integer GGoldCost
integer RubinCost
endstruct
private function InitDB takes nothing returns nothing
set Items[1] = TItemDB.create() //Не забываем инициализировать структуру
set Items[1].GGoldCost = 15
set Items[1].RubinCost = 2
endfunction
endlibrary
Принцип назначения индексов тот же, что и в GUI, тоесть из Raw Code вашего предмета вычитаем I000.
Подводим Итоги
В этой статье я рассмотрел основы создания бд. Теперь вы умеете создавать и использовать БД в своих картах. Область применения их очень обширна. БД Можно применять не только для предметов, но и для декораций, способностей, бафов. Но всегда следует помнить правило назначения индекса. Если для предмета вычитали I000, то для способностей будем вычитать A000. У бд есть одно небольшое ограничение с областью применения. Юниты имеют разные первые буквы в Raw Code. Поэтому для каждой расы придется использовать свою БД юнитов или же переписывать Raw Code юнитов с помощью object editor hack во вкладке Grimore JNPG.