Программирование диалогов

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

После того, как Вы задали все возможные реплики, Вам понадобится метод Game.GetResponse(). Он отобразит на экране диалоговое окно и предоставит пользователю возможность выбрать одну из фраз. Дальнейшее выполнение сценария останавливается до тех пор, пока пользователь не сделает выбор. Затем возвращается ID выбранной реплики.

Ниже приведён простейший пример диалога:

Game.AddResponse(0, "Привет.");
Game.AddResponse(1, "Как дела?");
Game.AddResponse(2, "Мне надо идти.");

var Res = Game.GetResponse();

Это код прост и понятен, но по большому счёту бесполезен. В большинстве случаев Вам понадобится выполнить некоторые действия в соответствии с выбранной репликой. Также, скоре всего Вам потребуется выводить фразы диалога до тех пор, пока пользователь не выберет пункт «Мне надо идти». Доработанный программный код будет выглядеть следующим образом:

function MyTestDialogue()
{
  var EndBranch = false;

  while(!EndBranch) // повторять весь цикл до тех пор, пока пользователь не закончит диалог
  {
    // задаём фразы диалога
    Game.AddResponse(0, "Привет.");
    Game.AddResponse(1, "Как дела?");
    Game.AddResponse(2, "Мне надо идти.");

    // предоставляем возможность пользователю выбрать одну из реплик
    var Res = Game.GetResponse();

    // указываем персонажу, что нужно проговорить реплику
    actor.Talk(Game.LastResponse);

    // обрабатываем выбранную реплику
    switch(Res)
    {
      case 0:
        // код для обработки фразы #0
        SomeGuy.Talk("Привет, мистер.");
        break;

      case 1:
        // код для обработки фразы #1
        SomeGuy.Talk("Спасибо, хорошо.");
        break;

      case 2:
        SomeGuy.Talk("Пока.");
        EndBranch = true;  // выход из диалога
        break;
    }
  }
}

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

Во-вторых, мы добавили строку, которая заставляет персонажа произнести выбранную фразу. Её текст будет сохранён в свойстве Game.LastResponse.

В-третьих, выбор реплик помещён в цикл while, который будет повторяться до тех пор, пока не будет выбрана третья фраза из диалога.

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

 

В дополнение к методу Game.AddResponse() WME предоставляет также специальные его вариации Game.AddResponseOnce() и Game.AddResponseOnceGame().

Метод Game.AddResponseOnce() добавляет реплику, и после того, как она будет выбрана, она исчезает из списка на время, пока диалог не будет закончен.
 

Метод Game.AddResponseOnceGame() добавляет реплику, и после того, как она будет выбрана, она исчезает из списка и больше не появится на протяжении всей игры.

Если Вам понадобится вновь вывести уже скрытую реплику, Вы можете воспользоваться методом Game.ResetResponse().

 

Вдобавок к этому метод Game.GetResponse() принимает логический параметр, который указывает, что нужно делать в случае, если останется на выбор только одна фраза. Если в качестве этого параметра Вы передадите значение true, движок автоматически выберет оставшуюся реплику.

Здесь есть одна маленькая сложность. По логике работы метода Game.AddResponseOnce Вам нужно указать в коде, где ветка диалога начинается и где она заканчивается. Тогда движок сможет определить какая фраза принадлежит какому диалогу. Вы можете отметить начало диалога с помощью метода Game.StartDlgBranch(), а конец с помощью Game.EndDlgBranch().

Итак, приведём пример законченного кода для нашего диалога:

function MyTestDialogue()
{
  Game.StartDlgBranch("MyTestDialogue"); // начинаем новую ветку диалога

  var EndBranch = false;

  while(!EndBranch) // повторять весь цикл до тех пор, пока пользователь не закончит диалог
  {
    Game.AddResponseOnce(0, "Вы можете выбрать эту фразу только один раз за весь диалог");
    Game.AddResponseOnceGame(1, "Вы можете выбрать эту фразу только один раз за всю игру");
    Game.AddResponse(2, "Мне пора.");

    var Res = Game.GetResponse(true); // автоматически выбирает оставшуюся реплику

    actor.Talk(Game.LastResponse);

    // обрабатываем реплики
    switch(Res)
    {
      case 0:
        // код для обработки фразы #0
        break;

      case 1:
        // код для обработки фразы #1
        break;

      case 2:
        EndBranch = true;  // выход из диалога
        break;
    }
  }

  Game.EndDlgBranch(); // заканчиваем ветку диалога
}