Операторы
Неявный оператор
Неявный оператор — это оператор, который не прописывается в коде 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 "Отвёртка", 3
! удаляем выделенный предмет
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
-- переход
Оператор имеет краткую форму gs:
GS [$локация], [аргумент 0], [аргумент 1], ... , [аргумент 18]
GOTO
GOTO — переход на указанную локацию. Общая запись:
GOTO [$локация], [аргумент 0], [аргумент 1], ... , [аргумент 18]
, где [$локация] — название локации, на которую должен быть осуществлён переход. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. Использование аргументов не обязательно.
При переходе на новую локацию при помощи goto очищается окно основного описания, а также список текущих действий, затем в окно основного описания выводится текст базового описания, в окно действий — базовые действия, а так же выполняется код из поля "Выполнить при посещении" локации [$локация]. Так же при переходе на новую локацию изменяется значение, возвращаемое функцией $curloc.
Примеры:
! переход на локацию "дом".
! Массив args на локации "дом" будет пуст.
goto 'дом'
! переход на локацию "улица" с передачей 2-х параметров.
! на локации "улица" args[0] равен 1,
! $args[1] содержит строку "данные".
goto 'улица',1,'данные'
Оператор имеет краткую форму gt:
GT [$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8]
IF
IF — основной оператор для записи конструкций условий. Конструкции, записываемые с помощью этого оператора (назовём их "простыми условиями"), имеют две формы: однострочную и многострочную, — и в общем виде выглядят так:
Общая форма записи:
! однострочная форма записи
IF [#выражение]: {команда 1} & {команда 2} & ...
! многострочная форма записи
IF [#выражение]:
{ко манда 1}
{команда 2}
...
END
В данном случае, если верно условие [#выражение], выполняются команды {команда 1}, {команда 2} и т.д.
- Для однострочной формы записи это будут только те команды, которые идут в той же строке, что и оператор
IFдо конца строки; - а для многострочной формы записи это будут те команды, которые идут в последующих строках после двоеточия и до специального ключевого слова
END.
В качестве условия могут выступать операции сравнения, логические операции и иные выражения, возвращающие числовые значения.
Ключевое слово END при многострочной форме записи должно стоять отдельной строкой.
Если условие [#выражение] не верно, команды выполнены не будут.
Примеры однострочной формы записи условий:
! если сумма a и b равна двум,
! переменной c присваивается значение 30
if a + b = 2: c = 30
! Если в инвентаре нет апельсина, выводится текст
if no obj("Апельсин"): pl "У Вас нет апельсина."
! это тоже простая однострочная форма
if ((a+b)/c)=45+54 or (b<5 or c>45) and no obj 'лопата' and $f=$vvv+'RRRRR': p 'OK' & goto 'Next'
Примеры многострочной формы записи условий:
if библиотека = 0:
узнал_о_тусовке = 0
библиотека_вернулся = 1
gt 'библиотека'
end
if a+b=2:
c=30
end
При многострочной форме записи после двоеточия в той же строке, в какой находится оператор IF, не должны идти никакие команды, иначе плеер посчитает такой оператор условия однострочным, и команды в последующих строках будут выполняться в любом случае, независимо от того, верным окажется условие или нет. Пример такой ошибочной записи:
if библиотека = 0: узнал_о_тусовке = 0
библиотека_вернулся = 1 &! эта строчка будет выполняться в независимости от верности условия
gt 'библиотека' &! и эта
end &! ключевое слово end - просто игнорируется
Исключением является оператор комментария записанный после двоеточия:
if библиотека = 0: ! если не посещал библиотеку
узнал_о_тусовке = 0
библиотека_вернулся = 1
gt 'библиотека'
end
Но в случае, если комментарий отделён амперсандом, условие будет считаться однострочным:
if библиотека = 0: & ! такой комментарий делает условие однострочным!
узнал_о_тусовке = 0 & ! эта строчка будет выполняться в независимости от верности условия
библиотека_вернулся = 1 & ! и эта
gt 'библиотека' &! и эта тоже
end &! ключевое слово end - просто игнорируется
Для многострочных форм записи допускается вложенность неограниченной глубины. Каждый уровень вложения должен заканчиваться своей строкой end.
Примеры:
if a+b<3 or y=8:
p 'A+B<3 или Y=8'
nl
if j=88: nl & p 'NEXT'
if $h='ooo':
p 'loo' & jump 'lll'
end
end
if a=0:
'abc1234'
if b=0: '0' else '1'
if j=88: nl & p 'NEXT'
if $h='ooo':
p 'loo' & jump 'lll'
else
p 'sample text'
v=8
end
1234
else
'01234'
g=78
end
Несколько примеров неверной записи:
! в этом случае, если условие не будет выполнено,
! плеер проигнорирует только команду `k1=34`
! поскольку посчитает, что это однострочное условие
if abcd=3: k1=34
k2=35 & ! эта команда будет выполняться всегда
k3=36 & ! эта комнада будет выполняться всегда
end & ! этот end будет проигнорирован
! данная строка выведет ошибку неизвестное действие
! так как однострочные формы записи не должны оканчиваться end`ом
if abcd=3: k1=34 else k1=25 end
ELSE
ELSE — ключевое слово, использующееся совместно с оператором IF, и которое служит для предоставления альтернативы, если условие не выполнено. Ключевое слово ELSE так же имеет две формы записи: однострочную и многострочную.
- Многострочную форму записи
ELSEможно использовать только в многострочной конструкции оператораIF, - однострочную форму записи можно использовать как в однострочной, так и в многострочной, конструкции оператора
IF. Общая форма записи:
! однострочная форма записи
IF [#выражение]: {команда д1} & {команда д2} & ... ELSE {команда н1} & {команда н2} & ...
! в многострочном IF:
! многострочная форма ELSE
IF [#выражение]:
{команда д1}
{команда д2}
...
ELSE
{команда н1}
{команда н2}
...
END
! однострочная форма ELSE
IF [#выражение]:
{команда д1}
{команда д2}
...
ELSE {команда н1} & {команда н2} & ...
! команды в следующих строках
! до END игнорируются
END
Здесь, если условие[#выражение] верно, выполняются команды от двоеточия до ключевого слова ELSE, а если условие [#выражение] не верно, выполняются команды от ключевого слова ELSE и до конца конструкции условия.
После ELSE можно ставить, а можно не ставить двоеточие.
При однострочной форме записи:
- и команды и ключевое слово
ELSEдолжны быть записаны в одной строке - окончанием альтернативного списка команд является конец строки.
- если однострочная форма записи
ELSEиспользуется в многострочной форме записиIF, все команды, которые идут в последующих строках послеELSEдоENDигнорируются.
Примеры однострочной записи:
! если сумма a и b равна двум, переменной c присваивается значение 30
! в противном случае (то есть если сумма a и b не равна двум)
! переменной c присваивается значение 10
if a+b=2: c=30 else c=10
! в зависимости от того есть ли в инвентаре апельсин
! выводится соответствующий текст
if obj("Апельсин"): pl "У Вас есть апельсин." else pl "У Вас нет апельсина."
! однострочная форма else внутри многострочной if
if $левая_рука = 'Великий меч':
gosub 'atack', 300
gosub 'health.prove'
gosub 'win.prove'
else gosub 'atack', atack_power
end
При многострочной форме записи:
- все команды должны идти в последующих строках после
ELSE;
Примеры многострочной записи:
if a+b=2:
c=30
else
c=10
end
if obj("Апельсин"):
pl "У Вас есть апельсин."
else
pl "У Вас нет апельсина."
end
if len($curtoken) > 0:
$tokens[curtoken_num] = $curtoken tokens_count = curtoken_num + 1
else
tokens_count = curtoken_num
end
ELSEIF
ELSEIF — ключевое слово, которое используется совместно с оператором IF и позволяет определять на одном уровне вложенности последовательно-исключающие условия. Имеет однострочную и многострочную формы записи.
- Многострочную форму записи можно использовать только в многострочных конструкциях с оператором
IF, - однострочную — как в многострочных, так и в однострочных конструкциях с оператором
IF.
Общие формы записи:
! однострочная в однострочном условии
IF [#выражение 1]: {набор команд 1} ELSEIF [#выражение 2]: {набор команд 2} ELSE {последний набор команд}
! многострочная в многострочном условии
IF [#выражение 1]:
{набор команд 1}
...
ELSEIF [#выражение 2]:
{набор команд 2}
...
ELSEIF ... :
...
ELSE
{последний набор команд}
...
END
! однострочная в многострочном условии
IF [#выражение 1]:
{набор команд 1}
...
ELSEIF [#выражение 2]: {набор команд 2}
ELSEIF ... : ...
ELSE {последний набор команд}
END
Работает это следующим образом. Если [#выражение 1] верно, выполняются команды {набор команд 1}. Если [#выражение 1] неверно, но верно [#выражение 2], выполняются команды {набор команд 2}, и т.д. И только если неверны все выражения в текущей конструкции условия, выполнятся команды после ELSE. Верность выражения [#выражение 1] не исключает верности выражения [#выражение 2], однако верность выражения [#выражение 2] исключает верность выражения [#выражение 1].
Особенности записи ELSEIF:
- Может использоваться вариант написания
ELSE IF. Работает точно так же. - Если в многострочной конструкции
IFпослеELSEIFоператоры идут в той же самой строке (однострочная форма), то все последующие строки игнорируются до следующегоELSEIF, либо доELSEилиEND. - В конструкции
IFcELSEIFможет как присутствовать, так и отсутствовать часть сELSE.
Примеры:
if obj('Зелье здоровья'): health += 100 esleif obj('Яблоко'): health += 15 else *pl 'Нечем пополнить силы!'
IF ОЧКИ>124:
GOTO 'КОН3'
ELSEIF ОЧКИ>99:
GOTO 'КОН4'
ELSE
GOTO 'КОН5'
END
if money mod 10=1 and money mod 100<>11:
*pl "У вас <<money>> монета."
elseif money mod 10>1 and money mod 10<5 and (money mod 100<5 or money mod 100>20):
*pl "У вас <<money>> монеты."
elseif money mod 10=0 or money mod 10>4 or (money mod 100>10 and money mod 100<21):
*pl "У вас <<money>> монет."
end
Пример записи ELSEIF с операторами в той же строке:
! реализация switch/case на QSP
if r = 0:
'Вариант 0'
elseif r = 1: 'Вариант 1'
elseif r = 2: 'Вариант 2'
elseif r = 3: 'Вариант 3'
else: 'Без вариантов'
end
Для улучшения читаемости кода рекомендуется использовать конструкции с elseif только в многострочной форме оператора if.
INCLIB
INCLIB — из заданного файла игры добавляет все локации, названия которых отсутствуют среди текущих игровых локаций. Загруженные локации полностью эквивалентны локациям из основного файла игры. Общая запись:
INCLIB [$путь к файлу игры]
Пример:
inclib "lib/easy.math.qsp"
inclib "lib/easy.title.qsp"
inclib "res/drive.qsp"
inclib "res/base.qsp"
inclib "res/intro.qsp"
В более старых версиях плееров команда называлась addqst и addlib.
JUMP
JUMP — переход в текущем блоке кода на указанную метку. Общая запись:
JUMP [$метка]
, где [$метка] — это метка ниже или выше по коду (см. раздел "Метки").
jump находит метку только в пределах текущего блока кода, то есть метки локальны.
Отдельными блоками кода в QSP являются:
- код "Выполнить при посещении" конкретной локации (каждая локация - отдельный блок кода),
- код действия даже если действие добавлено программно,
- код в гиперссылке,
- код
DYNAMIC/DYNEVAL
Пример:
jump 'КонеЦ'
p 'Это сообщение не будет выведено'
:конец
p 'А это сообщение пользователь увидит'
С помощью оператора jump в старых версиях плеера можно было организовывать циклы:
:loop
if s<9:
s=s+1
pl s
jump 'loop'
end
p 'Всё!'
Двойной цикл с одной меткой:
:loop
if y<9:
if x<9:
*p "<<x>> - "
x=x+1
jump 'loop'
end
*pl ":<<y>>"
y=y+1
x=0
jump 'loop'
end
Начиная с версии 5.8.0 для циклов введён собственный оператор loop.
KILLALL
KILLALL — уничтожает все переменные и удаляет все предметы из окна предметов. Эквивалентен конструкции:
killvar & killobj