QSP Уроки

Материал из IFВики
Версия от 00:56, 28 января 2008; Elmortem (обсуждение | вклад) (нифига не помогает указание ширины для тега PRE)
Перейти к навигации Перейти к поиску

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

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

Пример:

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

О других применениях комментариев смотрите в Уроке 5.

Урок 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», которой удаляем действие, указанное после этой команды.


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