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

easy.dialog v.3.0.0

Создание диалогов

Комментирование реплик

Все реплики можно комментировать. Комментарии записываются так же, как записываются в обычном html-документе, т.е. внутри конструкции <!-- -->. При генерации таблицы диалогов все подобные конструкции будут удалены.

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

Конечно, настройки можно указывать и не в комментариях, но если разместить их внутри комментария, это гарантирует, что даже если вы ошибётесь в названии какого-либо параметра или тега, они не попадут в выводимую на экран фразу, или в название кнопки, а значит возникнет меньше вероятности, что qSpider упадёт в молоко, или в классическом плеере поломается разметка.

Запрещено вкладывать комментарии в теги <if> </if>, <dynamic_code> </dynamic_code>, <wrap.btn></wrap.btn> и <wrap.frase></wrap.frase>, а так же вкладывать комментарии в комментарии. Вот пример неправильного размещения комментариев:

<!-- npc="
name:Ведущий:name
ncolor:008888<!-- цвет имени неписи -->

fcolor:008888
"
hero="
name:Вася Пупкин:name
"
-->

{:
   Как вас зовут?
   [:
      Меня зовут Вася.
      {:
      <if>a=0<!-- реплика выводится, если "a" равно нулю --></if>
      <dynamic_code>a=1</dynamic_code>
      Вас зовут Вася?
         [:
         Да, меня зовут Вася.
            {:да ну нафиг:}
            [:
            нет. чистая правда
            :]
         :]
         [:Нет, никто меня так не зовёт:]
      :}
      {:
      <if>a>0</if>
      <dynamic_code>if a<5: a+=1<!-- изменяем значение "a", чтобы реплика больше не выводилась -->
</dynamic_code>
         Это правда, что вас зовут Васей?
         [:Правда
         :]
         [:Неправда:]
      :}
   :]
:}

Фразы, предназначенные для вывода в лог диалога, помещать в комментарии не нужно.

Ремарки

Ремарка - это авторский текст, который бывает нужно поместить между репликами персонажей. Специальных настроек для ремарок нет, но делать их, тем не менее, просто.

Я рекомендую завести для ремарок отдельную роль с обёрткой, не добавляющей дополнительного форматирования, а форматировать фразу уже непосредственно внутри реплики.

<!--
   dialog_usrid="testgame"
   actors="npc;hero;"

   <actor.npc>
      <default_passive>
      <wrap.frase>
         $result = '<span style="color:#008888">Ведущий: — <<$args[2]>></span>'
      </wrap.frase>
   </actor.npc>

   <actor.hero>
      ...
   </actor.hero>

   <actor.remarka>
      <wrap.frase>
         $result = '<div><<$args[2]>></div>'
      </wrap.frase>
   </actor.remarka>

-->

{:
   Как вас зовут?
   {:   
      actor_this:remarka
      <em>Что Вы на это ответите?</em>
   :}
:}

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

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

Мишель (громко): — Яичница с ветчиной, это сколько?
Мыса: — На весну оставляю, — хныча, малец потёр багровое ухо. — Голодно будет.

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

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

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

<!--
   ...

   <actor.remarka>
      <wrap.frase>
         $result = '<div><<$args[2]>></div>'
      </wrap.frase>
   </actor.remarka>

-->
{:
   ...


   {:
      actor_this:remarka
      <strong>Мишель</strong> <em>(громко)</em><strong>:</strong> — Яичница с ветчиной, это сколько?
   :}
:}

Или, если предыдущий вариант вам по каким-либо причинам не подходит (например, имя должно извлекаться из роли или из переменной), создать роль, в обёртку которой уже будет включена ремарка:

<!--
   ...

   <actor.npc_loud>
      <wrap.frase>
         local $name_ = @dialog.role.get_set($args[0], 'name')
         $result = '<strong><<$name_>></strong> <em>(громко)</em><strong>:</strong> — <<$args[2]>>'
      </wrap.frase>
   </actor.npc_loud>

-->
{:

   {:
      <!-- actor_this:npc_loud -->
      Яичница с ветчиной, это сколько?
   :}
:}

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

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

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

Но с чего же модуль начинает? Должна же быть какая-то реплика, с которой начинается вывод всех остальных реплик. Да. Такая реплика должна быть обязательно. Когда мы описали все настройки диалога и все применяемые Роли, мы обязательно должны открыть самую первую пассивную реплику.

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

Самая первая пассивная реплика называется корнем диалога или корневой репликой (в отличие от easy.dialog 1.0.1). Она может вообще не содержать никаких фраз, а просто заключать в себе все прочие реплики, как это сделано в "диалоге Арагорна" или в "диалоге Бармена". В "диалоге Пьяницы" эта реплика содержит в себе фразу, которая будет воспроизводиться всякий раз при вызове диалога пьяницы.

Ниже представлен пример диалога, где корневая реплика содержит фразу и некоторые настройки вывода реплик:

