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

From the CreationKit Wiki
Jump to navigation Jump to search
imported>Vitamant
(Created page with "{{PageTitle|Bethesda Tutorial Quest Loose Ends}} {{RussianPage|t}} {{Tutorial Index/ru |titlename=Bethesda Tutorial Quest Loose Ends |Prev=Bethesda_Tutorial_Quest_Objectives...")
 
imported>Vitamant
 
(32 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
|Prev=Bethesda_Tutorial_Quest_Objectives/ru
|Next=:Category:Tutorials
|Next=:Category:Tutorials/ru
|series=Основы квестописания
|series=Основы квестописания
|chapter=7
|chapter=7
}}
}}


=Overview=
=Краткий обзор=
This tutorial will wrap up the loose ends we've left dangling as we've constructed the epic tale of Bendu Olo and his lost amulet.  
Эта глава посвящена работе над ошибками, допущенными при разработке эпической историей Бенду Оло и его пропавшего амулета.
Она завершает данную серию уроков. Предполагается, что всё необходимое ты уже освоил ранее. Если ты что-то забыл - обратись к предыдущим главам.
<br><br>Итак, что ты узнаешь:
* Что мы сделали неверно.
* Как это исправить.


This final tutorial is much less hand-holdy, and assumes that you've absorbed the material from previous tutorials in the Quest Design Fundamentals series. If you need a refresher on anything here, you should be able to find what you need in the previous chapters.  
=Проблемы=
<br><br>The reader will learn:
Вот список недоработок, которые приходят на ум:
* What we've done wrong.  
# Бэнду может... скоропостижно скончаться... после того, как квест будет принят. Сдать амулет, конечно же, будет уже некому.
* How to fix it.  
# Бэнду рассказал о том, где может скрывать вор, однако место на карте мы не отметили.
# Добыть амулет можно и не убивая вора, просто пошарив у него в карманах. Квест выполнить будет можно, но одна из целей так и будет висеть незавершенной.
# Вор мог быть найден и убит\обворован до встречи с Бэнду.
# В финале квест завершается, но амулет Бэнду не забирает.
# Амулет может быть выброшен и утерян. Игрок, конечно, сам виноват, но наш долг этого не допустить.
# После отказа от выполнения задания, при следующей встречи, Бэнду будет говорить так, словно впервые видит игрока.
# У Бэнду в наличии лишь обезличенный стандартный набор приветственных и прощальных фраз.


=Problems=
Будем исправлять их по порядку. Некоторые из них имеют несколько решений, со своими плюсами и минусами.
There are a number of issues with the quest as we've implemented it.  
# Bendu can be killed after we accept the quest, which would render it impossible to complete if we've already started it.
# We don't add the map marker to the player's map when Bendu tells where to go.
# It's possible for the player to get the amulet via pickpocketing, which would advance the quest properly, but leave extra objectives hanging around uncompleted.
# The player could find and kill the thief before meeting Bendu, which would cause the quest to advance, and be confusing.
# Bendu doesn't actually take the amulet from the player at the end of the quest.
# The player can drop the amulet and then lose it, which would be her own fault, but still something we should think about.
# If the player chooses not to help Bendu, he won't acknowledge having met the player before, which can be a little jarring.
# Bendu just has generic hellos and goodbyes, rather than acknowledging his specific circumstance.  


We'll go through these one at a time -- some of them have multiple solutions, with pros and cons.
=Смерть квестодателя=
У нас есть два варианта: мы можем либо отменить квест и убрать подальше от глаз, если Бэнду умрет, или же сделать его бессмертным. Оба варианта имеют свои достоинства и недостатки. Если квестодатель еще обязательно понадобится нам в будущем, то выбор очевиден.


