Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретическая часть.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
450.05 Кб
Скачать

Урок 4. Построение квеста на одновременный поиск заданного количества заранее опеределенных различных предметов.

Поставленная задача в данном уроке будет следующей: необходимо разобрать принципы построения сложного задания, когда заранее известно количество необходимых предметов, а также конкртено определено какие предметы нам будут нужны. Пусть идея квеста будет такой: Борода дает ГГ поручение собрать 4 вида артефактов: Ломоть мяса в количестве 4 штук, Вспышка в количетсве 2 штук, Выверт- также в количетсве 2 штук, Глаз- одна штука. Аретафакты будут впоследствии переданы ученым, поэтому для большей конспирации приносить их Бороде можно будет только в специально отведенные часы.  Также ГГ имеет абсолютную свободу в выборе того факта какие артефакты приносить в первую очередь. Можно сделать это сразу, собрав все, или же приносить по частям, собрав нужное количество артов одного типа.

Необходимые для редактирования файлы:

1. конфигурационные в (gamedata\configs\gameplay\)  -character_desc_zaton.xml  -dialogs_zaton.xml  -info_zaton.xml  -character_desc_general.xml (необязательно)  2. конфигурационные в (gamedata\configs\misc\)  - tm_zaton.ltx  3. конфигурационные в (gamedata\configs\text\rus\)  - st_dialogs_zaton.xml  - st_quests_zaton.xml  4. скриптовый в (gamedata\scripts\)  - dialogs_zaton.script 

Для начала создадим два диалога для выдачи задания и основного на внутриэтапное прохождение.  В файл dialogs_zaton.xml в самом низу добавим два диалога:  На выдачу квеста: 

Code

<dialog id="zat_boroda_about_artefact_quest_2_first_dialog">

<dont_has_info>zat_test_boroda_arts_quest_begin</dont_has_info>

<phrase_list>

<phrase id="0">

<text>zat_boroda_about_artefact_quest_2_first_talking_0</text>

<next>1</next>

</phrase>

<phrase id="1">

<text>zat_boroda_about_artefact_quest_2_first_talking_1</text>

<next>2</next>

</phrase>

<phrase id="2">

<text>zat_boroda_about_artefact_quest_2_first_talking_2</text>

<next>3</next>

</phrase>

<phrase id="3">

<text>zat_boroda_about_artefact_quest_2_first_talking_3</text>

<next>4</next>

</phrase>

<phrase id="4">

<text>zat_boroda_about_artefact_quest_2_first_talking_4</text>

<next>5</next>

</phrase>

<phrase id="5">

<text>zat_boroda_about_artefact_quest_2_first_talking_5</text>

<next>6</next>

</phrase>

<phrase id="6">

<text>zat_boroda_about_artefact_quest_2_first_talking_6</text>

<next>7</next>

<give_info>zat_test_boroda_arts_quest_begin</give_info>

<action>dialogs_zaton.give_ozersky_fenix_2_quest</action>

</phrase>

<phrase id="7">

<text>zat_boroda_about_artefact_quest_2_first_talking_7</text>

</phrase>

</phrase_list>

</dialog> 

На обновление и завершение квеста: 

Code

<dialog id="zat_boroda_about_artefact_quest_2_second_dialog">

<has_info>zat_test_boroda_arts_quest_begin</has_info>

<dont_has_info>zat_test_boroda_arts_quest_done</dont_has_info>

<phrase_list>

<phrase id="0">

<text>zat_boroda_about_artefact_quest_2_second_talking_0</text>

<next>1</next>

<next>0110</next>

</phrase>

<phrase id="0110">

<precondition>dialogs_zaton.is_not_zat_test_arts_time</precondition>

<text>zat_boroda_about_artefact_quest_2_second_talking_13</text>

<next>0111</next>

</phrase>

<phrase id="0111">

<text>zat_boroda_about_artefact_quest_2_second_talking_14</text>

<action>dialogs.break_dialog</action>

</phrase>

<phrase id="1">

<precondition>dialogs_zaton.is_zat_test_arts_time</precondition>

<precondition>dialogs.is_surge_not_running</precondition>

