1003 lines
32 KiB
Text
1003 lines
32 KiB
Text
--------------------------------------------------------------------------------
|
|
-- Dialog manager --------------------------------------------------------------
|
|
-- Made by Peacemaker ----------------------------------------------------------
|
|
-- 11.01.08 --------------------------------------------------------------------
|
|
--------------------------------------------------------------------------------
|
|
disabled_phrases = {} -- temporary table of phrases which have been disabled during a conversation
|
|
local quest_disabled_phrases = {} -- temporary table of phrases which have been disabled during a conversation
|
|
local id_counter = 5 -- start from 5 because of adding root phrases
|
|
|
|
phrase_table = {
|
|
hello = {},
|
|
job = {},
|
|
anomalies = {},
|
|
place = {},
|
|
information = {},
|
|
}
|
|
priority_table = {
|
|
hello = {},
|
|
job = {},
|
|
anomalies = {},
|
|
place = {},
|
|
information = {},
|
|
}
|
|
|
|
|
|
-- Generate id for phrase
|
|
function get_id()
|
|
id_counter = id_counter + 1
|
|
return id_counter
|
|
end
|
|
|
|
-- Parse ini file and store all phrases and their parameters into phrase table
|
|
function fill_phrase_table()
|
|
printf("fill_phrase_table")
|
|
-- local ltx file
|
|
local dm_ini_file = ini_file("misc\\dialog_manager.ltx")
|
|
local id = ""
|
|
local value = ""
|
|
local category = ""
|
|
for i=0,dm_ini_file:line_count("list")-1 do
|
|
temp1, id, temp2 = dm_ini_file:r_line("list", i, "", "")
|
|
if(dm_ini_file:line_exist(id, "category")) then
|
|
category = dm_ini_file:r_string(id, "category")
|
|
|
|
if(category=="hello") then
|
|
category = "hello"
|
|
elseif(category=="anomalies") then
|
|
category = "anomalies"
|
|
elseif(category=="place") then
|
|
category = "place"
|
|
elseif(category=="job") then
|
|
category = "job"
|
|
elseif(category=="information") then
|
|
category = "information"
|
|
else
|
|
category = "default"
|
|
end
|
|
else
|
|
-- if there is no set category we don't know where we must store the phrase
|
|
abort("Dialog manager error: not categoried section [%s].", id)
|
|
end
|
|
|
|
if(category~="default") then
|
|
local temp_table = {}
|
|
temp_table.name = id
|
|
-- npc community: all or {dolg,freedom,bandit,military,zombied,ecolog,killer,monolith,csky...}
|
|
if(dm_ini_file:line_exist(id, "npc_community")) then
|
|
local temp = dm_ini_file:r_string(id, "npc_community")
|
|
temp_table.npc_community = parse_names(temp)
|
|
else
|
|
temp_table.npc_community = "not_set"
|
|
end
|
|
-- level: all or level name
|
|
if dm_ini_file:line_exist(id, "level") then
|
|
local temp = dm_ini_file:r_string(id, "level")
|
|
temp_table.level = parse_names(temp)
|
|
else
|
|
temp_table.level = "not_set"
|
|
end
|
|
-- actor community: all or {actor_dolg, actor, ...}
|
|
if(dm_ini_file:line_exist(id, "actor_community")) then
|
|
local temp = dm_ini_file:r_string(id, "actor_community")
|
|
temp_table.actor_community = parse_names(temp)
|
|
else
|
|
temp_table.actor_community = "not_set"
|
|
end
|
|
-- is npc wounded? true, false
|
|
if dm_ini_file:line_exist(id, "wounded") then
|
|
temp_table.wounded = dm_ini_file:r_string(id, "wounded")
|
|
else
|
|
temp_table.wounded = "false"
|
|
end
|
|
-- phrase is said once: true, always, false(!!!don't set or will no say this phrase)
|
|
if dm_ini_file:line_exist(id, "once") then
|
|
temp_table.once = dm_ini_file:r_string(id, "once")
|
|
else
|
|
temp_table.once = "always"
|
|
end
|
|
|
|
if dm_ini_file:line_exist(id, "info") then
|
|
if dm_ini_file:r_string(id, "info") ~= "" then
|
|
temp_table.info = {}
|
|
xr_logic.parse_infop1(temp_table.info, dm_ini_file:r_string(id, "info"))
|
|
else
|
|
temp_table.info = {}
|
|
end
|
|
else
|
|
temp_table.info = {}
|
|
end
|
|
|
|
if category == "anomalies" or category == "place" then
|
|
if dm_ini_file:line_exist(id, "smart") then
|
|
temp_table.smart = dm_ini_file:r_string(id, "smart")
|
|
else
|
|
temp_table.smart = ""
|
|
end
|
|
end
|
|
|
|
temp_table.id = tostring(get_id())
|
|
phrase_table[category][temp_table.id] = temp_table
|
|
end
|
|
end
|
|
end
|
|
|
|
-- Save
|
|
function save_npc(packet, npc_id)
|
|
set_save_marker(packet, "save", false, "dialog_manager")
|
|
if(priority_table.hello[npc_id]~=nil) then
|
|
packet:w_bool(true)
|
|
--[[
|
|
local counter = 0
|
|
for phrase_id,priority in pairs(priority_table.hello[npc_id]) do
|
|
counter = counter + 1
|
|
end
|
|
packet:w_u16(counter)
|
|
for phrase_id,priority in pairs(priority_table.hello[npc_id]) do
|
|
if(phrase_id~="ignore_once") then
|
|
packet:w_stringZ(tostring(phrase_id))
|
|
packet:w_u8(priority)
|
|
else
|
|
packet:w_stringZ(phrase_id)
|
|
packet:w_bool(priority)
|
|
end
|
|
end
|
|
]]
|
|
else
|
|
packet:w_bool(false)
|
|
end
|
|
if(priority_table.job[npc_id]~=nil) then
|
|
packet:w_bool(true)
|
|
--[[
|
|
local counter = 0
|
|
for phrase_id,priority in pairs(priority_table.job[npc_id]) do
|
|
counter = counter + 1
|
|
end
|
|
packet:w_u16(counter)
|
|
for phrase_id,priority in pairs(priority_table.job[npc_id]) do
|
|
if(phrase_id~="ignore_once") then
|
|
packet:w_stringZ(tostring(phrase_id))
|
|
packet:w_u8(priority)
|
|
else
|
|
packet:w_stringZ(phrase_id)
|
|
packet:w_bool(priority)
|
|
end
|
|
end
|
|
]]
|
|
else
|
|
packet:w_bool(false)
|
|
end
|
|
|
|
if(priority_table.anomalies[npc_id]~=nil) then
|
|
packet:w_bool(true)
|
|
--[[
|
|
local counter = 0
|
|
for phrase_id,priority in pairs(priority_table.anomalies[npc_id]) do
|
|
counter = counter + 1
|
|
end
|
|
packet:w_u16(counter)
|
|
for phrase_id,priority in pairs(priority_table.anomalies[npc_id]) do
|
|
if(phrase_id~="ignore_once") then
|
|
packet:w_stringZ(tostring(phrase_id))
|
|
packet:w_u8(priority)
|
|
else
|
|
packet:w_stringZ(phrase_id)
|
|
packet:w_bool(priority)
|
|
end
|
|
end
|
|
]]
|
|
else
|
|
packet:w_bool(false)
|
|
end
|
|
|
|
if(priority_table.place[npc_id]~=nil) then
|
|
packet:w_bool(true)
|
|
--[[
|
|
local counter = 0
|
|
for phrase_id,priority in pairs(priority_table.place[npc_id]) do
|
|
counter = counter + 1
|
|
end
|
|
packet:w_u16(counter)
|
|
for phrase_id,priority in pairs(priority_table.place[npc_id]) do
|
|
if(phrase_id~="ignore_once") then
|
|
packet:w_stringZ(tostring(phrase_id))
|
|
packet:w_u8(priority)
|
|
else
|
|
packet:w_stringZ(phrase_id)
|
|
packet:w_bool(priority)
|
|
end
|
|
end
|
|
]]
|
|
else
|
|
packet:w_bool(false)
|
|
end
|
|
if(priority_table.information[npc_id]~=nil) then
|
|
packet:w_bool(true)
|
|
--[[
|
|
local counter = 0
|
|
for phrase_id,priority in pairs(priority_table.information[npc_id]) do
|
|
counter = counter + 1
|
|
end
|
|
packet:w_u16(counter)
|
|
for phrase_id,priority in pairs(priority_table.information[npc_id]) do
|
|
if(phrase_id~="ignore_once") then
|
|
packet:w_stringZ(tostring(phrase_id))
|
|
packet:w_u8(priority)
|
|
else
|
|
packet:w_stringZ(phrase_id)
|
|
packet:w_bool(priority)
|
|
end
|
|
end
|
|
]]
|
|
else
|
|
packet:w_bool(false)
|
|
end
|
|
set_save_marker(packet, "save", true, "dialog_manager")
|
|
end
|
|
|
|
-- Load
|
|
function load_npc(reader, npc_id)
|
|
set_save_marker(reader, "load", false, "dialog_manager")
|
|
local is_saved = reader:r_bool()
|
|
--[[
|
|
if(is_saved) then
|
|
local counter = reader:r_u16()
|
|
priority_table.hello[npc_id] = {}
|
|
for i=1,counter do
|
|
local phrase_id = reader:r_stringZ()
|
|
if(phrase_id~="ignore_once") then
|
|
priority_table.hello[npc_id][phrase_id] = reader:r_u8()
|
|
else
|
|
priority_table.hello[npc_id][phrase_id] = reader:r_bool()
|
|
end
|
|
end
|
|
end
|
|
]]
|
|
is_saved = reader:r_bool()
|
|
--[[
|
|
if(is_saved) then
|
|
local counter = reader:r_u16()
|
|
priority_table.information[npc_id] = {}
|
|
for i=1,counter do
|
|
local phrase_id = reader:r_stringZ()
|
|
if(phrase_id~="ignore_once") then
|
|
priority_table.information[npc_id][phrase_id] = reader:r_u8()
|
|
else
|
|
priority_table.information[npc_id][phrase_id] = reader:r_bool()
|
|
end
|
|
end
|
|
end
|
|
]]
|
|
|
|
is_saved = reader:r_bool()
|
|
--[[
|
|
if(is_saved) then
|
|
local counter = reader:r_u16()
|
|
priority_table.place[npc_id] = {}
|
|
for i=1,counter do
|
|
local phrase_id = reader:r_stringZ()
|
|
if(phrase_id~="ignore_once") then
|
|
priority_table.place[npc_id][phrase_id] = reader:r_u8()
|
|
else
|
|
priority_table.place[npc_id][phrase_id] = reader:r_bool()
|
|
end
|
|
end
|
|
end
|
|
]]
|
|
is_saved = reader:r_bool()
|
|
--[[
|
|
if(is_saved) then
|
|
local counter = reader:r_u16()
|
|
priority_table.place[npc_id] = {}
|
|
for i=1,counter do
|
|
local phrase_id = reader:r_stringZ()
|
|
if(phrase_id~="ignore_once") then
|
|
priority_table.place[npc_id][phrase_id] = reader:r_u8()
|
|
else
|
|
priority_table.place[npc_id][phrase_id] = reader:r_bool()
|
|
end
|
|
end
|
|
end
|
|
]]
|
|
is_saved = reader:r_bool()
|
|
set_save_marker(reader, "load", true, "dialog_manager")
|
|
end
|
|
|
|
-- Initialize npc start dialog
|
|
function init_start_dialogs(dialog, str)
|
|
local phrase = dialog:AddPhrase("", tostring(0), "", -10000)
|
|
phrase = dialog:AddPhrase("", tostring(1), tostring(0), -10000)
|
|
local script = phrase:GetPhraseScript()
|
|
script:AddAction(string.format("dialog_manager.fill_priority_%s_table", str))
|
|
local ph = false
|
|
|
|
for k,v in pairs(phrase_table[str]) do
|
|
ph = true
|
|
phrase = dialog:AddPhrase(v.name, tostring(v.id), tostring(1), -10000)
|
|
if(phrase) then
|
|
script = phrase:GetPhraseScript()
|
|
script:AddPrecondition(string.format("dialog_manager.precondition_%s_dialogs", str))
|
|
-- script:AddPrecondition("dialog_manager.precondition_not_sim_action_dialog")
|
|
script:AddAction(string.format("dialog_manager.action_%s_dialogs", str))
|
|
-- script:AddAction("dialog_manager.action_sim_action_dialog")
|
|
if(v.wounded=="true") then
|
|
script:AddPrecondition("dialogs.is_wounded")
|
|
-- local bandage_id = get_id()
|
|
local medkit_id = get_id()
|
|
local sorry_id = get_id()
|
|
local thanks_id = get_id()
|
|
-- phrase = dialog:AddPhrase("dm_wounded_bandage", tostring(bandage_id), tostring(v.id), -10000)
|
|
-- script = phrase:GetPhraseScript()
|
|
-- script:AddPrecondition("dialogs.actor_have_bandage")
|
|
-- script:AddAction("dialogs.transfer_bandage")
|
|
-- script:AddAction("dialogs.break_dialog")
|
|
-- phrase = dialog:AddPhrase("dm_wounded_thanks", tostring(thanks_id), tostring(bandage_id), -10000)
|
|
|
|
phrase = dialog:AddPhrase("dm_wounded_medkit", tostring(medkit_id), tostring(v.id), -10000)
|
|
script = phrase:GetPhraseScript()
|
|
script:AddPrecondition("dialogs.actor_have_medkit")
|
|
script:AddAction("dialogs.transfer_medkit")
|
|
script:AddAction("dialogs.break_dialog")
|
|
-- phrase = dialog:AddPhrase("dm_wounded_thanks", tostring(thanks_id), tostring(medkit_id), -10000)
|
|
phrase = dialog:AddPhrase("dm_wounded_sorry", tostring(sorry_id), tostring(v.id), -10000)
|
|
script = phrase:GetPhraseScript()
|
|
script:AddAction("dialogs.break_dialog")
|
|
else
|
|
script:AddPrecondition("dialogs.is_not_wounded")
|
|
end
|
|
end
|
|
end
|
|
--[[
|
|
phrase = dialog:AddPhrase("dm_sim_action_attack_point_none", tostring(get_id()), tostring(1), -10000)
|
|
script = phrase:GetPhraseScript()
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_dialog")
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_attack_point_none")
|
|
script:AddAction("dialog_manager.action_sim_action_dialog")
|
|
|
|
phrase = dialog:AddPhrase("dm_sim_action_attack_point_friend", tostring(get_id()), tostring(1), -10000)
|
|
script = phrase:GetPhraseScript()
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_dialog")
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_attack_point_friend")
|
|
script:AddAction("dialog_manager.action_sim_action_dialog")
|
|
|
|
phrase = dialog:AddPhrase("dm_sim_action_attack_point_enemy", tostring(get_id()), tostring(1), -10000)
|
|
script = phrase:GetPhraseScript()
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_dialog")
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_attack_point_enemy")
|
|
script:AddAction("dialog_manager.action_sim_action_dialog")
|
|
|
|
phrase = dialog:AddPhrase("dm_sim_action_stay_point_none_near", tostring(get_id()), tostring(1), -10000)
|
|
script = phrase:GetPhraseScript()
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_dialog")
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_stay_point_none_near")
|
|
script:AddAction("dialog_manager.action_sim_action_dialog")
|
|
|
|
phrase = dialog:AddPhrase("dm_sim_action_stay_point_enemy_near", tostring(get_id()), tostring(1), -10000)
|
|
script = phrase:GetPhraseScript()
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_dialog")
|
|
script:AddPrecondition("dialog_manager.precondition_sim_action_stay_point_enemy_near")
|
|
script:AddAction("dialog_manager.action_sim_action_dialog")
|
|
]]--
|
|
if not(ph) then
|
|
phrase = dialog:AddPhrase(string.format("dm_%s_general", str), tostring(v.id), tostring(1), -10000)
|
|
end
|
|
end
|
|
|
|
---- Initialize selected actor dialog
|
|
--function init_actor_dialogs(dialog, str)
|
|
-- printf(string.format("init_%s_dialogs", str))
|
|
---- add actor question
|
|
-- local phrase = dialog:AddPhrase(string.format("dm_%s_general", str), tostring(0), "", -10000)
|
|
-- local script = phrase:GetPhraseScript()
|
|
---- set fill priority callback
|
|
---- script:AddPrecondition("dialog_manager.precondition_is_phrase_disabled")
|
|
-- script:AddAction(string.format("dialog_manager.fill_priority_%s_table", str))
|
|
-- script:AddAction("dialog_manager.action_disable_phrase")
|
|
---- set default answer (if no avaliable)
|
|
-- local answer = dialog:AddPhrase(string.format("dm_%s_no_more", str), tostring(1), tostring(0), -10000)
|
|
-- local script = answer:GetPhraseScript()
|
|
-- script:AddPrecondition(string.format("dialog_manager.precondition_%s_dialogs_no_more", str))
|
|
---- add npc answers
|
|
-- for k,v in pairs(phrase_table[str]) do
|
|
-- phrase = dialog:AddPhrase(v.name, tostring(v.id), tostring(0), -10000)
|
|
-- if(phrase) then
|
|
-- script = phrase:GetPhraseScript()
|
|
-- script:AddPrecondition(string.format("dialog_manager.precondition_%s_dialogs", str))
|
|
-- script:AddAction(string.format("dialog_manager.action_%s_dialogs", str))
|
|
-- end
|
|
-- end
|
|
--end
|
|
|
|
-- Initialize new actor dialog
|
|
function init_new_dialog(dialog)
|
|
local actor_table = {
|
|
[1] = "job",
|
|
[2] = "anomalies",
|
|
--[3] = "place",
|
|
[3] = "information",
|
|
}
|
|
local start_phrase_table = {
|
|
[1] = "dm_universal_npc_start_0",
|
|
[2] = "dm_universal_npc_start_1",
|
|
[3] = "dm_universal_npc_start_2",
|
|
[4] = "dm_universal_npc_start_3",
|
|
}
|
|
local precond_table = {
|
|
[1] = "dialogs.npc_stalker",
|
|
[2] = "dialogs.npc_bandit",
|
|
[3] = "dialogs.npc_freedom",
|
|
[4] = "dialogs.npc_dolg",
|
|
}
|
|
|
|
printf("init_new_actor_dialog")
|
|
|
|
local actor_phrase = dialog:AddPhrase("dm_universal_actor_start", tostring(0), "", -10000)
|
|
local actor_script = actor_phrase:GetPhraseScript()
|
|
|
|
for j = 1, 4 do
|
|
local npc_phrase = dialog:AddPhrase(start_phrase_table[j], tostring(j), tostring(0), -10000)
|
|
local npc_phrase_script = npc_phrase:GetPhraseScript()
|
|
npc_phrase_script:AddPrecondition(precond_table[j])
|
|
|
|
for i = 1,#actor_table do
|
|
local index = get_id()
|
|
local str = actor_table[i]
|
|
local phrase = dialog:AddPhrase("dm_"..str.."_general", tostring(index), tostring(j), -10000)
|
|
local script = phrase:GetPhraseScript()
|
|
if str == "anomalies" then
|
|
script:AddPrecondition("dialogs.npc_stalker")
|
|
end
|
|
--script:AddPrecondition("dialog_manager.precondition_is_phrase_disabled")
|
|
script:AddAction("dialog_manager.fill_priority_"..str.."_table")
|
|
--script:AddAction("dialog_manager.action_disable_phrase")
|
|
|
|
for k = 1,3 do
|
|
local answer_no_more = dialog:AddPhrase("dm_"..str.."_no_more_"..tostring(k), tostring(get_id()), tostring(index), -10000)
|
|
local script_no_more = answer_no_more:GetPhraseScript()
|
|
script_no_more:AddPrecondition("dialog_manager.precondition_"..str.."_dialogs_no_more")
|
|
local answer_do_not_know = dialog:AddPhrase("dm_"..str.."_do_not_know_"..tostring(k), tostring(get_id()), tostring(index), -10000)
|
|
local script_do_not_know = answer_do_not_know:GetPhraseScript()
|
|
script_do_not_know:AddPrecondition("dialog_manager.precondition_"..str.."_dialogs_do_not_know")
|
|
end
|
|
|
|
for k,v in pairs(phrase_table[str]) do
|
|
phrase = dialog:AddPhrase(v.name, tostring(v.id), tostring(index), -10000)
|
|
if(phrase) then
|
|
script = phrase:GetPhraseScript()
|
|
script:AddPrecondition("dialog_manager.precondition_"..str.."_dialogs")
|
|
script:AddAction("dialog_manager.action_"..str.."_dialogs")
|
|
end
|
|
end
|
|
end
|
|
|
|
local actor_exit_phrase = dialog:AddPhrase("dm_universal_actor_exit", tostring(get_id()), tostring(j), -10000)
|
|
end
|
|
|
|
end
|
|
|
|
-- Fill selected priority table
|
|
function fill_priority_table(npc, PT_subtable, PRT_subtable)
|
|
local npc_id = npc:id()
|
|
if(PRT_subtable[npc_id]==nil) then
|
|
-- if subtable for npc is not set - create it
|
|
PRT_subtable[npc_id] = {}
|
|
end
|
|
for num, phrase in pairs(PT_subtable) do
|
|
-- calculate priority for each phrase
|
|
local pr = calculate_priority(PRT_subtable, phrase, npc, phrase.id)
|
|
log("--->phrase ["..phrase.name.."] priority ["..pr.."]")
|
|
end
|
|
end
|
|
|
|
function is_told(npc, str)
|
|
if priority_table[str][npc:id()] and priority_table[str][npc:id()].told and priority_table[str][npc:id()].told == true then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
-- Calculate precondition for default phrase in information dialog
|
|
function precondition_no_more(npc, str)
|
|
local pr, id = get_highest_priority_phrase(phrase_table[str], priority_table[str], npc)
|
|
if(pr<0) or (id==0) then
|
|
-- if there is no phrase with priority greater than -1 or there is no phrases in table
|
|
printf("there is no avaliable "..str.." dialogs")
|
|
-- show default phrase
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- Calculate phrase's preconditions
|
|
function precondition(npc, PT_subtable, PRT_subtable, phrase_id)
|
|
if PRT_subtable[npc:id()] and PRT_subtable[npc:id()].told and PRT_subtable[npc:id()].told == true then
|
|
return false
|
|
end
|
|
-- recalculate current phrase priority
|
|
local priority = calculate_priority(PRT_subtable, PT_subtable[phrase_id], npc, phrase_id)
|
|
-- if current phrase is with highest priority - show it
|
|
return is_highest_priority_phrase(PT_subtable, PRT_subtable, npc, phrase_id)
|
|
end
|
|
|
|
-- Calculate phrase priority
|
|
function calculate_priority(PRT_subtable, PTID_subtable, npc, phrase_id)
|
|
local f_level = false
|
|
local f_comm = false
|
|
local priority = -1
|
|
local npc_id = npc:id()
|
|
|
|
if(PTID_subtable.npc_community=="not_set") then
|
|
f_comm = true
|
|
elseif(PTID_subtable.npc_community[1]=="all") then
|
|
priority = priority + 1
|
|
f_comm = true
|
|
else
|
|
for i=1,#PTID_subtable.npc_community do
|
|
if(PTID_subtable.npc_community[i]==character_community(npc)) then
|
|
priority = priority + 2
|
|
f_comm = true
|
|
break
|
|
end
|
|
end
|
|
priority = priority - 1
|
|
end
|
|
|
|
if(PTID_subtable.level=="not_set") then
|
|
f_level = true
|
|
elseif(PTID_subtable.level[1]=="all") then
|
|
priority = priority + 1
|
|
f_level = true
|
|
else
|
|
for i=1,#PTID_subtable.level do
|
|
if(PTID_subtable.level[i]==level.name()) then
|
|
priority = priority + 2
|
|
f_level = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
if(PTID_subtable.actor_community=="not_set") then
|
|
priority = priority + 0
|
|
elseif(PTID_subtable.actor_community=="all") then
|
|
priority = priority + 1
|
|
else
|
|
for i=1,#PTID_subtable.actor_community do
|
|
if(PTID_subtable.actor_community[i]==character_community(db.actor)) then
|
|
priority = priority + 2
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
if(PTID_subtable.wounded=="true") then
|
|
--if not(xr_wounded.is_heavy_wounded_by_id(npc:id())) then
|
|
if not(xr_wounded.is_wounded(npc)) then
|
|
priority = -1
|
|
else
|
|
priority = priority + 1
|
|
end
|
|
else
|
|
|
|
--if(xr_wounded.is_heavy_wounded_by_id(npc:id())) then
|
|
if(xr_wounded.is_wounded(npc)) then
|
|
priority = -1
|
|
else
|
|
priority = priority + 1
|
|
end
|
|
end
|
|
|
|
if f_comm == false or f_level == false then
|
|
priority = -1
|
|
end
|
|
|
|
if(PRT_subtable[npc:id()].ignore_once) then
|
|
if(PTID_subtable.once=="true") then
|
|
priority = -1
|
|
end
|
|
end
|
|
|
|
if(PRT_subtable[npc_id][phrase_id]~=nil) and (PRT_subtable[npc_id][phrase_id]==255) then
|
|
-- if there was set the highest priority for phrase
|
|
priority = 255
|
|
end
|
|
|
|
for k,v in pairs(PTID_subtable.info) do
|
|
if v.name then
|
|
if v.required == true then
|
|
if not has_alife_info(v.name) then
|
|
priority = -1
|
|
break
|
|
end
|
|
else
|
|
if has_alife_info(v.name) then
|
|
priority = -1
|
|
break
|
|
end
|
|
end
|
|
--[[
|
|
elseif v.func then
|
|
if v.expected == true then
|
|
else
|
|
end
|
|
]]--
|
|
end
|
|
end
|
|
|
|
|
|
PRT_subtable[npc_id][phrase_id] = priority
|
|
return priority
|
|
end
|
|
|
|
-- Set phrase end action
|
|
function told(PRT_subtable, npc)
|
|
PRT_subtable[npc:id()].told = true
|
|
end
|
|
|
|
function action(PT_subtable, PRT_subtable, cur_phrase_id, npc)
|
|
if not(PRT_subtable[npc:id()].ignore_once) then
|
|
if(PT_subtable[cur_phrase_id].once=="true") then
|
|
set_phrase_highest_priority(PRT_subtable, npc:id(), cur_phrase_id)
|
|
end
|
|
PRT_subtable[npc:id()].ignore_once = true
|
|
end
|
|
end
|
|
|
|
-- Set the highest priority to selected phrase
|
|
function set_phrase_highest_priority(PRT_subtable, npc_id, phrase_id)
|
|
if(PRT_subtable[npc_id]~=nil) then
|
|
PRT_subtable[npc_id][phrase_id] = 255
|
|
else
|
|
PRT_subtable[npc_id] = {}
|
|
PRT_subtable[npc_id][phrase_id] = 255
|
|
end
|
|
end
|
|
|
|
-- Reset phrase priority
|
|
function reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
|
|
local npc_id = npc:id()
|
|
if(PRT_subtable[npc_id]~=nil) then
|
|
PRT_subtable[npc_id][phrase_id] = -1
|
|
else
|
|
-- if there is no such npc id in table then create it
|
|
PRT_subtable[npc_id] = {}
|
|
-- and calculate priority for this phrase
|
|
PRT_subtable[npc_id][phrase_id] = calculate_priority(PRT_subtable, PT_subtable[phrase_id], npc, phrase_id)
|
|
end
|
|
end
|
|
|
|
-- Is the phrase priority the highest?
|
|
function is_highest_priority_phrase(PT_subtable, PRT_subtable, npc, phrase_id)
|
|
local npc_id = npc:id()
|
|
if(PRT_subtable[npc_id]~=nil) then
|
|
-- if there is a subtable for this npc
|
|
local id = phrase_id
|
|
local pr = PRT_subtable[npc_id][phrase_id]
|
|
if pr < 0 then
|
|
return false
|
|
end
|
|
for phr_id, priority in pairs(PRT_subtable[npc_id]) do
|
|
-- iterate through array to get if selected phrase is with the highest priority
|
|
if(phr_id~="ignore_once" and phr_id~="told") then
|
|
if(priority>pr) then
|
|
return false
|
|
end
|
|
end
|
|
end
|
|
return true
|
|
else
|
|
-- if there is no subtable for this npc - create it
|
|
reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
|
|
return false
|
|
end
|
|
end
|
|
|
|
-- Get the phrase with the highest priority
|
|
function get_highest_priority_phrase(PT_subtable, PRT_subtable, npc)
|
|
local npc_id = npc:id()
|
|
if(PRT_subtable[npc_id]~=nil) then
|
|
-- if there is a subtable for this npc
|
|
local id = 0
|
|
local pr = -1
|
|
for phr_id, priority in pairs(PRT_subtable[npc_id]) do
|
|
-- iterate through array for the highest priority phrase
|
|
if(phr_id~="ignore_once" and phr_id~="told") then
|
|
if(priority>pr) then
|
|
pr = priority
|
|
id = phr_id
|
|
end
|
|
end
|
|
end
|
|
return pr, id
|
|
else
|
|
-- if there is no subtable for this npc - create it
|
|
reset_phrase_priority(PT_subtable, PRT_subtable, npc, phrase_id)
|
|
return -1, 0
|
|
end
|
|
end
|
|
--------------------------------------------------------------------------------
|
|
-- Initializing, filling priority tables, setting preconditions and actions
|
|
--------------------------------------------------------------------------------
|
|
-- Initialize npc hello start dialog
|
|
function init_hello_dialogs(dialog)
|
|
init_start_dialogs(dialog, "hello")
|
|
end
|
|
|
|
-- Fill phrase priority table for hello start dialog
|
|
function fill_priority_hello_table(actor, npc, dialog_name, phrase_id)
|
|
fill_priority_table(npc, phrase_table.hello, priority_table.hello)
|
|
end
|
|
|
|
-- Fill phrase priority table for new dialog
|
|
function fill_priority_job_table(actor, npc, dialog_name, phrase_id)
|
|
fill_priority_table(npc, phrase_table.job, priority_table.job)
|
|
end
|
|
function fill_priority_anomalies_table(actor, npc, dialog_name, phrase_id)
|
|
fill_priority_table(npc, phrase_table.anomalies, priority_table.anomalies)
|
|
end
|
|
--function fill_priority_place_table(actor, npc, dialog_name, phrase_id)
|
|
-- fill_priority_table(npc, phrase_table.place, priority_table.place)
|
|
--end
|
|
function fill_priority_information_table(actor, npc, dialog_name, phrase_id)
|
|
fill_priority_table(npc, phrase_table.information, priority_table.information)
|
|
end
|
|
|
|
-- Calculate precondition for phrases in hello start dialog
|
|
function precondition_hello_dialogs(npc, actor, dialog_name, parent_id, id)
|
|
return precondition(npc, phrase_table.hello, priority_table.hello, id)
|
|
end
|
|
-- Set phrase end action for hello start dialog
|
|
function action_hello_dialogs(npc, actor, dialog_name, id)
|
|
action(phrase_table.hello, priority_table.hello, id, npc)
|
|
end
|
|
|
|
-- Calculate precondition for default phrase in occupation dialog
|
|
function precondition_job_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
|
|
if is_told(npc, "job") == true then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function precondition_job_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
|
|
return precondition_no_more(npc, "job")
|
|
end
|
|
|
|
-- Calculate preconditions for phrases in occupation dialog
|
|
function precondition_job_dialogs(npc, actor, dialog_name, parent_id, id)
|
|
return precondition(npc, phrase_table.job, priority_table.job, id)
|
|
end
|
|
-- Set phrase end action for occupation dialog
|
|
function action_job_dialogs(npc, actor, dialog_name, id)
|
|
action(phrase_table.job, priority_table.job, id, npc)
|
|
told(priority_table.job, npc)
|
|
end
|
|
|
|
-- Calculate precondition for default phrase in anomalies dialog
|
|
function precondition_anomalies_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
|
|
if is_told(npc, "anomalies") == true then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function precondition_anomalies_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
|
|
return precondition_no_more(npc, "anomalies")
|
|
end
|
|
-- Calculate preconditions for phrases in anomalies dialog
|
|
function precondition_anomalies_dialogs(npc, actor, dialog_name, parent_id, id)
|
|
local smart = xr_gulag.get_npc_smart(npc)
|
|
if smart ~= nil and tostring(smart:name()) == phrase_table.anomalies[id].smart then
|
|
priority_table.anomalies[npc:id()][id] = -1
|
|
return false
|
|
end
|
|
return precondition(npc, phrase_table.anomalies, priority_table.anomalies, id)
|
|
end
|
|
-- Set phrase end action for information dialog
|
|
function action_anomalies_dialogs(npc, actor, dialog_name, id)
|
|
action(phrase_table.anomalies, priority_table.anomalies, id, npc)
|
|
told(priority_table.anomalies, npc)
|
|
end
|
|
|
|
--[[
|
|
-- Calculate precondition for default phrase in place dialog
|
|
function precondition_place_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
|
|
local f_place = false
|
|
if is_told(npc, "place") == true then
|
|
return true
|
|
end
|
|
local smart = xr_gulag.get_npc_smart(npc)
|
|
if not smart then
|
|
return true
|
|
end
|
|
for k,v in pairs(phrase_table.place) do
|
|
if smart:name() == v.smart then
|
|
for i = 1,#v.level do
|
|
if level.name() == v.level[i] then
|
|
f_place = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
if f_place == true then
|
|
break
|
|
end
|
|
end
|
|
if f_place == false then
|
|
return true
|
|
end
|
|
return precondition_no_more(npc, "place")
|
|
end
|
|
-- Calculate preconditions for phrases in place dialog
|
|
function precondition_place_dialogs(npc, actor, dialog_name, parent_id, id)
|
|
local smart = xr_gulag.get_npc_smart(npc)
|
|
if smart ~= nil then
|
|
if tostring(smart:name()) ~= phrase_table.place[id].smart then
|
|
priority_table.place[npc:id()][id] = -1
|
|
return false
|
|
end
|
|
else
|
|
priority_table.place[npc:id()][id] = -1
|
|
return false
|
|
end
|
|
return precondition(npc, phrase_table.place, priority_table.place, id)
|
|
end
|
|
-- Set phrase end action for place dialog
|
|
function action_place_dialogs(npc, actor, dialog_name, id)
|
|
action(phrase_table.place, priority_table.place, id, npc)
|
|
told(priority_table.place, npc)
|
|
end
|
|
]]--
|
|
|
|
-- Calculate precondition for default phrase in information dialog
|
|
function precondition_information_dialogs_no_more(npc, actor, dialog_name, parent_id, id)
|
|
if is_told(npc, "information") == true then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function precondition_information_dialogs_do_not_know(npc, actor, dialog_name, parent_id, id)
|
|
return precondition_no_more(npc, "information")
|
|
end
|
|
-- Calculate preconditions for phrases in information dialog
|
|
function precondition_information_dialogs(npc, actor, dialog_name, parent_id, id)
|
|
return precondition(npc, phrase_table.information, priority_table.information, id)
|
|
end
|
|
-- Set phrase end action for information dialog
|
|
function action_information_dialogs(npc, actor, dialog_name, id)
|
|
action(phrase_table.information, priority_table.information, id, npc)
|
|
told(priority_table.information, npc)
|
|
end
|
|
|
|
local rnd = 0
|
|
|
|
function precondition_is_phrase_disabled(fs,ss,dn,ppi,pi)
|
|
local npc = dialogs.who_is_npc(fs, ss)
|
|
if(pi=="") then
|
|
pi = dn
|
|
end
|
|
if (disabled_phrases[npc:id()] and disabled_phrases[npc:id()][pi]) or
|
|
(quest_disabled_phrases[npc:id()] and quest_disabled_phrases[npc:id()][pi]) then
|
|
return false
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
|
|
function action_disable_phrase(fs,ss,dn,pi)
|
|
local npc = dialogs.who_is_npc(fs, ss)
|
|
if(pi=="0") then
|
|
pi = dn
|
|
end
|
|
if(disabled_phrases[npc:id()]==nil) then
|
|
disabled_phrases[npc:id()] = {}
|
|
end
|
|
disabled_phrases[npc:id()][pi] = true
|
|
end
|
|
|
|
function action_disable_quest_phrase(fs,ss,dn,pi)
|
|
local npc = dialogs.who_is_npc(fs, ss)
|
|
if(pi=="0") then
|
|
pi = dn
|
|
end
|
|
if(quest_disabled_phrases[npc:id()]==nil) then
|
|
quest_disabled_phrases[npc:id()] = {}
|
|
end
|
|
quest_disabled_phrases[npc:id()][pi] = true
|
|
end
|
|
|
|
function create_bye_phrase()
|
|
if(rnd==0) then
|
|
rnd = math.random(1, 99)
|
|
end
|
|
if(rnd>=66) then
|
|
return game.translate_string("actor_break_dialog_1")
|
|
elseif(rnd>=33) then
|
|
return game.translate_string("actor_break_dialog_2")
|
|
else
|
|
return game.translate_string("actor_break_dialog_3")
|
|
end
|
|
end
|
|
|
|
function uni_dialog_precond(first_speaker, second_speaker)
|
|
local npc = dialogs.who_is_npc(first_speaker, second_speaker)
|
|
return character_community(npc) == "stalker" or
|
|
character_community(npc) == "bandit" or
|
|
character_community(npc) == "freedom" or
|
|
character_community(npc) == "dolg"
|
|
end
|
|
|
|
--[[
|
|
function restore_npc_disabled_phrases(npc_id)
|
|
disabled_phrases[npc_id] = nil
|
|
end
|
|
-- Set phrase end action for place dialog
|
|
function action_sim_action_dialog(npc, actor, dialog_name, id)
|
|
rnd = 0
|
|
end
|
|
-- Precondition for simulation answer
|
|
function precondition_sim_action_dialog(npc, actor, dialog_name)
|
|
local squad = get_object_squad(npc)
|
|
if(xr_wounded.is_heavy_wounded_by_id(npc:id())) then
|
|
return false
|
|
end
|
|
if(squad~=nil) then
|
|
if(squad.current_action~=nil) then
|
|
if(rnd==0) then
|
|
rnd = math.random(1, 100)
|
|
end
|
|
if(rnd>0) then
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
-- Precondition for simulation answer
|
|
function precondition_not_sim_action_dialog(npc, actor, dialog_name)
|
|
return not(precondition_sim_action_dialog(npc, actor, dialog_name))
|
|
end
|
|
-- Precondition for simulation answer
|
|
function precondition_sim_action_attack_point_none(npc, actor, dialog_name)
|
|
local squad = get_object_squad(npc)
|
|
if(squad.current_action.name=="attack_point") then
|
|
local smart = sim_board.get_sim_board().smarts[squad.current_action.dest_smrt_id].smrt
|
|
if(smart.player_name=="none") then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
-- Precondition for simulation answer
|
|
function precondition_sim_action_attack_point_friend(npc, actor, dialog_name)
|
|
local squad = get_object_squad(npc)
|
|
if(squad.current_action.name=="attack_point") then
|
|
local smart = sim_board.get_sim_board().smarts[squad.current_action.dest_smrt_id].smrt
|
|
if(smart.player_name==squad.player_id) then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
-- Precondition for simulation answer
|
|
function precondition_sim_action_attack_point_enemy(npc, actor, dialog_name)
|
|
local squad = get_object_squad(npc)
|
|
if(squad.current_action.name=="attack_point") then
|
|
local smart = sim_board.get_sim_board().smarts[squad.current_action.dest_smrt_id].smrt
|
|
if(smart.player_name~=squad.player_id) and (smart.player_name~="none") then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
-- Precondition for simulation answer
|
|
function precondition_sim_action_stay_point_none_near(npc, actor, dialog_name)
|
|
return true
|
|
end
|
|
-- Precondition for simulation answer
|
|
function precondition_sim_action_stay_point_enemy_near(npc, actor, dialog_name)
|
|
return false
|
|
end
|
|
]]--
|