=Killing Bendu=
==Обработка смерти==
We have two options for handling Bendu dying: we either shut down the quest so it doesn't hang around annoying the player, or we make it so Bendu can never die. Obviously both sides have their pros and cons -- if Bendu is a character we need in the future, we may want him to be unkillable anyway, for example.  
Ранее ты уже узнал, как пометить квест завершенным. Теперь предстоит сделать тоже самое, только вместо пометки "Выполнен", нужно использовать "Провален".


==Handling the Death==
Создай новую стадию квеста с индексом 200. Создай запись в журнале с нижеследующим текстом:
We've already shown how to complete a quest at a certain stage (with the Complete Quest) box. When that stage is set, the quest gets moved to the inactive part of the player's journal and the "COMPLETED: <Quest Name>" banner will pop. Failing a quest works similarly, but the player will see "FAILED" instead.


Make a new quest stage numbered 200. Create a log entry for it with some downer conclusion text:
<blockquote><i>Мне не удалось вернуть Бэнду Оло украденный у него амулет.</i></blockquote>


<blockquote><i>I failed to return Bendu Olo's amulet to him.</i></blockquote>
Внизу отметь флажком "Fail Quest".


Check the "Fail Quest" box below it.
Теперь нужно изменить стадию квеста на 200, если Бэнду погибнет. Добавь ему скрипт (точно также, как проделал это с вором). Назови его GSQBenduOloScript. Текст скрипта следующий:
 
Secondly, we need to set up Bendu to set this stage when he dies. Put a script on him, (like we did with the thief) called GSQBenduOloScript. Here's the text of the script, after the initial Scriptname line:  


<source lang="papyrus">
<source lang="papyrus">
Line 56: Line 55:
</source>
</source>


Note: we check to make sure the quest is not already completed, because we wouldn't want the player to fail after finishing it.  
Примечание: мы ввели проверку на то, что квест еще не завершен. Было бы нелогично засчитать проваленным однажды выполненный квест.


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


==Immortal Bendu==
==Бессмертие==
The other option is to make Bendu unkillable -- if the player attacks him, he will go into bleedout (writhing on the floor), but stand up again when combat is finished.  
Альтернатива - сделать Бэнду неубиваемым. Если его здоровье опустится до 0, он не умрет, а упадет без чувств, но очнется, когда бой будет закончен.  


This is remarkably easy to accomplish. Open up the actor window for GSQBenduOlo, and click the "Essential" checkbox under the name fields. ("Protected" is a similar state, but it allows the player and only the player to kill the actor.)
Сделать это очень просто. Открой окно персонажа GSQBenduOlo, и поставь флажок "Essential" (существенный). ("Protected" (защищенный) - это похожая опция, которая позволяет убить персонажа только игроку и никому больше.)


=Map Marker=
{{WarningBox|''Старайся никогда не делать персонажей бессмертными. Такие персонажи нарушают баланс игрового мира и моментально разрушают атмосферу. Сильного НИП можно сделать еще сильнее, так, чтобы возможность его убить была исключительно гипотетической. Смерть слабого от рук игрока-бандита вполне закономерна. Воскресающее же или в принципе неубиваемое существо вызывает лишь раздражение. (прим. переводчика)'' }}
Typically, when we tell the player to go to a place in the game, we add the map marker so they can have an easy target to head towards. Navigate to the cell called ReachwindEyrieExterior01 in the Tamriel worldspace. (You can get there easily by double-clicking the yellow door marker inside ReachwindEyrie01.) You'll see a green-blue rectangle with a large M carved out of it right next to the exterior door marker.  
 
=Маркер на карте=
Обычно, когда игроку становится известно о каком-нибудь месте в игре, на карту добавляется маркер, который позволяет легче сориентироваться и добраться до цели. Перейди к ячейке ReachwindEyrieExterior01 в пространстве Tamriel. (Для этого достаточно дважды щелкнуть по желтому маркеру двери в ReachwindEyrie01. [''по которому не так-то просто попасть - прим. переводчика'']) Прямо под дверью ты увидишь сине-зеленый прямоугольник с большой буквой М.  


