Учебник Bethesda Диалог

Навигация

Материал из Creation Kit Русский
Перейти к: навигация, поиск
Учебник Bethesda Диалог
Серия Основы Проектирования Квестов, глава 3
Вернуться в Учебный центр
LeftArrow.png Предыдущий учебник Следующий учебник RightArrow.png
Примеры плагинов:
Начальный Завершенный

Обзор

В этой главе, мы проведем вас через создание специальных диалогов для нашего урока по квестам - "Единственная надежда Бенду Оло."

Вы узнаете:

  • Как пишутся диалоги для Skyrim в редакторе Creation Kit.
  • Как использовать скрипты на основе события - выбранного игроком пункта в диалоге.

Просмотр Диалогов

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

NewFeature.jpg Если вы привыкли к старому стилю создания системы диалогов в Fallout 3 и предыдущих играх, эта функция по-прежнему доступна для вас на вкладке Player Dialogue (по сути, вкладка dialogue view это та же старая система, только с более шикарным интерфейсом).

Чтобы начать работать в этом режиме, откройте ваш квест (GSQ01) и щелкните по нему дважды, чтобы открыть окно quest. Затем перейдите на вкладку Dialogue Views. Теперь ваше окошко будет выглядеть так:

EmptyDialogueTab.png

Чтобы создать новый вид, правой щелчок в таблице в левой части окна и выберите пункт "New". Вам будет предложено ввести уникальный ID для этого вида, и он автоматически получит ID нашего квеста и буде использовать его в качестве префикса. Назовите этот вид "GSQ01BenduView." Кликните по нему в таблице, чтобы выделить.

DialogueViewsContextMenu.png

Пока мы ничего не добавили в этот вид, поэтому видим скучное белое пространство. Щелкните правой кнопкой мыши в этом пространстве, и выберите пункт "Create Branch." Вам будет предложено назвать эту branch, введите здесь "GSQ01MeetingBenduBranch". Ещё вам предложат назвать ID стартовой темы (вы можете оставить стандартное значение "GSQ01MeetingBenduBranchTopic"), и после нажатия Enter вы увидите группу прямоугольников, которые, вероятно, ничего не значат для вас. Но это пока, сейчас со всем разберемся, не пугайтесь.

DialogueStartingBranch.png

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

  • Response: Одиночная линия диалога, которую произносит NPC. Лимит текста здесь составляет 150 символов. Он может быть присоединен к какой-то эмоции и анимации для NPC которые он будет проигрывать и при этом говорить.
  • Info: Собранная вместе коллекция ответов для одного события. Когда персонаж говорит множество линий одну за другой, это одинарная Info с множественными ответами.
  • Topic: Коллекция информации, которую NPC может произносить в какой-то конкретной ситуации, зачстую это происходит при ответе на конкретный пункт диалога.
  • Branch: Коллекция тем, которые составляют определенную часть разговора с точки зрения игрока.

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

DialogueStartingBranchLabeled.jpg

Темы

Двойной щелчок по теме, чтобы открыть окно Topic.

EmptyTopicWindow.png

Единственное что нас волнует в этом окне на данный момент - это поле "Topic Text". Это будут строчки, которые игрок будет выбирать из списка вариантов ответа в диалоге с NPC. Мы собираемся установить игрока как обычного искателя приключений, который помогает окружающим, поэтому впишите здесь "Нужно ли вам чем-то помочь?"

Двойной щелчок в таблице Info, и у нас появится возможность написать то, что ответит NPC.

EmptyResponseWindow.png

В поле "Response Text"(Текст ответа персонажа), введите: "Ну да, раз уж вы спросили об этом. Какой-то грязный вор скрылся с моим амулетом. Не могли бы вы... ну... вернуть мне его назад?"

Теперь нажмите кнопку OK внизу окна дважды. Окно исчезнет, и вы увидите окно Topic Info.

InDepth.jpg Если вы скопировали текст из этого урока не меняя его и вставили в нужное поле, то окно проверки орфографии не появится, а щелчок по кнопке "ОК" внизу окна первый раз пройдет без каких-либо действий и только второй щелчок закроет окно response. А если вы изменяли текст и появилась проверка орфографии, то нажать на кнопку "ОК" нужно будет всего лишь один раз.

Окно Topic Info

TopicInfoWindowStart.png

В этом окне множество данных, но большинство из них является излишним для нашей цели. Теперь нам нужно позаботиться о таблице в средней части окна. Здесь мы сузим круг лиц, которые смогут говорить эту информацию. Если мы просто нажмем здесь "OK" и оставим условие пустым, каждый NPC в игровом мире теперь будет иметь диалог "Нужно ли вам чем-то помочь?"

Правый щелчок мышкой в таблице Conditions и выберите пункт "New" чтобы задать первое условие для нашей информации.

