easy.dialog
Краткое описание модуля. Страница вторая
Краткое описание
Конструирование диалога
Конструирование реплик
Каждая реплика, за исключением корневой, должна быть помещена в теги реплики:
-
{:
[$текст]
:}
- для реплик актёра. -
[:
[$текст]
:]
- для реплик героя.
Реплики могут включать в себя следующие элементы:
- текст реплики
- конструкции настроек (
npc="
[$настройки]"
hero="
[$настройки]"
replics="
[$настройки]"
- конструкцию условия вывода реплики (
iffing:
[$условия]:iffing
- конструкцию динамического кода, выполняемого при интерпретации реплики (
dynamic-code:
[$текст]:dynamic-code
- конструкцию блока фраз (
frase-block:
[$текст]:frase-block
- конструкцию для замены имени действия (
act-name:
[$текст]:act-name
- команды
levelup:
[#число]leveljump:
[$метка]closeup
selectact.delete
- тег метки
marker:
[$метка] - комментарий - один или несколько
При этом, всё, кроме текста реплики и комментариев, можно помещать внутри комментариев. Можно и не помещать.
Вышеперечисленные элементы могут отсутствовать в реплике. Если в реплике нет ни одного из вышеперечисленных элементов, механизмы модуля всё равно будут воспринимать её, как обычную реплику, т.е. пытаться интерпретировать.
Реплики могут включать другие реплики, помещённые в теги реплик. На этом построен механизм интерпретации последовательности вложенных реплик.
Комментирование
Для того, чтобы писать комментарии в теле диалога и в его заголовке, была введена конструкция комментариев из html. Комментарии представляют собой запись между открывающим тегом "
" и закрывающим "<!--
". Эти теги так и называются: теги комментария. Название "тег комментария", если не уточняется открывающий или закрывающий, означает тоже самое.-->
Комментарии могут быть как однострочными, так и многострочными.
Отделять содержимое комментария от его тегов следует хотя бы одним пробельным символом или переводом строки.
Нельзя размещать комментарии внтури комментариев. Запись
<!-- текст комментария <!-- текст вложенного комментария --> текст комментария -->
недопустима.
Недопустимо также использовать комментарии между тегами dynamic-code: :dynamic-code
и iffing: :iffing
, поскольку между ними помещается чистый код QSP.
В тегах act-name: :act-name
, в конструкциях блоков фраз, а также в самих фразах комментарии допустимы, поскольку игнорируются html-рендерером QSP-плеера как нормальные html-комментарии.
Все команды и конструкции реплики, кроме фразы, допустимо и желательно помещать в комментарии. Лучше всего - в один. В таких комментариях будет игнорироваться весь текст, помимо текста самих конструкций и настроек.
Внутри конструкций настроек (
, npc="
[$настройки]"
, hero="
[$настройки]"
) допустимо произвольное комментирование без использования тегов комментария. Весь текст, помимо тегов настроек и их значений, будет проигнорирован механизмом извлечения настроек. Необходимо лишь отделять значение тегов от произвольного текста хотя бы одним пробелом, символом перевода строки или табуляции.replics="
[$настройки]"
Если вы включаете в комментарий команду или одиночный тег, озаботьтесь отделить команду, одиночный тег или его значение от тегов комментария хотя бы одним пробелом (табуляцией или переводом строки).
Конструирование настроек
В настоящей версии модуля для настроек предусмотрены три конструкции. Конструкции
и npc="
[$настройки]"
сходны по своему содержанию и используют одинаковые команды и теги. Конструкция hero="
[$настройки]"
предполагает другой набор команд и тегов. Однако правила записи всех треёх конструкций одинаковы.replics="
[$настройки]"
Вместо двойного аппострофа для записи конструкций можно использовать одиночный апостроф:
npc='[$настройки]'
hero='[$настройки]'
replics='[$настройки]'
Между апострофами можно размещать любой текст и количество строк. Весь текст, кроме команд, тегов и их содержимого, будет игнорироваться при извлечении настроек.
Каждую команду, тег и его содержимое нужно отделять от прочего текста хотя бы одним пробелом или переводом строки.
Теги и команды можно располагать в произвольном порядке, это никак не скажется на чтении их содержимого.
Если в тексте настроек два и более раз написан один и тот же тег, используется значение тега, расположенного ближе к началу текста настроек.
Если в тексте настроек не указан какой-либо из тегов, его значением будет считаться значение, полученное от родительской реплики или дефолтное значение. Если это заголовок диалога, значением тега будет принято значение по умолчанию.
Теги настроек и их значения желательно помещать в круглые скобки. Можно в квадратные, угловые и фигурные, но предпочтительней круглые.
Теги и их значения
Значением сдвоенного тега считается весь текст с самого первого символа сразу после открывающего тега, до последнего символа включительно перед закрывающим тегом. В зависимости от назначения тега, пробельные символы и переводы строки в начале значения, будут игнорироваться или напротив - включаться в значение.
Игнорируются все переводы строк и пробельные символы непосредственно после открывающего тега и непосредственно перед закрывающим для:- тегов реплик
{: :}
и[: :]
- тегов
iffing: :iffing
- тегов
dynamic-code: :dynamic-code
- тегов
frase-block: :frase-block
Все переводы строк и пробельные символы сохраняются при получении и обработке значений для:
- тегов
name: :name
- тегов
act-name: :act-name
- тегов
<!-- -->
Это связано всего лишь с методами распознавания содержимого.
Таким образом в качестве значения сдвоенного тега может использоваться абсолютно любой набор символов. Можно включать в значение тега (в зависимости от нужд) переводы строк, пробелы и символы табуляции.
Ни в коем случае нельзя включать одинаковые сдвоенные теги друг в друга. Запись типа
frase-block:
Фраза
frase-block:
фраза фраза фраза
:frase-block
Ещё одна фраза
:frase-block
недопустима.
Значением одиночного тега считается весь текст, начиная с первого символа непосредственно сразу после тега и заканчивая включительно символом, стоящим перед первым встреченным пробельным символом или переводом строки.
Таким образом в одиночные теги можно помещать только непробельные символы.
Однако, если одиночный тег и его содержимое заключены в скобки, причём между открывающей скобкой и тегом нет пробелов и переводов строки, в значении тега можно использовать и пробелы и переводы строки.
Если же одиночный тег и его значение записываются без скобок, они должны отделяться от остального текста хотя бы одним пробелом или переводом строки.
Если одиночный тег помещается в сдвоенный тег и не заключается в скобки, он должен отделяться от тегов сдвоенного тега хотя бы одним пробелом. Запись типа
<!--ncolor:888888-->
недопустима.
Можно использовать запись
<!-- ncolor:888888 -->
или
<!--(nolor:888888)-->
Составление диалогов
Диалоги составляются из реплик актёров и/или героя.
Для чередования реплик - одни реплики вкладываются в другие. Сначала интерпретируется родительская реплика, а потом - все реплики-ответвления, являющиеся её дочерними репликами. При этом реплики актёра интерпретируются полностью, и фразы выводятся автоматически, а реплики героя интерпретируются частично и выводятся в виде действий. Когда игрок выбирает действие, реплика, на которой основано это действие, интерпретируется полностью.
Реплики, которые не содержат фразы, не выводятся на экран, однако их содержимое интерпретируется, как и содержимое реплик, которые содержат фразы.
Список действий при интерпретации реплики обновляется только в том случае, если реплики героя вложены в одну актёрскую реплику.
Если интерпретируется реплика героя, в которую вложена реплика героя, то последняя выводится в виде действия, добавляемого в список без обновления списка действий. Пример:
[:
А если я захочу выбрать вариант вопроса, который исчез?
<!-- действие которое должно удаляться после выбора selectact.delete -->
{:
Весь наш разговор происходит в цикле, как только мы закончим обсуждать текущий вопрос,
мы вернёмся к общему списку вопросов. Если хочешь, ты можешь сделать это прямо сейчас.
:}
[:
<!-- действие, которое должно появиться без очистки списка действий -->
То есть, я могу спросить что-то другое?
{:
Да, конечно, спрашивай, что хочешь.
<!-- leveljump:other_question -->
:}
:]
:]
Как отмечено выше, если не указана фраза реплики, реплика интерпретируется, но на экран ничего не выводится. Эта особенность позволяет создавать скрытые ветки. Для этого ветка размещается в пустой реплике героя. Пустые реплики героя не выводятся в виде действий.
Чтобы пустая реплика героя всё же выводилась на экран в виде действия, название действия следует поместить между тегами act-name: :act-name
.
Все фразы выводятся на экран с сохранением перевода строк. Следует учитывать это при организации диалога.
Значения по умолчанию
Значения по умолчанию - это различные значения переменных настроек оформления и прочего, принимаемые тогда, когда явно заданные значения отсутствуют или ошибочны. Значения по умолчанию вшиты в механизм получения настроек.
Ниже перечислены настройки и значения по умолчанию.
Имя
Указывается между тегами name: :name
по умолчанию, и для актёра и для героя: пустое значение, отсутствует, name::name
.
Цвет имени
Указывается после тега ncolor:
по умолчанию, для актёра: чёрный,
ncolor:
000000
по умолчанию, для героя: серый,
.
ncolor:
888888
Аттрибуты имени
Указывается после тега nattrib:
по умолчанию, для актёра: жирный, nattrib:
-b
по умолчанию, для героя: жирный курсив,
.
nattrib:
-b-i
Цвет фразы
Указывается после тега fcolor:
по умолчанию, для актёра: чёрный,
fcolor:
000000
по умолчанию, для героя: серый,
.
fcolor:
888888
Аттрибуты фразы
Указывается после тега fattrib:
по умолчанию, для актёра: нормальный, fattrib:
по умолчанию, для героя: курсив,
.
fattrib:
-i
Знак мыслеотделительный. Знак перед прямой речью
Указывается после тега tire:
по умолчанию, для актёра и героя: тире отбитое пробелами,
.
tire:
—
Режим повтора ответвлений
Указывается после тега repeat:
по умолчанию (только для актёрских реплик): по-кругу, непрерывное,
.
repeat:
cicle
Режим выбора следующего ответвления
Указывается после тега shuffle:
по умолчанию (только для актёрских реплик): случайным образом,
.
shuffle:
random
Подключение и использование
Файл модуля
поставляется вместе с файлом библиотеки easy.dialog.qsp
и работает только при наличии оного. Для использования модуля и библиотеки, оба файла подключаются к основному файлу игры:easy.math.qsp
addqst 'lib/easy.math.qsp'
addqst 'lib/easy.dialog.qsp'
(в архиве оба файла помещены в папку "lib
". При подключении к игре вместо "lib/
" следует использовать настоящий относительный путь до файлов модуля и библиотеки.)
Желательно включение режима распознавания html-тегов (usehtml
= 1
).
Диалоги для модуля пишутся в виде текстовых констант, или значений текстовых переменных. После чего константа или значение переменной передаются в качестве нулевого аргумента локации
. Вызывать локацию следует через команду dialog.int
:gosub
gosub 'dialog.int', $переменная_диалог
gosub 'dialog.int', '
{:Короткий диалог
[:Короткое действие:]
:}'
При вызове dialog.int
будет очищено основное описание, список действий и дополнительное описание. После того как диалог будет закрыт, и описания и список действий восстановятся.
При интерпретации реплики игнорируется преформатирование (символы пробелов и табуляций перед строками; строки не содержащие непробельных символов до первыой строки, содержащей непробельные символы, и после последней строки, содержащей непробельные символы).