НАВИГАЦИЯ ИГРЫ

FAQ по созданию квестов и диалогов

Cоздание квеста

Автором этого туториала является Povuholo , последняя модификация от 17.12.2006 г.

Предисловие автора

Добро пожаловать в туториал Povuholo по созданию квестов. Это я :)

Я знаю, насколько сложным выглядит Construction Set, особенно система квестов. Когда Обливион был выпущен и я посмотрел на эту систему, я не имел представления, что делать. Но после прочтения туториала (в котором, между прочим, были ошибки) я постепенно начал его понимать. На первых этапах я держал открытой страницу туториала, поэтому я мог сверять, что я делал правильно, но неожиданно я просто понял как это делается.

Как бы то ни было, это не история обо мне, а туториал по созданию квеста. Вот то, что мы будем делать с помощью этого туториала:

  • Добавление диалогов NPC (Non Playable Character (неигровой персонаж)), все, кроме вас в Обливионе)
  • Создание обновлений журнала путем собирания предметов или разговоров с NPC.
  • Получение предмета (ключа) от NPC, чтобы вы могли найти предмет, который он потерял.
  • Получение награды от NPC, за возвращение ему предмета.
  • Добавление квестовых маркеров, чтобы игрок знал, куда ему нужно направляться.

Перед тем, как мы начнем, я хочу быть уверенным что вы знаете несколько базовых вещей, которые я не буду объяснять в этом руководстве:

  • Вы должны уметь создавать новых NPC и новые предметы изменяя их ID.
  • Вы должны уметь размещать этих NPC и предметы в ячейках.
  • Вы должны уметь создавать новый контейнер (сундук) и размещать предметы в нем.
  • Вы должны уметь читать по-английски (читающие данный перевод этот пункт могут опустить.

И совет перед началом: СОХРАНЯЙТЕСЬ ЧАСТО. Сonstruction Set часто вылетает, когда вы делаете что-то неправильно или даже когда вы делаете что-то правильно! Поэтому сохраняйтесь почаще!

 

Создание NPC, который дает квест

Хорошо, начнем с создания объектов, которые нам понадобятся. Добавляем нового NPC в ячейку. Убедитесь, что сделали новый ОРИГИНАЛЬНЫЙ и УНИКАЛЬНЫЙ ID.

Так неправильно:

NPC1 
MyNPC 
Quest 

А вот так правильно:

povtutAlex1

Здесь префикс pov означает Povuholo, то есть меня. Помещайте подобные авторские инициалы перед всеми вашими ID, чтобы сделать их уникальными, это также позволит вам в будущем легче находить их в списке объектов.

Tut означает Tutorial, это название моего мода.

Поэтому мои ID всегда выглядят так:

мое имя + имя моего мода + мой объект

или

мое имя + имя моего мода + имя владельца предмета + мой объект 

Конечно, это всего лишь моя точка зрения, как называть ID, вы же можете создавать любые ID по своему усмотрению. Главное, убедитесь, что они уникальны, ведь мы же не хотим, чтобы кто-нибудь использовал тот же ID для своего квеста, так как это может привести к неработоспособности обоих модов.


Теперь добавьте в ячейку, например, в торговый район Имперского города, нового NPC (я своего назвал Alex). Двойной клик на него, в открывшемся окне отметьте флаг persistent reference (если возможно) и сделайте новый reference ID. У меня - povtutAlexref2.

 

Добавление необходимых для квеста предметов

  • Перейдите в Object Window (окно объектов) и найдите закладку key (ключ).
  • Создайте новый ключ с новым ID… ID моего ключа povtutalexkey1.
  • Выберите, какой предмет потерял Alex. Возможно свою железную броню? Идите в закладку armor (броня) и возьмите iron armor (железную броню), измените ее имя на Alex's iron armor и измените ее ID. Мой ID - povtutalexarmor1.
  • Вы также можете отметить галочкой флаг Quest Item, тогда игрок не сможет выбросить этот предмет.
  • Добавьте новый контейнер, например, сундук (chest). Вы можете изменить его имя, но если в его названии всегда будет Сундук, вам будет легче запомнить его. Или вы можете изменить его на Alex's chest (Сундук Алекса), это уже как пожелаете. Мой ID - povtutAlexchest1.
  • Теперь поместите iron armor (железную броню) в сундук, и перейдите в закладку lock (замок) сундука.
  • Измените lock на "needs a key" и выберите ключ, который вы перед этим создали (теперь сундук можно будет открыть только этим ключом).
  • Разместите сундук в пещере или в любом другом месте, где пожелаете. Затем кликните на сундуке, выберите окошко persistent reference и добавьте ссылку ID. У меня - povtutarmorchestref.

 

Общая информация о квесте (Quest data)

Уф-ф... Это был этап создания предметов. Сейчас мы переходим к той части, которая по важности для нас находится на первом месте, это непосредственно сам квест!

  • Нажмите на кнопку Q в меню вверху слева, чтобы открыть окно квестов (или в главном меню выберите Character -> Quests…).
  • С левой стороны вы можете найти все квесты, вы также можете просмотреть некоторые, чтобы ознакомиться с тем, как они работают. Только ничего не изменяйте!


 

  • Когда вы будете готовы, кликните правой клавишей мыши на одном из квестов в окне Editor ID и в появившемся меню выберите "new". Откроется маленькое окно, где вы сможете ввести ID вашего квеста. И опять же, он должен быть уникальным. У меня - povtutAlexarmorquest. (1)
  • Теперь выберите ID, который вы только что создали.
  • Введите название своего квеста (quest name), у меня это Alex`s Armor (броня Алекса).
  • Измените значение приоритета (priority) на какое-нибудь повыше, 60 будет в самый раз.
  • В quest conditions (условия квеста) найдите и выберите в Condition function GetisPlayableRace (не нажимайте enter, это закроет окно квестов) значение value и установите его в "1". Я не знаю, почему GetisPlayableRace находится здесь, но каждый квест содержит это условие, другие туториалы также содержат подобные рекомендации, это не несет каких-либо побочных эффектов, поэтому не имеет смысла не делать этого.

 

Стадии квеста (Quest Stages)

Мы рассматривали закладку quest data, теперь же мы переходим к закладке quest stages.

  • В окошке Index кликните правой клавишей мыши и выберите new. Введите значение 10. Текст, который вы введете в окошке Log Entry, это текст, который вы увидите после обновления журнала. Я написал:
"Я встретил Алекса, который потерял свою броню. Он попросил меня найти ее. Предположительно, броня находится
в замкнутом сундуке в [здесь впишите название ячейки, где вы разместили сундук].
Он дал мне ключ. Я должен попытаться найти этот сундук, и вернуть ему броню"

Опять же, не нажимайте enter, иначе это закроет окно квестов.

  • Теперь опять сделайте новый индекс, но со стадией 15. На этот раз вы говорите:
"Я нашел броню Алекса и теперь должен ему ее вернуть.". 
  • Теперь сделайте еще один индекс, с номером 20, и наберите:
"Алекс был доволен, когда я вернул ему броню и наградил меня 200 золотыми." 
  • Отметьте галочкой здесь также окошко "complete quest".

Темы квеста (Quest Topics)

Далее разберемся с темами (topics).

  • Перейдите в закладку topics (темы).

 

  • Кликните правой клавишей мыши на пустом месте в editor ID, и выберите в появившемся меню add topic (добавить тему).
  • Затем выберите GREETING. Нажмите OK.

 

  • Правый клик мышью на одном из пустых полей в окне info и в появившемся меню выбираем new. Набираем:
"Привет, ты можешь мне помочь? Я потерял свою броню, и хотел бы ее вернуть." 
  • Добавьте другую тему, выбрав add topic в editor ID, правый клик на topic и кликните на new.
  • Назовите ее как-нибудь. У меня - povtutlostmyarmor.
  • Справа есть несколько пустых полей с надписью сверху add topic (добавить тему). НЕ ИСПОЛЬЗУЙТЕ это для добавления тем. Это баг в CS, который приводит к конфликтам в сложных модах, если добавлять темы этим путем, поэтому они не будут работать. Вместо этого, в result script наберите: "addtopic povtutlostmyarmor" без кавычек.

Что мы только что сделали? Когда Алекс приветствует вас, используя свое приветствие (greeting), тема povtutlostmyarmor будет добавлена в его список тем, и вы сможете спросить его об этом.

Продолжаем.

  • Теперь в окне условий (conditions) кликните правой клавишей мыши и выберите в появившемся меню new. В Condition function выберите getisID.
  • В Function parameters, кликнитена INVALID. Откроется длинный список.
  • Помните NPC, которого вы создали? Наберите начальные буквы его ID (я набрал POVtutalex) и вы найдете его.
  • Убедитесь, что выбрали NPC, а не броню или что-нибудь еще. Нажмите OK. Теперь это должно выглядеть так: getisID povtutAlex1 = = 1.

1 означает да, 0 означает нет. Это означает, что когда ID персонажа, который с вами говорит povtutAlex1, он выберет это приветствие. Если вы этого не сделаете, каждый NPC в мире будет говорить это приветствие!

Конечно, мы не хотим, чтобы он говорил это, когда его броня уже будет возвращена!

  • Поэтому опять выберите new в окне Conditions. На этот раз выберите function getstage.
  • Кликните на Invalid и найдите ID вашего квеста.
  • В comparion выберите символ <</strong> . В value, наберите 10. Это означает, что Алекс будет говорить это только если этап квеста меньше (<</strong>) чем 10!
  • Добавьте новое приветствие (greeting) с текстом "Пожалуйста, найди мою броню".
  • Перейдите в условия (conditions) и сделайте так же, как в последний раз с GetisID.
  • Для getstage выберите тот же квест, но выберите равнение (comparison) = =, установите значение (value) на 10. Поэтому, когда он будет спрашивать вас о поиске брони, но вы ее еще не нашли, он скажет эту фразу. "= =" означает "равен". Следовательно, использоваться это приветствие будет когда уровень квеста равен 10, ни меньше, ни больше.

Сейчас мы добавим еще одно приветствие с текстом:

"Еще раз спасибо тебе за то, что нашел мою броню.". 
  • Опять тот же getisID. Для GetStage выберите = = 20. Конечно же, не забудьте ID квеста!
  • Далее, в Editor ID (там, где находится тема GREETINGS) щелкните правой кнопкой мыши и выберите add topic (добавить тему).
  • Выберите тему, которую вы создали как первое приветствие (greeting), у меня это было povtutlostmyarmor.
  • Измените текст темы на "Потеря моей брони" потому, что вы не хотите, чтобы игрок увидел povtutlostmyarmor в качестве названия темы, верно?
  • Зайдите в info, правый клик и выберите new (новый).

 

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

  • Наберите что-то вроде:
"Я потерял свою броню, когда охотился в [напишите название ячейки, в которой вы поместили сундук].
Я положил ее в сундук и запер его, на случай, если какой-нибудь бандит решит ее украсть. Но после этого я
был атакован, и бежал прочь, не захватив с собой броню! Ты ее мог бы мне вернуть? Это ключ от сундука." 
  • Если ваш текст слишком длинный, он может не поместиться в окне. Просто нажмите ok (убедитесь, что вы закончили предложение), правый клик мышью на чистом поле в response text и наберите остальную часть текста.
  • В result scriptнаберите "setstage povtutalexarmorquest 10" безкавычек. Затем нажмите enter и наберите player.additem povtutalexkey1 1
  • Сначала идет ID персонажа, которому добавляется предмет (для игрока просто player), затем ставится точка, затем additem. Затем пробел, после чего ID предмета, который вы хотите дать, в данном случае ключ, и затем их количество (т.е., сколько таких предметов вы хотите дать игроку).

Таким образом, когда это будет сказано в игре, обновятся записи квеста в вашем журнале до уровня 10, в котором будет сказано:

"Я встретил Алекса, который потерял свою броню…." ... остальная часть текста… а также "Ключ добавлен в ваш инвентарь." 
  • В окне условий (conditions) еще раз выберите getisID с тем же ID, что и в приветствиях. Это ID Алекса!
  • Далее правый клик в пустом месте поля info и в появившемся меню выбираем new. Наберите:
"Я надеюсь, ты найдешь мою броню."
  • Выберите тот же ID, что и в приветствиях, и поставьте getstage = = 10. Таким образом, этот текст будет отображаться, когда вы выберете в темах диалога тему Потеря моей брони, Алекс всегда будет говорить вам о своей потерянной броне, пока вы ее не вернете.

 

Мы уже почти на месте…

  • Правый клик и снова в info выберите new (новый), и наберите:
"Вау! Ты нашел ее, спасибо! Вот твоя награда!" 
  • Тот же getisID, в getstage ставим = = 15.
  • В result scriptнаберите setstage povtutalexarmorquest 20идобавьте player.additem gold001 200 . Здесь Gold001 - это ID золота, если вы укажете в конце 200, например, вы получите 200 золота!
  • И, конечно, наберите player.removeitem povtutalexarmor1 1 и таким образом вы вернете ему его броню назад!
  • Добавьте еще одну строку в поле info и наберите:
"Больше ничего не пропадало!" 
  • Тот же getisID, getstage = = 20. Это текст, который будет отображаться, если вы спросите о потерянной броне после ее возвращения.
  • Выйдите из окна квестов, нажав ok.

 

Скрипт (The script)

Теперь кликните на кнопку с изображением карандаша, которая откроет окно редактора скриптов. Не волнуйтесь, это будет быстро и безболезненно. ;)

  • Кликните на script, и выберите new.

Точка с запятой ( ; ) - символ, который можно использовать для вставки описания после линии скрипта, все что идет в строке после этого символа, в редакторе игнорируется и не меняет скрипт. Например, (описаниевыделенокурсивом):

scn povtutalexarmorscript ; This is the ID of the script. SCN means script name. This should always be on top of your scripts.
Begin OnAdd ; When the item this script is placed on (we will do that next is added to the players inventory, the following thing will happen.
if ( getstage povtutalexarmorquest == 10 ) ; If the quest stage is at 10
SetStage povtutalexarmorquest 15 ; Set it to 15.
Endif ; Just a standard thing you have to type when you used "if"
endif
End
  • Нажмите save (сохранить) и выйдите из окна.

Если по какой-то причине ваш скрипт не работает (появляется ошибка, когда вы пытаетесь его сохранить), удалите весь текст после знака ";" . Это должно помочь, и еще: Не нажимайте enter в середине любой из строк скрипта. Продолжим. Найдите броню Алекса (в окне объектов (object window), а не в сундуке).

  • В окошке scripts должно стоять NONE. Прокрутите список, пока не найдете ваш скрипт.
  • Выберите его и нажмите OK.

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

 

Маркеры квеста (Quest Markers)

Откройте окно квестов и выберите закладку quest targets.

  • В target ref, правый клик мыши и выберите в появившемся меню new. В conditions добавьте getstage povtutalexarmorquest == 10.
  • В quest target data выберите cell, в которой вы поместили сундук с броней Алекса. Для ref выберите ref сундука, который вы сделали. У меня был povtutarmorchestref. Если его нет в списке, перейдите в ячейку с сундуком, выберите его и посмотрите, чтобы окошко "persistent reference" было отмечено, и сделали ли вы reference ID. Если нет, сделайте сейчас. Теперь, когда этап квеста равен 10, маркер будет указывать на сундук, и игрок сможет найти его.
  • Создайте новую строку в quest target ref. В conditions(условиях) поставьте getstage povtutalexarmorquest = = 15.
  • В reference прокрутите до ячейки, в которой находится Алекс, и выберите эту ссылку (reference).

Теперь, когда вы добудете броню, и сообщения в журнале обновятся до 15 стадии квеста, маркер будет показывать местоположение Алекса, таким образом вы сможете найти его.

 

Заключение

Вот и все. Вы только что создали квест. Помните, что все, что вы создали, не появится в игре до тех пор, пока вы не выберете свой мод в data files, когда загружаете Oblivion, поэтому сделайте это перед началом тестирования! Начинайте просто поговорив с Алексом.

Возможно, вы попробуете сделать другой квест, и не будете заглядывать в туториал слишком часто. Это хороший путь для того, чтобы чему-нибудь научиться. И я скажу это опять: ЧАЩЕ СОХРАНЯЙТЕСЬ! Если вы создавали мод в течении нескольких часов без сохранения и Конструктор вылетит, думаю вас это сильно расстроит.


Если у вас есть какие-нибудь вопросы о системе квестов или что-нибудь еще, просто отправьте мне сообщение на форумах Tessource.

Удачного моддинга!

-Povuholo

 

 

 

 

 

TES 4 Construction Set: Руководство по созданию диалоговых квестов

В архиве, помимо руководства в виде PDF, вы найдете файл плагина, для наглядного изучения.

 

Введение

Надеюсь, Вы уже знакомы с программой TES Construction Set. Если нет, то далее Вам читать не нужно, так как данное руководство рассчитано на тех, кто уже хоть немного ориентируется в конструкторе. Моя задача состоит в том, чтобы научить РЕАЛИЗОВЫВАТЬ квесты. Именно реализовывать, писать могут почти все. А вот реализовать лишь единицы. Вот мы и займемся исправлением этой несправедливости. Сделаем упор на диалогах, так как большинство квестов именно диалоговые.

 

Вначале было слово:

И это слово было - «придумал». Именно после того, как Вы придумали свой квест, Вы наверняка захотите переместить его из своей головы в Тамриэль.


Итак, для начала нужно определиться:

  1. Что именно Вы хотите сделать.
  2. Продумать, какие предметы понадобятся для выполнения квеста
  3. Найти потенциальную «жертву» (Далее субъект. Это может быть как человек, так и предмет. Главное, что именно этот субъект дает игроку задание.)
  4. Выбрать подходящие локации для реализации (часто напрямую зависит от субъекта).
  5. Приступить к созданию и изменению предметов.
  6. Не пункт. Поиск ошибок.

 

Begin OnActivate
If ( c= 0 )
MessageBox "Voiceless it cries, wingless flutters, toothless bites, mouthless
mutters. What is it?", "Bat", "Old woman", "Wind", "Wraith"
Set controlvar to 1
ElseIf ( controlvar > 1 )
Activate
EndIf
End

 

Создаем свой первый квест:

«Добрыми делами вымощена дорога в Ад...»


Проверим? Пусть игрок безвозмездно (условно), совершит доброе дело. А именно: Пусть некто заболеет и помочь ему сможет только игрок: он должен принести больному лекарство и тем самым исцелить его. Больной после исцеления предлагает игроку покрыть все затраты на лекарство. Игроку дается три варианта ответов, из которых он должен выбрать. Например:

  • реальная цена
  • двойная цена
  • тройная цена

Субъект знает реальную цену и, если игрок выбирает второй или третий вариант, отношение к игроку падает наполовину и на 2/3 соответственно, а игрок получает только то, что потратил на лекарство. В случае же, если игрок честно отвечает, отношение удваивается и игроку возвращаются потраченные деньги плюс ценный подарок - пусть это будет кольцо скорости. Почему именно скорости? Потому, что наш субъект болен странной болезнью, которая не позволяет ему полноценно ходить, уменьшая скорость. Понятно, что после исцеления оно ему не нужно. А игроку пригодится. :) Лекарство игрок должен купить у любого алхимика. Болезнь назову «Саркома», а плагин - «MyFirstQuest» (его Вы можете найти в архиве с этим руководством). Вообще-то я предпочитаю немецкий язык, но из уважения к Вам, здесь буду использовать английские написания. Так Вам будет понятнее, что к чему.

 

Что понадобится для реализации.


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

  • Во первых, новая болезнь (в качестве способности, для исключения возможности стороннего излечения).
  • Во вторых - лекарство от нее (заклинание которое нужно наложить на субъекта для излечения).

Будем делать скрипт-эффектом. Так будет надежнее.

 

Создаем квестодателя


Открываем TES Construction Set и ищем того, кто будет болеть и пошлет игрока за лекарством. Хорошо для этого еще бы и ориентироваться в Тамриэле. Но, если Вы провели там хотя бы пару часов, думаю, Вы имеете представление, что где находится. Наш «субъект» должен быть из глубинки, иначе квест не имеет логики. Зачем посылать кого-то, если можно самому пройти пару кварталов в лавку алхимика. Другое дело, когда человек живет вдали от больших городов и ему сложно добраться до города, тем более с такой болезнью. Вполне правдоподобно, а фермеров в Сиродииле много. Из них я и решил выбрать одного в качестве «жертвы».


Далее выведем «на чистую воду» всех фермеров Сиродиила. Для этого в дереве щелкаем по «Actors -> NPC» и передвигаем бегунок полосы прокрутки в окне «Object Window» на столько, чтобы стал виден столбец «Class». Cм. рис 1.

 

 

Рис.1


Щелкаем по нему. Это упорядочит всех NPC в алфавитном порядке по классам. Спускаемся ниже, ищем класс «Farmer». см. рис 2.

 

 

Рис.2


Нашли? Я нашел двадцать два фермера в Сиродииле. Из них и нужно выбрать одного. Я выбрал Мерилдора (ID: Merildor) - исходя из тех соображений, что у него, равно как и у его жены, нет ссылок, а это значит, что нет и квестов :). Исправим :). См. рис 3.

 

 

Рис.3

 

Локация


Локации в данном случае нам выбирать не придется. Так как они уже есть - это ферма нашего фермера.

 

Изменяем мир


Итак, наступил ответственный момент. Начнем изменять мир.

Правым кликом на Мерилдоре вызываем контекстное меню, в котором выбираем Use Info. Рис 4

 

 

Рис.4


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

 

 

Рис.5


Втаблице Used in these Cells:, выбираем BrindleHome02. В прочем выбирать то и не из чего. Двойной щелчок левой кнопкой и ячейка с персонажем загружена. Находим в Render Window, Мерилдора и дважды щелкаем по нему. Появится окно ссылки. Рис 6.

 

 

Рис.6


В нем вписываем только Reference Editor ID: «aaaMerildorRef». Это и есть ссылка, которая нам потребуется в дальнейшем. Жмем ОК.


С Мерилдором покончено, займемся созданием болезни.

 

Создание болезни


Болезнь – это способность, уменьшающая скорость до нуля. Делаем следующим образом. Переходим в ветку «Способность», «Magic -> Spell -> Способность». Как и в первом случае, щелкаем правой кнопкой мыши по любому спеллу. Но выбираем пункт «New». Этим мы создадим совершенно новый объект типа «Spell». В появившемся окне нужно самостоятельно ввести все параметры.

  • ID – aaaSsarcoma
  • Name – Саркома
  • Type – Способность.

Не пугайтесь когда в поле Name вместо русских символов Вы увидите абракадабру. Это просто несовпадение кодировок, в игре все будет нормально... (Кстати, уже после написания руководства, нашел программу КИРА, которая устраняет данное недоразумение. Скачать ее можно на сайте Utgarda, в разделе Игры/Oblivion). Теперь в разделе «Effects» правой кнопкой мыши вызываем контекстное меню и выбираем «New». Рис 7

 

 

Рис.7


В появившемся окне Effect Item, вводим следующее:

  • Effect – Высасывание параметра
  • ActorVal – Скорость
  • Magnitude – 100

Жмем «OK». Эффект добавлен. В окне Spell жмем «OK». См. рис. 8

 

 

Рис.8


Болезнь создана, вы можете убедиться в этом, проверив список. Если Вы ввели ID с префиксом "aaa...", то спелл будет в самом верху.

 

Лекарство.


У нас будет заклинание в свитке. Для этого переходим Magic -> Enchantment и создаем новое зачарование для свитка. Правой кнопкой «New».

  • ID – «aaaMedicineForASsarcoma»
  • Type – Свиток.

Параметры зачарования определим позже. А пока создадим свиток Items -> Book. Здесь находятся книги Тамриэля, в том числе и свитки. Выбираем любой свиток заклинания, я выбрал «ScrollRestoreHealthTouch1Novice». Дважды щелкните на выбранном свитке и перед вами появится окно редактирования. Измените

  • ID - на «aaaMedicineForASsarcomaScroll»
  • NameИзлечение саркомы.
  • Enchanting - выберите в списке созданное нами зачарование «aaaMedicineForASsarcoma».

Пока на этом все.


Жмите ОК. Появится окно. (В нем говорится, что старый ID не совпадает с новым ID. Что сделать - изменить или создать новый объект?) Жмите «Да», создается новый объект. В противном случае объект будет изменен, и все связанные с ним действия будут нарушены! Если вы сделали все правильно, вверху списка должен появиться наш объект. Почему мы просто не создали новую книгу и не ввели необходимые параметры? Потому, что так проще, нам не потребовалось вводить изображение книги. Это может стать настоящей проблемой. Ведь требуется выбрать из существующих картинок, а они все находятся в архиве. И их предварительно необходимо извлечь при помощи специальных программ, либо рисовать самостоятельно.

 

Создание квеста и стадий квеста


Перейдем к созданию квеста и стадий к нему.

Открываем окно квестов

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

 

 

Рис.9

 

В появившемся окне вписываем название нашего квеста: «aaaMyFirstQuest». Вписывать нужно на латинице. Это идентификатор квеста, в игре будет отображаться другое название. Во вкладке Quest Data вписываем название нашего квеста и выставляем приоритет выше нуля. Ставим 60, как и другие квесты. См. рис. 10

 

 

Рис.10

 

Рассмотрим подробнее окно квестов.

 

 

Рис.11

 

Вкладка Quest Data – Общая информация о квесте.

  • Quest Name – Название квеста, записываемое в журнал и видимое в игре.
  • Priority – Приоритет квеста.
  • Script – Скрипт, управляющий квестом (не обязателен).
  • Start Game Enabled – Квест будет запущен при старте игры автоматически.
  • Allow Repeated Conversation Topics – Разрешить повторение тем бесед (см. ниже).
  • Allow Repeated Stages – Разрешить повторение стадий (см. ниже)
  • Quest Conditions – Условия Квеста, при которых он может выполняться.

Условия добавляются кнопкой New, как функция или значение какой-либо переменной. Кнопки в правой верхней части:

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

Сверху вниз соответственно.


Кнопка Add Icon Image – Позволяет установить иконку для квеста.


Вкладка Quest Stages – Стадии квеста. То, что записывается в журнал, по наступлении определенных событий.

  • Index )J– Индекс. Любая цифра. ( в разумных пределах  По индексу происходит запись в журнал нужной записи. Индекс текущей стадии возвращается при вызове функции GetStage…
  • Quest Stage Items – Части индекс-записей. Под одним индексом можно записать несколько вариантов записей, различающихся условиями (Conditions). Например, запись для игрока мужчины и женщины. ( Нашел…, Нашла…).
  • Log Entry – Собственно, сам текст записи.
  • Result Script – Сценарий результата. При добавлении записи можно выполнить определенный код для реализации каких-либо специальных нужд. ( Скрыть объект или наоборот показать, и т.д.п.)
  • Quest Targets – Цели квеста (маркер на карте). Определяются по индексу в условиях показа.
  • Select Reference in Render Window – Эта кнопка позволяет не напрягаясь выбрать цель прямо в окне мира. Можно выбрать и из списков, находящихся ниже. Сначала выбрать ячейку, а затем предмет в ячейке. ( ВАЖНО! Предмет должен быть устойчив в мире.
  • Reference Persist отмечен.)
  • Conditions – Условия для показа цели.
  • Compass Marker Ignore Locks – Маркер может показывать на необходимость прохода через запертые двери, не ища альтернативного пути.

 

Диалоги


Диалоги, как много в этом слове! Главное - запомните - темы выбираются сверху вниз. Первая доступная тема будет отобрана для показа. Вы должны научиться манипулировать темами, а значит и диалогами в целом.

 

Вкладка Topics – Темы.

Здесь создаем и изменяем темы для конкретных квестов.

  • Editor ID – Уникальное имя темы в редакторе.
  • Topic Text – Отображаемое название темы, например «Слухи».
  • Info – Варианты ответов для этой темы. Перебор идет с верху вниз. Выбирается первый ответ, удовлетворяющий условиям!
  • Response Text – Детали ответа. Если ответ длинный и не вмещается в один прием.
  • Result Script – Сценарий результата.
  • Conditions – Условия ответа.

 

Вкладка Conversation – Беседа.

Аналогична Topics, но используется для разговоров между NPS. Можно использовать для добавления тем при подслушивании разговоров.

 

Вкладка Combat – Бой.

То, что кричат NPC при сражениях, краже, бегстве и т.п.

 

Вкладка Persuasion – Убеждение.

То, что отвечают NPC, когда Вы пытаетесь им понравиться, или не понравиться.

 

Вкладка Detection – Обнаружение.

То, что говорят NPC, когда находят или теряют из виду игрока.

 

Вкладка Service – Обслуживание.

То, что говорят NPC, когда Вы торгуете, ремонтируете и т.п.

 

Вкладка Misc – Разное.

Доступные темы:

  • Corpse – когда видит труп.
  • Idle – когда бездельничает.
  • InfoRefusal – скажет, если недостаточно расположения к игроку, заместо отвергнутой темы. (флаг - Info Refusal).
  • ObserveCombat – если является свидетелем боя. TimeToGo – Скажет если не сможет сменить пакет AI, из-за установленного флага «Continue if PC Near» (продолжить, если игрок рядом).

 

«Edit Response» (Редактирование ответа)

Существует еще одно окно - «Edit Response» (Редактирование ответа), появляющееся при создании нового или изменении существующего ответа. Разберем и его.

  • Response Text – Текст ответа.

Script Notes – Примечание Сценария, Не путайте с Script Result! Текст, введенный в это поле, не является сценарием, а всего лишь ПРИМЕЧАНИЕ!

  • Группа Audio - Звук. Хотя тут и расположены настройки эмоций, не имеющие отношения к звукам.
  • Emotion Type – Тип эмоции (радость, грусть, злоба и т.д.). Emotion Value – Уровень эмоции. От 0 до 100%.


Вот, собственно, и все, что связано с диалогами.

 

Практика: Стадии квеста

Вкладка Quest Stages

Потренируемся на практике. Переходим на вкладку «Quest Stages». Сейчас мы создадим записи для журнала, тем самым подробнее обрисуем себе, что нужно дальше.

  • В левой части есть столбец «Index», он пока пуст. Правый щелчок мыши. Выбираем в меню «New». Будет создана чистая запись, ей нужно присвоить индекс. Пусть это будет 10. (Вообще принято писать индексы десятками 10, 20, 30. Это нужно для того, чтобы в случае необходимости можно было добавить новый индекс в свободное пространство. Например, 21. Не будем и мы этим брезговать.)
  • Log Entry – создаем вариант записи. Как и раньше, Правый клик -> New. Появится EMPTY, пустая запись. Запись мы вводим в одноименное поле, находящееся ниже. Вот примерный текст ( по квесту): «Я встретил человека по имени Мерилдор. Его съедает страшная болезнь саркома. Он попросил меня помочь ему.»
  • Повторите шаги создания стадий и создайте остальные стадии.

·       20 – «Я согласился помочь Мерилдору. Мне нужно найти для него лекарство. Все расходы Мерилдор обещал покрыть.»

·       30 – «Я купил заклинание, которое способно излечить Мерилдора. Нужно отправляться к нему.»

·       40 – «Я исцелил Мерилдора.»

·       50 – «Мерилдор отблагодарил меня за помощь. Вернул потраченные мной деньги, и подарил свое кольцо скорости.»

·       60 – «Я хотел обмануть Мерилдора. И сказал, что потратил на заклинание 350 золотых. Но, похоже, он знал, настояшую цену. т.к. вернул мне 240 золотых. То, что я потратил на покупку.»

·       70 – «Я хотел обмануть Мерилдора. И сказал, что потратил на заклинание 540 золотых. Но, похоже, он знал, настоящую цену. т.к. вернул мне 240 золотых. То, что я потратил на покупку.»

·       80 – «Я отказался помогать Мерилдору. У меня своих дел достаточно.»

  • В индексах, 50, 60, 70, 80 установите флаг Complete Quest. Это варианты завершения квеста, и любой из этих индексов должен завершить квест. См. рис. 12

 

 

Рис.12

 

Вкладка «Quest Targets»

Следующая вкладка: Quest Targets. Создаем цель квеста. Это Мерилдор на стадии 30. Правый клик -> New. Появится «Bad Target», неопределенная цель. Выбираем цель в группе Quest Target Data. Выбираем ячейку – BrindleHome02 (именно в ней находится Мерилдор). Выбираем Мерилдора в поле Ref (как видите, он имеет установленную нами ссылку, значит, это именно тот Мерилдор, который нам нужен, а не близнец какой-нибудь).


Существует и другой вариант выбора ссылки, немного проще. Загружаете ячейку с нужным объектом, устанавливаете камеру так, чтобы он был виден. И нажимаете кнопку «Select Reference in Render Window», редактор автоматически переключится на указанное окно и вы сможете выбрать объект, просто ткнув в него мышей (если объект можно выбрать, курсор становится белым, в противном случае - красный. Выбрать можно только устойчивые объекты.) Далее нужно выбрать условие, нам ведь не нужно показывать на Мерилдора на протяжении выполнения всего квеста. Conditions, нажимаем КНОПКУ New. Появится новое условие. Справа от кнопки в списке выбираем функцию «GetStage», эта функция возвращает значение текущей стадии (индекс). Потом щелкаем по кнопке INVALID (бывают и другие подписи, в зависимости от функции, но означают они всегда одно - ОШИБКА) и выбираем параметр функции, наш квест из списка. Теперь нужно определит само условие Comparison. Нам нужно, чтобы показ осуществлялся только на 30-й стадии, значит, выбираем «= =», и в поле Value выставляем 30. Таким образом, получилось условие – «если стадия квеста aaaMyFirstQuest равна тридцати» или иначе «GetStage aaaMyFirstQuest = = 30.00». В других вариантах цель не подходит и не отображается. См. рис 13. Аналогично выполняются условия в диалогах. К ним и переходим.

 

 

Рис.13

 

Вкладка «Topics»

В левой части находится список тем, доступных для квеста (у Вас там должно быть пусто, мы ведь еще не создавали тем!). Правый клик. Выбираем в меню «Add Topic» (добавить тему). Появляется окно «Select Topic», в котором будут отображены все доступные в этой вкладке темы. Можно выбрать любую и добавить свои варианты. Но нам это не подойдет. Нам нужна совершенно новая тема. Чтобы ее создать, щелкаем правой кнопкой мыши, и выбираем «New» (НИКОГДА НЕ УДАЛЯЙТЕ ОРИГИНАЛЬНЫЕ ТЕМЫ! Это может привести к неопределенным последствиям и неработоспособности сюжета). В появившейся строке пишем «aaaSsarcomaTopic», это будет наша основная тема. Жмите Enter и выбирайте эту тему двойным кликом. Тема добавлена, теперь ее можно изменять, создавать и удалять варианты ответов, переименовывать, и т.п. Вот и переименуем. По умолчанию название темы совпадает с ID темы. Если помните, это «aaaSsarcomaTopic», заменяем более лицеприятным, например «Болезнь». См. рис. 14.

 

 

Рис.14


Тема создана. Нужно ее как-то добавить игроку, иначе она никогда не появится в диалогах, хоть все условия будут тысячу раз истинны. Я не стал оригинальничать и решил добавить ее посредством приветствия «Greeting». Сделайте и Вы так же. Добавляйте тему (как в первом случае), но не создаете новую, а выбираете существующую. GREETING - это и есть всевозможные приветствия, которыми NPC встречают игрока. Как видите, таблица info сейчас пуста - это значит, что нет специальных вариантов для квеста и будут использоваться любые подходящие приветствия. Правым кликом создаем новый вариант приветствия. Я решил не приветствовать игрока, а прямо в лоб просить о помощи. :) В появившемся окне пишите «Помоги мне!». Здесь же можете выставить эмоции, на Ваше усмотрение, я ничего не менял. По завершении - ОК. Ответ создан, вернее приветствие. Это приветствие должно добавить тему для разговора. Делается это следующим образом. В поле Add Topics (находится в правой части) правый клик, Add Topic, и выбираем нужную тему. Конечно же, выбираем свою. Именно поэтому мы создали сначала ее. Теперь в поле Script Result вписываем следующее: «SetStage aaaMyFirstQuest 10» (сие есть старт квеста, а именно, функция SetStage устанавливает квест aaaMyFirstQuest в индекс 10, у нас это начало. Она же добавляет запись в журнал. Запись добавляется только один раз, повторные вызовы функции с этим индексом не добавят записей, а лишь изменят текущий индекс.)


ОБЯЗАТЕЛЬНО СОЗДАЕМ УСЛОВИЯ!


Первое: GetIsID Merildor == 1.00 (соответственно, функция, параметр, сравнение, значение).

Если не знаешь как, читай. Это условие позволяет использовать данное приветствие только Мерилдору, без этого условия все NPC будут просить о помощи :), что не есть гуд.


Второе условие: GetStage aaaMyFirstQuest < 20.00.


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


Следующий, уже упомянутый вариант, должен располагаться ниже предыдущего варианта. Создаем новый вариант щелчком ниже, в свободном поле. (Щелчок на варианте создаст новый вариант, но выше текущего.) С текстом «Ты достал лекарство?» создается он также, как и первый вариант. Но условия немного другие и отсутствуют темы в поле «Add Topics». Ведь, по логике, тема уже добавлена и игрок согласился помочь. Значит, добавлять темы нам не нужно.


Вот условие GetIsID Merildor = = 1.00 - это условие будет практически во всех вариантах тем, т.к. они относятся только к Мерилдору. Второе GetStage aaaMyFirstQuest >= 20.00 и третье GetStage aaaMyFirstQuest < 40.00. Надеюсь, Вам понятно, что второе и третье условия позволяют использовать вариант, только если стадия квеста больше или равна (>=) 20 и меньше (<) 40. Ведь наш квест заключается именно в пределах от 20 до 39. При стадии 40 квест уже завершен, и Мерилдор уже исцелен, поэтому спрашивать про лекарство в этом случае, по меньшей мере, глупо. (А вообще это был бы баг).


Теперь перейдем к третьему варианту. Еще ниже. Текст: «Я благодарен тебе за помощь. Позволь возместить твои убытки. Сколько ты потратил на свиток?» - этими словами Мерилдор будет приветствовать игрока, когда тот его исцелил, и сразу же будет выдаваться варианты ответов. Ответов мы еще не делали, поэтому давайте создадим условия варианта, потом создадим необходимые варианты ответов, и вернемся к этой теме. Условия: GetIsID Merildor = = 1.00 и GetStage aaaMyFirstQuest = = 40.00. Второе условие действительно лишь на стадии 40, когда Мерилдор уже излечен, но еще не отблагодарил игрока. Если Вы сделали все правильно, у Вас должна получиться примерно такая картинка:

 

 

Рис.15


Займемся созданием вариантов ответов для нашего квеста. В первый раз игроку предлагается выбрать, что ответить, когда его просят о помощи. Здесь он либо соглашается, либо отказывается. Чтобы создать новый ответ, нужно создать новую тему. Обычно используется слово Choice (Выбор) для удобства в идентификаторах тем. Вот и мы создаем новую тему и называем ее:


«aaaSsarcomaChoice1».


В тексте названия пишем «Хорошо, я помогу тебе.» Эта тема является ответом игрока и реакцией на него. В сущности, нет разницы между простой темой и темой c ответом. В варианты ответов можно запихнуть все, что угодно, но не стоит этого делать. :) Добавляем новую информацию (info): «Как хорошо! Хоть кто-то согласился помочь старику. Найди лекарство от саркомы. Я обещаю возместить все твои расходы. Оно должно быть у магов.». Можно выставить эмоции, я поставил «Happy 80». И добавим «вторую серию» ответа, заключающую.


Для этого создайте, новую «деталь ответа» (Правый Клик в Response Details.) Текст «Ее так просто не вылечить.» и эмоции «Sad 50». Таким образом можно создать сколь угодно длинный рассказ, но смотрите, не загружайте игрока трехчасовой лекцией. В поле Result Script впишите «SetStage aaaMyFirstQuest 20», это переведет наш квест на новую стадию (20), с вытекающими последствиями. Обязательно условия, не забывайте GetIsID Merildor = = 1.00. Хотя теоретически никто, кроме Мерилдора, не сможет представить эти варианты ответов игрока, не пренебрегайте элементарными условиями, это позволит избежать проблем в том случае, если этот вариант могут предоставить несколько NPC.


Теперь, дальше. Создаем новый вариант ответа:


«aaaSsarcomaChoice2»


  • Текст названия: «Я не стану тебе помогать.»
  • Текст info: «Жаль…».
  • Эмоции «Sad 100».
  • Result Script:
SetStage aaaMyFirstQuest 80 ;Стадия 80 завершает у нас квест. 

Досрочно, если помните.

  • Условия: GetIsID Merildor == 1.00

И так далее.


Следующий вариант ответа:


«aaaSsarcomaChoice3»


Текст: «Да. Я покупаю.» - Игрок покупает свиток с заклинанием

  • Info «Я знал, что ты возьмешь его. Это довольно редкое заклинание, не испорть его.»
  • Result Script:
Player.AddItem aaaMedicineForASsarcomaScroll 1
Player.RemoveItem Gold001 240
SetStage aaaMyFirstQuest 30 

Этот ответ необходим при покупке свитка.

Первая строка добавляет(AddItem) игроку (Player), вещь (aaaMedicineForASsarcomaScroll) в количестве одной штуки (1).

Вторая строка удаляет (RemoveItem) у игрока (Player) вещь (Gold001 – золото) в количестве 240 (такую цену я определил для свитка, можете вписать свое значение, но оно должно быть в разумных пределах, если Вы хотите написать нормальный квест, а не что-то типа: «Вот моя шняга» :)

Третья строка устанавливает стадию квеста в 30. Единственное условие - это деньги. Игрок может так сказать только если у него есть необходимая сумма. «GetItemCount Gold001 >= 240». Другие условия здесь не нужны. Ведь продать нам его должен маг. (Любой, а не какой-то определенный). Для правильной работы условия поставьте галочку в «Run on Target», это переведет проверку условий на цель, то есть, на игрока. Ведь по умолчанию все условия проверяются на говорящего, а нам не важно, сколько денег у мага, важно, сколько у игрока.


«aaaSsarcomaChoice4»


Текст «Я подумаю над твоим предложением» - отказ от покупки свитка.

  • Info «Только не долго. Вспомни того, для кого ты его покупаешь! Это очень болезненная зараза.»

На этом диалог завершается, и другие параметры не требуются.


«aaaSsarcomaChoice5»


Текст «Я потратил 240 золотых.» - честный ответ Мерилдору о потраченных средствах.

  • Info «Ты честный человек. И я поступлю по совести. Вот твои деньги. И еще, в знак благодарности прими это кольцо.»
  • ScriptResult:
Player.AddItem Gold001 240 ; добавляет золото игроку.
Player.AddItem EnchRingFortifyAttrSpeedSilverRuby 1 ; добавляет игроку кольцо.
SetStage aaaMyFirstQuest 50 ; завершает квест стадией 50.
ModDisposition Player 50 ; изменяет отношение к игроку +50 единиц.
  • Условия:
GetIsID Merildor = = 1.00
GetStage aaaMyFirstQuest = = 40


aaaSsarcomaChoice6


Текст «Я потратил 350 золотых.» - нечестный ответ Мерилдору о потраченных средствах.

  • Info «350! Мне говорили, что оно стоит 240 золотых. Забирай свои деньги и убирайся!»
  • ScriptResult:
Player.AddItem Gold001 240 ;добавляет золото игроку.
SetStage aaaMyFirstQuest 60 ; завершает квест стадией 60.
ModDisposition Player -35 ; изменяет отношение к игроку -35 единиц.

Условия:

GetIsID Merildor = = 1.00
GetStage aaaMyFirstQuest = = 40


aaaSsarcomaChoice7


Текст «Я потратил 540 золотых.» - нечестный ответ Мерилдору о потраченных средствах.

  • Info «540! Мне говорили оно стоит 240 золотых. Забирай свои деньги и убирайся, наглый лжец!»
  • ScriptResult:
Player.AddItem Gold001 240 ; добавляет золото игроку.
SetStage aaaMyFirstQuest 70 ; завершает квест стадией 70.
ModDisposition Player -54 ; изменяет отношение к игроку -54 единиц.

Условия:

GetIsID Merildor = = 1.00
GetStage aaaMyFirstQuest = = 40


Теперь у нас есть все необходимые варианты ответов. Займемся темой «Болезнь», которую мы создали самой первой.


Создание темы Болезнь


Известным способом создаем новое info (вариант темы) в теме «aaaSsarcomaTopic».

Текст info: «Я болен. Мне трудно передвигаться, мне нужно лекарство. Ты можешь достать его для меня?». После этого игроку должны быть выданы варианты ответов. У нас это «aaaSsarcomaChoice1» и «aaaSsarcomaChoice2». Сделать это можно так же, как мы добавляли тему игроку в приветствии. Но вставляем в поле Choices. См. рис. 16

 

 

Рис.16


Условия:

GetIsID Merildor = = 1.00 
GetStage aaaMyFirstQuest < 20


В этой же теме создаем вариант для мага, который будет продавать свиток игроку. Вариант должен находится ниже предыдущего. Текст info будет состоять из трех строк. «Так тебе нужно лекарство от саркомы, да? Тут поможет только заклинание.» «И оно у меня есть.» с эмоцией Surprise 70. «Я прошу за свиток всего 240 золотых. Будешь брать?».

Добавляем варианты ответа Choice: «aaaSsarcomaChoice3» и «aaaSsarcomaChoice4».

Получиться должно вот так:

 

 

Рис.17


Приветствие


Теперь пришло время вернуться к приветствию («Я благодарен тебе за помощь. Позволь возместить твои убытки. Сколько ты потратил на свиток?») и добавить в него варианты ответов игрока: «aaaSsarcomaChoice5», «aaaSsarcomaChoice6» и «aaaSsarcomaChoice7».

Условия:

GetIsClass MerchAlchemist = = 1.00 ; делает доступной тему только для алхимиков-продавцов.
GetStage aaaMyFirstQuest < 40

Если Вы все это сделали, позвольте Вас поздравить. С диалогами покончено. Но мы еще не сделали лекарство.

Скрипт для лекарства

Лекарство - это заклинание, которое исцеляет нашу болезнь. Будем делать скрипт-эффект (заклинание, возможности которого определяются сценарием). Приступим к разбору. Скрипты - это отдельная, обширная тема, и здесь я не буду ее разворачивать. Вот скрипт лекарства. Он проверяет, не подвергается ли объект воздействию определенного заклинания (наша болезнь). Если да, то заклинание удаляется, а стадия устанавливается в 40.

 

scn aaaMedicineForASsarcomaSCRIPT
Begin GameMode
if IsSpellTarget aaaSsarcoma == 1
removeSpell aaaSsarcoma
SetStage aaaMyFirstQuest 40
endif
end


Хочется надеяться, что Вы совладаете со сценариями. Окно редактирования сценариев вызывается нажатием на эту кнопку . В меню Script выбираем New... и вставляем в окно вышеприведенный код. В списке Script Type выберите Magic Effect. Нажимаем кнопку с изображением дискеты (НЕ КРАСНОЙ). Ничего при этом произойти не должно. Если при этом выскочило окно с ошибкой, возможно, Вы нарушили последовательность создания объектов или неправильно ввели текст кода. Еще один сценарий, необязательный. Но необходимый для полного представления работы квестов. Сценарий самого квеста. Накладывает заклинание на Мерилдора, если его на нем нет, и если квест незавершен. (Криво, но, как я уже сказал, необходимо).

 

scn aaaMyFirstQuestSCRIPT
begin GameMode
if GetStage aaaMyFirstQuest < 40 && aaaMerildorRef.IsSpellTarget aaaSsarcoma == 0 && Player.GetDistance aaaMerildorRef < 3000
aaaMerildorRef.AddSpell aaaSsarcoma
endif
end


Все, каквпервомслучае, тольковкачестве Script Type выберите Quest. Сохраняйте (кнопка с дискетой).


Теперь нужно «развесить» сценарии по объектам. Выбираем наш квест и во вкладке Quest Data в поле Script выбираем наш сценарий aaaMyFirstQuestSCRIPT. Готово. Следующий сценарий является магическим эффектом и необходим для лечения. Помните, где создали зачарование для свитка? Открывайте его. Будем добавлять единственный эффект.

 

 

Рис.18


Добавляется так же, как и для болезни, но параметры иные.

  • Effect – Script Effect
  • Range – при касании
  • Area – 0
  • Duration – 1
  • Script – aaaMedicineForASsarcomaSCRIPT
  • effectName – Излечение саркомы
  • School – изменение
  • Visual Effect – Восстановление

И обязательно уберите галочку с Effect is Hostile (эффект враждебен), а то Мерилдор может на Вас кинуться, решив, что Вы его атакуете.


Вот, собственно, и ВСЕ!

Квест закончен, можете проверить (если найдете Мерилдора :) ).

 

ВНИМАНИЕ:

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


Создание квеста – шаг за шагом:


 

Создание квестового фамильного меча Фарнадо

  • В Object Window (Окне объектов) раскройте закладку WEAPON.
  • Затем раскройте закладку "WEAPONS".
  • Кликните на слове "Iron".
  • Прокрутите вниз до WeapIronLongsword:

 

  • В графе ID введите: AAfamilysword.
  • В графе Name введите: Фамильный меч Варнадо.
  • Нажмите OK. Затем нажмите YES, чтобы создать новый объект (Create a New Form?):

 

  • Вот что у нас в итоге получилось:

 

 

Создание нового квеста "Меч Варнадо"

  • Откроем Quest Editor, он же Редактор квестов (его можно найти на панели инструментов, это кнопка с большой буквой Q).
  • Правый клик на поле EditorID.
  • В открывшемся контекстном меню выбираем NEW, и затем вводим идентификатор (ID), что-то вроде AAitem:

 

  • Затем в поле Quest Name вводим: Меч Варнадо. Это будет название квеста, которое будет отображаться в игре.
  • Чуть ниже, в графе Priority установите значение 60 (приоритет влияет на очередность выбора диалогов).

 

  • Нажмите ОK, чтобы выйти из редактора квестов.

 

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

  • Откройте Script Edit (Редактор скриптов), нажав на кнопке с нарисованным карандашом на панели инструментов.
  • Выберите в меню script, затем NEW.
  • После чего введите следующее:
ScriptName AASwordEquipScript
Begin OnAdd
if ( GetStage AAitem == 10 )
SetStage AAitem 20
elseif ( GetStage AAitem == 20 )
Return
else
SetStage AAitem 15
endif
endif 
End

Примечание: в скрипте AAitem – это EditorID квеста.

  • Теперь опять выберите в меню script, затем SAVE.

 

Вешаем на меч скрипт

  • Хорошо, сейчас вернемся в Object Window (Окно объектов).
  • Ищем наш меч, он находится в списке железного (Iron) оружия (AAfamilysword).
  • Правый клик на нем и в появившемся меню выбираем EDIT.
  • В окне настройки оружия, в данном случае нашего меча, найдите окошко SCRIPT.
  • Откройте выпадающий список, найдите и выберите наш новый скрипт (AASwordEquipScript). Он станет отображаться в окошке скрипта:

 

  • Жмите OK.

 

Размещение меча в игровой локации

  • Теперь нам нужно поместить меч где-то на просторах игрового мира.

(Для тестирования, я поместил его у стены, позади таверны Скатерть-самобранка (The Feed Bag), куда Варнадо идет есть каждый день после работы.)

  • Прямо из списка в окне объектов (Object Window) перетаскиваем меч и размещаем его где-нибудь на просторах мира игры (в окне просмотра – Render Window).
  • Перейдите к мечу, который мы только что разместили в окне просмотра (Render Window).
  • Двойной клик левой клавишей мыши, чтобы войти в режим его редактирования. Откроется окно настройки копии объекта – окно Reference.
  • В этом окне найдите и отметьте галочкой окошко Persistent Reference (это позволит работать с этой копией предмета в будущем):

 

 

Создание стадий квеста

  • Сейчас вновь откройте редактор квестов и в списке слева выберите наш квест – AAitem.
  • Перейдите на закладку Quest Stages (Стадии квеста).
  • Правый клик в поле Index, в появившемся меню выбираем New и вводим цифру 10.
  • Опять правый клик в поле Index, в появившемся меню выбираем New и вводим цифру 15.
  • Еще раз правый клик в поле Index, в появившемся меню выбираем New и вводим цифру 20.
  • И последний раз правый клик в поле Index, в появившемся меню выбираем New и вводим цифру 30.
  • Вот эти цифры - 10, 15, 20 и 30 – это стадии нашего квеста:

 

 

Стадия 10


  • Выбираем стадию 10, затем правый клик в верхнем поле Log Entry и в появившемся меню выбираем NEW. Появится слово EMPTY.
  • Теперь кликайте внутри окошка Log Entry, расположенного ниже, и наберите:

"Варнадо попросил меня найти его фамильный меч за вознаграждение."

  • После этого кликните внутри верхнего окошка Log Entry, чтобы этот текст вступил в силу:

 

  • Теперь нажмите на кнопку NEW ниже панели Conditions, слева:

 

  • Затем, под Condition Function, в раскрывающемся списке найдите и выберите GetStage.
  • Теперь, под Function Parameters, кликните на кнопке INVALID и выберите AAitem.
  • После этого в колонке VALUE установите значение 10:

 

 

Стадия 15


  • Выберите стадию 15.
  • Правый клик в верхнем поле Log Entry, и в появившемся меню выберите NEW. Появится слово EMPTY.
  • Теперь кликайте внутри окошка Log Entry, расположенного ниже, и наберите:

"Я нашел необычный длинный меч. На нем была надпись, которая гласила: Варнадо. Я, кажется, что-то помню о Варнадо из Имперского Города."

  • Кликните внутри верхнего окошка Log Entry, чтобы этот текст вступил в силу.
  • Нажмите на кнопку NEW ниже панели Conditions, слева.
  • Затем, под Condition Function, в раскрывающемся списке найдите и выберите GetStage.
  • Теперь, под Function Parameters, кликните на кнопке INVALID и выберите AAitem.
  • Затем, в колонке VALUE, установите значение 15.

 

Стадия 20


  • Выберите стадию 20.
  • Правый клик в верхнем поле Log Entry, и в появившемся меню выберите NEW. Появится слово EMPTY.
  • Теперь кликайте внутри окошка Log Entry, расположенного ниже, и наберите:

"Я нашел фамильный меч Варнадо. Я должен вернуть его за вознаграждение."

  • После этого кликните внутри верхнего окошка Log Entry, чтобы этот текст вступил в силу.
  • Опять нажмите на кнопку NEW ниже панели Conditions, слева.
  • Затем, под Condition Function, используйте стрелку, чтобы вызвать раскрывающийся список, и выберите в нем функцию GetStage.
  • Теперь, под Function Parameters, кликните на кнопке INVALID и в раскрывшемся списке выберите AAitem.
  • Затем, в колонке VALUE, установите значение 20.

 

Стадия 30


  • Выберите стадию 30, правый клик в верхнем поле Log Entry, и в появившемся меню выберите NEW. Появится слово EMPTY.
  • Теперь кликайте внутри окошка Log Entry, расположенного ниже, и наберите:

"Я нашел и вернул семейную реликвию Варнадо."

  • После этого кликните внутри верхнего окошка Log Entry, чтобы этот текст вступил в силу.
  • И вновь нажмите на кнопку NEW ниже панели Conditions, слева.
  • Затем, под Condition Function, используйте стрелку, чтобы вызвать раскрывающийся список.
  • Выберите в нем функцию GetStage.
  • Теперь, под Function Parameters, нажмите на кнопку INVALID и выберите AAitem.
  • Затем, в колонке VALUE, установите значение 30.
  • Все еще с выбранной стадией 30 найдите окошко Complete Quest ниже Log Entry и отметьте его галочкой.
  • Это будет означать, что после этой стадии квест будет считаться выполненным и будет занесен в секцию Completed Quest (выполненных квестов) в журнале игрока.

 

Создание топиков квеста

  • Откройте закладку Topics (Темы) (в редакторе квестов).
  • Правый клик на поле EditorID, и в появившемся меню выбираете ADD TOPIC. Откроется список тем.
  • В СЕРЕДИНЕ ЭТОГО СПИСКА опять кликните правой клавишей и в появившемся меню выберите пункт NEW.
  • Назовите эту новую тему MyFamilySword. Нажмите OK:

 

  • Перейдите к окошку Topic Text. Это название темы, которое будет отображаться в игре.
  • Измените MyFamilySword на Мой семейный меч:

 

 

INFO 1


  • Выберите тему MyFamilySword.
  • Правый клик на поле INFO и в появившемся меню выбираете NEW. Откроется окно текста для ответа (response text).
  • Наберите:

"Я кажется потерял свой семейный меч. Верни мне его, и я вознагражу тебя. "

  • Жмите ОК.
  • Выделите только что созданное INFO и нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа от этой кнопки расположено окошко Condition Function.
  • Используйте стрелку, чтобы вызвать раскрывающийся список, и выберите в нем GetIsId.
  • В следующей кнопке справа – Function Parameters – появится надпись INVALID.
  • Нажмите на кнопку INVALID и в прокручивающемся списке выберите Varnado:

 

  • Нажмите еще раз кнопку NEW под панелью Conditions.
  • Справа от этой кнопки расположено окошко Condition Function.
  • Используйте стрелку, чтобы вызвать раскрывающийся список, и выберите в нем GetStage.
  • В следующей кнопке справа – Function Parameters – появится надпись INVALID.
  • Нажмите на кнопку INVALID и в прокручивающемся списке выберите AAitem.
  • Еще правее, в колонке COMPARISON, прокрутите до символа "меньше чем" ( <</strong> ). Выберите его.
  • Еще правее, измените значение VALUE на 10.
  • Кликните где-нибудь за пределами поля Conditions, чтобы изменения вступили в силу:

 

  • Сейчас перейдем к окошку Result Script. Кликните внутри него и наберите:

"SetStage AAitem 10"

  • Правее нажимаем на кнопку Compile (компилируем скрипт).
  • Еще правее есть пять окон для пометки. Найдите то, которое называется SAY ONCE, и отметьте его:

 

 

INFO 2


  • И ВНОВЬ, правый клик на поле INFO, в появившемся меню выбираете NEW. Откроется окно текста для ответа (response text).
  • Наберите:

"Еще не нашел? Продолжай поиски."

  • Жмите ОК.
  • Выделите только что созданное INFO и нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа от этой кнопки расположено окошко Condition Function.
  • Используйте стрелку, чтобы вызвать раскрывающийся список, и выберите в нем GetIsId.
  • В следующей кнопке справа – Function Parameters – появится надпись INVALID.
  • Нажмите на кнопку INVALID и в прокручивающемся списке выберите Varnado.
  • Вновь нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа в окошке Condition Function используйте стрелку для раскрытия списка функций и выберите GetStage.
  • Еще правее, на кнопке Function Parameters, появится надпись INVALID.
  • Нажмите на эту кнопку и в списке выберите AAitem.
  • В окошке Value установите значение 10.
  • Кликните где-нибудь в поле Conditions, чтобы изменения вступили в силу:

 

 

INFO 3


  • И ВНОВЬ, правый клик на поле INFO, в появившемся меню выбираете NEW. Откроется окно текста для ответа (response text).
  • Наберите:

"Ты нашел мой фамильный меч! Спасибо. Вот твоя награда за оказанную услугу."

  • Жмите .
  • Выделите только что созданное INFO и нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа от этой кнопки расположено окошко Condition Function.
  • Используйте стрелку, чтобы вызвать раскрывающийся список, и выберите в нем GetIsId.
  • В следующей кнопке справа – Function Parameters – появится надпись INVALID.
  • Нажмите на кнопку INVALID и в прокручивающемся списке выберите Varnado.
  • Вновь нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа в окошке Condition Function используйте стрелку для раскрытия списка функций и выберите GetStage.
  • Еще правее, на кнопке Function Parameters появится надпись INVALID.
  • Нажмите на эту кнопку и в списке выберите AAitem.
  • В окошке Value установите значение 20.
  • Кликните где-нибудь в поле Conditions, чтобы изменения вступили в силу.
  • Еще раз нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа в окошке Condition Function используйте стрелку для раскрытия списка функций и выберите GetStage.
  • В следующей кнопке справа – Function Parameters – появится надпись INVALID.
  • Нажмите на кнопку INVALID и в прокручивающемся списке выберите AAitem.
  • Правее, измените значение VALUE на 15.
  • Справа от колонки VALUE есть маленькое окошко "OR". Отметьте его.
  • Кликните где-нибудь в поле Conditions, чтобы изменения вступили в силу:

 

  • Теперь перейдите к окошку Result Script, кликните в нем и наберите:
SetStage AAitem 30
Player.removeitem AAfamilysword 1
Player.additem OrcishBoots 1
  • Правее нажимаем на кнопку Compile (компилируем скрипт).
  • Вы можете изменить OrcishBoots на Editor ID того предмета, который вы хотите использовать в качестве награды.

 

INFO 4


  • Вновь правый клик в поле INFO и в появившемся окне выбираете NEW. Откроется окно текста для ответа (response text).
  • Введите:

"Спасибо за возвращение моего фамильного меча. "

  • Жмите ОК.
  • Выделите только что созданное INFO и нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа от этой кнопки расположено окошко Condition Function.
  • Используйте стрелку, чтобы вызвать раскрывающийся список, и выберите в нем GetIsId.
  • В следующей кнопке справа – Function Parameters – появится надпись INVALID.
  • Нажмите на кнопку INVALID и в прокручивающемся списке выберите Varnado.
  • Еще раз нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа в окошке Condition Function используйте стрелку для раскрытия списка функций и выберите GetStage.
  • В следующей кнопке справа – Function Parameters – появится надпись INVALID.
  • Нажмите на кнопку INVALID и в прокручивающемся списке выберите AAitem.
  • Правее, измените значение VALUE на 30.
  • Кликните где-нибудь в поле Conditions, чтобы изменения вступили в силу.
  • Теперь перейдите к окошку Result Script и наберите в нем:
Stopquest AAitem
  • Правее нажимаем на кнопку Compile (компилируем скрипт).
  • OK. Закройте редактор квестов.

 

Фильтрация диалогов

  • В главном меню перейдите Character -> Filtered Dialogue.
  • Вверху слева, в окошке Filter выберите Varnado.
  • Перейдите на закладку TOPICS:

 

  • Выберите тему под названием GREETING (приветствия).
  • Прокрутите список приветствий вниз в соседнем окошке, и правый клик в колонке INFO.
  • В появившемся меню выберите NEW. Откроется окно текста для ответа (response text).
  • Наберите:

""Приветствую. Добро пожаловать в Лучшую защиту""

  • Жмите .
  • Выделите только что созданное INFO и нажмите на кнопку NEW ниже панели Conditions, слева.
  • Справа от этой кнопки расположено окошко Condition Function.
  • Используйте стрелку, чтобы вызвать раскрывающийся список, и выберите в нем GetIsId.
  • В следующей кнопке справа – Function Parameters – появится надпись INVALID.
  • Нажмите на кнопку INVALID и в прокручивающемся списке выберите Varnado.
  • Теперь перейдите к окошку Result Script и наберите в нем:
AddTopic MyFamilySword
  • Правее нажимаем на кнопку Compile (компилируем скрипт).
  • Еще правее есть пять окон для пометки. Найдите то, которое называется SAY ONCE, и отметьте его:

 

  • Правый клик на только что созданном нами INFO, и выберите Move To Quest:

 

  • Откроется список. Выберите название нашего квеста (Quest name) – AAitem.
  • INFO переместится в списке повыше и будет уже привязано к нашему квесту.
  • Нажмите OK, чтобы закрыть редактор диалогов.

 

Цели квеста

  • Теперь, мы будем создавать Quest Targets (цели квеста).
  • Это делается для того, чтобы на компасе игрока появлялись маркеры, указывающие направление к следующей цели.
  • Откройте Quest Editor (Редактор квестов).
  • Выберите ваш квест в поле Editor ID (AAitem).
  • Теперь перейдите на закладку Quest Targets (Цели квеста).
  • Правый клик в колонке Target Ref, и в появившемся меню выберите NEW.
  • В списке появится BadTarget:

 

  • Ниже, в секции Quest Target Data, найдите окошко Cell, и в раскрывающемся списке выберите ячейку, в которой вы поместили AAfamilysword или свой квестовый предмет.
  • Еще ниже найдите окошко Ref, и в раскрывающемся списке выберите свой квестовый предмет - AAfamilysword:

 

  • Теперь в нижнем левом углу, под Conditions, нажмите на кнопку NEW.
  • Справа от этой кнопки расположено окно Condition function.
  • В раскрывающемся списке выберите GetStage.
  • Теперь, под Function Parameters, нажмите на кнопку INVALID, и выберите AAitem. Нажмите OK.
  • Затем, под VALUE, установите значение 10, и кликните где-нибудь в поле Conditions, чтобы изменения вступили в силу.

  • ОПЯТЬ, правый клик в колонке Target Ref, и в появившемся меню выберите NEW. В списке появится BadTarget.
  • Выберите BadTarget, в секции Quest Target Data найдите окошко Cell.
  • В раскрывающемся списке выберите ICMarketDistrictTheBestDefense.
  • Затем, ниже, в окошке Ref, выберите в раскрывающемся списке "Varnado" "VarnadoRef".
  • Теперь, в нижнем левом углу, под Conditions, нажмите на кнопку NEW.
  • Справа от этой кнопки расположено окно Condition Function.
  • В раскрывающемся списке выберите GetStage.
  • Теперь нажмите кнопку INVALID под Function Parameters и выберите AAitem.
  • Затем, справа, в колонке VALUE, установите значение 20.
  • Кликните где-нибудь в поле Conditions, чтобы изменения вступили в силу:

 


  • И ЕЩЕ РАЗ правый клик в колонке Target Ref и в появившемся меню выберите NEW. В списке появится BadTarget.
  • Выберите BadTarget, в секции Quest Target Data найдите окошко Cell и в раскрывающемся списке выберите ICMarketDistrictTheBestDefense.
  • Затем, ниже, в окошке Ref, выберите в раскрывающемся списке "Varnado" "VarnadoRef".
  • Теперь, в нижнем левом углу, под Conditions, нажмите на кнопку NEW.
  • Справа от этой кнопки расположено окно Condition Function.
  • В раскрывающемся списке выберите GetStage.
  • Затем кликните на кнопке INVALID ниже Function Parameters и выберите AAitem.
  • Затем, справа, в колонке VALUE, установите значение 15.
  • Кликните где-нибудь в поле Conditions, чтобы изменения вступили в силу.
  • Закрывайте окно редактирования квеста и сохраняйте плагин.


Вот и все. Вы справились с этим!

Тестирование в игре

  • Отметьте ваш плагин в лаунчере и запускайте игру.
  • Идите в «Лучшую защиту» в торговом районе Имперской столицы и поговорите с Варнадо, чтобы получить квест.
  • Или, идите сначала к фамильному мечу, и Варнадо все равно отблагодарит вас и предложит награду за найденный меч.

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


Удачи и отличной игры!

Нравится2
Комментарии (7)
B
i
u
Спойлер