XMK 24 Опубликовано 18 Декабря 2009 (изменено) Разбор системы квестов в S.T.A.L.K.E.R. Зов Припяти Статья написана: Xmk[spoiler=Разбираем конкретно параметры:]icon - иконка квестаПример использования: icon = ui_inGame2_Put_v_pripyatprior - приоритет квестаПример использования: prior = 112storyline - флаг задания (true - сюжетное, false - несюжетное)Пример использования: storyline = truetitle - название задание (id из xml) - если брать название не из xml, то в игре оно будет отображаться без пробеловПример использования: title = zat_a9_way_gates_check_transport_workshop_nametitle_functor - функция-обработчик для заголовка (по умолчанию condlist)Примеры смотри в task_functor.scriptdescr - описание задания (id из xml) - если брать название не из xml, то в игре оно будет отображаться без пробеловПример использования: descr = zat_a9_way_gates_check_transport_workshop_textdescr_functor - функция-обработчик для описания (по умолчанию condlist)Примеры смотри в task_functor.scripttarget - цель на карте (метка)Примеры использования:target = zat_a2_stalker_barmen (ID объекта (в данном случае нпц), на которого будет поставлена метка)target = {условие}obj_id- если выполняется условие, метка будет поставлена на выбранный объект.descr_functor - функция-обработчик для цели (должна возвращать ID персонажа) (по умолчанию target_condlist)Примеры смотри в task_functor.scriptcondlist_x - группа параметров, позволяющая задавать условия выполнения, провала или отмены задания. Число в имени ключа позволяет задать несколько последовательно пронумерованных (начиная с нуля) параметров. Кондлист каждого параметра может возвращать следующие значения: complete (выполнить задание), fail (провалить задание), reversed (отменить задание).Примеры использования:condlist_0 = {условие} complete - если выполняется условие, задание выполнено.condlist_1 = {условие} reversed - есливыполняется условие, значит есть возможность повторить задание.condlist_2 = {условие} fail - есливыполняется условие, задание провалено.on_init - действия, которые выполняются, при выдаче заданияon_complete - действия, которые выполняются, если задание выполненоon_reversed - действия, которые выполняются, если задание проваленоПримеры использования:on_init = %+название_инфопоршня% -- выдаем опр.инфопоршеньon_complete = %=inc_faction_goodwill_to_actor(stalker:200)% -- повышаем репу у сталкеров (функция юзаются из xr_effect)on_reversed = {условие} %=inc_faction_goodwill_to_actor(stalker:200)% -- повышаем репу у сталкеров, только если есть выполняется условие.reward_money - денежная наградаreward_item - награда в виде предметаПримеры использования:reward_money = 5000 -- даем актору 5000.reward_item = wpn_ak74 -- даем актору АК-74Примечание: Награда выдается двумя методами: от НПЦ или просто свалиться с неба. Если не найден НПЦ, с которым мы в диалоге, то валится с неба.dont_send_update_news - булевое значение. При включении отключает новости при обновлении квеста. [spoiler=Создаем примитивный квест:]Используемые файлы:configs\gameplay\dialogs_zaton.xmlconfigs\gameplay\info_zaton.xmlconfigs\gameplay\character_desc_zaton.xmlconfigs\text\rus\st_quests_zaton.xmlconfigs\misc\tm_zaton.ltxscripts\dialogs_zaton.script Открываем файл dialogs_zaton.xml и добавляем перед </game_dialogs>: <dialog id="vodka_quest_dialog"> <dont_has_info>quest_vodka_done</dont_has_info> <dont_has_info>quest_vodka_give</dont_has_info> <phrase_list> <phrase id="1"> <text>Принеси бутылочку</text> <give_info>quest_vodka_give</give_info> <action>dialogs_zaton.give_vodka_quest</action> </phrase> <phrase id="0"> <text>Привет, тебе водки не принести?</text> <next>1</next> </phrase> </phrase_list> </dialog> <dialog id="vodka_quest_prines"> <dont_has_info>quest_vodka_done</dont_has_info> <has_info>quest_vodka_give</has_info> <precondition>dialogs_zaton.is_has_vodka_borode</precondition> <phrase_list> <phrase id="1"> <text>Спасибо, чувак. Выручил</text> <give_info>quest_vodka_done</give_info> </phrase> <phrase id="0"> <has_info>quest_has_vodka</has_info> <text>Вот твоя водяра</text> <action>dialogs_zaton.transfer_vodka_to_boroda</action> <next>1</next> </phrase> </phrase_list> </dialog> Далее добавляем наши диалоги Бороде.Открываем файл character_desc_zaton.xmlНаходим строчку <actor_dialog>zat_a2_stalker_barmen_actor_info</actor_dialog> и под ней пишем <actor_dialog>vodka_quest_dialog</actor_dialog> <actor_dialog>vodka_quest_prines</actor_dialog> Сохраняем Открываем файл info_zaton.xml и добавляем перед </game_information_portions>: <info_portion id="quest_vodka_give"></info_portion> <info_portion id="quest_has_vodka"></info_portion> <info_portion id="quest_vodka_done"></info_portion> Открываем файл dialogs_zaton.script и в начало записываем: function give_vodka_quest() task_manager.get_task_manager():give_task("quest_vodka_give") end function is_has_vodka_borode() if db.actor:object("vodka") then return true end return false end function transfer_vodka_to_boroda(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "vodka") end Сохраняем Открываем файл tm_zaton.ltx и в конец пишем: [quest_vodka_give] icon = ui_inGame2_Put_v_pripyat prior = 2 storyline = false title = {=actor_has_item(vodka)}vodka_barmen_prinesti_name, vodka_barmen_naiti_name descr = vodka_barmen_descr target = {=actor_has_item(vodka)}zat_a2_stalker_barmen condlist_0 = {+quest_vodka_done} complete Открываем файл st_quests_zaton.xml и добавляем после <string_table> <string id="vodka_barmen_naiti_name"> <text>Найти водку для бармена</text> </string> <string id="vodka_barmen_prinesti_name"> <text>Принести водку бармену</text> </string> <string id="vodka_barmen_descr"> <text>Бармен в тестовых целях попросил найти и принести ему 2 бутылки водки</text> </string> Сохраняем Скачать пример квеста - по этой ссылке или по этойИсточник: link Создание квеста с использованием рестрикторов (Автор - @GEONЕZIS) Создание многоэтапного квеста на последовательный поиск предметов (Автор - @GEONЕZIS) Создание квеста с добавлением дополнительных внутриэтапных подзаданий. Особенности- отсутствие диалогов, использование рестрикторов. (Автор - @GEONЕZIS) Создание квеста с добавлением дополнительных внутриэтапных заданий. Особенности- отсутствие диалогов, использование физических объектов класса physic_destroyable_object в качестве квестовых предметов. (Автор - @GEONЕZIS) Создание квеста с добавлением дополнительных внутриэтапных заданий. Особенности- отсутствие диалогов, добавление тайников в качестве квестовых предметов. (Автор - @GEONЕZIS) Создание однотипного квеста на одновременный поиск двух разных предметов. Особенности- использование элементарных скриптовых функций actor_has_item() (Автор - @GEONЕZIS) Создание примитивного квеста на поиск двух различных предметов, с выдачей ачивмента. Особенности- способ написания задание с его обновлением по инфопорциям, добавление по завершении простого достижения (ачивмента). (Автор - @GEONЕZIS) Создание сложного квеста с использованием объекта класса inventory_box. Особенности- отсутствие диалогов, использование рестрикторов, выдача тайника в качестве награды. (Автор - @GEONЕZIS) Квест на убийство мутанта через туториал ("Press F To Win") (Автор - @FantomICW) Изменено 27 Июля 2014 пользователем FantomICW 3 5 2 Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 23 Декабря 2009 а будет продолжение? Очень интересно! что именно? Задавайте вопросы, по возможности отвечу Dead men Если ты этого не знаешь, зачем лезешь в квестостроение? Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 24 Декабря 2009 XMK как я понял предмет который от нас требуется прописывается в скрипте? да, это прекондишн для диалога на обновление задания стоит: title = {=actor_has_item(vodka)}vodka_barmen_prinesti_name, На что влияет приоритет квеста и его сюжетность/не сюжетность? после выполнения какого либо квеста, вероятность что игра переключится на этот Репутация игрока скорее тоже не изменится. чтоб изменить репу игрока у сталкеров при выполнении квеста (пример) надо дописать: on_complete = %=inc_faction_goodwill_to_actor(stalker:200)% Как поставить ограничитель, что бы квест раньше н-времени не появлялся? в диалог проверки на инфопоршни вставляй статья по диалогам: http://www.stalkerin.gameru.net/wiki/index...%D0%BE%D1%80%29 Guzerus <dont_has_info> проверка на отсутствие опр.инфопоршня <has_info> проверка на присутствие опр.инфопоршня <precondition>файл.функция</precondition> сюда можно запихать функцию, в которой можешь проверить всё что угодно Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 24 Декабря 2009 Эмм не помогает вот другой пример через браузер открой файл он тебе покажет где косяк Здесь сначала идёт 1,потом 0. Я всегда с нуля начинаю. Это просто автор так написал,или правило такое? это просто я в стиле ПЫСов диалоги пишу ZeeK В диалоге прописываешь <action>файл.функция_запуска_музыки</action> логику включайте! Всем остальным! Задаем вопросы касательно создания квестов, а не диалогов! Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 25 Декабря 2009 (изменено) Любой квест запускается инфопошем - а вызов инфопоша завязать можно на предмет и т.д. прикол в том, что нет... надо всё завязывать на функцию xr_effect.give_task(ID) (если ты только не имел ввиду, то что я написал ниже) Как сделать что бы квест сам включался просто так? on_init - инфопоршень, который "включает" задание но я не проверял, лучше вызывай в нужном моменте функцию, данную выше Night_SH вот 2 статьи (Создание Диалогов | Создание Диалогов (Полный Обзор)). Учись писать диалоги, потом принимайся за квесты Изменено 25 Декабря 2009 пользователем XMK Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 25 Декабря 2009 function has_eye3(task, objective) if db.actor ~= nil then return db.actor:object("af_eye") ~= nil end return false end --не работает... потому что надо function has_eye3(task, objective) if db.actor ~= nil and db.actor:object("af_eye") ~= nil then return true end return false end function has_lck_to_boroda(task, objective) - аналогично function eye_out(first_speaker, second_speaker) dialogs.relocate_item_section(second_speaker, "af_eye", "out") --в диалоге сообщение мол арт отдан а в инвентаре он остается end dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_eye") function lck_out(first_speaker, second_speaker) аналогично Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 25 Декабря 2009 Он не возвращает значение true если у тебя есть предмет, я же тебе выше писал! function has_lck_to_boroda(task, objective) if db.actor ~= nil and db.actor:object("lck") ~= nil then return true end return false end Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 27 Декабря 2009 Не флудим! Теперь другой вопрос, как выдать поршн когда подобрал предмет? открываем bind_stalker.script, находим там function actor_binder:on_item_take (obj) и под ней пишемif obj and obj.section_name then if obj:section_name()=="kolbasa" then if not has_alife_info("ИНФОПОРШЕНЬ") then give_info("ИНФОПОРШЕНЬ") end end end 1 Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 30 Декабря 2009 (изменено) ну дак инфопоршень то пропиши.... в info_zaton.xml к примеру. инфопоршень прописан. идентификатор проверь Ещё вот такой вылет: на чистой игре попробуй, без модов, если с модами проверяй скрипты lua чекером. Изменено 30 Декабря 2009 пользователем XMK Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 15 Января 2010 (изменено) И будет ли продолжаться тема? Хотелось бы еще посмотреть квесты на устранение неприятных личностей-таких как Умник в ТЧ например... будет время... Собсна в квестах по устранению нет ничего сложного какую функцию нада писать для квестов на убийство левых мужиков? в детч_каллбек вставлять проверку по ID сталкера Изменено 15 Января 2010 пользователем XMK Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 28 Января 2010 судя по всему, on_init является не условием запуска квеста, а тем что выполняется после выдачи квеста. функция send_tip есть в xr_effect reward_item необходимо протестировать, возможно у меня скоро это получится Как при начале новой игры кинуть типс... найти откуда выдаются квесты на вертолеты, оттуда же вызвать свой квест, типс выдается автоматом ("Новое задание: название"). если нужно доп.типс то там же где выдается квест вбить еще: news_manager.send_tip(db.actor, "текст", timeout, "sender", showtime) timeout - задержка sender - иконка pioneer mutant_hunter detective one_of_the_lads kingpin herald_of_justice seeker battle_systems_master high_tech_master skilled_stalker leader diplomat research_man friend_of_duty friend_of_freedom balance_advocate wealthy keeper_of_secrets marked_by_zone information_dealer friend_of_stalkers got_artefact got_ammo got_medicine got_duty_light_armor got_duty_heavy_armor got_freedom_light_armor got_freedom_heavy_armor can_resupply recent_surge showtime - время показывания Как будет время статью отредактирую и напишу для примера квест по сложней. Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 28 Января 2010 Возможно просто текст указан без ковычек. Po-meceniy лучше давай в таких случаях код квеста, легче будет сказать в чем проблема.... Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 28 Января 2010 (изменено) Po-Meceniy А функции? Просто так же не вылетит на типс Добавлено через 1 мин.: Не ну вы ребята какие то странные пишите квест а вылетает мотиватор и логик Изменено 28 Января 2010 пользователем XMK Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 28 Января 2010 ZeeK ну с места же тоже не вылетит, что-то ковырял Po-meceniy тем более что стандартный типс выдаваемый при взятии квеста явно просто так не вылетит. Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 30 Января 2010 (изменено) Я подозреваю что дело в странном скрипте вызова задания: а я подозреваю что дело в чьих то .. руках В игре судя по всему ни один квест так не берется. xr_effect.script: function give_task(actor, obj, p) if p[1] == nil then abort("No parameter in give_task function.") end task_manager.get_task_manager():give_task(p[1]) end вызывается из файлов логики. Изменено 30 Января 2010 пользователем XMK Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 31 Января 2010 (изменено) А почему тогда в этом уроке, квест вызывается из dialogs_zaton.script? да вызови ты его хоть из bind_stalker, какая разница title = {=actor_has_item(vodka)}vodka_barmen_prinesti_name, vodka_barmen_naiti_name при взятии квеста Название его будет vodka_barmen_naiti_name после того как в рюкзаке у актора будет бутылка водки (проверка стоит) квест обновится и будет называться vodka_barmen_prinesti_name actor_has_item - это функция Изменено 31 Января 2010 пользователем XMK Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 31 Января 2010 (изменено) function has_ak74(task, objective) if db.actor ~= nil and db.actor:object("wpn_ak74") ~= nil then return true end return false end [Search_ak74_quest] icon = ui_inGame2_Put_v_pripyat prior = 2 storyline = false title = {=actor_has_item(wpn_ak74)}barmen_ak74_prinesti, barmen_ak74_searsh descr = barmen_ak74_desc target = {=actor_has_item(wpn_ak74)}zat_a2_stalker_barmen condlist_0 = {+prines_ak74} complete <dialog id="Prines_ak74"> <dont_has_info>prines_ak74</dont_has_info> <precondition>dialogs_zaton.has_ak74</precondition> <phrase_list> <phrase id="1"> <text>Спасибо, чувак. Выручил</text> <give_info>prines_ak74</give_info> </phrase> <phrase id="0"> <text>Вот твой автомат</text> <action>dialogs_zaton.otdal_ak74</action> <next>1</next> </phrase> </phrase_list> </dialog> <string id="barmen_ak74_searsh"> <text>Найти АК-74</text> </string> <string id="barmen_ak74_prinesti"> <text>Принести автомат Бороде</text> </string> потести, щас вроде должен работать Изменено 31 Января 2010 пользователем XMK Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 27 Февраля 2010 Phantom1305 а лог то вылета дай Поделиться этим сообщением Ссылка на сообщение
XMK 24 Опубликовано 9 Марта 2010 Phantom1305 [kill_stalker] icon = ui_inGame2_Zalozhnik prior = 1 storyline = false title = {+stalker_vasyu_killed}zabrat_reward, kill_vasya descr = kill_vasya_descr target = {+stalker_vasyu_killed} zat_b5_talk_to_sultan_id condlist_0 = {+kill_stalker_done} complete xr_motivator.script: function motivator_binder:death_callback(victim, who) if who:id()==db.actor:id() and victim:character_name()=="Вася" then give_info("stalker_vasyu_killed") end ну или если у твоего "Васи" есть логика то добавь туда: on_death = death ... [death] on_info = %+stalker_vasyu_killed% Поделиться этим сообщением Ссылка на сообщение