Difference between revisions of "Conversation tutorial/ru"

From Dragon Age Toolset Wiki
Jump to: navigation, search
(Перевод статьи)
 
m (Правка)
Line 8: Line 8:
  
 
{{rubox|
 
{{rubox|
* Корневой узел (root) диалога содержит настройки, действующие на все последующие реплики.
+
*Корневой узел (root) диалога содержит настройки, действующие на все последующие реплики.
 
}}
 
}}
  
In the [[creature tutorial]] we created a [[creature]] named "Quest Giver", who is standing outside a hut that's filled with monsters. The goal is to have the quest giver ask you to go in and kill all the monsters for him.
+
В {{ulink|creature tutorial|учебнике по существам}} мы создали НПС под именем "Quest Giver", который стоит возле своей лачуги, которую заняли монстры. Цель данного урока в том, чтобы этот товарищ пропросил нас освободить его лачугу перебив, естественно, монстров.
  
First, we need to create the conversation resource. Using the new resource command, select "conversation" and give it a resource name that will help keep track of its purpose. We're calling this conversation "conv_quest_giver". The new conversation starts out empty, with only a "root" node. The root node of a conversation doesn't contain any dialog itself; it is merely a container that holds various global settings that apply to the conversation as a whole.
+
Первое, что нам нужно сделать, это создать сам ресурс диалога. Назовите диалог так, чтобы по имени можно было понять, что это за ресурс и с чем он связан. Мы назовём наш диалог - "conv_quest_giver". Новый диалог создаётся пустым, с одним корневым узлом. Корневой узел не является репликой и содержит различные настройки, которые относятся к диалогу в целом.
  
With the root node highlighted, the global settings become accessible in the tabbed pane at the bottom of the conversation editing window:
+
Когда корневой узел выбран, на панели вкладок (ниже окна реплик) выберите вкладку "Global settings":
  
 
[[Image:Conversation root global settings.png]]
 
[[Image:Conversation root global settings.png]]
  
{{sidebox|
+
{{rubox|
* "OWNER" is the creature the conversation "belongs" to.
+
*"OWNER" - существо, которому назначен текущий диалог.
* "PLAYER" is the player's character
+
*"PLAYER" - игрок.
* A conversation is assigned to a creature in the ''creature's'' properties (the "Conversation" property)
+
*Диалог назначается существу путём выбора свойства "Conversation".
 
}}
 
}}
  
These settings have defaults that will be perfectly good for a conversation between a PC and a single NPC, as we will be doing here. The "OWNER" of the conversation will be the creature the conversation is attached to - in this case, Quest Giver. The "PLAYER" is, of course, the player's character.
+
Свойства, назначенные по умолчанию, отлично подходят для диалога между игроком и одним НПС (что нам и нужно). "OWNER" - это существо, которому назначен диалог, в нашем случае это Quest Giver. "PLAYER" - это, само собой, наш герой.  
  
*Default NPC Speaker: This is the creature who, by default, responds to the player's dialog selections.
+
*Default NPC Speaker: Это существо (Говорун), которое по умолчанию разговаривает с игроком (отвечает, реагируя на выбор реплик).
*Default NPC Listener: This is the creature who the NPC is directing those responses to. This is used to determine who the NPC should turn his head toward when speaking.
+
*Default NPC Listener: Это существо (Слушатель Говоруна), которому предназначены ответы Говоруна. Данное свойство используется, чтобы определить, к кому Говорун должен повернуть голову во время произношения реплики.
*Default PC Listener: This is the creature who the PC is talking to when he makes dialog selections, determining who the PC's avatar turns his head toward.
+
*Default PC Listener: Это существо (Слушатель Героя), с которым говорит наш Герой, когда вы указываете реплику, которую он должен произнести. Данное свойство используется, чтобы определить, к кому должен повернуть голову Герой во время произношения реплики.
  
These settings can be overridden on a line-by-line basis, something you'll usually only need to do when you're writing a conversation with more than two participants. We won't do that in this introductory tutorial. It's also possible to have an inanimate object (a placeable) as a participant in a conversation, which we also won't get into here.
+
Эти настройки могут быть изменены на любой реплике диалога, обычно их изменение требуется при создании диалога с более чем двумя участниками. Также стоит сказать, что в качестве участника беседы можно назначить и размещаемый объект (placeable). Однако в данном учебнике мы не станем рассматривать такие ситуации, так как они выходят за рамки понятия вводного учебника.
  
