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

easy.dialog

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

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

Как избежать очистки списка действий

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


 [:
   npc="fcolor:880000"
   Да, меня зовут Вася.

   {:да ну нафиг:}
   [:нет. чистая правда:]
:]

Удаление действия из списка

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

Блок последовательных реплик

Иногда нужно вывести сразу не одну, не две, а несколько реплик поочерёдно от героя и персонажа

Для примера возьмём вот такой отрывок:

Мишель (громко): Яичница с ветчиной, это сколько?
Женский голос (громко): Сто восемьдесят.
Мишель поворачивается лицом к стойке.
Мишель: Ладно. Делайте.
Женщина: Хорошо.

У нас два собеседника: Женщина и Мишель. Пусть неписью побудет Мишель, а героем - Женщина.

Как обычно, для реплики мы задаём настройки:


 npc="name:Мишель:name ncolor:008888 nattrib:-b-n fcolor:000000 fattrib:-n tire:nope"
hero="name:Женщина:name ncolor:888888 nattrib:-b-n fcolor:000000 fattrib:-n tire:nope"

Если бы мы использовали только возможность вкладывать одну реплику в другую, мы могли бы написать этот диалог так:


 npc="name:Мишель:name ncolor:008888 nattrib:-b-n fcolor:000000 fattrib:-n tire:nope"
hero="name:Женщина:name ncolor:888888 nattrib:-b-n fcolor:000000 fattrib:-n tire:nope"
{:npc="name::name"
<font color="008888"><b>Мишель</b> (громко)<b>:</b></font> <font color="000000">Яичница с ветчиной, это сколько?</font>
   {:
   <font color="888888"><b>Женский голос</b> (громко)<b>:</b></font> <font color="000000">Сто восемьдесят.</font>
      {:
      <i>Мишель поворачивается лицом к стойке.</i>
         {:npc="name:Мишель:name"
            Ладно. Делайте.
            {:npc="name:Женщина:name ncolor:888888 fcolor:000000"
               Хорошо.
            :}
         :}
      :}
   :}
:}

Но это не только громоздко, но ещё и неудобно, и даёт дополнительную нагрузку на плеер. Специально для таких случаев была придумана конструкция блоков реплик (блок фраз). Делается она очень просто. Между тегами frase-block: :frase-block помещаются строки нашего диалога. Каждая строка считается отдельной фразой/репликой. Если в начале строки вписать <npc-name>, то к строке будет применено форматирование согласно настройкам неписи. Если в начале строки указать <hero-name>, то к ней будет применено форматирование согласно настройками героя. Если ни той ни другой метки в строке не обнаружено, дополнительное форматирование к строке не применяется. Таким образом наш диалог можно записать в одну "реплику":


 npc="name:Мишель:name ncolor:008888 nattrib:-b-n fcolor:000000 fattrib:-n tire:nope"
hero="name:Женщина:name ncolor:888888 nattrib:-b-n fcolor:000000 fattrib:-n tire:nope"
{:
   frase-block:
      <font color="008888"><b>Мишель</b> (громко)<b>:</b></font> <font color="000000">Яичница с ветчиной, это сколько?</font>
      <font color="888888"><b>Женский голос</b> (громко)<b>:</b></font> <font color="000000">Сто восемьдесят.</font>
      <i>Мишель поворачивается лицом к стойке.</i>
      <npc-name>Ладно. Делайте.
      <hero-name>Хорошо.
   :frase-block
:}

Фразы, указанные в блоке, будут выводиться одна за другой с небольшой задержкой. Блок фраз имеет приоритет перед простым текстом реплики.

Реплики по условию

Иногда нам необходимо намеренно скрыть реплику до тех пор, пока не будет выполнено определённое условие. Например, реплика должна появляться только в тех случаях, когда в рюкзаке героя есть "Странный синий камушек", а до той поры быть скрыта. Чтобы написать такую скрытую реплику, используем специальные теги iffing: :iffing. Если Вы не первый день пользуетесь QSP, Вы знаете, что такое оператор условия и уже видели конструкции типа:

 if obj('Странный синий камушек'):
   ! ---- какой-то код .... ---------
end

Так вот. Между тегами iffing: :iffing нужно поместить всё, что находилось бы в этой конструкции между "if" и ":". То есть реплика по условию выглядела бы так:


 {:
   iffing:obj('Странный синий камушек'):iffing
   О, я вижу ты нашёл странный синий камушек!
:}

Или так:


 [:
   iffing:obj('Странный синий камушек'):iffing
   Не знаешь, что это за странный синий камушек?
:]

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

Выполнение кода при выводе реплики

Иногда при выводе реплики нужно выполнить какой-нибудь код. Особенно часто это бывает необходимо при выборе действия (выводится реплика героя). На такой случай предусмотрены специальные теги dynamic-code: :dynamic-code. Между ними можно разместить любой код QSP, который будет выполнен только при выводе реплики на экран. Если текст реплики не задан, на экран, конечно, ничего не выведется, но код всё равно будет выполнен. Код выполняется непосредственно перед выводом реплики на экран, поэтому если Вы пропишете вывод строки из кода, строка появится на экране до выводимой реплики. Вот пример вывода ремарки до реплики, используя код в реплике.


 {:
   dynamic-code:
   *pl '<i><font color="888888">Мишель поворачивается лицом к стойке.</font></i>'
   :dynamic-code:
   Ладно. Делайте.
:}

