Операторы
Неявный оператор
Неявный оператор — это оператор, который не прописывается в коде 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
- переход