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