Difference between revisions of "Bethesda Tutorial Quest Loose Ends/ru"

From the CreationKit Wiki
Jump to navigation Jump to search
imported>Vitamant
imported>Vitamant
Line 299: Line 299:
Учти - указывая приветствия или прощания, ты полностью перекрываешь стандартные варианты. В будущем мы еще рассмотрим, как их можно смешивать.
Учти - указывая приветствия или прощания, ты полностью перекрываешь стандартные варианты. В будущем мы еще рассмотрим, как их можно смешивать.


=Loose Ends=
=Хвосты=
This should give you an idea of the kind of handling that needs to be done for every moving part of a quest. Even in this very simple example, there were lots of little odds and ends to attend to so the quest would be a more solid experience for the player.  
Надеюсь, теперь ты представляешь какие возможные проблемы могут подстерегать тебя при разработке квестов. Как можно улучшить, сделать задание интереснее, а реплики разнообразнее. Конечно же, это только начало, и многое тебе предстоит познать на собственном опыте. Но основы ты теперь знаешь


By thinking this way, you can help make your own quests flow more smoothly and be more fun for the player.
Будем надеяться, что это поможет тебе начать создавать собственные интересные задания, которые подарят много приятных мгновений игрокам со всего мира!


=Next Steps=
=Next Steps=

Revision as of 12:27, 13 April 2012

Bethesda Tutorial Quest Loose Ends



RoundRussianFlag.pngНа русском языке
Требуется помощь переводчика


Bethesda Tutorial Quest Loose Ends
Серия: Основы квестописания, глава 7
К другим учебникам
LeftArrow.png Предыдущая статья Следующая статьяRightArrow.png


Краткий обзор

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

Итак, что ты узнаешь:

  • Что мы сделали неверно.
  • Как это исправить.

Проблемы

Вот список недоработок, которые приходят на ум:

  1. Бэнду может... скоропостижно скончаться... после того, как квест будет принят. Сдать амулет, конечно же. будет уже некому.
  2. Бэнду рассказал о том, где может скрывать вор, однако место на карте мы не отметили.
  3. Добыть амулет можно и не убивая вора, просто пошарив у него в карманах. Квест выполнить будет можно, но одна из целей так и будет висеть незавершенной.
  4. Вор мог быть найден и убит\обворован до встречи с Бэнду.
  5. В финале квест завершается, но амулет Бэнду не забирает.
  6. Амулет может быть выброшен и утерян. Игрок, конечно, сам виноват, но наш долг этого не допустить.
  7. После отказа от выполнения задания, при следующей встречи, Бэнду будет говорить так, словно впервые видит игрока.
  8. У Бэнду в наличии лишь обезличенный стандартный набор приветственных и прощальных фраз.

Будем исправлять их по порядку. Некоторые из них имеют несколько решений, со своими плюсами и минусами.

Смерть квестодателя

У нас есть два варианта: мы можем либо отменить квест и убрать подальше от глаз, если Бэнду умрет, или же сделать его бессмертным. Оба варианта имеют свои достоинства и недостатки. Если квестодатель еще обязательно понадобится нам в будущем, то выбор очевиден.

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

Обработка смерти

Ранее ты уже узнал, как пометить квест завершенным. Теперь предстоит сделать тоже самое, только вместо пометки "Выполнен", нужно будет использовать "Провален".

Создай новую стадию квеста с индексом 200. Создай запись в журнале с нижеследующим текстом:

Мне не удалось вернуть Бэнду Оло украденный у него амулет.

Внизу отметь флажком "Fail Quest".

Теперь нужно изменить стадию квеста на 200, если Бэнду погибнет. Добавь ему скрипт (точно также, как проделал это с вором). Назови его GSQBenduOloScript. Текст скрипта следующий:

Quest Property GSQ01 auto

Event OnDeath(Actor akKiller)
	if (!GSQ01.IsCompleted())
		GSQ01.SetStage(200)
	endif
EndEvent

Примечание: мы ввели проверку на то, что квест еще не завершен. Было бы нелогично засчитать проваленным однажды выполненный квест.

You can auto-fill the GSQ01 property,

Бессмертный Бэнду

Альтернатива - сделать Бэнду неубиваемым. Если его здоровье опустится до 0, он не умрет, а упадет без чувств, но очнется, когда бой будет закончен.

Сделать это очень просто. Открой окно персонажа GSQBenduOlo, и поставь флажок "Essential" (существенный). ("Protected" (защищенный) - это похожая опция, которая позволяет убить персонажа только игроку и никому больше.)