Also on this page are a number of checkboxes for locking cinematics. This is usually used to prevent the toolset from generating new automatic animations after you've fine-tuned things manually, we won't need to worry about that for now.
+
Также на этой вкладке имеются несколько флажков, использующих для того, что заблокировать изменение видеоряда. Обычно они используются, чтобы предупредить автоматические изменения Тулестом видеоряда, после того, как вы настроили его вручную.
 +
Но об этом нам волноваться пока рано.
  
Once the conversation resource is created, we'll need to tell the quest_giver creature that he's supposed to use it when the player tries to talk to him. Open the quest giver in the creature editor and change his "Conversation" property from the default (none) to "conv_quest_giver" by pressing the ellipsis ([[Image:ellipsis.png]]) button and selecting the conv_quest_giver dialog.
+
Первым делом после создания диалога нам необходимо задать нашему Говоруну (Quest Giver) реплику, которую он произнесёт, когда Герой попытается заговорить с ним. Для этого в Тулсете откройте ресурс существа и, нажав кнопку выбора ([[Image:ellipsis.png]]) справа от свойства "Conversation", выберите диалог "conv_quest_giver" (по умолчанию стоит "none").
 +
 +
== Формирование диалога ==
  
== Adding some dialog ==
+
{{rubox|
 
+
*Реплики красного цвета - реплики существа, которое является на настоящий момент Говоруном.
{{sidebox|
+
*Реплики синего цвета - реплики Героя. Если реплик несколько, то возможен выбор между ними.
* Red lines of dialog are spoken by NPCs one at a time
+
*Реплики серого цвета - отсылочные реплики, то есть являющиеся ссылками на другие реплики.
* Blue lines of dialog are selected from by the player and are presented as groups of options
+
*Добавить реплику можно посредством пункта "Insert Line" в контекстном меню, кнопкой #23 на панели инструментов либо сочетанием клавиш "Ctrl+A".
 +
*Добавить ссылку можно путём копирования реплики, к которой должен быть отослан диалог, и в нужном месте в контекстном меню выбрать "Paste as Link" либо "Ctrl-Shift-V".
 
}}
 
}}
  
To add a line to the root, you can right-click on it and select "Add Line". It's also available as a button in the toolbar (button #23, below) and with the shortcut "control-A".
+
Добавление первой реплики производится при выбранном корневом узле посредством правой кнопки и выбора пункта меню "Insert Line".  
  
 
[[Image:Conversation toolbar.png]]
 
[[Image:Conversation toolbar.png]]
  
The added node will be in red text, indicating it's non-interactive (spoken by the NPC) and tagged with <nowiki>[[[[OWNER]]]]</nowiki> to indicate who's speaking it. When the player initiates conversation with the conversation's owner, this is the first line that will be said.
+
Первая реплика диалога принадлежит Говоруну (красный цвет реплики). Кто именно является Говоруном для реплики указано в её начале -  <nowiki>[[OWNER]]</nowiki>. Когда игрок вступает в контакт с НПС, являющемся владельцем диалога, первой произносится именно эта реплика.
  
To determine what it is that the conversation owner says, select the node and go down to the dialog tab to enter the text. For the time being we won't need to worry about the other options below the dialog's main text entry field.
+
Текст реплики вводится на вкладке "Dialogue" (предварительно выбрав, конечно же, нужную реплику). Другие свойства, имеющиеся на этой вкладке мы пока рассматривать не будем.
  
 
[[Image:Conversation dialog.png]]
 
[[Image:Conversation dialog.png]]
  
Once the creature has spoken its line, the player needs to be prompted to give some sort of response. The player could greet the Quest Giver, ask him a question, or choose to ignore him. To add these options, select the line you just added and "Insert line" three times. This will add three blue lines as children of the red one. In each of these lines' dialogue tabs, add the text of the response the player can give.
+
Предположим, что на вступительную реплику Говоруна Герой должен выбрать между тремя вариантами продолжения диалога, а именно:
 +
*Поприветствовать собеседника.
 +
*Задать ему вопрос.
 +
*Проигнорировать его.
 +
Выберите реплику Говоруна и добавьте три дочерние реплики, которые будут окрашены в синий цвет. Теперь для каждой новой реплики введите текст, который должен произнести Герой.
  
 
[[Image:Conversation tutorial 1.png]]
 
[[Image:Conversation tutorial 1.png]]
  
