
- •Урок 1. Создание квеста на одновременный поиск двух различных предметов.
- •Урок 3. Реализация квеста на одновременный поиск заданного количества различных предметов, определенных в рандомной таблице. Определение новой условной функции в xr_conditions.Script
- •Урок 4. Построение квеста на одновременный поиск заданного количества заранее опеределенных различных предметов.
- •Урок 6. Реализация квеста на выполнение определенного действия через логику рестриктора, работа с туториалом. Последовательность в выполнении на несколько этапов.
- •Урок 9. Создание квеста с добавлением дополнительных внутри этапных заданий. Особенности - отсутствие диалогов, добавление тайников в качестве квестовых предметов.
- •Урок 10. Реализация квеста с использованием объекта класса inventory_box со сложной логикой. Особенности - отсутствие диалогов, использование рестрикторов, выдача тайника в качестве награды.
- •На этом первый курс квестостроения завершен.
Урок 9. Создание квеста с добавлением дополнительных внутри этапных заданий. Особенности - отсутствие диалогов, добавление тайников в качестве квестовых предметов.
Данный урок практически полностью аналогичен тому, что был изложен ранее. Его основной отличительной особенностью от предыдущего является только то, что выполнение внутренних подквестов будет завязано на исследовании тайников (взятие квестовых предметов из них). Будет показан принцип добавление в игру тайников определенных отдельным классом и их заполнение различными предметами. Поэтому урок будет приведен по максимуму сокращенно, с указанием только основных особенностей и списком всех используемых файлов. Полностью просмотреть вносимые изменения вы сможете скачав пример с отработанным заданием или же изучив материал из предыдущего урока.
Используемые файлы:
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 две родительские секции для создания предмета нового класса "квестовый рюкзак".
Code
[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
Code
--/Квест 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 по заданным координатам и их заполнение различными предметами. - при обыски тайника и взятии ГГ квестового предмета из него происходит выдача инфопоршеней на завершение внутренних подзаданий. - после обыска всех трех тайников выдается основной инфопоршень на обновление основного задания.