<text>zat_boroda_about_artefact_quest_2_second_talking_1</text>

<next>2</next>

<next>3</next>

<next>4</next>

<next>5</next>

<next>8</next>

<next>88</next>

</phrase>

<phrase id="2">

<precondition>dialogs_zaton.actor_has_3_af_lomot</precondition>

<dont_has_info>jf2_a1</dont_has_info>

<text>zat_boroda_about_artefact_quest_2_second_talking_2</text>

<next>000</next>

<action>dialogs_zaton.give_3_af_lomot_to_ozersky</action>

<give_info>jf2_a1</give_info>

</phrase>

<phrase id="3">

<precondition>dialogs_zaton.actor_has_2_af_benglfire</precondition>

<dont_has_info>jf2_a2</dont_has_info>

<text>zat_boroda_about_artefact_quest_2_second_talking_3</text>

<next>000</next>

<action>dialogs_zaton.give_2_af_benglfire_to_ozersky</action>

<give_info>jf2_a2</give_info>

</phrase>

<phrase id="4">

<precondition>dialogs_zaton.actor_has_2_af_vivert</precondition>

<dont_has_info>jf2_a3</dont_has_info>

<text>zat_boroda_about_artefact_quest_2_second_talking_4</text>

<next>000</next>

<action>dialogs_zaton.give_2_af_vivert_to_ozersky</action>

<give_info>jf2_a3</give_info>

</phrase>

<phrase id="5">

<precondition>dialogs_zaton.actor_has_1_af_glas</precondition>

<dont_has_info>jf2_a4</dont_has_info>

<text>zat_boroda_about_artefact_quest_2_second_talking_5</text>

<next>000</next>

<action>dialogs_zaton.give_1_af_glas_to_ozersky</action>

<give_info>jf2_a4</give_info>

</phrase>

<phrase id="000">

<text>zat_boroda_about_artefact_quest_2_second_talking_6</text>

<next>0001</next>

</phrase>

<phrase id="0001">

<text>zat_boroda_about_artefact_quest_2_second_talking_7</text>

</phrase>

<phrase id="8">

<precondition>dialogs_zaton.actor_has_af_info</precondition>

<text>zat_boroda_about_artefact_quest_2_second_talking_8</text>

<next>9</next>

</phrase>

<phrase id="9">

<text>zat_boroda_about_artefact_quest_2_second_talking_9</text>

<give_info>zat_test_boroda_arts_quest_done</give_info>

<next>10</next>

</phrase>

<phrase id="10">

<text>zat_boroda_about_artefact_quest_2_second_talking_10</text>

<next>11</next>

</phrase>

<phrase id="11">

<text>zat_boroda_about_artefact_quest_2_second_talking_11</text>

</phrase>

<phrase id="88">

<precondition>dialogs_zaton.actor_not_has_af_info</precondition>

<text>zat_boroda_about_artefact_quest_2_second_talking_12</text>

<action>dialogs.break_dialog</action>

</phrase>

</phrase_list>

</dialog> 

Чтобы понимать о чем в диалогах идет речь сразу пропишем их транскрипцию в файле st_dialogs_zaton.xml 

Code

<string id="zat_boroda_about_artefact_quest_2_first_talking_0">

<text>Мое почтение, организм.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_first_talking_1">

<text>А, майор- гуд что пришел. Герман сказал мне что ты собирался помочь мне со сбром артефактов. Ну как, дело в силе?</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_first_talking_2">

<text>Да, в силе. А зечем конкретно вам нужны артефакты?</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_first_talking_3">

<text>Ученые будут осуществлять настройку прибора необходимую для улучшенного поиска артефактов. Поэтому им понадобяться некоторые расходные материалы. Не парься, их будет не так много- по несколько артефактов каждого типа рождаемой аномалии. Всего четыре типа- химический, электростатический, термальный и гравитационный.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_first_talking_4">

<text>Какие артефакты им нужны, скажи точнее.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_first_talking_5">

<text>Им понадобяться три артефакта "ломоть мяса", два "бенгальских огня", два "выверта" и один "глаз". Как только найдешь необходимое число артефактов одного вида можешь приносить.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_first_talking_6">

