Диалоги в квестах играют, пожалуй, самую важную роль в создании атмосферы.. В Dragon Age диалоги имеют древовидную архитектуру и представляют из себя набор реплик. Диалоги могут быть достаточно сложны по своей структуре, каждая реплика может иметь как условие своего выполнения, так и действие, которое она может запустить. В этом учебнике мы создадим диалог , двигаясь от простого к сложному.
Создание и установка диалога для существа
В учебнике по существам мы создали НПС под именем "Quest Giver", который стоит возле своей лачуги, которую заняли монстры. Цель данного урока в том, чтобы этот товарищ пропросил нас освободить его лачугу перебив, естественно, монстров. Первое, что нам нужно сделать, это создать сам ресурс диалога. Назовите диалог так, чтобы по имени можно было понять, что это за ресурс и с чем он связан. Мы назовём наш диалог - "conv_quest_giver". Новый диалог создаётся пустым, с одним корневым узлом. Корневой узел не является репликой и содержит различные настройки, которые относятся к диалогу в целом.
Когда корневой узел выбран, на панели вкладок (ниже окна реплик) выберите вкладку "Global settings":
"OWNER" - Существо, которому назначен текущий диалог.
"PLAYER" - Собственно сам игрок.
Default NPC Speaker: - Это существо (Говорун), которое по умолчанию разговаривает с игроком (отвечает, реагируя на выбор реплик).
Default NPC Listener: - Это существо (Слушатель Говоруна), которому предназначены ответы Говоруна. Данное свойство используется, чтобы определить, к кому Говорун должен повернуть голову во время произношения реплики.
Default PC Listener: - Это существо (Слушатель Героя), с которым говорит наш Герой, когда вы указываете реплику, которую он должен произнести. Данное свойство используется, чтобы определить, к кому должен повернуть голову Герой во время произношения реплики.
Свойства, назначенные по умолчанию, отлично подходят для диалога между игроком и одним НПС (что нам и нужно), но впоследствии могут быть изменены на любой реплике диалога. Обычно их изменение требуется при создании диалога с более чем двумя участниками. Также стоит сказать, что в качестве участника беседы можно назначить и размещаемый объект (placeable). Однако в данном учебнике мы не станем рассматривать такие ситуации, так как они выходят за рамки понятия вводного учебника.
Также на этой вкладке имеются несколько флажков, использующих для того, что заблокировать изменение видеоряда. Обычно они используются, чтобы предупредить автоматические изменения Тулестом видеоряда, после того, как вы настроили его вручную. Но об этом нам волноваться пока рано.
Первым делом после создания диалога нам необходимо задать нашему Говоруну (Quest Giver) реплику, которую он произнесёт, когда Герой попытается заговорить с ним. Для этого в Тулсете откройте ресурс существа и, нажав кнопку выбора () справа от свойства "Conversation", выберите диалог "conv_quest_giver" (по умолчанию стоит "none").
Формирование диалога
[table][tr][td]
Про реплики: Реплика - это линия диалога, принадлежащая одному из собеседников.
Реплики красного цвета - реплики существа, которое является на настоящий момент Говоруном.
Реплики синего цвета - реплики Героя. Если реплик несколько, то возможен выбор между ними.
Реплики серого цвета - отсылочные реплики, то есть являющиеся ссылками на другие реплики.
Добавить реплику можно посредством пункта "Insert Line" в контекстном меню, кнопкой #23 на панели инструментов либо сочетанием клавиш "Ctrl+A".
Добавить ссылку можно путём копирования реплики, к которой должен быть отослан диалог, и в нужном месте в контекстном меню выбрать "Paste as Link" либо "Ctrl-Shift-V".
[/td][/tr][/table]
Первая реплика диалога принадлежит Говоруну (красный цвет реплики). Кто именно является Говоруном для реплики указано в её начале - [[OWNER]]. Когда игрок вступает в контакт с НПС, являющемся владельцем диалога, первой произносится именно эта реплика.
Текст реплики вводится на вкладке "Dialogue" (предварительно выбрав, конечно же, нужную реплику). Другие свойства, имеющиеся на этой вкладке мы пока рассматривать не будем.
Предположим, что на вступительную реплику Говоруна Герой должен выбрать между тремя вариантами продолжения диалога, а именно:
Поприветствовать собеседника.
Задать ему вопрос.
Проигнорировать его.
Выберите реплику Говоруна и добавьте три дочерние реплики, которые будут окрашены в синий цвет. Теперь для каждой новой реплики введите текст, который должен произнести Герой.
Вот таким образом будет выглядеть начало нашего диалога:
Диалог может продолжаться путём добавления последующих реплик с разным количеством вариантов. Например один ответ НПС на каждую реплику Героя и несколько вариантов реплик Игрока, расширяющих диалог.
Когда диалог доходит до конца одной из своих веток, посредством реплики-ссылки он может быть отослан к любой реплике диалога, позволяя таким образом исследовать другие варианты его развития. Добавить ссылку можно путём копирования реплики, к которой должен быть отослан диалог, и в нужном месте в контекстном меню выбрать "Paste as Link".
[table][tr][td]
Про ссылки:
Ссылки позволяют создать диалог используя меньшее количество реплик и избежать за счёт отсутствия повторяющихся реплик излишнего его расширения.
Выяснить, куда ведёт ссылка, можно выбрав в контекстном меню пункт "Jump to Target" либо дважды щёлкнув мышкой.
Найти все ссылки на текущую реплику можно выбрав в контекстном меню пункт "Find Links". [/td][/tr][/table]
В данном примере на первую реплику Героя Quest Giver отвечает "Отлично! У меня есть задание, которое сможешь выполнить только ты!". По идее Герой на это может ответить "О, Проблемы? Чтож, я могу помочь!", но эта реплика у нас уже есть в диалоге, поэтому дублировать её нет смысла, к тому же тогда нам придётся дублировать и всю ветку ветку, отходящей от этой реплики.
Вместо этого скопируйте её и вставьте как ссылку после реплики Говоруна.
Созданная реплика будет серого цвета.
Чтобы выяснить, куда ведёт ссылка, выберите в контекстном меню пункт "Jump to Target" либо дважды щёлкните мышкой. С помощью пункта контекстного меню "Find Links" можно выяснить откуда приходят ссылки на выбранную реплику.
Теперь две реплики из первой развилки приведут к одной и той же реплике Говоруна, в которой он рассказывает герою, что его лачугу захватили монстры. Теперь мы можем добавить последующей реплике Героя, которой он соглашается на задание, соответствующее действие, которое скажет игре, что Герой принял заказ на убийство всех монстров в лачуге, и заведёт запись о задании в журнале.
Отслеживание текущего состояния задания посредством Plot-файла
Создание Plot-файлов
[table][tr][td]Plot-файлы:
Plot-файлы содержат флаги, которые дают информацию о том, в каком состоянии находятся те или иные отношения в мире, какие события уже произошли, и т.п.
Каждый флаг также может содержать журнальный текст, который игрок может прочитать в своём журнале.
Plot-файлы могут содержать информацию из кодекса, обучающую информацию, группировать другие Plot-файлы.
Информация о Plot-файлах
[/td][/tr][/table]
Теперь, когда у нашего Героя появилось задание, текущее состояние которого необходимо отслеживать, нам нужен какой-то механизм, позволяющий сделать это. В Neverwinter Nights это осуществлялось посредством прямого скриптинга, однако в Dragon Age появился новый тип ресурсов, который помогает упростить этот процесс. Это Plot-файлы.
Создайте новый Plot-файл и назовите его "clear_the_hut".
Plot-файл содержит некоторое количество поименованных флагов, которые могут иметь два значение - TRUE(Истина) или FALSE(Ложь). С помощью этих флагов игра отслеживает события игры (например выполнение задания или изменение отношений) и реагирует на изменение флагов, которое производится действиями игрока. Каждый флаг также может содержать журнальный текст, который показывается в журнале игрока под записью, которая совпадает с именем Plot-файла. Журнал обычно используется, чтобы держать игрока в курсе его продвижения по игре и напоминать о важной информации, которую он узнал по пути.
Итак, нам необходимо задать имя Plot-файла (свойство "Name"), которое будет отображено в журнале. Мы назовём его "Clear the Hut", то есть зачистка лачуги.
Наш Plot-файл является схемой задания, а в нашем задании есть три вехи:
Флаг QUEST_ACCEPTED - Герой согласился выполнить задание.
Флаг MONSTERS_SLAIN - Герой зачистил помещение путём умерщвления всех монстров.
Флаг REWARD_RECEIVED - Герой отрапортовал о выполнении задания и получил награду.
Добавьте приведённые флаги в Plot-файл (пункт контекстного меню "Insert" -> "Main Flag", кнопка "Insert Main Flag" на панели инструментов, сочетание клавиш "Ctrl+M".
[table][tr][td]
Обратите внимание:
Каждый раз, когда устанавливается значение флага, ассоциированный с ним текст заменяет в журнале уже имеющуюся запись этого Plot-файла. Если у вас есть чёткая очерёдность установки флагов, то можно избежать этого, устанавливая текст для флага с учётом предыдущего, то есть соединяя их.
[/td][/tr][/table]
Самый быстрый и лёгкий способ установить значение флага - это диалог.
Использование Plot-файлов
Раздел "Condition" (условие) вкладки "Plots and Scripting" позволяет регулировать видимость реплики для игрока в зависимости от указанных условий о состоянии флагов в Plot-файлах либо о выполнении скрипта.
Раздел "Action" (действие) вкладки "Plots and Scripting" позволяет устанавливать(set) в TRUE или сбрасывать(clear) в FALSE флаг в любом Plot-файле либо запускать скрипты по завершению реплики.
В данном случае, когда Герой примет задание, мы хотим установить значение TRUE флагу "QUEST_ACCEPTED" Plot-файла "clear_the_hut":
Выберите реплику Героя, где он соглашается выполнить задание и перейдите на вкладку "Plots and Scripting".
В разделе "Action" выберите наш Plot-файл "clear_the_hut" (первоначально его не будет в раскрывающемся списке, и вам понадобится его выбрать в окне выбора файлов).
В выпадающем списке выберите флаг "QUEST_ACCEPTED".
Оставьте действие над флагом без изменения, так как по умолчанию устанавливается "set", а мы и хотим установить флаг как TRUE.
Убедитесь, что реплика теперь отмечена буковкой "А", обозначающую, что для этой реплики установлено действие.
Теперь, когда мы дойдём в диалоге до этой реплики, флаг "QUEST_ACCEPTED" в Plot-файле "clear_the_hut" будет установлен в TRUE. Установка флага, в свою очередь обновит запись нашего Plot-файла в журнале на текст, ассоциированный с установленным флагом.
Если Герой согласился выполнить задание, ветка диалога, в которой Герой его получает, больше не должна отображаться. Для этого нам необходимо перейти на первую реплику этой ветки и добавить условие на её отображение (на вкладке "Plots and Scripting" в разделе "Condition" выберите Plot-файл "clear_the_hut", выберите флаг "QUEST_ACCEPTED", и установите условие "is false".
[table][tr][td]
Очень важно:
Хотя бы одна из первых реплик Говоруна должна быть чистой от условий, в противном случае диалог может даже не начаться.
Игра проверяет условия по репликам сверху вниз, то есть если условие первой реплики определяется как True, диалог заходит в эту ветку, не проверяя следующую.
Убедитесь, что последняя реплика каждого ответвления каждой ветки не имеет условия на своё отображение, так как в противном случае диалог может зайти в тупик. [/td][/tr][/table]
Это означает, что данная ветка появится в диалоге только если Герой ещё не согласился на задание. Отметьте, что реплика теперь отмечена буковкой "С", обозначающую, что для этой реплики установлено условие на отображение. А так как последующие реплики зависят от появления первой, наш Герой не сможет принять задание дважды и не нарушит установленный ход приключения.
Однако теперь, когда Герой выполнит задание и принесёт головы монстров в мешке, НПС будет нечего ему сказать. А это значит, что нам нужно добавить в диалог ещё несколько реплик.
Выберите корневой узел и добавьте для Говоруна вторую "первую" реплику, с которой также может начинаться разговор. Так как новой репликой Говорун спрашивает, убили ли мы уже монстров, нельзя, чтобы она появлялась в диалоге до тех пор, пока задание не будет принято Героем. То есть в диалоге не должны одновременно появляться обе первые реплики. Установите условие, как показано в нижеприведённой илюстрации.
Репликам Героя также могут быть установлены условия, определяющие отображать их или нет. В нашем случае надо, чтобы Герой мог сказать, что все монстры убиты только в том случае, если они действительно убиты и задание выполнено.
Как установить флаг "MONSTERS_SLAIN" посредством скриптинга смотрите статью о Plot-файлах и учебник Написание скриптов в DA, мы же пока просто установим для реплики "Yes, I have" условие, что флаг "MONSTERS_SLAIN" имеет значение TRUE. И тогда последующая за ней реплика Говоруна может установить значение флага "REWARD_RECEIVED" в TRUE, в результате чего Герой получит награду за успешно выполенное задание.
Чтобы Герой не мог получать награду за выполненное задание неоднократно, можно задать для реплики "Have you slain the monsters yet?" условие, что флаг "REWARD_RECEIVED" является ложным. И, наконец, добавьте третью "первую" реплику Говоруна, в которой он уведомит Героя, что заданий больше не осталось и разговаривать более не о чем.
Итак, теперь у вас есть интерактивный диалог, который в необходимой мере взаимодействует с миром игры.
Сцены и их использование в диалоге
На настоящий момент созданный нами диалог является статичным и использует сцену по умолчанию (лицом к лицу). Говорун стоит тихо и неподвижно, уставившись на Героя, а это не есть гуд. Да и сам ракурс, при котором происходит беседа - не ахти, а потому придётся в диалог добавить сцену. Создайте новую сцену (Stages) и дайте ей название, опять же следуя правилам информативности, например "hut_exterior_quest_giver". Перед вами появится абсолютно пустая сцена. Окно редактора сцен разделено на четыре окна, в каждом из которых можно рассматривать сцену под различными ракурсами. При желании вы можете изменить такой способ отображения используя меню "Tools -> Options".
На сцене можно разместить объекты - позиции собеседников и камеры.
Позиции собеседников определяют где они будут стоять во время диалога.
Существа, которые будут занимать позиции, назначаются в редакторе диалогов.
Для каждой позиии необходимо назначить камеру по умолчанию. Эта камера будет использоваться когда существо, занимающее эту позицию, будет говорить свою реплику.
В данном случае нам не нужно создавать сложную сцену со множеством позиций и камер, обойдёмся достаточно простым вариантом. С помощью контекстного меню добавьте две позиции ("Insert Place") рядом с центром сцены. На сцене появятся две жёлтых макета. Эти макеты и представляют собой, как будут размещены собеседники, их позиция и ориентация. Разместите их рядышком и поверните их лицом друг к другу.
Следующим шагом необходимо разместить на сцене камеру (пункт контекстного меню "Insert Camera").
Разместите камеру над плечом одного из макетов, который будет нашим Героем, и направьте на макет, место которого займёт владелец диалога, в нашем случае Quest giver.
Для большего удобства в работе можно выбрать представление камеры в одном из окон. Для этого нажмите правую кнопку мыша на заголовке необходимого окна, и интересующую вас камеру, затем выберите "Save Frame". Теперь в этом окне будет показываться вид камеры, так как это будет выглядеть в игре.
[table][tr][td]
ИНФА:
Сцены определяют расположение собеседников и камер во время диалога.
Диалог без назначенной сцены, будет использовать сцену по умолчанию, то есть лицом к лицу.
Наличие сцены обязательно для возможности мультипликации собеседников
Информация о сценах (en) [/td][/tr][/table]
скриншот
Теперь для каждой позиции выберите камеру по умолчанию, сделать это можно изменив в свойствах объекта параметр "default camera". Если вы хотите, вы можете добавить дополнительные камеры, которые впоследствии можно будет назначать для каждой реплики отдельно (а также применить изменение камеры во время произношения реплики). Пока мы не будем с этим заморачиваться, так как в нашем диалоге нам требуется простая сцена с двумя позициями и одной камерой. В дальнейшем, возможно, мы изучим и создание более сложных сцен.
Созданную сцену нужно поместить на локацию, в которой будет проигрываться наш диалог. Для этого откройте локацию в том месте где стоит наш Quest giver, выберите созданную вами сцену на палитре ресурсов. Теперь щелчком левой кнопки мыша разместите сцену на локации.
В результате проведённых вами манипуляций на локации появились два жёлтых макета и камера. Центр сцены обозначается красным флажком, что удобно, когда в одном месте локации размещены несколько сцен, накладывающихся друг на друга.
Теперь вам надо разместить локацию так, чтобы макет Quest giver'a и сам Quest giver примерно совпали. Точное совпадение не обязательно, а слишком большая разница может привести к неприятным эффектам в момент запуска диалога.
Итак, наша сцена размещена на локации и мы можем использовать её в диалоге.
Для этого вернитесь в редактор диалогов и, стоя на корневом узле, выберите вкладку "Cinematics". Там вы увидите поле и кнопку выбора сцены. Так как ранее эта сцена не использовалась в нашем диалоге, в выпадающем списке она отсутствует, и выбрать её необходимо с помощью кнопки выбора.
Как только вы укажете сцену внизу отобразится список доступных на этой сцене позиций. Щёлкнув мышкой в поле справа от названия позиции выберите участника диалога, которого вы желаете для неё назначить, OWNER и PLAYER.
Жесты
Редактор диалогов позволяет задавать собеседникам жесты и анимацию, которые они воспроизводят в момент проигрывания реплик. Наиболее простой способ сделать это - автоматическая генерация. Для автоматическоой генерации выберите корневой узел диалога и нажмите кнопку "Generate Gestures for Children" (#35 на панели инструментов). Так же эту операцию можно выполнить используя контекстное меню либо меню редактирования (Edit)
Эта операция пройдётся по всем веткам диалога и автоматически сгенерирует жесты для всех собеседников, которые учавствуют в диалоге.
Можно конечно создать все жесты вручную, либо отредактировать появившиеся в результате автоматической генерации. Но пусть это будет предметом отдельного учебника.
Теперь наши актёры при проигрывании диалога стали более оживлёнными и камера расположена так, как мы этого захотели. Но "лица их ещё пусты и непорочны", но и это мы сейчас легко исправим.
Озвучка диалога и анимация лица
Создание озвучки для каждой реплики диалога - задача масштабная (ну это зависит от масштаба самого модуля). Как временную меру можно использовать встроенную программу синтеза речи, что позволит не отвлекаться на озвучку диалога до окончания разработки мода. Выберите "Generate VO" и программа добавит к каждой реплике синтезированную речь.
[table][tr][td]Инфа:
Перед анимацией лица необходимо произвести озвучку реплик.
Простую озвучку вы можете сгенерировать автоматически.
Смотрите "Voice-Over (en)" о том, как записать собственную озвучку. [/td][/tr][/table]
Несмотря на то, что синтезированная озвучка примитивна, однако мы теперь более полно видим действие диалога и можем произвести анимацию лица (en).
В анимации лица первое, на что стоит обратить внимание - это движение губ при разговоре. Анимация лица генерируется не на основании текста, соответствующего реплике, а на основании самой звуковой дорожки, именно поэтому перед генерацией лица необходимо озвучить диалог. Также, используя расширение Robobrad, можно добавить эмоции, которые выражает собеседник во время разговора, для этого на вкладке "Cinematics" необходимо в поле "Emotion" выбрать нужную эмоцию.
Когда анимация лица сгенерирована, вы можете произвести её точную настройку, для этого выберите "Edit FaceFX" в меню "Tools". Это откроет редактор "FaceFX" с загруженной выбранной репликой. В рамках текущего учебника ме не будем рассматривать этот вопрос, но при желании вы можете подробней изучить его на странице FaceFX (en).
Чтобы создать свою озвучку, вам нужны будут сторонние программы для записи голоса. Записанный звуковой файл должен быть формата ".wav". Этот файл должен быть записан (или конвертирован) Моно PCM 24 khz 16 bit, в противном случае будет выдано сообщение об ошибке.
Готовые файлы должны быть размещены по пути "~Папка установки игры~\addins\[moduleuid]\module\override\toolsetexport\[lineid]_m.wav". Можно конечно всё сохранять в одной папке, но мы рекомендуем подойти к этому более организованно и сохранять файлы отдельно для каждого диалога.
Название файла должно иметь следующий формат "[lineid]_m.wav", где [lineid] - ID номер записи в String table, соответствующей реплики диалога. Для примера, если ID номер реплики - 344169, то звуковой файл надо сохранить как "344169_m.wav".
Когда вы генерируете озвучку посредством встроенного синтезатора речи, тулсет предварительно проверяет все строки на наличие ассоциированных с ней звуковых файлов, и только в случае их отсутствия генерирует искуственный голос. Ассоциированные звуковые файлы не изменяются.
Быстрый способ проверить как сработала автоматическая генерация - запустить файл по пути "~installpath~\Dragon Age\addins\[moduleuid]\core\override\toolsetexport\[conversationname].fsb" с помощью штатного проигрывателя Windows Media player. Вы услышите все звуковые дорожки, записанные для этого диалога.
[table][tr][td]
Обратите внимание!
Когда вы создаёте dazip перед распространением мода (en), вам не нужно включать звуковые файлы в архив! Все звуковые файлы, используемые игрой, сохраняются в файлах ".fsb".
[/td][/tr][/table]
Известные проблемы
Воспроизведённые диалоги не отображаются в журнале диалогов Героя Все диалоги Героя сохраняются в его журнал, что позволяет при необходимости освежить себе память. Если вы предполагаете, что эта функция не работает или работает неправильно, то удостоверьтесь, что вы произвели Check In (en) вашего диалога и существа перед экспортом вашего .tlk-файла (en). Для получения большей информации смотрите "{{ulink|String_editor#Generated string IDs|Генерация generated string IDs]]".
Переводчик: Kelamor
Эта же статья на Dragon age toolset wiki