Онлайн-справочник по самым часто задаваемым вопросам из темы "Как сделать?" на форуме QSP.su

Функции

$CURACTS

`$CURACTS` — данная функция возвращает выведенные на экран действия в виде кода QSP, как текстовое значение.

Действия сохраняются как набор операторов `act` с cответствующими параметрами и операциями.

Записав возвращённое функцией значение в переменную, можно восстановить действия с помощью оператора `dynamic`. Пример:

! записываем текущие действия в переменную
$actlist=$curacts
! восстанавливаем действия из переменной
dynamic $actlist

$CURLOC

`$CURLOC` — функция возвращает название текущей локации, т.е. локации, в которой "находится" игрок.

Технически это следует понимать так. В момент запуска игры плеер начинает выполнять код самой первой локации в игре, а когда код выполнен, плеер "останавливается" и ждёт участия игрока. Игрок может нажимать различные кнопки в игре, ссылки и выбирать пункты меню, что приводит к выполнению других блоков кода (например, действий) и переходам на новые локации по `goto` или `xgoto`. При таких переходах плеер вновь выполняет код других локаций и, когда код выполнен, "останавливается".

Так вот, когда на локацию осуществлён непосредственный переход (т.е. по `goto` или `xgoto`, либо это самая первая локация в игре), `$curloc` начинает возвращать название этой локации, — во всё время, пока выполняется код, и когда плеер "останавливается". Если после остановки не происходит переход по `goto`/`xgoto`, значение, которое возвращает `$curloc`, не меняется.

Пример использования:

act "— Где я нахожусь?": *pl "Это "+$curloc+"."

$DESC

`$DESC` — возвращает текст базового описания локации с заданным названием. Общая запись:

$DESC([$локация])

, где `[$локация]` — это название интересующей нас локации. Например:

! возвращаем базовое описание локации "каморка_под_лестницей"
$desc('каморка_под_лестницей')
!возвращаем базовое описание текущей локации
$desc($curloc)

Если в базовом описании присутствуют подвыражения, функция автоматически раскрывает их.

Использование данной функции имеет смысл только если вы работает в редакторе `Quest Generator`, поскольку лишь из этого редактора доступно редактирование поля "Базовое описание" локации.

$DYNEVAL (DYNEVAL)

`DYNEVAL` — выполняет код, переданный в виде строки текста, и возвращает результат, если он есть. Общая запись:

$DYNEVAL([$код],[аргумент 0],[аргумент 1], ... ,[аргумент 8])
DYNEVAL([$код],[аргумент 0],[аргумент 1], ... ,[аргумент 8])

, где `[$код]` — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода функции `FUNC`. Аргументы `[аргумент 0]`, `[аргумент 1]` и т.д. могут использоваться внутри `[$код]`, их значения автоматически помещаются в переменные `args[0]`, `args[1]`, и т.д. соответственно.

Чтобы `dyneval` возвращала результат, необходимо внутри `[$код]` присвоить этот результат переменной `result`.

Примеры:

dyneval('result = 3+4')
*pl $dyneval('$result = mid("abcd",2,1)+"qwerty"')
проход=dyneval("result = ($args[0] <> 'текст')", 'строка')

Результат функции равен значению `$result` при возврате строкового значения или `result` при возврате числового значения. если при выполнении кода были установлены и `result`, и `$result`, то предпочтение отдаётся строковому значению. После выполнения кода предыдущие значения `args` и `result` восстанавливаются, затем продолжается выполнение кода после `dyneval`.

См. также оператор `DYNAMIC`.

$FUNC (FUNC)

`FUNC` — выполнение кода указанной локации без непосредственного перехода на неё с возвращением значения.

Общая запись:

FUNC([$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8])
$FUNC([$локация],[аргумент 0],[аргумент 1], ... ,[аргумент 8])

, где `[$локация]` — это название локации, код которой мы хотим выполнить без непосредственного перехода на неё. Аргументы `[аргумент 0]`, `[аргумент 1]` и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные `args[0]`, `args[1]`, и т.д. соответственно.