<text>Думаю, что уже следует приступить к поискам.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_first_talking_7">

<text>Только учти, как найдешь че- ко мне приходи только ночью, с двух до четрырех. Ну шоб без особого палева было...</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_0">

<text>По поводу артефактов...</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_1">

<text>Как раз вовремя. Ну че надыбал?</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_2">

<text>Я принес три артефакта "ломоть мяса".</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_3">

<text>Я достал два "бенгальских огня".</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_4">

<text>Держи вот парочка "вывертов".</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_5">

<text>Возьми, я добыл артефакт "глаз".</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_6">

<text>Хорошо, я буду ждать пока ты соберешь остальные артефакты.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_7">

<text>Жди, я скоро буду.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_8">

<text>Все, я доставил все артефакты, что заказывали.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_9">

<text>Замечательно, теперь я смогу передать их ученым, чтобы те смогли осуществить точную настройку прототипа основываясь на имеющихся материалах.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_10">

<text>Какие еще поставки необходимо будет провести?</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_11">

<text>На этапе моя работа заключалась только в этом.</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_12">

<text>Пока ничего не принес...</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_13">

<text>Ну и херли ты приперся? Сказано ведь ночью дела делать будем. Свали пока...</text>

</string>

<string id="zat_boroda_about_artefact_quest_2_second_talking_14">

<text>Ну забыл, с кем не бывает...</text>

</string> 

Теперь разберем по порядку то, что добавили.  Диалог на выдачу квеста имеет следующую элементарную структуру: 

- происходит выдача инфопоршня  zat_test_boroda_arts_quest_begin (при старте квеста).  - наличие в диалоге тегов <dont_has_info> zat_test_boroda_arts_quest_begin</dont_has_info> 

обеспечивает его блокировку после получения задания.  - работа акшиона <action> dialogs_zaton.give_ozersky_fenix_2_quest</action> обеспечивает выдачу квеста.  Теперь самое основное - поясню особенности второго сложного диалога.

Работает он по следующему алгоритму:

- наличие тега <has_info>zat_test_boroda_arts_quest_begin</has_info> обеспечивает возможность инициализации диалога после выдачи квеста.  - наличие <dont_has_info>zat_test_boroda_arts_quest_done</dont_has_info> обеспечивает блокировку диалога после завершение квеста. 

- выполняется первая проверка на срабатывание предусловия, когда необходимо выяснить настало ли время для возможности передачи найденных артефактов или нет. При этом есть разделение, когда работает один прекогндишн, а когда второй.

<precondition>dialogs_zaton.is_not_zat_test_arts_time</precondition> - время не настало, при этом диалог завершается.

<precondition>dialogs_zaton.is_zat_test_arts_time</precondition> <precondition>dialogs.is_surge_not_running</precondition> - выброс в данные момент не происходит и время необходимое нам достигнуто.

- если второе условие верно, то становиться активен следующий выбор ветвления, в зависимости от того какие артефакты сейчас принес ГГ. Доступно 4 ответвления на передачу каждого из типов артов и получение соответсвующего инфопоршня для обновления этапов задания. При этом же есть и другие условия когда ГГничего не принес или же уже все передал.

Объявим используемые инфопоршни в info_zaton.xml  Добавим в конце файла код: 

Code

<!-- New quest -->           <info_portion id="jf2_a1"></info_portion>

<info_portion id="jf2_a2"></info_portion>

<info_portion id="jf2_a3"></info_portion>

<info_portion id="jf2_a4"></info_portion>

<info_portion id="zat_test_boroda_arts_quest_done"></info_portion>

<info_portion id="zat_test_boroda_arts_quest_begin"></info_portion>

Добавим наши диалоги НПС (В данном случае Бороде) для этого в файл character_desc_zaton.xml в его профиль <specific_character id="zat_a2_stalker_barmen" team_default="1"> добавим две строки диалогов 

Code

.....  <actor_dialog>zat_boroda_about_artefact_quest_2_first_dialog</actor_dialog>

<actor_dialog>zat_boroda_about_artefact_quest_2_second_dialog</actor_dialog> ..... 

С диалогами и инфопоршнями разобрались, теперь рассмотрим необходимые скриптовые функции:  В файл dialogs_zaton.script добавим код 

