S.T.A.L.K.E.R. 2: Новый трейлер <<<>>> S.T.A.L.K.E.R.: Global War <<<>>> Инструмент - теперь и для ТЧ!
-
Число публикаций
51 -
Регистрация
-
Последнее посещение
-
AMKoin
7 [Подарить AMKoin]
Сообщения опубликованы GEONЕZIS
-
-
Всем привет) Ролик по истории создания истребителя-перехватчика И-211. Просмотреть
-
Мое новое видео по экспериментальным самолетам ОКБ Лавочкина. Ссылка на ютуб
-
Всем привет) Немного экскурса в историю авиации. Видео о разработке первых реактивных самолетов в послевоенные годы. В данном случае это создание первого реактивного фронтового бомбардировщика ОКБ Туполева Ту-12. Ссылка на Ютуб
- 1
-
- Это популярное сообщение.
- Это популярное сообщение.
Немного новостей.
Практически полностью закончено создание одного из ключевых уровней мода - Милитари.
Информация по нему долгое время держалась в секрете. И вот пришла пора приоткрыть завесу тайны и рассказать об этой локации более подробно. Сразу оговоримся, Милитари – рабочее название. Локация не имеет никакого отношения к своей «тезке» из оригинала «Тени Чернобыля» или «Чистого Неба», но обладает примерно схожей концепцией. Уровень представляет собой заброшенную военную базу, расположенную неподалеку от города Чернобыль. Его прототипом послужила реальная территория военного объекта войск ПВО. Примерно две трети от расположения базы находится в густой лесополосе, остальная местность подверглась разрушительным землетрясениям, происходившим во время образования Чернобыльской Аномальной Зоны и потому представляет собой мертвую территорию, испещренную глубокими разломами и трещинами, заполненными аномальными зонами. Структурно уровень можно разделить на несколько зон. Среди них – административно-жилой комплекс, где расположены солдатские казармы и общежития офицерского состава, учебная зона с административными корпусами, непосредственно зона размещения пусковых установок, зона складских и бытовых помещений, а также территория автопарка.
Все указанные объекты расположены с максимальным приближением к реальному прототипу. Одним из уникальных особенностей уровня является проработка внутренних помещений практически всех размещенных на нем объектов. К примеру- караульное помещение, комендатура, склад ГСМ, ПТО. В каждый из них можно зайти и исследовать. Благодаря этому полноценное исследование всех закутков локации займет не менее двух-трех часов реального времени. Для любителей обходить уровни от и до, с возможностью заглянуть в каждый дом, каждую комнату и каждое строение, эта локация станет настоящим подарком. Территория базы в изобилии содержит различные подземные сооружения и бункеры. Каждый из бункеров также имеет свое конкретное назначение. К примеру бункер ЗКП (запасного командного пункта), или склад ХОВ (химических опасных веществ). В целом получилась потрясающая локация, полная уникальных мест и объектов, аналогов которой в сталкерском коммунити, пожалуй, будет сложно найти.- 9
-
Доброго времени суток. Команда разработчиков модификации Смерти Вопреки 3 ищет следующих специалистов:
1. 3-D моделлер. Обязанности- создание объектов для локаций. Опыт работы с 3D-Max, SDK.
2. Текстурщик. Важен опыт создания бампов.
Связь в ЛС. -
Здравствуйте. Ни у кого не остались модели из этого поста? http://www.amk-team.ru/forum/topic/10547-arkhiv-modelej-max-3ds-fbx-smd/?p=902062 Сможете перезалить?
-
Здравствуйте.
Перспективному проекту, разрабатываемому на платформе Зова Припяти, требуются следующие специалисты:- Моделлеры. Обязанности: создание новых объектов для локаций. Знание 3D-Max.- Аниматор. Обязанности: cоздание новых анимаций для моделей нпс, анимирование объектов и худовых предметов.- Программист C++ для работы с движком игры.Контакты:В ЛС профиля. -
Здравствуйте. Подскажите пожалуйста в чем может быть проблема при подгоне вертексов координат спавна в подключенной локации.
Все утилиты и последние скрипты установлены.
Прописываю команду universal_acdc.pl -parse alife_marsh.ltx -old 0 -new 1276 -way в батнике acdc_parse.batСоздается пустая папка parsed_spawn, после этого ошибка -
Что то пошла мода делать новый сюжет на одной локации
А что в этом такого плохого? Как всем известно аддон Зов Припяти содержит в себе всего 5 локаций и основной упор в нем был сделан на тщательную реализацию квестовой составляющей. Для того чтобы реализовать сюжет подобного ПЫС уровня технической сложности (программирование логики, тестирование всех игровых вариантов и т.д.) одному человеку требуется достаточно много времени, не менее полугода. В принципе это сопоставимо по срокам с разработкой модификации на трех локациями, но с более упрощенной технической реализацией сюжета. Так что лично я в таких модах ничего плохого не вижу. Плюсы можно перечислять и еще. На ТЧ, ЧН немного другие приоритеты и думаю нет смысла сравнивать два мода на разных платформах.
-
Создание однотипного квеста на одновременный поиск двух разных предметов. Особенности- использование элементарных скриптовых функций actor_has_item() Реализация на X-Ray 1.6
Итак, предположим нам необходимо создать простой квест для Зова Припяти на одновременный поиск двух различных предметов.
Пусть идея квеста будет такой: Сыч дает ГГ поручение найти два артефакта Снежинка и Пламя.
Необходимые для редактирования файлы:
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 в самом низу добавим два диалога:
На выдачу квеста:
<dialog id="zat_b30_owl_stalker_trader_small_quests_begin"> <dont_has_info>zat_b30_owl_stalker_trader_quest_init</dont_has_info> <dont_has_info>zat_b30_owl_stalker_trader_quest_no_quest</dont_has_info> <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_not_have_arts</precondition> <phrase_list> <phrase id="0"> <text>zat_b30_owl_stalker_trader_small_quests_0</text> <next>1</next> </phrase> <phrase id="1"> <text>zat_b30_owl_stalker_trader_small_quests_1</text> <next>2</next> <next>3</next> </phrase> <phrase id="2"> <text>zat_b30_owl_stalker_trader_small_quests_2</text> <give_info>zat_b30_owl_stalker_trader_quest_no_quest</give_info> </phrase> <phrase id="3"> <text>zat_b30_owl_stalker_trader_small_quests_3</text> <action>dialogs_zaton.zat_b30_owl_stalker_trader_give_quest</action> <next>4</next> </phrase> <phrase id="4"> <text>zat_b30_owl_stalker_trader_small_quests_4</text> <give_info>zat_b30_owl_stalker_trader_quest_init</give_info> </phrase> </phrase_list> </dialog>
На завершение квеста:
<dialog id="zat_b30_owl_stalker_trader_small_quests_end"> <has_info>zat_b30_owl_stalker_trader_quest_init</has_info> <dont_has_info>zat_b30_owl_stalker_trader_quest_end</dont_has_info> <precondition>dialogs_zaton.zat_b30_owl_stalker_trader_have_arts</precondition> <phrase_list> <phrase id="0"> <text>zat_b30_owl_stalker_trader_small_quests_5</text> <give_info>zat_b30_owl_stalker_trader_quest_end</give_info> <next>1</next> </phrase> <phrase id="1"> <text>zat_b30_owl_stalker_trader_small_quests_6</text> <next>2</next> </phrase> <phrase id="2"> <text>zat_b30_owl_stalker_trader_small_quests_7</text> <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_arts</action> <next>3</next> </phrase> <phrase id="3"> <text>zat_b30_owl_stalker_trader_small_quests_8</text> <action>dialogs_zaton.zat_b30_owl_stalker_trader_relocates_money_to_actor</action> <next>4</next> </phrase> <phrase id="4"> <text>zat_b30_owl_stalker_trader_small_quests_9</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog>
Пропишем их русскую транскрипцию в файле st_dialogs_zaton.xml
Теперь разберем по порядку то что добавили.
Диалог на выдачу квеста имеет следующую элементарную структуру:
- ГГ предлагают задание и он на выбор может отказаться от него, тогда второй раз диалог уже не будет доступен. Либо же согласиться на исполение.
- Соответсвенно происходит выдача инфопоршней 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"> добавим две строки диалогов
..... <actor_dialog>zat_b30_owl_stalker_trader_small_quests_begin</actor_dialog> <actor_dialog>zat_b30_owl_stalker_trader_small_quests_end</actor_dialog> .....
С диалогами и инфопоршнями разобрались теперь раccмотрим необходимые скриптовые функции:
В файл 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- выдача денежной награды ГГ.
Ну и самое основное это квест.
В файле tm_zaton.ltx прописываем
[geonezis_zat_b30_owl_quest] icon = ui_inGame2_Kontrakt_s_uchenimi prior = 2 storyline = false title = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_3, {=actor_has_item(af_ice) !actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_2, {!actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_title_1, zat_b30_owl_stalker_trader_small_quest_title_0 descr = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_3, {=actor_has_item(af_ice) !actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_2, {!actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_small_quest_text_1, zat_b30_owl_stalker_trader_small_quest_text_0 target = {=actor_has_item(af_ice) =actor_has_item(af_fire)} zat_b30_owl_stalker_trader_id, nil condlist_0 = {+zat_b30_owl_stalker_trader_quest_end} complete
Разберем то что происходит в процессе выполнения квеста и собственно его структуру.
- [geonezis_zat_b30_owl_quest] - название задение в таск менеджере
- icon = ui_inGame2_Kontrakt_s_uchenimi - иконка квеста (в данном случае от задания Контракт с Учеными)
- prior = 2 - приоретет задания
- storyline = false - сюжеткный ли квест или нет
- title = - заголовки при обновлении задания
- descr = - дескрипшины при обновлении задания
- target = - цели, метки квеста при его обьнавлении.
- condlist_0 =- кондишн (спец. условия) в квесте (в данном случае один на завершение)
Основная особенность задания это последовательная проверка структурных условий посредством функции actor_has_item(...). Это вызываемая из xr_conditions.script функция на проверку наличия у актора того или иного предмета. Соответсвенно в структуре этого квеста используют два варианта когда значениее функции false (!actor_has_item(...)) и true (=actor_has_item(...))
В квесте рассматриваются все возможные сочетания вариантов наличия или отсутсвия найденного того или иного предмета.
1. когда нет ни одного.
2. первый (арт снежинка) есть, второго (арт пламя) нет.
3. первого нет, второй есть
4. оба есть.
Соответсвенно в независимости от того какой арт был найден первым- произойдет точное обновление дескрипшина и титла задания с указанием текущего состояния. Также если игрок выложит из инвентаря уже найденный арт, то задание будет обновляться снова. Метка на цели в квесте (Сыч) появиться только при наличии обоих предметов.
По выдачи инфопоршня zat_b30_owl_stalker_trader_quest_end квест будет завершен.
Пропишим рускую транскрипцию дескрипшинов и тайтлов квеста в st_quests_zaton.xml
По желанию для проверки в character_desc_general.xml при старте ГГ пропишем нужный арты.
На этом урок завершен.
Файл с отработанным заданием можно скачать здесь- http://narod.ru/disk....ar.html
Создание примитивного квеста на поиск двух различных предметов, с выдачей ачивмента.
Особенности- способ написания задание с его обновлением по инфопорциям, добавление по завершении простого достижения (ачивмента). Реализация на X-Ray 1.6
Поставленная в данном уроке задача схожа с той что была в предыдущем. Основным отличием от него будет являться способ реализации заданий такого типа. Если ранее основным обработчиком на обновление этапов квеста служило использование функций actor_has_item(...), то сейчас последовательное обновление будет осуществляться через выдачу соответствующих инфопорций. Будет подробно рассмотрена структура диалога в котором будет происходить их выдача. Также среди особенностей отметим добавление по завершении задания специального достижения.
Необходимые для редактирования файлы:
1. конфигурационные в (gamedata\configs\gameplay)
-character_desc_zaton.xml
-dialogs_zaton.xml
-info_zaton.xml
-character_desc_general.xml (необязательно)
2. конфигурационные в (gamedata\configs\misc\)
- tm_zaton.ltx
- achievements.ltx
3. конфигурационные в (gamedata\configs\text\rus\)
- st_dialogs_zaton.xml
- st_quests_zaton.xml
- st_achievement.xml
- ui_st_screen.xml
4. скриптовые в (gamedata\scripts\)
- dialogs_zaton.script
- xr_statistic.script
Начнем с разбора процесса создания ачивмента, выдаваемого по завершении задания. Остальные этапы по написанию квеста будут сокращаны, ибо по большей части они уже были рассмотрены в предыдущем уроке.
В файле achievements.ltx в самом низу добавим следующую секцию:
[sich_helper] icon = ui_inGame2_Iskatel hint = st_sp_achievement_22_hint name = st_sp_achievement_22_name desc = st_sp_achievement_22_descr functor = xr_statistic.sich_helper_functor
-[sich_helper]- уникальное имя секции ачивмента. его же необходимо зарегистрировать в начале файла в списке всех достижений.
-icon- имя секции иконки достижения. берется из файла ui_actor_achivments.xml (\configs\ui\textures_descr\) в свою очередь сама иконка прописывается в ui_actor_achivments.dds (\textures\ui\) В данном случае возьмем стандартную иконку из другого достижения.
- hint- описание в ПДА при наведении на ачивку.
- name- название (имя) достижения.
- desc- описание самого достижения.
- functor- имя функции из xr_statistic.script отвечающей за срабатывания условий на получение достижения и собственно его выдача.
Описание русской транскрипции добавим в файл st_achievement.xml
<string id="st_sp_achievement_22_name"> <text>Помошник торговца</text> </string> <string id="st_sp_achievement_22_hint"> <text>Бандиты стали лучше к Вам относится.</text> </string> <string id="st_sp_achievement_22_descr"> <text>Вы нашли и принесли артефакты скряге Сычу. Тем самым Вы заслужили уважение бандитов.</text> </string>
и в ui_st_screen.xml
<string id="st_ach_sich_helper"> <text>Получено достижение «Помошник торговца».</text> </string>
В xr_statistic.script добавляем исполняемую функцию:
function sich_helper_functor() if not has_alife_info("sich_helper_achievement_gained") then if has_alife_info("zat_geonezis_example_quest_complete") then news_manager.send_tip(db.actor, "st_ach_sich_helper", nil, "seeker", nil, nil) xr_effects.inc_faction_goodwill_to_actor(db.actor, nil, {"bandit", 100}) db.actor:give_info_portion("sich_helper_achievement_gained") end end return has_alife_info("sich_helper_achievement_gained") end
более подробно разберем работу данной функции:
- происходит проверка, а не было ли уже получено данное достижение (отсутствие инфопоршня sich_helper_achievement_gained)
- срабатывание условия выдачи достижения
в данном случае условие только одно- это получение инфопоршня zat_geonezis_example_quest_complete (который будет выдаваться по завершению квеста)
- далее происходит отправка на пда ГГ сообщения с текстом что достижение было получено.
- вызывается обработчик функций на выполнение "бонуса" или "антибонуса" достижения. (в данном случае это только увеличение репутации у сталкеров)
- выдается инфопоршень получения достижения (в рассматриваемом примере это sich_helper_achievement_gained)
Так, теперь приступим к процессу формирования задания.
Опишем подробно только второй диалог, который будет активен после взятия задания.
Первый, на получения квеста можно будет посмотреть в файле dialogs_zaton.xml имя диалога- jup_azot_sborkiquest_init_dialog
Соответственно русскую транскрипцию диалогов и квестов также не будем приводить. Ее можно будет увидеть в файлах st_quests_zaton.xml и st_dialogs_zaton.xml
Код второго диалога следующий:
<dialog id="jup_azot_sborkiquest_find_dialog"> <has_info>jup_azot_quest_sborki_give</has_info> <precondition>dialogs_zaton.actor_has_first_or_second_grenader_item</precondition> <phrase_list> <phrase id="0"> <text>jup_azot_quest_sborki_find_begin</text> <next>1</next> </phrase> <phrase id="1"> <text>jup_azot_quest_sborki_find_what</text> <next>11</next> <next>12</next> <next>13</next> <next>14</next> </phrase> <phrase id="11"> <text>jup_azot_quest_sborki_find_first_item</text> <precondition>dialogs_zaton.if_actor_has_zat_grenader_stalker_flash</precondition> <action>dialogs_zaton.transfer_zat_grenader_stalker_flash</action> <action>dialogs_jupiter.jup_b43_reward_for_first_artefact</action> <give_info>jup_azot_quest_sborki1_done</give_info> <next>111</next> <next>112</next> </phrase> <phrase id="111"> <text>jup_azot_quest_sborki_find_item_flash</text> <dont_has_info>jup_azot_quest_sborki2_done</dont_has_info> </phrase> <phrase id="112"> <text>jup_azot_quest_sborki_find_item_all</text> <has_info>jup_azot_quest_sborki2_done</has_info> <has_info>jup_azot_quest_sborki1_done</has_info> </phrase> <phrase id="12"> <text>jup_azot_quest_sborki_find_second_item</text> <precondition>dialogs_zaton.if_actor_has_zat_grenader_stalker_gran_instrument</precondition> <action>dialogs_zaton.transfer_zat_grenader_stalker_gran_instrument</action> <action>dialogs_jupiter.jup_b43_reward_for_second_artefact</action> <give_info>jup_azot_quest_sborki2_done</give_info> <next>121</next> <next>122</next> </phrase> <phrase id="121"> <text>jup_azot_quest_sborki_find_item_instr</text> <dont_has_info>jup_azot_quest_sborki1_done</dont_has_info> </phrase> <phrase id="122"> <text>jup_azot_quest_sborki_find_item_all</text> <has_info>jup_azot_quest_sborki2_done</has_info> <has_info>jup_azot_quest_sborki1_done</has_info> </phrase> <phrase id="13"> <text>jup_azot_quest_sborki_find_first_or_second_item</text> <precondition>dialogs_zaton.actor_has_first_and_second_grenader_item</precondition> <action>dialogs_zaton.transfer_zat_grenader_stalker_flash</action> <action>dialogs_zaton.transfer_zat_grenader_stalker_gran_instrument</action> <action>dialogs_jupiter.jup_b43_reward_for_both_artefacts</action> <give_info>jup_azot_quest_sborki1_done</give_info> <give_info>jup_azot_quest_sborki2_done</give_info> <next>131</next> </phrase> <phrase id="131"> <text>jup_azot_quest_sborki_find_end</text> </phrase> <phrase id="14"> <text>jup_azot_quest_sborki_find_nothing</text> <action>dialogs.break_dialog</action> </phrase> </phrase_list> </dialog>
начнем по-порядку разбирать особенности этого диалога:
- обязательными условиями его активации будет наличие инфопоршня выдачи задания jup_azot_quest_sborki_give, а также функции прекондишина actor_has_first_or_second_grenader_item
- будет происходить выбор четырех последующих фраз для генерации в зависимости от наличия у ГГ квестовых предметов.
- четвертая, имеющая нулевое значение отрицания- будет активна при любых условиях.
- первая и вторая- когда у ГГ есть один из двух необходимых предметов активны при наличии выполнения соответствующих прекондишинов if_actor_has_zat_grenader_stalker_flash и if_actor_has_zat_grenader_stalker_gran_instrument. при этом проиходит передача этого предмета НПС функции (transfer_....),получении от НПС награды на каждом этапе и выдача инфопорции на обновление задания. первый и второй этапы- взаимоисключающие. одновременно они не могут быть активны.
- третья- когда у ГГ есть оба необходимых предмета. происходит их передача и завершение квеста.
добавим все скриптовые функции в файл dialogs_zaton.script
function jup_azot_quest_sborki_give() task_manager.get_task_manager():give_task("geonezis_azot_quest_sborki_give") end function zat_b33_relocate_money_to_azot(first_speaker, second_speaker) dialogs.relocate_money_from_actor(first_speaker, second_speaker, 500) end function actor_has_first_or_second_grenader_item(first_speaker, second_speaker) return first_speaker:object("af_baloon") ~= nil or first_speaker:object("af_gold_fish") ~= nil end function actor_has_first_and_second_grenader_item(first_speaker, second_speaker) return first_speaker:object("af_baloon") ~= nil and first_speaker:object("af_gold_fish") ~= nil end function if_actor_has_zat_grenader_stalker_flash(first_speaker, second_speaker) return first_speaker:object("af_baloon") ~= nil and first_speaker:object("af_gold_fish") == nil end function if_actor_has_zat_grenader_stalker_gran_instrument(first_speaker, second_speaker) return first_speaker:object("af_gold_fish") ~= nil and first_speaker:object("af_baloon") == nil end function transfer_zat_grenader_stalker_flash(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_baloon") end function transfer_zat_grenader_stalker_gran_instrument(first_speaker, second_speaker) dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_gold_fish") end
Описывать их нет смысла- они все элементарные.
Аналогично не будем расписывать процесс добавления диалогов нпс и регистрацию инфопоршней. Все это приведено в предыдущем уроке.
Отметим особенности квеста.
В файле tm_zaton.ltx добавим код задания
--|> [geonezis_azot_quest_sborki_give] icon = ui_inGame2_Kontrakt_s_uchenimi prior = 1 storyline = false title = {+jup_azot_quest_sborki2_done -jup_azot_quest_sborki1_done} zat_sich_bring_1_name, {+jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_bring_2_name, {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} zat_sich_thanks_for_2_items_name, {-jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_sborki_started_name descr = {+jup_azot_quest_sborki2_done -jup_azot_quest_sborki1_done} zat_sich_bring_1_text, {+jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_bring_2_text, {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} zat_sich_thanks_for_2_items_text, {-jup_azot_quest_sborki1_done -jup_azot_quest_sborki2_done} zat_sich_sborki_started_text target = zat_b30_owl_stalker_trader_id condlist_0 = {+jup_azot_quest_sborki1_done +jup_azot_quest_sborki2_done} complete condlist_1 = {+jup_azot_quest_sborki_give =is_squad_enemy_to_actor(zat_b30_owl_stalker_trader_squad)} fail on_complete = %+zat_geonezis_example_quest_complete% reward_money = 10000
Тайтлы и дескрипшины задания будут обновляться после второго разговора с НПС, при получении соответствующих инфопоршней. То есть основное отличие от задания из урока № 33 это его обновление после передачи предметов, а не при их получении и наличии в инвентаре ГГ. По завершении задания будет выдаваться инфопоршень zat_geonezis_example_quest_complete необходимый для выдачи ачивмента, который в свою очередь будет теперь необходим для разблокировки следующего смыслового диалога zat_b30_owl_stalker_trader_buy_info
На этом урок завершен. Скачать пример можно тут: http://narod.ru/disk....ar.html
Автор уроков: Geonezis
Добавлено через 9 мин.:
Создание сложного квеста с использованием объекта класса inventory_box. Особенности- отсутствие диалогов, использование рестрикторов, выдача тайника в качестве награды. Реализация на X-Ray 1.6
Поставленная задача в данном уроке будет заключаться в обучении основным принципам создания сложного квеста в игре Сталкер Зов Припяти с добавление объекта класса 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
[zaton_1867] ; cse_abstract properties section_name = space_restrictor name = zat_hiding_place_56 position = -443.072845458984,11.5764598846436,-51.894603729248 direction = 0.000881000014487654,-0.242430001497269,-0.0560249984264374 ; cse_alife_object properties game_vertex_id = 253 distance = 0 level_vertex_id = 118142 object_flags = 0xffffef3e custom_data = <<END [secret] cfg = misc\secret_zaton.ltx END ; cse_shape properties shapes = shape0 shape0:type = sphere shape0:offset = 0,0,0 shape0:radius = 1 ; cse_alife_space_restrictor properties restrictor_type = 3
указывается уникальное имя, координаты спанва и файл конфига.
[zaton_1868] ; cse_abstract properties section_name = wpn_vintorez name = zaton_hiding_wpn_vintorez_1 position = -443.072845458984,11.5764598846436,-51.894603729248 direction = -0.0467090010643005,0.650978982448578,1.5079699754715 ; cse_alife_object properties game_vertex_id = 253 distance = 0 level_vertex_id = 118142 object_flags = 0xffffff0f custom_data = <<END [secret] name = zat_hiding_place_56 END ; cse_visual properties visual_name = dynamics\weapons\wpn_vintorez\wpn_vintorez ; cse_alife_item properties condition = 1 upgrades = ; cse_alife_item_weapon properties ammo_current = 90 upd:condition = 255 upd:weapon_flags = 0 upd:ammo_elapsed = 0 upd:addon_flags = 0 upd:ammo_type = 0 upd:weapon_state = 0 upd:weapon_zoom = 0 upd:current_fire_mode = 0 upd:grenade_mode = 0
указывается визуал модели предмета и принадлежность к тайнику.
Теперь создадим квестовый объект класса inventory_box
В файле алл спавна alife_zaton.ltx добавим секцию
[zaton_1866] ; cse_abstract properties section_name = inventory_box name = zat_test_container position = 415.890075683594,-3.38021898269653,231.797317504883 direction = 0.000230999998166226,-0.715035021305084,-0.000265999988187104 ; cse_alife_object properties game_vertex_id = 7 distance = 0 level_vertex_id = 1647866 object_flags = 0xffffff3f custom_data = <<END [story_object] story_id = zat_test_cont_id [logic] cfg = scripts\zaton\zat_test_conteiner.ltx END ; cse_visual properties visual_name = dynamics\equipments\quest\safe_container ; cse_alife_inventory_box properties tip = inventory_box_use
указывается:
- класс объекта section_name
- уникальное имя секции name
- координаты точки спавна
- прикрепленный файл логики cfg
- идентификатор для установления метки таргета квеста story_id
- визуал модели объекта
- тип объекта
зададим логику нашего объекта в файле zat_test_conteiner.ltx следующим образом:
[logic] active = ph_idle@full_locked [ph_idle@full_locked] nonscript_usable = false tips = zat_test_conteiner_full_locked on_info = {=actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)} ph_idle@has_two_key, {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@has_one_key, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@has_one_key on_info2 = {+zat_test_conteiner_open} ph_idle@open, {+zat_test_one_lock_open} ph_idle@locked on_use = {!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} %+zat_test_quest_find_to_open =spawn_object_in(zat_test_container_item:zat_test_cont_id)% [ph_idle@has_one_key] nonscript_usable = false tips = zat_test_conteiner_has_one_key on_use = {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@locked %=remove_item(zat_test_key_1) =play_sound(power_switch) +zat_test_one_lock_open%, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@locked %=remove_item(zat_test_key_2) =play_sound(power_switch) +zat_test_one_lock_open% on_info = {=actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)} ph_idle@has_two_key, {!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@full_locked on_info2 = {+zat_test_conteiner_open} ph_idle@open, {+zat_test_one_lock_open} ph_idle@locked [ph_idle@locked] nonscript_usable = false tips = zat_test_conteiner_locked on_info = {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@locked_has_second_key, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@locked_has_second_key on_info2 = {+zat_test_conteiner_open} ph_idle@open [ph_idle@locked_has_second_key] nonscript_usable = false tips = zat_test_conteiner_has_one_key on_use = {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@open %=remove_item(zat_test_key_1) =play_sound(power_switch) +zat_test_conteiner_open%, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@open %=remove_item(zat_test_key_2) =play_sound(power_switch) +zat_test_conteiner_open% on_info = {!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@locked on_info2 = {+zat_test_conteiner_open} ph_idle@open [ph_idle@has_two_key] nonscript_usable = false tips = zat_test_conteiner_has_two_key on_use = {=actor_has_item(zat_test_key_1) =actor_has_item(zat_test_key_2)} ph_idle@open %=play_sound(power_switch) =remove_item(zat_test_key_1) =remove_item(zat_test_key_2) +zat_test_conteiner_open% on_info = {=actor_has_item(zat_test_key_1) !actor_has_item(zat_test_key_2)} ph_idle@has_one_key, {=actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@has_one_key, {!actor_has_item(zat_test_key_2) !actor_has_item(zat_test_key_1)} ph_idle@full_locked on_info2 = {+zat_test_conteiner_open} ph_idle@open [ph_idle@open] nonscript_usable = true tips = zat_test_conteiner_open on_info = {-zat_test_conteiner_open} %+zat_test_conteiner_open%
Теперь более подробно ее разберем. имеющийся у нас схрон (предмет с данной логикой) будет иметь 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
условия при этом- возвращения в необходимые секции когда либо ключей нет, либо есть по одному.
- ключи заюзаны. ph_idle@open
ящик вскрыт- можно забирать инвентарное содержимое.
Квестовые предметы- ключи (zat_test_key_1, zat_test_key_2) и необходимый для получения из схрона предмет zat_test_container_item добавим в quest_items.ltx
[zat_test_key_1]:dev_flash_1 $spawn = "quest_items\zat_test_key_1" visual = dynamics\equipments\quest\key.ogf description = st_zat_test_key_1_descr inv_name = st_zat_test_key_1 inv_name_short = st_zat_test_key_1 can_trade = false quest_item = true cost = 0 inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 4 inv_grid_y = 15 [zat_test_key_2]:dev_flash_2 $spawn = "quest_items\zat_test_key_2" visual = dynamics\equipments\quest\key.ogf description = st_zat_test_key_2_descr inv_name = st_zat_test_key_2 inv_name_short = st_zat_test_key_2 can_trade = false quest_item = true cost = 0 inv_grid_width = 1 inv_grid_height = 1 inv_grid_x = 4 inv_grid_y = 15 [zat_test_container_item]:device_pda $spawn = "quest_items\zat_test_container_item" visual = dynamics\equipments\quest\notes_document_case_3.ogf inv_weight = 0.05 inv_grid_width = 2 inv_grid_height = 1 inv_grid_x = 18 inv_grid_y = 20 $prefetch = 16 description = st_zat_test_container_item_descr inv_name = st_zat_test_container_item inv_name_short = st_zat_test_container_item can_trade = false quest_item = true cost = 0
Сам квест имеет следующий вид:
--|> [geonezis_test_quest] icon = ui_inGame2_Karti_mestnosti prior = 1 storyline = false title = {+zat_test_quest_find_to_open} zat_test_quest_title1, {-zat_test_quest_find_to_open} zat_test_quest_title0 descr = {+zat_test_quest_find_to_open} zat_test_quest_text1, {-zat_test_quest_find_to_open} zat_test_quest_text0 target = {+zat_test_quest_find_to_open} zat_test_cont_id, {-zat_test_quest_find_to_open} zat_test_cont_id condlist_0 = {=actor_has_item(zat_test_container_item)} complete on_complete = %+zat_test_quest_complete% ;=give_treasure(zat_hiding_place_31:zat_hiding_place_49
В принципе он элементарный. До первого юзания ящика активна первая секция, после активна секция на поиск ключей. Квест завершается при наличии у ГГ необходимого и взятого из ящика предмета =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) Выдача тайника происходит по завершении квеста. Может быть сделано это двумя способами или внутри скрипта, или внутри задания.
Включение квестового скрипта в обработку аналогично как и в других уроках. Выдача самого квеста на старте игры также по аналогии.
Скачать файл с уроком можно по ссылке http://narod.ru/disk....ar.html
Автор уроков: Geonezis
- 1
-
Создание квеста с добавлением дополнительных внутриэтапных заданий. Особенности- отсутствие диалогов, использование физических объектов класса physic_destroyable_object в качестве квестовых предметов. Реализация на X-Ray 1.6
В данном уроке речь пойдет о реализации задания подобного тому что было рассмотрено в предыдущем уроке. В отличие от него теперь добавление внутриэтапных заданий будет завязано не на применение рестрикторов, а на использование физических объектов специального класса. Задание секций этих объектов будет осуществлено также как и в моде SGM (автор GeJorge) Еще одной особенностью будет добавление класса метки объекта (также по аналогии с SGM) что позволит отказаться от применения рестрикторов в определенных моментах. Выдача задания осуществляется при старте игры. Диалогов нет.
Само задание:
ГГ на ПДА приходит сообщение о необходимости обыска трех точек с установленными там объектами. Необходимо выяснить что это за объекты и вернуться в стартовую точку. После этого задание автоматически завершается. Выдача награды не предусмотрена.
Необходимые для редактирования файлы:
1. конфигурационные в (gamedata\configs\gameplay\)
-info_zaton.xml
2. конфигурационные в (gamedata\configs\misc\)
- tm_zaton.ltx
- quest_items.ltx
3. конфигурационные в (gamedata\configs\text\rus\)
- st_quests_zaton.xml
- ui_st_screen.xml
4. конфигурационные в (gamedata\configs\models\)
- dynamic_objects.ltx
5. конфигурационные в (gamedata\configs\scripts\zaton\)
- файлы логик рестрикторов и объектов
6. скриптовый в (gamedata\scripts\)
- bind_stalker.script
- new_tasks.script
7. all.spawn. (gamedata\spawns\)
- alife_zaton.ltx
8. физическая модель в (gamedata\meshes\dynamics\box\)
- konteyner.ogf
Некоторые этапы добавления изменений будут приведены с сокращением, ввиду их схожести с аналогичными в других уроках. Акцент будет сделан на впервые вносимые изменения и аспекты.
Изначально создадим новые классы квестовых предметов.
Класс родительского предмета метка будет соответствовать стандартному квестовому device_pda, но будет иметь визуал "нулевого значения". поэтому при написания квестов и установки тагета в них можно будет воспользоваться именно этим приемом, а не добавлением цели на индивидуальном айди отдельного рестриктора. пропишем в quest_items.ltx секцию
[quest_spot]:device_pda $spawn = "devices\quest_spot" visual = dynamics\scene_objects\part\part_none.ogf can_take = false
сами добавленные метки имеют следующие секции. как видим они являются потомками родительского класса quest_spot. также указывается айди метки по которому будет прописываться таргет story_id.
[zat_test_stalker_container_1_spot]:quest_spot story_id = zat_test_stalker_container_1_spot [zat_test_stalker_container_2_spot]:quest_spot story_id = zat_test_stalker_container_2_spot [zat_test_stalker_container_3_spot]:quest_spot story_id = zat_test_stalker_container_3_spot
Новый физический объект используемый нами в квесте объявим в файле dynamic_objects.ltx
. Он будет иметь свой уникальный класс наследуемый от основного physic_destroyable_object Секции конфигов будут следующими:
[box_quest_item]:physic_destroyable_object $spawn = "dynamic_objects\box\box_quest_item" visual = dynamics\box\konteyner.ogf [zat_test_stalker_container_1]:box_quest_item custom_data = scripts\zaton\inventory_boxs\zat_test_stalker_container_1.ltx [zat_test_stalker_container_2]:box_quest_item custom_data = scripts\zaton\inventory_boxs\zat_test_stalker_container_2.ltx [zat_test_stalker_container_3]:box_quest_item custom_data = scripts\zaton\inventory_boxs\zat_test_stalker_container_3.ltx
В основной секции указывается физическая модель предмета visual. В уникальных секциях указываются секции конфигов custom_data
Логика добавленных предметов будет задаваться в файлах zat_test_stalker_container_....ltx следующим образом:
[logic] active = ph_idle@retranslator_take [ph_idle@retranslator_take] nonscript_usable = false tips = st_take_the_quest_item on_use = ph_idle@retranslator_heavy %+zat_test_quest_item_1_used% on_info = {+zat_test_quest_complete} sr_idle@nil [ph_idle@retranslator_heavy] nonscript_usable = false tips = st_quest_item_is_used on_info = {+zat_test_quest_complete} sr_idle@nil [sr_idle@nil]
- активная секция логики ph_idle@retranslator_take
- первоначальная активная надпись считывается из секции st_take_the_quest_item
- при юзании предмета произойдет выдача инфопорции zat_test_quest_item_1_used и переход во вторую секцию логики ph_idle@retranslator_heavy
- при этом изменяется активная надпись на st_quest_item_is_used
- при получении инфопорции zat_test_quest_complete логика обнуляется.
Теперь необходимо создать основной рестриктор на обход которого будет завязана основа квеста.
Сам рестриктор создаем в all.spawn по аналоги с предыдущими уроками.
Логика рестриктора из файла zat_restr_logic_main.ltx имеет следующий вид:
[logic] active = sr_idle@start [sr_idle@start] on_info = {+zat_test_quest_begin -zat_test_quest_rest_main_come =actor_in_zone(zat_test_quest_restrictor_main)} %=give_task(geonezis_zat_test_example_task_1) =give_task(geonezis_zat_test_example_task_2) =give_task(geonezis_zat_test_example_task_3) +zat_test_quest_rest_main_come% on_info2 = {+zat_test_quest_rest_main_come} sr_idle@wait [sr_idle@wait] on_info = {+zat_test_quest_all_item_used -zat_test_quest_complete =actor_in_zone(zat_test_quest_restrictor_main)} %+zat_test_quest_complete% on_info2 = {+zat_test_quest_complete} sr_idle@nil [sr_idle@nil]
разберем ее:
- имеет три секции первая активная, во вторую переходит по совокупности полученных условий при обновлении квеста. - при этом происходит выдача трех подзаданий.
- для перехода в нулевую секцию необходимо завершение задания.
Выдача задания будет происходит при старте ГГ одновременно с квестами основного сюжета. Для этого добавим инфопоршень выдачи и сам квест в секцию логики [sr_idle] оригинального рестриктор zat_b101_logic.ltx
=give_task(geonezis_zat_test_example_task) +zat_test_quest_begin
Определим сам квест с подзаданиями:
основной квест:
[geonezis_zat_test_example_task] icon = ui_inGame2_Osobiy_zakaz prior = 1 storyline = false title = {+zat_test_quest_all_item_used} zat_test_example_title2, {+zat_test_quest_rest_main_come -zat_test_quest_all_item_used} zat_test_example_title1, {-zat_test_quest_rest_main_come} zat_test_example_title0 descr = {+zat_test_quest_all_item_used} zat_test_example_text2, {+zat_test_quest_rest_main_come -zat_test_quest_all_item_used} zat_test_example_text1, {-zat_test_quest_rest_main_come} zat_test_example_text0 target = {+zat_test_quest_all_item_used} zat_restr_main_id, {+zat_test_quest_rest_main_come -zat_test_quest_all_item_used} nil, {-zat_test_quest_rest_main_come} zat_restr_main_id condlist_0 = {+zat_test_quest_complete} complete on_complete = %=inc_faction_goodwill_to_actor(stalker:50)%
внутренние подквесты (приведен только первый, два других по аналогии):
[geonezis_zat_test_example_task_1] icon = ui_inGame2_Osobiy_zakaz prior = 1 storyline = false title = zat_test_example_1_title0 descr = zat_test_example_1_text0 target = zat_test_stalker_container_1_spot condlist_0 = {+zat_test_quest_item_1_used} complete
Особенности:
- При старте задания необходимо посетить зону основного рестриктора, устанавливается тагет на zat_restr_main_id. В момент посещения активируются подквесты, выдается инфопоршень zat_test_quest_rest_main_come, задание обновляется, его тагет уходит в nil. после юзания всех квестовых айтемов созданных в начале объектов проиходит завершение всех трех подквестов, основной квест обновляется снова. чтобы завершить его необходимо снова посетить точку основного рестриктора.
Скриптовая функция которая отвечает за создание трех основных квестовых предметов и выдачу завершающего основное задание инфопоршня прописывается в файл new_tasks.script, и объявляется в апдейте актора файла bind_stalker.script
new_tasks.task_spec()
сама функция
--/Квест Example function task_spec() local level_name=level.name() if level_name=="zaton" then if has_alife_info("zat_test_quest_begin") and not has_alife_info("zat_test_quest_spawn_items") then alife():create("zat_test_stalker_container_1_spot",vector():set(210.996811,15.980440,480.381104),1323235,6) alife():create("zat_test_stalker_container_2_spot",vector():set(267.914307,17.374102,483.001709),1424536,6) alife():create("zat_test_stalker_container_3_spot",vector():set(305.260254,18.979174,532.515625),1484018,287) news_manager.send_tip(db.actor, "Для начала займи указанную точку", nil, nil, 14000) db.actor:give_info_portion("zat_test_quest_spawn_items") end if has_alife_info("zat_test_quest_rest_main_come") and not has_alife_info("zat_test_quest_spawn_items_2") then alife():create("zat_test_stalker_container_1",vector():set(210.996811,15.980440,480.381104),1323235,6) alife():create("zat_test_stalker_container_2",vector():set(267.914307,17.374102,483.001709),1424536,6) alife():create("zat_test_stalker_container_3",vector():set(305.260254,18.979174,532.515625),1484018,287) news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо исследовать все контейнеры.", nil, nil, 14000) db.actor:give_info_portion("zat_test_quest_spawn_items_2") end if has_alife_info("zat_test_quest_item_1_used") and has_alife_info("zat_test_quest_item_2_used") and has_alife_info("zat_test_quest_item_3_used") and not has_alife_info("zat_test_quest_all_item_used") then db.actor:give_info_portion("zat_test_quest_all_item_used") end end end
описание:
- первоначально по выдаче задания происходит создания меток дополнительных подквестов.
- при выдачи самих подквестов происходит создание самих предметов необходимых для их выполнения.
- при наличии трех инфопорций полученных от юзания всех предметов выдается общий инфопоршень на обновление основного задания.
Все инфопоршни необходимые нам пропишем в файле info_zaton.xml
Всю текстовую транскрипцию определим в xml-файлах.
На этом урок завершен.
Файл с отработанным задание можно скачать тут: http://narod.ru/disk....ar.html
Создание квеста с добавлением дополнительных внутриэтапных заданий. Особенности- отсутствие диалогов, добавление тайников в качестве квестовых предметов. Реализация на X-Ray 1.6
Основной отличительной особенностью этого урока от предыдущего является только то, что выполнение внутренних подквестов будет завязано на исследовании тайников (взятие квестовых предметов из них). Будет показан принцип добавление в игру тайников определенных отдельным классом и их заполнение различными предметами. Поэтому урок будет приведен по максимуму сокращенно, с указанием только основных особенностей и списком всех используемых файлов. Полностью просмотреть вносимые изменения вы сможете скачав пример с отработанным заданием или же изучив материал из предыдущего урока.
Необходимые для изменения файлы:
1. конфигурационные в (gamedata\configs\gameplay\)
-info_zaton.xml
2. конфигурационные в (gamedata\configs\misc\)
- tm_zaton.ltx
- quest_items.ltx
3. конфигурационные в (gamedata\configs\text\rus\)
- st_quests_zaton.xml
4. конфигурационные в (gamedata\configs\scripts\zaton\)
- файлы логик рестрикторов и объектов
6. скриптовый в (gamedata\scripts\)
- bind_stalker.script
- new_tasks.script
7. all.spawn. (gamedata\spawns\)
- alife_zaton.ltx
Определим в файле quest_items.ltx две родительские секции для создания предмета нового класса "квестовый рюкзак".
[default_inventory_box] GroupControlSection = spawn_group discovery_dependency = $spawn = "devices\default_inventory_box" class = O_INVBOX cform = skeleton visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf script_binding = bind_physic_object.init radius = 3 inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 0 inv_grid_y = 38 cost = 3500 can_take = true inv_weight = 1.14 description = inv_name = inv_name_short = [quest_rukzak]:default_inventory_box $spawn = "devices\quest_rukzak" visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf
В дальнейшем нами будет использоваться переопределенный класс quest_rukzak с заданным нами визуалом dynamics\devices\dev_rukzak\dev_rukzak.ogf. В классе default_inventory_box определяются другие основные параметры.
Вся остальная структура добавляемых изменений аналогично указанным ранее. По другом задается только основной квестовый скрипт в файле new_tasks.script
--/Квест Example function task_spec() local level_name=level.name() if level_name=="zaton" then if has_alife_info("zat_test_quest_begin") and not has_alife_info("zat_test_quest_spawn_items") then alife():create("zat_test_stalker_container_1_spot",vector():set(210.996811,15.980440,480.381104),1323235,6) alife():create("zat_test_stalker_container_2_spot",vector():set(267.914307,17.374102,483.001709),1424536,6) alife():create("zat_test_stalker_container_3_spot",vector():set(305.260254,18.979174,532.515625),1484018,287) news_manager.send_tip(db.actor, "Для начала займи указанную точку", nil, nil, 14000) db.actor:give_info_portion("zat_test_quest_spawn_items") end if has_alife_info("zat_test_quest_rest_main_come") and not has_alife_info("zat_test_quest_spawn_items_2") then local x1_cell=alife():create("quest_rukzak",vector():set(210.996811,15.980440,480.381104),1323235,6) parse_table=utils.parse_spawns("zat_test_quest_item_info_1,af_medusa,wpn_ak74,stalker_outfit,wpn_pm") for k,v in pairs(parse_table) do for i=1,v.prob do alife():create(v.section,vector(),0,0,x1_cell.id) end end local x2_cell=alife():create("quest_rukzak",vector():set(267.914307,17.374102,483.001709),1424536,6) parse_table=utils.parse_spawns("zat_test_quest_item_info_2,af_ice,wpn_abakan,dolg_outfit,wpn_pm") for k,v in pairs(parse_table) do for i=1,v.prob do alife():create(v.section,vector(),0,0,x2_cell.id) end end local x3_cell=alife():create("quest_rukzak",vector():set(305.260254,18.979174,532.515625),1484018,287) parse_table=utils.parse_spawns("zat_test_quest_item_info_3,af_fire,wpn_lr300,svoboda_light_outfit,wpn_pm") for k,v in pairs(parse_table) do for i=1,v.prob do alife():create(v.section,vector(),0,0,x3_cell.id) end end news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо исследовать все тайники.", nil, nil, 14000) db.actor:give_info_portion("zat_test_quest_spawn_items_2") end if (not has_alife_info("zat_test_quest_item_1_used")) and has_alife_info("zat_test_quest_spawn_items_2") and db.actor:object("zat_test_quest_item_info_1") then db.actor:give_info_portion("zat_test_quest_item_1_used") end if (not has_alife_info("zat_test_quest_item_2_used")) and has_alife_info("zat_test_quest_spawn_items_2") and db.actor:object("zat_test_quest_item_info_2") then db.actor:give_info_portion("zat_test_quest_item_2_used") end if (not has_alife_info("zat_test_quest_item_3_used")) and has_alife_info("zat_test_quest_spawn_items_2") and db.actor:object("zat_test_quest_item_info_3") then db.actor:give_info_portion("zat_test_quest_item_3_used") end if has_alife_info("zat_test_quest_item_1_used") and has_alife_info("zat_test_quest_item_2_used") and has_alife_info("zat_test_quest_item_3_used") and not has_alife_info("zat_test_quest_all_item_used") then db.actor:give_info_portion("zat_test_quest_all_item_used") end end end
Особенности:
- при старте задания создаются квестовые метки
- при достижении позиции актора внутри основного рестриктора происходит создание трех квестовых тайников quest_rukzak по заданным координатам и их заполнение различными предметами.
- при обыски тайника и взятии ГГ квестового предмета из него происходит выдача инфопоршеней на завершение внутренних подзаданий.
- после обыска всех трех тайников выдается основной инфопоршень на обновление основного задания.
Файл с отработанным заданием можно скачать тут: http://narod.ru/disk....ar.html
Автор уроков: Geonezis
- 1
-
Создание квеста с добавлением дополнительных внутриэтапных подзаданий. Особенности- отсутствие диалогов, использование рестрикторов. Реализация на X-Ray 1.6
Автор урока: GEONEZIS
Поставленная задача в данном уроке будет заключаться в обучении основным принципам создания среднего по сложности квеста в игре Сталкер Зов Припяти без использования каких-либо диалогов. Выдача задания будет осуществляться автоматически, в данном случае зададим ее при старте игры. Также будет показан прием добавления во внутреннею структуру основного задания нескольких дополнительных подквестов и объяснение применение рестриторов на всех поставленных этапах.
Само задание следующее: При старте ГГ на ПДА придет сообщение о необходимости установки схронов. Осущесвляется выдача квеста. Необходимо забрать утерянные рюкзаки и заложить их в трех указанных точках. После этого задание автоматически завершается. Выдача награды не предусмотрена.
Необходимые для редактирования файлы:
1. конфигурационные в (gamedata\configs\gameplay\)
-character_desc_jupiter.xml
-info_zaton.xml
2. конфигурационные в (gamedata\configs\misc\)
- tm_jupiter.ltx
- quest_items.ltx
- devices.ltx
- death_generic.ltx
3. конфигурационные в (gamedata\configs\text\rus\)
- st_quests_zaton.xml
- st_items_quest.xml
- ui_st_screen.xml
4. конфигурационные в (gamedata\configs\misc\trade\)
- trade_generic.ltx
5. конфигурационные в (gamedata\configs\ui\)
- game_tutorials.xml
6. конфигурационные в (gamedata\configs\scripts\zaton\)
- файлы логик рестрикторов
7. скриптовый в (gamedata\scripts\)
- ui_si.script
- bind_stalker.script
- new_tasks.script
- xr_effects.script
8. all.spawn. (gamedata\spawns\)
- alife_zaton.ltx
На первоначальном этапе определимся с квестовыми предметами. Всего их шесть. Три будут отвечать за айтем рюкзака до его закладки. Они будут являться потомками основного родительского класса device_pda. Другие три будут определены иным классом, им будет соответствовать установленная логика и они отвечают за рюкзаки после установки схрона. Пропишем секции их конфигов в файле quest_items.ltx (Здесь и далее буду приводить конфиг только одной секции, остальные задаются аналогично только с изменением числовых значений в имени).
[zat_example_taynik_1_item]:device_pda $spawn = "quest_items\zat_example_taynik_1_item" description = zat_example_taynik_item_descr inv_name = zat_example_taynik_item_name visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf inv_weight = 2 story_id = zat_example_taynik_1_item can_trade = false quest_item = true inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 0 inv_grid_y = 38 .......... [zat_example_taynik_1]:default_inventory_box custom_data = scripts\zaton\inventory_boxs\zat_example_taynik_1.ltx ..........
Первый конфиг не содержит в себе прикрепленного файла в дополнительной секции и определяется как простой квестовый предмет, второй же содержит прикрепленный конфиг с логикой его zat_example_taynik_1.ltx
Для определении секции zat_example_taynik_1 необходимо определить родительский класс
default_inventory_box в файле devices.ltx
[default_inventory_box] GroupControlSection = spawn_group discovery_dependency = $spawn = "devices\default_inventory_box" class = O_INVBOX cform = skeleton visual = dynamics\devices\dev_rukzak\dev_rukzak.ogf script_binding = bind_physic_object.init radius = 3 inv_grid_width = 2 inv_grid_height = 2 inv_grid_x = 0 inv_grid_y = 38 cost = 3500 can_take = true inv_weight = 1.14 description = inv_name = inv_name_short =
В этой секции указываются основные параметры такие как основной класс, форма, визуал.
Кроме того определим его основную логику в конфигурационном файле zat_example_taynik_1.ltx
logic] active = ph_idle@nothing [ph_idle@nothing] nonscript_usable = true tips = st_taynik_check_descr
Здесь указывается активная секция это ph_idle@nothing, а также ее содержание.
Тайник после установки можно использовать, т.е. возможно его наполнение различными предметами, также при наведении на него будет активна надпись из секции st_taynik_check_descr
Зарегистрируем конфиги первой секции предмета тайник zat_example_taynik_..._item.
В файле death_generic.ltx пропишем код
..... zat_example_taynik_1_item = true zat_example_taynik_2_item = true zat_example_taynik_3_item = true
В файле ui_si.script добавим
"zat_example_taynik_1_item", "zat_example_taynik_2_item", "zat_example_taynik_3_item",
Обозначим секции, логику и работу рестрикторов необходимых для выполнения внутренних подквестов.
В файле alife_zaton.ltx обозначим три секции
[zaton_999999011] ; cse_abstract properties section_name = space_restrictor name = zat_test_quest_restrictor_1 position = 210.996811,15.980440,480.381104 direction = 0,0.841602981090546,0 ; cse_alife_object properties game_vertex_id = 6 distance = 0 level_vertex_id = 1323235 object_flags = 0xffffff3e custom_data = <<END [story_object] story_id = zat_restr_1_id [logic] cfg = scripts\zaton\zat_restr_logic_1.ltx END ; cse_shape properties shapes = shape0 shape0:type = box shape0:axis_x = 4,0,0 shape0:axis_y = 0,3.13100147247314,0 shape0:axis_z = 0,0,2 shape0:offset = 0,0,0
В секции указываются координаты и тип рестрикторов, их идентификатор, имя, тип и размер шейпа.
В файле логики zat_restr_logic_1.ltx пропишем:
[logic] active = sr_idle@start [sr_idle@start] on_info = {+zat_test_quest_rest_main_come =actor_in_zone(zat_test_quest_restrictor_1) =actor_has_item(zat_example_taynik_1_item)} sr_idle@tutorial %=run_tutorial(zat_test_quest_1_tutor)% on_info2 = {+zat_test_quest_restr_1} sr_idle@nil [sr_idle@tutorial] on_info = {+zat_test_quest_rest_main_come !actor_in_zone(zat_test_quest_restrictor_1)} sr_idle@start %=stop_tutorial% on_info2 = {+zat_test_quest_restr_1} sr_idle@nil on_info3 = {!has_active_tutorial} sr_idle@start [sr_idle@nil]
Отметим особенности:
Активная секция sr_idle@start переход на вторую происходит по достижению трех условий
- наличие инфопоршня активности второго этапа основного задания (zat_test_quest_rest_main_come)
- актор находиться в зоне действия рестриктора
- наличие в его инвентаре zat_example_taynik_1_item
При выполнении всех этих условий выполняется работа рестриктора определяемая в туториале zat_test_quest_1_tutor
При получении инфопоршня zat_test_quest_restr_1 происходит переход в третью нулевую секцию логики рестриктора sr_idle@nil
При выхода актора из зоны рестриктора его работа прекращается и логика переключается во второе состояние sr_idle@tutorial из которого она может снова перейти в первое или в третье.
Объявим в файле game_tutorials.xml туторы выполняемые в работе рестрикторов
<zat_test_quest_1_tutor> <global_wnd/> <item> <disabled_key>quit</disabled_key> <length_sec/> <action id="use" finalize="1">xr_effects.zat_test_quest_1</action> <guard_key>use</guard_key> <grab_input>0</grab_input> <main_wnd> <auto_static start_time="0" length_sec="5000" x="512" y="660" width="300" height="60" alignment="c" stretch="1"la_cyclic="1" la_texture="1" la_alpha="1"> <text font="graffiti22" r="225" g="225" b="250" a="255" align="c">zat_test_quest_tips</text> </auto_static> </main_wnd> </item> </zat_test_quest_1_tutor>
Основные параметры это функция скрипта обработчика действия xr_effects.zat_test_quest_1 и активная надпись из секции zat_test_quest_tips
В файле xr_effects.scripts определим функции
function zat_test_quest_1(actor, npc) if xr_conditions.actor_in_zone(actor, npc, {"zat_test_quest_restrictor_1"}) then remove_item(actor, npc, {"zat_example_taynik_1_item"}) alife():create("zat_example_taynik_1",vector():set(210.996811,15.980440,480.381104),1323235,6) db.actor:give_info_portion("zat_test_quest_restr_1") end end
Опишем ее:
- если выполнено условие нахождение актора в зоне рестриктора zat_test_quest_restrictor_1
то происходит удаление из инвентаря ГГ айтема первого конфига тайника zat_example_taynik_1_item, создается по заданным координатам второй zat_example_taynik_1 и выдается инфопоршень zat_test_quest_restr_1
Выдача задания будет происходит при старте ГГ одновременно с квестами основного сюжета. Для этого добавим инфопоршень выдачи и сам квест в секцию логики [sr_idle] оригинального рестриктор zat_b101_logic.ltx
=give_task(geonezis_zat_test_example_task) +zat_test_quest_begin
Выдача подквестов будет осуществлять в логике другого рестриктора zat_restr_logic_main.ltx Его секция прописывается в all.spawn по аналогии с предыдущими. Сама логика имеет следующий вид:
[logic] active = sr_idle@start [sr_idle@start] on_info = {+zat_test_quest_begin -zat_test_quest_rest_main_come =actor_in_zone(zat_test_quest_restrictor_main)} %=give_task(geonezis_zat_test_example_task_1) =give_task(geonezis_zat_test_example_task_2) =give_task(geonezis_zat_test_example_task_3) +zat_test_quest_rest_main_come% on_info2 = {+zat_test_quest_rest_main_come} sr_idle@nil [sr_idle@nil]
В активной секции при попадании актора в зону рестриктора происходит выдача внутренних подквестов и переход логики в нулевое состояние.
Определим сам квест с подзаданиями:
[geonezis_zat_test_example_task] icon = ui_inGame2_Osobiy_zakaz prior = 1 storyline = false title = {+zat_test_quest_rest_main_come} zat_test_example_title1, {-zat_test_quest_rest_main_come} zat_test_example_title0 descr = {+zat_test_quest_rest_main_come} zat_test_example_text1, {-zat_test_quest_rest_main_come} zat_test_example_text0 target ={+zat_test_quest_rest_main_come} nil, {-zat_test_quest_rest_main_come} zat_restr_main_id condlist_0 = {+zat_test_quest_complete} complete on_complete = %=inc_faction_goodwill_to_actor(stalker:50)%
Подквесты:
[geonezis_zat_test_example_task_1] icon = ui_inGame2_Osobiy_zakaz prior = 1 storyline = false title = zat_test_example_1_title descr = zat_test_example_123_text target = zat_restr_1_id condlist_0 = {+zat_test_quest_restr_1} complete on_complete = %=inc_faction_goodwill_to_actor(stalker:50)%
Особенности:
- При старте задания необходимо посетить зону основного рестриктора, устанавливается тагет на zat_restr_main_id. В момент посещения активируются подквесты, выдается инфопоршень zat_test_quest_rest_main_come, задание обновляется, его тагет уходит в nill. после взятия всех квестовых айтемов- необходимо завершение всех трех подквестов для получения инфопоршня zat_test_quest_complete
Скриптовая функция которая отвечает за создание трех основных квестовых предметов и выдачу завершающего основное задание инфопоршня прописывается в файл new_tasks.script, и объявляется в апдейте актора файла bind_stalker.script
new_tasks.task_spec()
сама функция
--/Квест Example function task_spec() local level_name=level.name() if level_name=="zaton" then if has_alife_info("zat_test_quest_begin") and not has_alife_info("zat_test_quest_spawn_items") then alife():create("zat_example_taynik_1_item",vector():set(248.498016,14.915686,484.567932),1391296,6) alife():create("zat_example_taynik_2_item",vector():set(247.778076,14.872326,484.085999),1390040,6) alife():create("zat_example_taynik_3_item",vector():set(247.055069,14.796996,483.116058),1388814,6) news_manager.send_tip(db.actor, "Чтобы выполнить тестовое задание необходимо установить все тайники. Подбери рюкзаки оставленные сталкерами", nil, nil, 14000) db.actor:give_info_portion("zat_test_quest_spawn_items") end if has_alife_info("zat_test_quest_restr_1") and has_alife_info("zat_test_quest_restr_2") and has_alife_info("zat_test_quest_restr_3") and not has_alife_info("zat_test_quest_complete") then db.actor:give_info_portion("zat_test_quest_complete") end end end
Описание:
При нахождении ГГ на локации Затон и наличии инфопоршня zat_test_quest_begin создаются квестовые айтемы и отправляется мессадж на пда ГГ.
При завершении всех трех подквестов выдается инфопоршень zat_test_quest_complete завершения основного.
Все инфопоршни необходимые нам пропишем в файле info_zaton.xml
..... <info_portion id="zat_test_quest_restr_1"></info_portion> <info_portion id="zat_test_quest_restr_2"></info_portion> <info_portion id="zat_test_quest_restr_3"></info_portion> <info_portion id="zat_test_quest_spawn_items"></info_portion> <info_portion id="zat_test_quest_begin"></info_portion> <info_portion id="zat_test_quest_complete"></info_portion> <info_portion id="zat_test_quest_rest_main_come"></info_portion> .....
Всю текстовую транскрипцию определим в соответствующий xml-файлах. Квестовые айтемы тайников можно занести в файлы торговли.
На этом урок завершен.
Файл с отработанным задание можно скачать тут: http://narod.ru/disk....ar.html
- 2
-
Evgeny2009, всего у наемников 4 квеста.
- Пропавший отряд
- Разбитый караван
- Покушение на Валета
- Слабый маяк
Если ты их все выполнил, то других заданий не будет.
idolo, попробуй переиграть с момента взятия квеста.
-
Создание многоэтапного квеста на последовательный поиск предметов. Реализация на X-Ray 1.6
Автор урока: GEONEZIS
Поставленная задача состоит в обучения принципам построения сложных многоходовых заданий на чистой игре Сталкер Зов Припяти. Будет показан процесс построения сложного диалога с ветвлением, последовательный спавн квестовых предметов через скрипт и собственно структура многоуровнего квеста.
Задание следующее. Новиков просит ГГ принести для него разбросанные по локации сканеры аномалий. Квест будет построен таким образом что необходим исключительно поэтапный вариант его прохождения, то есть от одной точки к другой, без каких-либо вариантов. Получить один предмет раньше другого не будет предоставляться возможным.
Необходимые для редактирования файлы:
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и в самом низу добавим два диалога. Один активный при старте задания. Второй на завершение. В принципе можно было объединить их в один, но рассмотрим более легкий вариант. Однока при этом внесем разнообразие в процесс выдачи задания предоставив несколько вариантов его получения внутри диалога. Этот несколько освежит стандартные методы диалогостроения, когда все они делаются последовательными, без каких-либо вариантов.
1- ый диалог:<dialog id="jup_b6_scientist_tech_quest_anomalies_scaner"> <dont_has_info>jup_novikov_quest_zaton_scanner_start</dont_has_info> <phrase_list> <phrase id="0"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_0</text> <next>1</next> </phrase> <phrase id="1"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_1</text> <next>2</next> </phrase> <phrase id="2"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_2</text> <action>dialogs_jupiter.jup_b6_create_first_scaner</action> <next>3</next> </phrase> <phrase id="3"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_3</text> <next>4</next> <next>5</next> <next>6</next> </phrase> <phrase id="4"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_4</text> <next>41</next> </phrase> <phrase id="41"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_41</text> <next>401</next> <next>402</next> </phrase> <phrase id="401"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_401</text> <next>4011</next> </phrase> <phrase id="4011"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_4011</text> <next>4012</next> </phrase> <phrase id="4012"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_4012</text> <next>4013</next> <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action> </phrase> <phrase id="4013"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_4013</text> <give_info>jup_novikov_quest_zaton_scanner_start</give_info> </phrase> <phrase id="402"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_402</text> <next>4021</next> </phrase> <phrase id="4021"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_4021</text> <next>4022</next> </phrase> <phrase id="4022"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_4022</text> <next>4023</next> <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action> </phrase> <phrase id="4023"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_4023</text> <give_info>jup_novikov_quest_zaton_scanner_start</give_info> </phrase> <phrase id="5"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_5</text> <next>51</next> </phrase> <phrase id="51"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_51</text> <next>52</next> </phrase> <phrase id="52"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_52</text> <next>53</next> </phrase> <phrase id="53"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_53</text> <action>dialogs_jupiter.jup_b6_to_actor_give_spez_outfit</action> <next>531</next> <next>532</next> </phrase> <phrase id="531"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_531</text> <next>5312</next> </phrase> <phrase id="5312"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_5312</text> <next>5313</next> <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action> </phrase> <phrase id="5313"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_5313</text> <give_info>jup_novikov_quest_zaton_scanner_start</give_info> </phrase> <phrase id="532"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_532</text> <next>5321</next> <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action> </phrase> <phrase id="5321"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_5321</text> <give_info>jup_novikov_quest_zaton_scanner_start</give_info> </phrase> <phrase id="6"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_6</text> <next>61</next> </phrase> <phrase id="61"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_61</text> <next>611</next> </phrase> <phrase id="611"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_611</text> <action>dialogs_jupiter.give_novikov_zaton_scaner_quest</action> <next>6111</next> </phrase> <phrase id="6111"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_6111</text> <give_info>jup_novikov_quest_zaton_scanner_start</give_info> </phrase> </phrase_list> </dialog>
2-ой диалог:<dialog id="jup_b6_scientist_tech_quest_anomalies_scaner_end"> <has_info>jup_novikov_quest_zaton_scanner_have_6</has_info> <dont_has_info>jup_novikov_quest_zaton_scanner_end</dont_has_info> <precondition>dialogs_jupiter.actot_have_all_zaton_scaner</precondition> <phrase_list> <phrase id="0"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_end_0</text> <action>dialogs_jupiter.actot_to_novikov_give_zaton_scaner</action> <next>1</next> </phrase> <phrase id="1"> <text>jup_b6_scientist_tech_quest_anomalies_scaner_end_1</text> <give_info>jup_novikov_quest_zaton_scanner_end</give_info> </phrase> </phrase_list> </dialog>
Сразу же пропишем русскую транскрипцию в 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. Добавим в конце файла код:<!--New Quests--> <info_portion id="jup_novikov_quest_zaton_scanner_start"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_end"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_have_1"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_create_2"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_have_2"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_create_3"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_have_3"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_create_4"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_have_4"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_create_5"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_have_5"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_create_6"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_have_6"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_create_7"></info_portion> <info_portion id="jup_novikov_quest_zaton_scanner_have_7"></info_portion>
Добавим наши диалоги НПС (В данном случае Новикову) для этого в файл character_desc_jupiter.xmlв его профиль <specific_character id="jup_b6_scientist_tech" team_default="1">добавим строки диалогов..... <actor_dialog>jup_b6_scientist_tech_quest_anomalies_scaner</actor_dialog> <actor_dialog>jup_b6_scientist_tech_quest_anomalies_scaner_end</actor_dialog> .....
С диалогами и инфопоршнями разобрались теперь добавим необходимые для выполнения квеста предметы.
В файл quest_items.ltxпропишем семь секций предметов zat_spec_anomaly_scanner_№. Все предметы являются квестовыми- невозможна их продажа и выкладывание из инвентаря ГГ.[zat_spec_anomaly_scanner_1]:device_pda $spawn = "quest_items\zat_spec_anomaly_scanner_1" description = zat_spec_anomaly_scanner_1_descr inv_name = zat_spec_anomaly_scanner_1_name visual = dynamics\equipments\quest\scanner_anomaly.ogf inv_weight = 2 story_id = zat_spec_anomaly_scanner_1 can_trade = false quest_item = true inv_grid_width = 1 inv_grid_height = 2 inv_grid_x = 10 inv_grid_y = 23
В файл death_generic.ltxпропишем: (в данном случае также необязательно так как генерации в инвентаре НПС нет)....... zat_spec_anomaly_scanner_1 = true zat_spec_anomaly_scanner_2 = true zat_spec_anomaly_scanner_3 = true zat_spec_anomaly_scanner_4 = true zat_spec_anomaly_scanner_5 = true zat_spec_anomaly_scanner_6 = true zat_spec_anomaly_scanner_7 = true .....
В файл ui_si.scriptв таблицу info_tableдобавим (для спавна, в принципе работать будет и без внесения в этот файл):........ "zat_spec_anomaly_scanner_1" "zat_spec_anomaly_scanner_2" "zat_spec_anomaly_scanner_3" "zat_spec_anomaly_scanner_4" "zat_spec_anomaly_scanner_5" "zat_spec_anomaly_scanner_6" "zat_spec_anomaly_scanner_7" ........
В файл 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пропишем торговлю. также нужно добавлять индивидуально во все остальные файлы конфигов торговли. (но не обязательно)..... zat_spec_anomaly_scanner_1 ;NO TRADE zat_spec_anomaly_scanner_2 ;NO TRADE zat_spec_anomaly_scanner_3 ;NO TRADE zat_spec_anomaly_scanner_4 ;NO TRADE zat_spec_anomaly_scanner_5 ;NO TRADE zat_spec_anomaly_scanner_6 ;NO TRADE zat_spec_anomaly_scanner_7 ;NO TRADE ......
С квестовыми предметами также разобрались, теперь необходимо разобраться со скриптами квеста. Собственно теперь мы и подходим к основной сути нашего урока, в этом этапе заключен его основной смысл.
В файле 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():--/Квест:Сканеры аномалий function task_spec() local level_name=level.name() if level_name=="zaton" then if has_alife_info("jup_novikov_quest_zaton_scanner_start") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_1")) and db.actor:object("zat_spec_anomaly_scanner_1") then db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_1") end if has_alife_info("jup_novikov_quest_zaton_scanner_have_1") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_2")) then alife():create("zat_spec_anomaly_scanner_2",vector():set(-304.058,12.450,-159.233),339472,21) db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_2") end if has_alife_info("jup_novikov_quest_zaton_scanner_create_2") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_2")) and db.actor:object("zat_spec_anomaly_scanner_2") then db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_2") end if has_alife_info("jup_novikov_quest_zaton_scanner_have_2") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_3")) then alife():create("zat_spec_anomaly_scanner_3",vector():set(-68.024,1.398,-164.391),807200,235) db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_3") end if has_alife_info("jup_novikov_quest_zaton_scanner_create_3") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_3")) and db.actor:object("zat_spec_anomaly_scanner_3") then db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_3") end if has_alife_info("jup_novikov_quest_zaton_scanner_have_3") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_4")) then alife():create("zat_spec_anomaly_scanner_4",vector():set(10.842,8.966,-394.252),964903,8) db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_4") end if has_alife_info("jup_novikov_quest_zaton_scanner_create_4") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_4")) and db.actor:object("zat_spec_anomaly_scanner_4") then db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_4") end if has_alife_info("jup_novikov_quest_zaton_scanner_have_4") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_5")) then alife():create("zat_spec_anomaly_scanner_5",vector():set(272.490,11.985,-289.525),1431789,43) db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_5") end if has_alife_info("jup_novikov_quest_zaton_scanner_create_5") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_5")) and db.actor:object("zat_spec_anomaly_scanner_5") then db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_5") end if has_alife_info("jup_novikov_quest_zaton_scanner_have_5") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_6")) then alife():create("zat_spec_anomaly_scanner_6",vector():set(400.209,-0.202,439.740),1630730,242) db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_6") end if has_alife_info("jup_novikov_quest_zaton_scanner_create_6") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_6")) and db.actor:object("zat_spec_anomaly_scanner_6") then db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_6") end if has_alife_info("jup_novikov_quest_zaton_scanner_have_6") and (not has_alife_info("jup_novikov_quest_zaton_scanner_create_7")) then alife():create("zat_spec_anomaly_scanner_7",vector():set(-347.855,40.160,-383.796),259035,29) db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_create_7") end if has_alife_info("jup_novikov_quest_zaton_scanner_create_7") and (not has_alife_info("jup_novikov_quest_zaton_scanner_have_7")) and db.actor:object("zat_spec_anomaly_scanner_7") then db.actor:give_info_portion("jup_novikov_quest_zaton_scanner_have_7") end end end
Основная особенность скрипта это последовательный спавн квестовых предметов. Последующий будет создаваться только после того как был найден предыдущий. Также происходит выдача инфопоршней используемых в структуре самого квеста. Еще одна особенность это установка дополнительной проверки в зависимости от локации.
Созданный нами скрипт необходимо обьявить в функции апдейта актора 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_№), а не при взятии предмета.
На этом урок завершен.
Файл с отработанным заданием можно скачать здесь: http://narod.ru/disk....ar.html
- 2
-
LLIBED, а лог ошибки ошибки никак не привести? Последние 25 строк под спойлер. Без него только такие рекомендации: пробуй запустить игру от имени администратора, отключи автосохранение в меню.
-
Sutorihin2011, после переустановки необходима новая игра. старые сейвы не пойдут. возможен только вариант их загрузки если были сохранены файлы pstor-переменных в gamedata\configs\mod_parameters\save_data\
Рос, скорее всего мог быть поврежден файл gamedata/configs/mod_parameters/save_data/save_data.sgm поэтому придется переустанавливать мод и начинать новую игру.
kalter, посмотри в меню игры настройки громкости звука- был иногда такой баг что значения ползунков обнулялись.
=Wanderer=, этот параметр создается в реестре вручную. в меню regedit выбирай правка\создать\параметр DWWORD
Строгое предупреждение от модератора monkЗаглавные буквы отсутствуют. Устное замечание. -
Sutorihin2011, приходить туда нужно когда в первый раз возвращаешься с Юпитера при активном задании на юзание Скатов. У одного из бандитов-алкашей будет КПК. С его активации стартует квест.
rocket1972, попробуй откатиться и переиграть. Если все же словил глюк и переигровка не поможет, то придется в ручную выдавать нужные инфопорши для продолжения этой квестовой ветки.
-
Serega2211,
1. места спавна тайников были изменены.
2. информатора на скадовске никогда в sgm не было.
3. основная сюжетная линия на оригинальных локациях CoP не изменялась с предыдущих версий.
-
Strannik726, нет. Это второстепенный квест- на прохождение сюжета не влияет.
lotosman каждый квестовый предмет в этом задании имеет по 5 точек рандомного спавна на территории базы. Поэтому конкретно для твоего случае тебе врятли дадут ответ. Как вариант можешь зайти на оф. сайт SGM и в теме помощи прохождения версии 2.2 посмотреть два поста со скринами некоторых точек спавна. Приводить участки кода из скрипта с координатами этих точек я не буду, так как все-равно это мало кому поможет.
-
Sidorenko, Sync отсутствие спавна артефактов является следствием отсутствия выбросов на новых локациях. Поэтому поиск артефактов в аномалиях следует проводить пока только на оригинальных локациях.
-
rocket1972 и остальные у кого такая ошибка с логом:
[error]Description : ...files\stalker Зов Припяти\gamedata\scripts\_g.script:4413: attempt to index local 'file' (a nil value)
запускайте игру от имени администратора и отключите опцию авто сохранения в меню.
Добавлено через 4 мин.:
rocket1972 по первому логу на 2.1 в подземелье Агропрома. Необходимо перейти на статическое освещение, снизить игровые настройки по минимуму и откатиться с предыдущего сейва.
-
Zidvan, лучше перекачай и переставь. Скорее всего ты что-то напортачил при установке. Этого вылета при старте игры никогда не было.
Или чтобы конкретно его вылечить нужно прописать в файл w_sections.ltx (gamedata\configs\weapons\weapons\) следующую секцию:
[mod_ak74_damage] hit_power = 0.42,0.42,0.42,0.42 hit_impulse = 200 hit_type = fire_wound fire_distance = 250 bullet_speed = 550 rpm = 700 rpm_empty_click = 200 silencer_hit_power = 0.41,0.41,0.41,0.41 silencer_hit_impulse = 200 silencer_fire_distance = 210 silencer_bullet_speed = 400
-
артем, создай и пропиши эту секцию wpn_crosshair_spec_5 в файл scopes_16.xml (и scopes.xml) путь (gamedata\configs\ui\). Также придется добавлять туда секции и остальных прицельные сеток от weid.
Добавлено через 4 мин.:
York, вылет в подземельях Агропрома лечиться откаткой к предыдущим сейвам и переигровкой с понижением игровых настроек на минимум.
-
Фикс динамических новостей
1.Рандомную ошибку вида (решение от makdm)
gamedata\scripts\vs_send_news.script:726: attempt to concatenate local 'SndName' (a nil value)
2. Ошибку на Агропроме (решение от GEONEZIS) вида
gamedata\scripts\vs_send_news.script:72: attempt to index field '?' (a nil value)
скачать
паньчо, твой второй лог этим лечится.
Добавил в шапку темы. Спасибо. (fox6666)
Вооружение, оружие вообще и их ТТХ
в Говорилка
Опубликовано
Всем привет. Видео по авиационным пушкам НС-23 и НР-23. Ими вооружались первые советские реактивные самолеты второй половины сороковых годов.
Смотреть