Перейти к контенту

Создание квеста


Рекомендуемые сообщения

И так вот по этому уроку делал квест.

Создадим квест по поиску АК74У.

Для начала нужно создать диалог, сделаем его у Волка:

Заходим в gamedata\config\gameplay\dialogs_escape.xml и в самом конце до строчки </game_dialogs> пишем:

<dialog id="escape_volk_ak74u_quest"> 
    <has_info>esc_kill_bandits_quest_done</has_info> 
    <dont_has_info>escape_volk_ak74u_start</dont_has_info> 
    <phrase_list> 
        <phrase id="0"> 
            <text>escape_volk_ak74u_quest_0</text> 
            <next>1</next> 
        </phrase> 
        <phrase id="1"> 
            <text>escape_volk_ak74u_quest_1</text> 
            <next>2</next> 
            <next>3</next> 
        </phrase> 
        <phrase id="2"> 
            <text>escape_volk_ak74u_quest_2</text> 
            <give_info>escape_volk_ak74u_start</give_info> 
            <action>new_life.spawn_ak74u</action> 
        </phrase> 
        <phrase id="3"> 
            <text>escape_volk_ak74u_quest_3</text> 
            <action>dialogs.break_dialog</action> 
        </phrase> 
    </phrase_list> 
</dialog> 
<dialog id="escape_volk_ak74u_quest_completed"> 
    <precondition>new_life.escape_volk_ak74u_have</precondition> 
    <has_info>escape_volk_ak74u_have</has_info> 
    <dont_has_info>escape_volk_ак74u_done</dont_has_info> 
    <phrase_list> 
        <phrase id="0"> 
            <text>escape_volk_ak74u_quest_completed_0</text> 
            <next>1</next> 
        </phrase> 
        <phrase id="1"> 
            <text>escape_volk_ak74u_quest_completed_1</text> 
            <next>2</next> 
        </phrase> 
        <phrase id="2"> 
            <text>escape_volk_ak74u_quest_completed_2</text> 
            <give_info>escape_volk_ak74u_done</give_info> 
            <action>new_life.give_volk_ak74u</action> 
            <next>3</next> 
        </phrase> 
        <phrase id="3"> 
            <text>escape_volk_ak74u_quest_completed_3</text> 
            <action>new_life.complete_volk_quest</action> 
        </phrase> 
    </phrase_list> 
</dialog>

Теперь нужно прописать эти диалоги Волку, для этого заходим в gamedata\config\gameplay\character_desc_escape.xml и находим профиль Волка(он называется esc_wolf), перед строкой </specific_character> пишем:

<actor_dialog>escape_volk_ak74u_quest</actor_dialog> 
<actor_dialog>escape_volk_ak74u_quest_completed</actor_dialog>

Нам понадобятся два диалога: 1 для получения квеста, 2 для передачи автомата.

<dialog id="escape_volk_ak74u_quest"> - Это название диалога

<has_info>esc_kill_bandits_quest_done</has_info> - эта строка означает что квест появится только если получен инфопоршень esc_kill_bandits_quest_done

<dont_has_info>escape_volk_ak74u_start</dont_has_info> - эта строка означает что если получен инфопоршень escape_volk_ak74u_start , то этот диалог больше не появится.

<text>escape_volk_ak74u_quest_0</text> - это ссылка на текст фразы меченого

<next>1</next> - это ссылка на текст с id= 1 , а id= 1 это <text>escape_volk_ak74u_quest_1</text> (ссылка на текст Волка)

<next>2</next>

<next>3</next> - эти две строчки означают что идет разветвление диалога

<give_info>escape_volk_ak74u_start</give_info> - выдача инфопоршня, после которого начинается квест

<action>new_life.spawn_ak74u</action> - функция вызываемая из скрипта new_life, в данном случае спаунится предмет AK74У

<action>dialogs.break_dialog</action> - функция отвечающая за выход из диалога

 

Во втором диалоге есть строка <precondition>new_life.escape_volk_ak74u_have</precondition> - она отвечает за появление диалога если выполняется функция escape_volk_ak74u_have

 

