Что нам понадобится: gamedata\configs\creatures\spawn_sections_zaton.ltx gamedata\configs\gameplay\character_desc_zaton.xml gamedata\configs\gameplay\dialogs_zaton. xml gamedata\configs\gameplay\info_zaton. xml gamedata\configs\gameplay\npc_profile. xml gamedata\configs\misc\tm_zaton.ltx gamedata\configs\sсripts\npc_logic\default_zombied_1.ltx gamedata\configs\text\rus\st_quests_zaton. xml gamedata\sсripts\dialogs_zaton.sсript
Открываем gamedata\configs\creatures\spawn_sections_zaton.ltx Пишим в самом верху это:
Так разъясняю: [default_zombied_1] - Это уникальное имя НПС stalker_zombied – Классификация НПС, если поставить просто stalker то бутет человек, если поставить m_controller_normal, то будет контролёр. character_profile – Ссылка на профиль, для мутантов не надо! сommunity – Группировка для монстров не надо! custom_data – Ссылка на логику НПС. story_id – Уникальный стори ид
Далее gamedata\configs\gameplay\character_desc_zaton.xml В самый конец пишем это перед </xml>
Далее gamedata\configs\gameplay\dialogs_zaton.xml Пишим в самом конце, перед строкой </game_dialogs> это:
Код
<dialog id="boroda_quest_start"> <dont_has_info>boroda_quest_give</dont_has_info> <phrase_list> <phrase id="0"> <text>Здорово борода я тут новенький недавно пришёл, Есть для меня задания?</text> <next>1</next> </phrase> <phrase id="1"> <text>Да есть нужно убить Зомбока сможеш? </text> <next>2</next> </phrase> <phrase id="2"> <text>Да я сделаю! И у меня ствола даже нет!</text> <next>3</next> </phrase> <phrase id="3"> <text>Да не проблема я дам наводку на бесхозный хабар там есть пару стволов сходишь заберёшь! И прикончиш этого отброса!</text> <action>dialogs_zaton.spawn_zombie_1</action> <action>dialogs_zaton.boroda_quest_start</action> <action>dialogs_zaton.get_treasure_award_1220</action> <give_info>boroda_quest_give</give_info> <next>4</next> </phrase> <phrase id="4"> <text>Ладно попробую! Бывай...</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog>
Код
<dialog id="boroda_quest_end"> <has_info>boroda_quest_give</has_info> <dont_has_info>boroda_quest_done</dont_has_info> <phrase_list> <phrase id="0"> <text>Всё я сним разобрался! Больше его нет!</text> <give_info>boroda_quest_done</give_info> <next>1</next> </phrase> <phrase id="1"> <text>Ой спасибо, Молодец!</text> </phrase> </phrase_list> </dialog>
Далее gamedata\configs\gameplay\info_zaton.xml В начале после <game_information_portions> ниже строкой пишим это:
Так разъясняю: [boroda_quest_give_suplest] – Уникальное имя квеста icon – Иконка квеста prior – Приоритет квеста чем выше тем важнее storyline – Ели true то квест будет сюжетный title – заглавие квеста... изначально, kill_zombie_naiti_name, а после убийства ГГ зомборя даётся инфопоршень {+test_zombie_mertv}, задание обновляется меняется на kill_zombie_prinesti_name descr – Описание квеста target – метка на карте, при наличии инфопорции {+test_zombie_mertv} показывает метку на карте на заказчика! condlist_0 – условие выполнения квеста - при выдаче инфопорции boroda_quest_done condlist_1 – условие выполнения квеста – квест будет провален если сквад бороды станет враждебным! on_complete – Если выполнен квест то отношение сталкеров к вам улучшится на 200% reward_money – Выдача денег после выполнения квеста.
Далее gamedata\configs\sсripts Создаем тут папку npc_logic, а там создаем файл default_zombied_1.ltx
Должен получиться такой путь: gamedata\configs\sсripts\npc_logic\default_zombied_1.ltx
И в этом файле пишем:
Код
[logic] on_death = death
[death] on_info = %+test_zombie_mertv%
Далее идем сюда gamedata\configs\text\rus\st_quests_zaton.ltx
В конце перед </string_table> пишим это:
Код
<string id="kill_zombie_naiti_name"> <text>Убийство: Убить зомбированного сталкера по просьбе бороды.</text> </string> <string id="kill_zombie_descr"> <text>Убить зомбированного и сообщить Бороде.</text> </string> <string id="kill_zombie_prinesti_name"> <text>Убийство: Рассказать Бороде что зомби больше нет.</text>
Так, теперь нам надо открыть скрипт с помощью блокнота Идем сюда: gamedata\sсripts\dialogs_zaton.sсript В самое начало или конец пишем:
Код
-- Новый квест function boroda_quest_start() task_manager.get_task_manager():give_task("boroda_quest_give_suplest") end
function get_treasure_award_1220() treasure_manager.get_treasure_manager():give_treasure("zat_hiding_place_45") end
function spawn_zombie_1() alife():create("default_zombied_1",vector():set(99.531,12.005,590.598),1138241,194) end
Всё теперь вы создали квест на убийство зомби, таким образом меняя параметры классификации НПС можно сделать квест на любое другое живое существо!
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
Многие модмейкеры сталкиваются с таким квестом прийти поговорить! Сейчас объясню!
Примерные диалоги: Дегтярёв: Здорово местный, как жизнь? Борода: Да всё нормально, что-то нужно? Дегтярёв: Да, нужен любой хоть и дешёвый автомат знаешь где? Борода: А что не знать на втором этаже сидит Сыч — вот он барыжит оружием подойди к нему я уже ему сообщил!
Новое задание: Поговорить с Сычем насчёт оружия.
Дегтярёв: Здорово Сыч, борода сказал мне что у тебя есть стволы? Сыч: Да есть, борода мне маякнул покупай.
Задание выполнено: Поговорить с Сычом.
Думаю, вы поняли суть! Ну приступим! В файле gamedata\configs\gameplay\dialogs_zaton.xml Пишем в самом конце, перед строкой </game_dialogs> это:
Код
<dialog id="sich_quest_start"> <dont_has_info>sich_quest_give</dont_has_info> <phrase_list> <phrase id="0"> <text>Здорово местный, как жизнь?</text> <next>1</next> </phrase> <phrase id="1"> <text>Да всё нормально, что-то нужно?</text> <next>2</next> </phrase> <phrase id="2"> <text>Да, нужен любой хоть и дешёвый автомат знаешь где?</text> <next>3</next> </phrase> <phrase id="3"> <text> А что не знать на втором этаже сидит Сыч — вот он барыжит оружием подойди к нему я уже ему сообщил!</text> <action>dialogs_zaton.talk_sich_start</action> <give_info>talk_sich_give</give_info> </phrase> </phrase_list> </dialog>
<dialog id="sich_quest_end"> <has_info>sich_quest_give</has_info> <dont_has_info>talk_sich_done </dont_has_info> <phrase_list> <phrase id="0"> <text>Здорово Сыч, борода сказал мне что у тебя есть стволы?</text> <give_info>talk_and_gg_sich_done</give_info> <next>1</next> </phrase> <phrase id="1"> <text> Да есть, борода мне маякнул покупай </text> </phrase> </phrase_list> </dialog>
Далее gamedata\configs\gameplay\character_desc_zaton.xml Пропишим эти квесты бороде! И Сычу.
<!-- Бармен на базе сталкеров --> И пишим ниже строчкой после этого <actor_dialog>zat_a2_stalker_barmen_actor_info</actor_dialog> это:
Код
<actor_dialog>sich_quest_start</actor_dialog>
И самый первый в списке zat_b30_owl_stalker_trader пишем ему диалог! <actor_dialog>sich_quest_end </actor_dialog>
Добавим допустимые инфопоршни, на старт квеста на завершение и на проверку что квеста больше не будет.
В файле gamedata\configs\gameplay\info_zaton.xml, в начале после <game_information_portions> ниже строкой пишем это:
Так разъясняю: [sich_talk_task] – Уникальное имя квеста icon – Иконка квеста prior – Приоритет квеста чем выше тем важнее storyline – Ели true то квест будет сюжетный title -- заглавие квеста... descr – Описание квеста target -- метка на карте, zat_b30_owl_stalker_trader (Сыч) condlist_0 -- условие выполнения квеста - при выдаче инфопорции talk_sich_done
Ну теперь не менее важное это скрипты. Идем сюда gamedata\sсripts\dialogs_zaton.sсript В самое начало или конец пишем:
Код
-- Новый квест function talk_sich_start() task_manager.get_task_manager():give_task("sich_talk_task") end
Это функция выдачи квеста болше нам нечего не надо!
Можно сделать выдачу оружия от НПС к ГГ но это уже совсем другой урок.
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
Далее gamedata\configs\gameplay\dialogs_zaton.ltx Пишим в самом конце, перед строкой </game_dialogs> это:
Код
<dialog id="lapsh8_quest_dialog"> <dont_has_info>quest_lapsh8_done</dont_has_info> <dont_has_info>quest_lapsh8_give</dont_has_info> <phrase_list> <phrase id="1"> <text>Есть, нужно убить одного сталкера, который задолжал мне денег</text> <give_info>quest_lapsh8_give</give_info> <action>dialogs_zaton.quest_kill_nps_start</action> </phrase> <phrase id="0"> <text>Работа есть? Я тестирую первый свой квест</text> <next>1</next> </phrase> </phrase_list> </dialog>
И так, ребят. Всем привет ещё раз Сегодня я постараюсь рассказать вам,как создать квест на тематику войны группировок. Я буду делать квест на своей локе,но думаю вам будет понятно как это сделать на своей.Предположим у нас родилась идея:"Опа!Я придумал,хочу сделать квест,чтобы ключевой непись попросил меня уничтожить бандосов, но ведь ГГ не рембо и ему нужна помощь,но как это сделать!?"
Объясняю. И так..Снимем координаты с локи на которой нам нужно заспавнить отряд который хотим уничтожить и который будет нам помогать. Для снятия координат есть более совершенная программа от Stalker56
Снимайте координаты спейса и смарта для сталкеров поближе к лагерю,чтобы они дошли до врага пока ты бежишь
Отлично! Мы сняли координаты.Сначала сделаем квест Заходим в tm_zaton и в самом низу пишем сие:
Код
[gar_bandit_ataka_give] - имя квеста icon = ui_inGame2_Naezd - иконка prior = 3 - приоритет storyline = false - если относится к сюжету то true title = {+gar_bandit_mertv}test_prinesti_name2, test_naiti_name2 - заголовки квеста descr = gar_bandit_descr - описание квеста target = gar_car_smart - метка condlist_0 = {+gar_bandit_ataka_done} complete reward_money = 2000 - награда
Отлично, теперь создадим диалоги в файле configs/gameplay/dialogs_zaton:
Код
<dialog id="bandit_kill"> - имя диалога,можно любое <dont_has_info>gar_bandit_ataka_done</dont_has_info> <dont_has_info>gar_bandit_ataka_give</dont_has_info> <phrase_list> <phrase id="1"> <text>Ваш текст.</text> - текст. <give_info>gar_bandit_ataka_give</give_info> - начало квеста <action>dialogs_zaton.gar_bandit_start</action> - вызов функции из скрипта </phrase> <phrase id="0"> <text>Ваш текст.</text> <next>1</next> </phrase> </phrase_list> </dialog>
<dialog id="bandit_kill_done"> <has_info>gar_bandit_ataka_give</has_info> - условие появления этого диалога <dont_has_info>gar_bandit_ataka_done</dont_has_info> не выдавать сразу выполнение задания,то есть диалог не появиться пока мы не убъём враждебный отряд <has_info>gar_bandit_mertv</has_info> - условие после которого дадут награду <phrase_list> <phrase id="1"> <text>Текст.</text> - <give_info>gar_bandit_ataka_done</give_info> </phrase> <phrase id="0"> <text>Текст.</text> <next>1</next> </phrase> </phrase_list> </dialog>
Теперь добавим диалоги вашему неписю. Заходим в configs/gameplay/character_desc_zaton - ну или ваш файл с неписем и добавляем в диалоги такие строки:
Теперь заходим в scripts/dialogs_zaton и там после строк
Код
function transfer_vodka_to_boroda(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "pda_vovik") end
пишем сие:
Код
function gar_bandit_start() task_manager.get_task_manager():give_task("gar_bandit_ataka_give") end
Теперь описание квеста на русском. Заходим сюда configs/text/rus/st_quests_zaton и пишем тут:
Код
<string id="test_naiti_name2"> <text>Захватить точку:Кладбище техники</text> </string> <string id="test_prinesti_name2"> <text>Захватить точку:получить награду у Сахатого</text> </string> <string id="gar_bandit_descr"> <text>Уничтожить отряд бандитов на кладбище техники.</text> </string>
Теперь самое противное all.spawn. Заходим по адресу spawns/alife_ваша_локация и пишем сие:
Код
[496] - порядковый номер ; cse_abstract properties section_name = smart_terrain name = zat_stalker_smart - имя смарта position = 150.106674194336,1.51264631748199,71.8450012207031 - позиция direction = 0,0,0 -поворот не надо
; cse_alife_object properties game_vertex_id = 3401 - гейм виртекс левела distance = 0.699999988079071 level_vertex_id = 432867 - левел виртекс уровня object_flags = 0xffffff3e custom_data = <<END [smart_terrain] cfg = scripts\zaton\smart\zat_stalker_smart.ltx - путь к логике END
Поставленная задача в данном уроке будет следующей: необходимо разобрать принципы построения сложного задания, когда заранее известно количество необходимых предметов, а также конкртено определено какие предметы нам будут нужны. Пусть идея квеста будет такой: Борода дает ГГ поручение собрать 4 вида артефактов: Ломоть мяса в количестве 4 штук, Вспышка в количетсве 2 штук, Выверт- также в количетсве 2 штук, Глаз- одна штука. Аретафакты будут впоследствии переданы ученым, поэтому для большей конспирации приносить их Бороде можно будет только в специально отведенные часы. Также ГГ имеет абсолютную свободу в выборе того факта какие артефакты приносить в первую очередь. Можно сделать это сразу, собрав все, или же приносить по частям, собрав нужное количество артов одного типа.
Необходимые для редактирования файлы: 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 в самом низу добавим два диалога: На выдачу квеста:
Чтобы понимать о чем в диалогах идет речь сразу пропишем их транскрипцию в файле st_dialogs_zaton.xml:
Код
<string id="zat_boroda_about_artefact_quest_2_first_talking_0"> <text>Мое почтение, организм.</text> </string> <string id="zat_boroda_about_artefact_quest_2_first_talking_1"> <text>А, майор- гуд что пришел. Герман сказал мне что ты собирался помочь мне со сбром артефактов. Ну как, дело в силе?</text> </string> <string id="zat_boroda_about_artefact_quest_2_first_talking_2"> <text>Да, в силе. А зечем конкретно вам нужны артефакты?</text> </string> <string id="zat_boroda_about_artefact_quest_2_first_talking_3"> <text>Ученые будут осуществлять настройку прибора необходимую для улучшенного поиска артефактов. Поэтому им понадобяться некоторые расходные материалы. Не парься, их будет не так много- по несколько артефактов каждого типа рождаемой аномалии. Всего четыре типа- химический, электростатический, термальный и гравитационный.</text> </string> <string id="zat_boroda_about_artefact_quest_2_first_talking_4"> <text>Какие артефакты им нужны, скажи точнее.</text> </string> <string id="zat_boroda_about_artefact_quest_2_first_talking_5"> <text>Им понадобяться три артефакта "ломоть мяса", два "бенгальских огня", два "выверта" и один "глаз". Как только найдешь необходимое число артефактов одного вида можешь приносить.</text> </string> <string id="zat_boroda_about_artefact_quest_2_first_talking_6"> <text>Думаю, что уже следует приступить к поискам.</text> </string> <string id="zat_boroda_about_artefact_quest_2_first_talking_7"> <text>Только учти, как найдешь че- ко мне приходи только ночью, с двух до четрырех. Ну шоб без особого палева было...</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_0"> <text>По поводу артефактов...</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_1"> <text>Как раз вовремя. Ну че надыбал?</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_2"> <text>Я принес три артефакта "ломоть мяса".</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_3"> <text>Я достал два "бенгальских огня".</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_4"> <text>Держи вот парочка "вывертов".</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_5"> <text>Возьми, я добыл артефакт "глаз".</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_6"> <text>Хорошо, я буду ждать пока ты соберешь остальные артефакты.</text> </string> ; <string id="zat_boroda_about_artefact_quest_2_second_talking_7"> <text>Жди, я скоро буду.</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_8"> <text>Все, я доставил все артефакты, что заказывали.</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_9"> <text>Замечательно, теперь я смогу передать их ученым, чтобы те смогли осуществить точную настройку прототипа основываясь на имеющихся материалах.</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_10"> <text>Какие еще поставки необходимо будет провести?</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_11"> <text>На этапе моя работа заключалась только в этом.</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_12"> <text>Пока ничего не принес...</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_13"> <text>Ну и херли ты приперся? Сказано ведь ночью дела делать будем. Свали пока...</text> </string> <string id="zat_boroda_about_artefact_quest_2_second_talking_14"> <text>Ну забыл, с кем не бывает...</text> </string>
Теперь разберем по порядку то, что добавили.
Диалог на выдачу квеста имеет следующую элементарную структуру: - происходит выдача инфопоршня zat_test_boroda_arts_quest_begin (при старте квеста). - наличие в диалоге тегов <dont_has_info> zat_test_boroda_arts_quest_begin</dont_has_info> обеспечивает его блокировку после получения задания. - работа акшиона <action>dialogs_zaton.give_ozersky_fenix_2_quest</action> обеспечивает выдачу квеста.
Теперь самое основное - поясню особенности второго сложного диалога. Работает он по следующему алгоритму: - наличие тега <has_info>zat_test_boroda_arts_quest_begin</has_info> обеспечивает возможность инициализации диалога после выдачи квеста. - наличие <dont_has_info>zat_test_boroda_arts_quest_done</dont_has_info> обеспечивает блокировку диалога после завершение квеста. - выполняется первая проверка на срабатывание предусловия, когда необходимо выяснить настало ли время для возможности передачи найденных артефактов или нет. При этом есть разделение, когда работает один прекогндишн, а когда второй. <precondition>dialogs_zaton.is_not_zat_test_arts_time</precondition> - время не настало, при этом диалог завершается. <precondition>dialogs_zaton.is_zat_test_arts_time</precondition> <precondition>dialogs.is_surge_not_running</precondition> - выброс в данные момент не происходит и время необходимое нам достигнуто. - если второе условие верно, то становиться активен следующий выбор ветвления, в зависимости от того какие артефакты сейчас принес ГГ. Доступно 4 ответвления на передачу каждого из типов артов и получение соответсвующего инфопоршня для обновления этапов задания. При этом же есть и другие условия когда ГГничего не принес или же уже все передал.
Объявим используемые инфопоршни в info_zaton.xml. Добавим в конце файла код:
Добавим наши диалоги НПС (В данном случае Бороде) для этого в файл character_desc_zaton.xml в его профиль <specific_character id="zat_a2_stalker_barmen" team_default="1"> добавим две строки диалогов
С диалогами и инфопоршнями разобрались, теперь рассмотрим необходимые скриптовые функции:
В файл dialogs_zaton.script добавим код
Код
function give_ozersky_fenix_2_quest() task_manager.get_task_manager():give_task("geonezis_zat_test_artefats_quest") end
function is_zat_test_arts_time(first_speaker, second_speaker) if level.get_time_hours() >= 1 and level.get_time_hours() < 4 then if level.get_time_hours() > 1 then return true elseif level.get_time_minutes() >= 45 then return true end end return false end
function is_not_zat_test_arts_time(first_speaker, second_speaker) if level.get_time_hours() >= 1 and level.get_time_hours() < 4 then if level.get_time_hours() > 1 then return false elseif level.get_time_minutes() >= 45 then return false end end return true end
function actor_has_3_af_lomot(first_speaker, second_speaker) local cnt = 0 local function zat_arts_count(npc, item) if item:section() == "af_mincer_meat" then cnt = cnt + 1 end end db.actor:iterate_inventory(zat_arts_count, nil) if cnt > 2 then return true end return false end
function actor_has_2_af_benglfire(first_speaker, second_speaker) local cnt = 0 local function zat_arts_count(npc, item) if item:section() == "af_electra_sparkler" then cnt = cnt + 1 end end db.actor:iterate_inventory(zat_arts_count, nil) if cnt > 1 then return true end return false end
function actor_has_2_af_vivert(first_speaker, second_speaker) local cnt = 0 local function zat_arts_count(npc, item) if item:section() == "af_vyvert" then cnt = cnt + 1 end end db.actor:iterate_inventory(zat_arts_count, nil) if cnt > 1 then return true end return false end
function actor_has_1_af_glas(first_speaker, second_speaker) return db.actor:object("af_eye") ~= nil end
function give_1_af_glas_to_ozersky(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_eye") end
function give_2_af_vivert_to_ozersky(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_vyvert", 2) end
function give_2_af_benglfire_to_ozersky(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_electra_sparkler", 2) end
function give_3_af_lomot_to_ozersky(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_mincer_meat", 3) end
function actor_not_has_af_info(first_speaker, second_speaker) local cnt = 4 local table = { [1] = "jf2_a1", [2] = "jf2_a2", [3] = "jf2_a3", [4] = "jf2_a4", } for k = 1, #table do if has_alife_info(table[k]) then cnt = cnt - 1 end end return cnt > 0 end
function actor_has_af_info(first_speaker, second_speaker) return (has_alife_info("jf2_a1") and has_alife_info("jf2_a2") and has_alife_info("jf2_a3") and has_alife_info("jf2_a4")) end
Теперь по порядку разберем эти функции: - give_ozersky_fenix_2_quest - выдача квеста - actor_has_3_af_lomot и подобные ей- возвращает true при проверки на наличие в инвентаре ГГ необходимых предметов заданного количества. - is_zat_test_arts_time - возвращает true при проверке на время суток. - is_not_zat_test_arts_time - возвращает false при аналогичной проверке. - give_1_af_glas_to_ozersky и подобные ей- передача артефактов НПС. - actor_has_af_info – возвращает тру при наличие всех четырех инфопоршней по обнолению задания. - is_not_zat_test_arts_time – проверка на отсвутсвие тех же инфопоршей, скабатывает когда хотя бы одного из них нет.
Квест имеет следующий вид. В файле tm_zaton.ltx прописываем:
Разберем то что происходит в процессе выполнения квеста и собственно его структуру.
- [geonezis_zat_test_artefats_quest] - название задание в таск менеджере - icon = ui_inGame2_kompas - иконка квеста (в данном случае от задания Компас) - prior = 1 - приоритет задания - storyline = false - сюжетный ли квест или нет - title = - заголовки при обновлении задания - descr = - дескрипшины при обновлении задания - target = - цели, метки квеста при его обновлении. - condlist_... = - кондишн (спец. условия) в квесте - on_complete = - вызов функции или действия по завершению задания - reward_money = - денежная награда. Основная особенность задания это последовательная проверка структурных условий посредством наличий или отсутствия тех или иных инфопоршней.
В квесте рассматриваются все возможные сочетания вариантов наличия или отсутствия четырех инфопоршней выдаваемый при передачи предметов заказчику. 1. когда нет ни одного. 2. один из вид артов доставлен (любой), остальные три нет. 3. два из видов артов доставлены (любой), остальные два нет. 3. три из видов артов доставлены (любой), остальные два нет. 4. все четыре доставлены.
Соответственно в независимости от того какой из видов артов был передан первым - произойдет точное обновление дескрипшина и тайтла задания с указанием текущего состояния. Метка на цели в квесте (Борода) активна до завершения квеста.
По выдачи инфопоршня zat_test_boroda_arts_quest_done квест будет завершен.
Пропишем русскую транскрипцию дескрипшинов и тайтлов квеста в st_quests_zaton.xml
Код
<string id="jf2_q_title0"> <text>Оптовая поставка: необходимо принести Бороде артефакты четырех типов.</text> </string> <string id="jf2_q_text0"> <text>Для поставки партии артефактов ученым, необходимо собрать большое количество артефактов. Принесите Бороде следущие артефакты: три "ломтя мяса", два "выверта", два "бенгальских огня" и один "глаз".</text> </string> <string id="jf2_q_title1"> <text>Оптовая поставка: принесите артефакты трех оставшихся типов.</text> </string> <string id="jf2_q_text1"> <text>Вы принесли один из четырех необходимых типов артефактов, добудьте остальные три.</text> </string> <string id="jf2_q_title2"> <text>Оптовая поставка: принесите артефакты двух оставшихся типов.</text> </string> <string id="jf2_q_text2"> <text>Вы принесли два из четырех необходимых типов артефактов, добудьте остальные два.</text> </string> <string id="jf2_q_title3"> <text>Оптовая поставка: принесите артефакты одного оставшегося типа.</text> </string> <string id="jf2_q_text3"> <text>Вы принесли три из четырех необходимых типов артефактов, добудьте оставшейся один.</text> </string> <string id="jf2_q_title4"> <text>Оптовая поставка: получите дальнейшие указания у Бороды.</text> </string> <string id="jf2_q_text4"> <text>Вы нашли все необходимые артефакты, теперь получите у Бороды дополнительные указания.</text> </string>
По желанию для проверки в character_desc_general.xml при старте ГГ пропишем нужный арты.
На этом урок завершен.
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
Построение многоэтапного линейного квеста на последовательный поиск предметов класса device_pda. Поставленная задача состоит в обучения принципам построения сложных многоходовых заданий в игре Сталкер Зов Припяти. Будет показан процесс построения сложного диалога с ветвлением, последовательный спавн квестовых предметов через скрипт и собственно структура многоуровневого квеста. Задание следующее. Новиков просит ГГ принести для него разбросанные по локации сканеры аномалий. Квест будет построен таким образом что необходим исключительно поэтапный вариант его прохождения, то есть от одной точки к другой, без каких-либо вариантов. Получить один предмет раньше другого не будет предоставляться возможным.
Необходимые для редактирования файлы: 1. конфигурационные в (gamedata\configs\gameplay\) - character_desc_jupiter.xml - dialogs_jupiter.xml - info_jupiter.xml 2. конфигурационные в (gamedata\configs\misc\) - tm_jupiter.ltx - quest_items.ltx - death_generic.ltx 3. конфигурационные в (gamedata\configs\text\rus\) - st_dialogs_jupiter.xml - st_quests_jupiter.xml - st_items_quest.xml 4. конфигурационные в (gamedata\configs\misc\trade\) - trade_generic.ltx 5. скриптовый в (gamedata\scripts\) - dialogs_jupiter.script - ui_si.script - bind_stalker.script - new_tasks.script
Рассмотрим структуру квестовых диалогов. Для этого откроем dialogs_jupiter.xml и в самом низу добавим два диалога. Один активный при старте задания. Второй на завершение. В принципе можно было объединить их в один, но рассмотрим более легкий вариант. Однако при этом внесем разнообразие в процесс выдачи задания предоставив несколько вариантов его получения внутри диалога. Этот несколько освежит стандартные методы диалогостроения, когда все они делаются последовательными, без каких-либо вариантов.
Сразу же пропишем русскую транскрипцию в st_dialogs_jupiter.xml для того чтобы понимать о чем в диалоге идет речь:
Код
<string id="jup_b6_scientist_tech_quest_anomalies_scaner_0"> <text>Приветствую, хотел бы оказал вам максимально возможное содействие. Какого рода помощь тебе необходима?</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_1"> <text>В принципе есть одно небольшое дело, главное это твое желание работать.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_2"> <text>Я готов.Что нужно делать?</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_3"> <text>Прекрасно. Правда придется немного побегать. Мне необходимо получить кое-какие данные.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4"> <text>Замеры? Необходимо будет устанавливать какие-нибудь сканеры?</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_41"> <text>Нет, устанавливать не придется. Их уже установили. Тебе же наоборот придется их собрать и доставить сюда, чтобы я смог получить с них результаты замеров.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_401"> <text>Что за сканеры-то? Аномальная активность?</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4011"> <text>Обыкновенные сканеры аномалий. Их показатели результатов замеров будут мне необходимы для проведения настройки моего оборудования.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4012"> <text>Все ясно. Придется взять научный комбез. Передавай координаты.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4013"> <text>Уже загрузил. Комбез это хорошая тема. Обязательно возьми. И смотри не сварись в аномалиях.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_402"> <text>Кто их устанавливал и куда мне придется отправиться?</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4021"> <text>Тебе то не все-равно, кто их размещал. Пару дней назад, сталкеры из Свободы - сойдет такой ответ? Не о том думаешь. Твоя задача отправиться на Затон, пробежаться по точкам и вернуться назад живым вместе со сканерами. Все ясно?</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4022"> <text>Все. Передавай координаты.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_4023"> <text>Уже загрузил. Комбез научный только одень. И смотри не сварись в аномалиях.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5"> <text>А может еще что нужно?</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_51"> <text>Нет, хотя может быть потом я подберу для тебя работку. Но сначала ты должен будешь добыть результаты измерений с установленных на Затоне сканеров аномалий.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_52"> <text>Искать сканеры в аномалиях. Ха, веселая преспектива. Без специального научного костюма мне там долго не пролазить...</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_53"> <text>Намек понял. Вот держи ССП-99. Неплохой костюм, хотя и поношенный. Координаты сканеров я тебе загрузил.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_531"> <text>Хотя бы кровь с костюма отмыли? По-любому с трупака какого-нибудь своего ботанического дружка сняли...</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5311"> <text>Ой, ну давай мне не заливай..Тоже мне брезгливый нашелся. У самого-то, чай не первой свежести костюмчик..</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5312"> <text>Проехали Кулибин. Все, я отправляюсь за замерами...</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5313"> <text>Поосторожнее там...</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_532"> <text>Все понял, отправляюсь.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_5321"> <text>Поосторожнее там...</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_6"> <text>Хорошо, я сделаю то что нужно. Говори с чего начинать.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_61"> <text>Вот это деловой разговор, делового человека. Вообщем план таков. Сначала ты находишь на Затоне сканеры аномалий, установленные там нашими сподручными сталкерами. Координаты я тебе уже сбросил. Потом, я может быть посмотрю еще что для тебя..</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_611"> <text>Все ясно, Кулибин. Жди, я за твоими сканерами.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_6111"> <text>Поосторожнее там. В аномалиях не сгинь...</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_end_0"> <text>Вот все твои сканеры.</text> </string> <string id="jup_b6_scientist_tech_quest_anomalies_scaner_end_1"> <text>Отличная работа. Немедленно начинаю работу над обработкой результатов замеров. Новую работу получишь позже. А пока гуляй.</text> </string>
Теперь разберем структуру представленных диалогов: - Во втором диалоге нет ничего сложного: активен при наличие инфопоршня jup_novikov_quest_zaton_scanner_have_6, исчезает после выдачи jup_novikov_quest_zaton_scanner_end, имеет прекондишн actot_have_all_zaton_scaner когда в инвентаре ГГ наличие всех квестовых предметов. содержит один акшион actot_to_novikov_give_zaton_scaner на передачу предметов заказчику. - первый диалог сложнее. основная особенность это вложенная тройная разветвленность, когда можно выбрав одну из трех веток получить один и тот же результат. - внутри каждой из веток также имеет место дополнительные ответвления. - старт задания происходит по выдачи акшиона give_novikov_zaton_scaner_quest сопровождается также выдачей инфопоршня jup_novikov_quest_zaton_scanner_start - создание первого квестового предмета происходит также внутри диалога- акшион jup_b6_create_first_scaner - чисто для разнообразия происходит выдача ГГ костюма для выполнения задания при выборе одной из трех веток. это акшион jup_b6_to_actor_give_spez_outfit
Объявим используемые инфопоршни в info_jupiter.xml. Добавим в конце файла код:
Добавим наши диалоги НПС (В данном случае Новикову) для этого в файл character_desc_jupiter.xml в его профиль <specific_character id="jup_b6_scientist_tech" team_default="1"> добавим строки диалогов
С диалогами и инфопоршнями разобрались, теперь добавим необходимые для выполнения квеста предметы.
В файл quest_items.ltx пропишем семь секций предметов zat_spec_anomaly_scanner_№. Все предметы являются квестовыми - невозможна их продажа и выкладывание из инвентаря ГГ.
В файл st_items_quest.xml пропишем дескрипцию предметов.
Код
<string id="zat_spec_anomaly_scanner_1_name"> <text>«Сканер грави-химического симбионта»</text> </string> <string id="zat_spec_anomaly_scanner_1_descr"> <text>«Специализированный сканер аномальной активности из серии 32.1351. Используется учеными для изучения процессов происходящих в грави-химическом симбионте»</text> </string> <string id="zat_spec_anomaly_scanner_2_name"> <text>«Сканер химической аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_2_descr"> <text>«Специализированный сканер аномальной активности из серии 27.7724. Используется учеными для изучения процессов происходящих в химической аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_3_name"> <text>«Сканер гравитационной аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_3_descr"> <text>«Специализированный сканер аномальной активности из серии 78.9835. Используется учеными для изучения процессов происходящих в гравитационной аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_4_name"> <text>«Сканер термальной аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_4_descr"> <text>«Специализированный сканер аномальной активности из серии 47.3246. Используется учеными для изучения процессов происходящих в термальной аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_5_name"> <text>«Сканер пси-статической аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_5_descr"> <text>«Специализированный сканер аномальной активности из серии 06.8912. Используется учеными для изучения процессов происходящих в пси-статической аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_6_name"> <text>«Сканер термального симбионта»</text> </string> <string id="zat_spec_anomaly_scanner_6_descr"> <text>«Специализированный сканер аномальной активности из серии 35.0205. Используется учеными для изучения процессов происходящих в термальном симбионте»</text> </string> <string id="zat_spec_anomaly_scanner_7_name"> <text>«Сканер электро-статической аномалии»</text> </string> <string id="zat_spec_anomaly_scanner_7_descr"> <text>«Специализированный сканер аномальной активности из серии 03.1392. Используется учеными для изучения процессов происходящих в электро-статической аномалии»</text> </string>
В файле trade_generic.ltx пропишем торговлю. Также нужно добавлять индивидуально во все остальные файлы конфигов торговли. (но не обязательно)
С квестовыми предметами также определились, теперь необходимо разобраться со скриптами квеста. Собственно теперь мы и подходим к основной сути нашего урока, в этом этапе заключен его основной смысл.
В файле dialogs_jupiter.script добавим следующие функции:
Код
function jup_b6_create_first_scaner(first_speaker, second_speaker) alife():create("zat_spec_anomaly_scanner_1",vector():set(-436.574,-6.527,170.169),116113,16) end
function jup_b6_to_actor_give_spez_outfit(first_speaker, second_speaker) dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "scientific_outfit") end
function give_novikov_zaton_scaner_quest() task_manager.get_task_manager():give_task("geonezis_jup_spec_scaner") end
function actot_to_novikov_give_zaton_scaner(first_speaker, second_speaker) local items_table = {"zat_spec_anomaly_scanner_1","zat_spec_anomaly_scanner_2","zat_spec_anomaly_scanner_3","zat_spec_anomaly_scanner_4","zat_spec_anomaly_scann er_5","zat_spec_anomaly_scanner_6","zat_spec_anomaly_scanner_7"} for k,v in pairs(items_table) do if db.actor:object(v) ~= nil then dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, v) end end end
function actot_have_all_zaton_scaner(first_speaker, second_speaker) return db.actor:object("zat_spec_anomaly_scanner_1")~=nil and db.actor:object("zat_spec_anomaly_scanner_2")~=nil and db.actor:object("zat_spec_anomaly_scanner_3")~=nil and db.actor:object("zat_spec_anomaly_scanner_4")~=nil and db.actor:object("zat_spec_anomaly_scanner_5")~=nil and db.actor:object("zat_spec_anomaly_scanner_6")~=nil and db.actor:object("zat_spec_anomaly_scanner_7")~=nil end
коротко их поясним: - спавн первого квестового предмета - передача броне костюма ГГ - выдача задания - передача всех квестовых предметов НПС - скрипт проверки наличия в инвентаре ГГ всех необходимых предметов
Теперь создадим файл new_tasks.script и добавим в него следующий код одной основной функции task_spec():
Скрипт созданный нами в файле можно посмотреть в скачанном архиве с отработанным примером. Основная его особенность это последовательный спавн квестовых предметов. Последующий будет создаваться только после того как был найден предыдущий. Также происходит выдача инфопоршней используемых в структуре самого квеста. Еще одна особенность это установка дополнительной проверки в зависимости от локации.
Созданный нами скрипт необходимо объявить в функции апдейта актора actor_binder:update(delta) в файле bind_stalker.script:
Код
..... new_tasks.task_spec() .....
Теперь собственно перейдем к созданию самого задания. Код секции квеста ([geonezis_jup_spec_scaner]) можно просмотреть в файле tm_jupiter.ltx в архиве с отработанным примером. Основные особенности это наличие двух кондишинов один на завершение задания, второй на его провал (в случае если сквад ученых бункера станет врагами по отношению к ГГ). По завершению задания будет повышена репутация у группировки экологов, а также выдана награда. Структура квеста последовательная. Одна секция тайтлов, дескрипшинов и меток заменяет другую при получении соответствующих им инфопоршней. Всего 7 таких этапов. Инфопоршни используемые в задании выдаются также последовательно. Определяемыми являются те, которые обновляются при спавне (jup_novikov_quest_zaton_scanner_create_№), а не при взятии предмета.
На этом урок завершен.
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
Реализация квеста с использованием объекта класса inventory_box со сложной логикой. Особенности - отсутствие диалогов, использование рестрикторов, выдача тайника в качестве награды.
Поставленная задача в данном уроке будет заключаться в обучении основным принципам создания сложного квеста в игре Сталкер Зов Припяти с добавление объекта класса inventory_box. Выдача задания будет осуществляться автоматически, в данном случае зададим ее при старте игры. Также будет показан пример задания сложной логики добавленного объекта и ее возможная привязка в процессе реализации квестов.
Само задание будет следующим. При старте ГГ будет получено сообщение о необходимости поиска схрона на территории Земснаряда. Чтобы открыть этот схрон необходимо использоваться два специальных ключа. Нужно будет найти эти отмычки и использовать их для получения доступа к содержимому объекта. После этого квест автоматически завершается. Вместо получения денежной награды происходит выдача координат тайника, также дополнительно добавленного нами.
Необходимые для редактирования файлы: 1. конфигурационные в (gamedata\configs\gameplay\) - info_zaton.xml 2. конфигурационные в (gamedata\configs\misc\) - tm_zaton.ltx - quest_items.ltx - secret_zaton.ltx 3. конфигурационные в (gamedata\configs\text\rus\) - st_quests_zaton.xml - st_items_quest.xml - ui_st_screen.xml 4. конфигурационные в (gamedata\configs\scripts\zaton\) - файлы логик рестрикторов 5. скриптовый в (gamedata\scripts\) - bind_stalker.script - new_tasks.script 6. all.spawn. (gamedata\spawns\) - alife_zaton.ltx
Полный процесс регистрации квестовых предметов во всех файлах и некоторые повторяющиеся моменты не будет описаны, они аналогичны предыдущим урокам. Также текстовая транскрипция будет приведена только в файле с отработанным заданием.
Первоначально создадим новый тайник который будет выдан нам в качестве награды по завершению квеста.
- в файле secret_zaton.ltx добавим тайник в общий список zat_hiding_place_56 и объявим его секцию:
Код
[zat_hiding_place_56] wpn_vintorez = 1, 1
в нем будет находиться один предмет- винторез.
- создадим секцию рестриктора тайника и сам предмет через all.spawn
; cse_alife_inventory_box properties tip = inventory_box_use
указывается: - класс объекта - уникальное имя секции - координаты точки спавна - прикрепленный файл логики - идентификатор для установления метки таргета - визуал модели объекта - тип объекта
зададим логику нашего объекта в файле zat_test_conteiner.ltx следующим образом:
Более подробно ее разберем. Имеющийся у нас схрон (предмет с данной логикой) будет иметь 6 секций возможного состояния. Нам необходимо открыть его, используя два ключа. Поэтому возможны следующие варианты: - ящик закрыт. ph_idle@full_locked - использован один из ключей ph_idle@locked - у актора есть один из ключей ph_idle@has_one_key - у актора есть второй ключ при условии что был уже использован любой из первых. ph_idle@locked_has_second_key - у актора сразу есть два ключа ph_idle@has_two_key - ящик вскрыт. ph_idle@open
Общая конструкция секций логики: - состоянии запрета использования обработчика nonscript_usable будет true только в одном случае когда ящик открыт. - строка с используемой секции надписи указывается в tips сама транскрипция задается в ui_st_screen.xml - вызываемое действие определяется в on_use - происходит переход в одно из последующих состояний и удаление предметов. - активное состояние определяется из условий on_info
Теперь по порядку разберем каждую из секций. В принципе сложного в построении такой логике ничего нет, решается обыкновенная комбинаторная задача сочетания двух объектов, когда первый ключ есть, второго нет: наоборот второй есть, первого нет; обо есть; ни одного нет.
- активное состояние ph_idle@full_locked - ящик закрыт. изначально необходимо его использовать чтобы произошло обновление квеста (выдача инфопорции +zat_test_quest_find_to_open) и спавн внутрь него необходимого нам предмета (=spawn_object_in(zat_test_container_item:zat_test_cont_id)). это действие возможно только когда ключей у актора нет (!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)). если мы сразу нашли оба ключа (=actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)) то происходит переход в секцию ph_idle@has_two_key если у гг есть один ключ, но нет другого (не важно какого) то активируется секция ph_idle@has_one_key вторые условия on_info2 следующие: при получении инфопорции zat_test_conteiner_open происходит переход в ph_idle@open, соответственно при получении zat_test_one_lock_open становиться активной ph_idle@locked
- у актора есть один из ключей ph_idle@has_one_key вне зависимости от того какой из ключей был найден при юзании ящика происходит вскрытие одного замка, переход в секцию ph_idle@locked и выполняются следующие действия %=remove_item(zat_test_key_....) =play_sound(power_switch) +zat_test_one_lock_open% удаляется один из ключей из инвентаря ГГ, проигрывается звук вскрытия замка, выдается соответствующий инфопоршень вскрытия.
- один из ключей уже использован, второй нет. ph_idle@locked это переходная секция юзание ящика при этом невозможно. вне зависимости от того какой ключ есть у ГГ (=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)) или (=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)) будет осуществлен переход в секцию ph_idle@locked_has_second_key дополнительное условие наличие инфопорции zat_test_conteiner_open переход в ph_idle@open
- один из ключей использован, второй в наличии. ph_idle@locked_has_second_key при наличии одного из двух ключей =actor_has_item(zat_test_key_...) !actor_has_item(zat_test_key_...) во время юзания происходит переход в секцию ph_idle@open,удаляется один из ключей, проигрывается звук вскрытия, выдается соответствующий инфопоршень. основное условие нет ни одного ключа - !actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1) происходит переход в состояние ожидания ph_idle@locked дополнительное условие аналогично.
- есть оба ключа. ph_idle@has_two_key при наличии обоих ключей =actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2) оба они удаляются. происходит переход в ph_idle@open условия при этом- возвращения в необходимые секции когда либо ключей нет, либо есть по одному.
Квестовые предметы - ключи (zat_test_key_1, zat_test_key_2) и необходимый для получения из схрона предмет zat_test_container_item добавим в quest_items.ltx:
В принципе он элементарный. До первого юзания ящика активна первая секция, после активна секция на поиск ключей. Квест завершается при наличии у ГГ необходимого и взятого из ящика предмета =actor_has_item(zat_test_container_item)
Скрипт на спавн ключей будет иметь следующий вид:
Код
--/Квест Example function task_spec() local level_name=level.name() if level_name=="zaton" then if has_alife_info("zat_test_quest_find_to_open") and not has_alife_info("zat_test_quest_spawn_items") then local rnd_quest_items_1=math.random(1,2) if rnd_quest_items_1==1 then alife():create("zat_test_key_1",vector():set(369.470,-5.291,281.921),1579200,67) alife():create("zat_test_key_2",vector():set(368.114,-5.228,281.887),1577301,67) news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо вскрыть заблокированный модуль. Для этого необходимо найти два ключа оставленные в тайниках сталкерами.", nil, nil, 14000) db.actor:give_info_portion("zat_test_quest_spawn_items") elseif rnd_quest_items_1==2 then alife():create("zat_test_key_1",vector():set(366.925,-5.202,281.718),1575412,67) alife():create("zat_test_key_2",vector():set(365.569,-5.450,281.175),1573410,67) news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо вскрыть заблокированный модуль. Для этого необходимо найти два ключа оставленные в тайниках сталкерами.", nil, nil, 14000) db.actor:give_info_portion("zat_test_quest_spawn_items") end end if has_alife_info("zat_test_quest_complete") and not has_alife_info("zat_test_quest_tainik_give") then treasure_manager.get_treasure_manager():give_treasure("zat_hiding_place_56") db.actor:give_info_portion("zat_test_quest_tainik_give") end end end
ключи спавняться рандомно в двух точках, после первого юзания ящика (получении инфопоршня zat_test_quest_find_to_open) Выдача тайника происходит по завершении квеста. Может быть сделано это двумя способами или внутри скрипта, или внутри задания. Включение квестового скрипта в обработку аналогично как и в других уроках. Выдача самого квеста на старте игры также по аналогии.
На этом курс завершен.
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
Создание квеста на одновременный поиск двух различных предметов.
Итак, предположим нам необходимо создать простой квест для Зова Припяти на одновременный поиск двух различных предметов. Пусть идея квеста будет такой: Сыч дает ГГ поручение найти два артефакта Снежинка и Пламя.
Необходимые для редактирования файлы: 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 в самом низу добавим два диалога:
Чтобы понимать о чем в диалогах идет речь сразу пропишем их транскрипцию в файле st_dialogs_zaton.xml
Код
<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 Добавим в конце файла код:
Код
<!-- 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"> добавим две строки диалогов:
С диалогами и инфопоршнями разобрались теперь рассмотрим необходимые скриптовые функции:
В файл dialogs_zaton.script добавим код:
Код
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 - выдача денежной награды ГГ.
Разберем то что происходит в процессе выполнения квеста и собственно его структуру. - [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
Код
<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 при старте ГГ пропишем нужный арты.
На этом урок завершен.
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
Реализация квеста на одновременный поиск заданного количества различных предметов, определенных в рандомной таблице. Определение новой условной функции в xr_conditions.script
Разберем принцип построения квеста следующего вида. НПС выдает ГГ задание на необходимость поиска и доставки определенного количества различных пердметов. В данном случае квест будет выдаваться Тремором, на снабжение его медикаментами. Это задание подобно тому, что в оригинале выдавали голодные наемники на Затоне. Его рассмотрение и разбор поможет понять принцип добавления новых функций, условия, выполнения которых будет выступать в качестве возможности обновления этапов внутри квеста. Изначально будет определен ассортимент квестовых предметов для доставки, но ГГ имеет свободу в выборе того, какие конкретно квестовые предметы ему приносить. Они могут быть или все одного типа, или же по несколько единиц различного.
Необходимые для редактирования файлы: 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\) - xr_conditions.script - dialogs_zaton.script
Для начала создадим два простеньких диалога для выдачи и завершения квеста.
В файл dialogs_zaton.xml в самом низу добавим два диалога:
Чтобы понимать о чем в диалогах идет речь сразу пропишем их транскрипцию в файле st_dialogs_zaton.xml
Код
<string id="zat_test_medic_dialog_about_supplies_0"> <text>Я мог бы принести медикаменты раненным, если интересует...</text> </string> <string id="zat_test_medic_dialog_about_supplies_1"> <text>Ну принеси. Простых аптечек, анабиотиков, бинтов... Штук десть. Хоть что-то для них, только бы на всех хватило.</text> </string> <string id="zat_test_medic_dialog_find_supplies_0"> <text>Держи медикаменты.</text> </string> <string id="zat_test_medic_dialog_find_supplies_1"> <text>Не ожидал... Спасибо. Для раненных в самый раз это лишним шансом выжить будет...Удачи.</text> </string></string> <string id="zat_b30_owl_stalker_trader_small_quests_9"> <text>Бывай.</text> </string>
Теперь разберем по порядку то, что добавили.
Диалог на выдачу квеста имеет следующую элементарную структуру: - во время его завершения срабатывает актишин на выполнение функции старта задания <action>dialogs_zaton.zat_medic_test_quest_give</action> при этом происходит выдача инфопоршня zat_test_medic_bring_supplies, который блокирует дальнейшее активное состояние диалога (<dont_has_info>zat_test_medic_bring_supplies</dont_has_info>)
Теперь поясню особенности второго диалога: - наличие тега <has_info> zat_test_medic_bring_supplies</has_info> обеспечивает возможность инициализации диалога после выдачи квеста. - наличие тега <dont_has_info> zat_test_medic_task_done</dont_has_info> обеспечивает блокировку диалога после завершение квеста. - прекондишн <precondition>dialogs_zaton.zat_test_actor_has_needed_medic</precondition> обеспечивает блокирование диалога до момента наличия в инвентаре ГГ нужных квестовых предметов. - работа вызываемой через акшион <action>dialogs_zaton.zat_test_transfer_medic_supplies</action> функции обеспечивает передачу квестовых предметов от ГГ к НПС.
Объявим используемые инфопоршни в info_zaton.xml. Добавим в конце файла код:
Код
<!-- New quest --> <info_portion id="zat_test_medic_bring_supplies"></info_portion> <info_portion id="zat_test_medic_task_done"></info_portion>
Добавим наши диалоги НПС (В данном случае Тремору) для этого в файл character_desc_zaton.xml в его профиль <specific_character id="zat_b22_stalker_medic" team_default="1"> добавим две строки диалогов
С диалогами и инфопоршнями разобрались, теперь рассмотрим необходимые скриптовые функции: В файл dialogs_zaton.script добавим код:
Код
function zat_medic_test_quest_give() task_manager.get_task_manager():give_task("geonezis_test_bring_supplies") end
function zat_test_actor_has_needed_medic(first_speaker, second_speaker) local item_sections = { [1] = "medkit", [2] = "drug_anabiotic", [3] = "bandage" } local needed = 10 local count = 0 local item_section local function calc(temp, item) if item:section() == item_section then count = count + 1 end end for k,v in pairs(item_sections) do item_section = v get_story_object("actor"):iterate_inventory(calc, actor) end return count >= needed end
function zat_test_transfer_medic_supplies(first_speaker, second_speaker) local npc = dialogs.who_is_npc(first_speaker, second_speaker) local actor = dialogs.who_is_actor(first_speaker, second_speaker) local i = 10 local j = 0 local section local item_sections = { [1] = "medkit", [2] = "drug_anabiotic", [3] = "bandage" } local function transfer_object_item(temp, item) if (item:section() == section and i ~= 0) then actor:transfer_item(item, npc) i = i - 1 end end for k,v in pairs(item_sections) do section = v j = i actor:iterate_inventory(transfer_object_item, nil) if ((j - i) ~= 0) then news_manager.relocate_item(actor, "out", section, j - i) end end end
Теперь по порядку разберем эти функции: - zat_medic_test_quest_give - выдача квеста - zat_test_actor_has_needed_medic - возвращает значение при проверки на наличие в инвентаре ГГ определенного количества необходимых предметов (в данном случае это предметы на выбор: medkit, drug_anabiotic, bandage) которые задаются в виде таблицы определяемой локальную переменную item_sections. Также в ней определяются локальные переменные необходимого числа предметов needed равного 10, переменная счетчика count изначально равная нулю, а также локальная функция счетчика calc(temp, item) во время работы функции происходит вызов цикла подсчета количества заданных предметов в инвентаре ГГ. Когда их количество станет больше или равно заданному значение функция прекращает свою работу и возвращает значение. - zat_test_transfer_medic_supplies – примерно по тому же принципу организованная функция обработки передачи этих предметов от ГГ к НПС.
В файле xr_conditions.script определим новую условную функцию, необходимую нам при работе самого квеста.
Код
function zat_test_actor_has_needed_medic(actor, npc, p) return (dialogs_zaton.zat_test_actor_has_needed_medic(actor, npc)) or (has_alife_info("zat_test_medic_task_done")) end
данная условная функция возвращает условие выполненяемое в ранее определенной диалоговой или же дополнительно условие на проверку наличия инфопоршня завершения квеста.
Самое основное это квест. В файле tm_zaton.ltx прописываем:
Разберем то, что происходит в процессе выполнения квеста и собственно его структуру. При выдаче задания метка будет принимать нулевое значение, активен первый этап, когда необходимо собрать нужные ГГ предметы. При их наличии (то есть при срабатывание заданной нами функции zat_test_actor_has_needed_medic) этап квеста будет обновлен, метка переброситься на НПС Тремор. При получении инфопорции zat_test_medic_task_done квест завершается. В случае срабатывания второго условия {=is_squad_enemy_to_actor(zat_b22_medic)} (сквад в котором определен наш НПС становиться враждебным по отношению к ГГ) задание будет провалено.
Пропишем русскую транскрипцию дескрипшинов и тайтлов квеста в st_quests_zaton.xml
Код
<string id="zat_test_quest_bring_supplies_title0"> <text>Медикаменты: достаньте медикаменты для медика</text> </string> <string id="zat_test_quest_bring_supplies_text0"> <text>Местный врач Тремор просит принести ему медикаменты - десять аптечек, бинтов или анабиотиков.</text> </string> <string id="zat_test_quest_bring_supplies_title1"> <text>Припасы: отнести медикаменты Тремору</text> </string> <string id="zat_test_quest_bring_supplies_text1"> <text>Необходимо отнести собранные медикаменты врачу на Скадовск.</text> </string>
По желанию для проверки в character_desc_general.xml при старте ГГ пропишем нужные нам медикаменты.
На этом урок завершен.
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
Реализация квеста на выполнение определенного действия через логику рестриктора, работа с туториалом. Последовательность в выполнении на несколько этапов.
Предположим нам необходимо реализовать квест следующего типа: ГГ будет выдано задание на извлечение определенного предмета из физического обьекта на локации. Пусть будет такой вариант: Сыч дает Дягтереву задание на изьятие из старой антенны и генератора на ВНЗ Круг различных деталей. Для осуществления подобных заданий необходимо использовать рестрикторы. Данный тип квестов в корне отличается от простых, когда по заданным меткам необходимо было просто подобрать заспавненные ранее предметы.
Необходимые для редактирования файлы: 1. конфигурационные в (gamedata\configs\gameplay\) - character_desc_zaton.xml - dialogs_zaton.xml - info_zaton.xml 2. конфигурационные в (gamedata\configs\misc\) - tm_zaton.ltx - quest_items.ltx - death_generic.ltx 3. конфигурационные в (gamedata\configs\text\rus\) - st_dialogs_zaton.xml - st_quests_zaton.xml - ui_st_screen.xml - st_items_quest.xml 4. конфигурационные в (gamedata\configs\ui\) - game_tutorials.xml 5. логики рескрипторов в (gamedata\configs\scripts\zaton\) - zat_restr_logic_1.ltx - zat_restr_logic_2.ltx 6. скриптовый в (gamedata\scripts\) - dialogs_zaton.script - xr_effects.script - ui_si.script 7. Спавн в файле all.spawn (gamedata\spawns\) - alife_zaton.ltx
Для начала добавим один общий диалог на выдачу и завершения квеста. (В принципе можно было не усложнять и сделать два простых диалога, но рассмотрим более сложный вариант)
В файл dialogs_zaton.xml в самом низу добавим диалог:
Чтобы понимать о чем в диалогах идет речь сразу пропишем русскую транскрипцию фраз в файле st_dialogs_zaton.xml:
Код
<string id="zat_b106_stalker_sich_test_quest_dialog_0"> <text>Я по поводу работы.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_1"> <text>Работы, хм. Ах да забыл. Есть у меня одно поручение. Нужно сходить на ВНЗ Круг и снять показатели нескольких старых приборов. С одной антенны и старого генератора. Ну что, согласен?</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_11"> <text>Да, сделаю.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_12"> <text>Пока есть другие дела.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_112"> <text>Отлично, жду. Награду достойную получишь.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_2"> <text>Ну что, сделал что я просил?</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_4"> <text>Нет, работаю над этим.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_3"> <text>Да. Все сделано.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_331"> <text>Отлично, давай сюда приборы.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_332"> <text>Забирай.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_333"> <text>Вот твоя награда. Успехов сталкер.</text> </string> <string id="zat_b106_stalker_sich_test_quest_dialog_334"> <text>Бывай.</text> </string>
Теперь разберем по порядку его структуру. Диалог на выдачу и завершение квеста имеет следующую структуру: 1. Первая часть диалога на выдачу задания. (ветка <next>1</next>) - ГГ предлагают задание и он на выбор может временно отказаться от него, тогда диалог будет доступен во второй раз. Либо же согласиться на исполнение. - соответственно при согласии происходит выдача инфопоршня zat_b106_sich_quest_begin (при старте квеста) и выдача самого квеста через актшион <action>dialogs_zaton.zat_b106_sich_give_tasks</action>. - На этом генерация ветки диалога на выдачу задания будет заблокирована, из-за наличия во фразе 1 условия <dont_has_info>zat_b106_sich_quest_begin</dont_has_info> 2. Вторая часть диалога доступная уже после взятия задания. - Ее генерация происходит путем активации ветки (<next>2</next>), первая фраза которой будет доступна только после старта задания то есть наличия условия <has_info>zat_b106_sich_quest_begin</has_info> - Следующие фразы будут доступны также на выбор (<next>3</next> и <next>4</next>). Фраза 4 будет доступна сразу же после взятия квеста- она будет являться закрывающей диалог (акшион <action>dialogs.break_dialog</action>). Генерируется она путем наличия условия <dont_has_info>zat_b106_sich_quest_restr_2</dont_has_info>. Эта фраза сообщает о том что ГГ еще не выполнил задание. - Фраза 3 которая является веткой завершения диалога будет доступна только при наличии условия <has_info>zat_b106_sich_quest_restr_2</has_info> (этот инфопоршень мы получим в процессе выполнения квеста) при этом фраза 4 будет заблокирована. - в третьей фразе будет происходить выдача условия <give_info>zat_b106_sich_quest_complete</give_info>обеспечивающего завершение квеста и полное блокирование диалога. - также отметим наличие акшионов <action>dialogs_zaton.zat_b106_sich_quest_relocate_item</action> и <action>dialogs_zaton.zat_b106_sich_quest_relocate_reward</action> отвечающих за передачу квестовых предметов и выдачу награды.
Объявим используемые инфопоршни в info_zaton.xml. Добавим в конце файла код:
Добавим наш диалог НПС (В данном случае Сычу) для этого в файл character_desc_zaton.xml в его профиль <specific_character id="zat_b30_owl_stalker_trader" team_default="1"> добавим строку диалога:
С диалогами и инфопоршнями разобрались теперь добавим необходимые для выполнения квеста предметы, а также файлы связанный с ними.
В файл quest_items.ltx пропишем две секции предметов zat_b206_sich_quest_item_1 и zat_b206_sich_quest_item_2. Оба предмета являются квестовыми- невозможна их продажа и выкладывание из инвентаря:
- Имена секций рестикторов должны быть уникальны (как собственное имя, так и порядковое внутри алл спавна) - Они должны иметь тип 3 - Координаты точки спавна рестикторов должны задаваться рядом с тем объектом на локации который мы будем использовать. (position, level_vertex_id, game_vertex_id) - story_id = zat_restr_2_id - уникальный айди номер рестриктора на который будет выставляться квестовая метка. - shape0 - общий тип и размер зоны рестриктора- при изменении числовых значений можно как увеличить, так и уменьшить радиус активной зоны вблизи юзаемого предмета. - cfg = scripts\zaton\zat_restr_logic_2.ltx - путь к файлу логики рестриктора.
Теперь пропишем логики рестрикторов. Рассмотрим только одну - вторая создается по образу первой. Создадим файл zat_restr_logic_1.ltx. И пропишем в него следующий код:
Опишем что означает эта логика и по какому принципу она строиться: - всего логика имеет три секции это sr_idle@start - она же изначально активная, [sr_idle@tutorial] по исполнению гайм туториала, [sr_idle@nil] - нулевое значение логики. - основной принцип работы это проверка наличия двух условий- это старт квеста (zat_b106_sich_quest_begin) и наличия актора в зоне рестиктора =actor_in_zone(zat_test_quest_restrictor_1) при их соблидение подается команда на старт туториала юзания предмета %=run_tutorial(zat_sich_quest_1_tutor)% - если актор находился в зоне рестиктора, но потом вышел из нее !actor_in_zone(zat_test_quest_restrictor_1) происходит выдача команды на остановку туториала %=stop_tutorial% и возвращение логики в исходное стартовое состоянии. Запуск или остановку туториала можно проследить по активации надписи юзания предмета. - соответственно в независимости от того какая секция логики активна при выдаче инфопоршня zat_b106_sich_quest_restr_1 происходит обнуление логики рестиктора. Дальнейшая работа туториалов в ней будет невозможно.
Текст активирующийся при юзании рестриктора буде прописан в ui_st_screen.xml:
Основные параметры это: - <action id="use" finalize="1">xr_effects.zat_sich_quest_1</action> выполняемое действие по скрипту xr_effects.zat_sich_quest_1 - zat_sich_quest_tips - текст сообщения перед юзанием
В файл xr_effects.script пропишем скрипты исполняемые при юзании рескриптора.
Код
function zat_sich_quest_1(actor, npc) if xr_conditions.actor_in_zone(actor, npc, {"zat_test_quest_restrictor_1"}) then db.actor:give_info_portion("zat_b106_sich_quest_restr_1") give_actor(db.actor,nil,{"zat_b206_sich_quest_item_1"}) end end function zat_sich_quest_2(actor, npc) if xr_conditions.actor_in_zone(actor, npc, {"zat_test_quest_restrictor_2"}) then db.actor:give_info_portion("zat_b106_sich_quest_restr_2") give_actor(db.actor,nil,{"zat_b206_sich_quest_item_2"}) end end
- Происходит проверка наличия актора в зоне zat_test_quest_restrictor_1 и если оно истинно тогда происходит выдача инфопоршня zat_b106_sich_quest_restr_1 и спавн в рюкзак ГГ айтема zat_b206_sich_quest_item_1
С рестрикторами все ясно. Теперь пропишем остальные скриптовые функции:
В файле dialogs_zaton.script добавим следующие функции:
Код
function zat_b106_sich_give_tasks(first_speaker, second_speaker) task_manager.get_task_manager():give_task("geonezis_zat_b206_sich_example_task") end
function zat_b106_sich_quest_relocate_item(first_speaker, second_speaker) local items_table = { "zat_b206_sich_quest_item_1", "zat_b206_sich_quest_item_2", } for k,v in pairs(items_table) do if db.actor:object(v) ~= nil then dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, v) end end end
function zat_b106_sich_quest_relocate_reward(first_speaker, second_speaker) dialogs.relocate_money_to_actor(first_speaker, second_speaker, 5000) end
Поясним их: - Выдача квеста - Передача квестовых предметов неписю - Выдача ГГ награды за квест
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
Пояснения: - квест исполняется в три этапа- сначала мы юзаем рестриктор 1, потом после этого второй и в завершении отдаем полученные предметы заказчику. Соответственно метки перемещаются с zat_restr_1_id на zat_restr_2_id и в завершении на Сыча zat_b30_owl_stalker_trader_id. При этом же обновляются тайтлы и дескрипшины этапов задания. Основные условия их изменения это выдача или же отсутствие двух основных инфопоршней zat_b106_sich_quest_restr_1 (получаемого при юзании первого рестриктора) и zat_b106_sich_quest_restr_2 (второго) - задание завершается при выдаче инфопоршня zat_b106_sich_quest_complete - квест будет провален если после его старта НПС заказчика стал враждебен по отношению к ГГ =is_squad_enemy_to_actor(zat_b30_owl_stalker_trader_squad) - по завершению квеста происходит повышение репутации у сталкеров %=inc_faction_goodwill_to_actor(stalker:50)%
В файле st_quests_zaton.xml пропишем тайтлы и дескрипшины квеста:
Код
<string id="zat_b206_sich_example_title0"> <text>Задание Сыча: извлеките компонент из старой антенны.</text> </string> <string id="zat_b206_sich_example_text0"> <text>Необходимо отправиться на ВНЗ Круг и извлечь деталь обьекта со старой антенны.</text> </string> <string id="zat_b206_sich_example_title1"> <text>Задание Сыча: извлеките вторую деталь со старого генератора</text> </string> <string id="zat_b206_sich_example_text1"> <text>Заберите вторую необходимую заказчику деталь.</text> </string> <string id="zat_b206_sich_example_title2"> <text>Задание Сыча: отдайте заказчику найденные детали.</text> </string> <string id="zat_b206_sich_example_text2"> <text>Передайте все старые детали и компоненты Сычу.</text> </string>
На этом урок добавления подобного класса заданий завершен.
IP-адрес: Страна: Российская Федерация Город: Москва Дата регистрации: 25.10.2014
К обсуждению подключились уважаемый Dorian23Grey и, собственно, я сам. Ситуация выходит следующая: 1. Во-первых, на X-Ray сцены с анимациями в стиле CoD, Metro и т. д. делать не очень удобно, как таковые. 2. Требуется иметь отличные умения в анимации объектов. 3. Нужно настроить взаимодействие логики с таймерами и анимации. На данный момент такое мало кто реализовывал. Однако, вариант, когда ГГ подходит к мутанту, запускается туториал с последующим выполнением убийства, - вполне реализуемая фишка. Сегодня об этом и пойдет речь. Пускай, на Затоне в пределах Северного озера поселился уникальный болотный псевдогигант, которому совершенно плевать на пули сталкеров. Единственный быстрый способ его устранить - активировать гравитационный артефакт. Когда ГГ подойдет к мутанту с артефактом, запустится туториал с надписью "Активировать артефакт". При нажатии F, запустится функция, которая создаст на месте мутанта партикл разрыва от грави-аномалии.
Подготовка к действу
- Paint Net, Adobe Photoshop или другой редактор текстур (если кто-то будет создавать мутанту уникальную текстуру) - Notepad++
Опять же, если желаете сделать для своего мутанта уникальную текстуру, пожалйста. Как по мне, то новую модель или текстуру стоит сделать, ибо супер-крутой псевдогиг должен как-то выделяться среди своих сородичей. Я сделал условный "ретекстур" (в кавычках, потому что ляпнуть чуток крови и "узеленить" текстуру - ретекстуром назвать нельзя) монстра под болото.: Скрин #1 Если кому нужна текстура, ловите (бамп подключен стандартный).
Для хорошего эффекта разрыва тела в аномалии, я буду использовать некоторые партиклы от АМК:
Код
amk\\blow_body amk\\zomb_explode
У кого они есть (или есть альтернативный вариант) - супер, отлично. У кого их нету - не волнуйтесь, чуть позже я загружу готовый particles.xr, а пока приложу два варианта таблицы партиклов для обоих случаев.
Если вы работаете не в СДК, а с ACDC, то вам нужно будет снять координаты для места, где будет сидеть мутант. Само место действия (примерно) показвыаю на карте: Скрин #2 Я прошел немного вперед к воде, снял координаты: Скрин #3