Принудительные переходы по репликам. Закрытие диалога

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

Для переходов по репликам используются следующие команды:

  • levelup:## — переход по узлам "назад". Вместо "решёток" указывается на сколько узлов нужно вернуться по репликам. Тип реплик при этом не учитывается. К примеру:

    
     replics="repeat:cicle
    shuffle:random"
    npc="name:Ведущий:name
    ncolor:008888
    fcolor:008888"
    hero="name:Вася пупкин:name"
    {:marker:firstqst
    Как вас зовут?
       [:Меня зовут Вася.
          {:
             Вас зовут Вася?
             [:Да, меня зовут Вася.:]
             [:Нет, никто меня так не зовёт
             levelup:5:]

          :}
          {:
             Это правда, что вас зовут Васей?
             [:Правда:]
             [:Неправда
             levelup:3:]

          :}
       :]
       [:
          Меня зовут Петя.
          {:
             Вас зовут Петя?
             [:Да{:Как это удобно!:}:]
             [:Нет
                levelup:3
                {:Вас зовут не Петя? Как неудобно!:}
             :]
          :}
          {:
             Это правда, что вас зовут Петей?
             [:Правда:]
             [:Неправда
             leveljump:firstqst:]

          :}
          {:Неужели в самом деле Петей Вас зовут?
             [:В самом деле
             closeup:]
             [:Нет, не в самом
             levelup:3:]
          :}
       :]
    :}

    Здесь можно видеть несколько переходов по узлам, они выделены тёмно-голубым цветом. Сначала рассмотрим два из них.

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

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

  • leveljump:MARKER — переход минуя все условия и промежуточные узлы на реплику с указанной меткой.

    Вместо "MARKER" указывается метка. Чтобы поставить метку на реплике, нужно использовать одиночный тег marker:, после которого следует прописать без пробелов любое сочетание символов (можно использовать только буквы и цифры и символ подчёркивания). Эти символы и будут меткой. Пример реплики, осуществляющей переход на метку, выделен фиолетовым цветом в предыдущем примере. Сама метка выделена жёлтым цветом.

    Если указанная в leveljump: метка отсутствует, переход не осуществится.

    Чтобы осуществить переход сразу на несколько реплик, нужно указать для каждой из этих реплик одинаковые метки, а потом для реплики, с которой нужно перейти, указать команду leveljump: и эту метку. Либо выставить для каждой реплики свою собственную метку, а потом прописать в реплике, с которой нужно перейти, команду leveljump: столько раз на сколько реплик нужно перейти, с указанием каждой выставленной метки. Разница между двумя этими способами в том, что во втором случае Вы можете контролировать порядок вызова реплик. Вот оба варианта для сравнения:

     
     replics="repeat:cicle
    shuffle:random"
    npc="name:Ведущий:name
    ncolor:008888
    fcolor:008888"
    hero="name:Вася пупкин:name"
    {:marker:firstqst
    Как вас зовут?
    [:
       Меня зовут Петя.
       {:
          Вас зовут Петя?
          [:Да{:Как это удобно!:}:]
          [:Нет
             levelup:3
             {:Вас зовут не Петя? Как неудобно!:}
          :]
       :}
       {:
          Это правда, что вас зовут Петей?
          [:Правда:]
          [:Неправда
          leveljump:firstqst:]

       :}
       {:Неужели в самом деле Петей Вас зовут?
        [:В самом деле
           closeup
        :]
        [:Нет, не в самом
           levelup:3
        :]
       :}
    :]
    [:
       {:А здесь у нас скрытая реплика
          marker:firstqst
       :}
    :]
    :}
     
     replics="repeat:cicle
    shuffle:random"
    npc="name:Ведущий:name
    ncolor:008888
    fcolor:008888"
    hero="name:Вася пупкин:name"
    {:
    marker:firstqst
    Как вас зовут?
    [:
       Меня зовут Петя.
       {:
          Вас зовут Петя?
          [:Да{:Как это удобно!:}:]
          [:Нет
             levelup:3
             {:Вас зовут не Петя? Как неудобно!:}
          :]
       :}
       {:
          Это правда, что вас зовут Петей?
          [:Правда:]
          [:Неправда
          leveljump:firstqst
          leveljump:hidereplics
          :]

       :}
       {:Неужели в самом деле Петей Вас зовут?
          [:В самом деле
          closeup:]
          [:Нет, не в самом
          levelup:3:]
       :}
    :]
    [:
       {:А здесь у нас скрытая реплика
          marker:hidereplics
       :}
    :]
    :}

В первом случае модуль сам отыщет первую реплику, которую выведет. Скорей всего это будет реплика с наивысшим уровнем. Во втором случае сначала будет осуществлён переход на реплику с меткой firstqst, а затем на реплику с меткой hidereplics. Т.е. именно в том порядке, в котором записаны команды leveljump: в реплике "Неправда", выделенной фиолетовым цветом.

Чтобы принудительно закрыть диалог из реплики, нужно ввести команду closeup. В последних примерах реплика "В самом деле" будет закрывать диалог. При закрытии диалога восстановится описание и действия локации, с которой диалог был вызван.

Наверх