Теперь нужно сделать текст диалога на русском языке, для этого заходим в gamedata\config\tex\rus\stable_dialogs_escape.xml и в нём пишем следующее(в конце перед </string_table>):

<string id="escape_volk_ak74u_quest_0"> 
    <text>Здорова Волк, для меня есть какая-нибудь работа?</text> 
</string> 
<string id="escape_volk_ak74u_quest_1"> 
    <text>Да, есть одно дело: вобщем шёл сюда в лагерь к Сидырычу, решил пройти через тоннель чтоб воякам денег не платить, а там собак было штук десять. Ну я начал отстреливаться, где-то шестерых убил и патроны кончились, пришлось АКСУ выкинуть, чтоб от стаи собак убежать. Таки лежит там наверно АКСУ. \nНу как, возьмёшься? Только осторожней там, после последнего выброса появились в тоннеле перещающиеся аномалии электра.</text> 
</string> 
<string id="escape_volk_ak74u_quest_2"> 
    <text>Да, я как раз буду рядом проходить, конечно принесу...</text> 
</string> 
<string id="escape_volk_ak74u_quest_3"> 
    <text>Нет, Волк, сам туда иди...</text> 
</string> 
<string id="escape_volk_ak74u_quest_completed_0"> 
    <text>Привет, Волк, ну как оно?...</text> 
</string> 
<string id="escape_volk_ak74u_quest_completed_1"> 
    <text>Сидор водку не даёт, хе хе, а так всё хорошо.</text> 
</string> 
<string id="escape_volk_ak74u_quest_completed_2"> 
    <text>Вот, нашел я твой АКСУ.</text> 
</string> 
<string id="escape_volk_ak74u_quest_completed_3"> 
    <text>Эх спасибо тебе Меченый, вот держи, может на что-нибудь хватит.</text>
</string>

Итак, диалог готов, теперь нужно сделать сам квест, для этого заходим в gamedata\config\gameplay\tasks_escape.xml и в самом конце пишем:

<game_task id="escape_volk_ak74u"> 
    <title>Найти потерянный АКСУ</title> 
    <objective> 
        <text>Найти потерянный АКСУ</text> 
        <icon>ui_iconsTotal_weapons</icon> 
        <infoportion_complete>escape_volk_ak74u_done</infoportion_complete> 
        <article>tex_escape_volk_ak74u</article> 
    </objective> 
    <objective> 
        <text>Найти АКСУ</text> 
        <function_complete>new_life.escape_volk_ak74u_have</function_complete> 
        <infoportion_set_complete>escape_volk_ak74u_have</infoportion_set_complete> 
    </objective> 
    <objective> 
        <text>Принести АКСУ Волку</text> 
        <map_location_type hint="Волк">blue_location</map_location_type> 
        <object_story_id>Escape_novice_lager_volk</object_story_id> 
        <infoportion_complete>escape_volk_ak74u_done</infoportion_complete> 
    </objective> 
</game_task>

<game_task id="escape_volk_ak74u"> - id квеста

<title>Найти потерянный АКСУ</title> - название квеста

<text>Найти потерянный АКСУ</text> - тоже название квеста))

<icon>ui_iconsTotal_weapons</icon> - иконка задания

<infoportion_complete>escape_volk_ak74u_done</infoportion_complete> - квест будет выполнен, если был получен инфопоршень escape_volk_ak74u_done

<article>tex_escape_volk_ak74u</article> - ссылка на текстовый файл с описанием задания

<text>Найти АКСУ</text> - название подзадачи

<function_complete>new_life.escape_volk_ak74u_have</function_complete> - проверка на наличие предмета

<infoportion_set_complete>escape_volk_ak74u_have</infoportion_set_complete> если функция new_life.escape_volk_ak74u_have выполнилась, то выдаётся инфопоршень escape_volk_ak74u_have и выполняется подзадача

<text>Принести АКСУ Волку</text> - название второй подзадачи