<!--
   dialog_usrid="testgame"
   actors="npc;hero;"

   <actor.npc>
      <default_passive>
      <wrap.frase>
         $result = '<span style="color:#008888">Ведущий: — <<$args[2]>></span>'
      </wrap.frase>
   </actor.npc>

   <actor.hero>
      <default_active>
      <wrap.frase>
         $result = 'Вася Пупкин: — <<$args[2]>>'
      </wrap.frase>
      <wrap.btn>
         $result = '<div><<$args[2]>></div>'
      </wrap.btn>
   </actor.hero>

   <actor.herogreen>
      <wrap.frase>
         $result = '<span style="color:#008800">Вася Пупкин:</span> — <<$args[2]>>'
      </wrap.frase>
      <wrap.btn>
         $result = '<div><<$args[2]>></div>'
      </wrap.btn>
   </actor.herogreen>

   <actor.herored>
      <wrap.frase>
         $result = '<span style="color:#ff0000">Вася Пупкин:</span> — <<$args[2]>>'
      </wrap.frase>
      <wrap.btn>
         $result = '<div><<$args[2]>></div>'
      </wrap.btn>
   </actor.herored>

   <actor.npcbluered>
      <wrap.frase>
         $result = '<span style="color:#008888">Ведущий:</span> <
span style="color:#880000">— <<$args[2]>></span>'
      </wrap.frase>
   </actor.npcbluered>

   string:25
-->

{:
   Как вас зовут? <!-- это корень диалога.
   Здесь есть фраза, и некоторые настройки вывода реплик:
   shuffle:random
   repeat:once -->
   [:
      <!-- actor_act:herogreen <<< Здесь меняем роль для активируемых реплик -->
      Меня зовут Вася.
      {:Вас зовут Вася?
         [:
         <!-- actor_pass:npcnluered <<< Здесь меняем роль для пассивных реплик -->
         Да, меня зовут Вася.
            {:да ну нафиг:}
            [:
            нет. чистая правда
            :]
         :]
         [:Нет, никто меня так не зовёт:]
      :}
      {:
         Это правда, что вас зовут Васей?
         [:Правда
         :]
         [:Неправда:]
      :}
   :]
   [:
      <!-- actor_act:herored <<< Здесь меняем роль для активируемых реплик -->
      Меня зовут Петя.
      {:
         Вас зовут Петя?
         [:Да{:Как это удобно!:}:]
         [:
            Нет
            {:Вас зовут не Петя? Как неудобно!:}
         :]
      :}
      {:
         Это правда, что вас зовут Петей?
         [:Правда:]
         [:Неправда:]
      :}
      {:Неужели в самом деле Петей Вас зовут?
         [:В самом деле:]
         [:Нет, не в самом:]
      :}
   :]
:}

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

Когда модуль находит первую реплику диалога (его корень) и выводит её на экран (или не выводит, если фраза не прописана), он находит также и все вложенные реплики. В нашем примере, в корневой реплике будут найдены две активируемые реплики, их-то мы и увидим на экране в виде действий.

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

Мы тоже остановимся, но совсем по другой причине.

На этом примере мы увидели сразу два элемента диалога: узел и ветви.

Узлом считается любая реплика, в которую "вложены" другие реплики. Не обязательно две. Может быть и одна, и три, и сто тысяч миллионов. Узлы различаются по типам точно так же, как и реплики: узел с репликой персонажа (актёрский узел, пассивный узел) и узел с репликой героя (геройский узел, активируемый узел, узел действия).

Реплика, в которую не вложено ни одной другой реплики, называется финальной (последней, конечной).

Две однотипные реплики, вложенные в одну реплику, считаются (и называются) ветвями диалога. Такие реплики называются одноуровневыми, то есть находящимися на одном уровне.

Уровень реплики считается по количеству узлов, которые ей предшествовали.

Поскольку корневой реплике не предшествует ни одного узла, она считается нулевым уровнем.

Реплика "Как вас зовут?" из примера - нулевой уровень; реплики "Меня зовут Вася" и "Меня зовут Петя" — первый уровень; и т.д.

Чем меньше численно уровень реплики, тем она старше.

Наследование, каскадность

В модуле реализовано наследование настроек Репликами от старших Реплик. Это немного замедляет воспроизведение Реплики, однако экономит память, в которой хранится таблица далогов.

Если модулю нужно воспроизвести реплику в виде кнопки или фразы, он первым делом пытается получить настройки реплики. При этом модуль может получить как полный список настроек, так и частичный.

Если полный список настроек ещё не получен, модуль пытается извлечь настройки из родительской реплики, затем из старших реплик, и так далее. Таким образом, пока не будет получен полный список настроек, необходимых для воспроизведения текущей реплики, модуль продолжает обращаться к всё более старшим репликам.

Таким образом он может дойти до корня и до объекта диалога (Диалог можно рассматривать, как родителя корневой реплики). Если совсем никакие настройки в диалоге не были определены, модуль берёт настройки по-умолчанию, то есть те, которые в него вшиты.

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

Скрытый узел

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

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

Как избежать очистки списка кнопок

Особенность поведения модуля такова, что если узлом была пассивная реплика, а ветвями являются активируемые реплики, производится очистка списка действий (кнопок) и вывод новых. Чтобы вывести новое действие при щелчке на одном из действий списка, но не удалять старые, помещать активируемую реплику следует непосредственно в предыдущую активируемую реплику. Так сделано в примере раздела "Корни, ветви, узлы" в реплике "Да, меня зовут Вася.":

[:
   Да, меня зовут Вася.

   {:да ну нафиг:}
   [:нет. чистая правда:] <!-- эта кнопка появится на экране, но кнопки старших реплик не сотрутся -->
:]
Наверх