easy.dialog
Подробное руководство по использованию модуля, с примерами. Страница первая
Подключение
Предполагается, что вы уже пробовали писать игры на QSP, знаете основные команды и, возможно, знаете, что такое функции, переменные и массивы и как формируется html-форматирование. Впрочем, можно обойтись и без последнего.
Модуль поставляется в комплекте с библиотекой easy.math.qsp и без неё работать не будет.
Чтобы подключить модуль к своей игре, нужно:
- Скачать архив и извлечь его содержимое в папку с вашей игрой. В папке с вашей игрой должна появиться папка "lib".
- После знакомства с примерами файл "
game.easy.dialog.qsp
" можно удалить.
- После знакомства с примерами файл "
- Проверить в папке "lib" наличие файлов "
easy.dialog.qsp
" и "easy.math.qsp
". - Открыть файл своей игры (например с помощью QGen) и на самой первой локации ввести две строки:
addqst 'lib/easy.dialog.qsp'
addqst 'lib/easy.math.qsp' - Сохранить свою игру.
Теперь при запуске вашей игры, модуль "easy.dialog" и библиотека "easy.math" будут подключаться к игре автоматически.
Внимание!!! При подключении библиотек к своей игре будьте внимательны. К игре добавляются только те локации, названия которых отсутствуют в вашей игре. Просмотрите список локаций в подключаемых библиотеках, чтобы предупредить совпадения имён.
Простые диалоги
Чтобы использовать модуль, нужно знать, как написать диалог, чтобы модуль вас понял.
Диалоги пишутся предельно просто и не требуют специальных знаний, кроме тех, которые Вы получите сейчас.
Диалог - это разговор, как правило, двух персонажей. В игре один персонаж - это герой, которым управляет игрок, другой персонаж - неиграбельный, т.е. игрок условно не может им управлять. Персонаж игрока мы будем называть героем, а персонаж, с которым герой вступает в диалог, просто персонажем, актёром, или неписью (от англ. NPC - non-playable character).
Фразы, доступные игроку (и соответственно герою), должны выводиться в виде списка действий, доступных для выбора и выполнения. А фразы актёра должны выводиться непосредственно на экран автоматически. Собственно это все различия между одним типом фраз и другим.
Итак, у нас есть фразы NPC, которые выводятся автоматически, и фразы героя, которые появляются в виде действий и не используются в диалоге, пока игрок не выберет одну из них. Оба типа фраз помещаются между специальными метками. Я называю их тегами.
{: Фраза, которую будет произносить неиграбельный персонаж :}
— фигурная скобка, двоеточие, потом идёт реплика персонажа, потом двоеточие и снова фигурная скобка. "{:
" - открывающий тег. ":}
" - закрывающий тег. Всё, что произносит актёр, помещаем между такими тегами. Каждая отдельная фраза должна помещаться между тегами. Например:
{: Сегодня прекрасная погода. :}
{: Не думал я, что будет дождь! :}
{: На город набегают тучи, осенний сплин кого-то мучит... :}
[: Фраза, которая превратится в действие, а когда игрок выберет действие, станет репликой в диалоге. :]
— квадратная скобка, двоеточие, потом идёт реплика героя, снова двоеточие, квадратная скобка. "[:
" - открывающий тег, ":]
" - закрывающий тег. Всё, что может сказать герой, помещаем между такими тегами. Опять же, каждая отдельная фраза - в отдельных тегах. И каждая такая фраза будет выведена одним действием.
Фразы героя и актёра можно располагать одна в другой, или несколько в одной. Мало того, можно располагать фразы одного типа друг в друге.
Зачем это нужно? А вот зачем: диалог собирается и распознаётся по принципу вопрос-ответ. Допустим, реплика актёра - это вопрос, а реплика героя должна быть ответом на вопрос. Но игроку можно предложить несколько вариантов ответов на вопрос. Чтобы написать такой простой диалог: вопрос и несколько ответов, - делаем так:
Первым делом пишем вопрос. Например, непись должна спросить героя "Как тебя зовут?". Пишем:
{: Как тебя зовут? :}
А теперь ответы на вопрос "вкладываем" в вопрос:
{: Как тебя зовут?
[:Вася:]
[:Петя:]
[:Не твоё дело!:]
[:Я забыл...:]
:}
На экран выведется реплика актёра "Как тебя зовут?" и четыре действия. При щелчке на любом из действий, герой будет произносить фразу, написанную в этих репликах. Например, если игрок выберет действие "Я забыл...", на экран выведется фраза героя "Я забыл...".
Как сделать так, чтобы по щелчку на действии произносил фразу не только герой, но и актёр? Всё тем же способом. "Вложить" реплику актёра в реплику героя. Разовьём предыдущий пример:
{: Как тебя зовут?
[:Вася:]
[:Петя:]
[:Не твоё дело!:]
[:А тебя как?
{:Меня Васькой Пупкиным кличут:}
:]
:}
Таким образом, вкладывая реплики друг в друга, вы можете создавать большие ветвистые диалоги. Для примера, вот небольшой ветвистый диалог, на котором отрабатывались первые сборки модуля:
{:
Как вас зовут?
[:
Меня зовут Вася.
{:Вас зовут Вася?
[:Да, меня зовут Вася.
{:да ну нафиг:}
[:
нет. чистая правда
:]
:]
[:Нет, никто меня так не зовёт:]
:}
{:
Это правда, что вас зовут Васей?
[:Правда
:]
[:Неправда:]
:}
:]
[:
Меня зовут Петя.
{:
Вас зовут Петя?
[:Да{:Как это удобно!:}:]
[:
Нет
{:Вас зовут не Петя? Как неудобно!:}
:]
:}
{:
Это правда, что вас зовут Петей?
[:Правда:]
[:Неправда:]
:}
{:Неужели в самом деле Петей Вас зовут?
[:В самом деле:]
[:Нет, не в самом:]
:}
:]
:}
Обратите внимание на то, как записаны фразы, которые должны выводиться на экран в диалоге. Перед ними есть пустые строки, символы пробелов и табуляций. Модуль сам очистит фразы от мусора и уберёт пустые строки перед фразой и после неё, а так же пробельные символы перед каждой строкой и после неё. То есть даже если вы вставите фразу между тегами вот так:
{:
Как вас зовут?
:}
То на экран всё равно будет выведено: "Как вас зовут?" без пробелов перед репликой и пустых строк.
Запуск диалога
Теперь, когда Вы знаете, как составлять диалог, нужно освоить его запуск и уяснить некоторые особенности вывода диалога на экран.
Текст диалога лучше присвоить какой-нибудь переменной. Например:
$диалог_старушки = "{:Добрый вечер, милок.
[:
Здравствуйте, бабуся!
:]
[:
Девушка, мы разве знакомы?
:]
:}"
Далее делаем вызов диалога командой gosub
gosub 'dialog.int', $диалог_старушки
gosub
- это команда обращения к локации. Плеер обращается к локации "dialog.int
", выполнет на ней весь код и возвращается обратно. После запятой стоит переменная $диалог_старушки
, в которую, как вы помните, мы поместили диалог. Значение этой переменной будет передано локации "dialog.int
" для обработки.
При вызове диалога автоматически очистится окно основного описания, окно дополнительного описания и список действий. Когда диалог будет закончен, всё восстановится обратно: и основное и дополнительное описание, и действия даже.