<map_location_type hint="Волк">blue_location</map_location_type> - указатель на Волка

<object_story_id>Escape_novice_lager_volk</object_story_id> - id Волка в Файле gamedata\config\game_story_ids.ltx

<infoportion_complete>escape_volk_ak74u_done</infoportion_complete> - если будет получен этот инфопоршень, то выполнится подзадача и соответственно сам квест

 

Нужно сделать инфопоршни, заходим в gamedata\config\gameplay\info_l01escape.xml и в нём в конце до строчки </game_information_portions> пишем:

<info_portion id="escape_volk_ak74u_start"> 
    <task>escape_volk_ak74u</task> 
</info_portion> 

<info_portion id="escape_volk_ak74u_have"> 
</info_portion> 

<info_portion id="escape_volk_ak74u_done"> 
</info_portion>

Теперь нужно сделать описание квеста, заходим в gamedata\config\gameplay\storyline_info_escape.xml и пишем в конце:

<article id="tex_escape_volk_ak74u" name="Найти потерянный ак74u" article_type="task"> 
    <texture x="0" y="800" width="200" height="100">ui\ui_icon_equipment</texture>
    <text>tex_escape_volk_ak74u</text> 
</article>

Сделаем описание на русском, заходим в stable_dialogs_escape.xml и в конце до строки </string_table> пишем:

<string id="tex_escape_volk_ak74u"> 
    <text>Волк попросил принести потерянный в туннеле АКСУ</text> 
</string>

Теперь создадим скриптовый файл new_life в gamedata\scripts\new_life.script и пишем:

function spawn_ak74u() 
    amk.spawn_item("wpn_ak74u",vector():set(-78.85,-1.29,154.74),163,189935) -- спавн ak74u в тоннеле на кордоне 
end 

function escape_volk_ak74u_have() 
    return sak.have_item_namber("wpn_ak74u",1) ~= false -- проверка на нахождение предмета в рюкзаке 
end 

function give_volk_ak74u(first_speaker, second_speaker) -- передача предмета 
    sak.out_item_namber("wpn_ak74u", 1) 
end 

function complete_volk_quest(first_speaker, second_speaker) -- получение награды 
    dialogs.relocate_money(second_speaker, 1500, "in") 
end

Чтобы эти скрипты заработали, нужно создать файлы amk.script и sak.script, в аmk.script пишем:

function spawn_item(spawn_item, pos, gv,lv) 
    if gv==nil then gv=db.actor:game_vertex_id() end 
    if lv==nil then lv=db.actor:level_vertex_id() end 
    return alife():create(spawn_item, pos, lv, gv) 
end 

function remove_item_from_inventory(remove_item,npc) 
    if npc==nil then npc=db.actor end 
    if remove_item~=nil then 
        -- npc:mark_item_dropped(remove_item) 
        alife():release(alife():object(remove_item:id()), true) 
        return true 
    end 
    return false 
end

 

В sak.script пишем:

local items_count=0 
local itemin=nil 

function have_item_namber(itm,need_namber) 
    local actor=db.actor 
    items_count=0 
    itemin=itm 
    actor:iterate_inventory(cheking_item,actor) 
    if items_count>=need_namber then 
        return true 
    else 
        return false 
    end 
end

function cheking_item(actor,item) 
    local items=item:section() 
    if items==itemin then 
        items_count=items_count+1 
    end 
end

function create_items(npc,section,number) 
    for i=1,number do 
        alife():create(section, 
                    npc:position(), 
                    npc:level_vertex_id(), 
                    npc:game_vertex_id(), 
                    npc:id()) 
    end 
end

local reloc_params={} 
local stalk 
function out_item_namber(itm_section,need_number) 
    reloc_params.itm_section=itm_section 
    reloc_params.itm_cnt=need_number 
    reloc_params.itm_cnt_found =0 
    db.actor:iterate_inventory(checkout_items_count,db.actor) 
    reloc_params.itm_cnt_found=0 
    if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then 
        db.actor:iterate_inventory(out_items_count,db.actor) 
    end 
    news_manager.relocate_item(db.actor, "out", itm_section) 
    reloc_params={} 
