
- •Урок 1. Создание квеста на одновременный поиск двух различных предметов.
- •Урок 3. Реализация квеста на одновременный поиск заданного количества различных предметов, определенных в рандомной таблице. Определение новой условной функции в xr_conditions.Script
- •Урок 4. Построение квеста на одновременный поиск заданного количества заранее опеределенных различных предметов.
- •Урок 6. Реализация квеста на выполнение определенного действия через логику рестриктора, работа с туториалом. Последовательность в выполнении на несколько этапов.
- •Урок 9. Создание квеста с добавлением дополнительных внутри этапных заданий. Особенности - отсутствие диалогов, добавление тайников в качестве квестовых предметов.
- •Урок 10. Реализация квеста с использованием объекта класса inventory_box со сложной логикой. Особенности - отсутствие диалогов, использование рестрикторов, выдача тайника в качестве награды.
- •На этом первый курс квестостроения завершен.
Учебное пособие. Курс квестостроения на двикже X-Ray 1.6. (S.T.A.L.K.E.R. Зов Припяти). Автор Geonezis. Версия издания 1.0.
Введение в теорию квестостроения, несколько правил и основных особенностей...
Данное учебное пособие будет представлять собой обощенный теоретический курс по принципам квестостроения на основе пталформы S.T.A.L.K.E.R. Зов Припяти. Этот курс позволит начинающим (и не только ) модмейкерам познакомиться с различными принципами (приемами) построения и написание квестов для своих модификаций. Будут освещены различные методы создания как типовых так и не очень заданий, с подробным описанием и раскрытием тех или иных аспектов. Теоретическая часть данного курса разбита на 10 глав, точнее 10 уроков, в каждом из которых будет подробнейщим образом рассмотрен один конкретный квест, со строго сформулированной задачей. Уроки построены по возрастающему принципу от простых к более сложным. В первой версии издания освещены такие особенности, как построение сложных разветвленных диалогов, элементарые приемые комбинаторной логики, линейные поэтапные квесты, элементарые дочерние подзадания внутри основного. Также затронуты аспекты работы с логикой рестрикторов, добавление и особенности использования квестовых предметов различных классов. Реализация заданий без использования диалогов. Для каждого урока (кроме 6-ого, добавлю в следующем издании) отдельно реализован наглядный пример с готовым заданием для его проверки и демонстрации работы в игре. Некоторые схожие моменты в части уроков подробно не раскрываются, ввиду их аналогичного иполнения в более ранних примерах.
Надеюсь и уверен, что написанное мною пособие даст Вам первоначально необходимые знания для того чтобы продолжить и самостоятельно более углублено изучить одно из основных направлений модинга и стать профессиональным квестером. Понмите, что квестостроние это сочетание как практических знаний и умение, так и творческий подход в его исполнении. Успехов на этом поприще.
Убедительная просьба при копировании и развмещении материалов из данного учебника указывать первоисточник и его автора.
С уважением Geonezis.
Урок 1. Создание квеста на одновременный поиск двух различных предметов.
Итак, предположим нам необходимо создать простой квест для Зова Припяти на одновременный поиск двух различных предметов. Пусть идея квеста будет такой: Сыч дает ГГ поручение найти два артефакта Снежинка и Пламя.
Необходимые для редактирования файлы:
1. конфигурационные в (gamedata\configs\gameplay\) -character_desc_zaton.xml -dialogs_zaton.xml -info_zaton.xml -character_desc_general.xml (необязательно) 2. конфигурационные в (gamedata\configs\misc\) - tm_zaton.ltx 3. конфигурационные в (gamedata\configs\text\rus\) - st_dialogs_zaton.xml - st_quests_zaton.xml 4. скриптовый в (gamedata\scripts\) - dialogs_zaton.script
Для начала создадим два простеньких диалога для выдачи и завершения квеста. В файл dialogs_zaton.xml в самом низу добавим два диалога: На выдачу квеста:
Code
<dialog id="zat_b30_owl_stalker_trader_small_quests_begin"> <dont_has_info>zat_b30_owl_stalker_trader_quest_init</dont_has_info> <dont_has_info>zat_b30_owl_stalker_trader_quest_no_quest</dont_has_info> <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_not_have_arts</precondition> <phrase_list> <phrase id="0"> <text>zat_b30_owl_stalker_trader_small_quests_0</text> <next>1</next> </phrase> <phrase id="1"> <text>zat_b30_owl_stalker_trader_small_quests_1</text> <next>2</next> <next>3</next> </phrase> <phrase id="2"> <text>zat_b30_owl_stalker_trader_small_quests_2</text> <give_info>zat_b30_owl_stalker_trader_quest_no_quest</give_info> </phrase> <phrase id="3"> <text>zat_b30_owl_stalker_trader_small_quests_3</text> <action>dialogs_zaton.zat_b30_owl_stalker_trader_give_quest</action> <next>4</next> </phrase> <phrase id="4"> <text>zat_b30_owl_stalker_trader_small_quests_4</text> <give_info>zat_b30_owl_stalker_trader_quest_init</give_info> </phrase> </phrase_list> </dialog>
На завершение квеста:
Code
<dialog id="zat_b30_owl_stalker_trader_small_quests_end"> <has_info>zat_b30_owl_stalker_trader_quest_init</has_info> <dont_has_info>zat_b30_owl_stalker_trader_quest_end</dont_has_info> <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_have_arts</precondition> <phrase_list> <phrase id="0"> <text>zat_b30_owl_stalker_trader_small_quests_5</text> <give_info>zat_b30_owl_stalker_trader_quest_end</give_info> <next>1</next> </phrase> <phrase id="1"> <text>zat_b30_owl_stalker_trader_small_quests_6</text> <next>2</next> </phrase> <phrase id="2"> <text>zat_b30_owl_stalker_trader_small_quests_7</text> <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_arts</action> <next>3</next> </phrase> <phrase id="3"> <text>zat_b30_owl_stalker_trader_small_quests_8</text> <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_money_to_actor</action> <next>4</next> </phrase> <phrase id="4"> <text>zat_b30_owl_stalker_trader_small_quests_9</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog>
Чтобы понимать о чем в диалогах идет речь сразу пропишем их транскрипцию в файле st_dialogs_zaton.xml
Code
<string id="zat_b30_owl_stalker_trader_small_quests_0"> <text>Есть какое дело?</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_1"> <text>Нужны артефакты Пламя и Снежинка. Достанешь, хорошо заплачу.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_2"> <text>Нет, друг- сам ищи.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_3"> <text>Сделаю.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_4"> <text>Вот и отлично.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_5"> <text>Я нашел артефакты, наш уговор в силе?</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_6"> <text>Да, отличная работа, давай артефакты сюда.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_7"> <text>Держи.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_8"> <text>Вот твои деньги.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quests_9"> <text>Бывай.</text> </string>
Теперь разберем по порядку то, что добавили. Диалог на выдачу квеста имеет следующую элементарную структуру: - ГГ предлагают задание и он на выбор может отказаться от него, тогда второй раз диалог уже не будет доступен. Либо же согласиться на исполнение. - Соответственно происходит выдача инфопоршней zat_b30_owl_stalker_trader_quest_init (при старте квеста) и zat_b30_owl_stalker_trader_quest_no_quest (при отказе от выполнения). - Наличие в диалоге тегов <dont_has_info>имя поршня</dont_has_info> обеспечивает его блокировку при выборе одной из веток. - Наличие прекондишина
<precondition>dialogs_zaton.zat_b30_owl_stalker_trader_have_arts</precondition>также блокирует стартовый диалог при наличии квестовых предметов (в данном случае это артефакты) в рюкзаке ГГ. - акшион <action>dialogs_zaton.zat_b30_owl_stalker_trader_give_quest</action> обеспечивает выдачу квеста. Теперь поясню особенности второго диалога: - наличие тега <has_info>zat_b30_owl_stalker_trader_quest_init</has_info> обеспечивает возможность инициализации диалога после выдачи квеста. - наличие <dont_has_info>zat_b30_owl_stalker_trader_quest_end</dont_has_info> обеспечивает блокировку диалога после завершение квеста. - прекондишн <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_have_arts</precondition>
обеспечивает блокирование диалога до момента наличия в инвентаре ГГ нужных квестовых предметов.
- акшионы <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_arts</action>
и <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_money_to_actor</action>
обеспечивают передачу квестовых предметов от ГГ к НПС, и последующего денежного вознаграждения для ГГ от него.
Объявим используемые инфопоршни в info_zaton.xml Добавим в конце файла код:
Code
<!-- New quest --> <info_portion id="zat_b30_owl_stalker_trader_quest_no_quest"></info_portion> <info_portion id="zat_b30_owl_stalker_trader_quest_init"></info_portion> <info_portion id="zat_b30_owl_stalker_trader_quest_end"></info_portion>
Добавим наши диалоги НПС (В данном случае Сычу) для этого в файл character_desc_zaton.xml в его профиль<specific_character id="zat_b30_owl_stalker_trader" team_default="1"> добавим две строки диалогов
Code
..... <actor_dialog>zat_b30_owl_stalker_trader_small_quests_begin</actor_dialog> <actor_dialog>zat_b30_owl_stalker_trader_small_quests_end</actor_dialog> .....
С диалогами и инфопоршнями разобрались теперь рассмотрим необходимые скриптовые функции: В файл dialogs_zaton.script добавим код
Code
function zat_b30_owl_stalker_trader_give_quest() task_manager.get_task_manager():give_task("geonezis_zat_b30_owl_quest") end function zat_b30_owl_stalker_trader_have_arts(first_speaker, second_speaker) return ((db.actor:object("af_ice") ~= nil) and (db.actor:object("af_fire") ~= nil)) end function zat_b30_owl_stalker_trader_not_have_arts(first_speaker, second_speaker) return ((db.actor:object("af_ice") == nil) and (db.actor:object("af_fire") == nil)) end function zat_b30_owl_stalker_trader_relocates_arts(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_ice") dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_fire") end function zat_b30_owl_stalker_trader_relocates_money_to_actor(first_speaker, second_speaker) dialogs.relocate_money_to_actor(first_speaker, second_speaker, 30000) end
Теперь по порядку разберем эти функции: - zat_b30_owl_stalker_trader_give_quest - выдача квеста - zat_b30_owl_stalker_trader_have_arts - возвращает true при проверки на наличие в инвентаре ГГ двух необходимых предметов (в данном случае артефактов af_ice и af_fire) - zat_b30_owl_stalker_trader_not_have_arts- возвращает false при аналогичной проверке. - zat_b30_owl_stalker_trader_relocates_arts- передача НПС артефактов - zat_b30_owl_stalker_trader_relocates_money_to_actor- выдача денежной награды ГГ.
Самое основное это квест. В файле tm_zaton.ltx прописываем
Code
[geonezis_zat_b30_owl_quest] icon = ui_inGame2_Kontrakt_s_uchenimi prior = 2 storyline = false title = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_3, {=actor_has_item(af_ice) !actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_2, {!actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_1, zat_b30_owl_stalker_trader_small_quest_title_0 descr = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_3, {=actor_has_item(af_ice) !actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_2, {!actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_1, zat_b30_owl_stalker_trader_small_quest_text_0 target = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_id, nil condlist_0 = {+zat_b30_owl_stalker_trader_quest_end} complete
Разберем то что происходит в процессе выполнения квеста и собственно его структуру. - [geonezis_zat_b30_owl_quest] - название задание в таск менеджере - icon = ui_inGame2_Kontrakt_s_uchenimi - иконка квеста (в данном случае от задания Контракт с Учеными) - prior = 2 - приоритет задания - storyline = false - сюжетный ли квест или нет - title = - заголовки при обновлении задания - descr = - дескрипшины при обновлении задания - target = - цели, метки квеста при его обновлении. - condlist_0 =- кондишн (спец. условия) в квесте (в данном случае один на завершение) Основная особенность задания это последовательная проверка структурных условий посредством функцииactor_has_item(...). Это вызываемая из xr_conditions.script функция на проверку наличия у актора того или иного предмета. Соответственно в структуре этого квеста используют два варианта когда значениее функции false (!actor_has_item(...)) и true (=actor_has_item(...)) В квесте рассматриваются все возможные сочетания вариантов наличия или отсутсвия найденного того или иного предмета. 1. когда нет ни одного. 2. первый (арт снежинка) есть, второго (арт пламя) нет. 3. первого нет, второй есть 4. оба есть. Соответственно в независимости от того какой арт был найден первым- произойдет точное обновление дескрипшина и титла задания с указанием текущего состояния. Также если игрок выложит из инвентаря уже найденный арт, то задание будет обновляться снова. Метка на цели в квесте (Сыч) появиться только при наличии обоих предметов. По выдачи инфопоршня zat_b30_owl_stalker_trader_quest_end квест будет завершен. Пропишем русскую транскрипцию дескрипшинов и тайтлов квеста в st_quests_zaton.xml
Code
<string id="zat_b30_owl_stalker_trader_small_quest_title_0"> <text>Поручение Сыча: найти артефакты Снежинка и Пламя</text> </string> <string id="zat_b30_owl_stalker_trader_small_quest_text_0"> <text>Сыч попросил найти для него два арта- Снежинка и Пламя.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quest_title_1"> <text>Поручение Сыча: найти артефакт Снежинка</text> </string> <string id="zat_b30_owl_stalker_trader_small_quest_text_1"> <text>Артефакт Пламя найден. Найдите Снежинку.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quest_title_2"> <text>Поручение Сыча: найти артефакт Пламя</text> </string> <string id="zat_b30_owl_stalker_trader_small_quest_text_2"> <text>Артефакт Снежинка найден. Найдите Пламя.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quest_title_3"> <text>Поручение Сыча: передайте найденные артефакты Сычу.</text> </string> <string id="zat_b30_owl_stalker_trader_small_quest_text_3"> <text>Оба артефакта найдено. Отдайте их Сычу, и заберите награду.</text> </string>
По желанию для проверки в character_desc_general.xml при старте ГГ пропишем нужный арты. На этом первый урок завершен.
Урок 2. Создание квеста на поиск двух различных предметов, с выдачей ачивмента. Особенности- альтернативный способ его написания, работа обновления задания через инфопоршни, добавление по завершении простого достижения (ачивмента).
Поставленная в данном уроке задача схожа с той что была в первом уроке. Основным отличием от него будет являться способ реализации заданий такого типа. Если ранее основным обработчиком на обновление этапов квеста служило использование функций actor_has_item(...), то сейчас последовательное обновление будет осуществляться через выдачу соответствующих инфопорций. Будет подробно рассмотрена структура диалога в котором будет происходить их выдача. Также среди особенностей отметим добавление по завершении задания специального достижения.
Необходимые для редактирования файлы: 1. конфигурационные в (gamedata\configs\gameplay\) -character_desc_zaton.xml -dialogs_zaton.xml -info_zaton.xml -character_desc_general.xml (необязательно) 2. конфигурационные в (gamedata\configs\misc\) - tm_zaton.ltx - achievements.ltx 3. конфигурационные в (gamedata\configs\text\rus\) - st_dialogs_zaton.xml - st_quests_zaton.xml - st_achievement.xml - ui_st_screen.xml 4. скриптовые в (gamedata\scripts\) - dialogs_zaton.script - xr_statistic.script
Начнем с разбора процесса создания ачивмента, выдаваемого по завершении задания. Остальные этапы урока будут сокращены, ибо по большей части они уже были рассмотрены в предыдущем. В файле achievements.ltx в самом низу добавим следующую секцию:
Code
[sich_helper] icon = ui_inGame2_Iskatel hint = st_sp_achievement_22_hint name = st_sp_achievement_22_name desc = st_sp_achievement_22_descr functor = xr_statistic.sich_helper_functor
-[sich_helper]- уникальное имя секции ачивмента. его же необходимо зарегистрировать в начале файла в списке всех достижений. -icon- имя секции иконки достижения. берется из файла ui_actor_achivments.xml (\configs\ui\textures_descr\) в свою очередь сама иконка прописывается в ui_actor_achivments.dds (\textures\ui\) В данном случае возьмем стандартную иконку из другого достижения. - hint- описание в ПДА при наведении на ачивку. - name- название (имя) достижения. - desc- описание самого достижения. - functor- имя функции из xr_statistic.script отвечающей за срабатывания условий на получение достижения и собственно его выдача. Описание русской транскрипции добавим в файл st_achievement.xml
Code
<string id="st_sp_achievement_22_name"> <text>Помошник торговца</text> </string> <string id="st_sp_achievement_22_hint"> <text>Бандиты стали лучше к Вам относится.</text> </string> <string id="st_sp_achievement_22_descr"> <text>Вы нашли и принесли артефакты скряге Сычу. Тем самым Вы заслужили уважение бандитов.</text> </string>
и в ui_st_screen.xml
Code
<string id="st_ach_sich_helper"> <text>Получено достижение «Помошник торговца».</text> </string>
В xr_statistic.script добавляем исполняемую функцию:
Code
function sich_helper_functor() if not has_alife_info("sich_helper_achievement_gained") then if has_alife_info("zat_geonezis_example_quest_complete") then news_manager.send_tip(db.actor, "st_ach_sich_helper", nil, "seeker", nil, nil) xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"bandit", 100}) db.actor:give_info_portion("sich_helper_achievement_gained") end end return has_alife_info("sich_helper_achievement_gained") end
более подробно разберем работу данной функции: - происходит проверка, а не было ли уже получено данное достижение (отсутствие инфопоршня sich_helper_achievement_gained) - срабатывание условия выдачи достижения в данном случае условие только одно- это получение инфопоршня zat_geonezis_example_quest_complete (который будет выдаваться по завершению квеста) - далее происходит отправка на пда ГГ сообщения с текстом что достижение было получено. - вызывается обработчик функций на выполнение "бонуса" или "анти бонуса" достижения. (в данном случае это только увеличение репутации у сталкеров) - выдается инфопоршень получения достижения (в рассматриваемом примере это sich_helper_achievement_gained)
Так, теперь приступим к процессу формирования задания. Опишем подробно только второй диалог, который будет активен после взятия задания. Первый, на получения квеста можно будет посмотреть в файле dialogs_zaton.xml имя диалога- jup_azot_sborkiquest_init_dialog Соответственно русскую транскрипцию диалогов и квестов также не будем приводить. Ее можно будет увидеть в файлахst_quests_zaton.xml и st_dialogs_zaton.xml Код второго диалога следующий:
Code
<dialog id="jup_azot_sborkiquest_find_dialog"> <has_info>jup_azot_quest_sborki_give</has_info> <precondition>dialogs_zaton.actor_has_first_or_second_grenader_item</precondition> <phrase_list> <phrase id="0"> <text>jup_azot_quest_sborki_find_begin</text> <next>1</next> </phrase> <phrase id="1"> <text>jup_azot_quest_sborki_find_what</text> <next>11</next> <next>12</next> <next>13</next> <next>14</next> </phrase> <phrase id="11"> <text>jup_azot_quest_sborki_find_first_item</text> <precondition>dialogs_zaton.if_actor_has_zat_grenader_stalker_flash</precondition> <action>dialogs_zaton.transfer_zat_grenader_stalker_flash</action> <action>dialogs_jupiter.jup_b43_reward_for_first_artefact</action> <give_info>jup_azot_quest_sborki1_done</give_info> <next>111</next> <next>112</next> </phrase> <phrase id="111"> <text>jup_azot_quest_sborki_find_item_flash</text> <dont_has_info>jup_azot_quest_sborki2_done</dont_has_info> </phrase> <phrase id="112"> <text>jup_azot_quest_sborki_find_item_all</text> <has_info>jup_azot_quest_sborki2_done</has_info> <has_info>jup_azot_quest_sborki1_done</has_info> </phrase> <phrase id="12"> <text>jup_azot_quest_sborki_find_second_item</text> <precondition>dialogs_zaton.if_actor_has_zat_grenader_stalker_gran_instrument</precondition> <action>dialogs_zaton.transfer_zat_grenader_stalker_gran_instrument</action> <action>dialogs_jupiter.jup_b43_reward_for_second_artefact</action> <give_info>jup_azot_quest_sborki2_done</give_info> <next>121</next> <next>122</next> </phrase> <phrase id="121"> <text>jup_azot_quest_sborki_find_item_instr</text> <dont_has_info>jup_azot_quest_sborki1_done</dont_has_info> </phrase> <phrase id="122"> <text>jup_azot_quest_sborki_find_item_all</text> <has_info>jup_azot_quest_sborki2_done</has_info> <has_info>jup_azot_quest_sborki1_done</has_info> </phrase> <phrase id="13"> <text>jup_azot_quest_sborki_find_first_or_second_item</text> <precondition>dialogs_zaton.actor_has_first_and_second_grenader_item</precondition> <action>dialogs_zaton.transfer_zat_grenader_stalker_flash</action> <action>dialogs_zaton.transfer_zat_grenader_stalker_gran_instrument</action> <action>dialogs_jupiter.jup_b43_reward_for_both_artefacts</action> <give_info>jup_azot_quest_sborki1_done</give_info> <give_info>jup_azot_quest_sborki2_done</give_info> <next>131</next> </phrase> <phrase id="131"> <text>jup_azot_quest_sborki_find_end</text> </phrase> <phrase id="14"> <text>jup_azot_quest_sborki_find_nothing</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog>
начнем по-порядку разбирать особенности этого диалога: - обязательными условиями его активации будет наличие инфопоршня выдачи задания jup_azot_quest_sborki_give, а также функции прекондишина actor_has_first_or_second_grenader_item - будет происходить выбор четырех последующих фраз для генерации в зависимости от наличия у ГГ квестовых предметов. - четвертая, имеющая нулевое значение отрицания- будет активна при любых условиях. - первая и вторая- когда у ГГ есть один из двух необходимых предметов активны при наличии выполнения соответствующих прекондишинов if_actor_has_zat_grenader_stalker_flash и if_actor_has_zat_grenader_stalker_gran_instrument. при этом происходит передача этого предмета НПС функции (transfer_....),получении от НПС награды на каждом этапе и выдача инфопорции на обновление задания. первый и второй этапы- взаимоисключающие. одновременно они не могут быть активны. - третья- когда у ГГ есть оба необходимых предмета, происходит их передача и завершение квеста. добавим все скриптовые функции в файл dialogs_zaton.script
Code
function jup_azot_quest_sborki_give() task_manager.get_task_manager():give_task("geonezis_azot_quest_sborki_give") end function zat_b33_relocate_money_to_azot(first_speaker, second_speaker) dialogs.relocate_money_from_actor(first_speaker, second_speaker, 500) end function actor_has_first_or_second_grenader_item(first_speaker, second_speaker) return first_speaker:object("af_baloon") ~= nil or first_speaker:object("af_gold_fish") ~= nil end function actor_has_first_and_second_grenader_item(first_speaker, second_speaker) return first_speaker:object("af_baloon") ~= nil and first_speaker:object("af_gold_fish") ~= nil end function if_actor_has_zat_grenader_stalker_flash(first_speaker, second_speaker) return first_speaker:object("af_baloon") ~= nil and first_speaker:object("af_gold_fish") == nil end function if_actor_has_zat_grenader_stalker_gran_instrument(first_speaker, second_speaker) return first_speaker:object("af_gold_fish") ~= nil and first_speaker:object("af_baloon") == nil end function transfer_zat_grenader_stalker_flash(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_baloon") end function transfer_zat_grenader_stalker_gran_instrument(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_gold_fish") end
Описывать их нет смысла- они все элементарные. Аналогично не будем расписывать процесс добавления диалогов нпс и регистрацию инфопоршней. Все это приведено в предыдущем уроке.
Отметим особенности квеста. В файле tm_zaton.ltx добавим код задания
Code
--|> [geonezis_azot_quest_sborki_give] icon = ui_inGame2_Kontrakt_s_uchenimi prior = 1 storyline = false title = {+jup_azot_quest_sborki2_done -jup_azot_quest_sborki1_done} zat_sich_bring_1_name, {+jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_bring_2_name, {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} zat_sich_thanks_for_2_items_name, {-jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_sborki_started_name descr = {+jup_azot_quest_sborki2_done -jup_azot_quest_sborki1_done} zat_sich_bring_1_text, {+jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_bring_2_text, {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} zat_sich_thanks_for_2_items_text, {-jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_sborki_started_text target = zat_b30_owl_stalker_trader_id condlist_0 = {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} complete condlist_1 = {+jup_azot_quest_sborki_give =is_squad_enemy_to_actor(zat_b30_owl_stalker_trader_squad)} fail on_complete = %+zat_geonezis_example_quest_complete% reward_money = 10000
Тайтлы и дескрипшины задания будут обновляться после второго разговора с НПС, при получении соответствующих инфопоршней. То есть основное отличие от задания из первого урока- это его обновление после передачи предметов, а не при их получении и наличии в инвентаре ГГ. По завершении задания будет выдаваться инфопоршень zat_geonezis_example_quest_complete необходимый для выдачи ачивмента, который в свою очередь будет теперь необходим для разблокировки следующего смыслового диалога zat_b30_owl_stalker_trader_buy_info
На этом второй урок завершен.