Code

function give_ozersky_fenix_2_quest()

task_manager.get_task_manager():give_task("geonezis_zat_test_artefats_quest")

end

function is_zat_test_arts_time(first_speaker, second_speaker)

if level.get_time_hours() >= 1 and level.get_time_hours() < 4 then

if level.get_time_hours() > 1 then

return true

elseif level.get_time_minutes() >= 45 then

return true

end

end

return false

end

function is_not_zat_test_arts_time(first_speaker, second_speaker)

if level.get_time_hours() >= 1 and level.get_time_hours() < 4 then

if level.get_time_hours() > 1 then

return false

elseif level.get_time_minutes() >= 45 then

return false

end

end

return true

end

function actor_has_3_af_lomot(first_speaker, second_speaker)

local cnt = 0

local function zat_arts_count(npc, item)

if item:section() == "af_mincer_meat" then

cnt = cnt + 1

end

end

db.actor:iterate_inventory(zat_arts_count, nil)

if cnt > 2 then

return true

end

return false

end

function actor_has_2_af_benglfire(first_speaker, second_speaker)

local cnt = 0

local function zat_arts_count(npc, item)

if item:section() == "af_electra_sparkler" then

cnt = cnt + 1

end

end

db.actor:iterate_inventory(zat_arts_count, nil)

if cnt > 1 then

return true

end

return false

end

function actor_has_2_af_vivert(first_speaker, second_speaker)

local cnt = 0

local function zat_arts_count(npc, item)

if item:section() == "af_vyvert" then

cnt = cnt + 1

end

end

db.actor:iterate_inventory(zat_arts_count, nil)

if cnt > 1 then

return true

end

return false

end

function actor_has_1_af_glas(first_speaker, second_speaker)

return db.actor:object("af_eye") ~= nil

end

function give_1_af_glas_to_ozersky(first_speaker, second_speaker)

dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_eye")

end

function give_2_af_vivert_to_ozersky(first_speaker, second_speaker)

dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_vyvert", 2)

end

function give_2_af_benglfire_to_ozersky(first_speaker, second_speaker)

dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_electra_sparkler", 2)

end

function give_3_af_lomot_to_ozersky(first_speaker, second_speaker)

dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, "af_mincer_meat", 3)

end

function actor_not_has_af_info(first_speaker, second_speaker)

local cnt = 4

local table = {

[1] = "jf2_a1",

[2] = "jf2_a2",

[3] = "jf2_a3",

[4] = "jf2_a4",

}

for k = 1, #table do

if has_alife_info(table[k]) then

cnt = cnt - 1

end

end

return cnt > 0

end

function actor_has_af_info(first_speaker, second_speaker)

return (has_alife_info("jf2_a1") and has_alife_info("jf2_a2") and has_alife_info("jf2_a3") and has_alife_info("jf2_a4"))

end 

Теперь по порядку разберем эти функции:  - give_ozersky_fenix_2_quest- выдача квеста  - actor_has_3_af_lomot и подобные ей- возвращает true при проверки на наличие в инвентаре ГГ необходимых предметов заданного количества. - is_zat_test_arts_time- возвращает true при проверке на время суток. 

- is_not_zat_test_arts_time - возвращает false при аналогичной проверке.  - give_1_af_glas_to_ozersky и подобные ей- передача артефактов НПС.  - actor_has_af_info – возвращает тру при наличие всех четырех инфопоршней по обнолению задания. 

- is_not_zat_test_arts_time – проверка на отсвутсвие тех же инфопоршей, скабатывает когда хотя бы одного из них нет. 

Квест имеет следующий вид.  В файле tm_zaton.ltx прописываем 

Code

--|>

[geonezis_zat_test_artefats_quest]

icon = ui_inGame2_kompas

prior = 1

storyline = false

