Вход
Приветствую Вас Гость
 

easy.dialog

Подробное руководство по использованию модуля, с примерами. Страница третья

Чуть более сложные диалоги

Корни, ветви и узлы

Для продолжения нам нужно разобраться в структуре диалогов и договориться о терминологии.

Из предыдущего раздела мы узнали, как пишутся диалоги. Реплики персонажа помещаются между тегами "{:" и ":}", а реплики героя между "[:" и ":]". При этом реплики персонажа должны выводиться на экран автоматически, а реплики героя сначала представать в виде действий. Чтобы соотнести одни реплики с другими, мы научились "вкладывать" одни реплики в другие. Выбор одной из реплик приводит к выводу вложенных реплик, те в свою очередь тянут за собой ещё вложенные реплики и т.д.

Но с чего же модуль начинает? Должна же быть какая-то реплика, с которой начинается вывод всех остальных реплик. Да. Такая реплика есть, хотя до сих пор мы не называли её репликой и не использовали как реплику. Это реплика, которая не включается в теги и собственно вынесена из диалога. В ней прописываются все дефолтные настройки. Она называется корнем диалога, корневой репликой или заголовком диалога. Модуль не применяет к ней никаких настроек форматирования и все прописанные в ней фразы выводятся как есть, без имени персонажа или героя перед ними. Возьмём предпоследний пример и слегка его изменим, чтобы взглянуть на то, как выглядит корень диалога (подсвечен фиолетовым цветом):


 npc="
name:Ведущий:name
ncolor:008888
fcolor:008888
"
hero="
name:Вася Пупкин:name
"
Это заголовок диалога. Его корень. Данные реплики будут выведены
на экран как есть, без применения форматирования из настроек диалога.
Тем не менее символы пробелов и табуляций перед строками, а так же
лишние переводы строк будут удалены.

{:
   Как вас зовут?
   [:

   hero="ncolor:008800"
      Меня зовут Вася.
      {:Вас зовут Вася?
         [:
         npc="fcolor:880000"
         Да, меня зовут Вася.
            {:да ну нафиг:}
            [:
            нет. чистая правда
            :]
         :]
         [:Нет, никто меня так не зовёт:]
      :}
      {:
         Это правда, что вас зовут Васей?
         [:Правда
         :]
         [:Неправда:]
      :}
   :]
   [:
   hero="ncolor:ff0000"
      Меня зовут Петя.
      {:
         Вас зовут Петя?
         [:Да{:Как это удобно!:}:]
         [:
            Нет
            {:Вас зовут не Петя? Как неудобно!:}
         :]
      :}
      {:
         Это правда, что вас зовут Петей?
         [:Правда:]
         [:Неправда:]
      :}
      {:Неужели в самом деле Петей Вас зовут?
         [:В самом деле:]
         [:Нет, не в самом:]
      :}
   :]
:}

Итак, корень - это реплика, которая помещена вне остального диалога, вне тегов, но меж тем в неё "помещены" все остальные реплики. Корень - это реплика, с которой начинается вывод диалога на экран. Естественно, если текст реплики отсутствует, на экран ничего не выводится, даже пустые строки.

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


 npc="
name:Ведущий:name
ncolor:008888
fcolor:008888
"
hero="
name:Вася Пупкин:name
"
Это заголовок диалога. Его корень. Данные реплики будут выведены
на экран как есть, без применения форматирования из настроек диалога.
Тем не менее символы пробелов и табуляций перед строками, а так же
лишние переводы строк будут удалены.

{:
   Как вас зовут?

   [:

   hero="ncolor:008800"
      Меня зовут Вася.
      {:Вас зовут Вася?
         [:
         npc="fcolor:880000"
         Да, меня зовут Вася.
            {:да ну нафиг:}
            [:
            нет. чистая правда
            :]
         :]
         [:Нет, никто меня так не зовёт:]
      :}
      {:
         Это правда, что вас зовут Васей?
         [:Правда
         :]
         [:Неправда:]
      :}
   :]
   [:
   hero="ncolor:ff0000"
      Меня зовут Петя.
      {:
         Вас зовут Петя?
         [:Да{:Как это удобно!:}:]
         [:
            Нет
            {:Вас зовут не Петя? Как неудобно!:}
         :]
      :}
      {:
         Это правда, что вас зовут Петей?
         [:Правда:]
         [:Неправда:]
      :}
      {:Неужели в самом деле Петей Вас зовут?
         [:В самом деле:]
         [:Нет, не в самом:]
      :}
   :]
:}

Распознав тип этой реплики, модуль поймёт, что она должна быть выведена автоматически и повторит ту же процедуру, что проделал с корневой репликой, но на этот раз применит к ней настройки. Т.е. выведет фразу как реплику неписи. Затем он вновь проверит, нет ли в этой реплике вложенных и обнаружит целых две. Каждую из них я выделил отдельным цветом:


 npc="
name:Ведущий:name
ncolor:008888
fcolor:008888
"
hero="
name:Вася Пупкин:name
"
Это заголовок диалога. Его корень. Данные реплики будут выведены
на экран как есть, без применения форматирования из настроек диалога.
Тем не менее символы пробелов и табуляций перед строками, а так же
лишние переводы строк будут удалены.