[[File:ReachwindMapMarker.png|600px]]
[[File:ReachwindMapMarker.png|600px]]


Navigate to stage 10 of our quest, and add an ObjectReference property to the script, and call it "DungeonMarker". Select the map marker as the target of the property.  
Открой 10ую стадию квеста и и добавь в скрипт свойство типа ObjectReference. Назови его "DungeonMarker". Выбери маркер на карте, в качестве цели для этого свойства.


Now, edit the stage 10 script so it reads:
Затем измени скрипт:


<source lang=papyrus>
<source lang=papyrus>
Line 80: Line 81:
</source>
</source>


=Pickpocketing=
=Карманные кражи=
If you think about the script we put on the amulet to advance the questline when the player takes it:  
Взгляни еще раз на скрипт амулета, который призван продвинуть вперед сюжетную линию:


<source lang="papyrus">
<source lang="papyrus">
Line 93: Line 94:
</source>
</source>


This means that when the player picks up the amulet, it will always set stage 30 of the quest. If this happens without killing the thief, stage 20 will never have been set, and so we will display the next objective (to return the amulet to Bendu) without completing objective 20.  
Не сложно заметить, что когда игрок подберет амулет, квест перейдет в 30ую стадию. Вне зависимости от того был убит вор или нет. А значит, если амулет будет украден, 20ая стадия квеста так и останется незавершенной.


The best way to handle this is to have stage 30's script check to see if stage 20 has been run, and handle the objectives properly. So the old script simply looks like this:  
Исправить это несложно. Достаточно немного подкорректировать наш старый скрипт. Выглядел он так:  


<source lang="papyrus">
<source lang="papyrus">
Line 102: Line 103:
</source>
</source>


And we'll change it to look like this:
А теперь мы его подредактируем:


<source lang="papyrus">
<source lang="papyrus">
Line 113: Line 114:
</source>
</source>


That second line of code is setting the objective to '''not''' be displayed, so it will just quietly disappear from the player's journal.  
Вторая строчка НЕ отобразит новую цель, а наоборот - уберет старую из журнала.