ConditionItem.png

Каждое условие является независимой проверкой, которая в итоге возвращает как True(Истина) или False(Ложь). Если все условия в списке верны, то эта информация будет показана. Наше первое условие будет просто напросто ограничивать круг лиц до одного игрока, чтобы только он мог сказать эти слова, значение "GetIsID" выбрано по-умолчанию, потому что оно чаще всего используется в условиях диалога. Нажмите на кнопку в середине с надписью "INVALID", здесь мы сможем выбрать нужного нам актера. Выберите "GSQBenduOlo" из выпадающего меню и нажмите "OK".

ConditionItemFilled.png

Нажмите "OK" в окне condition для его закрытия, и затем вы должны увидеть это условие в списке. Теперь только Бенду сможет попросить у нас помощи, но мы не хотим, чтобы он говорил это каждый раз; допустим он уже дал игроку задание. Таким образом, мы собираемся добавить еще одно условие. Щелчок правой кнопкой в списке условий и выберите пункт "New" снова.

Мы собираемся еще больше ограничить этот кусок диалога, основанный на данном этапе квеста. Поэтому щелкаем по выпадающему списку Condition Function и выбираем "GetStage." (Когда выпадающий список выделен, вы можете начать набирать первые пару символов на клавиатуре - это намного быстрее чем прокручивать список.) Теперь, если вы нажмете на кнопку "INVALID" чтобы выбрать параметры, появится окно с выпадающим списком квестов, а не список объектов (так как редактор знает что условие GetStage работает только с квестами). Выберите "GSQ01" из меню и нажмите "OK".

Теперь, все что осталось задать в условии, это какой этап квеста мы будем проверять. Так как мы знаем что наш квест начинается с 0 этапа, мы должны выбрать "==" для сравнения и установить значение "0", но это может нарушить данное условие, если перед этим добавить какой-то этап. В данном случае, самым безопасным способом будет проверить, меньше ли 10 значение этапа квеста в данный момент, так что выберите "<" из выпадающего списка Comparison и впишите "10" в поле Value.

ConditionItemGetStage.png

InDepth.jpg Имейте в виду, что вы можете изменить порядок условий правой и левой стрелочками на клавиатуре или кнопками слева внизу окна condition. В данном примере, порядок не имеет особого значения, но если вы установите в ваших условиях как логические ИЛИ(OR), так и логические И(AND), то порядок будет иметь значение.

Финальная версия окошка topic info должна выглядеть так:

TopicInfoWindowFilled.png

Нажмите "OK" чтобы закрыть окно Topic Info, затем "OK" ещё раз, чтобы закрыть окно Topic window.

Связывание Диалога

Наконец, возвращаемся в окно Dialogue View! С уже немного новым отображением диалога. Если вы хотите увидеть весь текст (а почему бы нет?), поставьте галочку у "Show All Text", что в нижней части окна.

DialogueViewWithStuff.png

Теперь, когда Бенду задает нам вопрос, нужно дать шанс игроку, чтобы ответить на него. Правый щелчок в поле branch(ветка) и выберите "Add Topic." (Если вы не увидели этого пункта в контекстном меню, значит вы просто кликнули не в поле branch(ветка).)

Откроется новое окно topic. Вам нужно присоединить к этому сообщению свой ID; выберите "GSQ01MeetingBenduYes", этот пункт будет срабатывать, когда игрок согласился помочь. Введите текст: "Конечно, я с радостью помогу тебе." в поле topic text, и сделайте двойной щелчок в таблице info чтобы добавть ответ для Бенду. В пункт Responce Text, введите "Как я вам благодарен! Вор убежал в место, называемое Гнездо Ветров Предела. Пожалуйста, поспешите, я заплачу вам в два раза больше, чем стоит амулет!" Теперь, если вы нажмете "OK" то может вылезти ошибка проверки орфографии, просто нажмите кнопку Ignore, чтобы это пропустить, нажмите "OK" ещё раз, и вы вернетесь назад в окно Topic Info.

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

BadSoundExport.png


Поскольку мы не ставили никаких условий в этот диалог, игра до сих пор думает, что любой персонаж в игровом мире может сказать этот диалог, и постарается сделать соответствующие звуковые файлы для каждого типа голоса. Это большая трата дискового пространства (если вы планируете записывать голос), да и в принципе, пустая трата времени на запись этих звуков. Так что закройте это окно и добавьте условие GetIsID для GSQBenduOlo (как мы делали в окне topic info в предыдущем шаге). Теперь, если мы снова посмотрим в окно response, вы увидите, что этот текст произносится только типом голоса MaleDarkElf, и в списке только один этот файл.

GoodSoundExport.png