title = {+jf2_a1 +jf2_a2 +jf2_a3 +jf2_a4} jf2_q_title4, {+jf2_a1 +jf2_a2 -jf2_a3 +jf2_a4} jf2_q_title3, {+jf2_a1 -jf2_a2 +jf2_a3 +jf2_a4} jf2_q_title3, {-jf2_a1 +jf2_a2 +jf2_a3 +jf2_a4} jf2_q_title3, {+jf2_a1 +jf2_a2 +jf2_a3 -jf2_a4} jf2_q_title3, {+jf2_a1 -jf2_a2 -jf2_a3 +jf2_a4} jf2_q_title2, {-jf2_a1 -jf2_a2 +jf2_a3 +jf2_a4} jf2_q_title2, {-jf2_a1 +jf2_a2 +jf2_a3 -jf2_a4} jf2_q_title2, {+jf2_a1 -jf2_a2 +jf2_a3 -jf2_a4} jf2_q_title2, {+jf2_a1 +jf2_a2 -jf2_a3 -jf2_a4} jf2_q_title2, {-jf2_a1 -jf2_a2 -jf2_a3 +jf2_a4} jf2_q_title1, {-jf2_a1 -jf2_a2 +jf2_a3 -jf2_a4} jf2_q_title1, {-jf2_a1 +jf2_a2 -jf2_a3 -jf2_a4} jf2_q_title1, {+jf2_a1 -jf2_a2 -jf2_a3 -jf2_a4} jf2_q_title1, {-jf2_a1 -jf2_a2 -jf2_a3 -jf2_a4} jf2_q_title0

descr = {+jf2_a1 +jf2_a2 +jf2_a3 +jf2_a4} jf2_q_text4, {+jf2_a1 +jf2_a2 -jf2_a3 +jf2_a4} jf2_q_text3, {+jf2_a1 -jf2_a2 +jf2_a3 +jf2_a4} jf2_q_text3, {-jf2_a1 +jf2_a2 +jf2_a3 +jf2_a4} jf2_q_text3, {+jf2_a1 +jf2_a2 +jf2_a3 -jf2_a4} jf2_q_text3, {+jf2_a1 -jf2_a2 -jf2_a3 +jf2_a4} jf2_q_text2, {-jf2_a1 -jf2_a2 +jf2_a3 +jf2_a4} jf2_q_text2, {-jf2_a1 +jf2_a2 +jf2_a3 -jf2_a4} jf2_q_text2, {+jf2_a1 -jf2_a2 +jf2_a3 -jf2_a4} jf2_q_text2, {+jf2_a1 +jf2_a2 -jf2_a3 -jf2_a4} jf2_q_text2, {-jf2_a1 -jf2_a2 -jf2_a3 +jf2_a4} jf2_q_text1, {-jf2_a1 -jf2_a2 +jf2_a3 -jf2_a4} jf2_q_text1, {-jf2_a1 +jf2_a2 -jf2_a3 -jf2_a4} jf2_q_text1, {+jf2_a1 -jf2_a2 -jf2_a3 -jf2_a4} jf2_q_text1, {-jf2_a1 -jf2_a2 -jf2_a3 -jf2_a4} jf2_q_text0

target = zat_a2_stalker_barmen

condlist_0 = {+zat_test_boroda_arts_quest_done} complete

condlist_1 = {=is_squad_enemy_to_actor(zat_b22_barmen)} fail

on_complete = %=inc_faction_goodwill_to_actor(stalker:50)%

reward_money = 15000

Разберем то что происходит в процессе выполнения квеста и собственно его структуру.  - [geonezis_zat_test_artefats_quest] - название задание в таск менеджере  - icon = ui_inGame2_kompas- иконка квеста (в данном случае от задания Компас)  - prior = 1 - приоритет задания  - storyline = false - сюжетный ли квест или нет  - title = - заголовки при обновлении задания  - descr = - дескрипшины при обновлении задания  - target = - цели, метки квеста при его обновлении.  - condlist_... =- кондишн (спец. условия) в квесте  

- on_complete =- вызов функции или действия по завершеню задания   - reward_money =- денежная награда. Основная особенность задания это последовательная проверка структурных условий посредством наличий или отсутсвия тех или иных инфопоршней.  В квесте рассматриваются все возможные сочетания вариантов наличия или отсутсвия четырех инфопоршней выдаваемый при передачи предметов заказчику.  1. когда нет ни одного.  2. один из вид артов доставлен (любой), остальные три нет.  3. два из видов артов доставлены (любой), остальные два нет. 

