Bethesda Tutorial Quest Loose Ends/ru

From the CreationKit Wiki
Jump to navigation Jump to search

Хвосты



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


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


Краткий обзор[edit | edit source]

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

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

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

Проблемы[edit | edit source]

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

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

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

Смерть квестодателя[edit | edit source]

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

Обработка смерти[edit | edit source]

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

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

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

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

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

Quest Property GSQ01 auto

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

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

Конечно же не забудь создать свойство GSQ01.

Бессмертие[edit | edit source]

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

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

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

Маркер на карте[edit | edit source]

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

ReachwindMapMarker.png

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

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

SetObjectiveDisplayed(10)

DungeonMarker.AddToMap()

Карманные кражи[edit | edit source]

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

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. Так что если игрок вначале завладеет амулетом, а затем убьет вора, стадия задания от этого не изменится.

Не по порядку[edit | edit source]

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

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

  1. Вместо инвентаря вора создать предмет в каком-нибудь недоступном хранилище. Когда игрок примет квест, воскресить вора (если необходимо) и перенести в его инвентарь амулет.
  2. Сделать амулет трофеем (en) (в этом случае предмет не может быть украден и появится в инвентаре вора только после его смерти). При взятии квеста воскресить вора, если это необходимо.
    • (А самому амулету задать условия, при котором он падает в качестве трофея, завязав его на стадию квеста.)
  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() - Возвращает объект в игру.

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

Передача предметов[edit | edit source]

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

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

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

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

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

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

InDepth.jpg Давным давно мы использовали разные прототипы для различного количества монет. Отсюда "001" в имени - намек на то, что речь идет об одной монете.

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

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

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

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

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

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

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

Потеря квестовых предметов[edit | edit source]

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

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

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

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

QuestObjectFlag.png

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

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

Возвращение[edit | edit source]

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

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

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

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

TopicWindowRedux2.png

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

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

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

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

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

Впиши туда: "Напомни - что тебе было нужно?"

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

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

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

TopicInfoLinkHighlight.png

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

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

Приветствия и прощания[edit | edit source]

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

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

Это общие фразы для голоса 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), которые Бэнду будет произносить, когда игрок заканчивает общение.

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

Послесловие[edit | edit source]

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

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

Что дальше?[edit | edit source]

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

И удачи во всех начинаниях!


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



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