Маркер на карте

Обычно, когда игроку становится о каком-нибудь месте в игре, на карту добавляется маркер, который позволяет легче сориентироваться и добраться до цели. Перейди к ячейке ReachwindEyrieExterior01 в пространстве Tamriel. (Для этого достаточно дважды щелкнуть по желтому маркеру двери в ReachwindEyrie01. [по которому не так-то просто попасть - прим. переводчика]) Прямо под дверью ты увидишь сине-зеленый прямоугольник с большой буквой М.

ReachwindMapMarker.png

Открой 10ую стадию квеста и и добавь в скрипт свойство типа ObjectReference. Назови его "DungeonMarker". Выбери маркер на карте, в качестве цели для этого свойства.

Затем измени скрипт:

SetObjectiveDisplayed(10)

DungeonMarker.AddToMap()

Карманные кражи

Взгляни еще раз на скрипт амулета, который призван продвинуть вперед сюжетную линию:

Quest Property GSQ01  Auto  

Event OnContainerChanged(ObjectReference newContainer, ObjectReference oldContainer)
	if (newContainer == Game.GetPlayer())
		GSQ01.SetStage(30)
	endif
EndEvent

Не сложно заметить, что когда игрок подберет амулет, квест перейдет в 30ую стадию. Вне зависимости от того был убит вор или нет. А значит, если амулет будет украден, 20ая стадия квеста так и останется незавершенной.

Исправить это не сложно. Достаточно немного подкорректировать наш старый скрипт. Выглядел он так:

SetObjectiveCompleted(20)
SetObjectiveDisplayed(30)

А теперь мы его подредактируем:

if (!GetStageDone(20))
	SetObjectiveDisplayed(10, False)
endif

SetObjectiveCompleted(20)
SetObjectiveDisplayed(30)

Вторая строчка НЕ отобразит новую цель, а наоборот - уберет старую из журнала.

(Конечно, можно было бы и вовсе убрать стадию "Убить вора" и просто попросить игрока вернуть амулет. С определенной точки зрения это даже правильнее, так как не навязывает игроку какой-либо стиль игры.)

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

Event OnDeath(Actor killer)
	if (TutorialQuest.GetStage() < 30)
		TutorialQuest.SetStage(20)
	endif
EndEvent

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

Не по порядку

Разумеется, большой проблемой станет посещение Reachwind Eyrie до знакомства с Bendu. В результате будет завершена стадия 20 (но игрок этого не увидит) и отображена 30, с предложением вернуть амулет Бэнду. Большие круглые глаза и недоуменное "А это кто?" тебе гарантированы. И в журнале не появится никаких записей, пока квест не будет завершен.

И вновь есть несколько возможных решений проблемы:

  1. Вместо инвентаря вора создать предмет в каком-нибудь недоступном хранилище. Когда игрок примет квест, воскресить вора (если необходимо) и перенести в его инвентарь амулет.
  2. Сделать амулет трофеем (en) (в этом случае предмет не может быть украден и появится в инвентаре вора только после его смерти). При взятии квеста воскресить вора, если это необходимо.
    • (The amulet would have to be set as a conditional death item, so it would only get placed there if we were at the appropriate quest stage.)
  3. Позволить игроку убить вора раньше времени и добавить соответствующую ветвь диалога Бэнду ("Здра... постой-ка! Это же мой амулет!") и завершить квест.
  4. Оставить всё как есть, но убрать подальше вора до наступления соответствующей стадии, тогда у игрока не будет возможности убить или обокрасть его раньше времени.

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

Что бы отключить вора, щелкни дважды по его экземпляру в ReachwindEyrie01. Откроется окно Reference Window.

ReferenceWindow.png

Отметь флажком "Initially Disabled" и нажми "ОК". Теперь вор исчезнет из игры и не появится, пока мы не скомандуем (можешь проверить).

Но прежде чем двигаться дальше, подредактируй псевдоним Thief (на вкладке Quest Aliases квеста GSQ01). И отметь флажком "Allow Disabled", тем самым разрешив ему указывать на отключенные экземпляры объектов.

AllowDisabled.png

InDepth.jpg Если ты не поставишь этот флажок для псевдонима типа "Specific Reference", ничего страшного не случится. Но лучше возьми себе в привычку следовать этому нехитрому правилу, чтобы не испытывать проблем в будущем, при разработке собственных более сложных проектов. :-)

