Операторы
Неявный оператор
Неявный оператор — это оператор, который не прописывается в коде QSP, но производит вывод значений на экран. Он подразумевается везде, где в команде присутствует выражение без оператора. Неявный оператор выводит в Окно основного описания значения таким же образом, как если бы вы использовали явное указание оператора *pl
, то есть выводит значение и совершает переход на новую строку. Примеры:
$AAA + '989'
'Вы находитесь в парке'
'Преформатированная
строка'
$curloc & ! выведет на экран название локации
В отличие от оператора *pl
неявный оператор не выводит на экран пустую строку с переходом на новую строку, если ему не передаётся никакое значение. Это означает, что если функция не возвращает никакого значения, неявный оператор просто игнорируется. Пример:
# start
! это код локации, вызывающей локацию-функцию
$curloc
$func('foo')
$func('foo')
$curloc
- start
# foo
! это код локации-функции
local i = 0
- foo
В данном случае локация-функция foo
ничего не возвращает, поэтому на экране мы увидим две строки со словом "start", между которыми не будет пустых строк, так как неявный оператор в строках с $func
на локации start
будет просто проигнорирован. Сравните с:
# start
! это код локации, вызывающей локацию-функцию
*pl $curloc
*pl $func('foo')
*pl $func('foo')
*pl $curloc
- start
# foo
! это код локации-функции
local i=0
- foo
!
(комментарий)
!
— оператор комментария. То, что находится в строке после оператора комментария, и до конца строки игнорируется интерпретатором. Оператор комментария позволяет "закомментировать" (выключить) ненужный временно оператор/функцию во время отладки игры. Кроме того, написание комментариев к коду программы является одним из признаков хорошего стиля программирования.
Необходимо чётко понимать, что это именно оператор, поэтому если вы комментируете не кую строку кода, то !
должен стоять после &
:
*pl "Hello, world!" & ! комментарий
Комментарии могут быть однострочными, то есть заканчиваться в той же строке, где стоит оператор комментария:
! однострочный комментарий
*pl "строка текста" & ! тоже однострочный комментарий
Единственным исключением из этого правила является запись комментария после двоеточия в многострочных операторах:
act "Многострочное действие": ! комментарий
*pl "Текст на экране"
end
Комментарии могут быть многострочными. Для этого после оператора комментария нужно записать кавычки, апострофы, или фигурные скобки. Например так:
! "это первая строка коммантария
это вторая строка комментария
это третья строка комментария
"
Многострочные комментарии могут принимать самые разнообразные формы:
! строка до кавычек " текст внутри кавычек
может переходить на другие строки " а так же {
можно использовать другие группы символов, чтобы
продолжать многострочный комментарий
} и комментарий не кончится, пока не кончится строка
*CLEAR
*CLEAR
— очищает окно основного описания. Имеет краткую форму *clr
.
*NL
*NL
— переход на новую строку, затем вывод текста в окне основного описания. Общая запись:
*NL [$текст]
, где [$текст]
— любая строка текста, число, или выражение любого типа. Если [$текст]
от сутствует, происходит просто переход на новую строку. Пример:
*p "Текст без перехода на новую строку."
*nl "Переход на новую строку + выведение текста."
*p "Текст без перехода на новую строку."
*P
*P
— вывод текста в окно основного описания без перехода на новую строку. Вывод текста любым другим оператором сразу после *p
добавит новый текст сразу после текущего. Общая запись:
*P [$текст]
, где [$текст]
— любая строка текста, число, или выражение любого типа. [$текст]
может быть пустой строкой ''
, но не должен отсутствовать. Пример:
*p "Текст без перехода на новую строку."
*p "Текст без перехода на новую строку."
*p ""
*p "Текст без перехода на нову ю строку."
*PL
*PL
— вывод текста в окно основного описания, затем переход на новую строку. Общая запись:
*PL [$текст]
где [$текст]
— любая строка текста, число, или выражение любого типа. [$текст]
может отсутствовать, тогда просто переход на новую строку. Пример:
*pl "Вывод текста, затем переход на новую строку."
*pl "Вывод текста, затем переход на новую строку."
*p "Текст без перехода на новую строку."
*pl "Вывод текста, затем переход на новую строку."
Аналогичным образом можно вывести текст, просто написав нужное выражение вместо данного оператора. Например, строки:
*pl $AAA + '989'
*pl 'Вы находитесь в парке'
*pl 'Преформатированная
строка'
и:
$AAA + '989'
'Вы находитесь в парке'
'Преформатированная
строка'
сработают одинаково.
ACT
ACT
— создаёт и выводит в окно действий н овое действие.
Общая запись в однострочной форме:
ACT [$название], [$путь к файлу изображения]: [оператор] & [оператор] & [оператор]
Общая запись в многострочной форме:
ACT [$название], [$путь к файлу изображения]:
[оператор]
[оператор]
[оператор]
END
К списку действий в окне действий добавляется новое с названием [$название]
и изображением, которое лежит по пути [$путь к файлу изображения]
. При нажатии на действие выполняются заданные операторы.
Параметр [$путь к файлу изображения]
может отсутствовать, при этом действие добавится без изображения.
Примеры:
! действие в однострочной форме записи
act "Сорвать с берёзы яблоко": яблоко += 1 & *pl "Вы сорвали яблоко, спелое белое."
! действие в многострочной форме записи, с изображением
act "Сорвать арбуз с куста", "img/watermelon.png":
арбуз += 1
*pl "Вы сорвали арбуз с куста"
end
Если в списке действий уже есть действие с указанным названием, то новое действие не создаётся, и не заменяет собой уже существующее, плеер просто игнорирует команду act
. Таким образом нельзя вывести действия с одинаковыми названиями. Пример:
act "Действие 1": *pl "Старое действие."
act "Действие 1": *pl "Новое действие."
Однако, вы можете сымитировать действия с одинаковыми названиями в режиме распознавания HTML, добавив в названия действий HTML-тег:
usehtml = 1
act 'Действие 1<a data-avs="uid-old"></a>': *pl "Старое действие."
act 'Действие 1<a data-avs="uid-new"></a>': *pl "Новое действие."
ADDOBJ
ADDOBJ
— добавление нового предмета в окно предметов. Общая запись:
ADDOBJ [$название], [$путь к файлу изображения], [#позиция]
, где [$название]
— это название предмета, [$путь к файлу изображения]
— это путь к ф айлу изображения предмета (отображается рядом с названием предмета), а [#позиция]
— на какое место в инвентаре добавляется предмет. Параметр [#позиция]
может отсутствовать. По умолчанию предметы добавляются в конец списка. Нумерация предметов в инвентаре ведётся с 1
. Параметр [$путь к файлу изображения]
может отсутствовать, значение по умолчанию - ''
, при этом предмет добавляется без изображения.
ADD OBJ [$название],[$путь к файлу изображения],[#индекс]
!!! Не используйте данную форму записи. Её поддержка прекратится в новых версиях плеера.
Можно добавлять предметы с одинаковым названием, однако если вы планируете добавлять много одинаковых предметов, то лучше использовать дополнительную переменную для подсчёта этих предметов, а в окно предметов добавить один предмет, чтобы не загромождать инвентарь спис ком из 137 предметов Рубль / Патрон:
if obj('Патроны'):
! если предмет "Патроны" уже добавлен, просто увеличиваем их число
патроны += 10
else
! если предмет "Патроны" ещё не добавлен, добавляем, и ув еличиваем число
addobj 'Патроны'
патроны += 10
end
Для хранения числа предметов можно использовать массивы, индексируемые через строки:
objects['деньги'] = 12
objects['патроны'] = 137
'Количество: <<objects[$getobj(countobj)]>>'
Пример добавления предмета в самый верх списка (при этом все остальные предметы сместятся вниз):
addobj "Отвёртка", "", 1
CLA
CLA
- очистка списка текущих действий (удаление всех действий из окна действий).
CLEAR
CLEAR
— очищает окно дополнительного описания. Имеет краткую форму clr
.
CLOSE
CLOSE
— останавливает проигрывание указанного звукового файла. Общая запись:
CLOSE [$путь к звуковому файлу]
, где [$путь к звуковому файлу]
— путь к звуковому файлу относительно файла игры. Если параметр [$путь к звуковому файлу]
не указан, происходит остановка воспроизведения всех звуковых файлов.
CLOSE ALL
CLOSE ALL
— остановка проигрывания всех активных звуковых файлов. Имеет краткую форму close
.
CLS
CLS
— очищает все окна кроме списка предметов. Эквивалентно конструкции:
clear & *clear & cla & cmdclear
CMDCLEAR
CMDCLEAR
— очистка строки ввода. Имеет краткую форму cmdclr
.
COPYARR
COPYARR
— копирование содержимого одного массива в другой. Общая запись:
COPYARR [$приёмник], [$источник], [#начало], [#количество]
, где: [$приёмник]
— это массив, в который производится копирование, размер и наполнение значения не имеют; [$источник]
— это массив, из которого производится копирование; [#начало]
— номер элемента, с которого нужно начинать копирование; [#количество]
— сколько элементов нужно скопировать. Параметр [#количество]
является необязательным; по умолчанию — до конца массива-источника. Параметр [#начало]
является необязательным; по умолчанию — 0.
Примеры:
! копируем все элементы массива '$b' в массив '$a'
copyarr '$a', '$b'
! при этом так же были скопированны все элементы массива 'b' в массив 'a'
! копируем в массив 'c' элементы массива 'd', начиная с шестого
copyarr 'c', 'd', 6
! копируем шесть первых элементов массива 'd' в массив 'c'
copyarr 'c', 'd', 0, 6
В силу особенностей плеера при копировании, например, числового массива mass1
в mass2
копируется также текстовый массив $mass1
в $mass2
.
Другие примеры:
copyarr $arrname1, $arrname2, 10, 5
copyarr 'a<<$arrname1>>', 'a<<$arrname2>>'
DELACT
DELACT
— удаляет действие из списка действий (если такое действие существует). Общая запись:
DELACT [$название]
, где [$название]
— название действия, которое хотим удалить.
Примеры:
! удаляем действие с конкретным названием
delact 'Идти вперед'
! удаляем выделенное действие
delact $selact
DEL ACT [$название]
!!! Не используйте данную форму записи. Её поддержка прекратится в новых версиях плеера.
DELOBJ
DELOBJ
— удаление предмета из инвентаря по названию (если такой предмет существует). Общая запись:
DELOBJ [$название]
, где [$название]
— название предмета, который хотим удалить.
Если в инвентаре присутствуют одинаковые предметы, команда удалит самый верхний с указанным индексом.
Примеры:
! удаляем предмет с конкретным названием
delobj "Отвёртка"
! удаляем выделенный предмет
delobj $selobj
DEL OBJ [$название]
!!! Не используйте данную форму записи. Её поддержка прекратится в новых версиях плеера.
DYNAMIC
DYNAMIC
— выполняет код, переданный в виде строки т екста. Общая запись:
DYNAMIC([$код], [аргумент 0], [аргумент 1], ... , [аргумент 18])
, где [$код]
— это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода оператора GOSUB
. Аргументы [аргумент 0]
, [аргумент 1]
и т.д. могут использоваться внутри [$код]
, их значения автоматически помещаются в переменные args[0]
, args[1]
, и т.д. соответственно. После выполнения старые параметры args
восстанавливаются, затем продолжается выполнение кода со следующей команды после dynamic
.
Примеры:
dynamic '$a = "string<<$b>>"'
dynamic '$a'
dynamic 'if $a = "string": "text!"'
dynamic "
$args[0]
addobj $args[1]
", 'Текст', 'Вилка'
Нижеследующая информация справедлива и для функции dyneval
.
Важно! Если код задан с помощью апострофов (''
) или кавычек (""
), в тексте вычисляются подвыражения:
$args[0] = 'qwerty'
$code = '
*pl "<<$args[0]>>"
*pl $args[0]
'
dynamic $code, 'asdfg'
В этом случае при задании переменной $code
будет вычислено подвыражение, поэтому первой строкой выведется 'qwerty', второй строкой выведется 'asdfg'.
Фигурные скобки - третий вид кавычек используемый специально для написания динамического кода. Здесь поддерживается вложенность скобок, а перед выполнением кода не вычисляются подвыражения:
$args[0]='qwerty'
$code = {
*pl "<<$args[0]>>"
*pl $args[0]
}
dynamic $code, 'asdfg'
В этом случае будут выведены две строки 'asdfg'.
EXIT
EXIT
— завершение выполнения текущего блока кода (преждевременный выход из подпрограммы, функции, обработчика какого-либо события, и т.д.).
В качестве блока кода может выступать локация, действие, код, переданный dynamic
'у или dyneval
'у, или код в гиперссылке.
Пример:
if args[1] = 0:
exit
else
if args[0] mod args[1] = 0:
result = 1
else
result = 0
end
end
В плеерах версии 5.8.0 появился оператор цикла loop
.
Тело цикла так же считается отдельным блоком кода, однако оператор exit
прерывает не только сам цикл, но и блок кода, в котором находится цикл.
FREELIB
FREELIB
— удаляет все локации, добавленные с помощью оператора inclib
.
В старых версиях плеера команда называлась dellib
и killqst
.
GOSUB
GOSUB
— выполнение кода указанной локации без непосредственного перехода на неё.
Общая запись:
GOSUB [$локация],[аргумент 0],[аргумент 1], ... ,[аргу мент 8]
, где [$локация]
— это название локации, код которой мы хотим выполнить без непосредственного перехода на неё. Аргументы [аргумент 0]
, [аргумент 1]
и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0]
, args[1]
, и т.д. соответственно. После обработки локации предыдущие значения args
восстанавливаются. Использование аргументов не обязательно.
При обращении к локации по gosub
базовое описание локации добавляется к текущему описанию, базовые действия добавляются к текущим действиям, и происходит выполнение операторов в поле "Выполнить при посещении", затем возврат на исходную строку (продол жение выполнения кода после gosub
).
Примеры вызова локаций по gosub
:
!обработка локации "ход". Массив args[] пуст.
gosub 'ход'
!обработка локации с названием из переменной $location
!Передаётся один параметр - args[0] равен 1.
gosub $location,1
!обработка локации "ход" с передачей 3-х параметров.
! $args[0] = $var (значению), args[1] = 2,
! $args[2] = "данные". Обратите внимание на символы '$'.
gosub 'ход',$var,2,'данные'
Ещё пример:
! это код вызова локации "переход"
gosub 'переход', 'локация'
! а это код самой локации "переход"
# переход
*pl $args[0] & ! на экран выведется текст 'локация'
! в окне действий появится новое действие:
act 'перейти':
goto "улица"
end
- переход