3. три из видов артов доставлены (любой), остальные два нет. 

4. все четыре доствлены.  Соответственно в независимости от того какой из видов артов был передан первым- произойдет точное обновление дескрипшина и тайтла задания с указанием текущего состояния. Метка на цели в квесте (Борода) активна до завершения квеста.  По выдачи инфопоршня zat_test_boroda_arts_quest_done квест будет завершен.  Пропишем русскую транскрипцию дескрипшинов и тайтлов квеста в st_quests_zaton.xml 

Code

<string id="jf2_q_title0">

<text>Оптовая поставка: необходимо принести Бороде артефакты четырех типов.</text>

</string>

<string id="jf2_q_text0">

<text>Для поставки партии артефактов ученым, необходимо собрать большое количество артефактов. Принесите Бороде следущие артефакты: три "ломтя мяса", два "выверта", два "бенгальских огня" и один "глаз".</text>

</string>

<string id="jf2_q_title1">

<text>Оптовая поставка: принесите артефакты трех оставшихся типов.</text>

</string>

<string id="jf2_q_text1">

<text>Вы принесли один из четырех необходимых типов артефактов, добудьте остальные три.</text>

</string>

<string id="jf2_q_title2">

<text>Оптовая поставка: принесите артефакты двух оставшихся типов.</text>

</string>

<string id="jf2_q_text2">

<text>Вы принесли два из четырех необходимых типов артефактов, добудьте остальные два.</text>

</string>

<string id="jf2_q_title3">

<text>Оптовая поставка: принесите артефакты одного оставшегося типа.</text>

</string>

<string id="jf2_q_text3">

<text>Вы принесли три из четырех необходимых типов артефактов, добудьте оставшейся один.</text>

</string>

<string id="jf2_q_title4">

<text>Оптовая поставка: получите дальнейшие указания у Бороды.</text>

</string>

<string id="jf2_q_text4">

<text>Вы нашли все необходимые артефакты, теперь получите у Бороды дополнительные указания.</text>

</string> 

По желанию для проверки в character_desc_general.xml при старте ГГ пропишем нужный арты.  На этом урок завершен. 

Урок 5. Построение многоэтапного линейного квеста на последовательный поиск предметов класса device_pda .

Поставленная задача состоит в обучения принципам построения сложных многоходовых заданий в игре Сталкер Зов Припяти. Будет показан процесс построения сложного диалога с ветвлением, последовательный спавн квестовых предметов через скрипт и собственно структура многоуровневого квеста.  Задание следующее. Новиков просит ГГ принести для него разбросанные по локации сканеры аномалий. Квест будет построен таким образом что необходим исключительно поэтапный вариант его прохождения, то есть от одной точки к другой, без каких-либо вариантов. Получить один предмет раньше другого не будет предоставляться возможным. 

Необходимые для редактирования файлы: 

1. конфигурационные в (gamedata\configs\gameplay\)  -character_desc_jupiter.xml  -dialogs_jupiter.xml  -info_jupiter.xml  2. конфигурационные в (gamedata\configs\misc\)  - tm_jupiter.ltx  - quest_items.ltx  - death_generic.ltx  3. конфигурационные в (gamedata\configs\text\rus\)  - st_dialogs_jupiter.xml  - st_quests_jupiter.xml  - st_items_quest.xml  4. конфигурационные в (gamedata\configs\misc\trade\)  - trade_generic.ltx  5. скриптовый в (gamedata\scripts\)  - dialogs_jupiter.script  - ui_si.script  - bind_stalker.script  - new_tasks.script 

Рассмотрим структуру квестовых диалогов. Для этого откроем dialogs_jupiter.xml и в самом низу добавим два диалога. Один активный при старте задания. Второй на завершение. В принципе можно было объединить их в один, но рассмотрим более легкий вариант. Однако при этом внесем разнообразие в процесс выдачи задания предоставив несколько вариантов его получения внутри диалога. Этот несколько освежит стандартные методы диалогостроения, когда все они делаются последовательными, без каких-либо вариантов.  1- ый диалог: 

Code