Теперь нужно вернуть вора на места в определенное время. Сделаем это в скрипте стадии 10. Измени его так:

SetObjectiveDisplayed(10)

Alias_Thief.GetReference().Enable()

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

  • Alias_Thief - Это свойство, которое редактор создал и заполнил для нас. Каждый раз, создавая псевдоним, игра создает свойство в квесте под именем Alias_<ИмяПсевдонима>. Если опустить символ подчеркивания, то это довольно удобно.
  • GetReference() - Псевдоним - это отнюдь не ссылка, а объект, содержащий разнообразную информацию. Указывать он может на что угодно - существо, стену, часть тела или предмет. Для того чтобы получить ссылку на его объект, используется эта функция.
    • (Если тебе что-то не понятно, не отчаивайся - в будущем мы еще вернемся к псевдонимам и изучим их более полно. Можешь просто скопировать и вставить этот код. Ничего страшного.)
  • Enable() - Разрешает объект.

Теперь, пока игрок не примет квест Бэнду, он не сможет найти вора и добыть амулет.

Передача амулета Бэнду

Теперь о передаче предмета от игрока к квестодателю после выполнения квеста. Сделать это, как обычно, очень просто.

Снова открой список стадий и выбери 40ую. Ее скрипт состоит всего из одной строчки: SetObjectiveCompleted(30). Расширим его.

Добавь в начало скрипта эту строку:

Alias_Bendu.GetReference().AddItem(Alias_Amulet.GetReference())

Обрати внимание, что если в функцию AddItem передать базовый объект, то новый экземпляр будет создан "из воздуха". Если же мы передаем экземпляр объекта (ссылку на предмет), то он переместится из прежнего контейнера в новый. В нашем случае - из инвентаря игрока в инвентарь Бэнду Оло. Круто!

Теперь о деньгах. Золото можно выдать точно также, как и любой другой предмет. Но для этого нам придется создать свойство в скриптах квеста, указывающее на золото. Щелкни по кнопке "Properties" и в списке слева увидишь автоматически созданные свойства псевдонимов. Добавь новое с типом "MiscObject" и именем "Gold001" - заполнится оно автоматически.

InDepth.jpg Back in the day, we used to have different base objects for different denominations of gold, hence the "001" appended to the name of the single gold piece.

Свойство есть, осталось добавить эту строчку:

Game.GetPlayer().AddItem(Gold001, 500)

(Обрати внимание, что если ты не укажешь количество добавляемых предметов в функции AddItem, то получишь один.)

Как Бэнду и обещал, он выплатил двойную стоимость амулета. Но что если нам потребуется изменить ее? Исходя из требований баланса или просто по желанию левой ноги. В этом случае нам придется вернуться к этому скрипту и вновь изменить его (о чем ты наверняка забудешь). А можно поступить умнее и изменить скрипт вот так:

Game.GetPlayer().AddItem(Gold001, Alias_Amulet.GetReference().GetGoldValue() * 2)

Вот теперь система сама проверит стоимость амулета, умножит ее на 2 и выдаст игроку полученную сумму.

InDepth.jpg Обрати внимание - деньги появляются из воздуха, а не из инвентаря Бэнду. Это болезненный, но не смертельный пинок "реализма", чтобы жаждущие скорой наживы игроки не могли получить награду куда более простым и быстрым способом - убив или обокрав квестодателя.

Выбрасывание амулета

Игроки в Elder Scrolls, как хомячки. Тащат к себе всё, что не приколочено, пока не заработают перегрузку. А после выбрасывают всё, что кажется мусором. Или могут повесить квестовый предмет дома, в качестве украшения. Или пытаются отвлечь сверкающими побрякушками гиганта, удирая от него со всех ног. (Спойлер: не поможет). В общем, причин выкинуть амулет может быть масса, а в результате: квест выполнить невозможно, и где искать амулет непонятно.

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

Но проще всего сделать амулет квестовым объектом, который игрок не может ни продать, ни выбросить. И пока ты сам не уберешь его из инвентаря скриптом, никуда он от игрока не денется.

Это тоже не должно вызвать у тебя трудностей. Открой псевдоним Amulet и отметь флажком "Quest Object".

QuestObjectFlag.png

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

NewFeature.jpg В Fallout 3 и более ранних играх серии Elder Scrolls флаг "Quest Object" выставлялся для базового объекта.

Возвращение

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

