Функции
$CURACTS
$CURACTS
— данная функция возвращает выведенные на экран действия в виде кода QSP, как текстовое значение.
Действия сохраняются в виде набора операторов act
с cответствующими параметрами и операциями.
Записав возвращённое функцией значение в переменную, можно восстановить действия с помощью оператора dynamic
. Пример:
! записываем текущие действия в переменную
$actlist = $curacts
! восстанавливаем действия из переменной
dynamic $actlist
$CURLOC
$CURLOC
— функция возвращает название текущей локации, т.е. локации, в которой "находится" игрок.
Технически это следует понимать так. В момент запуска игры плеер начинает выполнять код самой первой локации в игре, а когда код выполнен, плеер "останавливается" и ждёт участия игрока. Игрок может нажимать различные кнопки в игре, ссылки и выбирать пункты меню, что приводит к выполнению других блоков кода (например, действий) и переходам на новые локации по goto
или xgoto
. При таких переходах плеер вновь выполняет код других локаций и, когда код выполнен, "останавливается".
Так вот, когда на локацию осуществлён непосредственный переход (т.е. по goto
или xgoto
, либо это самая первая локация в игре), $curloc
начинает возвращать название этой локации, — во всё время, пока выполняется код, и когда плеер "останавливается". Если после остановки не происходит переход по goto
/xgoto
, значение, которое возвращает $curloc
, не меняется.
Пример использования:
*pl $curloc & ! выводим название текущей локации в Окно основного описания
*pl "Сколько раз перезашли: <<перезашёл>>"
act "Перезайти на текущую локацию":
перезашёл += 1
goto $curloc
end
$CUROBJS
$CUROBJS
- данная функция возвращает список выведенных на экран предметов в виде QSP-кода.
Предметы сохраняются в виде набора операторов ADDOBJ
с ответствующими параметрами и операциями.
Записав возвращённое функцией значение в переменную, можно восстановить предметы с помощью оператора DYNAMIC
. Пример:
! сохраняем список предметов как код QSP:
$old_objects = $CUROBJS
! удаляем все предметы из окна предметов:
KILLOBJ
! восстанавливаем все предметы в окне предметов:
DYNAMIC $old_objects
$DESC
$DESC
— возвращает текст базового описания локации с заданным названием. Общая запись:
$DESC([$локация])
, где [$локация]
— это название интересующей нас локации. Например:
! возвращаем базово е описание локации "каморка_под_лестницей"
$desc('каморка_под_лестницей')
!возвращаем базовое описание текущей локации
$desc($curloc)
Если в базовом описании присутствуют подвыражения, функция автоматически раскрывает их.
Функция возвращает текст, написанный только в поле "Описание" (Базовое описание) редактора Quest Generator. При работе в текстовом редакторе данное поле вам недоступно и функция будет всегда возвращать пустую строку.
$DYNEVAL
DYNEVAL
— выполняет код, переданный в виде строки текста, и возвращает результат, если он есть. Общая запись:
$DYNEVAL([$код], [аргумент 0], [аргумент 1], ... , [аргумент 18])
DYNEVAL([$код], [аргумент 0], [аргумент 1], ... , [аргумент 18])
, где [$код]
— это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода функции FUNC
. Аргументы [аргумент 0]
, [аргумент 1]
и т.д. могут использоваться внутри [$код]
, их значения автоматически помещаются в переменные args[0]
, args[1]
, и т.д. соответственно.
Внутри выполняемого кода dyneval
используется свой собственный массив ARGS
, его значения не пересекаются со значениями ARGS
на локации, из которой dyneval
была вызвана.
После выполнения кода, переданного функции dyneval
, продолжается вычисление выражения, в котором расположена функция dyneval
.
Чтобы dyneval
возвращала результат, необходимо внутри [$код]
присвоить этот результат переменной result
.
Примеры:
dyneval('result = 3 + 4')
*pl $dyneval('$result = mid("abcd", 2, 1) + "qwerty"')
проход = dyneval("result = ($args[0] <> 'текст')", 'строка')
- Чтобы
DYNEVAL
вернула несколько значений, результат должен быть записан в%RESULT
. - Чтобы
DYNEVAL
вернула строковое значение, результат должен быть записан в$RESULT
. - Чтобы
DYNEVAL
вернула числовое значение, результат должен быть записан вRESULT
. %RESULT
,$RESULT
иRESULT
— это одна и та же переменная, но с разными типами данных. Следует помнить, что новая запись значения затирает предыдущее, какого бы типа данных не было это значение.
Если при выполнении dyneval
она не возвращает значения (result
не инициализируется), и является единственным элементом выражения, передаваемого неявному оператору, плеер ничего не выведет на экран. Т.е. dyneval
будет работать, как DYNAMIC
. Пример:
! неявный оператор выведет на экран 123:
123
! код в dyneval выполнится, но на экране
! мы ничего не увидим:
dyneval("code = 123 + 890")
! неявный оператор выведет на экран 1013:
code
См. также оператор DYNAMIC
.
$FUNC
FUNC
— выполнение кода указанной локации без непосредственного перехода на неё с возвращением значения.
Общая запись:
FUNC([$локация], [аргумент 0], [аргумент 1], ... , [аргумент 18])
$FUNC([$локация], [аргумент 0], [аргумент 1], ... , [аргумент 18])
, где [$локация]
— это название локации, код которой мы хотим выполнить без непосредственного перехода на неё. Аргументы [аргумент 0]
, [аргумент 1]
и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0]
, args[1]
, и т.д. соответственно.
Чтобы FUNC
вернула:
- несколько значений или кортеж, на указанной локации нужно присвоить результат переменной
%RESULT
; - строковый результат, на указанной локации нужно присвоить этот результат переменной
$RESULT
; - для возвращения числового результата, он должен быть присвоен переменной
RESULT
.
Следует помнить, что %RESULT
, $RESULT
и RESULT
— это одна и та же переменная, но разных типов, поэтому если вы определили на локации и %RESULT
, и $RESULT
, и RESULT
, функция вернёт то значение, которое было записано в эту переменную последним.
Если переменной RESULT
не было присвоено значение, функция ничего не вернёт. И тут есть два варианта поведения плеера.
- Если функция
FUNC
стоит в каком либо выражении, вместо функции будет подставлено значение по умолчанию (пустой кортеж, пустая строка или ноль в зависимости от типа самого выражения). - Если функция
FUNC
стоит сразу после неявного оператора, такой оператор будет проигнорирован, и на экран ничего выводиться не будет. Пример:
N = 23 * 13
! ни одно значение не присваивается переменной result
'строка 1'
func('локация_Н') &! ничего не выведется на экран
'строка 2'
56 + func('локация_Н') &! функция стоит в выражении. Её значение = 0
Не обязательно, но рекомендуется, использовать префикс типа ($
или %
) с ключевым словом FUNC
, если функция должна вернуть строковое значение или кортеж, и — без префикса типа, если функция должна вернуть числовое значение:
$func('срез_строки', 'Мы вышли из дома, когда во всех окнах погасли огни.', 3, 7)
func('возвести_в_степень', 3, 3)
Порядок работы.
При вызове указанной локации с помощью FUNC
происходит следующее:
- Плеер прерывает выполнение текущего кода (например, кода текущей локации), и обращается к указанной локации.
- Базовое описание и список действий указанной локации добавляются к описанию и действиям текущей локации.
- Выполненяется код из поля Выполнить при посещении
- Затем плеер возвращается к выполнению кода, который прервал. То есть к вычислению выражения, в котором стоит данная функция.
На каждой локации автоматически создаются свои собственные уникальные массивы ARGS
и RESULT
, поэтому значения в этих массивах для каждой локации будут свои собственные. После выполнения кода локации, вызванной по FUNC
, массивы ARGS
и RESULT
этой локации уничтожаются.
Другие примеры:
!Обработка локации "функция" как функции.
!Массив ARGS пуст.
яблоки = FUNC('функция')
!обработка локации с названием лежащим в переменной $name как функции. ARGS[0] равен 1.
pl func($name, 1) * 78
!обработка локации с названием в $name как функции.
!$ARGS[0] содержит строку "строка", ARGS[1] равен 2.
msg "text" + func($name, "строка", 2)
! код локации для функции, получающей сумму ряда чисел от единицы до указанного значения
# summ
! в args[0] будет помещено число, которое мы укажем в качестве [аргумента 0]
loop while args[0]>0 step args[0] -= 1:
result += args[0]
end
---summ---
! пример вызова локации "summ", как функции
*pl func("summ", 19) & ! выведет на экран 190
! пример вызова с записью названия локации в переменную
$name_loc = "summ"
*pl func($name_loc, 23) & ! выведет на экран 276
Также см. "Неявный вызов функции FUNC
".
$GETOBJ
$GETOBJ
— возвращает название предмета в Окне предметов, расположенного в з аданной позиции. Общая запись:
$GETOBJ([#номер предмета])
Индексация (нумерация) предметов в Окне предметов ведётся с 1. Если предмета с индексом [#номер предмета]
не существует, возвращается пустая строка (''
).
Примеры:
$getobj(1) & ! вернёт название первого предмета в рюкзаке
$getobj(countobj) & ! вернёт название последнего добавленного предмета
Код, подсчитывающий в массиве OBJECTS
число предметов с одинаковым названием:
loop local i = 1 while i <= countobj step i += 1:
objects[$getobj(i)] += 1
end
$IIF
IIF
— возвращает значение в зависимости от верности выражения.
Общая запись:
IIF([#