Bethesda Tutorial Basic Quest Scripting/ru

Revision as of 23:25, 8 April 2012 by imported>Vitamant (→‎Writing the Script)

Квестовое скриптописание



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


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


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

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

Ты узнаешь:

  • Основы структуры скриптов и их присоединение к объектам в Creation Engine
  • Как взаимодействовать с событиями при помощи нового скриптового языка

(Еще проще о скриптах ты можешь прочесть в статье "Hello, World" (en).)

Papyrus

Скриптовый язык, используемый Creation Kit зовется Papyrus (да-да, тот самый папирус, который использовался в качестве бумаги в древнем Египте). Скрипты, написанные на Пупирусе - это обычные текстовые файлы, которые во время выполнения транслируются в байт-код.

  Новая система похожа на старую TESScript, но требует несколько иного образа мышления. Ты больше не можешь напрямую манипулировать объектами игрового мира; поток твоего скрипта может быть прервана посередине; куча синтаксического сахара, вроде всеми любимых скобок. В общем новый язык стал больше походить на Lua или, скажем, Python. Если ты хорошо ориентируешься в TESScript, то ознакомься с руководством по переходу (en).

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

Добавление скриптов

Открой окно персонажа GSQThief, которого мы создали ранее. Найди секцию "Papyrus Scripts".

 

Кликни по кнопке "Add". Редактор немного подумает, после чего отобразит список всех возможных скриптов, которые можно прицепить к этому персонажу. Ты создаешь новый. Дважды щелкни по пункту "[New Script]" в верхней части списка.

 

Появится еще одно окошко, в котором ты можешь указать имя скрипта. Пиши: "GSQThiefScript" и щелкай по "OK".

 

Твой скрипт добавился в список скриптов персонажа, правда, пока он еще ничего не делает...

 

Свойства

Дважды кликни по имени скрипта, чтобы открыть окно свойств (Properties Window) этого скрипта. Сами по себе скрипты "не знают" о прочих объектах в игровом мире, за исключением тех, к которым присоединены. Чтобы поведать скрипту о других объектах, используются свойства. В нашем примере, нужно задать квесту GSQ01 стадию 20, когда вор будет убит, следовательно нужно "рассказать" скрипту, с каким именно квестом он должен взаимодействовать.

 

Нажми на кнопку "Add Property" в нижней-левой части окна. Появится окно создания нового свойства. В выпадающем списке Type, укажи тип объекта: "Quest". В качестве имени укажи "TutorialQuest". Все остальные поля оставь пустыми.

 

Ты только что сказал скрипту, что ему должен быть известен некий квест, который он будет идентифицировать по имени "TutorialQuest," но нигде не указал идентификатор этого квеста. Никаких проблем! Щелкни по свойству в списке слева, затем по кнопке "Edit Value" справа и выбери из списка "GSQ01" (как обычно можно набрать часть имени на клавиатуре для быстрого поиска). Затем нажми ОК.

 

Написание скрипта

Теперь, когда ты добавил свойство, нужно написать сам скрипт, чтобы он его как-то использовал. ПКМ по имени скрипта и из менюшки выбирай "Edit Source", чтобы перейти в редактор скриптов.

 

Верхняя линия (Scriptname GSQThiefScript extends ObjectReference) создается редактором автоматически при добавлении скрипта. Парой строчек ниже расположено свойство, которое ты только что объявил.

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

Event OnDeath(Actor killer)
        TutorialQuest.SetObjectiveDisplayed(20)
	TutorialQuest.SetStage(20)
EndEvent

Опять же, не обращай внимания на строчку SetObjectiveDisplayed(20)

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

  • Event OnDeath(Actor killer)
    • Эта линия говорит, что скрипт будет реагировать на смерть персонажа. Когда он умрет, игра запустит выполнение скрипта с этой строчки. Игра поместит ссылку на убийцу в переменную "killer", но мы не будем усложнять себе жизнь излишними проверками и не станем её использовать.
  • TutorialQuest.SetStage(20)
    • Точно также, как и в случае с диалогом просто вызываем SetStage, устанавливая стадию квеста на 20, посредством связи, установленной свойством TutorialQuest.
    • Отступы сделаны для лучшей читабельности.
  • EndEvent
    • Конец обработки события.

Из меню "File" выбери пункт "Save" (или нажми Ctrl+S). Редактор сохранит и скомпилирует скрипт. Всплывает окно вывода. Если код написан верно, оно будет выглядеть вот так:

 

Если окно вывода не появилось, пустое или содержит сообщения об ошибках - попробуй еще раз!

Как только все нормально скомпилируется, закрой окно скриптов, окно персонажа и сохрани плагин. Пришло время заняться непосредственно амулетом.

Scripting the Amulet

Open up the GSQAmulet item we created in the last tutorial. In the armor window, the scripts area is on the far right.

 

Create a new script just like we did before, and call it GSQAmuletScript. Add a Quest property to it, but to see a nifty trick, call it "GSQ01" instead of "TutorialQuest" this time.

 

It automatically set the value of the property for you, since you gave the property a name that matches an existing ID. If you're declaring a lot of properties, this can save you a bunch of time.

Open up the script, and we're going to add an event to it. The amulet can't die (obviously), but we do want to know when the player picks it up. Our event script will look like this:

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

Ignore it once again. It will be explained in the section about objectives.

There a few things to note in this script:

  • The parameters in the declaration (newContainer and oldContainer) will get filled in by the game when it tells this script to handle the event.
  • Because the OnContainerChanged event will fire whenever this object changes hands, we need to make sure we only set the stage when it's the player taking it, hence the if/endif block.
  • Game.GetPlayer() is a convenient way to get a reference to the player without needing to set a property, and newContainer was filled by the engine when this event fired, so we can do a comparison in the second line to make sure the item is moving into the player.
  • The way this script is written, SetStage will be called every time the player picks up the amulet. This doesn't matter because each quest stage can only happen once - calling SetStage(30) has no effect after the first time.

This script is also good to go, then. Close the script and armor windows, and save your plugin.

You can now play through the quest from start to finish, checking the console with SQV to see its stage changing.

Players can't use the console, though, so we'll learn how to give them better feedback about the quest in the next chapter.

  The scripts for Skyrim are just text files that live in your data directory before they get compiled into bytecode. This means that if you've got a favorite text editor, you can use it to work on scripts. We've included setups for both Sublime Text and Notepad++ that provide syntax highlighting, some basic autocompletion, and compilation shortcuts. If you're going to get heavily into scripting, these tools can make your life a lot easier.
  Предыдущая статья К другим учебникам Следующая статья  



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