e4s-sdk/gamedata/scripts/gulag_general.script
2026-06-17 23:06:51 +03:00

1023 lines
40 KiB
Text
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local ltx
function load_job(smart)
printf("LOAD JOB %s", smart:name())
-- Иерархия задается таблицей вида:
--[[
self.jobs = {
{
_precondition_is_monster = true,
_precondition_function = function(se_obj) ... end,
_prior = ...,
jobs = {
_precondition_function = function(se_obj) ... end,
_prior = ...
job_id = ...
},
{
_precondition_function = function(se_obj) ... end,
_prior = ...
job_id = ...
}
},
{
_precondition_is_monster = false,
_prior = ...
job_id = ...
},
...
{},
}
]]
local gname = smart:name()
local t
local board = sim_board.get_sim_board()
local job_table = {}
ltx = "" ..
"[meet@generic_lager]\n"..
"close_distance = {=is_wounded} 0, 2\n"..
"close_anim = {=is_wounded} nil, {!is_squad_commander} nil, {=actor_has_weapon} threat_na, talk_default\n"..
"close_snd_hello = {=is_wounded} nil, {!is_squad_commander} nil, {=actor_enemy} nil, {=actor_has_weapon} meet_hide_weapon, meet_hello\n"..
"close_snd_bye = {=is_wounded} nil, {!is_squad_commander} nil, {=actor_enemy} nil, {=actor_has_weapon} nil, meet_hello\n"..
"close_victim = {=is_wounded} nil, {!is_squad_commander} nil, actor\n"..
"far_distance = 0\n"..
"far_anim = nil\n"..
"far_snd = nil\n"..
"far_victim = nil\n"..
"use = {=is_wounded} false, {!is_squad_commander} false, {=actor_enemy} false, {=has_enemy} false, {=actor_has_weapon} false, {=dist_to_actor_le(3)} true, false\n"..
"snd_on_use = {=is_wounded} nil, {=actor_enemy} nil, {!is_squad_commander} meet_use_no_talk_leader, {=actor_has_weapon} meet_use_no_weapon, {=has_enemy} meet_use_no_fight, {=dist_to_actor_le(3)} meet_use_no_default, nil\n"..
"meet_dialog = nil\n"..
"abuse = {=has_enemy} false, true\n"..
"trade_enable = true\n"..
"allow_break = true\n"..
"use_text = nil\n"..
"[meet@generic_animpoint]\n"..
"close_distance = 0\n"..
"close_anim = {!is_squad_commander} nil, nil\n"..
"close_snd_hello = {!is_squad_commander} nil, nil\n"..
"close_snd_bye = {!is_squad_commander} nil, nil\n"..
"close_victim = {!is_squad_commander} nil, nil\n"..
"far_distance = 0\n"..
"far_anim = nil\n"..
"far_snd = nil\n"..
"far_victim = nil\n"..
"use = {=is_wounded} false, {!is_squad_commander} false, {=actor_enemy} false, {=has_enemy} false, {=actor_has_weapon} false, {=dist_to_actor_le(3)} true, false\n"..
"snd_on_use = {=is_wounded} nil, {=actor_enemy} nil, {!is_squad_commander} meet_use_no_talk_leader, {=actor_has_weapon} meet_use_no_weapon, {=has_enemy} meet_use_no_fight, {=dist_to_actor_le(3)} meet_use_no_default, nil\n"..
"meet_dialog = nil\n"..
"abuse = {=has_enemy} false, true\n"..
"trade_enable = true\n"..
"allow_break = true\n"..
"meet_on_talking = false\n"..
"use_text = nil\n"
--'------------------------------------------------------------------------
--' РАБОТЫ СТАЛКЕРОВ
--'------------------------------------------------------------------------
local stalker_jobs = {_precondition_is_monster = false, _prior = 60, jobs = {}}
--'------------------------------------------------------------------------
--' ОБЫЧНОЕ СОСТОЯНИЕ
--'------------------------------------------------------------------------
--'------------------------------------------------------------------------
--' GENERIC POINT
--'------------------------------------------------------------------------
-- Проверяем наличие патрулей обхода в лагере.
local stalker_generic_point = {_prior = 3, jobs = {}}
for it=1,20 do
-- Необходимо вычитать количество работ из названия точки пути.
local name = gname.."_point_"..it
-- добавляем должность
t = { _prior = 3,
job_id = { section = "logic@"..name,
job_type = "point_job" }
}
table.insert(stalker_generic_point.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..name.."]\n"..
"active = cover@"..name.."\n"..
"[cover@"..name.."]\n"..
"meet = meet@generic_lager\n"..
"smart = "..gname.."\n"..
"radius_min = 3\n"..
"radius_max = 8\n"..
"use_attack_direction = false\n"..
"anim = {!npc_community(zombied)} sit, guard\n"
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
if smart.base_on_actor_control ~= nil and
smart.base_on_actor_control.ignore_zone ~= nil
then
job_ltx = job_ltx .."combat_ignore_cond = {=npc_in_zone(smart.base_on_actor_control.ignore_zone)} true \n"..
"combat_ignore_keep_when_attacked = true \n"
end
ltx = ltx..job_ltx
end
table.insert(stalker_jobs.jobs, stalker_generic_point)
--'------------------------------------------------------------------------
--' SURGE
--'------------------------------------------------------------------------
-- Проверяем наличие путей брожения внутри лагеря.
local stalker_surge = {_prior = 50, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_surge_"..it.."_walk") do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_surge_"..it.."_walk"
-- добавляем должность
t = { _prior = 50,
job_id = { section = "logic@"..way_name,
job_type = "path_job" },
_precondition_params = { },
_precondition_function = function(se_obj, smart, precond_params)
return xr_conditions.surge_started()
end
}
table.insert(stalker_surge.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = walker@"..way_name.."\n"..
"[walker@"..way_name.."]\n"..
"sound_idle = state\n"..
"use_camp = true\n"..
"meet = meet@generic_lager\n"..
"path_walk = surge_"..it.."_walk\n"..
"def_state_standing = guard\n"..
"def_state_moving = patrol\n"
if level.patrol_path_exists(gname.."_surge_"..it.."_look") then
job_ltx = job_ltx.."path_look = surge_"..it.."_look\n"
end
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
if smart.base_on_actor_control ~= nil and
smart.base_on_actor_control.ignore_zone ~= nil and
xr_gulag.job_in_restrictor(smart, smart.base_on_actor_control.ignore_zone, way_name)
then
job_ltx = job_ltx .."combat_ignore_cond = {=npc_in_zone(smart.base_on_actor_control.ignore_zone)} true \n"..
"combat_ignore_keep_when_attacked = true \n"
end
ltx = ltx..job_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_surge) end
-- START IX-Ray
--'------------------------------------------------------------------------
--' kamp
--'------------------------------------------------------------------------
local stalker_kamp = {_prior = 14, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_kamp_"..it) do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_kamp_"..it
local job_count = 5
for i = 1, job_count do
-- добавляем должность
t = { _prior = 10+i,
job_id = { section = "logic@"..way_name,
job_type = "point_job" },
_precondition_params = { },
_precondition_function = function(se_obj, smart, precond_params)
if smart.smart_alarm_time == nil then
return true
end
if smart.safe_restr == nil then
return true
end
if precond_params.is_safe_job == nil then
precond_params.is_safe_job = xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name)
end
return precond_params.is_safe_job ~= false
end
}
table.insert(stalker_kamp.jobs, t)
end
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = kamp@"..way_name.."\n"..
"[kamp@"..way_name.."]\n"..
"meet = meet@generic_lager\n"..
"center_point = kamp_"..it.."\n"
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
if smart.base_on_actor_control ~= nil and
smart.base_on_actor_control.ignore_zone ~= nil and
xr_gulag.job_in_restrictor(smart, smart.base_on_actor_control.ignore_zone, way_name)
then
job_ltx = job_ltx .."combat_ignore_cond = {=npc_in_zone(smart.base_on_actor_control.ignore_zone)} true \n"..
"combat_ignore_keep_when_attacked = true \n"
end
ltx = ltx..job_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_kamp) end
-- END IX-Ray
--'------------------------------------------------------------------------
--' SLEEP
--'------------------------------------------------------------------------
-- Проверяем наличие путей для сна.
local stalker_sleep = {_prior = 10, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_sleep_"..it) do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_sleep_"..it
-- добавляем должность
t = { _prior = 10,
job_id = { section = "logic@"..way_name,
job_type = "path_job" },
_precondition_params = { },
_precondition_function = function(se_obj, smart, precond_params)
if se_obj:community() == "zombied" then
return false
end
if not in_time_interval(21,7) then
return false
end
if smart.smart_alarm_time == nil then
return true
end
if smart.safe_restr == nil then
return true
end
if precond_params.is_safe_job == nil then
precond_params.is_safe_job = xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name)
end
return precond_params.is_safe_job ~= false
end
}
table.insert(stalker_sleep.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = sleeper@"..way_name.."\n"..
"[sleeper@"..way_name.."]\n"..
"path_main = sleep_"..it.."\n"
if smart.safe_restr ~= nil and xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name) then
job_ltx = job_ltx .. "invulnerable = {=npc_in_zone(smart.safe_restr)} true\n"
end
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
if smart.base_on_actor_control ~= nil and
smart.base_on_actor_control.ignore_zone ~= nil and
xr_gulag.job_in_restrictor(smart, smart.base_on_actor_control.ignore_zone, way_name)
then
job_ltx = job_ltx .."combat_ignore_cond = {=npc_in_zone(smart.base_on_actor_control.ignore_zone)} true \n"..
"combat_ignore_keep_when_attacked = true \n"
end
ltx = ltx..job_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_sleep) end
--'------------------------------------------------------------------------
--' COLLECTOR
--'------------------------------------------------------------------------
-- Проверяем наличие путей брожения внутри лагеря.
local stalker_collector = {_prior = 25, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_collector_"..it.."_walk") do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_collector_"..it.."_walk"
-- добавляем должность
t = { _prior = 25,
job_id = { section = "logic@"..way_name,
job_type = "path_job" },
_precondition_params = { },
_precondition_function = function(se_obj, smart, precond_params)
if se_obj:community() == "zombied" then
return false
end
-- Проверяем, что у НПС есть детектор.
local st = db.storage[se_obj.id]
if st == nil then
return false
end
local npc = st.object
if npc == nil then
return false
end
local detectors = { "detector_simple", "detector_advanced", "detector_elite", "detector_scientific" }
for k,v in pairs(detectors) do
local obj = npc:object(v)
if obj ~= nil then
return true
end
end
return false
end
}
table.insert(stalker_collector.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = walker@"..way_name.."\n"..
"[walker@"..way_name.."]\n"..
"sound_idle = state\n"..
"meet = meet@generic_lager\n"..
"path_walk = collector_"..it.."_walk\n"..
"def_state_standing = guard\n"..
"def_state_moving = patrol\n"
if level.patrol_path_exists(gname.."_collector_"..it.."_look") then
job_ltx = job_ltx.."path_look = collector_"..it.."_look\n"
end
if smart.safe_restr ~= nil and xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name) then
job_ltx = job_ltx .. "invulnerable = {=npc_in_zone(smart.safe_restr)} true\n"
end
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
if smart.base_on_actor_control ~= nil and
smart.base_on_actor_control.ignore_zone ~= nil and
xr_gulag.job_in_restrictor(smart, smart.base_on_actor_control.ignore_zone, way_name)
then
job_ltx = job_ltx .."combat_ignore_cond = {=npc_in_zone(smart.base_on_actor_control.ignore_zone)} true \n"..
"combat_ignore_keep_when_attacked = true \n"
end
ltx = ltx..job_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_collector) end
--'------------------------------------------------------------------------
--' WALKER
--'------------------------------------------------------------------------
-- Проверяем наличие путей брожения внутри лагеря.
local stalker_walker = {_prior = 15, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_walker_"..it.."_walk") do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_walker_"..it.."_walk"
-- добавляем должность
t = { _prior = 15,
job_id = { section = "logic@"..way_name,
job_type = "path_job" },
_precondition_params = { },
_precondition_function = function(se_obj, smart, precond_params)
if smart.smart_alarm_time == nil then
return true
end
if smart.safe_restr == nil then
return true
end
if precond_params.is_safe_job == nil then
precond_params.is_safe_job = xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name)
end
return precond_params.is_safe_job ~= false
end
}
table.insert(stalker_walker.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = walker@"..way_name.."\n"..
"[walker@"..way_name.."]\n"..
"sound_idle = state\n"..
"meet = meet@generic_lager\n"..
"path_walk = walker_"..it.."_walk\n"..
"def_state_standing = guard\n"..
"def_state_moving = patrol\n"
if level.patrol_path_exists(gname.."_walker_"..it.."_look") then
job_ltx = job_ltx.."path_look = walker_"..it.."_look\n"
end
if smart.safe_restr ~= nil and xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name) then
job_ltx = job_ltx .. "invulnerable = {=npc_in_zone(smart.safe_restr)} true\n"
end
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
if smart.base_on_actor_control ~= nil and
smart.base_on_actor_control.ignore_zone ~= nil and
xr_gulag.job_in_restrictor(smart, smart.base_on_actor_control.ignore_zone, way_name)
then
job_ltx = job_ltx .."combat_ignore_cond = {=npc_in_zone(smart.base_on_actor_control.ignore_zone)} true \n"..
"combat_ignore_keep_when_attacked = true \n"
end
ltx = ltx..job_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_walker) end
--'------------------------------------------------------------------------
--' PATROL
--'------------------------------------------------------------------------
-- Проверяем наличие патрулей обхода в лагере.
local stalker_patrol = {_prior = 20, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_patrol_"..it.."_walk") do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_patrol_"..it.."_walk"
local ptr = patrol(way_name)
local wp_prop = utils.parse_waypoint_data(way_name, ptr:flags(0), ptr:name(0))
local job_count = 3
if wp_prop.count ~= nil then
job_count = wp_prop.count
end
for i = 1, job_count do
-- добавляем должность
t = { _prior = 20,
job_id = { section = "logic@"..way_name,
job_type = "path_job" },
_precondition_params = { },
_precondition_function = function(se_obj, smart, precond_params)
if se_obj:community() == "zombied" then
return false
end
if smart.smart_alarm_time == nil then
return true
end
if smart.safe_restr == nil then
return true
end
if precond_params.is_safe_job == nil then
precond_params.is_safe_job = xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name)
end
return precond_params.is_safe_job ~= false
end
}
table.insert(stalker_patrol.jobs, t)
end
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = patrol@"..way_name.."\n"..
"[patrol@"..way_name.."]\n"..
"meet = meet@generic_lager\n"..
"formation = back\n"..
"path_walk = patrol_"..it.."_walk\n"..
"on_signal = end| %=search_gulag_job%\n"
if level.patrol_path_exists(gname.."_patrol_"..it.."_look") then
job_ltx = job_ltx.."path_look = patrol_"..it.."_look\n"
end
if smart.safe_restr ~= nil and xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name) then
job_ltx = job_ltx .. "invulnerable = {=npc_in_zone(smart.safe_restr)} true\n"
end
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
ltx = ltx..job_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_patrol) end
--'------------------------------------------------------------------------
--' XR_ANIMPOINT
--'------------------------------------------------------------------------
-- Проверяем наличие патрулей обхода в лагере.
it = 1
while se_smart_cover.registered_smartcovers[gname.."_animpoint_"..it] ~= nil do
-- Необходимо вычитать количество работ из названия точки пути.
local smartcover_name = gname.."_animpoint_"..it
-- добавляем должность
t = { _prior = 15,
job_id = { section = "logic@"..smartcover_name,
job_type = "smartcover_job" },
_precondition_params = { },
_precondition_function = function(se_obj, smart, precond_params)
--if smart.smart_alarm_time == nil then
--return true
--end
--if smart.safe_restr == nil then
-- return true
--end
if se_obj:community() == "zombied" then
return false
end
--if precond_params.is_safe_job == nil then
-- precond_params.is_safe_job = xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name)
--end
--return precond_params.is_safe_job ~= false
return true
end
}
table.insert(stalker_jobs.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..smartcover_name.."]\n"..
"active = animpoint@"..smartcover_name.."\n"..
"[animpoint@"..smartcover_name.."]\n"..
"meet = meet@generic_animpoint\n"..
"cover_name = "..smartcover_name.."\n"
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
if smart.safe_restr ~= nil and xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name) then
job_ltx = job_ltx .. "invulnerable = {=npc_in_zone(smart.safe_restr)} true\n"
end
if smart.base_on_actor_control ~= nil and
smart.base_on_actor_control.ignore_zone ~= nil
then
job_ltx = job_ltx .."combat_ignore_cond = {=npc_in_zone(smart.base_on_actor_control.ignore_zone)} true \n"..
"combat_ignore_keep_when_attacked = true \n"
end
ltx = ltx..job_ltx
it = it + 1
end
--'------------------------------------------------------------------------
--' GUARD
--'------------------------------------------------------------------------
-- Проверяем наличие часовых в лагере.
local stalker_guard = {_prior = 25, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_guard_"..it.."_walk") do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_guard_"..it.."_walk"
--local guard_timeout = tostring(math.random(180,300))*1000
local guard_timeout = tostring(math.random(20,21))*1000
-- добавляем должность
t = { _prior = 25,
job_id = { section = "logic@"..way_name,
job_type = "path_job" },
_precondition_params = { },
_precondition_function = function(se_obj, smart, precond_params)
if smart.smart_alarm_time == nil then
return true
end
if smart.safe_restr == nil then
return true
end
if precond_params.is_safe_job == nil then
precond_params.is_safe_job = xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name)
end
return precond_params.is_safe_job ~= false
end
}
table.insert(stalker_guard.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = walker@"..way_name.."\n"..
"[walker@"..way_name.."]\n"..
"meet = meet@generic_lager\n"..
"path_walk = guard_"..it.."_walk\n"..
"path_look = guard_"..it.."_look\n"
if smart.safe_restr ~= nil and xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name) then
job_ltx = job_ltx .. "invulnerable = {=npc_in_zone(smart.safe_restr)} true\n"
end
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
local job1_ltx ="[walker1@"..way_name.."]\n"..
"meet = meet@generic_lager\n"..
"path_walk = guard_"..it.."_walk\n"..
"path_look = guard_"..it.."_look\n"..
"def_state_standing = wait_na\n"..
"on_info = {!is_obj_on_job(logic@follower_"..way_name..":3)} walker@"..way_name.."\n"..
"on_info2 = {=distance_to_obj_on_job_le(logic@follower_"..way_name..":3)} remark@"..way_name.."\n"
if smart.safe_restr ~= nil and xr_gulag.job_in_restrictor(smart, smart.safe_restr, way_name) then
job1_ltx = job1_ltx .. "invulnerable = {=npc_in_zone(smart.safe_restr)} true\n"
end
if smart.def_restr ~= nil then
job1_ltx = job1_ltx .."out_restr = "..smart.def_restr.."\n"
end
job1_ltx = job1_ltx .. "[remark@"..way_name.."]\n"..
"anim = wait_na\n"..
"target = logic@follower_"..way_name.."\n"
if smart.def_restr ~= nil then
job1_ltx = job1_ltx .."out_restr = "..smart.def_restr.."\n"
end
--' настройки фоловера для каждого гварда!!!!!!!!!!!!!!!!!
t = { _prior = 24,
job_id = { section = "logic@follower_"..way_name,
job_type = "path_job" },
_precondition_params = { changing_job = "logic@"..way_name },
_precondition_function = function(se_obj, smart, precond_params, npc_info)
return npc_info.need_job == precond_params.changing_job
end }
table.insert(stalker_guard.jobs, t)
local follower_ltx = "[logic@follower_"..way_name.."]\n"..
"active = walker@follow_"..way_name.."\n"..
"[walker@follow_"..way_name.."]\n"..
"meet = meet@generic_lager\n"..
"path_walk = guard_"..it.."_walk\n"..
"path_look = guard_"..it.."_look\n"..
"on_info = {=distance_to_obj_on_job_le(logic@"..way_name..":3)} remark@follower_"..way_name.."\n"
if smart.def_restr ~= nil then
follower_ltx = follower_ltx .."out_restr = "..smart.def_restr.."\n"
end
follower_ltx = follower_ltx .. "[remark@follower_"..way_name.."]\n"..
"anim = wait_na\n"..
"target = logic@"..way_name.."\n"..
"on_timer = 2000 | %=switch_to_desired_job%\n"
if smart.def_restr ~= nil then
follower_ltx = follower_ltx .."out_restr = "..smart.def_restr.."\n"
end
ltx = ltx..job_ltx..job1_ltx..follower_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_guard) end
--'------------------------------------------------------------------------
--' SNIPER
--'------------------------------------------------------------------------
-- Проверяем наличие снайперов в лагере.
local stalker_def_sniper = {_prior = 30, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_sniper_"..it.."_walk") do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_sniper_"..it.."_walk"
local ptr = patrol(way_name)
local wp_prop = utils.parse_waypoint_data(way_name, ptr:flags(0), ptr:name(0))
local state = "hide"
if wp_prop.state ~= nil then
if wp_prop.state == "stand" then
state = "threat"
end
end
-- добавляем должность
t = { _prior = 30,
job_id = { section = "logic@"..way_name,
job_type = "path_job" },
_precondition_params = { way_name = way_name },
_precondition_function = function(se_obj, smart, precond_params)
if se_obj:community() == "zombied" then
return false
end
return combat_restrictor.accessible_job(se_obj, precond_params.way_name)
end
}
table.insert(stalker_def_sniper.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = camper@"..way_name.."\n"..
"[camper@"..way_name.."]\n"..
"meet = meet@generic_lager\n"..
"path_walk = sniper_"..it.."_walk\n"..
"path_look = sniper_"..it.."_look\n"..
"sniper = true\n"..
"def_state_campering ="..state.."\n"..
"def_state_campering_fire ="..state.."_fire\n"
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr..","..combat_restrictor.get_job_restrictor(way_name).."\n"
end
ltx = ltx..job_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_def_sniper) end
--'------------------------------------------------------------------------
--' CAMPER
--'------------------------------------------------------------------------
-- Проверяем возможность стать кемпером :-)
local stalker_def_camper = {_prior = 45, jobs = {}}
it = 1
while level.patrol_path_exists(gname.."_camper_"..it.."_walk") do
-- Необходимо вычитать количество работ из названия точки пути.
local way_name = gname.."_camper_"..it.."_walk"
local ptr = patrol(way_name)
local wp_prop = utils.parse_waypoint_data(way_name, ptr:flags(0), ptr:name(0))
local state = "hide"
local radius = 0
if wp_prop.state ~= nil then
if wp_prop.state == "stand" then
state = "threat"
end
end
if wp_prop.radius ~= nil then
radius = wp_prop.radius
end
-- добавляем должность
t = { _prior = 45,
job_id = { section = "logic@"..way_name,
job_type = "path_job" },
_precondition_params = { way_name = way_name },
_precondition_function = function(se_obj, smart, precond_params)
return combat_restrictor.accessible_job(se_obj, precond_params.way_name)
end
}
table.insert(stalker_def_camper.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..way_name.."]\n"..
"active = camper@"..way_name.."\n"..
"[camper@"..way_name.."]\n"..
"meet = meet@generic_lager\n"..
"radius = "..tostring(radius).."\n"..
"path_walk = camper_"..it.."_walk\n"..
"def_state_moving = rush\n"..
"def_state_campering ="..state.."\n"..
"def_state_campering_fire ="..state.."_fire\n"
if level.patrol_path_exists(gname.."_camper_"..it.."_look") then
job_ltx = job_ltx.."path_look = camper_"..it.."_look\n"
end
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr..","..combat_restrictor.get_job_restrictor(way_name).."\n"
end
ltx = ltx..job_ltx
it = it + 1
end
if it > 1 then table.insert(stalker_jobs.jobs, stalker_def_camper) end
table.insert(job_table, stalker_jobs)
--'------------------------------------------------------------------------
--' РАБОТЫ МОНСТРОВ
--'------------------------------------------------------------------------
local monster_jobs = {_precondition_is_monster = true, _prior = 50, jobs = {}}
--'------------------------------------------------------------------------
--' MOB HOME
--'------------------------------------------------------------------------
for it = 1,20 do
-- Необходимо вычитать количество работ из названия точки пути.
local name = gname.."_home_"..it
local home_min_radius = 10
local home_mid_radius = 20
local home_max_radius = 70
t = { _prior = 40,
job_id = { section = "logic@"..name,
job_type = "point_job" }
}
table.insert(monster_jobs.jobs, t)
-- добавляем описание должности в лтх.
local job_ltx = "[logic@"..name.."]\n"..
"active = mob_home@"..name.."\n"..
"[mob_home@"..name.."]\n"..
"gulag_point = true\n"..
"home_min_radius = "..home_min_radius.."\n"..
"home_mid_radius = "..home_mid_radius.."\n"..
"home_max_radius = "..home_max_radius.."\n"
if smart.def_restr ~= nil then
job_ltx = job_ltx .."out_restr = "..smart.def_restr.."\n"
end
ltx = ltx..job_ltx
end
table.insert(job_table, monster_jobs)
--'------------------------------------------------------------------------
--' ЭКСКЛЮЗИВНЫЕ РАБОТЫ
--'------------------------------------------------------------------------
local smart_ini = smart.ini
if smart_ini:section_exist(smart_terrain.SMART_TERRAIN_SECT) then
if smart_ini:section_exist("exclusive") then
local n = smart_ini:line_count("exclusive")
local id, value = "",""
for i=0,n-1 do
result, id, value = smart_ini:r_line("exclusive",i,"","")
add_exclusive_job("exclusive", id, smart_ini, job_table)
end
else
local num = 1
while smart_ini:line_exist(smart_terrain.SMART_TERRAIN_SECT, "work"..num) do
add_exclusive_job(smart_terrain.SMART_TERRAIN_SECT, "work"..num, smart_ini, job_table)
num = num + 1
end
end
end
return job_table
end
local job_type_by_scheme = {
["walker"] = "path_job",
["camper"] = "path_job",
["patrol"] = "path_job",
["animpoint"] = "smartcover_job",
["smartcover"] = "smartcover_job",
["remark"] = "point_job",
["cover"] = "point_job",
["sleeper"] = "path_job",
["mob_walker"] = "path_job",
["mob_home"] = "path_job",
["mob_jump"] = "point_job",
["companion"] = "point_job"
}
function add_exclusive_job(sect, work_field, smart_ini, job_table)
local work = utils.cfg_get_string(smart_ini, sect, work_field, nil, false, "")
if work == nil then return end
local ini_path = "scripts\\"..work -- IX-Ray
local fs = getFS()
if fs:exist("$game_config$",ini_path) == nil then
abort("there is no configuration file [%s]", ini_path)
end
local job_ini_file = ini_file(ini_path)
local job_online = utils.cfg_get_string(job_ini_file, "logic@"..work_field, "job_online", db.actor ,false , "", nil)
-- добавляем возможность указать приоритет уникальной работы в секции логики.(по дефолту её приоритет равен 45-ти)
local new_prior = utils.cfg_get_number(job_ini_file, "logic@"..work_field, "prior", nil , false, 45)
-- Проверяем есть ли у работы поле suitable. Если есть, нам нужно добавить прекондишн
local job_suitable = utils.cfg_get_string(job_ini_file, "logic@"..work_field, "suitable", smart, false, "")
local is_monster = utils.cfg_get_bool(job_ini_file, "logic@"..work_field, "monster_job", smart, false, false)
local active_section = utils.cfg_get_string(job_ini_file, "logic@"..work_field, "active", smart, false, "")
local scheme = utils.get_scheme_by_section(active_section)
local job_type = job_type_by_scheme[scheme]
if scheme == "mob_home" then
if utils.cfg_get_bool(job_ini_file, active_section, "gulag_point", smart, false, false) then
job_type = "point_job"
end
end
if job_suitable == nil then
local t = { _prior = new_prior,
_precondition_is_monster = is_monster,
job_id = { section = "logic@"..work_field,
ini_path = ini_path,
online = job_online,
ini_file = job_ini_file,
job_type = job_type }
}
table.insert(job_table, t)
return
end
local condlist = xr_logic.parse_condlist(smart, "logic@"..work_field, "suitable", job_suitable)
local t = { _prior = new_prior,
_precondition_is_monster = is_monster,
job_id = { section = "logic@"..work_field,
ini_path = ini_path,
ini_file = job_ini_file,
online = job_online,
job_type = job_type },
_precondition_params = { condlist = condlist },
_precondition_function = function(se_obj, smart, precond_params)
local result = xr_logic.pick_section_from_condlist(db.actor, se_obj, precond_params.condlist)
if result == "false" or result == nil then
return false
end
return true
end
}
table.insert(job_table, t)
-- Затычка для оффлайна, когда невозможно проверить прекондишн
t = { _prior = -1,
_precondition_is_monster = is_monster,
job_id = { section = "logic@"..work_field,
ini_file = job_ini_file,
job_type = job_type }
}
table.insert(job_table, t)
end
--------------------------------------------------------------------------
-- Dynamic ltx
--------------------------------------------------------------------------
function load_ltx(gname)
return ltx
end