Here's how it looks in game once we've initiated this conversation:
+
Вот таким образом будет выглядеть начало нашего диалога:
  
 
[[Image:Conversation tutorial quest giver speaks.png|600px]]
 
[[Image:Conversation tutorial quest giver speaks.png|600px]]
  
The conversation can continue being built in this vein with one NPC response for each of the player's options and one or more player options branching out in turn. When the player runs off the end of the conversation it ends, sending him back to explore mode.
+
Диалог может продолжаться путём добавления последующих реплик с разным количеством вариантов. Например один ответ НПС на каждую реплику Героя и несколько вариантов реплик Игрока, расширяющих диалог.  
  
{{sidebox|
+
Когда диалог доходит до конца одной из своих веток, посредством реплики-ссылки он может быть отослан к любой реплике диалога, позволяя таким образом исследовать другие варианты его развития. Добавить ссылку можно путём копирования реплики, к которой должен быть отослан диалог, и в нужном месте в контекстном меню выбрать "Paste as Link".
* "Copy" and then "Paste as Link" allows conversation trees to loop or merge branches
+
 
 +
{{rubox|
 +
*Ссылки позволяют создать диалог используя меньшее количество реплик и избежать за счёт отсутствия повторяющихся реплик излишнего его расширения.
 +
*Выяснить, куда ведёт ссылка, можно выбрав в контекстном меню пункт "Jump to Target" либо дважды щёлкнув мышкой.
 +
*Найти все ссылки на текущую реплику можно выбрав в контекстном меню пункт "Find Links".
 +
|Важно
 
}}
 
}}
  
Thanks to this branching pattern it is possible for a conversation's volume to grow at an exponential rate, rapidly becoming very tedious to write. Worse, there could be many points within a conversation tree where the same lines might be spoken, leading to redundancy. This can be solved by "linking" lines to each other, allowing the conversation to jump from one branch to another or to loop back on itself to replay parts over again.
+
В данном примере на первую реплику Героя Quest Giver отвечает "Отлично! У меня есть задание, которое сможешь выполнить только ты!".  
 +
По идее Герой на это может ответить "О, Проблемы? Чтож, я могу помочь!", но эта реплика у нас уже есть в диалоге, поэтому дублировать её нет смысла, к тому же тогда нам придётся дублировать и всю ветку ветку, отходящей от этой реплики.  
  
In this example, we'll have the Quest Giver respond to the player's first option with "Excellent! I have a quest I need performed for me!". At this point the player could respond with the same "Oh? What quests do you have in mind?" line that was an option initially, leading to the same response. Rather than duplicate the entire tree, select the existing "Oh? What quests do you have in mind?" line and copy it to the clipboard (control-C, or right click copy, or edit -> copy). Then select the new owner line and paste as link (control-shift-V, right click paste as link, or edit -> paste as link)
+
Вместо этого скопируйте её и вставьте как ссылку после реплики Говоруна.
  
 
[[Image:Conversation tutorial 2.png]]
 
[[Image:Conversation tutorial 2.png]]
  
The linked line is shown in gray. To find out where a grey line links to, right-click on it and select "Jump to Target" (or just double click it). To find all the places the target line is linked to from, right-click on it and select "Find Links"
+
Созданная реплика будет серого цвета.
  
Now both of these paths through the conversation will lead to the same line, wherein the Quest Giver tells the player that the hut behind him is full of monsters. We can add an option to the dialog after this where the player can accept the mission to slay them all, and now when he enters the hut to fight them there will be more of a story behind about how he came to that point.
+
Чтобы выяснить, куда ведёт ссылка, выберите в контекстном меню пункт "Jump to Target" либо дважды щёлкните мышкой. С помощью пункта контекстного меню "Find Links" можно выяснить откуда приходят ссылки на выбранную реплику.
  
== Keeping track of quests via plots ==
+
Теперь две реплики из первой развилки приведут к одной и той же реплике Говоруна, в которой он рассказывает герою, что его лачугу захватили монстры.
 +
Теперь мы можем добавить последующей реплике Героя, которой он соглашается на задание, соответствующее действие, которое скажет игре, что Герой принял заказ на убийство всех монстров в лачуге, и заведёт запись о задании в журнале.
  
