Conversation tutorial/ru

From Dragon Age Toolset Wiki
< Conversation tutorial
Revision as of 00:51, 13 November 2010 by Kelamor (Talk | contribs) (Правка)

Jump to: navigation, search
Conversation topics

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

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

Создание и установка диалога для существа

  • Корневой узел (root) диалога содержит настройки, действующие на все последующие реплики.

В учебнике по существам (en) мы создали НПС под именем "Quest Giver", который стоит возле своей лачуги, которую заняли монстры. Цель данного урока в том, чтобы этот товарищ пропросил нас освободить его лачугу перебив, естественно, монстров.

Первое, что нам нужно сделать, это создать сам ресурс диалога. Назовите диалог так, чтобы по имени можно было понять, что это за ресурс и с чем он связан. Мы назовём наш диалог - "conv_quest_giver". Новый диалог создаётся пустым, с одним корневым узлом. Корневой узел не является репликой и содержит различные настройки, которые относятся к диалогу в целом.

Когда корневой узел выбран, на панели вкладок (ниже окна реплик) выберите вкладку "Global settings":

Conversation root global settings.png

  • "OWNER" - существо, которому назначен текущий диалог.
  • "PLAYER" - игрок.
  • Диалог назначается существу путём выбора свойства "Conversation".

Свойства, назначенные по умолчанию, отлично подходят для диалога между игроком и одним НПС (что нам и нужно). "OWNER" - это существо, которому назначен диалог, в нашем случае это Quest Giver. "PLAYER" - это, само собой, наш герой.

  • Default NPC Speaker: Это существо (Говорун), которое по умолчанию разговаривает с игроком (отвечает, реагируя на выбор реплик).
  • Default NPC Listener: Это существо (Слушатель Говоруна), которому предназначены ответы Говоруна. Данное свойство используется, чтобы определить, к кому Говорун должен повернуть голову во время произношения реплики.
  • Default PC Listener: Это существо (Слушатель Героя), с которым говорит наш Герой, когда вы указываете реплику, которую он должен произнести. Данное свойство используется, чтобы определить, к кому должен повернуть голову Герой во время произношения реплики.

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

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

Первым делом после создания диалога нам необходимо задать нашему Говоруну (Quest Giver) реплику, которую он произнесёт, когда Герой попытается заговорить с ним. Для этого в Тулсете откройте ресурс существа и, нажав кнопку выбора (Ellipsis.png) справа от свойства "Conversation", выберите диалог "conv_quest_giver" (по умолчанию стоит "none").

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

  • Реплики красного цвета - реплики существа, которое является на настоящий момент Говоруном.
  • Реплики синего цвета - реплики Героя. Если реплик несколько, то возможен выбор между ними.
  • Реплики серого цвета - отсылочные реплики, то есть являющиеся ссылками на другие реплики.
  • Добавить реплику можно посредством пункта "Insert Line" в контекстном меню, кнопкой #23 на панели инструментов либо сочетанием клавиш "Ctrl+A".
  • Добавить ссылку можно путём копирования реплики, к которой должен быть отослан диалог, и в нужном месте в контекстном меню выбрать "Paste as Link" либо "Ctrl-Shift-V".

Добавление первой реплики производится при выбранном корневом узле посредством правой кнопки и выбора пункта меню "Insert Line".

Conversation toolbar.png

Первая реплика диалога принадлежит Говоруну (красный цвет реплики). Кто именно является Говоруном для реплики указано в её начале - [[OWNER]]. Когда игрок вступает в контакт с НПС, являющемся владельцем диалога, первой произносится именно эта реплика.

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

Conversation dialog.png

Предположим, что на вступительную реплику Говоруна Герой должен выбрать между тремя вариантами продолжения диалога, а именно:

  • Поприветствовать собеседника.
  • Задать ему вопрос.
  • Проигнорировать его.

Выберите реплику Говоруна и добавьте три дочерние реплики, которые будут окрашены в синий цвет. Теперь для каждой новой реплики введите текст, который должен произнести Герой.

Conversation tutorial 1.png

Вот таким образом будет выглядеть начало нашего диалога:

Conversation tutorial quest giver speaks.png

Диалог может продолжаться путём добавления последующих реплик с разным количеством вариантов. Например один ответ НПС на каждую реплику Героя и несколько вариантов реплик Игрока, расширяющих диалог.