end

function relocate_item_namber(stalker,itm_section,need_number) 
    stalk=stalker 
    reloc_params.itm_section=itm_section 
    reloc_params.itm_cnt=need_number 
    reloc_params.itm_cnt_found=0 
    db.actor:iterate_inventory(checkout_items_count,db.actor) 
    reloc_params.itm_cnt_found=0 
    if reloc_params.itm_cnt_found<=reloc_params.itm_cnt then 
        db.actor:iterate_inventory(reloc_items_count,db.actor) 
    end 
    news_manager.relocate_item(db.actor, "out", itm_section) 
    reloc_params={} 
end

function checkout_items_count(actor,item) 
    if item.section and item:section()==reloc_params.itm_section then 
        reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 
    end 
end

function reloc_items_count(actor,item) 
    if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found<reloc_params.itm_cnt then 
        db.actor:transfer_item(item, stalk) 
        reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 
    end 
end

function out_items_count(actor,item) 
    if item.section and item:section()==reloc_params.itm_section and reloc_params.itm_cnt_found<reloc_params.itm_cnt then 
        amk.remove_item_from_inventory(item, actor) 
        reloc_params.itm_cnt_found = reloc_params.itm_cnt_found + 1 
    end 
end

 

ВСё! Можно тестировать.

 

ПРИМЕЧАНИЕ!!!Если вы делаете такой квест на оригинальном сталкере, то ОБЯЗАТЕЛЬНО нужно создать файлы amk.script и sak.script

 

Если вы делаете квест на amk моде, то нужно создать только файл sak.script

 

 

Первий квест получился. Я только сделал, что в квесте вместо калаша нужно найти КПК. Все роботало.

По этой же схеме начал делать второй квест. Только в скрипте new_life.scrip написал:

function escape_volk_moy_kpk2_have() 
    return sak.have_item_namber("moy_kpk2",1) ~= false 
end

function give_volk_moy_kpk2(first_speaker, second_speaker) 
    sak.out_item_namber("moy_kpk2", 1) 
end 

function complete_volk_quest(first_speaker, second_speaker) 
    dialogs.relocate_money(second_speaker, 1500, "in") 
end

 

При розговоре на получение награды начал ловить вылет:

Expression : fatal error 
Function : CScriptEngine::lua_error 
File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp 
Line : 73 
Description : <no expression> 
Arguments : LUA error: d:\games\st\shoc\gamedata\scripts\new_life.script:18: attempt to index global 'sak' (a nil value)

 

Отредактировал функции и вышло так

function escape_volk_moy_kpk2_have() 
    return sak2.have_item_namber("moy_kpk2",1) ~= false 
end 

function give_volk_moy_kpk2(first_speaker, second_speaker) 
    sak2.out_item_namber("moy_kpk2", 1) 
end 

function complete_volk_quest(first_speaker, second_speaker) 
    dialogs.relocate_money(second_speaker, 1500, "in") 
end

 

После начал ловить вилет при получении награды:

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: d:\games\st\shoc\gamedata\scripts\sak2.script:70: attempt to index global 'amk' (a nil value)

 

В sak скрипт отредактировал 70 строчку с

amk.remove_item_from_inventory(item, actor)

на

amk2.remove_item_from_inventory(item, actor)

И создал скрипт аmk2.script c точно таким же содержаниям.

 

Ловлю вилет при розговоре о награде:

Expression : fatal error 
Function : CScriptEngine::lua_error 
File : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp 
Line : 73 
Description : <no expression> 
Arguments : LUA error: d:\games\st\shoc\gamedata\scripts\sak2.script:70: attempt to index global 'amk2' (a nil value)

 

И так вопрос^ где я накосячил? :ny_rolleyes:

Изменено пользователем ColR_iT
Ссылка на комментарий

Написал диалог для Бармена на основе Dream mod. Будет вызываться при выполнении определенного квеста. Но игра слетает не находя текст по идентификатору, хотя все прописано верно, все файлы со структурами диалогов и текстовыми массивами зареганы в system.ltx