{{sidebox|
+
== Отслеживание текущего состояния задания посредством Plot-файла ==
* Plots contain lists of flags for keeping track of quest status and other world events
+
 
* Each flag can also contain journal text for the player to read
+
{{rubox|
 +
*Plot-файлы содержат флаги, которые дают информацию о том, в каком состоянии находятся те или иные отношения в мире, какие события уже произошли, и т.п.
 +
*Каждый флаг также может содержать журнальный текст, который игрок может прочитать в своём журнале.
 +
*Plot-файлы могут содержать информацию из кодекса, обучающую информацию, группировать другие Plot-файлы.
 +
*{{ulink|Plot|Информация о Plot-файлах}}
 +
|Plot-файлы
 
}}
 
}}
  
Now that we have a mechanism in place where we can assign a quest to the player we'll want some way to keep track of his progress. In Neverwinter Nights this was done using scripting directly, but in Dragon Age a new type of resource has been introduced that helps to simplify the process. These are "[[Plot]]s". Go to the resource palette and create a new plot with the resource name "clear_the_hut".
+
Теперь, когда у нашего Героя появилось задание, текущее состояние которого необходимо отслеживать, нам нужен какой-то механизм, позволяющий сделать это. В Neverwinter Nights это осуществлялось посредством прямого скриптинга, однако в Dragon Age появился новый тип ресурсов, который помогает упростить этот процесс. Это {{ulink|Plot|Plot-файлы}}.  
  
A plot consists of a series of named flags that can be set to true or false. The intent is for these flags to represent significant accomplishments or developments in the plot, with the values being set in response to the player's actions. Each flag can also have an associated journal text, a block of text that is displayed in the  player's journal under the plot's title. Journal text is normally used to keep the player informed of his progress and remind him of important information he's discovered along the way.
+
Создайте новый Plot-файл и назовите его "clear_the_hut".
  
We'll need to give the plot a "Name" property, which will be seen by the player as the plot's title in the journal. This plot's name will be "Clear the Hut". There are three significant landmarks in the course of this plot; the moment the player accepts the plot, the moment the player has succeeded in slaying all of the monsters in the hut, and the moment when the player reports back to the quest giver to receive his reward. We will therefore create three flags:
+
Plot-файл содержит некоторое количество поименованных флагов, которые могут иметь два значение - TRUE(Истина) или FALSE(Ложь). С помощью этих флагов игра отслеживает события игры (например выполнение задания или изменение отношений) и реагирует на изменение флагов, которое производится действиями игрока. Каждый флаг также может содержать журнальный текст, который показывается в журнале игрока под записью, которая совпадает с именем Plot-файла. Журнал обычно используется, чтобы держать игрока в курсе его продвижения по игре и напоминать о важной информации, которую он узнал по пути.
  
*QUEST_ACCEPTED
+
Итак, нам необходимо задать имя Plot-файла (свойство "Name"), которое будет отображено в журнале. Мы назовём его "Clear the Hut", то есть зачистка лачуги.
*MONSTERS_SLAIN
+
*REWARD_RECEIVED
+
  
Create flags by right-clicking on the plot editor and selecting "Insert -> Main Flag", or by clicking on "Insert Main Flag" in the toolbar, or by selecting "Edit -> Insert -> Main Flag" from the menu bar.
+
Наш Plot-файл является схемой задания, а в нашем задании есть три вехи:
 +
*Флаг '''QUEST_ACCEPTED''' - Герой согласился выполнить задание.
 +
*Флаг '''MONSTERS_SLAIN''' - Герой зачистил помещение путём умерщвления всех монстров.
 +
*Флаг '''REWARD_RECEIVED''' - Герой отрапортовал о выполнении задания и получил награду.
 +