Когда диалог доходит до конца одной из своих веток, посредством реплики-ссылки он может быть отослан к любой реплике диалога, позволяя таким образом исследовать другие варианты его развития. Добавить ссылку можно путём копирования реплики, к которой должен быть отослан диалог, и в нужном месте в контекстном меню выбрать "Paste as Link".

Важно
  • Ссылки позволяют создать диалог используя меньшее количество реплик и избежать за счёт отсутствия повторяющихся реплик излишнего его расширения.
  • Выяснить, куда ведёт ссылка, можно выбрав в контекстном меню пункт "Jump to Target" либо дважды щёлкнув мышкой.
  • Найти все ссылки на текущую реплику можно выбрав в контекстном меню пункт "Find Links".

В данном примере на первую реплику Героя Quest Giver отвечает "Отлично! У меня есть задание, которое сможешь выполнить только ты!". По идее Герой на это может ответить "О, Проблемы? Чтож, я могу помочь!", но эта реплика у нас уже есть в диалоге, поэтому дублировать её нет смысла, к тому же тогда нам придётся дублировать и всю ветку ветку, отходящей от этой реплики.

Вместо этого скопируйте её и вставьте как ссылку после реплики Говоруна.

Conversation tutorial 2.png

Созданная реплика будет серого цвета.

Чтобы выяснить, куда ведёт ссылка, выберите в контекстном меню пункт "Jump to Target" либо дважды щёлкните мышкой. С помощью пункта контекстного меню "Find Links" можно выяснить откуда приходят ссылки на выбранную реплику.

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

Отслеживание текущего состояния задания посредством Plot-файла

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

Теперь, когда у нашего Героя появилось задание, текущее состояние которого необходимо отслеживать, нам нужен какой-то механизм, позволяющий сделать это. В 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".

Plot tutorial 1.png

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

  • Раздел "Action" (действие) вкладки "Plots and Scripting" позволяет устанавливать(set) в TRUE или сбрасывать(clear) в FALSE флаг в любом Plot-файле либо запускать скрипты по завершению реплики.
  • Раздел "Condition" (условие) вкладки "Plots and Scripting" позволяет регулировать видимость реплики для игрока в зависимости от указанных условий о состоянии флагов в Plot-файлах либо о выполнении скрипта.

Самый быстрый и лёгкий способ установить значение флага - это диалог. В данном случае, когда Герой примет задание, мы хотим установить значение TRUE флагу "QUEST_ACCEPTED" Plot-файла "clear_the_hut plot":

  • Выберите реплику Героя, где он соглашается выполнить задание и перейдите на вкладку "Plots and Scripting".
  • В разделе "Action" выберите наш Plot-файл "clear_the_hut" (первоначально его не будет в раскрывающемся списке, и вам понадобится его выбрать в окне выбора файлов).
  • В выпадающем списке выберите флаг "QUEST_ACCEPTED".
  • Оставьте действие над флагом без изменения, так как по умолчанию устанавливается "set", а мы и хотим установить флаг как TRUE.
  • Убедитесь, что реплика теперь отмечена буковкой "А", обозначающую, что для этой реплики установлено действие.

Теперь, когда мы дойдём в диалоге до этой реплики, флаг "QUEST_ACCEPTED" в Plot-файле "clear_the_hut" будет установлен в TRUE. Установка флага, в свою очередь обновит запись нашего Plot-файла в журнале на текст, ассоциированный с установленным флагом.

  • Хотя бы одна из первых реплик Говоруна должна быть чистой от условий, в противном случае диалог может даже не начаться.
  • Игра проверяет условия по репликам сверху вниз, то есть если условие первой реплики определяется как True, диалог заходит в эту ветку, не проверяя следующую.
  • Убедитесь, что последняя реплика каждого ответвления каждой ветки не имеет условия на своё отображение, так как в противном случае диалог может зайти в тупик.