FATAL ERROR

[error]Expression    : no_assert
[error]Function      : CXML_IdToIndex<class CPhraseDialog>::GetById
[error]File          : e:\stalker\sources\trunk\xr_3da\xrgame\xml_str_id_loader.h
[error]Line          : 112
[error]Description   : item not found, id
[error]Arguments     : bar_barmen_sleep_dialog_start

 

 

Сам диалог:

 

character_desc_bar

    <specific_character id="bar_barman" no_random = "1">
        <name>bar_barmen_name</name>
        <icon>ui_npc_u_barman</icon>
        <map_icon x="1" y="4"></map_icon>
        <bio>bar_barmen_bio</bio>

        <class>bar_barman</class>
        <community>trader</community>
        <money min="1000000" max="1100000" infinitive="1"></money>
        
        <rank>700</rank>
        <reputation>50</reputation>
        <visual>actors\barman\barman</visual>
        <snd_config>characters_voice\human_01\stalker\</snd_config>
        <crouch_type>-1</crouch_type>
        
        <supplies>
            [spawn] \n
            stalker_outfit \n
            
        </supplies>
                    
        <start_dialog>bar_bar_barmen_start</start_dialog>
        <actor_dialog>bar_bar_barmen_talk_info</actor_dialog>
        <!---------------------- New sleep mod ---------------------->
        <actor_dialog>bar_barmen_sleep_dialog_start</actor_dialog> -- этот диалог
        <!---------------------- New sleep mod ---------------------->        
        <actor_dialog>bar_bar_barman_ecolog_flash_done</actor_dialog>
        <actor_dialog>bar_bar_barman_veterans_finish</actor_dialog>
        <actor_dialog>bar_bar_barman_killer_ambush</actor_dialog>
        <actor_dialog>tm_barman_dialog</actor_dialog>
        <actor_dialog>tm_barman_reward</actor_dialog>        
        <!---------------------- Weapons repair ---------------------->
        <actor_dialog>bar_trader_repair</actor_dialog>
        <!---------------------- Weapons repair ---------------------->        
    </specific_character>

 

 

alex_mod_dialogs

    <dialog id="bar_barman_sleep_dialog_start">
        <has_info>barman_sleep_dialog</has_info>
        <dont_has_info>barman_said_can_go</dont_has_info>
        <phrase_list>
            <phrase id="0">
                <text>barman_sleep_dialog_0</text>
                <next>1</next>
            </phrase>
            <phrase id="1">
                <text>barman_sleep_dialog_1</text>
                <next>2</next>
                <next>21</next>
            </phrase>
            <phrase id="2">
                <text>barman_sleep_dialog_2</text>
                <next>3</next>
            </phrase>
            <phrase id="21">
                <text>barman_sleep_dialog_21</text>
                <action>dialogs.break_dialog</action>
            </phrase>
            <phrase id="3">
                <text>barman_sleep_dialog_3</text>                
                <give_info>barman_said_can_go</give_info>
                <give_info>guard_can_be_used</give_info>
                <give_info>guard_didnot_say_stop</give_info>
                <action>alex_mod.gg_give_money_barmen_for_sleep_pleace</action>
                <next>4</next>
            </phrase>
            <phrase id="4">
                <text>barman_sleep_dialog_4</text>
            </phrase>
        </phrase_list>
    </dialog>

 

 

Ну и сам текстовый массив:

stable_dialogs_alex_mod

<!---------- New sleep mod ---------->    
    
    <string id="barman_sleep_dialog_0">
        <text>Мне бы прилечь где-нибудь...</text>
    </string>
    
    <string id="barman_sleep_dialog_1">
        <text>Без проблем, только внеси предоплату за месяц, она не большая - 1500 деревянных. И можешь спать в полной безопасности сколько душе угодно.</text>
    </string>
    
    <string id="barman_sleep_dialog_2">
        <text>Это меня устраивает, согласен.</text>
    </string>    
    
    <string id="barman_sleep_dialog_21">
        <text>Что-то дороговато выходит. Я ещё подумаю.</text>
    </string>
    
    <string id="barman_sleep_dialog_3">
        <text>Проходи в заднюю комнату и располагайся там. Я скажу Гарику, чтобы он тебя пропускал.</text>
    </string>
    
    <string id="barman_sleep_dialog_4">
        <text>Спасибо!</text>
    </string>

 

