Дерево дилогов программируется несколькими командами. Во-первых, Вам нужно задать все возможные реплики; это осуществляется с помощью метода 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(); // заканчиваем ветку диалога } |