Если Герой согласился выполнить задание, ветка диалога, в которой Герой его получает, больше не должна отображаться. Для этого нам необходимо перейти на первую реплику этой ветки и добавить условие на её отображение (на вкладке "Plots and Scripting" в разделе "Condition" выберите Plot-файл "clear_the_hut", выберите флаг "QUEST_ACCEPTED", и установите условие "is false".

Conversation tutorial 4.png

Это означает, что данная ветка появится в диалоге только если Герой ещё не согласился на задание. Отметьте, что реплика теперь отмечена буковкой "С", обозначающую, что для этой реплики установлено условие на отображение. А так как последующие реплики зависят от появления первой, наш Герой не сможет принять задание дважды и не нарушит установленный ход приключения.

Однако теперь, когда Герой выполнит задание и принесёт головы монстров в мешке, НПС будет нечего ему сказать. А это значит, что нам нужно добавить в диалог ещё несколько реплик.

Выберите корневой узел и добавьте для Говоруна вторую "первую" реплику, с которой также может начинаться разговор. Так как новой репликой Говорун спрашивает, убили ли мы уже монстров, нельзя, чтобы она появлялась в диалоге до тех пор, пока задание не будет принято Героем. То есть в диалоге не должны одновременно появляться обе первые реплики. Установите условие, как показано в нижеприведённой илюстрации.

Conversation tutorial 5.png

  • Репликам Героя также могут быть установлены условия, определяющие отображать их или нет.

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

Как установить флаг "MONSTERS_SLAIN" посредством скриптинга смотрите статью о Plot-файлах и учебник Написание скриптов в DA, мы же пока просто установим для реплики "Yes, I have" условие, что флаг "MONSTERS_SLAIN" имеет значение TRUE. И тогда последующая за ней реплика Говоруна может установить значение флага "REWARD_RECEIVED" в TRUE, в результате чего Герой получит награду за успешно выполенное задание.

Чтобы Герой не мог получать награду за выполненное задание неоднократно, можно задать для реплики "Have you slain the monsters yet?" условие, что флаг "REWARD_RECEIVED" является ложным. И, наконец, добавьте третью "первую" реплику Говоруна, в которой он уведомит Героя, что заданий больше не осталось и разговаривать более не о чем.

Conversation tutorial 6.png

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

Простые сцены

  • Stages define where characters stand and how the camera is positioned during a conversation
  • A conversation without a stage will use a basic default camera positioning
  • You need to define a stage for a conversation before you can give the actors animations

If you run through the conversation as it currently exists you'll find that all of the mechanics are there, but that the performance of our virtual actor leaves a lot to be desired - he simply stands there silent and motionless, staring at the player. The camera angle is also somewhat bland. This can be remedied by adding a stage to perform the conversation in.

A stage is a set of locations where the participants in a conversation will be positioned, and locations where various cameras will be placed. Create a new stage resource and name it something informative, such as hut_exterior_quest_giver. You'll be presented with an empty, featureless stage. The stage editor window defaults to having four different views of the stage; if you want to change this you can find the setting for this under the "Tools->Options" menu.

  • "place" objects are spots where the conversation's participants will stand
  • The identity of the creatures occupying places is set in the conversation editor
  • Each place should have a default camera selected. This camera is used by default when the creature occupying that place is talking.

Stages can be complex but in this case we'll keep it simple. Right-click somewhere near the center of the stage and insert a "place" object, and then again to insert a second "place" object. You'll create two blank-looking yellow figurines. These figurines will represent the two creatures who will be involved in the conversation, the player and the quest giver. You'll want to turn one of them to face the other and put them relatively close together.

You'll then want to insert a camera for the conversation to use. Right-click, select insert, and select camera. Position the camera so that it has a view over the shoulder of one of the two figures and is looking at the other figure, a standard over-the-shoulder shot. You can adjust the camera more easily by setting one of the four views to be the camera's view; right-click on the frame, go down to the "camera" option, and select which of the cameras the frame should provide the view of. You can also select the "Safe Frame" option, which puts a border on the view showing only what will be visible in-game.

Stage tutorial 1.png

For each place you'll want to define a default camera; this is the camera that will be used to view the creature standing in this place when that creature is talking in the game. Select the place and in the object inspector select "camera1" for the default camera.

If you wish, you can put in additional cameras. In the conversation editor you will have options to select which cameras are active, and even to cut from one camera to another in the middle of a line. We won't do that yet, however; we currently want this to be as simple a stage as possible. A future tutorial will cover stages in more depth.

  • Once a stage resource is created, it must then be placed in the area editor
  • Place the stage so that the conversation's participants won't have to be moved far

Once the stage has been created, we'll need to place it in the area where the conversation is to take place. Open the hut exterior area in the area editor and go to the location where you've placed the Quest Giver. Find the stage in the resource palette, place it in the area, and you'll see the blank figures and the camera appear. There will also be a red flag similar to a waypoint; this marks the center of the stage and is useful for distinguishing them when there are many stages overlapping each other in an area. Position the stage so that the place where the quest giver will be standing is approximately where he is right now; it doesn't have to be exact, but if he changes location dramatically when the conversation starts it might be a bit jarring.

Stage tutorial 2.png

  • Assign the stage to the conversation in the conversation editor
  • Then assign which conversation participants use which places defined by the stage

Now that the stage has been placed, we can set the conversation to use it. Go back to the conversation editor, select the root node, and then select the "Cinematics" tab. There will be an option there to set a stage. Since we've never selected this stage before it won't be in the dropdown list, use the ellipsis button to select the stage from the available stage resources.

Once the stage has been selected the two places that are part of the stage will be listed below. You'll want to assign them to the two participants in this conversation, OWNER and PLAYER.

Conversation tutorial 7.png

Gestures

  • Once a stage is set you can automatically generate gestures
  • To generate gestures for all nodes in a conversation, select the root node and generate gestures for children

Select the root node of the conversation and then click on the "Generate Gestures for Children" button (#35 on the toolbar, or in the right-click menu for the node, or in the edit menu)

Conversation toolbar.png

This will run through all of the nodes beneath root and automatically generate some random gestures appropriate for a man standing and talking to someone. These gestures can be customized and fine-tuned, but this will be the subject of a separate tutorial.

Now at last our actors are a little less wooden; they move around a bit, and the camera is in an interesting place. But their faces are still completely blank. This too can be easily remedied.

Voice-over and FaceFX

  • You need to have voice-over recorded to generate a facial performance with FaceFX.
  • You can generate a basic placeholder voice-over automatically.
  • See Voice-Over for information on how to record your own voice over.


Every line of dialog in Dragon Age can have voice-over recorded for it, which as one might imagine can be a daunting task. As a temporary measure during game development you can instead generate a temporary placeholder voice-over using a basic speech synthesis program. Under "Tools" select "Generate VO" and synthesized voice-over will be added to every line.

Conversation generate VO.png

The synthesized voice over is very primitive, but it allows you to test the conversation and fine-tune other details without having to record voice as you go - you can leave voice recording until later, once you've finalized all the dialog. It also allows us to generate a facial performance using FaceFX.

Conversation generate FaceFX.png

The most obvious component of facial performance is lip-synching. FaceFX generates lip-synching from the actual audio of the line, not just from the text of the dialog, so voice over needs to be generated before FaceFX can be run. FaceFX also adds emotional cues to the character's expression using an extension called RoboBrad. You can select the emotion to be added from the "Emotion" field in the cinematics tab for each line of dialog.

Conversation cinematics.png

Once you've generated a facial performance, you can fine-tune it by selecting "Edit FaceFX" from the tools menu. This will open FaceFX with the selected line of dialogue loaded. We won't be doing this in this tutorial, but if you want to try it out and see what options FaceFX provides see the FaceFX page for more detail.

Conversation edit FaceFX.png

To record your own voice-over, you'll need some method for recording your voice (Windows comes with a basic sound-recording program but other more sophisticated programs are available free for download as well) as a wav file. The wav file must be recorded in or converted to PCM 24 khz 16 bit mono format, otherwise the process will fail and an unhelpful error message will be displayed.

Real vo needs to be stored in ~installpath~\Dragon Age\addins\[moduleuid]\module\override\toolsetexport\[lineid]_m.wav - you can dump wav files anywhere under the toolsetexport directory and they will be picked up but for organizational purposes you should probably organize it into subfolders grouped by conversation.

The wav file's filename must be of the form "[lineid]_m.wav" with [lineid] replaced by the ID number for the conversation line's string table entry. For example, if a conversation's line ID number is 344169, you'd save the voice over for this line as "344169_m.wav".

When you select "generate vo" from the toolset, the toolset will first check the above directory for properly named files. Any wav files that are not present will have robo vo created, and any that do exist will be used as-is.

A quick way to verify that voice over generation worked after processing: go to ~installpath~\Dragon Age\addins\[moduleuid]\core\override\toolsetexport\[conversationname].fsb and play it with windows media player. You will hear all of the vo lines for that conversation packaged together with whatever combination of real and robo vo all slapped together in one file.

Note that when you are doing a Builder_to_player create, you do not need to include the .wav files within the package. The sound used by the game is all stored in the .fsb files, and thus including the .wav files will only unnecessarily increase the size of mod.

Common Problems

Conversation history not showing up in the player's journal

The journal has a conversation history tab that you'll want your dialogue lines to show up in as well. If that doesn't seem to be working right or at all, make sure you check your dialogue and creatures back in before exporting your talk table. See the section on generated string IDs for more information.

Язык: English  • русский