Изменено пользователем Stalker_AleX333

aka Stalker_AleX333
 
Мои проекты  - ЯндексДиск   |   Я на Gamer-Mods.ru

Ссылка на комментарий
Stalker_AleX333, у тебя в файле alex_mod_dialogs.xml нет диалога id у которого bar_barmen_sleep_dialog_start, а есть bar_barman_sleep_dialog_start.
Ссылка на комментарий

Здравствуйте. Есть вопрос: есть какое нибудь ограничение на количество диалогов у непися? Я прописал неписю два диалога, через которые мы получаем квесты. Второй квест активируется только при наличии инфопоршня, который мы получаем при выполнении первого. Но диалог второго квеста не появляется. Пробовал без условия получения поршня - тоже самое. Прописал этот диалог другому неписю - всё работает. В чем может быть проблема? Почему работает только один диалог?

 

"Все сложное - не нужно, все нужное - просто"(М. Калашников)

Ссылка на комментарий

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

ЗЫ: может диалог после закрывающего тега? Как то сам так напортачил, оказалось, что было 2 глобальных закрывающих тега. И все, что было после первого - не читалось.

ЗЗЫ: без приведеных кодов, можно долго молоть воду в ступе.

Изменено пользователем volazar
Ссылка на комментарий

volazar, вот так идет:

<?xml version="1.0" encoding="windows-1251" ?>

<game_dialogs>

<dialog id="dialog_lukash_proverka">

<dont_has_info>lukash_pogovorili</dont_has_info>

<phrase_list>

<phrase id="0">

............................идет диалог......................

<next>9</next>

</phrase>

<phrase id="9">

<text>Понял.</text>

<give_info>lukash_pogovorili</give_info>

<action>dialogs.break_dialog</action>

</phrase>

</phrase_list>

</dialog>

 

<dialog id="dialog_lukash_raciya">

<phrase_list>

<phrase id="0">

.........................................идет диалог............................

<next>14</next>

</phrase>

<phrase id="14">

<text>Как скажешь.</text>

<action>dialogs.break_dialog</action>

</phrase>

</phrase_list>

</dialog>

</game_dialogs>

 

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

"Все сложное - не нужно, все нужное - просто"(М. Калашников)

Ссылка на комментарий

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

ЗЫ: ссылку на диалог прописываете в профиле НПС? Не через инклуд?

Изменено пользователем volazar
Ссылка на комментарий

volazar, угу.

<specific_character id="dv_svobblokpost_commander_lukash" team_default = "1">

<name>Лукаш</name>

<icon>ui_npc_u_stalker_sv_balon_10</icon>

<map_icon x="2" y="0"></map_icon>

<bio>mil_Svoboda_blockpost_leader_bio</bio>

 

<class>dv_svobblokpost_commander_lukash</class>

<community>freedom</community> <terrain_sect>stalker_freedom_terrain</terrain_sect>

 

<rank>916</rank>

<reputation>149</reputation>

 

<snd_config>characters_voice\human_02\freedom\</snd_config>

<crouch_type>-1</crouch_type>

 

<visual>actors\svoboda\stalker_sv_balon_10</visual>

<supplies>

[spawn] \n

wpn_usp \n

ammo_11.43x23_hydro = 1 \n

wpn_g36 \n

ammo_5.56x45_ap = 1 \n

#include "gameplay\character_items.xml" \n

#include "gameplay\character_drugs.xml" \n

#include "gameplay\character_food.xml"

#include "gameplay\character_criticals_3.xml"

</supplies>

 

<start_dialog>dialog_lukash_proverka</start_dialog>

