URQL1) – язык, служащий для написания игр на платформе URQ.
URQ2) – «менюшная» платформа предназначенная в основном для создания небольших текстовых игр в жанре Interactive Fiction3). Представляет собой общее название семейства интерпретаторов специализированного языка URQL.
Достоинства языка:
Недостатки:
Интерпретаторы: RipSoft URQ, URQ_DOS, FireURQ, AkURQ, INSTEAD (URQ module), OverUrK, BEST_URK, aurk, SURK и др.
Файлы, обрабатываемые движком должны иметь расширением qst
или qs1
. Файлы qst
являются обычными
текстовыми документами, а файлы qs1
являются зашифрованной копией файлов qst
.
Возможно подключение дополнительных файлов.
При этом, происходит статическая обработка при их загрузке, а подстановки не работают.
Метки и переменные - сквозные.
При упаковке, основной файл должен называться: main.qst
или game.qst
include file-name-002.qst
Разделителем операторов является символ конца строки или амперсанд &
.
Регистр не имеет значения.
Начинаются с точки с запятой и продолжаются до конца строки.
Допустимы также комментарии в стиле языка Си, расположенные между /*
и */
, в том числе многострочные.
; Комментарий1 /* Комментарий2 */ p текст ; Комментарий3
Каждая локация игры в исходном тексте должна начинаться с метки (начинается с двоеточия, без пробела) и заканчиваться end
.
:метка end
Пробелы в метках поддерживаются, но являются нежелательными.
Допускаются символы, обозначающие буквы русского и латинского алфавита, цифры, знак подчеркивания и знаки арифметических операций +
и -
(лучше не злоупотреблять странными названиями).
Недопустимы символы: ;
/*
*/
&
,
Из двух одинаковых меток выполняется только первая!
При входе на локацию после перехода (Btn
, Goto
, Proc
) происходит увеличение переменной с именем count_имя-локации
на 1.
Специальная локация :Сommon
выполняется перед указанной в операторе btn
при нажатии по кнопке.
end
– конец локации.
Оператор остановки End
приостанавливает работу интерпретатора, чтобы пользователь мог сделать выбор между предложенными ему вариантами действий.
Если меткой локация открывается, то оператором остановки завершается.
btn метка,Название кнопки
Интерпретатором создается кнопка - переход на другую локацию. Пробелы до и после 'Название кнопки' игнорируются.
При наличии локации common
сначала выполняются операторы на локации common
, потом осуществляется переход на метку «метка».
goto метка
После выполнения оператора goto
метка происходит мгновенное перемещение на указанную метку.
При наличии локации common
операторы на локации common
при переходе по goto
НЕ ВЫПОЛНЯЮТСЯ.
Формат:
[[текст ссылки|название локации]]
Пример:
pln текст [[текст|метка]].
Локацию можно использовать как подпрограмму, осуществив переход на неё с помощью оператора proc
.
:функция001 p 2 end :метка p 1 proc функция001 p 3 end ; 123
Нормально обрабатываются последовательные переходы по proc
- цепочка ведется до тех пор, пока не встретится первый end
. При этом кнопки и сообщения во всех пройденных локациях накапливаются, но при обнаружении end
'а происходит не опрос пользователя, а возврат к предыдущему proc
'у и так до самого начала цепочки.
При наличии локации
common
операторы на локации common
при переходе по proc
НЕ ВЫПОЛНЯЮТСЯ и системная переменная current_loc
не меняется.
p
просто добавляет новый текст p текст
pln
добавляет текст и делает переход на новую строку (создает абзац). Работает даже без текста. pln текст
cls
– очищает экран ото всяческой информации.clsb
– btn
Input x
instr X= input X
Разница в том, что мы вначале инициализируем пустую текстовую переменную X.
Если переменная не создана, то при обращении к ней она равна нулю. Вся работа с переменными должна осуществляться внутри локаций.
Имя числовой переменной подчиняется общим требованиям к строке, но лучше не использовать других знаков, кроме букв русского или латинского алфавита, знака подчеркивания, цифр.
Нельзя использовать ключевые слова типа if, then, not, and, or
и др., так как в выражениях такие имена будут распознаваться как ключевые слова.
Для строки допустимы пробелы и практически любые символы, кроме: #
$
,
;
/*
*/
&
числовые | текстовые | инвентарь | |
---|---|---|---|
Объявление | имя=42 | instr имя="текст" | — |
Использование | имя=имя+1 имя=имя-1 имя=3 | — | inv+ 1,имя inv- 1,имя inv_имя=3 |
Вывод | #имя$ p #имя$ | #%имя$ p #%имя$ | #inv_имя$ p #inv_имя$ |
Процесс обработки строки идет слева направо. Ищется пара #
и $
, их содержимое обрабатывается и строка обрабатывается снова, до тех пор, пока не кончатся #
.
#$
– вывод символа пробела#/$
– вывод символа переноса строки##ascii-код$
– вывода символа по ascii-кодуperkill
– уничтожает все переменныеВ порядке возрастания приоритета:
not, унарные + и - , *, /, +, -, <, <=, [n] предмет, >, >=, = (==), <>, and, or, скобки ( )
Пример:
pln #5*((2<3)and(3<4))+2$ ; выдаст 7
Возможно сравнение
if <стр1>=<стр2> if <стр1>="текст" if <стр1>=="текст" ; оператор неточного сравнения.
Работает так:
instr k= ;Внимание: '=' после instr k pln Напишите направление: input k if k=="*север*" then pln Белые медведи else pln Где-где?
В данном примере, распознаются по условию then
фразы «идти на север», «север», «3,14север-юг» и даже «куда угодно, только не на север!»
Возможно и распознавание целой фразы
if k=="*идти*север*" then pln Белые медведи else pln Где-где?
Распознает фразы «идти на север», «идти в северном направлении» (и ошибается на «идти подальше от всех северных медведей!») Кавычки обязательны, так как они в операторе if then
служат для формирования из строки текста - текстовой переменной.
Кроме символа *
заменяющего произвольное количество других символов (в том числе и их отсутствие) возможно применение символа ?
, который заменяет ОДИН произвольный символ (или его отсутствие).
instr k= pln Оружие input k if k=="меч?" then pln Меч! else pln Пусто.
Распознает и «меч» и «мечи» и ‘не распознает’ «мечту легионера - М-16»
invkill
– без параметров удаляет все предметы из инвентаря.invkill предмет
– удаляет «предмет» из инвентаря.inv+
– помещает предмет в инвентарь. Можно использовать с указанием количества. Inv+ [Количество,]Предмет
inv-
– удаляет предмет из инвентаря. Можно использовать с указанием количества. Inv- [Количество,]Предмет
Примеры:
inv+ 10,Рублей if Рублей then pln У тебя есть деньги! else pln Так денег-то нет! if inv_Рублей>5 then pln У тебя больше 5 рублей! if 5 Рублей then pln У тебя 5 рублей или больше!
Специальные метки вида :use_<предмет>
и :use_<предмет>_<действие>
указывают на описания действий (по умолчанию — «осмотреть предмет») по отношению к предмету.
:Use_Inv ; действие Инвентарь/Осмотреть :Use_Inv_действие1 ; действие Инвентарь/действие1 :Use_предмет1 ; действие предмет1/Осмотреть :Use_предмет1_действие1 ; действие предмет1/действие1
Используя #$
и #%$
легко организовать работу с массивами.
Массив – это множество переменных, имеющих кроме имени еще и число-индекс, например a1,a2,a3
и т.д.
Для двух-, трех-, n-мерных массивов нужно просто 2,3,n
индексов разделенных каким-либо разделителем, например a1_1, клетка2|5, кубик4x67y0z
.
Вывод значений таких переменных - элементов массива осуществляется при помощи #$
:
кубик4x67y0z=56 x=4 y=67 z=0 pln Ответ: #кубик#x$x#y$y#z$z$. ; Ответ: 56.
Условный оператор if <условие> then …
позволяет, в числе прочего, проверять наличие и/или количество чего-либо в инвентаре.
If Условие then Действия if Условие then Действия1 else Действия2
Если выполняется Условие, то производятся Действия. Действия - несколько операторов в одной строке, разделенных &. Пример:
if 1=1 then p текст1 & p текст2 else p текст3 & p текст4
and
– логическое «и».or
– логическое «или».not
– логическое «нет».quit
– оператор немедленного выхода из квеста.tokens
– разложение строки на «токены», то есть куски текста, отделенные друг от друга разделителями.==
(два знака равно) – оператор неточного сравнения. Дает истину при сравнении текстовой переменной со строкой по правилам сравнения регулярных выражений, т.е. с учетом *
и ?
Циклы реализованы посредством рекурсии5).
i=0 imax=25 ;Инициализация счетчика цикла :loop1 ;Метка - начало цикла i=i+1 ;Увеличение счетчика на 1 if i<imax then p #i$#$&goto loop1 else pln #/$Конец цикла! ; "страшное" выражение
Применяйте разные названия меток начала циклов.
if i<imax
проверяется, что i пока меньше imax, то есть 25
then p #i$#$&goto loop1
если да, то печатаем значение числовой переменной i (#i\$), потом пробел (#\$), потом разделитель операторов & и переход goto на метку loop1, после которой снова увеличивается i и опять всё по кругу, пока значение переменной i не достигнет 25. Тогда сработает ветка
else pln #/$Конец цикла!
печатает перенос строки (#/$) и фразу «Конец цикла!»
&
– конкатекация или объединение команд.save
– имя_квеста.qsv
текущие значения переменных и предметы инвентаря, чтобы потом можно было этот квест с сохраненного места продолжить. save game-tower
gametitle = "Текст в заголовке"
Rnd[x]
- системная переменная (только для чтения) которая при пустом значении x хранит в себе случайное значение от 0 до 1, включая 1, а при целом x (к примеру, X=6) выдает выдает целые значения (от 1 до 6 включительно в нашем случае).
При каждом обращении к переменной она принимает другое значение.
случай1=rnd ;Переменная случай1 может быть равна 0.78 - справедливо для URQ_DOS случай2=rnd4 ;Переменная случай2 может быть равна 3
Но вот одна неувязочка: В URQ выводятся на экран целые числа, а URQ_DOS - десятичные дроби с сотыми долями.
Переменная Time теоретически хранит число секунд прошедших с полуночи.
pause <время>
– прекращение выполнения инструкций на <время> в миллисекундах (1 миллисекунда=1/1000 доли секунды), причем пользователь в это время может выбирать варианты с помощью кнопок выбора и квест будет работать дальше, но по истечении <время> выполнение квеста продолжиться, одновременно двух работающих «pause» не может быть, новая затирает старую - движок о ней «забывает», забывает также он о паузе при нажатии кнопки действия.
pause 3000 ;Пауза на 3 секунды
anykey [числовая_переменная]
– оператор останавливает выполнение квеста до нажатия любой клавиши на клавиатуре, значение ASCII кода клавиши заносится в переменную «числовая_переменная» и может быть использовано впоследствии.
При помощи этого оператора можно попытаться реализовать простейшую текстовую аркаду!
Системная переменная current_loc
— указывает на текущую локацию.
С оформлением проблемы. У многих программ разные требования и возможности.
Есть вывод изображения, которая должна работать (кроме URQ_DOS).
imagetype
– тип изображения. image
– имя файла без расширения и пути. В локации нужно написать:
imagetype=6 image=1 ; Будет показан файл 1.jpg
При этом, при переходе в другую локацию, картинка останется. И будет висеть до тех пор, пока не назначить другую.
Можно указать imagetype
в самой первой локации и тогда менять нужно будет только image
.
:image_click ; Вызывается при клике на "основную" картинку pln Клик по картинке end
image [файл]
— выводит указанное изображение
image dir/filename.jpg
;Комментарий :menu-start invkill; Очищаем инвентарь perkill; Очищаем переменные imagetype=6; задаём формат картинок .jpg image=0; Будет показан файл 0.jpg gametitle = "Название игры" pln #%gametitle$ pln btn game-start, Запустить игру end ;proc :2plus2 pln 4 end ; :game-start image=1 proc 2plus2 btn menu-start, Вернуться в меню end