(Of course, we could also simply never have the "Kill the thief" objective, and just tell the player to retrieve the amulet. This is probably better from a design perspective, as it doesn't encourage any particular playstyle over another.)
(Конечно, можно было бы и вовсе убрать стадию "Убить вора" и просто попросить игрока вернуть амулет. С определенной точки зрения это даже правильнее, так как не навязывает игроку какой-либо стиль игры.)


If the player kills the thief after pickpocketing the amulet, the player will receive an additional objective; to retrieve the amulet we already have, leaving two active objectives.
Если игрок убьет вора после кражи амулета, он получит дополнительный ориентир. В результате у нас появятся две активные задачи.
We can easy solve this by editing the TutorialQuest script we gave the [[Bethesda_Tutorial_Basic_Quest_Scripting | thief]].
Эта проблема также легко решается правкой скрипта {{ulink|Bethesda_Tutorial_Basic_Quest_Scripting|вора}}.
<source lang="papyrus">
<source lang="papyrus">
Event OnDeath(Actor killer)
Event OnDeath(Actor killer)
Line 126: Line 127:
EndEvent
EndEvent
</source>
</source>
This will check if the quest stage is below 30 before it changes the stage for 20. So if player already pickpocket the amulet changing quest stage to 30, then killing the thief will never trigger stage 20.
Мы добавили проверку на то, что стадия квеста меньше 30, прежде чем изменить ее на 20. Так что если игрок вначале завладеет амулетом, а затем убьет вора, стадия задания от этого не изменится.


=Out of Order=
=Не по порядку=
Of course, an even bigger problem is that the player could just stumble into Reachwind Eyrie without ever having met our friend Bendu. This would complete objective 20 (which is undisplayed, so the player won't see anything) and display objective 30 to return the amulet to Bendu. At which point the player might say "Wait, what? Who? I've never met this person!" There will also be no journal update until the quest is completed, and it will just be an all-around confusing experience.  
Разумеется, большой проблемой станет посещение Reachwind Eyrie до знакомства с Бенду. В результате будет завершена стадия 20 (но игрок этого не увидит) и отображена 30, с предложением вернуть амулет Бэнду. Большие круглые глаза и недоуменное "А это кто?" тебе гарантированы. И в журнале не появится никаких записей, пока квест не будет завершен.


Again, we have a few options here:
И вновь есть несколько возможных решений проблемы:
# Don't create the amulet in the thief's inventory, but put it elsewhere in the world (like an inaccessible chest). Then, when the player accepts the quest, resurrect the thief if necessary and move the amulet to the thief.  
# Вместо инвентаря вора создать предмет в каком-нибудь недоступном хранилище. Когда игрок примет квест, воскресить вора (если необходимо) и перенести в его инвентарь амулет.
# Set the amulet to be the thief's [[Traits_Tab_-_NPC|death item]] (an object that is only placed into the inventory upon the actor's death so that it can't be pickpocketed). Then resurrect the thief (if necessary) when the player accepts the quest.  
# Сделать амулет {{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.)
#* (А самому амулету задать условия, при котором он падает в качестве трофея, завязав его на стадию квеста.)
# Allow the player to kill the thief early, but replace the option to help Bendu with a line saying "You mean... THIS amulet?!" and completing the quest right there.  
# Позволить игроку убить вора раньше времени и добавить соответствующую ветвь диалога Бэнду ("Здра... постой-ка! Это же мой амулет!") и завершить квест.  
# Leave everything as it is, but disable the thief until the appropriate stage, so the player will never have the chance to kill and loot before the appropriate time.  
# Оставить всё как есть, но убрать подальше вора до наступления соответствующей стадии, тогда у игрока не будет возможности убить или обокрасть его раньше времени.


In our scenario, the final option is by far the simplest and most reasonable one, but the other two are given to illustrate the kinds of logic which sometimes need to be used to accommodate a particular bit of story happenings.  
В нашем случае наиболее простым и логичным является последний вариант. Но, мы рассказали и о других возможностях, так как в различных ситуациях, это может тебе пригодится.


To disable the thief, simply double-click on the reference we placed in ReachwindEyrie01. This will bring up the Reference Window.  
Что бы отключить вора, щелкни дважды по его экземпляру в ReachwindEyrie01. Откроется окно Reference Window.  


[[Image:ReferenceWindow.png|300px]]
[[Image:ReferenceWindow.png|300px]]


Simply click the checkbox for "Initially Disabled," click OK, and the thief will not be at Reachwind Eyrie when you start the game. Try it!
Отметь флажком "Initially Disabled" и нажми "ОК". Теперь вор исчезнет из игры и не появится, пока мы не скомандуем (можешь проверить).


Before we go any further, open up the Thief alias that we made (in the Quest Aliases tab of GSQ01). Click the "Allow Disabled" checkbox that's nestled in the large field of checkboxes in the top right. This will allow the alias to point to a disabled reference.  
Но прежде чем двигаться дальше, подредактируй псевдоним Thief (на вкладке Quest Aliases квеста GSQ01). И отметь флажком "Allow Disabled", тем самым разрешив ему указывать на отключенные экземпляры объектов.  


[[File:AllowDisabled.png]]
[[File:AllowDisabled.png]]


{{InDepth|Technically for a "Specific Reference" fill type alias, you can get away without checking this box, but it's good practice and will help establish strong alias habits for when we do the more advanced material later. :-)}}
{{InDepth|Если ты не поставишь этот флажок для псевдонима типа "Specific Reference", ничего страшного не случится. Но лучше возьми себе в привычку следовать этому нехитрому правилу, чтобы не испытывать проблем в будущем, при разработке собственных более сложных проектов. :-)}}


Now we just need to set the thief to turn on at the appropriate time. We'll do this in the script for quest stage 10. Alter it so it now reads:  
Теперь нужно вернуть вора на места в определенное время. Сделаем это в скрипте стадии 10. Измени его так:


<source lang="papyrus">
<source lang="papyrus">
Line 160: Line 161:
</source>
</source>


The first line was already there, but the second line takes some explaining.
Первая линия там уже была (должна была быть, во всяком случае), а вот вторую разберем подробнее:


* <code>Alias_Thief</code> -- This is a property that the editor created and filled for us. Every time you make an alias, the game will make a property on the quest script called Alias_<AliasName>. This is a great convenience.  
* <code>Alias_Thief</code> - Это свойство, которое редактор создал и заполнил для нас. Каждый раз, создавая псевдоним, игра создает свойство в квесте под именем Alias_<ИмяПсевдонима>. Если опустить символ подчеркивания, то это довольно удобно.
* <code>GetReference()</code> -- This is where things can get a little confusing, but the crux of it is that an alias is '''not''' the thing it points to. The alias itself is just a role that the quest knows about, but it has no idea whether that points to an actor in the world, a piece of wall geometry, a chest, etc. To get access to the thing the alias points to, we call this function.  
* <code>GetReference()</code> - Псевдоним - это отнюдь не ссылка, а объект, содержащий разнообразную информацию. Указывать он может на что угодно - существо, стену, часть тела или предмет. Для того чтобы получить ссылку на его объект, используется эта функция.
** (If this is confusing to you, don't fret. We'll explore aliases in more depth later on. You can just copy+paste the code here and move on happily.)
** (Если тебе что-то не понятно, не отчаивайся - в будущем мы еще вернемся к псевдонимам и изучим их более подробно. Можешь просто скопировать и вставить этот код. Ничего страшного.)
* <code>Enable()</code> -- Actually enables the reference.  
* <code>Enable()</code> - Возвращает объект в игру.


Now when we play the game, the thief will be missing until the player accepts the quest, at which time he will begin his thieving existence.
Теперь, пока игрок не примет квест Бэнду, он не сможет найти вора и добыть амулет.


=Giving the Amulet to Bendu=
=Передача предметов=
Right now the player neither gives the amulet to Bendu nor receives any reward when completing the quest. Both of these are easily fixed.  
Теперь о передаче предмета от игрока к квестодателю после выполнения квеста. Сделать это, как обычно, очень просто.


Open up the stages tab again, and go to stage 40. Right now its script only contains <code>SetObjectiveCompleted(30)</code>. We'll add additional logic below this.  
Снова открой список стадий и выбери 40ую. Ее скрипт состоит всего из одной строчки: <code>SetObjectiveCompleted(30)</code>. Расширим его.


The first line we'll put in is:
Добавь в начало скрипта эту строку:


<source lang="papyrus">
<source lang="papyrus">
Line 180: Line 181:
</source>
</source>


Note that with <code>AddItem</code>, you can give it either a base object (in which case it will create a new instance of that object out of thin air in someone's inventory), or a reference (in which case it will move that reference from wherever it is). So this line will grab the amulet out of the player's inventory and put it into Bendu's. Neat!  
Обрати внимание, что если в функцию <code>AddItem</code> передать прототип, то новый экземпляр будет создан "из воздуха". Если же мы передаем экземпляр объекта (ссылку на предмет), то он ''переместится'' из прежнего контейнера в новый. В нашем случае - из инвентаря игрока в инвентарь Бэнду Оло. Классно!


Now there's the matter of the gold. We add gold the same way we add any item. But that means we have to make a property on the quest script that points to the gold. Click on the "Properties" button, and you'll see the automatically-created alias properties already in the list. Add a new property of type "MiscObject" and call it "Gold001" -- it will auto-fill, so you're good to go.  
Теперь о деньгах. Золото можно выдать точно также, как и любой другой предмет. Но для этого нам придется создать свойство в скриптах квеста, указывающее на золото. Щелкни по кнопке "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" в имени - намек на то, что речь идет об одной монете.}}


Now that we have that property, we just have to add this line:  
Свойство есть, осталось добавить эту строчку:


<source lang="papyrus">
<source lang="papyrus">
Line 192: Line 193:
</source>
</source>


(Note that if you don't give <code>AddItem</code> a number, it assumes you're only adding one.)
(Обрати внимание, что если ты не укажешь количество добавляемых предметов в функции <code>AddItem</code>, то получишь один.)


Now, Bendu promised the player twice what the amulet was worth, and we're delivering that with the 500 gold. However, say we have to change the value of the amulet for lore, balance, or whimsical reasons. Then we would also have to remember to come back here and change the reward value. Or we could be slightly more clever about it.  
Как Бэнду и обещал, он выплатил двойную стоимость амулета. Но что если нам потребуется изменить ее? Исходя из требований баланса или просто по желанию левой ноги. В этом случае нам придется вернуться к этому скрипту и вновь изменить его (о чем ты наверняка забудешь). А можно поступить умнее и изменить скрипт вот так:


<source lang="papyrus">
<source lang="papyrus">
Line 200: Line 201:
</source>
</source>


Now it will automatically multiply the worth of amulet by two, and give that much gold to the player.  
Вот теперь система сама проверит стоимость амулета, умножит ее на 2 и выдаст игроку требуемую сумму.  


{{InDepth|Note that we're making this gold out of thin air, rather than having it in Bendu's inventory and moving it to the player. This is a minor break in "realism" that we typically use for quest rewards, to avoid players getting them too easily via pickpocketing/killing/etc.}}
{{InDepth|Обрати внимание - деньги появляются из воздуха, а не из инвентаря Бэнду. Это болезненный, но не смертельный пинок "реализма", дабы жаждущие скорой наживы игроки не могли получить награду куда более простым и быстрым способом - убив или обокрав квестодателя.}}


=Dropping the Amulet=
=Потеря квестовых предметов=
Players in Elder Scrolls games tend to be packrats. They pick up everything they can until they're overburdened, then they drop everything that doesn't look important. Or maybe they want to use the amulet to decorate their house. Or they throw it behind them hoping it will distract a giant as they run away. (Spoiler: it won't.) All sorts of reasons players drop items, but it can lead to problems when they go to finish this quest and don't know where the item is!
Игроки в Elder Scrolls, как хомячки. Тащат к себе всё, что не приколочено, пока не заработают перегрузку. А после выбрасывают всё, что кажется мусором. Или могут повесить квестовый предмет дома, в качестве украшения. Или пытаются отвлечь сверкающими побрякушками гиганта, удирая от него со всех ног (спойлер: не поможет). В общем, причин выкинуть амулет может быть масса, а в результате: квест выполнить невозможно, и где искать амулет непонятно.


We could do '''all''' sorts of things to handle this (turning the objective to retrieve the amulet back on if they lose it, inserting a radiant reaction to have someone bring it back to you, etc.). For extra credit, you try to set up that first one; you have all the tools to do so now!
Мы конечно же могли бы предусмотреть все возможные ситуации (изменять задачи, когда амулет выбрасывается на землю, добавить доброго самаритянина, который вернет игроку пропажу, и т.д.). У нас есть все необходимое для этого - можешь попробовать!


But the simplest and by far most foolproof solution to this problem is to simply make the amulet into a quest object. This means the player won't be able to drop it or sell it, and it will never leave her inventory until we take it out with the script to remove it.  
Но проще всего сделать амулет квестовым объектом, который игрок не может ни продать, ни выбросить. И пока ты сам не уберешь его из инвентаря скриптом, никуда он от игрока не денется.


We set this up with a flag on the alias, so open up the Amulet alias that we made long ago, and click the "Quest Object" checkbox in it.  
Это тоже не должно вызвать у тебя трудностей. Открой псевдоним Amulet и отметь флажком "Quest Object".


[[File:QuestObjectFlag.png]]
[[File:QuestObjectFlag.png]]


Now the player will be stuck with this item until they finish the quest. (Luckily for her, quest objects don't count towards encumbrance, so it will never be a true burden.)
Теперь игрок будет таскать амулет вплоть до окончания задания. (К счастью для него, квестовые предметы ничего не весят, а потом не будут особо мешать.)


{{NewFeature|In Fallout 3 and earlier Elder Scrolls games, the "Quest Object" flag lived on the base object itself.}}
{{NewFeature|В Fallout 3 и более ранних играх серии Elder Scrolls флаг "Quest Object" выставлялся для базового объекта.}}


=Coming Back Later=
=Возвращение=
Then we have the issue of the player coming back to Bendu and him having no recollection of meeting the player previously. He'll give the whole sob story again. In this example, it's just a single line, so it isn't too bad, but if there was a whole line of questioning that led up to this, the player wouldn't want to traverse it again. So we'll add some handling for the player who said "no" and decided to come back.  
Поговорим о поразительно короткой памяти Бэнду и его нежелании признавать игрока при очередной встрече. В нашем случае, Бэнду произносит всего одну фразу, что смотрится не очень-то атмосферно, однако не создает ощутимых неудобств. Но если бы это был длинный диалог с множеством ветвлений, в процессе которого Бэнду вновь и вновь пересказывал бы нам свою трагическую историю, то выслушивать его рыдания во второй раз захотели бы немногие. Добавим альтернативную ветвь диалога для тех игроков, которые ответили "Нет", на его просьбу, но после вернулись.


The first thing we'll do is add another stage to the quest, stage 5. We won't have to add any journal entries or quest logic here -- this is purely for our own internal usage.  
Вначале добавь новую стадию заданию - 5 (вот и пригодился оставленный между ними зазор). В журнал ничего добавлять не будем, потому что квест еще не принят. Это исключительно для внутреннего использования.


Then, if the player chooses the "No" option in dialogue, add a line of script to that info that sets the quest stage to 5. (Look at the "Yes" branch if you need to cheat and see how we set it to 10.)
Добавь в обработчик ответа "Нет", в разговоре с Бэнду, скрипт, изменяющий стадию квеста на 5 (Посмотри на аналогичное действие для ветки "Да", если что-то забыл - там мы выставляли стадию 10.)


Now comes the fun part. Open the initial topic (not the info) GSQ01MeetingBenduBranchTopic. You should be looking at this window:  
Теперь приступим к самому интересному. Открой начальную тему (не монолог) GSQ01MeetingBenduBranchTopic. Окно должно выглядеть вот так:


[[Image:TopicWindowRedux2.png|500px]]
[[Image:TopicWindowRedux2.png|500px]]


Right-click on the highlighted info in the table and select "Copy". This makes a full duplicate of that info -- if it had a script, the new info has its own script containing the code that the first one did (so you can change one without affecting the other); if the first one had connections, the new one will have the same connections; if the first one was flagged as Goodbye, this one will be too. And so on.
ПКМ по подсвеченному монологу и выбирай "Copy". В таблицу добавится полный дубликат существующего (то есть включающий в себя все скрипты, фразы, параметры вывода, и т.д.), никак не зависящий от оригинала.


When the dialogue system comes to a topic (i.e., when the player chooses the "Do you need help with anything?" text from a topic list), it starts at the top of its list of infos and works its way down, looking for one that has valid conditions. This is how you could have multiple characters responding to the same topic differently (by using different GetIsID conditions), or, in our case, having a character say something different at various stages of the quest.  
Во время обработки темы, система диалогов просматривает сверху вниз все возможные монологи и выводит первый соответствующий условиям. Это может быть проверка GetIsID, для отображения разных диалогов у разных персонажей или же, как в нашем случае, привязка к стадии квеста.  


Open the top info, and change its GetStage condition from "< 10" to "== 5". Now the first time the player chooses that topic, the game will check the first info, see that it's invalid (because the quest stage is 0), and then move onto the next one, which will be valid.  
Открой верхний монолог и измени условие GetStage с "< 10" на "== 5". Теперь, при первом обращении игрока к этой теме, игра проверит условие первого монолога, обнаружит, что оно неверно (потому что стадия равна 0) и перейдет к следующему, верному, который и отобразит.


Change the response text to be something suitably snarky about the player taking his sweet time in helping. Example: "I already told you about my amulet. Are you going to help me or not?"
Измени соответствующим образом текст реплики, отразив в ней, что игрок уже общался с Бэнду прежде и отказался помочь. Например: "Я уже рассказал вам о своем амулете. Вы все же решили мне помочь?"


We can also fill in the "Prompt" field at the top of the window. If this is filled in, the prompt will override the topic text. By using prompt overrides, you can get a more specific back-and-forth feeling to dialogue.  
Ты также можешь заполнить поле "Prompt" вверху окна. Если в нем содержится текст, он заменит собой текст темы. Используя это, можно писать более живые диалоги.


So fill in the prompt with "Didn't you need something?"
Впиши туда: "Напомни - что тебе было нужно?"


One final adjustment we'll make here -- in Skyrim, we introduce the ability for a player to dismiss themselves from a conversation at any time, without necessarily choosing an option in dialogue. For certain conversations, though, walking away '''is''' expressing a choice, and the NPC should respond to that. (It's very important when you're talking to a guard trying to arrest you, for instance.)
Осталось нанести еще один штрих - в Скайриме у игрока есть возможность в любой момент прервать диалог с НИП. И это может означать какой-либо выбор, на который собеседник должен отреагировать (хорошим примером является уход от разговора со стражей, которая пытается арестовать игрока.)


In our case, we'd want Bendu to treat the player walking away the same as he would if the player actively said "No."
В нашем случае, мы хотим, чтобы отказ от диалога с Бэнду был равносилен отказу от выполнения квеста.


So open up the '''other''' info in this topic, the one where we didn't make a new prompt. Over at the right, you see a list of other topics that this one links to.  
Открой '''другой''' монолог (тот, в котором мы '''не''' задавали значение полю "Prompt"). Справа есть список, в котором ты видишь другие темы, связанные с этой.


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


When you link something in a dialogue view, it shows up in here. (If you're old school, you can actually make the links from here, too!) Underneath, click the checkbox that says "Walk Away:" and select the GSQ01MeetingBenduNo link.  
Когда ты связываешь что-либо в представлении диалога, эта связь появляется здесь. (Если ты сторонник старой школы, можешь добавить связи через эту таблицу). Отметь флажком "Walk Away:" (чуть ниже) и выбери из списка связей GSQ01MeetingBenduNo.
 
Если теперь игрок прервет разговор с Бэнду, реакция последует та же, что и при отказе от выполнения квеста.
Now if you leave the dialogue while Bendu is talking, he'll react just as if you had chosen "Sorry, not right now."


{{InDepth|We could also have handled this by playing with the reset timers on the initial line, or using a quest variable instead of a stage.}}
{{InDepth|Данную проблему можно было бы решить и иначе. Например. использовав таймер в первой строке, или переменные вместо стадий квеста.}}


=Hellos/Goodbyes=
=Приветствия и прощания=
Right now when you interact with Bendu, he'll start with one of:
Сейчас диалог с Бэнду может начаться с пятерки различных фраз{{Verify/ru}}:
* "Yes, sera?"
* "Да, сир?"
* "And what might you need? Hmmm?"
* "Что тебе нужно? Ммм?"
* "Yes?"
* "Да?"
* "Hmm?"
* "Ммм?"
* "Need something?"
* "Тебе что-нибудь нужно?"


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