Обучение

Внимание! Предупреждение

Учебник находится в стадии разработки.

Вступление

Здравствуй, путник! Если ты всё-таки решил заглянуть сюда, то ты сделал правильный выбор, ведь ты готов узнать для себя что-то новое, открыть новые возможности... ой, блин, чё меня на лирику-то так тянет? Пора приступать к делу.

Чтобы начать создание игр на QSP, для начала потребуется установить плеер QSP. Выглядит логично. Или запустить плеер онлайн прямо на этом сайте... как только таковой плеер будет готов. Ы.

Учебник будет делиться на акты, в которых я расскажу о том, как устроен QSP и как на нём программировать, а между ними будут лирические отступления, где мы применим полученные знания на практике.

Акт 1. Локации

Из чего состоит любая текстовая игра? Разумеется, из локаций.
Любая текстовая игра, состоит из деталей. Эти детали - локации. Играя, пользователь перемещается по ним, листая их, как страницы в книге. Локации - это страницы Вашего будущего квеста, соединённые между собой переходами.

Чтобы создать локацию, умные люди поместили в QGen кнопку с большим жирным зелёным знаком "плюс". Введите название локации и — вуаля — Ваш первый шаг к шедевру уже сделан.

Вообще, локации — не только "комнаты", по которым перемещается игрок; во всяком случае, QSP таковыми их не рассматривает. Для него локация является безликим куском кода, который выполняется в определённый момент. А это значит, что локации можно использовать для расчётов, операций и для многого чего другого. Придумали даже особый вид локаций: служебные.
Служебными в этом учебнике будут называть локации, которые настроены на выполнение при каком-то действии. К примеру, при выборе предмета в инвентаре, или при загрузке сохранённой игры. Какие служебные локации бывают?

$onnewloc - выполняется при переходе на новую локацию
$onactsel - при выборе игроком действия
$onobjsel - при выборе игроком предмета в инвентаре
$onobjadd - при добавлении предмета в инвентарь
$onobjdel - при удалении предмета из инвентаря
$ongload - при загрузке состояния игры из файла *.sav
$ongsave - при сохранении состояния игры в файл

$counter - вот тут особый случай. Код на этой локации выполняется один раз в определённый промежуток времени (по умолчанию полсекунды, но это значение легко поменять).

О том, как настроить служебные локации, расскажу чуть позже. А пока что...

Акт 2. Операторы

Оператор - это следующая по важности вещь в QSP. Любую вещь (ну хорошо, почти любую) в вашей игре выполняют именно они. Музыка, графика, текст, работа с рюкзаком...

Начнём с начала. Неожиданно, не правда ли?

Чаще всего используемые операторы - *pl и *p. Они предназначены для вывода текста на экран. Отличие *pl от *p в том, что *pl при выводе текста автоматически переходит на новую строку. А *p — не переходит. Из-за того, что некоторые авторы предпочитают использовать *p, их текст превращается в огромное полотно, которое никак не структурировано и просто портит жизнь бедным игрокам. А потому умоляю Вас — используйте *p только тогда, когда это действительно нужно.

Оператор *pl используется так:

*pl 'Ваш текст здесь, сэр'

С *p ситуация аналогичная.

На этом история с выводом текста не заканчивается. У *p и *pl есть браться близнецы — p и pl. Зачем они нужны? Дело в том, что у плеера QSP есть два окна для вывода текста — основное и дополнительное. p и pl выводят текст в дополнительное (это может быть, к примеру, информация о персонаже), а *p и *pl (обратите внимание на звёздочку) — не в дополнительное.
Но и это ещё не всё! Если Вы просто напишете вот так:

'Ваш текст здесь, сэр'

То плеер распознает эту строку так, как если бы Вы написали вот так:

*pl 'Ваш текст ещё и здесь, сэр'

А потому можно было вообще не заморачиваться с этими пиэлями. М-да. И зачем я тут распинался тогда...

Идём далее. Локаций мы понасоздавали, теперь нужно между ними наладить торговлю ой, то есть, пути, по которым будет ходить наш многоуважаемый игрок. Смотрим на клавиатуру и ме-е-едленно набираем две буквы: gt.

gt 'Локация, куда мы хотим попасть'

Собственно, всё. Этот оператор отвечает за переход от одной локации к другой. У gt, как и у pl, тоже есть своя богатая родня, с которой мы познакомимся поближе в одном из следующих разделов.
Если Вы уже попробовали использовать gt — поздравляю, в Вас есть дух прирождённого исследователя. Но что, если нам нужно, чтобы QSP не сам ходил по локациям, а давал возможность сделать это игроку, ради которого тут всё и затевается? Мы же не самоиграйку делаем...
Здесь нам тоже поможет оператор, имя которому act.

act — исключение из всяких правил. В отличие от остальных собратьев, которые не занимают больше одной строки, act записывается... в несколько строк. Что многократно усиливает его могущество, уахахах! Вот простой пример:

act 'Моё действие':
! Когда игрок нажмёт на кнопку, он перейдёт в локацию под названием 'Локация 2'
gt 'Локация 2'
end


act готов принять под своё крыло не только операторы перехода. Есть вот такой пример, в котором act служит для вывода текста:

act 'Взять камень':
'Не выйдет. Камень слишком тяжёлый, чтобы его взять.'
'Можно попробовать позвать на помощь соседа.'
end

Акт 3. Функции

Этот раздел будет коротким, чтобы потом перейти к самому главному!

Функции — это как операторы, только круче. Гораздо круче.

Представьте себе, что Вы на стройке. Операторы будут обычными рабочими, перетаскивающими кирпичи с места на место, а функции будут руководить. В отличие от молчаливых операторов, которые уныло двигают стройматериалы по территории, функции разговорчивы. Они умеют отвечать на вопросы. К примеру, если Вы напишете такой код:

qspver

Вы сделаете запрос к функции, которая ответит вам версией плеера QSP.

Функции весьма часто используются вместе с условиями. О них и поговорим.

Акт 4. Условия

Условия добавляют Вашей игре настоящую интерактивность. С их помощью можно настроить игру так, чтобы в одной ситуации игра показывала игроку одно, а в другой ситуации — другое. При этом игрок, на первый взгляд, совершает одно и то же действие. Ну не круто ли это?

Вот, как использовать условия:

if (условие):
! наш код
end


И вот тут как раз самое время вспомнить о том, что было в акте 3. Функция умеет отвечать нам, так? Так что мешает нам поместить этот ответ в условие и в зависимости от того, что нам ответили, делать нужные нам вещи?

if qspver = "5. 7. 0":
"Вы используете самую последнюю версию плеера QSP."
end


Более того — можно настроить срабатывание, если нам отправили не то, что надо:

if qspver = "5. 7. 0":
"Вы используете самую последнюю версию плеера QSP."
else
"Ваша версия плеера QSP выше или ниже версии 5. 7. 0."
end


А ещё можно запихнуть несколько условий в одно:

if qspver = "5. 7. 0":
"Вы используете самую последнюю версию плеера QSP."
elseif qspver = ""