{:
   Как вас зовут?

   [:hero="ncolor:008800"
      Меня зовут Вася.

      {:Вас зовут Вася?
         [:
         npc="fcolor:880000"
         Да, меня зовут Вася.
            {:да ну нафиг:}
            [:нет. чистая правда:]

         :]
         [:Нет, никто меня так не зовёт:]
      :}
      {:
         Это правда, что вас зовут Васей?
         [:Правда:]
         [:Неправда:]

      :}
   :]
   [:hero="ncolor:ff0000"
      Меня зовут Петя.

      {:
         Вас зовут Петя?
         [:Да{:Как это удобно!:}:]
         [:Нет
            {:Вас зовут не Петя? Как неудобно!:}
         :]
      :}
      {:
         Это правда, что вас зовут Петей?
         [:Правда:]
         [:Неправда:]
      :}
      {:Неужели в самом деле Петей Вас зовут?
         [:В самом деле:]
         [:Нет, не в самом:]
      :}
   :]
:}

Каждая из этих реплик появится в виде действия. Искать вложенные в них реплики не имеет смысла, пока игрок не выберет одно из действий, поэтому модуль пока остановится.

Мы тоже остановимся, но совсем по другой причине. На этом примере мы увидели сразу два элемента диалога: узел и ветви. Узлом считается любая реплика, в которую "вложены" другие реплики. Не обязательно две. Может быть и одна, и три, и сто тысяч миллионов. Узлы различаются по типам точно так же, как и реплики: узел с репликой персонажа (актёрский узел) и узел с репликой героя (геройский узел, узел действия). Реплика, в которую не "вложено" ни одной другой реплики, называется финальной (последней, конечной. В нашем примере финальные реплики выделены чёрным цветом.). Две однотипные реплики, вложенные в одну реплику, считаются (и называются) ветвями диалога. Такие реплики называются одноуровневыми, то есть находящимися на одном уровне. Уровень реплики считается по количеству узлов, которые ей предшествовали. Поскольку корневой реплике не предшествует ни одного узла, она считается нулевым уровнем. Реплика "Как вас зовут?" из примера - первый уровень, и т.д.

Скрытый узел

Иногда нужно скрыть узел или целую ветку, чтобы она не выводилась ни при каких условиях, пока не будет осуществлён принудительный переход. Чтобы сделать это нужно завести пустой узел действия. Особенность работы модуля состоит в том, что он не выводит действия с пустым именем, поэтому в пустых узлах действий можно прятать другие реплики и целые ветви. Пример:


 [:
   {: Скрытая реплика :}
   {: Ещё одна скрытая реплика :}
   {: А это целая скрытая ветка
      [:
         Да, а вот и ответвление
         {:И финальная реплика:}
      :]
      [:
         Да, а вот и другое ответвление
         {:И ещё одна финальная:}
      :]
   :}
:]

Ремарки

Ремарка - это авторский текст, который бывает нужно поместить между репликами. Специальных настроек для ремарок нет, но делать их, тем не менее, просто. Для этого в текущую реплику неписи или героя можно добавить реплику с настройками, отменяющими имя актёра и тире (код ремарки выделен голубым цветом):


 {:
   npc="name:Ведущий:name"
   Как вас зовут?
   {:   
      npc="name::name
      tire:nope"
      <i>
      Что Вы на это ответите?
      </i>
   :}

:}

Ремарки желательно делать финальными репликами, хотя и не обязательно.

Ремарки внутри реплики

Ремарки внутри реплики - это некоторые авторские пояснения, которые нужно вывести непосредственно внутри реплики. Например, прервать речь актёра, чтобы пояснить, какое действие он выполняет, пока произносит фразу. Или указать с какой интонацией или силой произносится фраза. Вот примеры таких ремарок:

Мишель (громко) : — Яичница с ветчиной, это сколько?

Мыса: — На весну оставляю,  — хныча, малец потёр багровое ухо. — Голодно будет.

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


 {:
   npc="name:Мыса:name ncolor:008800 fcolor:000000 nattrib:-b-n fattrib:-n"
   На весну оставляю, <i><font color="888888">— хныча, малец потёр багровое ухо. —</font></i> Голодно будет.
:}

Чтобы сделать ремарку для первого случая, можно прибегнуть к одной из хитростей. Например, можно задать персонажу пустое имя и полностью прописать строку реплики со всеми именами, тегами и пр.:


 {:
   npc="name:Мишель:name ncolor:008800 fcolor:000000 nattrib:-b-n fattrib:-n"
   {:npc="name::name"
   <font color="008888"><b>Мишель </b><i><font color="888888">(громко)</font></i><b>:</b></font>
   <font color="000000"> — Яичница с ветчиной, это сколько?</font>
   :}
:}

Или изменить имя персонажа на имя, в которое уже будет включена ремарка:


 {:
   npc="name:Мишель:name ncolor:008800 fcolor:000000 nattrib:-b-n fattrib:-n"
   {:npc="name:Мишель </b><i><font color="888888">(громко)</font></i><b>:name"
   — Яичница с ветчиной, это сколько?
   :}
:}

В последнем случае писанины меньше, однако нужно очень хорошо представлять себе, какие настройки применяются к имени.

Наверх