Теперь нажмите "OK" в окне Topic Info и в окне Topic до тех пор, пока снова не увидите окно dialogue view. У вас появится новая тема появившаяся в вашей ветке(branch), которая теперь расширена, чтобы туда влезла только что созданная тема.

MultiTopicBranch.png

Прелесть окна Dialogue Views в том, что мы можем расположить эти темы так, как удобнее для понимания. Во время запуска, игра не учитывает их позицию; это сделано чисто для удобства дизайнера. Таким образом, возьмите новую тему за верхнюю панель и перетащите её в удобное место.

Сделайте ещё одну тему(ID можете установить как GSQ01MeetingBenduNo), теперь уже с Topic Text: "Извини, не сейчас.", а ответ Бенду установите как "Эх, ладно..." Не забудьте добавить условие GetIsID в окне Topic Info(соответственно для GSQBenduOlo). Как только вы это сделаете, окно Dialogue View будет выглядеть как-то так:

UnconnectedDialogue.png

Все эти темы существуют в ветке, но игра ничего не знает о связи между ними. Мы собираемся соединить их вместе. Щелкните по теме GSQ01MeetingBenduBranchTopic, чтобы её выделить. Теперь нужно будет нажать ещё раз, но уже по строчке с текстом (вы увидите что курсор курсор принимает форму руки, когда наводите мышку над этим текстом) и потяните эту линию до темы GSQ01MeetingBenduYes. Сделайте тоже самое для второго варианта ответа, снова протяните линию от GSQ01MeetingBenduBranchTopic, но уже до темы GSQ01MeetingBenduNo.

ConnectedDialogue.png

Теперь, когда игрок выбирает строку "Нужно ли вам чем-то помочь?", Бенду ответит то, что мы указали, а затем появятся два результата для ответа, которые связаны с первым диалогом. Варианты ответов будут указаны в том порядке, в котором они были присоединены к этой теме.

Написание скриптов для Диалога

Мы собираемся сделать наши первые шаги здесь - в системе сценариев(или скриптов, как вам больше нравится), но это будет очень просто, так что не волнуйтесь, если это не ваша стихия.

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

Двойной щелчок по тексту "Как я вам благодарен..." под темой GSQ01MeetingBenduYes. (Запомните, что данное действие переместит нас непосредственно в окно Topic Info без предварительного вызова окна Topic.)

Внизу этого окна, вы можете увидеть блок Scripts внутри которого располагаются поля "Begin" и "End." Скрипт Begin запускается когда NPC начинает говорить свою строчку текста, и скрипт End запускается когда он заканчивает её произносить. (В терминологии скриптов, эти маленькие кусочки скрипта называются "script fragments"(фрагменты скрипта) - смотрите Topic Info Fragments чтобы узнать больше.)

В поле End, введите эту скриптовую команду: GetOwningQuest().SetStage(10)

Часть команды SetStage(10), как вы уже наверное догадались, в данный момент устанавливает этап квеста равный 10. А часть GetOwningQuest() говорит игре о том, что нужный нам квест - это тот, который содержит данный диалог. (Иногда бывает что нужно запустить другой квест, поэтому всегда нужно конкретно указывать, чего мы хотим)

Если вы нажмете "Compile" вы увидите что какая-то абракадабра появится под в списке "Script Name" что справа. Вы можете пропустить это. (Если вы что-то написали не верно, редактор вам об этом сообщит.)

Когда вы сделаете это и будете готовы закрыть окно, оно должно выглядеть так:

ScriptedDialogue.png

И это всё! Закройте окно, и поехали дальше. Обратите внимание, что в окне dialogue view, перед текстом, по которому мы щелкали, появится значок "[S]", так что мы можем легко определить, какие части диалога содержат игровую логику, связанную с ними, без необходимости открывать снова окна Topic Info.

Ветки и Условия

Только что мы сделали ветку для диалога. По-умолчанию это ветка "Верхнего уровня" (потому она и отображается окрашеной в оранжевый цвет). Сейчас вам не нужно беспокоиться об остальных типах веток; просто знайте, что ветка верхнего уровня это одна из первых доступных вещей, которую актер может сказать игроку.

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

Не стартовые темы могут содержать куда более меньший список условий, поскольку они, как правило, доступны только если начальная тема для своей ветки удовлетворяет условия. Вот почему мы ограничили их, сделав доступными только для конкретного NPC, так чтобы не создавались дополнительные файлы голоса персонажа. С точки зрения геймплея, это бы не имело значения.

Как только игрок выбирает тему, в которой нет дальнейших ссылок(на остальные темы), игра снова будет искать тему верхнего уровня, удовлетворяющую условиям, чтобы предоставить игроку какой-то выбор. Если ни одна не удовлетворяет, NPC закончит диалог с игроком.

Проверим в действии