<start_dialog>dialog_lukash_raciya</start_dialog>

 

<money min="600" max="2000" infinitive="0" />

 

#include "gameplay\character_dialogs.xml"

 

</specific_character>

 

 

Добавлено через 4 мин.:

инклуд разве может помочь?

"Все сложное - не нужно, все нужное - просто"(М. Калашников)

Ссылка на комментарий

BeeRseK, У меня с инкудом были проблемы. Не стоит.

Ваша ошибка в <start_dialog>dialog_lukash_raciya</start_dialog>

start_dialog может быть только один! Все последующие прописывайте так:

<actor_dialog>идентификатор диалога</actor_dialog>

 

Т.е:

<start_dialog>1</start_dialog>

<actor_dialog>2</actor_dialog>

<actor_dialog>3</actor_dialog>

И т.д

Изменено пользователем volazar
Ссылка на комментарий
volazar, хмм..а я думал если start dialog - то первый диалог начинает непись, а если actor dialog то игрок начинает.

"Все сложное - не нужно, все нужное - просто"(М. Калашников)

Ссылка на комментарий

BeeRseK, Все верно. start dialog это диалог, который начинает непись. Типа "привет" и т.д Он только один.

Все последующие диалоги должны быть заключены в теги actor_dialog. Т.е они уже твои и которые будут в списке доступных диалогов.

Изменено пользователем volazar
Ссылка на комментарий

volazar, ты не прав, точнее не до конца...

Установить стартовых диалогов можно сколько угодно, да хоть все, но вот использоваться будет только один, который первый пройдёт по условиям, порядок тот, в котором они прописаны в профиле.

На примере профиля BeeRseKа - если <start_dialog>dialog_lukash_proverka</start_dialog> не пройдёт по условиям, то будет установлен стартовый диалог <start_dialog>dialog_lukash_raciya</start_dialog>, если же в обоих не будет условий появления, то использоваться будет первый.

Кстати, в схеме логики meet можно также установить стартовый диалог НПС, причём приоритет его будет выше, нежели в профиле.

Ссылка на комментарий
ColR_iT, спс, но уже поздно - я переделал под actor dialog :D Да в принципе какая разница, пусть первым будет говорить игрок, это не столь важно, лишь бы всё работало нормально.

"Все сложное - не нужно, все нужное - просто"(М. Калашников)

Ссылка на комментарий

Подскажите , где взять тутор на создание квеста принести-отнести ...Через "amk.script"

 

А в каких целях ты хочешь использовать этот файл?

ColR_iT

Изменено пользователем ColR_iT
Ссылка на комментарий

Добрый день! Не нашел я на форуме тему, где обсуждают непосредственно схему поведения/логику нпс. Ну а т.к. я пишу квест, и в процессе написания квеста, я застрял на этом моменте, то решил написать тут.

Если не по теме, то прошу модераторов переместить туда, куда надо (Только мне сообщите пожалуйста=))

 

Работаю на ЗП. Написал я логику для нпс:

[smart_terrains]

none = true

 

[logic]

active = remark

combat_ignore = combat_ignore

 

[combat_ignore]

 

[remark@wpn]

anim = hello_wpn

no_move = true

target = actor

on_actor_dist_le = 2| remark@wait

 

[remark@wait]

anim = wait

no_move = true

target = actor

on_actor_dist_le = 5| remark@wpn

on_info = {+esc_sniper_quest_give} walker@go

 

[walker@go]

path_walk = esc_quest_sniper_start_walk

path_look = esc_quest_sniper_start_look

 

 

Мне нужно сделать так, чтобы нпс из состояния "remark@wait", при получении инфопоршня "esc_sniper_quest_give", перешел в состояние "walker", но не получается, получаю вылет при старте игры:

FATAL ERROR

 

[error]Expression : !m_error_code

[error]Function : raii_guard::~raii_guard

[error]File : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp

[error]Line : 748

[error]Description : ...s.t.a.l.k.e.r. cop\gamedata\scripts\xr_remark.script:236: attempt to perform arithmetic on local 'pos' (a nil value)

 

 

 