Базовое описание и список действий локации `[$локация]` добавляются к основному описанию и действиям старой локации. Так же происходит выполнение операторов в поле "Выполнить при посещении"

Результат функции равен значению `$RESULT` при возврате строкового значения или `RESULT` при возврате числового значения. Если при обработке локации были установлены и `RESULT`, и `$RESULT`, то предпочтение отдаётся строковому значению. После обработки локации предыдущие значения `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]
:for

if args[0]>0:
    result=result+args[0]
    args[0]=args[0]-1
    jump 'for'
end
-----summ-----


! пример вызова локации "summ", как функции
*pl func("summ",19) ! выведет на экран 190
! пример вызова с записью названия локации в переменную
$name_loc="summ"
*pl func($name_loc,23) ! выведет на экран 276

$GETOBJ

`$GETOBJ` — возвращает название предмета в Окне предметов, расположенного в заданной позиции. Общая запись:

$GETOBJ([номер предмета])

Индексация (нумерация) предметов в Окне предметов ведётся с 1. Если предмета с индексом `[номер предмета]` не существует, возвращается пустая строка (`''`).

Примеры:

$getobj(1) ! вернёт название первого предмета в рюкзаке

$getobj(countobj) ! вернёт название последнего добавленного предмета

Код, подсчитывающий в массиве `OBJECTS` число предметов с одинаковым названием:

= 1
:loop

if i<=countobj:
    objects[$getobj(i)] = objects[$getobj(i)] + 1
    i = i + 1
    jump 'loop'
end

$IIF (IIF)

`IIF` — возвращает значение в зависимости от верности выражения.

Общая запись:

IIF([#выражение],[#выражение_да],[#выражение_нет])
$IIF([#выражение],[$выражение_да],[$выражение_нет])

Если `[#выражение]` верно, возвращает значение выражения `[выражение_да]`, в противном случае возвращает значение выражения `[выражение_нет]`. При выполнении функции вычисляются значения всех трёх выражений.

Примеры:

!Модуль числа
abs_x=iif(x>0,x,-x)

!А следующая конструкция вызовет ошибку деления на ноль:
x=0
y=iif(x=0,0,1/x)

! типичное решение для вывода времени, чтобы не терять ноль на часах:
$iif(hour>9,$str(hour),"0"+$str(hour))+":"+$iif(minute>9,$str(minute),"0"+$str(minute))

$INPUT

`$INPUT` — возвращает интерпретатору введённый игроком текст, либо `''` (пустая строка), если была нажата кнопка "Отмена". Общая запись:

$INPUT([$текст])

, где `[$текст]` — это приглашение в диалоговом окне, которое видит игрок. Например:

$name = $input('Как звать тебя, герой?')

При выполнении данной команды на экране появится диалоговое окно с текстом "Как звать тебя, герой?", а выполнение остального кода приостановится, пока игрок не провзаимодействует с диалоговым окном.

Игрок может ввести или не ввести текст, и нажать кнопку "ОК" или "Отмена". Если игрок ввёл текст и нажал кнопку "ОК", функция `$input` вернёт переменной `$text` введённый игроком текст. Во всех остальных случаях после закрытия диалогового окна функция вернёт пустую строку (`''`).

Другие примеры:

! Вопрос с одним правильным ответом. 
if $input('Что приходит после тьмы?')='свет':
    msg 'Все верно.'
else
    msg 'Ответ не верный.'
end

! Пример реализации вопроса с несколькими вариантами ответа из которых любой будет правильным.
$answer =$trim($lcase($input('Ответить')))
if instr($answer,'красный') or instr($answer,'желтый') or instr($answer,'зеленый'): gt 'win'
! Введя красный или зеленый ил желтый произойдет переход на локацию 'win'

Допустимо, но не одобряется, использовать функцию для возвращения числовых значений:

INPUT([$приглашение])

Это может привести к различным ошибкам в игре, если игрок введёт в диалоговом окне не только цифры. Например:

age=input('Сколько вам лет?')

Если игрок введёт вместо числа строку "24 года", плеер выдаст ошибку 101 "Несоответствие типов данных". Подобные ситуации должен предусматривать автор игры, а значит правильно будет озаботиться проверкой введённого значения уже после того, как функция $input будет выполнена.

:enter_text
! предлагаем игроку ответить на вопрос
! и присваиваем введённый текст переменной
$text=$input('Сколько вам лет?')
! если во введённом тексте содержатся не только цифры
! либо игрок не ввёл ответ
if isnum($text)<>-1 or $text="":
    
! предлагаем игроку снова ответить на вопрос
    jump 'enter_text'
else
    age=val($text)
end

$LCASE

`$LCASE` — возвращает строку маленьких букв, полученную изменением регистра букв исходной строки. Общая запись:

$LCASE([$текст])

, где `[$текст]` — любая строка текста.

Примеры:

$lcase('TExT#') ! вернёт 'text#'
$lcase('Привет, Алиса!') ! вернёт 'привет, алиса!'
$lcase('Я НЕ ХОЧУ НА ВАС ОРАТЬ.') ! вернёт 'я не хочу на вас орать.'

$MAINTXT

`$MAINTXT` — возвращает текст, выведенный в окно основного описания.

Данная функция может быть полезна для замены части текста в окне основного описания, либо иной обработке текста. Пример:

! изначально мы вывели строку
*pl "Мы вывели на экран строку и в этой строке есть кусок, который мы хотим удалить."

! получаем текст из окна основного описания
$text=$maintxt
! вырезаем лишний кусок
$text_new=$replace($text," и в этой строке есть кусок, который мы хотим удалить")
! очищаем окно основного описания
*clr
! выводим новый текст
*p $text_new

$MAX (MAX)

`MAX` — возвращает максимальное из значений выражений-аргументов. Можно передавать от одного до девяти значений/аргументов. Если передан один аргумент, то считается, что указано имя массива. Общая запись:

MAX([#выражение 1],[#выражение 2], ... ,[#выражение 10])
$MAX([$выражение 1],[$выражение 2], ... ,[$выражение 10])

MAX([$название массива])
$MAX([$название массива])

Обратите внимание, при передаче одного аргумента поиск максимального элемента происходит среди строковых (если название массива указано со знаком `$`) или среди числовых значений элементов массива. Например:

max('a') ! вернёт максимальное из числовых значений элементов массива "a"
$max('$b') ! вернёт максимальное из строковых значений элементов массива "b"

Нельзя писать так и надеяться, что произойдёт поиск среди значений массива `a`:

max(a)

Можно так:

$b='a'
max($b) ! произойдёт поиск максимального значения среди элементов массива "a"

Другие примеры:

max(1,2,5,2,0) &! вернёт 5
max(a,b,c) &! вернёт максимальное из значений переменных a,b,c
$max('aa','ab','zz') &! вернёт 'zz'

$MID

`$MID` — позволяет вырезать из строки её часть. Общая запись:

$MID([$строка],[#начало],[#длина])

, где `[$строка]` — это строка текста, именно из неё функция вырезает часть, начиная с символа номер `[#начало]`, и длиной в `[#длина]` символов. Нумерация символов начинается с 1. Если отсутствует параметр `[#длина]`, вырезается часть до конца строки. Параметр `[#начало]` обязателен, и может в принципе принимать любые значения.

$mid('abcdef',1,2)    &    ! 'ab'
$mid('abcdef',2,3)    &    ! 'bcd'
$mid('abcdef',2)    &    ! 'bcdef'
$mid('abcdef')        &    ! 'ошибка [120] — неверное число аргументов оператора/функции'
$mid('abcdef',0)    &    ! 'abcdef'
$mid('abcdef',8)    &    ! ''

$MIN (MIN)

`MIN` — возвращает минимальное из значений выражений-аргументов. Можно передавать от одного до девяти значений/аргументов. Если передан один аргумент, то считается, что указано имя массива. Общая запись:

MIN([#выражение 1],[#выражение 2], ... ,[#выражение 10])
$MIN([$выражение 1],[$выражение 2], ... ,[$выражение 10])
MIN([$название массива])
$MIN([$название массива])

Обратите внимание, при передаче одного аргумента поиск минимального элемента происходит среди строковых (если название массива указано со знаком `$`) или среди числовых значений элементов массива. Например:

min('a')    ! вернёт минимальное из числовых значений элементов массива "a"
$min('$b')    ! вернёт минимальное из строковых значений элементов массива "b"

Нельзя писать так:

min(a)

Можно так:

$b='a'
min($b) ! произойдёт поиск максимального значения среди элементов массива "a"

Другие примеры:

min(1,2,5,2,0)    &    ! вернёт 0
min(a,b,c)        &    ! вернёт минимальное из значений переменных a,b,c
$min('aa','ab','zz') ! вернёт 'aa'

$QSPVER

`$QSPVER` - возвращает версию интерпретатора в формате "X.Y.Z". Пример вызова:

if $qspver<"5.7.0": *pl "Ваша версия плеера не подходит для этой игры. Установите плеер версии 5.7.0 или выше."

$REPLACE

`$REPLACE` — общая запись:

$REPLACE([$строка],[$поиск],[$замена])

Данная функция заменяет в строке `[$строка]` все вхождения строки `[$поиск]` строкой `[$замена]` и возвращает результат. Если `[$замена]` отсутствует или указана пустая строка, то удаляет в исходной строке все вхождения искомой строки. Примеры:

$replace('test', '12', '4')    ! выведет на экран 'test'
$replace('test', 'e', 's')    ! выведет на экран 'tsst'
$replace('test', 't', '34')    ! выведет на экран '34es34'
$replace('test', 't')        ! выведет на экран 'es'
! можно присвоить значение переменной
$text="Строка текста с разными буквами."
! а новое значение вписать в другую переменную
$text_new=$replace($text,"ст","st")
*pl $text
*pl $text_new

$SELACT

`$SELACT` — возвращает название выделенного действия в любом месте игры.

Следует помнить, что выделение действия происходит при наведении на него указателя мыши, а не при непосредственном нажатии.

Пример использования можно посмотреть в разделе `$onactsel`

$SELOBJ

`$SELOBJ` — возвращает название выделенного предмета в любом месте игры. Выделение предмета происходит в момент нажатия (щелчка мышью по предмету) и не снимается до применения команды `unselect`.

Пример использования можно посмотреть в разделе `$onobjsel`

$STATTXT

`$STATTXT` — возвращает текст, выведенный в окно дополнительного описания. Может быть полезна для замены части текста в окне дополнительного описания.

$STR

`$STR` — возвращает строку текста, полученную переводом числа в строку. Общая запись:

$STR([#число])

Пример:

$str(56) ! превратит число 56 в строку "56" и выведет на экран

$STRFIND

`$STRFIND` — возвращает подстроку, соответствующую регулярному выражению, из указанной строки. Общая запись:

$STRFIND([$строка],[$шаблон],[#номер])

, где `[$строка]` — исходная строка, в которой производим поиск вхождения, соответствующего регулярному выражению `[$шаблон]`, или группе номер `[#номер]` в регулярном выражении. Если подстрока с указанным номером отсутствует, то возвращается пустая строка. Нумерация групп подстрок начинается с 1. Если параметр `[#номер]` отсутствует или равен 0, то возвращается подстрока, соответствующая всему регулярному выражению `[$шаблон]`

Например, возьмём регулярное выражение:

'^(\S+)\s(\S+)\s(\S+)$'

Метасимвол `\S` означает любой непробельный символ, а квантификатор `+` указывает, что непробельные символы должны присутствовать один или более раз. Таким образом запись `\S+` можно условно сопоставить слову. Каждое слово с помощью скобок `()` выделено в отдельную группу, а между группами присутствуют пробельные символы `\s`. Метасимволы `^` и `$` означают соответственно начало и конец строки. Таким образом наше регулярное выражение соответствует любой строке из трёх слов, разделённых пробелами.

Тогда:

! в этом случае строка не соответствует регулярному выражению
! потому что согласно регулярному выражению строка должна начинаться
! с группы непробельных символов. Команда вернёт пустую строку ''
$strfind(' идти к пещере','^(\S+)\s(\S+)\s(\S+)$')
! в данном случае строка полностью соответствует регулярному выражению
! а значит команда вернёт строку полностью 'идти к пещере'
$strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$')=''
! в следующих трёх примерах строка соответствует регулярному выражению
! однако третий аргумент указывает, какую именно группу из этого
! регулярного выражения мы хотим получить, поэтому каждая команда вернёт
! соответственно первое, второе и третье слова из строки
$strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',1) ! вернёт 'идти'
$strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',2) ! вернёт 'к'
$strfind('идти к пещере','^(\S+)\s(\S+)\s(\S+)$',3) ! вернёт 'пещере'
! здесь последняя группа непробельных символов объединена в одну
! группу с последним пробельным символом. Квантификатор "?" указывает,
! что эта группа может как присутствовать в строке, так и отсутствовать:
$strfind('идти к пещере','^(\S+)\s(\S+)(\s(\S+))?$',4) ! вернёт 'пещере'
$strfind('идти к пещере','^(\S+)\s(\S+)(\s(\S+))?$',3) ! вернёт ' пещере'
! этому же регулярному выражению соответствует и такая строка
$strfind('искать ключ','^(\S+)\s(\S+)(\s(\S+))?$',1) ! вернёт 'искать'
! а вот эта строка уже не соответствует регулярному выражению
$strfind('искать','^(\S+)\s(\S+)(\s(\S+))?$',1) ! вернёт ''

Следующие примеры показывают, как `$strfind` возвращает часть строки, соответствующую регулярному выражению:

$strfind('идти к дому','к\s(\S+)') ! вернёт 'к дому'
$strfind('идти к дому', 'к\s(\S+)', 1) ! вернёт 'дому'
$strfind('идти к своему дому','к\s(\S+)',1) ! вернёт 'своему'

$TRIM

`$TRIM` — возвращает указанную строку без прилегающих символов табуляции и пробелов. Общая запись:

$TRIM([$выражение])

Например:

$trim('     trim test        ') ! вернёт 'trim test'

$UCASE

`$UCASE` — возвращает строку больших букв, полученную изменением регистра букв исходной строки. Общая запись:

$UCASE([$текст])

, где `[$текст]` — любая строка текста.

Примеры:

$ucase('TExT#') ! вернёт 'TEXT#'
$ucase('Привет, Алиса!') ! вернёт 'ПРИВЕТ, АЛИСА!'
$ucase('Я хочу на вас орать.') ! вернёт 'Я ХОЧУ НА ВАС ОРАТЬ.'

$USER_TEXT ($USRTXT)

`$USER_TEXT` — в любом месте игры возвращает текст, который находится в строке ввода (поле ввода). Имеет краткую форму `$usrtxt`. Пример смотри в разделе `$usercom`.

ARRCOMP

`ARRCOMP` — возвращает индекс элемента массива, соответствующего регулярному выражению. Поиск начинается с элемента с заданным номером; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1. Общая запись:

ARRCOMP([#начало],[$имя_массива],[$шаблон])

, где `[#начало]` — номер элемента массива, с которого следует начать поиск, `[$имя_массива]` — название массива, по которому нужно произвести поиск, `[$шаблон]` — регулярное выражение, с которым будет сравниваться искомый элемент.

Параметр `[#начало]` может отсутствовать, при этом его значение принимается равным 0. Поиск ведётся только среди текстовых элементов массива.

Важно! В более новых версиях плеера (например, в Quest Navigator) параметр `[#начало]` переставлен в конец:

ARRCOMP([$имя_массива],[$шаблон],[#начало])

Для примера возьмём вот такой массив:

$mass[0]="топаю вперёд"
$mass[1]=" иду в пещеру"
$mass[2]="не иду в пещеру"
$mass[3]="топаю к дому"

Нам нужно найти элемент, значение которого состояит из трёх слов. В грубом приближении слово — это набор из одного или более непробельных символов `\S+`, по бокам от которого могут стоять или не стоять символы пробела `\s`, отсюда мы можем составить вот такое регулярное выражение:

\s?\S+\s\S+\s\S+\s?

Остаётся только выяснить какой элемент массива соответсвует шаблону:

arrcomp('$mass','\s?\S+\s\S+\s\S+\s?') ! этому выражению соответствует первый элемент

Если мы хотим проигнорировать первый элемент и начать поиск со второго:

arrcomp(2,'$mass','\s?\S+\s\S+\s\S+\s?') ! этому выражению соответствует третий элемент

А вот так мы можем вывести на экран значения всех элементов, содержащих слово "иду":

pos=0
:for

index=arrcomp(pos,'$mass','(.*\s|^)иду(\s.*|$)')
if index<>-1:
    $mass[index]
    pos=index+1
    jump 'for'
end

Другие примеры:

! Поиск строки 'This' среди элементов массива "$A"
arrcomp(0,'$A','This')
! Поиск строки, соответствующей регулярному выражению "abc\d+"
! (первые два элемента массива игнорируются)
arrcomp(2,'$A','abc\d+')
! аналогично предыдущему примеру,
! но поиск осуществляется по всем элементам массива
arrcomp(0,'$A','.*string.*') 

arrcomp('$A','This') ! эквивалентно 1му варианту

ARRPOS

`ARRPOS` — возвращает индекс элемента массива, равного указанному значению. Поиск начинается с элемента с заданным номером; индексация элементов массива ведётся с нуля. Если указанное значение не найдено, функция возвращает -1. Общая запись:

ARRPOS([#начало],[$имя_массива],[значение])

, где `[#начало]` — номер элемента массива, с которого следует начать поиск, `[$имя_массива]` — название массива, по которому нужно произвести поиск, `[значение]` — число, или строка (в зависимости от типа массива), которое нужно найти в массиве.

Важно! В более новых версиях плеера (например, в Quest Navigator) параметр `[#начало]` переставлен в конец:

ARRPOS([$имя_массива],[$шаблон],[#начало])

Для примера возьмём такой массив:

$color[0]='красный'
$color[1]='жёлтый'
$color[2]='зелёный'
$color[3]='синий'
$color[4]='жёлтый'

Нам нужно найти элемент со значением "жёлтый":

arrpos('$color','жёлтый') ! вернёт значение 1

Если мы хотим проигнорировать первые два элемента:

arrpos(2,'$color','жёлтый') ! вернёт значение 4

Если мы хотим найти элемент со значением, которого нет в массиве:

arrpos('$color','голубой') ! вернёт значение -1

Другие примеры:

! поиск строки 'this' в текстовом массиве "$a"
arrpos(0,'$a','this')
! поиск числа 65 в массиве "a" (два элемента массива игнорируются)
arrpos(2,'a',65)
! поиск строки 'test' среди значений массива "$b"
arrpos('$b','test')

ARRSIZE

`ARRSIZE` — функция возвращает число элементов массива. Общая запись:

ARRSIZE([$имя_массива])

, где `[$имя_массива]` — название массива, размер которого хотим получить.

В силу особенностей движка плеера, не важно, указывается ли название текстового, или числового, массива, возвращено будет наибольшее значение. Для примера:

$a[0]='0'
$a[1]='1'
a[0]=1
a[1]=2
a[2]=3

arrsize('$a')    ! вернёт значение 3
arrsize('a')    ! вернёт значение 3

$b[0]='0'
$b[1]='1'
$b[2]='2'
b[0]=1
b[1]=2

arrsize('$b')    ! вернёт значение 3
arrsize('b')    ! вернёт значение 3

COUNTOBJ

`COUNTOBJ` — возвращает количество предметов в инвентаре.

Номер последнего предмета в списке численно совпадает с количеством предметов, поэтому всегда можно получить название последнего предмета так:

$getobj(countobj)

INSTR

`INSTR` — возвращает номер символа, с которого начинается вхождение подстроки в строку. Общая запись:

INSTR([#начало],[$строка],[$подстрока])

, где `[#начало]` — это номер символа, с которого нужно начинать поиск, `[$строка]` — это текстовое значение (строка), по которому нужно производить поиск, а `[$подстрока]` — значение, которое мы ищем в указанной строке. Нумерация символов начианется с 1. Параметр `[#начало]` может отсутствовать, при этом он принимается равным 1.

Примеры:

instr(3,'abcdefabcdef','bc')    ! вернёт число 8
instr('abcdefghijklm','abc')    ! вернёт число 1

Если ни одного вхождения указанной подстроки в строке нет, instr возвращает 0.

Пример:

instr('Вася вышел из дома.','идти') ! вернёт 0

Важно: в более новых версиях (Quest Navigator) необязательный параметр `[#начало]` переставлен в конец:

INSTR([$строка],[$подстрока],[#начало])

ISNUM

`ISNUM` — функция возвращает -1 (истина), если переданная строка является числом, и — 0, если строка не является числом. Общая запись:

ISNUM([$строка])

, где `[$строка]` — любая строка текста.

При проверке учитываются знак `-` в начале, прилегающие пробелы и символы табуляции, но кроме того, если хотя бы один символ окажется не цифрой, функция вернёт 0 (ложь).

Примеры:

isnum(' 9999 ') ! вернёт -1
isnum(' -888')  ! вернёт -1
isnum('777a6')  ! вернёт 0
isnum('')       ! вернёт -1, так как нет ни одной не-цифры (пустая строка считается нулём)

ISPLAY

`ISPLAY` — функция проверяет, проигрывается ли в данный момент файл с указанным названием, и если проигрывается, возвращает -1. В противном случае функция возвращает 0. Общая запись:

ISPLAY([$путь_к_файлу])

, где `[$путь_к_файлу]` — путь к звуковому файлу относительно файла игры.

Пример:

isplay('music/mountsound.mp3')

LEN

`LEN` — возвращает длину указанной строки текста (количество символов). Общая запись:

LEN([$текст])

, где `[$текст]` — любое текстовое значение.

Примеры:

len("abc") ! вернёт значение 3
len("тысячадевятьсотвосьмидесятидевятимиллиметровый") ! вернёт значение 46
len("") ! вернёт значение 0

MSECSCOUNT

`MSECSCOUNT` — возвращает количество миллисекунд, прошедших с момента начала игры. Данная функция при использовании на локации-счётчике позволяет организовывать различные события, происходящие в реальном времени. Так же, с помощью этой функции можно делать замеры быстродействия различных участков кода в вашей игре:

i=0
old_time=msecscount
:for

if i<100000:
    a[i]=i
    i+=1
    jump 'for'
end
new_time=msecscount
pl new_time-old_time

RAND

`RAND` — возвращает случайное число между двумя указанными числами. Общая запись:

RAND([#выражение 1],[#выражение 2])

, где `[#выражение 1]` и `[#выражение 2]` — два любых числа или числовых выражения. Параметр `[#выражение 2]` может отсутствовать, при этом он принимается равным нулю (в более новых версиях плеера, например Quest Navigator, данный параметр по умолчанию равен единице).

Примеры:

rand(1,4) &! вернёт случайное значение от 1 до 4
rand(4,1) &! вернёт случайное значение от 1 до 4
rand(1000) &! вернёт случайное значение от 0(1) до 1000
rand 1000 &! вернёт случайное значение от 0(1) до 1000

RGB

`RGB` — возвращает числовой код цвета на основе трёх числовых аргумнтов, каждый из которых соответствует составляющей требуемого цвета. Общая запись:

RGB([#красный],[#зелёный],[#синий])

, где `[#красный]`,`[#зелёный]` и `[#синий]` — числовое выражение трёх составляющих цвета соответсвенно красной, зелёной и синей; должны принимать значения от 0 до 255.

Данная функция обычно используется совместно с системными переменными `bcolor`, `fcolor`, `lcolor`. Пример:

! гиперссылки светло-жёлтого цвета
lcolor=rgb(255,255,100)
! фон тёмно-серого цвета
bcolor=rgb(25,25,25)
! текст светло-зелёного цвета
fcolor=rgb(100,255,100)

RND

`RND` - возвращает случайное значение от 1 до 1000. Аналогично команде:

rand(1,1000)

STRCOMP

`STRCOMP` — проводит сравнение строки с регулярным выражением и, если строка соответствует регулярному выражению, возвращает -1 (истина), а если не соответствует — 0 (ложь). Общая запись:

STRCOMP([$строка],[$шаблон])

, где `[$строка]` — любое текстовое значение, `[$шаблон]` — регулярное выражение, с которым производится сравнение.

Например, нам нужно проверить, состоит ли указанная строка из трёх слов. Каждое слово, в грубом виде, это набор непробельных символов, значит мы можем воспользоваться метасимволом `\S` и квантификатором `+`. Слова обычно разделены пробельными символами, для чего мы используем метасимвол `\s`. Получается вот такое регулярное выражение:

"\s?\S+\s+\S+\s+\S+\s?"

Теперь мы можем проверить, какие строки соответствуют этому регулярному выражению:

strcomp('иду по дороге','\s?\S+\s+\S+\s+\S+\s?') ! вернёт -1
strcomp(' иду домой','\s?\S+\s+\S+\s+\S+\s?') ! вернёт 0
strcomp(' иду в лес ','\s?\S+\s+\S+\s+\S+\s?') ! вернёт -1
strcomp('однословие','\s?\S+\s+\S+\s+\S+\s?') ! вернёт 0

STRPOS

`STRPOS` — возвращает позицию символа, с которого начинается вхождение подстроки, соответствующей регулярному выражению, в указанную строку. Общая запись:

STRPOS([$строка],[$шаблон],[#номер])

, где `[$строка]` — исходная строка, в которой производим поиск вхождения, соответствующего регулярному выражению `[$шаблон]`, или группе номер `[#номер]` в регулярном выражении. Нумерация групп в регулярном выражении начинается с 1. Если подстрока с указанным номером отсутствует, то возвращается 0.

Если параметр `[#номер]` отсутствует или равен 0, то возвращается позиция символа, с которого начинается вхождение подстроки, соответствующей всему регулярному выражению.

Например, нам нужно выяснить, в какой части текста встречается словосочетание "зелёное яблоко", однако при этом не должно быть важно, в каком падеже записано это прилагательное.

Чтобы написать регулярное выражение для этой задачи, нам нужно предусмотреть все падежи:

зелёное яблоко
зелёного яблока
зелёному яблоку
зелёное яблоко
зелёным яблоком
зелёном яблоке

Как видим, во всех формах меняются только окончания слов. Поэтому мы можем составить вот такое регулярное выражение:

"зелён(ое|ого|ому|ым|ом)\s+яблок(о|а|у|ом|е)"

Через прямую черту в скобках перечисленны возможные варианты окончаний. А теперь выясним, с какого символа в строке начинается возможное слвовосочетание "зелёное яблоко":

! для удобства регулярное выражение помещаем в переменную
$regexp="зелён(ое|ого|ому|ым|ом)\s+яблок(о|а|у|ом|е)"
strpos("У меня есть зелёное яблоко",$regexp) ! вернёт 13
strpos("Ты швырнул в него зелёным яблоком!",$regexp) ! вернёт 19
strpos("полный ящик зелёных яблок",$regexp) ! вернёт 0, потому что такую форму мы не учли

Если мы не просто хотим узнать, с какого символа начинается вхождение в строку словосочетания, но где начинается вхождение слово "яблоко" из этого словосочетания, нам нужно выделить слово "яблоко" с вариантами окончаний в отдельную группу и воспользоваться параметром `[#номер]`:

$regexp="зелён(ое|ого|ому|ым|ом)\s+(яблок(о|а|у|ом|е))"
strpos("У меня есть зелёное яблоко",$regexp,2) ! вернёт 21
strpos("Ты швырнул в него зелёным яблоком!",$regexp,2) ! вернёт 27
strpos("полный ящик зелёных яблок",$regexp,2) ! вернёт 0, потому что мы не учли форму

VAL

`VAL` — переводит указанную строку цифр в соответствующее число. Общая запись:

VAL([$выражение])

, где `[$выражение]` — любая строка текста.

При проверке учитываются знак `-` в начале, прилегающие пробелы и символы табуляции, но кроме того, если хотя бы один символ окажется не цифрой, функция вернёт 0. Так же если `[$выражение]` равно `''` (пустая строка), то возвращается 0.

Пример:

яблоки=val($яблоки)