Добавьте приведённые флаги в Plot-файл (пункт контекстного меню "Insert" -> "Main Flag", кнопка "Insert Main Flag" на панели инструментов, сочетание клавиш "Ctrl+M".
  
 
[[Image:Plot tutorial 1.png]]
 
[[Image:Plot tutorial 1.png]]
  
Each time a plot flag is set, that flag's journal text replaces the previous text that was in the journal for that plot.
+
Каждый раз, когда устанавливается значение флага, ассоциированный с ним текст заменяет в журнале уже имеющуюся запись этого Plot-файла. Если у вас есть чёткая очерёдность установки флагов, то можно избежать этого, устанавливая текст для флага с учётом предыдущего, то есть соединяя их.
  
{{sidebox|
+
{{rubox|
* The "Action" section of the "Plots and Scripting" tab of a conversation node allows plot flags to be set (made "true") or unset (made "false") when that line is finished
+
*Раздел "Action" (действие) вкладки "Plots and Scripting" позволяет устанавливать(set) в TRUE или сбрасывать(clear) в FALSE флаг в любом Plot-файле либо запускать скрипты по завершению реплики.
* The "Condition" section of the tab allows the line to be hidden or shown to the player based on the state of plot flags
+
*Раздел "Condition" (условие) вкладки "Plots and Scripting" позволяет регулировать видимость реплики для игрока в зависимости от указанных условий о состоянии флагов в Plot-файлах либо о выполнении скрипта.
 
}}
 
}}
  
The easiest way to set a plot flag is in a conversation. When the player accepts the quest to slay the monsters in the hut, we'll want to set the "QUEST_ACCEPTED" flag of the clear_the_hut plot. Select the line where the player accepts the quest and then click on the "Plots and Scripting" tab. Under the "Action" section we'll want to select the clear_the_hut plot. It won't initially appear in the dropdown list since we haven't selected it before (the dropdown list contains recently-used resources), so click on the ellipsis button and select it from the list of all plot resources. Then, once the correct plot is accepted, select the "QUEST_ACCEPTED" flag. The default action is "set", which will set the flag to true.
+
Самый быстрый и лёгкий способ установить значение флага - это диалог.
 +
В данном случае, когда Герой примет задание, мы хотим установить значение TRUE флагу "QUEST_ACCEPTED" Plot-файла "clear_the_hut plot":
 +
*Выберите реплику Героя, где он соглашается выполнить задание и перейдите на вкладку "Plots and Scripting".
 +
*В разделе "Action" выберите наш Plot-файл "clear_the_hut" (первоначально его не будет в раскрывающемся списке, и вам понадобится его выбрать в окне выбора файлов).
 +
*В выпадающем списке выберите флаг "QUEST_ACCEPTED".
 +
*Оставьте действие над флагом без изменения, так как по умолчанию устанавливается "set", а мы и хотим установить флаг как TRUE.
 +
*Убедитесь, что реплика теперь отмечена буковкой "А", обозначающую, что для этой реплики установлено действие.
  
Now when we reach this line in the conversation, the "QUEST_ACCEPTED" flag in the clear_the_hut plot will be set to true. This will also update the player's journal to show the journal text associated with that plot flag. You'll note that an "A" also appears in the icon for this conversation node, an indicator that this line of dialog has an action associated with it.
+
Теперь, когда мы дойдём в диалоге до этой реплики, флаг "QUEST_ACCEPTED" в Plot-файле "clear_the_hut" будет установлен в TRUE.
 +
Установка флага, в свою очередь обновит запись нашего Plot-файла в журнале на текст, ассоциированный с установленным флагом.
  
{{sidebox|
+
{{rubox|
* The first NPC (red) line that can be shown to a player will be; all subsequent NPC lines branching from the same node will be hidden
+
*Хотя бы одна из первых реплик Говоруна должна быть чистой от условий, в противном случае диалог может даже не начаться.
* Make sure the last child line of a node has no condition attached so that there will always be a default line to show the player
+
*Игра проверяет условия по репликам сверху вниз, то есть если условие первой реплики определяется как True, диалог заходит в эту ветку, не проверяя следующую.
 +
*Убедитесь, что последняя реплика каждого ответвления каждой ветки не имеет условия на своё отображение, так как в противном случае диалог может зайти в тупик.
 
}}
 
}}
  
Once the quest has been accepted, it makes no sense for the Quest Giver to offer it a second time. Indeed, if the player were to partially complete the quest and then accept it all over again, his progress through the quest would be disrupted and quite likely unexpected errors would slip into the game. Therefore, we are going to go back to the first line in this conversation and add a condition to it. Select the first line, go to the "Plots and Scripting" tab, and this time put the "clear_the_hut" plot in the ''condition'' section. Set the flag to "QUEST_ACCEPTED", and set the condition to "is false".
+
Если Герой согласился выполнить задание, ветка диалога, в которой Герой его получает, больше не должна отображаться. Для этого нам необходимо перейти на первую реплику этой ветки и добавить условие на её отображение (на вкладке "Plots and Scripting" в разделе "Condition" выберите Plot-файл "clear_the_hut", выберите флаг "QUEST_ACCEPTED", и установите условие "is false".
  
 
[[Image:Conversation tutorial 4.png]]
 
[[Image:Conversation tutorial 4.png]]
  
This means that this line of dialog will only appear if the quest has not yet been accepted. You'll note that a "C" appears in the node icon to indicate that this line of dialog has a condition attached. Since all of the other lines of dialog depend on this line appearing, including the offer of the quest and the line where the player accepts it, this means that the quest can only be accepted once; once it's been accepted the quest giver will not offer it again.
+
Это означает, что данная ветка появится в диалоге только если Герой ещё не согласился на задание.  
 +
Отметьте, что реплика теперь отмечена буковкой "С", обозначающую, что для этой реплики установлено условие на отображение.  
 +
А так как последующие реплики зависят от появления первой, наш Герой не сможет принять задание дважды и не нарушит установленный ход приключения.
 +
 
 +
Однако теперь, когда Герой выполнит задание и принесёт головы монстров в мешке, НПС будет нечего ему сказать. А это значит, что нам нужно добавить в диалог ещё несколько реплик.  
  
However, this will now leave the quest giver with nothing at all to say. We'll want to give him a different line to say instead. Select the root node of the conversation tree, add a line, and you'll get a second "first" line for the quest giver to say. The game will always pick the first line that can be spoken, so the player will never see the line "Have you slain the monsters yet?" until after he has accepted the quest and the line "Ahoy! I am the Quest Giver!" becomes hidden.
+
Выберите корневой узел и добавьте для Говоруна вторую "первую" реплику, с которой также может начинаться разговор.
 +
Так как новой репликой Говорун спрашивает, убили ли мы уже монстров, нельзя, чтобы она появлялась в диалоге до тех пор, пока задание не будет принято Героем. То есть в диалоге не должны одновременно появляться обе первые реплики. Установите условие, как показано в нижеприведённой илюстрации.
  
 
[[Image:Conversation tutorial 5.png]]
 
[[Image:Conversation tutorial 5.png]]
  
{{sidebox|
+
{{rubox|
* Player responses can also be made conditional, being hidden from the player if the condition fails.
+
*Репликам Героя также могут быть установлены условия, определяющие отображать их или нет.
 
}}
 
}}
  
Conditions can also be placed on player lines. In this case, we want the player to only be able to tell the quest giver that he's completed the quest once the monsters are actually dead. We'll be showing how the MONSTERS_SLAIN flag will be set up later, using scripting, but the details of how it is set are not important right now; we can set the conversation up to account for it and implement it later.
+
Репликам Героя также могут быть установлены условия, определяющие отображать их или нет. В нашем случае надо, чтобы Герой мог сказать, что все монстры убиты только в том случае, если они действительно убиты и задание выполнено.  
  
Set the condition for the line "Yes, I have" to require the MONSTERS_SLAIN flag to be true. The subsequent response from the quest giver can then set the REWARD_RECEIVED flag to true.
+
Как установить флаг "MONSTERS_SLAIN" посредством скриптинга смотрите {{ulink|Plot|статью о Plot-файлах}} и учебник {{ulink|Scripting tutorial|Написание скриптов в DA}}, мы же пока просто установим для реплики "Yes, I have" условие, что флаг "MONSTERS_SLAIN" имеет значение TRUE.  
 +
И тогда последующая за ней реплика Говоруна может установить значение флага "REWARD_RECEIVED" в TRUE, в результате чего Герой получит награду за успешно выполенное задание.
  
To prevent the player from accepting his reward multiple times, add a condition to the line "Have you slain the monsters yet?" to require REWARD_RECEIVED to be false. Finally, add a third line off of root for the quest giver to say once the quest has been confirmed completed and there's nothing more for him to do.
+
Чтобы Герой не мог получать награду за выполненное задание неоднократно, можно задать для реплики "Have you slain the monsters yet?" условие, что флаг "REWARD_RECEIVED" является ложным.  
 +
И, наконец, добавьте третью "первую" реплику Говоруна, в которой он уведомит Героя, что заданий больше не осталось и разговаривать более не о чем.
  
 
[[Image:Conversation tutorial 6.png]]
 
[[Image:Conversation tutorial 6.png]]
  
And there you have it, a simple interactive conversation that will affect and be affected by the world around it.
+
Итак, один урок мы завершили. Теперь у вас есть интерактивный диалог, который в необходимой мере взаимодействует с миром игры.
  
== Simple stages ==
+
== Простые сцены ==
  
 
{{sidebox|
 
{{sidebox|

Revision as of 00:51, 13 November 2010

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  • русский