Bethesda Tutorial Basic Quest Scripting/ru

From the CreationKit Wiki
Jump to navigation Jump to search

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



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


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


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

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

Ты узнаешь:

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

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

Papyrus[edit | edit source]

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

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

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

Добавление скриптов[edit | edit source]

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

ActorWindowScriptsArea.png

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

AddScriptWindow.png

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

AddNewScriptWindow.png

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

ScriptAdded.png

--Правка от Cyrius-- При добавлении скрипта может выпадать такая ошибка - Troble.png Для ее решения нужно открыть Steam - Инструменты - Creation Kit - Свойства - Локальные файлы. Нажмите на "Проверить целостность кэша" Если проверка найдет ошибки - исправит их автоматом и проблема будет решена. Должно помочь.

Свойства[edit | edit source]

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

EmptyPropertiesWindow.png

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

AddScriptPropertyWindow.png

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

PropertyWindowFilled.png

Написание скрипта[edit | edit source]

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

ScriptWindowWithPropertyAdded.png

Верхняя линия (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). Редактор сохранит и скомпилирует скрипт. Всплывет окно вывода. Если код написан верно, оно будет выглядеть вот так:

CompilerOutputGood.png

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

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

Скрипт для амулета[edit | edit source]

Открой настройки амулета GSQAmulet, который ты создал в предыдущей главе. В открывшемся окне Armor секция скриптов находится в нижнем-правом углу.

ArmorWindowScriptArea.png

Создай новый скрипт, как делал это прежде. Назови его GSQAmuletScript. Добавь свойство типа Quest, как и раньше, но на этот раз назови его "GSQ01", вместо "TutorialQuest", чтобы увидеть...

AutofilledProperty.png

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

Открой скрипт. И приступим к созданию нового события. Амулет не может умереть (по крайней мере не так, как вор), да нам это и не нужно. А нужно нам обработать событие, когда амулет попадет в руки игроку. Подобное событие будет выглядеть так:

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

Да, да, снова эта непонятная функция. Не волнуйся, в следующей главе ты, наконец, узнаешь, что она делает.

Итак, разбираем скрипт:

  • Параметры в объявлении (newContainer и oldContainer) будут заданы игрой, когда произойдет данное событие.
  • Поскольку событие OnContainerChanged вызывается всякий раз, когда объект меняет владельца (н.п. кладется в сундук), необходимо проверить, что это именно игрок взял амулет. Для этого мы используем блок условий if/endif (если..., то...).
  • Функция Game.GetPlayer() вернет ссылку на игрока. Объявлять его в качестве свойства нет необходимости, а в параметре newContainer будет ссылка на новый контейнер, в котором содержится предмет. Соответственно, если обе ссылки равны, значит новым контейнером стал инвентарь игрока.
  • И, если условие выполняется, мы задаем новую стадию квеста - 30. Если ты внимателен и хоть что-нибудь из этого понял, то можешь догадаться, что стадия квеста будет задаваться всякий раз, когда игрок получает амулет. Никогда так не делай в настоящих проектах. Событие, происходящее один раз, должно происходить один раз. Даже если у игрока есть возможность выложить квестовый предмет или вовсе его потерять, нужно продумать все подобные варианты, так что бы задание новой стадии не привело к невозможности завершить квест (н.п. повторная его выдача, когда квестодатель уже мертв и не может получить свое имущество) или его зацикливанию. Но в нашем примере это не имеет значения, так как дальнейшее развитие сюжета предопределено - ты отдашь Бенду амулет и больше его никогда не получишь.

Скрипт написан. Сохрани его, закрой окно Armor и сохрани плагин.

Теперь квест можно начать, выполнить и закончить. Используй консольную команду SQV (en) чтобы увидеть, как изменяются стадии задания.

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

Protip.jpg Скрипты в Skyrim - это просто текстовые файлы хранящиеся в каталоге data перед компиляцией в байт-код. Это позволяет использовать для их редактирования любые текстовые редакторы, которые вам нравятся. Ты можешь прочитать про настройку Sublime Text (en) и Notepad++ (en), которые позволяют включить подсветку синтаксиса, поддерживают некоторые функции автозавершения и горячие кнопки для компиляции. При написании больших сложных скриптов, эти инструменты существенно облегчат тебя жизнь!
LeftArrow.png Предыдущая статья К другим учебникам Следующая статья RightArrow.png



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