VariableTools - это плагин для бота Astral к MMORPG "Neverwinter Online". Он предназначен для работы с переменными в сценариях Quester'a.
Ключевыми объектами в данном плагине являются переменная и арифметическое выражение.
Переменная - это действительное число, идентифицируемое комбинацией трёх признаков:
- Name - текстовое имя переменной.
В имени переменной допускаются любые русские и латинские буквы, цифры и символ_
.
При этом имя переменой не должно совпадать с именами функторов, используемых в EXPRESSION; - AccountScope - переключатель области видимости для персонажей:
- Global : переменная видима всем персонажам независимо от аккаунта;
- Account : переменная видима всем персонажам конкретного аккаунта, который был загружен при её инициализации;
- Character : переменная видима единственному персонажу, который был активен при её инициализации.
- ProfileScope - переключатель области видимости относительно профиля:
- Common : область видимости переменной не ограничена;
- Profile : область видимости переменной ограничена конкретным Quester-профилем, в котором она была инициализирована.
Переменные сохраняются во внутренней коллекции со значениями, полученными в результате выполнения Quester-профиля. По этой причине рекомендую нужные вам переменные инициализировать, чтобы при повторном запуске скрипта не получить ошибок из-за старых значений.
Переменные, с флагом Save, при завершении работы Астрала сохраняются в файл и загружаются при следующем запуске бота. Таким образом обеспечивается сохранение значений переменных между игровыми сессиями.
Арифметическое выражение состоит из следующих элементов:
- Числовые константы (целые числа или десятичные дроби).
В качестве разделителя дробной части можно использовать.
и,
; - Переменные, область видимости которых задается в виде перечисления идентификаторов AccountScope и ProfileScope в квадратных скобках сразу после имени переменной.
При отсутствии соответствующего идентификатора переменная распознается как[Global, Common]
.
ЗаписьSomeVar
эквивалентнаSomeVar [Global,Common]
;
ЗаписьSomeVar[Character]
эквивалентнаSomeVar [Character, Common]
;
ЗаписьSomeVar[Profile]
эквивалентнаSomeVar [Global, Profile]
;
ЗаписьSomeVar[Account, Common]
- полное определение переменной. - Простые арифметические операторы:
+ - * /
; - Операцию взятия остатка от деления:
%
; - Группирующие скобки:
(
и)
; - Разрешенные функции;
- Функции времени;
Пробелы в выражении игнорируются, однако, пробел не может разделять две части имени переменной или функтора:
My_Var iable_001
- некорректное выражение
Не инициализированные переменные, упомянутые в EXPRESSION, считаются равными нулю.
Результат некорректного выражения EXPRESSION на этапе выполнения равен нулю.
Результатом деления на '0' будет максимально возможное число для типа double. Что-то в районе 1.7976931348623157E+308.
Выражение EXPRESSION парсится (т.е. "разбирается" и проверяется) единственный раз во время инициализации, в результате чего строится Абстрактное синтаксическое дерево (АСТ), используемое для вычисления во время выполнения скрипта.
Данная команда присваивает заданной переменной, результат арифметического выражения, заданного опцией Equation.
Опция | Описание |
---|---|
Variable | Комплексный Идентификатор переменной |
Equation | Арифметическое выражение, результат которого присваивается переменной |
Save | Флаг, указывающий на необходимость сохранения переменной в файл при завершении работы Астрала. - True - устанавливает флаг сохранения в файл; - False - снимает флаг сохранения; - NotChange - значение флага не изменяется. |
В команде SetVariable в выражении Equation можно использовать переменную, которой присваивается значение. В этом случае сначала будет вычислено значение выражения Equation (считано старое значение переменной), а затем переменной будет присвоен полученный результат.
Например:
Num := Num + 99
Внимание: изменение имени, и идентификаторов области видимости AccountScope, ProfileScope в команде SetVariable не изменяют эти признаки для переменной в коллекции. Таким образом вы просто определите "новую" переменную с другим именем и(или) областью видимости.
Выполнение команды удаляет из внутренней коллекции заданную переменную.
Опция | Описание |
---|---|
Variable | Комплексный Идентификатор удаляемой переменной |
Удаленная переменная не будет сохранена в файл.
Условие сравнивает результат арифметического выражения Equation1 с результатом арифметического выражения Equation2. Тип сравнения задается полем Sign и может принимать значения:
- Inferior : Условие истинно, если
Equation1
меньшеEquation2
; - Superior : Условие истинно, если
Equation1
большеEquation2
; - Equal : Условие истинно, если
Equation1
равноEquation2
; - NotEqual : Условие истинно, если
Equation1
НЕ равноEquation2
.
Данное условие позволяет проверить наличие(отсутствие) переменной в коллекции.
Доступны две проверки:
- VariablePresenceCheck : Условие истинно, если во внутренней коллекции содержится заданная переменная;
- VariablesCountCheck : производит подсчет количества переменных, соответствующих комбинации признаков (имя, область видимости), и сравнивает его с заданным числовым значением.
- Функция
ItemCount(ItemId)
вычисляет количество предметов в инвентаре персонажа, заданных идентификатором ItemId.
В начале и в конце идентификатора можно использовать символ подстановки*
, заменяющий любое число символов; - Функция
NumericCount(NumericId)
вычислет количество ценностей (Numeric), имеющихся в распоряжении персонажа и заданных полным идентификатором NumericId.
В начале и в конце идентификатора можно использовать символ подстановки*
, заменяющий любое число символов; - Функция
Random(EXPRESSION)
генерирует случайное целое число от нуля до значения выражения EXPRESSION. Если EXPRESSION пустое, тогда максимальное генерируемое значение определяется пределами целого числа (Integer) в .Net Framework, которое равно 2'147'483'647. Например:
Random(Var_001 * (ItemCount(Gemfood_1)%55.9)) / Var_002
Результат приведенного выражения - частное от деления случайного числа на переменную Var_002.
Максимальное возможно значение случайного числа задано произведением:
Var_001 * (ItemCount(Gemfood_1)%55.9)
.
Любая переменная представляет действительное число, которое может быть интерпретировано как дата-время в формате OLE Automation Date.
Полночь (0 час. 0 мин) 30.12.1899 года соответствует 0,0
.
Целая единица соответствует суткам, а дробная часть - времени (час = 1/24; минута = 1/1440; секунда = 1/86400).
Для удобства работы с переменными как с датами определены функторы:
Now()
- возвращает текущую дату и время;
Days(EXPRESSION)
- количество дней, заданных EXPRESSION. Неполный день отбрасывается;
Hours(EXPRESSION)
- целое количество часов, соответствующих EXPRESSION. Дни, переводятся в часы, а минуты и секунды отбрасываются;
Minutes(EXPRESSION)
- целое количество минут, соответствующих EXPRESSION. Дни и часы переводятся в минуты, а секунды отбрасываются;
Seconds(EXPRESSION)
- целое количество секунд, соответствующих EXPRESSION. Дни, часы и минуты переводятся в секунды, а доли секунд отбрасываются,
где EXPRESSION
- любое допустимое арифметическое выражение.
Например, день недели можно вычислить по формуле:
Days(Now() - 2) % 7
0 - понедельник
1 - вторник
...
6 - воскресенье