<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-ой диалог: 

Code

<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 для того чтобы понимать о чем в диалоге идет речь : 

Code

<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. Добавим в конце файла код: 

Code

<!--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"> добавим строки диалогов 

Code

.....  <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_№. Все предметы являются квестовыми- невозможна их продажа и выкладывание из инвентаря ГГ. 

Code

[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 пропишем: (в данном случае также необязательно так как генерации в инвентаре НПС нет) 

Code

.......  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 добавим (для спавна, в принципе работать будет и без внесения в этот файл): 

Code

........  "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 пропишем дескрипцию предметов. 

Code

<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 пропишем торговлю. Также нужно добавлять индивидуально во все остальные файлы конфигов торговли. (но не обязательно) 

Code

.....  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 добавим следующие функции: 

Code

function jup_b6_create_first_scaner(first_speaker, second_speaker)         alife():create("zat_spec_anomaly_scanner_1",vector():set(-436.574,-6.527,170.169),116113,16)      end  function jup_b6_to_actor_give_spez_outfit(first_speaker, second_speaker)         dialogs.relocate_item_section_to_actor(first_speaker, second_speaker, "scientific_outfit")  end  function give_novikov_zaton_scaner_quest()              task_manager.get_task_manager():give_task("geonezis_jup_spec_scaner")         end  function actot_to_novikov_give_zaton_scaner(first_speaker, second_speaker)         local items_table = {"zat_spec_anomaly_scanner_1","zat_spec_anomaly_scanner_2","zat_spec_anomaly_scanner_3","zat_spec_anomaly_scanner_4","zat_spec_anomaly_scann    er_5","zat_spec_anomaly_scanner_6","zat_spec_anomaly_scanner_7"}        for k,v in pairs(items_table) do            if db.actor:object(v) ~= nil then               dialogs.relocate_item_section_from_actor(first_speaker, second_speaker, v)                  end         end      end  function actot_have_all_zaton_scaner(first_speaker, second_speaker)         return db.actor:object("zat_spec_anomaly_scanner_1")~=nil and db.actor:object("zat_spec_anomaly_scanner_2")~=nil and             db.actor:object("zat_spec_anomaly_scanner_3")~=nil and db.actor:object("zat_spec_anomaly_scanner_4")~=nil and             db.actor:object("zat_spec_anomaly_scanner_5")~=nil and db.actor:object("zat_spec_anomaly_scanner_6")~=nil and         db.actor:object("zat_spec_anomaly_scanner_7")~=nil         end 

коротко их поясним:  - спавн первого квестового предмета  - передача броне костюма ГГ  - выдача задания  - передача всех квестовых предметов НПС  - скрипт проверки наличия в инвентаре ГГ всех необходимых предметов  Теперь создадим файл new_tasks.script и добавим в него следующий код одной основной функции task_spec(): 

Скрипт созданный нами в файле можно посмотреть в скачанном архиве с отработанным примером. Основная его особенность это последовательный спавн квестовых предметов. Последующий будет создаваться только после того как был найден предыдущий. Также происходит выдача инфопоршней используемых в структуре самого квеста. Еще одна особенность это установка дополнительной проверки в зависимости от локации.  Созданный нами скрипт необходимо объявить в функции апдейта актора actor_binder:update(delta) в файле bind_stalker.script

Code

.....  new_tasks.task_spec()  ..... 

Теперь собственно перейдем к созданию самого задания.  Код секции квеста ([geonezis_jup_spec_scaner]) можно просмотреть в файле tm_jupiter.ltx в архиве с отработанным примером. Основные особенности это наличие двух кондишинов один на завершение задания, второй на его провал (в случае если сквад ученых бункера станет врагами по отношению к ГГ). По завершению задания будет повышена репутация у группировки экологов, а также выдана награда.  Структура квеста последовательная. Одна секция тайтлов, дескрипшинов и меток заменяет другую при получении соответствующих им инфопоршней. Всего 7 таких этапов. Инфопоршни используемые в задании выдаются также последовательно. Определяемыми являются те, которые обновляются при спавне (jup_novikov_quest_zaton_scanner_create_№), а не при взятии предмета. 

На этом урок завершен.