Инструменты пользователя

Инструменты сайта


subjects:programming:urql

URQL

URQL1) – язык, служащий для написания игр на платформе URQ.

URQ2) – «менюшная» платформа предназначенная в основном для создания небольших текстовых игр в жанре Interactive Fiction3). Представляет собой общее название семейства интерпретаторов специализированного языка URQL.

Достоинства и недостатки URQL

Достоинства языка:

  • Простота освоения.
  • Огромное количество примеров в виде уже созданных квестов.
  • Работа с предметами инвентаря.
  • Возможна динамическая генерация фрагментов кода, что позволяет самомодификацию программ.
  • Есть реализации под все основные ОС, включая: MS-DOS4), Windows, Mac, GNU/Linux, Android, iOS и т.п.

Недостатки:

  • Отсутствие многих возможностей обычных языков программирования.
  • Бедная графика.
  • Это очень специализированный язык, предназначенный только для создания «менюшних» текстовых игр.
  • Разная реализация диалектов в разных программах.

Интерпретаторы: 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

Ввод

  • Запрос числа x
    Input x
  • Запрос текста 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

Условный оператор 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 локация_для_восстановления
    save game-tower
  • gametitle = "Текст в заголовке"

Rnd

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

Переменная Time теоретически хранит число секунд прошедших с полуночи.

pause

pause <время> – прекращение выполнения инструкций на <время> в миллисекундах (1 миллисекунда=1/1000 доли секунды), причем пользователь в это время может выбирать варианты с помощью кнопок выбора и квест будет работать дальше, но по истечении <время> выполнение квеста продолжиться, одновременно двух работающих «pause» не может быть, новая затирает старую - движок о ней «забывает», забывает также он о паузе при нажатии кнопки действия.

pause 3000 ;Пауза на 3 секунды

anykey

anykey [числовая_переменная] – оператор останавливает выполнение квеста до нажатия любой клавиши на клавиатуре, значение ASCII кода клавиши заносится в переменную «числовая_переменная» и может быть использовано впоследствии. При помощи этого оператора можно попытаться реализовать простейшую текстовую аркаду!

current_loc

Системная переменная current_loc .

Оформление

С оформлением проблемы. У многих программ разные требования и возможности.

Вывод картинки, классический

Есть вывод изображения, которая работают почти везде (кроме URQ_DOS).

  • imagetype – тип изображения. :!: Задаётся числом.
    • 0 – bmp
    • 1 – ico
    • 2 – rle
    • 3 – wmf
    • 4 – emf
    • 5 – gif (без анимации)
    • 6jpg
  • image – имя файла без расширения и пути. :!: Задаётся числом!

В локации нужно написать:

imagetype=6
image=1
; Будет показан файл 1.jpg

При этом, при переходе в другую локацию, картинка останется. И будет висеть до тех пор, пока не назначить другую.

Можно указать imagetype в самой первой локации и тогда менять нужно будет только image.

Обработчик нажатия

:image_click
	; Вызывается при клике на "основную" картинку  
	pln Клик по картинке
end

Пример простой программы

;Комментарий
: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

Источники

  • Описание URQL для URQ_DOS версии 1.35 от 23.11.2006 года Автор: Korwin (Евгений Туголуков)
  • FireURQ:Руководство_пользователя
  • URQ:Материал из Википедии
  • и т.п.
1) Universal Ripsoft Quest Language
2) Universal RipSoft Quest
3) Интерактивная литература
4) без поддержки картинок
5) см.рекурсия
subjects/programming/urql.txt · Последние изменения: 2017/06/01 20:02 —

На главную страницу Обучение Wikipedia Тестирование Купить Контакты Нашли ошибку? Справка

Записаться на занятия

Ошибка Записаться на занятия к репетитору





закрыть[X]
Наши контакты