Вначале добавь новую стадию заданию - 5 (вот и пригодился оставленный между ними зазор). В журнал ничего добавлять не будем, потому что квест еще не принят. Это исключительно для внутреннего использования.

Добавь в обработчик ответа "Нет", в разговоре с Бэнду, скрипт, изменяющий стадию квеста на 5 (Посмотри на аналогичное действие для ветки "Да", если что-то забыл - там мы выставляли стадию 10.)

Теперь приступим к самому интересному. Открой начальную тему (не монолог) GSQ01MeetingBenduBranchTopic. Окно должно выглядеть вот так:

TopicWindowRedux2.png

ПКМ по подсвеченному монологу и выбирай "Copy". В таблицу добавится полный дубликат существующего (то есть включающий в себя все скрипты, фразы, параметры вывода, и т.д.), никак не зависящий от оригинала.

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

Открой верхний монолог и измени условие GetStage с "< 10" на "== 5". Теперь, при первом обращении игрока к этой теме, игра проверит условие первого монолога, обнаружит, что оно неверно (потому что стадия равна 0) и перейдет к следующему, верному, который и отобразит.

Измени соответствующим образом текст фразы, отразив в ней, что игрок уже общался с Бэнду прежде и отказался помочь. Например: "Я уже рассказал вам о своем амулете. Вы все же решили мне помочь?"

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

Впиши туда: "Тебе что-нибудь нужно?"

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

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

Открой другой монолог (тот, в котором мы не задавали значение полю "Prompt"). Справа есть список, в котором ты видишь другие темы, связанные с этой.

TopicInfoLinkHighlight.png

Когда ты связываешь что-либо в представлении диалога, эта связь появляется здесь. (Если ты сторонник старой школы, можешь добавить связи через эту таблицу). Отметь флажком "Walk Away:" (чуть ниже) и выбери из списка связей GSQ01MeetingBenduNo. Если теперь игрок прервет разговор с Бэнду, реакция последует та же, что и при отказе от выполнения квеста.

InDepth.jpg Данную проблему можно было бы решить и иначе. Например. использовав таймер в первой строке, или переменные вместо стадий квеста.

Приветствия и прощания

Сейчас диалог с Бэнду может начаться с пятерки различных фраз[проверить!]:

  • "Да, сир?"
  • "Что тебе нужно? Ммм?"
  • "Да?"
  • "Ммм?"
  • "Тебе что-нибудь нужно?"

Это общие фразы для голоса MaleDarkElf, которые более-менее удачно смотрятся в любом диалоге. Правда, если ты решишь озвучить свой мод, то голоса окажутся разные (разве что сумеешь договориться с Китом Царабайкой [для английской версии]).

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

Открой окно квеста и перейди на вкладку Misc.

MiscTab.png

ПКМ по в таблице Topics и "New" из меню. Откроется список специальных тем, которые игра использует в различных обстоятельствах. Дважды щелкни по "Hello" (приветствие), чтобы выбрать тему этого типа. Дай ей имя: "GSQ01Hellos".

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

ПКМ, "New" - всё, как обычно. В качестве текста, что-нибудь вроде: "О, может быть, вы сможете мне помочь?" Условия задай следующие:

  • GetIsID GSQBenduOlo == 1
  • GetStage GSQ01 < 10

(Если хочешь, можешь задать отдельное приветствие и для 5ой стадии, но это ты сделаешь самостоятельно.)

Добавь еще два:

  • "Вы нашли амулет?"
    • GetIsID GSQBenduOlo == 1
    • GetStage GSQ01 >= 10
    • GetStage GSQ01 < 40
  • "Не знаю, как вас благодарить! Огромное спасибо за помощь!"
    • GetIsID GSQBenduOlo == 1
    • GetQuestCompleted GSQ01 == 1
InDepth.jpg Второй монолог не самый лучший, он задает вопрос, но не дает игроку возможности на него ответить. Но идею ты понял, а это главное.

Можешь добавить прощальные реплики (Goodbye), которые Бэнду будет произносить, когда игрок заканчивает общение.

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

Хвосты

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

Будем надеяться, что это поможет тебе начать создавать собственные интересные задания, которые подарят много приятных мгновений игрокам со всего мира!

Next Steps

This is the end of the Quest Design Fundamentals series. There are more advanced topics like radiant story that are discussed elsewhere in this wiki. If you want to dive more deeply into making quests for Skyrim, you should start with Packages.

Good luck out there!


LeftArrow.png Предыдущая статья К другим учебникам Следующая статья RightArrow.png



Language: English  • français • русский