QSP Уроки

Материал из IFВики
Версия от 21:20, 18 марта 2010; Byte (обсуждение | вклад) (Обновление описания функции RGB)
Перейти к навигации Перейти к поиску

Вводное слово, Комментарии

QSP - программа для игры в текстовые квесты специального формата. Для того, чтобы написать свой текстовый квест, вам понадобится любой текстовый редактор и программа TXT2GAM. Для более удобного использования этой программы я написал специальную оболочку GAMConv, которой вы можете пользоваться для конвертирования кода уроков.
В примерах будут использоваться комментарии - строки, которые игрок не увидит и которые служат для того, чтобы можно было делать в коде игры различные заметки. Комментарий начинается с восклицательного знака «!».

Пример:

! эта строка видна только создателю квеста, игрок её не увидит

Урок 1. Локации, Действия, Переходы

Текстовый квест в QSP состоит из отдельных локаций, на которых могут выполняться различные игровые действия. Каждая локация имеет начало (тут же указывается имя локации), код локации (середину) и конец (знак «-», минус).

Пример:

#Имя_локации
! тут идёт код локации
-

Проигрывание квеста начинается с самой первой локации. Традиционно эта локация называется "Начало". Для того, чтобы вывести в игре текст, вы просто пишете строку в коде локации, заключённую в кавычки («'» или «"»).

Пример (1.txt):

#Начало
'Привет мир!'
-

Сохраните эти строки в текстовый файл, отконвертируйте с помощью GamConv и откройте получившийся квест в QSPGUI. В основном окне вы должны увидеть текст «Привет мир!».
Но это совсем не похоже на текстовый квест. Ведь если мы будем просто выводить текст, то у нас получится какая-то книга, а не игра.
Игра - это прежде всего интерактивность. От этого и название жанра Интерактивная Литература. Чтобы добавить интерактивность давайте сделаем вторую локацию и дадим возможность игроку перейти из одной локации в другую. Для этого нужно создать на первой локации действие, которое будет осуществлять переход в другую локацию.

Пример (2.txt):

#Начало
'Привет мир!'
ACT 'Перейти в другую локацию':
	GOTO 'Вторая_локация'
END
-
#Вторая_локация
'Вы только что совершили переход в другую локацию.'
'Этот текст начинается с новой строки.'
ACT 'Вернуться обратно':GOTO 'Начало'
-

Вторая локация создаётся точно так же, как и первая. Как можно заметить, действие создаётся командой «ACT», после которой идёт название действия в виде строки, заключённой в кавычки и двоеточие. После двоеточия пишутся инструкции, которые игра выполнит после того, как игрок попытается выполнить действие. А после инструкций ставится команда «END», которая означает конец действия. Если инструкция одна, то мы можем писать её сразу после двоеточия, на той же строке, в этом случае «END» ставить не обязательно (см. Вторая_локация). В нашем случае инструкциями является переход на другую локацию. Он осуществляется командой «GOTO», после которой идёт имя новой локации, заключённой в кавычки.
Как вы уже заметили, все строки в QSP заключены в кавычки («'» или «"»), это специфика синтаксиса, которую необходимо соблюдать.
Отконвертировав этот пример, вы сможете походить по двум локациям.
Это основа всех квестов на QSP. Дальше мы попробуем неспеша сделать небольшой квест, в каждом новом уроке добавляя ему новые элементы, пока не охватим все возможности QSP.

Урок 2. Переменные, Условия

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

Пример (3.txt):

#Начало
'   Ваша цель - зарабатывать деньги, покупать на них подарки и дарить своим близким.'
ACT 'Начать игру':GOTO 'Дом'
-
#Работа
'   Порт находится на самой южной окраине города. Здесь постоянно загружаются и разгружаются различные суда. Рабочих рук не хватает и складской бригадир всегда рад заплатить деньги за помощь.'
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в магазин':GOTO 'Магазин'
-
#Магазин
'   Магазин небольшой, но тут обычно есть всё, что нужно простому горожанину. Витрины заставлены различными товарами. У кассы стоит полная женщина и хмуро смотрит на вас.'
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в порт':GOTO 'Работа'
-
#Дом
'   Дома всегда очень уютно. И вкусно пахнет едой. Мама, сидя в кресле, вяжет носки. Отец с вашим братом чинит скворечник. Сестра хлопочет на кухне. Дома всегда хорошо.'
ACT 'Идти в порт':GOTO 'Работа'
ACT 'Идти в магазин':GOTO 'Магазин'
-

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

Пример:

Имя_переменной = 10

Сам механизм зарабатывания денег будет у нас очень простым. Нужно будет перенести 3 ящика и тогда бригадир будет давать игроку 5 монет. Для этого нужно будет сделать ещё одну переменную, в которой будет указано число перенесённых игроком ящиков и если их 3, то добавлять игроку деньги, и очищать счётчик ящиков. Наш квест станет таким:

Пример (4.txt):

#Начало
'   Ваша цель - зарабатывать деньги, покупать на них подарки и дарить своим близким.'
ACT 'Начать игру':GOTO 'Дом'
-
#Работа
'   Порт находится на самой южной окраине города. Здесь постоянно загружаются и разгружаются различные суда. Рабочих рук не хватает и складской бригадир всегда рад заплатить деньги за помощь.'
'   У вас <<Деньги>> монет.'
'   Вам нужно перенести <<3-Ящик>> ящика.'
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в магазин':GOTO 'Магазин'
ACT 'Перенести ящик':
	Ящик = Ящик + 1
	IF Ящик = 3:
		Деньги = Деньги + 5
		Ящик = 0
	END
	GOTO 'Работа'
END
-
#Магазин
'   Магазин небольшой, но тут обычно есть всё, что нужно простому горожанину. Витрины заставлены различными товарами. У кассы стоит полная женщина и хмуро смотрит на вас.'
'   У вас <<Деньги>> монет.'
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в порт':GOTO 'Работа'
-
#Дом
'   Дома всегда очень уютно. И вкусно пахнет едой. Мама, сидя в кресле, вяжет носки. Отец с вашим братом чинит скворечник. Сестра хлопочет на кухне. Дома всегда хорошо.'
'   У вас <<Деньги>> монет.'
ACT 'Идти в порт':GOTO 'Работа'
ACT 'Идти в магазин':GOTO 'Магазин'
-

Для того, чтобы в тексте локации вывести значение переменной используется конструкция «'<<Имя_переменной>>'». Таким образом мы изменили все локации, чтобы на них выводилось количество монет у игрока. К тому же, в локации «Порт» показывается количество ящиков, которое нужно перенести, чтобы получить деньги. Условия в QSP задаются командой «IF», после которой идёт само условие и ставится двоеточие. Затем идут инструкции, которые выполнятся, если условие верное и ставится команда «END», которая завершает условие. В нашем случае мы проверяем, равна ли переменная «Ящик» трём. Если равна, то мы увеличиваем переменную «Деньги» на пять и приравниваем переменную «Ящик» к нулю, чтобы можно было заново таскать ящики и зарабатывать деньги. Чтобы текст игры обновился и игрок увидел новые значения переменных, нужно перейти на ту же локацию. Отконвертируйте и запустите пример, теперь игрок сможет зарабатывать деньги переноской ящиков.

Урок 3. Инвентарь

Теперь нам нужно добавить игроку возможность покупать различные предметы в магазине и затем дарить. Для предметов очень хорошо подходит Инвентарь. Теперь купленные предметы игрок сможет носить с собой и дарить своим близким, когда захочет.
Чтобы добавить предмет в инвентарь, есть команда «ADDOBJ», после которой идёт имя предмета. А для того, чтобы удалить предмет, есть команда «DELOBJ», после которой также идёт имя предмета, который мы хотим удалить.

Пример (5.txt):

#Начало
'   Ваша цель - зарабатывать деньги, покупать на них подарки и дарить своим близким.'
ACT 'Начать игру':GOTO 'Дом'
-
#Работа
'   Порт находится на самой южной окраине города. Здесь постоянно загружаются и разгружаются различные суда. Рабочих рук не хватает и складской бригадир всегда рад заплатить деньги за помощь.'
'   У вас <<Деньги>> монет.'
'   Вам нужно перенести <<3-Ящик>> ящика.'
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в магазин':GOTO 'Магазин'
ACT 'Перенести ящик':
	Ящик = Ящик + 1
	IF Ящик = 3:
		Деньги = Деньги + 5
		Ящик = 0
	END
	GOTO 'Работа'
END
-
#Магазин
'   Магазин небольшой, но тут обычно есть всё, что нужно простому горожанину. Витрины заставлены различными товарами. У кассы стоит полная женщина и хмуро смотрит на вас.'
'   У вас <<Деньги>> монет.'
IF Деньги >= 3:
	ACT 'Купить конструктор':
		Деньги = Деньги - 3
		ADDOBJ 'Конструктор'
		GOTO 'Магазин'
	END
END
IF Деньги >= 5:
	ACT 'Купить плюшевого медведя':
		Деньги = Деньги - 5
		ADDOBJ 'Плюшевый медведь'
		GOTO 'Магазин'
	END
	ACT 'Купить вязальный набор':
		Деньги = Деньги - 5
		ADDOBJ 'Вязальный набор'
		GOTO 'Магазин'
	END
END
IF Деньги >= 7:
	ACT 'Купить инструменты':
		Деньги = Деньги - 7
		ADDOBJ 'Инструменты'
		GOTO 'Магазин'
	END
END
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в порт':GOTO 'Работа'
-
#Дом
'   Дома всегда очень уютно. И вкусно пахнет едой. Мама, сидя в кресле, вяжет носки. Отец с вашим братом чинит скворечник. Сестра хлопочет на кухне. Дома всегда хорошо.'
'   У вас <<Деньги>> монет.'
ACT 'Идти в порт':GOTO 'Работа'
ACT 'Идти в магазин':GOTO 'Магазин'
-

С помощью условий мы заранее проверяем, есть ли у игрока достаточно денег, чтобы купить тот или иной предмет. И если денег хватает - добавляем действие покупки этого предмета. Когда игрок выбирает действие купить что-либо, мы забираем у него монеты, добавляем в его инвентарь предмет и делаем переход на ту же локацию («Магазин»), чтобы количество денег пересчиталось.
Следующим важным моментом будет механизм "дарения" предметов. Он будет реализован в локации «Дом».

Пример (6.txt):

#Начало
'   Ваша цель - зарабатывать деньги, покупать на них подарки и дарить своим близким.'
ACT 'Начать игру':GOTO 'Дом'
-
#Работа
'   Порт находится на самой южной окраине города. Здесь постоянно загружаются и разгружаются различные суда. Рабочих рук не хватает и складской бригадир всегда рад заплатить деньги за помощь.'
'   У вас <<Деньги>> монет.'
'   Вам нужно перенести <<3-Ящик>> ящика.'
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в магазин':GOTO 'Магазин'
ACT 'Перенести ящик':
	Ящик = Ящик + 1
	IF Ящик = 3:
		Деньги = Деньги + 5
		Ящик = 0
	END
	GOTO 'Работа'
END
-
#Магазин
'   Магазин небольшой, но тут обычно есть всё, что нужно простому горожанину. Витрины заставлены различными товарами. У кассы стоит полная женщина и хмуро смотрит на вас.'
'   У вас <<Деньги>> монет.'
IF Деньги >= 3:
	ACT 'Купить конструктор':
		Деньги = Деньги - 3
		ADDOBJ 'Конструктор'
		GOTO 'Магазин'
	END
END
IF Деньги >= 5:
	ACT 'Купить плюшевого медведя':
		Деньги = Деньги - 5
		ADDOBJ 'Плюшевый медведь'
		GOTO 'Магазин'
	END
	ACT 'Купить вязальный набор':
		Деньги = Деньги - 5
		ADDOBJ 'Вязальный набор'
		GOTO 'Магазин'
	END
END
IF Деньги >= 7:
	ACT 'Купить инструменты':
		Деньги = Деньги - 7
		ADDOBJ 'Инструменты'
		GOTO 'Магазин'
	END
END
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в порт':GOTO 'Работа'
-
#Дом
'   Дома всегда очень уютно. И вкусно пахнет едой. Мама, сидя в кресле, вяжет носки. Отец с вашим братом чинит скворечник. Сестра хлопочет на кухне. Дома всегда хорошо.'
'   У вас <<Деньги>> монет.'
IF OBJ 'Конструктор':
	ACT 'Подарить конструктор брату':
		DELOBJ 'Конструктор'
		' - Вот тебе конструктор.'
		' - Спасибо, брат.'
		DELACT 'Подарить конструктор брату'
	END
END
IF OBJ 'Плюшевый медведь':
	ACT 'Подарить медведя сестре':
		DELOBJ 'Плюшевый медведь'
		' - Вот тебе плюшевый медведь.'
		' - Спасибо, брат.'
		DELACT 'Подарить медведя сестре'
	END
END
IF OBJ 'Вязальный набор':
	ACT 'Подарить набор маме':
		DELOBJ 'Вязальный набор'
		' - Вот тебе вязальный набор.'
		' - Спасибо, сынок.'
		DELACT 'Подарить набор маме'
	END
END
IF OBJ 'Инструменты':
	ACT 'Подарить инструменты отцу':
		DELOBJ 'Инструменты'
		' - Вот тебе инструменты.'
		' - Спасибо, сын.'
		DELACT 'Подарить инструменты отцу'
	END
END
ACT 'Идти в порт':GOTO 'Работа'
ACT 'Идти в магазин':GOTO 'Магазин'
-

Конструкция «IF OBJ 'имя_предмета'» проверяет, есть ли у игрока в инвентаре указанный предмет. В нашем случае мы проверяем наличие тех предметов, которые мы можем купить в магазине. И если у игрока есть такие предметы - создаём действие «дарения» этих предметов. Когда игрок совершит действие, мы заберем у него тот предмет, который он хочет подарить и выводим диалог благодарности за подарок. К тому же, мы используем команду «DELACT», которой удаляем действие, указанное после этой команды.

Урок 4. Настройки, Форматирование

В этом уроке мы рассмотрим, как сделать наш квест более привлекательным. В первую очередь следует настроить интерфейс так, чтобы в нём не оставалось ничего лишнего, отвлекающего от игры. Если вы сейчас запустите наш пример, то увидите, что мы не используем "поле дополнительного описания" (справа внизу) и "командную строку" (внизу). Чтобы они нам не мешали, их нужно отключить. Делается это следующим образом:

Пример (7.txt):

#Начало
SHOWSTAT 0
SHOWINPUT 0
-

Мы передаём в функцию «SHOWSTAT» значение 0 для того, чтобы отключить "поле дополнительного описания". Если бы мы передали что-либо отличное от 0, то поле было бы видимым. То же самое и с «SHOWINPUT». Так же мы можем отключить инвентарь - «SHOWOBJS», и список действий - «SHOWACTS».

Теперь нам нужно сделать так, чтобы наш текст был более подходящим для нашего квеста. Для этого есть 4 переменные.

Пример (8.txt):

#Начало
BCOLOR = RGB(0, 0, 0)
FCOLOR = RGB(255, 0, 0)
FSIZE = 14
$FNAME = 'Arial'
'Этот текст написан красным цветом, четырнадцатым размером и шрифтом Arial на чёрном фоне.'
-

Цвет в QSP задаётся с помощью функции «RGB», в которую мы передаём значения его отдельных компонент - красного (Red), зелёного (Green) и синего (Blue). Отсюда и название функции.
Если вы не знакомы с таким способом задания цветов, то вам может помочь программа MS Paint, которая входит в стандартную поставку Windows. Для этого запустите программу, щёлкните два раза по любому цвету в палитре (внизу) и затем нажмите кнопку "Определить цвет". Появится расширенная палитра, на которой можно выбрать нужный вам цвет. Под палитрой снизу будет 3 поля (Красный, Зелёный, Синий), значениями из этих полей вам и нужно заполнить функцию RGB.
Переменная «BCOLOR» устанавливает цвет заднего фона, «FCOLOR» - цвет текста.
Следует учесть, что если присвоить переменной цвета значение 0 (к примеру, «BCOLOR = 0»), то проигрыватель квестов заменит указанный цвет на цвет из настроек самого плеера.
Чтобы изменить размер текста, используется переменная «FSIZE», шрифт текста задётся строковой переменной «$FNAME».

Многие игроки не любят, когда автор задаёт свои визуальные параметры для текстовых квестов. "На вкус и цвет фломастеры разные", кто-то привык читать зелёные буквы на чёрном фоне, а кто-то предпочитает классический вариант чёрного на белом. У кого-то большой монитор - маленькие буквы читать на нём неудобно и т.д. Проигрыватель квестов QSP позволяет настроить такие параметры индивидуально для каждого игрока, но только в том случае, если автор игры не заменил их на свои. Поэтому я рекомендовал бы вам не менять эти настройки для вашего квеста.

Есть ещё один, наилучший, на мой взгляд, способ сделать ваш текст внешне более привлекательным. Использование HTML. Язык гипертекстовой разметки документов очень хорошо подходит для этой цели. С помощью него можно не только задавать цвет, размер и шрифт текста, но и делать это для отдельных слов, фраз или даже букв, а так же позиционировать текст на экране. Например, можно расположить заголовки по-центру строки, или справа. Для этого нужно переменной USEHTML задать значение, отличное от 0, например 1. В следующем примере я приведу лишь небольшую часть возможностей, которых, впрочем, будет достаточно для оформления игры.

Пример (9.txt):

#Начало
USEHTML=1
BCOLOR = RGB(255, 255, 255)
'<center><font size="20" color="#FF0000" face="Times New Roman"><b>Текстовый квест</b></font></center><br>'
'   <b>Ваша цель</b> - зарабатывать <i>деньги</i>, покупать на них <i>подарки</i> и дарить своим <i>близким</i>.'
ACT '<b>Начать игру</b>':GOTO 'Дом'
-
#Работа
'<center><b>Порт</b></center><br>'
'   Порт находится на самой южной окраине города. Здесь постоянно загружаются и разгружаются различные суда. Рабочих рук не хватает и складской бригадир всегда рад заплатить <i>деньги</i> за помощь.'
'   У вас <font size="16"><b><<Деньги>></b></font> монет.'
'   Вам нужно перенести <font size="16" color="#00AA00"><b><<3-Ящик>></b></font> ящика.'
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в магазин':GOTO 'Магазин'
ACT 'Перенести ящик':
	Ящик = Ящик + 1
	IF Ящик = 3:
		Деньги = Деньги + 5
		Ящик = 0
	END
	GOTO 'Работа'
END
-
#Магазин
'<center><b>Магазин</b></center><br>'
'   Магазин небольшой, но тут обычно есть всё, что нужно простому горожанину. Витрины заставлены различными товарами. У кассы стоит полная женщина и хмуро смотрит на вас.'
'   У вас <font size="16"><b><<Деньги>></b></font> монет.'
IF Деньги >= 3:
	ACT 'Купить конструктор':
		Деньги = Деньги - 3
		ADDOBJ 'Конструктор'
		GOTO 'Магазин'
	END
END
IF Деньги >= 5:
	ACT 'Купить плюшевого медведя':
		Деньги = Деньги - 5
		ADDOBJ 'Плюшевый медведь'
		GOTO 'Магазин'
	END
	ACT 'Купить вязальный набор':
		Деньги = Деньги - 5
		ADDOBJ 'Вязальный набор'
		GOTO 'Магазин'
	END
END
IF Деньги >= 7:
	ACT 'Купить инструменты':
		Деньги = Деньги - 7
		ADDOBJ 'Инструменты'
		GOTO 'Магазин'
	END
END
ACT 'Идти домой':GOTO 'Дом'
ACT 'Идти в порт':GOTO 'Работа'
-
#Дом
'<center><b>Дом</b></center><br>'
'   Дома всегда очень уютно. И вкусно пахнет едой. Мама, сидя в кресле, вяжет носки. Отец с вашим братом чинит скворечник. Сестра хлопочет на кухне. Дома всегда хорошо.'
'   У вас <font size="16"><b><<Деньги>></b></font> монет.'
IF OBJ 'Конструктор':
	ACT 'Подарить конструктор брату':
		DELOBJ 'Конструктор'
		' - Вот тебе конструктор.'
		' - Спасибо, брат.'
		DELACT 'Подарить конструктор брату'
	END
END
IF OBJ 'Плюшевый медведь':
	ACT 'Подарить медведя сестре':
		DELOBJ 'Плюшевый медведь'
		' - Вот тебе плюшевый медведь.'
		' - Спасибо, брат.'
		DELACT 'Подарить медведя сестре'
	END
END
IF OBJ 'Вязальный набор':
	ACT 'Подарить набор маме':
		DELOBJ 'Вязальный набор'
		' - Вот тебе вязальный набор.'
		' - Спасибо, сынок.'
		DELACT 'Подарить набор маме'
	END
END
IF OBJ 'Инструменты':
	ACT 'Подарить инструменты отцу':
		DELOBJ 'Инструменты'
		' - Вот тебе инструменты.'
		' - Спасибо, сын.'
		DELACT 'Подарить инструменты отцу'
	END
END
ACT 'Идти в порт':GOTO 'Работа'
ACT 'Идти в магазин':GOTO 'Магазин'
-

Продолжение следует...