Загружаем игру со включенным плагином и идем встретиться с Бенду. (Помните, что вы можете переместиться сюда с помощью COC MixwaterMillWorkersHouse.) Теперь у него есть что нам сказать.

DialogueInGame.jpg

Есть несколько проблем с диалогом, которые пока что остаются:

  1. Он переключается сразу на следующих список вариантов ответа. (Потому что нет звукового файла, если у вас не включены титры, вы не поймете что он говорит. Даже если вы попробуете прочитать этот текст, у вас этого не выйдет, потому что он очень быстро исчезает.)
  2. Если вы откажетесь ему помочь, то разговор снова вернется к теме верхнего уровня, что может показаться странным.

К счастью, это легко поправить.

Запись Временного Аудио Трека

Откройте GSQ01MeetingBenduBranchTopic и перейдите к окну Response этой темы. Внизу окна вы увидите кнопку "Record".

RecordButton.png

Нажмите эту кнопку, если у вас есть микрофон, подключенный к компьютеру, и вы сможете записать свой голос, произносящий текст, который написан в строчке. Если же у вас его нету (или вы самокритичны, и вам не нравится звук собственного голоса) вы можете просто записать несколько секунд тишины, тем самым позволив игроку прочитать текст. (На заметку: чтобы записать какой-либо звук, у вас ДОЛЖЕН быть микрофон. Если микрофон не подключен к компьютеру во время запуска Creation Kit, кнопка Record не будет производить никакого действия.) Нажмите кнопку Save чтобы сохранить записанный файл на диск.

Сделайте то же самое для двух других тем, которые мы сделали. (Так же, находясь в этом окне, можете указать какие эмоции будет изображать Бенду, произнося текст. Для этого из блока Audio в выпадающем списке Emotion Type выберите нужную вам эмоцию, их я опишу ниже.)

Типы эмоций:

  • Neutral - Нейтральное поведение
  • Anger - Находится в ярости
  • Disgust - Испытывает отвращение
  • Fear - Испытывает страх
  • Sad - Грустит
  • Happy - Счастлив
  • Surprise - Удивлен
  • Puzzled - Находится в недоумении

В теме для ответа "No", поставьте галочку около "Goodbye." Это заставит игрока выйти из диалога, так что в итоге, вы не будете снова в списке выбора ответов после окончания разговора. (Так же для варианта ответа "Yes" поставьте галочку около goodbye. Пока у Бенду только одна тема верхнего уровня, нам не нужно возвращаться обратно, потому что после того как он сказал это все, больше ему будет не чего произнести. Но если есть другой квест с диалогом к нему, это может вызвать путаницу у игроков.)

От автора: Я попробовал записать через свой дешевенький микрофон звуки, в принципе вышло, но очень тихо, и голос, конечно же от темного эльфа отличается. К тому же не учел той вещи, что персонажей озвучивают медленно для того, чтобы ещё синхронизация губ была нормальной, а я поспешил. Так что учтите это, и лучше звуки обработать, и только потом пересоздать файл синхронизации губ. Запись должна быть громкой, отчетливой и без лишних звуков, иначе под любой щелчок персонаж будет открывать рот :)

Дополнительный Диалог

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

В окне dialogue view, щелкните правой кнопкой чтобы создать новую ветку(Create branch), и назовите её "GSQ01BenduFinishBranch". Примите предложенное значение стартовой темы, и введите Topic Text, "Я принес твой амулет." В качестве ответа, напишите что-нибудь хорошее (Я написал "Я надеюсь вы устроили этому вору хорошую взбучку!"). Нам нужно поставить два условия; первое ограничивает диалог до Бенду, и другое, которое проверяет что этап квеста 30. И наконец, поставьте галочку около Goodbye, и установите в конце разговора этап квеста равный 40.

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

FinishingQuestDialogue.png

Мы до сих пор не рассматривали амулет, и квест не может изменить этап с 10 до 30, так что у нас ещё осталось над чем поработать!

InDepth.jpg Может показаться, что здесь очень много работы и ненужных данных, вместо того, чтобы просто показать текст и сказать несколько строк. Часть сложностей появилось исторически -- потому что эта диалоговая система появилась из старой текстовой диалоговой системы Morrowind'а, организация действий здесь может показаться немного уходящей в сторону и не конкретно направленной. Но те же самые системы также управляет несколькими персонажами, позволяя говорить тот же текст, боевые крики, приветствия игрока, удары, ответы и т.д. Поэтому, такая гибкая в настройке система иногда бывает сложной для понимания.

С некоторой практикой, все это станет второстепенным, и вы сможете машинально работать с системой диалогов, причем так быстро, как вы можете писать строки текста.


LeftArrow.png Предыдущий учебник Вернуться в Учебный центр Следующий учебник RightArrow.png