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

From the CreationKit Wiki
Jump to navigation Jump to search
imported>Vitamant
imported>Vitamant
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{PageTitle|Bethesda Tutorial Quest Loose Ends}}
{{PageTitle|Хвосты}}


{{RussianPage|t}}
{{RussianPage|e}}


{{Tutorial Index/ru
{{Tutorial Index/ru
|titlename=Bethesda Tutorial Quest Loose Ends
|titlename=Хвосты
|Prev=Bethesda_Tutorial_Quest_Objectives/ru
|Prev=Bethesda_Tutorial_Quest_Objectives/ru
|Next=:Category:Tutorials/ru
|Next=:Category:Tutorials/ru
Line 12: Line 12:


=Краткий обзор=
=Краткий обзор=
Эта глава посвящена "работе напильником" над эпической историей Бенду Оло и его пропавшего амулета.
Эта глава посвящена работе над ошибками, допущенными при разработке эпической историей Бенду Оло и его пропавшего амулета.
Она завершает данную серию уроков. Предполагается, что ты всему необходимое ты уже освоил ранее. За руку тебя водить уже никто не будет. Если ты что-то забыл - обратись к предыдущим главам.
Она завершает данную серию уроков. Предполагается, что всё необходимое ты уже освоил ранее. Если ты что-то забыл - обратись к предыдущим главам.
<br><br>Итак, что ты узнаешь:
<br><br>Итак, что ты узнаешь:
* Что мы сделали неверно.
* Что мы сделали неверно.
Line 20: Line 20:
=Проблемы=
=Проблемы=
Вот список недоработок, которые приходят на ум:
Вот список недоработок, которые приходят на ум:
# Бэнду может... скоропостижно скончаться... после того, как квест будет принят. Сдать амулет, конечно же. будет уже некому.
# Бэнду может... скоропостижно скончаться... после того, как квест будет принят. Сдать амулет, конечно же, будет уже некому.
# Бэнду рассказал о том, где может скрывать вор, однако место на карте мы не отметили.
# Бэнду рассказал о том, где может скрывать вор, однако место на карте мы не отметили.
# Добыть амулет можно и не убивая вора, просто пошарив у него в карманах. Квест выполнить будет можно, но одна из целей так и будет висеть незавершенной.
# Добыть амулет можно и не убивая вора, просто пошарив у него в карманах. Квест выполнить будет можно, но одна из целей так и будет висеть незавершенной.
Line 33: Line 33:
=Смерть квестодателя=
=Смерть квестодателя=
У нас есть два варианта: мы можем либо отменить квест и убрать подальше от глаз, если Бэнду умрет, или же сделать его бессмертным. Оба варианта имеют свои достоинства и недостатки. Если квестодатель еще обязательно понадобится нам в будущем, то выбор очевиден.
У нас есть два варианта: мы можем либо отменить квест и убрать подальше от глаз, если Бэнду умрет, или же сделать его бессмертным. Оба варианта имеют свои достоинства и недостатки. Если квестодатель еще обязательно понадобится нам в будущем, то выбор очевиден.
{{InDepth|Старайся никогда не делать персонажей бессмертными. Такие персонажи нарушают баланс игрового мира и моментально разрушают атмосферу. Сильного НИП можно сделать еще сильнее, так, чтобы возможность его убить была исключительно гипотетической. Смерть слабого от рук игрока-бандита вполне закономерна. Воскресающее же или в принципе неубиваемое существо вызывает лишь раздражение. (прим. переводчика) }}


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


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


You can auto-fill the GSQ01 property,
Конечно же не забудь создать свойство GSQ01.


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


Сделать это очень просто. Открой окно персонажа GSQBenduOlo, и поставь флажок "Essential" (существенный). ("Protected" (защищенный) - это похожая опция, которая позволяет убить персонажа только игроку и никому больше.)
Сделать это очень просто. Открой окно персонажа GSQBenduOlo, и поставь флажок "Essential" (существенный). ("Protected" (защищенный) - это похожая опция, которая позволяет убить персонажа только игроку и никому больше.)
{{WarningBox|''Старайся никогда не делать персонажей бессмертными. Такие персонажи нарушают баланс игрового мира и моментально разрушают атмосферу. Сильного НИП можно сделать еще сильнее, так, чтобы возможность его убить была исключительно гипотетической. Смерть слабого от рук игрока-бандита вполне закономерна. Воскресающее же или в принципе неубиваемое существо вызывает лишь раздражение. (прим. переводчика)'' }}


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


[[File:ReachwindMapMarker.png|600px]]
[[File:ReachwindMapMarker.png|600px]]
Line 96: Line 96:
Не сложно заметить, что когда игрок подберет амулет, квест перейдет в 30ую стадию. Вне зависимости от того был убит вор или нет. А значит, если амулет будет украден, 20ая стадия квеста так и останется незавершенной.
Не сложно заметить, что когда игрок подберет амулет, квест перейдет в 30ую стадию. Вне зависимости от того был убит вор или нет. А значит, если амулет будет украден, 20ая стадия квеста так и останется незавершенной.


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


<source lang="papyrus">
<source lang="papyrus">
Line 118: Line 118:
(Конечно, можно было бы и вовсе убрать стадию "Убить вора" и просто попросить игрока вернуть амулет. С определенной точки зрения это даже правильнее, так как не навязывает игроку какой-либо стиль игры.)
(Конечно, можно было бы и вовсе убрать стадию "Убить вора" и просто попросить игрока вернуть амулет. С определенной точки зрения это даже правильнее, так как не навязывает игроку какой-либо стиль игры.)


Если игрок убьет вора после кражи амулета, он получит дополнительный ориентир. В результате у нас появится две активные задачи.
Если игрок убьет вора после кражи амулета, он получит дополнительный ориентир. В результате у нас появятся две активные задачи.
Эта проблема также легко решается правкой скрипта {{ulink|Bethesda_Tutorial_Basic_Quest_Scripting|вора}}.
Эта проблема также легко решается правкой скрипта {{ulink|Bethesda_Tutorial_Basic_Quest_Scripting|вора}}.
<source lang="papyrus">
<source lang="papyrus">
Line 127: Line 127:
EndEvent
EndEvent
</source>
</source>
Мы добавили проверку, что стадия квеста меньше 30, прежде чем изменить ее на 20. Так что если игрок вначале завладеет амулетом, а затем убьет вора, стадия задания от этого не изменится.
Мы добавили проверку на то, что стадия квеста меньше 30, прежде чем изменить ее на 20. Так что если игрок вначале завладеет амулетом, а затем убьет вора, стадия задания от этого не изменится.


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


И вновь есть несколько возможных решений проблемы:
И вновь есть несколько возможных решений проблемы:
# Вместо инвентаря вора создать предмет в каком-нибудь недоступном хранилище. Когда игрок примет квест, воскресить вора (если необходимо) и перенести в его инвентарь амулет.
# Вместо инвентаря вора создать предмет в каком-нибудь недоступном хранилище. Когда игрок примет квест, воскресить вора (если необходимо) и перенести в его инвентарь амулет.
# Сделать амулет {{ulink|Traits_Tab_-_NPC|трофеем}} (в этом случае предмет не может быть украден и появится в инвентаре вора только после его смерти). При взятии квеста воскресить вора, если это необходимо.
# Сделать амулет {{ulink|Traits_Tab_-_NPC|трофеем}} (в этом случае предмет не может быть украден и появится в инвентаре вора только после его смерти). При взятии квеста воскресить вора, если это необходимо.
#* (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.)
#* (А самому амулету задать условия, при котором он падает в качестве трофея, завязав его на стадию квеста.)
# Позволить игроку убить вора раньше времени и добавить соответствующую ветвь диалога Бэнду ("Здра... постой-ка! Это же мой амулет!") и завершить квест.  
# Позволить игроку убить вора раньше времени и добавить соответствующую ветвь диалога Бэнду ("Здра... постой-ка! Это же мой амулет!") и завершить квест.  
# Оставить всё как есть, но убрать подальше вора до наступления соответствующей стадии, тогда у игрока не будет возможности убить или обокрасть его раньше времени.
# Оставить всё как есть, но убрать подальше вора до наступления соответствующей стадии, тогда у игрока не будет возможности убить или обокрасть его раньше времени.
Line 165: Line 165:
* <code>Alias_Thief</code> - Это свойство, которое редактор создал и заполнил для нас. Каждый раз, создавая псевдоним, игра создает свойство в квесте под именем Alias_<ИмяПсевдонима>. Если опустить символ подчеркивания, то это довольно удобно.
* <code>Alias_Thief</code> - Это свойство, которое редактор создал и заполнил для нас. Каждый раз, создавая псевдоним, игра создает свойство в квесте под именем Alias_<ИмяПсевдонима>. Если опустить символ подчеркивания, то это довольно удобно.
* <code>GetReference()</code> - Псевдоним - это отнюдь не ссылка, а объект, содержащий разнообразную информацию. Указывать он может на что угодно - существо, стену, часть тела или предмет. Для того чтобы получить ссылку на его объект, используется эта функция.
* <code>GetReference()</code> - Псевдоним - это отнюдь не ссылка, а объект, содержащий разнообразную информацию. Указывать он может на что угодно - существо, стену, часть тела или предмет. Для того чтобы получить ссылку на его объект, используется эта функция.
** (Если тебе что-то не понятно, не отчаивайся - в будущем мы еще вернемся к псевдонимам и изучим их более полно. Можешь просто скопировать и вставить этот код. Ничего страшного.)
** (Если тебе что-то не понятно, не отчаивайся - в будущем мы еще вернемся к псевдонимам и изучим их более подробно. Можешь просто скопировать и вставить этот код. Ничего страшного.)
* <code>Enable()</code> - Разрешает объект.
* <code>Enable()</code> - Возвращает объект в игру.


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


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


Line 181: Line 181:
</source>
</source>


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


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


{{InDepth|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.}}
{{InDepth|Давным давно мы использовали разные прототипы для различного количества монет. Отсюда "001" в имени - намек на то, что речь идет об одной монете.}}


Свойство есть, осталось добавить эту строчку:
Свойство есть, осталось добавить эту строчку:
Line 201: Line 201:
</source>
</source>


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


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


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


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


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


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


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


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


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


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


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


=Приветствия и прощания=
=Приветствия и прощания=
{{Inuse/ru}}
Сейчас диалог с Бэнду может начаться с пятерки различных фраз{{Verify/ru}}:
Сейчас диалог с Бэнду может начаться с пятерки различных фраз:
* "Да, сир?"
* "Да, сир?"
* "And what might you need? Hmmm?"
* "Что тебе нужно? Ммм?"
* "Да?"
* "Да?"
* "Ммм?"
* "Ммм?"
* "Тебе что-нибудь нужно?"
* "Тебе что-нибудь нужно?"


These are the generic lines written for the MaleDarkElf voice type, and serve as reasonable introductions to any conversation. But they are very bland and repetitive. Plus, if you plan on recording voices for your mod, they will sound different than the other lines you have (unless you plan to bring Keith Szarabajka in to record for you).  
Это общие фразы для голоса MaleDarkElf, которые более-менее удачно смотрятся в любом диалоге. Правда, если ты решишь озвучить свой мод, то голоса окажутся разные (разве что сумеешь договориться с Китом Царабайкой [для английской версии]).  


So we can write some specific lines for Bendu that will reference what we've done in the quest so far.  
В общем, мы хотим записать собственные варианты монологов для Бэнду, зависящие от того, как и что мы делали в процессе выполнения квеста.


Open up the GSQ quest window, and go over the Misc tab.  
Открой окно квеста и перейди на вкладку Misc.


[[Image:MiscTab.png|600px]]
[[Image:MiscTab.png|600px]]


Right click in the Topics table in the middle, and select "New." This opens up a list of special case topics that the game uses for specific cirumstances. Double-click on "Hello" to make a new topic of that type. When prompted to name it, go with "GSQ01Hellos".  
ПКМ по в таблице Topics и "New" из меню. Откроется список специальных тем, которые игра использует в различных обстоятельствах. Дважды щелкни по "Hello" (приветствие), чтобы выбрать тему этого типа. Дай ей имя: "GSQ01Hellos".  


This activates the table to the right, which is now functionally almost identical to the Info list we were dealing with when making dialogue. Only, in here, all these infos will be said by an actor when the player activates them. Just like with other infos, bad conditions in here can lead to everyone in the world having a new hello, so you need to be careful.  
Большая таблица справа оживет. Монологи персонажа здесь настраиваются точно также, как и при написании обычных диалогов, с той лишь разницей, что вместо возможности выбрать тему, они привязаны к действиям игрока. В данном случае - обращению к персонажу. Как и в предыдущем случае, будь осторожен, так как неверные условия (или их отсутствие) могут задать приветственные фразы для всех существ в мире.


Right-click and make a new info. Something like "Oh, are you here to help?" Set its conditions to:
ПКМ, "New" - всё, как обычно. В качестве текста, что-нибудь вроде: "О, может быть, вы сможете мне помочь?" Условия задай следующие:
* GetIsID GSQBenduOlo == 1
* GetIsID GSQBenduOlo == 1
* GetStage GSQ01 < 10
* GetStage GSQ01 < 10


(If we wanted to, we could make a different hello for stage 5, but I'll leave that as an exercise.)
(Если хочешь, можешь задать отдельное приветствие и для 5ой стадии, но это ты сделаешь самостоятельно.)


Make two more:  
Добавь еще два:


*"Have you got my amulet yet?"
*"Вы нашли амулет?"
** GetIsID GSQBenduOlo == 1
** GetIsID GSQBenduOlo == 1
** GetStage GSQ01 >= 10
** GetStage GSQ01 >= 10
** GetStage GSQ01 < 40
** GetStage GSQ01 < 40


*"I can't thank you enough for helping me."
*"Не знаю, как вас благодарить! Огромное спасибо за помощь!"
** GetIsID GSQBenduOlo == 1
** GetIsID GSQBenduOlo == 1
** GetQuestCompleted GSQ01 == 1
** GetQuestCompleted GSQ01 == 1


{{InDepth|That second line is actually not a great example, since it's asking a question that we haven't written prompts to allow the player to answer. But you get the idea.}}
{{InDepth|Второй монолог не самый лучший, он задает вопрос, но не дает игроку возможности на него ответить. Но идею ты понял, а это главное.}}


You can also make a Goodbye topic, which will get used whenever the player leaves a conversation.  
Можешь добавить прощальные реплики (Goodbye), которые Бэнду будет произносить, когда игрок заканчивает общение.


Note that the hellos and goodbyes, as written, will completely override the generic ones, and will be the '''only''' hellos or goodbyes that Bendu uses. We'll show how to mix things up a bit in the advanced tutorials.
Учти - указывая приветствия или прощания, ты полностью перекрываешь стандартные варианты. В будущем мы еще рассмотрим, как их можно смешивать.


=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=
=Что дальше?=
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 [[Bethesda_Tutorial_Packages|Packages]].  
Это последняя глава в серии [[:Category:BT Основы квестописания|"Основы квестописания"]]. В вики есть еще множество интересных статей, с которыми тебе стоит ознакомиться. Если же ты хочешь незамедлительно продолжить изучение искусства создавать квесты, то стоит начать со статьи про {{ulink|Bethesda_Tutorial_Packages|пакеты}}.


Good luck out there!  
И удачи во всех начинаниях!





Latest revision as of 16:00, 13 April 2012

Хвосты



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