Difference between revisions of "Bethesda Tutorial Quest Aliases/ru"

From the CreationKit Wiki
Jump to navigation Jump to search
imported>Vitamant
(Created page with "{{PageTitle|Псевдонимы}} {{RussianPage|t}} {{Tutorial Index/ru |titlename=Псевдонимы |Prev=Bethesda_Tutorial_Packages/ru |Next=Bethesda_Tutorial_Advanced...")
 
imported>Vitamant
 
(8 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{PageTitle|Псевдонимы}}
{{PageTitle|Псевдонимы}}


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


{{Tutorial Index/ru
{{Tutorial Index/ru
Line 17: Line 17:
* Как правильно построить логику квеста, используя псевдонимы.
* Как правильно построить логику квеста, используя псевдонимы.


=Все неверно=
=Мы делали это неправильно=
{{Inuse/ru}}
То, что мы делали прежде - неверно.
Up until now, we've been doing it wrong.  


Well, not completely wrong, just in a way that scatters our logic all around the master file -- this makes it difficult to track down problems and make changes. (Software engineers would call this bad encapsulation.)
Ну, не всё, конечно, но логика нашего квеста разнесена по всему мастер-файлу, что очень затрудняет ее изменение (в программировании это называется плохой инкапсуляцией).


Consider: Bendu presently has a script on him that sets stage 200 on GSQ01 in the event of his death. This works fine for our isolated circumstance, but imagine if Bendu was not someone we had created just for our quest. If another quest wanted to use him, the designer would potentially have to modify our script, or add another script. If he was a normal character in the world, he also wouldn't have "GSQ" in his name, which means it might be difficult to track down "where is the script that's failing my GSQ quest?"
Вот смотри: На Бэнду висит скрипт, который переводит стадию квеста GSQ01 на 200, когда тот умирает. Для изолированного случая, все как будто бы нормально. Но представь, что кто-то еще решил использовать Бэнду для своего квеста. Разработчик может изменить наш скрипт, или добавить собственный. Если это нормальный персонаж, без приставки "GSQ" в имени, то будет довольно сложно отследить и узнать, что же стало причиной внезапных багов в нашем квесте.


The same problem applies to the amulet, and the thief. Obviously our current setup works well, but wouldn't it be nicer to have access to all the things our quest cares about in one place? Well, with aliases, we can have just that!  
Та же проблем с амулетом и вором. Конечно, пока мы еще помним - где и что писали, и всё работает корректно, но будет намного лучше, если все будет лежать в одном месте, не правда ли? Вот тут нам и помогут псевдонимы!


=Aliases as Overlays=
=Наложение псевдонимов=
The best way to think of aliases is as roles, defined for the specific purposes of their given quest. Characters and objects take on these roles for the duration of the quest, and then can shed them when the quest is done. This leads to much cleaner design implementation as well as memory savings.  
Думайте о псевдонимах, как об участниках нашей истории. Мы используем их, пока квест выполняется. Когда же они нам больше не нужны, мы можем с чистой совестью от них избавиться. При таком подходе, получится чистая, намного лучше организованная структура квеста. Удобная и менее ресурсоемкая.


Open up the GSQBenduOlo actor that we made [[Bethesda_Tutorial_Creating_an_Actor|towards the beginning of the quest design tutorial series]]. After we tidied up the [[Bethesda_Tutorial_Quest_Loose_Ends|loose ends]], he either has a script on him to handle his death, or has been flagged as essential. Both of these are very quest-specific bits of information though -- ask yourself, if the GSQ01 quest did not exist, is there any reason for them to be there? Since the answer is "no," clear them off of the base object: uncheck the "Essential" flag, and use the "Remove" button in the scripts area to take the script off of the base actor.  
Открой окно персонажа GSQBenduOlo, которого мы создали [[Bethesda_Tutorial_Creating_an_Actor/ru|ранее]]. После главы про [[Bethesda_Tutorial_Quest_Loose_Ends/ru|"хвосты"]], он обзавелся скриптом обработки собственной смерти или был отмечен флажком "Essential". В любом случае, это избыточная и в большинстве случаев ненужная информация. Спроси себя: если квест GSQ01 не существует, есть ли какие-либо причины следить за дальнейшей судьбой Бенду? Правильный ответ: "нет". Очистим прототип от этого мусора. Убери флажок "Essential", если он стоит, и кнопкой "Remove" удали скрипт, если такой имеется.


Now open the "Bendu" alias we made during the [[Bethesda_Tutorial_Quest_Objectives|Quest Design Fundamentals chapter on objectives]]. Then, we were studiously ignoring most of this rather large window and all its various doodads, but now we'll actually look around a bit. Don't be scared.  
А теперь открой псевдоним "Bendu", созданный на этапе[[Bethesda_Tutorial_Quest_Objectives/ru|постановки задач]]. В тот раз мы проигнорировали большую часть всевозможных настроек, а теперь присмотримся к ним повнимательнее. Не пугайся раньше времени.


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


So looking around here, we see a lot of familiar elements. There's a script panel. A package stack. An inventory. _Et cetera_. We can treat these as we would the same areas on a base object, and when an actor is put into an alias, he will take on all of the data for that alias as if they were his own. More importantly, when a quest stops running, all its aliases are removed from their targets.  
Что уже у нас здесь есть? Много всего. Панель скриптов. Набор пакетов. Инвентарь. Эт кетера. Все эти элементы ты можешь рассматривать, как его собственные. Как только у персонажа появляется псевдоним, тот принимает в себя все его параметры и использует, как свои собственные. Более того - стоит квесту завершиться, как все это бесследно исчезнет.


This is an important concept, so worth clarifying and mentioning again: '''An actor only takes on the data from an alias while its quest is running and he is in that alias.''' Once the quest stops, the actor will shed the alias like taking off a coat. (It's also possible to [[Clear_-_ReferenceAlias|clear an alias]], moving the actor out of it, while the quest is still running.)
Это очень важный аспект, поэтому повторим еще раз: '''Персонаж использует данные псевдонима только, пока выполняется квест, и существует этот псевдоним'''. Когда квест завершится, персонаж избавится от псевдонима и всех его свойств. Кроме того, псевдоним можно снять и {{ulink|Clear_-_ReferenceAlias|самостоятельно}}, во время выполнения квеста.)


This has a number of benefits:  
Вот несколько очевидных преимуществ:
* Our scripts can be specific to this individual quest, which makes them simpler and thus easier to debug.
* Наши скрипты не будут смешиваться с чужими, и будут относиться только к конкретному квесту, а потому останутся простыми и легко отлаживаемыми.
* We can make quest-specific packages that will only govern the actor's behavior during the quest. (Note: the alias package stack sits ''on top'' of the actor's normal package stack, so alias packages will have priority.)
* Мы можем задать индивидуальные пакеты поведения на время выполнения задания. (Примечание: пакеты псевдонимов будут расположены над обычными пакетами, а значит получат приоритет при выполнении.)
* We can apply spells (including passive abilities) and factions for the duration of the quest, which can have dramatic impact on how an actor behaves, especially in combat.  
* Мы можем применять заклинания (включая пассивные способности) или задавать фракции персонажам на время выполнения задания, что несомненно повлияет на поведение персонажа (особенно в бою).
* If the quest changes and we decided to use a different character in the world, we only need to change the target of this alias and '''everything just works.''' It's kind of delightful.  
* Если квест изменится и мы решим использовать другого персонажа, нам будет необходимо изменить лишь ссылку, к которой привязан псевдоним, и '''все будут работать'''. Восхитительно, правда?


{{ProTip|To make it easier to swap alias targets after the fact, it's good practice to make dialogue conditions use GetIsAliasRef instead of GetIsID. In this case, we'd want to go back through all our dialogue and replace our "GetIsID GSQBenduOlo <nowiki>==</nowiki> 1" conditions with "GetIsAliasRef Bendu <nowiki>==</nowiki> 1".}}
{{ProTip|Чтобы возможные изменения было проделать еще проще, лучше всего использовать в диалогах проверку GetIsAliasRef вместо GetIsID. Придется, правда, пройтись по всем нашим диалогам и заменить условие "GetIsID GSQBenduOlo <nowiki>==</nowiki> 1" на "GetIsAliasRef Bendu <nowiki>==</nowiki> 1".}}


One "gotcha" with the overlay concept is the inventory: any items you put into an actor's inventory will stay there when they drop out of the alias. (You could, of course, remove things with a script if you need to, but consider the ramifications carefully.)
Одно маленькое "но": все предметы, которые персонаж получит через свой псевдоним, останутся у него и после отключения псевдонима. Если тебе все же понадобится убрать такие предметы, следует сделать это при помощи скриптов. Помни об этом.


=Fixing Bendu=
=Исправление Бенду=
But enough talk. Let's fix Bendu's alias so that his quest functionality lives here. As before, we have two approaches:
Но довольно теории. Давайте изменим псевдоним Бенду так, чтобы вернуть то, что мы только что испортили:


==Immortal Bendu==
==Бессмертие==
You can simply click the Essential checkbox at the top of the Alias window, and Bendu will now be unkillable while he is in this alias. When the quest stops, he'll drop out of the alias and again be mortal.  
Нет ничего проще - просто отметь флажок "Essential" вверху окна псевдонима и Бэнду будет невозможно убить, пока он обладает этим псевдонимом. Когда квест будет завершен, он вновь станет смертным.


==Handling the Death==
==Обработка смерти==
Or we can put a script on this alias to handle Bendu's death, just like we had previously scripted the base object. Note that we have to change the first line of the script so that it will attach to a ReferenceAlias instead of an actor. The script we would make this time would be called "GSQQuestgiver" and look like this:
Что же касается провала квеста в случае смерти нашего квестодателя, то и тут нет ничего сложного. Точно также, как мы писали скрипт для прототипа Бенду, напишем и для его псевдонима. Обрати внимание, что первая строчка изменилась, так как скрипт будет принадлежать уже не персонажу, а псевдониму. Назовем же мы его "GSQQuestgiver" (квестодатель).


<source lang="papyrus">
<source lang="papyrus">
Line 69: Line 68:
</source>
</source>


Note that we don't have to set the quest as a property this time around; every ReferenceAlias is aware of the quest that owns it, so we can access it with <code>GetOwningQuest()</code>.  
Также заметь, что в этот раз мы не стали устанавливать свойство для связи с квестом. Любой псевдоним (ReferenceAlias) знает, какому квесту принадлежит, и мы можем сослаться на него, вызвав функцию <code>GetOwningQuest()</code>.  


Now, setting a stage when an Actor dies is an exceedingly common task, so there's no need to make a specialized script for it. When you click the Add button to put a script on this alias, look for scripts that begin with "default" -- these are provided scripts that perform common tasks. They are generally named pretty descriptively, so you can guess what they do from what they're called. In this case, we want "defaultSetStageOnDeathRefAlias". In this case, we'll need to set properties:
Однако, это можно сделать и иным способом, без создания нового скрипта. Установить стадию квеста, если умрет персонаж - это настолько распространенная задача, что она вынесена в список стандартных задач. Когда ты добавляешь новый скрипт псевдониму, то видишь список скриптов. Найди те, что начинаются с "default". Выбери "defaultSetStageOnDeathRefAlias" и установи свойства:
* myQST: GSQ01
* myQST: GSQ01
* preReqStage: <leave blank>
* preReqStage: <оставь пустым>
* StageToSet: 200
* StageToSet: 200


(By using default scripts, we can drastically decrease the total number of scripts in the game, which has benefits for memory usage. Since you're modding for a PC that likely has copious memory, it may be less of a concern.)
Использование стандартных скриптов позволяет сократить их общее число и сэкономить немного памяти. Не то что бы это было архиважно, но лучше использовать их, если есть такая возможность.


=Changing the Name=
=Изменение имени=
One final side note: you can even change the name of a reference when it's in an alias, so that players will see different text when they roll over it. You can define a [[Message]] with whatever text you want, and select it from the Display Name pulldown at the top of the alias window.  
В финале еще одно замечание: ты можешь изменить имя объекта, через его псевдоним. Определи любое {{ulink|Message|сообщение}} с любым текстом, и выбери его из списка "Display Name" вверху окна псевдонима.


[[File:AliasDisplayName.png]]
[[File:AliasDisplayName.png]]


By default, once you place a new display name on a reference, it will retain it ''even after your quest is over''. This is so the player doesn't come back to a cleared-out dungeon to find that all the enemies are now called different things than they were when they were killed. You can override this behavior with the "Clears Name When Removed" checkbox in the upper right.  
По-умолчанию, имя '''не''' изменяется на прежнее, после того, как псевдоним перестанет существовать. Это сделано для того, чтобы вернувшийся после сдачи квеста в очищенное подземелье игрок, не обнаружил груду трупов с совершенно другими именами. Но ты можешь изменить это, отметив флажок "Clears Name When Removed" в верхнем-правом углу.


=Packages=
=Пакеты=
The package stack for the alias will be placed '''above''' an actor's normal package stack, effectively overriding it.  
Пакеты, определенные в псевдониме, располагаются выше стандартных для их эффективного перекрытия.





Latest revision as of 09:21, 14 April 2012

Псевдонимы



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


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


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

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

Ты узнаешь:

  • Как использовать условные псевдонимы.
  • Как правильно построить логику квеста, используя псевдонимы.

Мы делали это неправильно[edit | edit source]

То, что мы делали прежде - неверно.

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

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

Та же проблем с амулетом и вором. Конечно, пока мы еще помним - где и что писали, и всё работает корректно, но будет намного лучше, если все будет лежать в одном месте, не правда ли? Вот тут нам и помогут псевдонимы!

Наложение псевдонимов[edit | edit source]

Думайте о псевдонимах, как об участниках нашей истории. Мы используем их, пока квест выполняется. Когда же они нам больше не нужны, мы можем с чистой совестью от них избавиться. При таком подходе, получится чистая, намного лучше организованная структура квеста. Удобная и менее ресурсоемкая.

Открой окно персонажа GSQBenduOlo, которого мы создали ранее. После главы про "хвосты", он обзавелся скриптом обработки собственной смерти или был отмечен флажком "Essential". В любом случае, это избыточная и в большинстве случаев ненужная информация. Спроси себя: если квест GSQ01 не существует, есть ли какие-либо причины следить за дальнейшей судьбой Бенду? Правильный ответ: "нет". Очистим прототип от этого мусора. Убери флажок "Essential", если он стоит, и кнопкой "Remove" удали скрипт, если такой имеется.

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

FilledFirstAliasWindow.png

Что уже у нас здесь есть? Много всего. Панель скриптов. Набор пакетов. Инвентарь. Эт кетера. Все эти элементы ты можешь рассматривать, как его собственные. Как только у персонажа появляется псевдоним, тот принимает в себя все его параметры и использует, как свои собственные. Более того - стоит квесту завершиться, как все это бесследно исчезнет.

Это очень важный аспект, поэтому повторим еще раз: Персонаж использует данные псевдонима только, пока выполняется квест, и существует этот псевдоним. Когда квест завершится, персонаж избавится от псевдонима и всех его свойств. Кроме того, псевдоним можно снять и самостоятельно (en), во время выполнения квеста.)

Вот несколько очевидных преимуществ:

  • Наши скрипты не будут смешиваться с чужими, и будут относиться только к конкретному квесту, а потому останутся простыми и легко отлаживаемыми.
  • Мы можем задать индивидуальные пакеты поведения на время выполнения задания. (Примечание: пакеты псевдонимов будут расположены над обычными пакетами, а значит получат приоритет при выполнении.)
  • Мы можем применять заклинания (включая пассивные способности) или задавать фракции персонажам на время выполнения задания, что несомненно повлияет на поведение персонажа (особенно в бою).
  • Если квест изменится и мы решим использовать другого персонажа, нам будет необходимо изменить лишь ссылку, к которой привязан псевдоним, и все будут работать. Восхитительно, правда?
Protip.jpg Чтобы возможные изменения было проделать еще проще, лучше всего использовать в диалогах проверку GetIsAliasRef вместо GetIsID. Придется, правда, пройтись по всем нашим диалогам и заменить условие "GetIsID GSQBenduOlo == 1" на "GetIsAliasRef Bendu == 1".

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

Исправление Бенду[edit | edit source]

Но довольно теории. Давайте изменим псевдоним Бенду так, чтобы вернуть то, что мы только что испортили:

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

Нет ничего проще - просто отметь флажок "Essential" вверху окна псевдонима и Бэнду будет невозможно убить, пока он обладает этим псевдонимом. Когда квест будет завершен, он вновь станет смертным.

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

Что же касается провала квеста в случае смерти нашего квестодателя, то и тут нет ничего сложного. Точно также, как мы писали скрипт для прототипа Бенду, напишем и для его псевдонима. Обрати внимание, что первая строчка изменилась, так как скрипт будет принадлежать уже не персонажу, а псевдониму. Назовем же мы его "GSQQuestgiver" (квестодатель).

Scriptname GSQQuestgiver extends ReferenceAlias

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

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

Однако, это можно сделать и иным способом, без создания нового скрипта. Установить стадию квеста, если умрет персонаж - это настолько распространенная задача, что она вынесена в список стандартных задач. Когда ты добавляешь новый скрипт псевдониму, то видишь список скриптов. Найди те, что начинаются с "default". Выбери "defaultSetStageOnDeathRefAlias" и установи свойства:

  • myQST: GSQ01
  • preReqStage: <оставь пустым>
  • StageToSet: 200

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

Изменение имени[edit | edit source]

В финале еще одно замечание: ты можешь изменить имя объекта, через его псевдоним. Определи любое сообщение (en) с любым текстом, и выбери его из списка "Display Name" вверху окна псевдонима.

AliasDisplayName.png

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

Пакеты[edit | edit source]

Пакеты, определенные в псевдониме, располагаются выше стандартных для их эффективного перекрытия.


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



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