Помогите пожалуйста написать логику нпс правильно.

 

Или этот вылет не связан с логикой нпс?

 

Вообще сам квест заключается в чем. ГГ в месте с напарником, нужно зачистить блокпост. Значит, ГГ подходит к нпс, у них простой диалог. ГГ - Ну что, какии задания?, НПС - Нужно зачистить военный блокпост. Выдается квест "esc_sniper_quest_start", и при выдачи инфопоршня "esc_sniper_quest_give", нпс переходит в схему "walker@go" и бежит по заданным точкам "path_walk = esc_quest_sniper_start_walk" помогать ГГ.

<dialog id="esc_sniper_start_dialog">

<dont_has_info>esc_sniper_quest_done</dont_has_info>

<dont_has_info>esc_sniper_quest_give</dont_has_info>

<phrase_list>

<phrase id="1">

<text>Нужно зачистить военный блокпост.</text>

<give_info>esc_sniper_quest_give</give_info>

<action>dialogs_escape.esc_sniper_quest_start</action>

</phrase>

<phrase id="0">

<text>Ну что, какие задания?</text>

<next>1</next>

</phrase>

</phrase_list>

</dialog>

 

<dialog id="esc_sniper_end_dialog">

<has_info>esc_sniper_quest_give</has_info>

<dont_has_info>esc_sniper_quest_done</dont_has_info>

<has_info>blokpost_killed</has_info>

<phrase_list>

<phrase id="1">

<text>Пошли проверим.</text>

<give_info>esc_sniper_quest_done</give_info>

</phrase>

<phrase id="0">

<text>Вроде всех положили.</text>

<next>1</next>

</phrase>

</phrase_list>

</dialog>

 

 

<info_portion id="esc_sniper_quest_done"></info_portion>

<info_portion id="esc_sniper_quest_give"></info_portion>

<info_portion id="blokpost_killed"></info_portion>

 

 

function esc_sniper_quest_start()

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

end

 

 

[esc_sniper_give]

icon = ui_inGame2_Bezopasnoe_mesto

prior = 2

storyline = false

title = {+blokpost_killed}test_talk_strelok, test_killed_blokpost

descr = test_mission

target = {+blokpost_killed} new_nps_test, nps

condlist_0 = {+esc_sniper_quest_done} complete

reward_money = 1

 

 

<string id="test_killed_blokpost ">

<text>Задание: Зачиска блокпоста.</text>

</string>

<string id="test_mission">

<text>Зачиска блокпоста.</text>

</string>

<string id="test_talk_strelok">

<text>Переговорить со стрелком.</text>

</string>

 

 

 

Помогите пожалуйста, где я ошибся?

Не соответствует правилам.

Ссылка на комментарий
NaslednikTutti, посмотри как в ЗП логика делается. Сначала ее нужно вызвать из конфига смарта в секции [exclusive]. В файле логики ты должен определить условие взятие под эту логику персонажа - сквада и определить приоритет. А насколько я знаю, remark используется для связки двух схем, а не как основная стартовая. Сначала поставь нпс в обычный walker на нужные точки пути, а потом переводи в remark. В файлах ЗП примеров предостаточно.
Ссылка на комментарий

Скажите пожалуйста, как сделать что-бы квест заканчивался при диалоге, появлялся при взятии определённого предмета или кончался при поднятии предмета?

ghost_fighter.gif
Ссылка на комментарий

Стрелоk,

Можешь написать как правильно выдать этот поршень? Я еще новичок в квестах уж не обессудь.

 

Новичок - не оправдание. Смотри туторы. Cyclone

ghost_fighter.gif
Ссылка на комментарий

Подскажите, возможно ли сделать так, что бы часть квеста( такая как например, найти то-то, принести его тому-то) появилась в ПДА только если я получу вообще сторонний инфопоршень? Я подозреваю, что впринцыпе можно использовать <has_info></has_info> как в диалогах , но я не уверен что это и с квстами работать будет.

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
×
×
  • Создать...