- •Урок 1. Создание квеста на одновременный поиск двух различных предметов.
- •Урок 3. Реализация квеста на одновременный поиск заданного количества различных предметов, определенных в рандомной таблице. Определение новой условной функции в xr_conditions.Script
- •Урок 4. Построение квеста на одновременный поиск заданного количества заранее опеределенных различных предметов.
- •Урок 6. Реализация квеста на выполнение определенного действия через логику рестриктора, работа с туториалом. Последовательность в выполнении на несколько этапов.
- •Урок 9. Создание квеста с добавлением дополнительных внутри этапных заданий. Особенности - отсутствие диалогов, добавление тайников в качестве квестовых предметов.
- •Урок 10. Реализация квеста с использованием объекта класса inventory_box со сложной логикой. Особенности - отсутствие диалогов, использование рестрикторов, выдача тайника в качестве награды.
- •На этом первый курс квестостроения завершен.
Урок 3. Реализация квеста на одновременный поиск заданного количества различных предметов, определенных в рандомной таблице. Определение новой условной функции в xr_conditions.Script
Разберем принцип построения квеста следующего вида. НПС выдает ГГ задание на необходимость поиска и доставки определенного количества различных пердметов. В данном случае квест будет выдаваться Тремором, на снабжение его медикаментами. Это задание подобно тому, что в оригинале выдавали голодные наемники на Затоне. Его рассмотрение и разбор поможет понять принцип добавления новых функций, условия, выполнения которых будет выступать в качестве возможности обновления этапов внутри квеста. Изначально будет определен ассортимент квестовых предметов для доставки, но ГГ имеет свободу в выборе того, какие конкретно квестовые предметы ему приносить. Они могут быть или все одного типа, или же по несколько единиц различного. Необходимые для редактирования файлы:
1. конфигурационные в (gamedata\configs\gameplay\) -character_desc_zaton.xml -dialogs_zaton.xml -info_zaton.xml -character_desc_general.xml (необязательно) 2. конфигурационные в (gamedata\configs\misc\) - tm_zaton.ltx 3. конфигурационные в (gamedata\configs\text\rus\) - st_dialogs_zaton.xml - st_quests_zaton.xml 4. скриптовый в (gamedata\scripts\)
- xr_conditions.script - dialogs_zaton.script
Для начала создадим два простеньких диалога для выдачи и завершения квеста. В файл dialogs_zaton.xml в самом низу добавим два диалога: На выдачу квеста:
Code
<dialog id="zat_test_medic_dialog_about_supplies">
<dont_has_info>zat_test_medic_bring_supplies</dont_has_info>
<phrase_list>
<phrase id="0">
<text>zat_test_medic_dialog_about_supplies_0</text>
<next>1</next>
</phrase>
<phrase id="1">
<text>zat_test_medic_dialog_about_supplies_1</text>
<give_info>zat_test_medic_bring_supplies</give_info>
<action>dialogs_zaton.zat_medic_test_quest_give</action>
</phrase>
</phrase_list>
</dialog>
На завершение квеста:
Code
<dialog id="zat_test_medic_dialog_find_supplies">
<precondition>dialogs_zaton.zat_test_actor_has_needed_medic</precondition>
<has_info>zat_test_medic_bring_supplies</has_info>
<dont_has_info>zat_test_medic_task_done</dont_has_info>
<phrase_list>
<phrase id="1">
<text>zat_test_medic_dialog_find_supplies_1</text>
<action>dialogs_zaton.zat_test_transfer_medic_supplies</action>
<give_info>zat_test_medic_task_done</give_info>
</phrase>
<phrase id="0">
<text>zat_test_medic_dialog_find_supplies_0</text>
<next>1</next>
</phrase>
</phrase_list>
</dialog>
Чтобы понимать о чем в диалогах идет речь сразу пропишем их транскрипцию в файле st_dialogs_zaton.xml
Code
<string id="zat_test_medic_dialog_about_supplies_0">
<text>Я мог бы принести медикаменты раненным, если интересует...</text>
</string>
<string id="zat_test_medic_dialog_about_supplies_1">
<text>Ну принеси. Простых аптечек, анабиотиков, бинтов... Штук десть. Хоть что-то для них, только бы на всех хватило.</text>
</string>
<string id="zat_test_medic_dialog_find_supplies_0">
<text>Держи медикаменты.</text>
</string>
<string id="zat_test_medic_dialog_find_supplies_1">
<text>Не ожидал... Спасибо. Для раненных в самый раз это лишним шансом выжить будет...Удачи.</text>
</string></string> <string id="zat_b30_owl_stalker_trader_small_quests_9"> <text>Бывай.</text> </string>
Теперь разберем по порядку то, что добавили.
Диалог на выдачу квеста имеет следующую элементарную структуру:
- во время его завершения срабатывает актишин на выполнение функции старта задания
<action>dialogs_zaton.zat_medic_test_quest_give</action> при этом происходит выдача инфопоршня zat_test_medic_bring_supplies, который блокирует дальнейшее активное состояние диалога (<dont_has_info>zat_test_medic_bring_supplies</dont_has_info>)
Теперь поясню особенности второго диалога: - наличие тега <has_info> zat_test_medic_bring_supplies</has_info> обеспечивает возможность инициализации диалога после выдачи квеста. - наличие тега <dont_has_info> zat_test_medic_task_done</dont_has_info> обеспечивает блокировку диалога после завершение квеста. - прекондишн <precondition>dialogs_zaton.zat_test_actor_has_needed_medic</precondition>
обеспечивает блокирование диалога до момента наличия в инвентаре ГГ нужных квестовых предметов.
- работа вызываемой через акшион
<action>dialogs_zaton.zat_test_transfer_medic_supplies</action> функции обеспечивает передачу квестовых предметов от ГГ к НПС.
Объявим используемые инфопоршни в info_zaton.xml. Добавим в конце файла код:
Code
<!-- New quest --> <info_portion id="zat_test_medic_bring_supplies"></info_portion>
<info_portion id="zat_test_medic_task_done"></info_portion>
Добавим наши диалоги НПС (В данном случае Тремору) для этого в файл character_desc_zaton.xml в его профиль<specific_character id="zat_b22_stalker_medic" team_default="1"> добавим две строки диалогов
Code
..... <actor_dialog>zat_test_medic_dialog_about_supplies</actor_dialog> <actor_dialog>zat_test_medic_dialog_find_supplies</actor_dialog> .....
С диалогами и инфопоршнями разобрались, теперь рассмотрим необходимые скриптовые функции: В файл dialogs_zaton.script добавим код
Code
function zat_medic_test_quest_give()
task_manager.get_task_manager():give_task("geonezis_test_bring_supplies")
end
function zat_test_actor_has_needed_medic(first_speaker, second_speaker)
local item_sections = {
[1] = "medkit",
[2] = "drug_anabiotic",
[3] = "bandage"
}
local needed = 10
local count = 0
local item_section
local function calc(temp, item)
if item:section() == item_section then
count = count + 1
end
end
for k,v in pairs(item_sections) do
item_section = v
get_story_object("actor"):iterate_inventory(calc, actor)
end
return count >= needed
end
function zat_test_transfer_medic_supplies(first_speaker, second_speaker)
local npc = dialogs.who_is_npc(first_speaker, second_speaker)
local actor = dialogs.who_is_actor(first_speaker, second_speaker)
local i = 10
local j = 0
local section
local item_sections = {
[1] = "medkit",
[2] = "drug_anabiotic",
[3] = "bandage"
}
local function transfer_object_item(temp, item)
if (item:section() == section and i ~= 0) then
actor:transfer_item(item, npc)
i = i - 1
end
end
for k,v in pairs(item_sections) do
section = v
j = i
actor:iterate_inventory(transfer_object_item, nil)
if ((j - i) ~= 0) then
news_manager.relocate_item(actor, "out", section, j - i)
end
end
end
Теперь по порядку разберем эти функции:
- zat_medic_test_quest_give - выдача квеста - zat_test_actor_has_needed_medic - возвращает значение при проверки на наличие в инвентаре ГГ определенного количества необходимых предметов (в данном случае это придметы на выбор: medkit, drug_anabiotic, bandage) которые задаются в виде таблицы определямой локальную переменную item_sections. Также в ней опеределяются локальные переменные необходимого числа предметов needed равного 10, переменная счетчика count изначально равная нулю, а также локальная функция счетчика calc(temp, item) во время работы функции проиходит вызов цикла подсчета количества заданных предметов в инвентаре ГГ. Когда их количество станет больше или равно заданному значение функция прекращает свою работу и возвращает значение. - zat_test_transfer_medic_supplies – примерно по тому же принципу организованная функция обработки передачи этих предметов от ГГ к НПС.
В файле xr_conditions.script определим новую условную функцию, необходимую нам при работе самого квеста.
Code
function zat_test_actor_has_needed_medic(actor, npc, p)
return (dialogs_zaton.zat_test_actor_has_needed_medic(actor, npc)) or (has_alife_info("zat_test_medic_task_done"))
end
данная условная функция возвращает условие выполненяемое в ранее определенной диалоговой или же дополнительно условие на проверку наличия инфопоршня завершения квеста.
Самое основное это квест. В файле tm_zaton.ltx прописываем
Code
--|>
[geonezis_test_bring_supplies]
icon = ui_inGame2_Pripasi
prior = 1
storyline = false
title = {=zat_test_actor_has_needed_medic} zat_test_quest_bring_supplies_title1, zat_test_quest_bring_supplies_title0
descr = {=zat_test_actor_has_needed_medic} zat_test_quest_bring_supplies_text1, zat_test_quest_bring_supplies_text0
target = {=zat_test_actor_has_needed_medic} zat_b22_stalker_medic
condlist_0 = {+zat_test_medic_task_done} complete
condlist_1 = {=is_squad_enemy_to_actor(zat_b22_medic)} fail
Разберем то, что происходит в процессе выполнения квеста и собственно его структуру. При выдаче задания метка будет принимать нулевое значение, активен первый этап, когда необходимо собрать нужные ГГ предметы. При их наличии (то есть при срабатывание заданной нами функции zat_test_actor_has_needed_medic) этап квеста будет обновлен, метка переброситься на НПС Тремор. При получении инфопорции zat_test_medic_task_done квест завершается. В случае срабатывания второго условия {=is_squad_enemy_to_actor(zat_b22_medic)} (сквад в котором определен наш НПС становиться враждебным по отношению к ГГ) задание будет провалено.
Пропишем русскую транскрипцию дескрипшинов и тайтлов квеста в st_quests_zaton.xml
Code
<string id="zat_test_quest_bring_supplies_title0">
<text>Медикаменты: достаньте медикаменты для медика</text>
</string>
<string id="zat_test_quest_bring_supplies_text0">
<text>Местный врач Тремор просит принести ему медикаменты - десять аптечек, бинтов или анабиотиков.</text>
</string>
<string id="zat_test_quest_bring_supplies_title1">
<text>Припасы: отнести медикаменты Тремору</text>
</string>
<string id="zat_test_quest_bring_supplies_text1">
<text>Необходимо отнести собранные медикаменты врачу на Скадовск.</text>
</string>
По желанию для проверки в character_desc_general.xml при старте ГГ пропишем нужные нам медикаменты. На этом урок завершен.
