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

476 lines
17 KiB
Text
Raw Permalink Blame History

local function angle_to_direction(oangle)
local yaw = oangle.y
local pitch = oangle.x
return vector():setHP(yaw,pitch):normalize()
end
local assoc_tbl = {
idle = {director = {"", "_eat_bread", "_eat_kolbasa", "_drink_vodka", "_drink_energy", "_weapon"}, listener = {"", "_eat_bread", "_eat_kolbasa", "_drink_vodka", "_drink_energy", "_weapon"}},
harmonica = {director = {"_harmonica"}, listener = {"", "_eat_bread", "_eat_kolbasa", "_drink_vodka", "_drink_energy", "_weapon"}},
guitar = {director = {"_guitar"}, listener = {"", "_eat_bread", "_eat_kolbasa", "_drink_vodka", "_drink_energy", "_weapon"}},
story = {director = {"", "_weapon"}, listener = {"", "_eat_bread", "_eat_kolbasa", "_drink_vodka", "_drink_energy", "_weapon"}},
}
--------------------------------------------------------------------------------
-- Animated Point
--------------------------------------------------------------------------------
class "evaluator_need_animpoint" (property_evaluator)
function evaluator_need_animpoint:__init(storage, name) super(nil, name)
self.st = storage
end
function evaluator_need_animpoint:evaluate()
return xr_logic.is_active(self.object, self.st)
end
class "evaluator_reach_animpoint" (property_evaluator)
function evaluator_reach_animpoint:__init(storage, name) super(nil, name)
self.st = storage
end
function evaluator_reach_animpoint:evaluate()
return self.st.animpoint:position_riched()
end
--------------------------------------------------------------------------------
class "action_reach_animpoint" (action_base)
function action_reach_animpoint:__init (npc, action_name, storage) super(nil, action_name)
self.st = storage
end
function action_reach_animpoint:initialize()
action_base.initialize(self)
self.st.animpoint:calculate_position()
end
function action_reach_animpoint:execute()
action_base.execute(self)
self.object:set_dest_level_vertex_id(self.st.animpoint.position_vertex)
self.object:set_desired_direction(self.st.animpoint.smart_direction)
self.object:set_path_type(game_object.level_path)
--printf("%s animpoint position riched %s", npc:name(), npc:position():distance_to_sqr(self.vertex_position))
local distance_reached = self.object:position():distance_to_sqr(self.st.animpoint.vertex_position) <= self.st.reach_distance
if distance_reached then
state_mgr.set_state(self.object, self.st.reach_movement, nil, nil, {look_position = self.st.animpoint.look_position} )
else
state_mgr.set_state(self.object, self.st.reach_movement)
end
end
function action_reach_animpoint:finalize()
action_base.finalize(self)
end
--------------------------------------------------------------------------------
class "action_animpoint" (action_base)
function action_animpoint:__init (npc, action_name, storage) super(nil, action_name)
self.st = storage
end
function action_animpoint:initialize()
action_base.initialize(self)
self.st.animpoint:start()
end
function action_animpoint:execute()
action_base.execute(self)
local pos, dir = self.st.animpoint:get_animation_params()
if not(self.st.animpoint.started) then
self.st.animpoint:start() -- zatychka
end
-- printf("%s animpoint action %s", self.object:name(), tostring(self.st.animpoint:get_action()))
-- state_mgr.set_state(self.object, self.st.animpoint:get_action(), nil, nil, nil,
state_mgr.set_state(self.object, self.st.animpoint:get_action(), nil, nil, {look_position = self.st.animpoint.look_position},
{animation_position = pos, animation_direction = dir} )
end
function action_animpoint:net_destroy(npc)
self.st.animpoint:stop()
end
function action_animpoint:finalize()
self.st.animpoint:stop()
action_base.finalize(self)
end
--------------------------------------------------------------------------------
-- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>
--------------------------------------------------------------------------------
class "animpoint"
function animpoint:__init(npc, storage)
self.npc_id = npc:id()
self.st = storage
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
function animpoint:initialize()
self.camp = nil
self.st.base_action = nil
self.current_action = nil
self.position = nil
self.smart_direction = nil
self.look_position = nil
self.avail_actions = {}
self.st.approved_actions = {}
self.st.description = nil
self.started = false
self.cover_name = nil
end
function animpoint:activate_scheme(loading, npc, switching_scheme)
self.st.signals = {}
self:calculate_position()
if self.started == true then -- <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>. (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> :start())
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> self.current_action - <20><>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
if not self.st.use_camp and self.cover_name == self.st.cover_name then
self:fill_approved_actions()
local target_action = self.st.approved_actions[math.random(#self.st.approved_actions)].name
--printf("check animpoint stop %s == %s", tostring(target_action), tostring(self.current_action))
local current_st_animstate = state_lib.states[target_action].animstate
local target_st_animstate = state_lib.states[self.current_action].animstate
--printf("check animpoint stop %s == %s", tostring(current_st_animstate), tostring(target_st_animstate))
if current_st_animstate == target_st_animstate then
--printf("NO ANIMPOINT STOP %s", npc:name())
-- <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if target_action ~= self.current_action then
self.current_action = self.st.approved_actions[math.random(#self.st.approved_actions)].name
end
return
end
end
self:stop()
end
end
--' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
function animpoint:calculate_position()
--printf("CALCULATE POSITION")
local smartcover = se_smart_cover.registered_smartcovers[self.st.cover_name]
if smartcover == nil then
print_table(se_smart_cover.registered_smartcovers)
abort("There is no smart_cover with name [%s]", self.st.cover_name)
end
self.position = se_smart_cover.registered_smartcovers[self.st.cover_name].position
self.position_vertex = level.vertex_id(self.position)
self.vertex_position = level.vertex_position(self.position_vertex)
self.smart_direction = angle_to_direction(smartcover.angle)
--printf("%s pos %s", self.st.cover_name, vec_to_str(self.position))
--printf("%s dir %s", self.st.cover_name, vec_to_str(self.smart_direction))
local look_dir = self.smart_direction:normalize()
self.look_position = vector():set( self.position.x + 10*look_dir.x,
self.position.y,
self.position.z + 10*look_dir.z)
-- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
local description_name = smartcover:description()
if xr_animpoint_predicates.associations[description_name] == nil then
if self.st.avail_animations == nil then
abort("Wrong animpoint smart_cover description %s, name %s", tostring(description_name), smartcover:name())
end
end
self.st.description = description_name
self.avail_actions = xr_animpoint_predicates.associations[description_name]
self.st.approved_actions = {}
--[[ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> :start(). <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>, <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if self.st.avail_animations ~= nil then
-- animations are set from custom_data?
for k, v in pairs(self.st.avail_animations) do
table.insert(self.st.approved_actions, {predicate = function() return true end, name = v})
end
else
if self.avail_actions ~= nil then
for k,v in pairs(self.avail_actions) do
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
--printf("checking approved actions %s", self.npc_id)
if v.predicate(self.npc_id)==true then
table.insert(self.st.approved_actions, v)
end
end
end
end
if(#self.st.approved_actions==0) then
abort("There is no approved actions for stalker[%s] in animpoint[%s]", db.storage[self.npc_id].object:name(), self.object:name())
end
]]
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>)
function animpoint:get_animation_params()
return self.position, self.smart_direction
end
--' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
function animpoint:position_riched()
-- <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
if self.current_action ~= nil then
return true
end
if self.position == nil then
return false
end
local npc = db.storage[self.npc_id] and db.storage[self.npc_id].object
if npc == nil then
return false
end
--printf("%s animpoint position riched %s", npc:name(), npc:position():distance_to_sqr(self.vertex_position))
local distance_reached = npc:position():distance_to_sqr(self.vertex_position) <= self.st.reach_distance
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
-- if distance_reached then
-- printf("current_state %s", state)
-- end
local v1 = -math.deg(math.atan2(self.smart_direction.x, self.smart_direction.z))
local v2 = -math.deg(math.atan2(npc:direction().x, npc:direction().z))
local rot_y = math.min( math.abs(v1-v2), 360-math.abs(v1)-math.abs(v2) )
--printf("%s animpoint direction riched %s %s %s", npc:name(), v1, v2, rot_y)
local direction_reached = rot_y < 50
return distance_reached and direction_reached
end
function animpoint:fill_approved_actions()
local is_in_camp = self.camp ~= nil
-- <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if self.st.avail_animations ~= nil then
-- animations are set from custom_data?
for k, v in pairs(self.st.avail_animations) do
table.insert(self.st.approved_actions, {predicate = function() return true end, name = v})
end
else
if self.avail_actions ~= nil then
for k,v in pairs(self.avail_actions) do
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
--printf("checking approved actions %s", self.npc_id)
if v.predicate(self.npc_id, is_in_camp)==true then
table.insert(self.st.approved_actions, v)
end
end
end
end
if(#self.st.approved_actions==0) then
abort("There is no approved actions for stalker[%s] in animpoint[%s]", db.storage[self.npc_id].object:name(), self.object:name())
end
end
-- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
function animpoint:start()
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if self.st.use_camp then
self.camp = sr_camp.get_current_camp(self.position)
end
self:fill_approved_actions()
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
if self.camp ~= nil then
self.camp:register_npc(self.npc_id)
else
self.current_action = self.st.approved_actions[math.random(#self.st.approved_actions)].name
end
self.started = true
self.cover_name = self.st.cover_name
end
-- <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD>
function animpoint:stop()
--printf("STOP")
--callstack()
if self.camp ~= nil then
self.camp:unregister_npc(self.npc_id)
end
self.started = false
self.current_action = nil
end
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
function animpoint:get_action()
return self.current_action
end
function animpoint:update()
local tmp_actions = {}
local descr = self.st.description
if not(self.st.use_camp) then
if self.st.avail_animations == nil then
if self.st.approved_actions == nil then
abort("animpoint not in camp and approved_actions is nil. Name [%s]", self.st.cover_name)
end
for k,v in pairs(self.st.approved_actions) do
table.insert(tmp_actions, v.name)
end
else
for k,v in pairs(self.st.avail_animations) do
table.insert(tmp_actions, v)
end
end
self.current_action = tmp_actions[math.random(#tmp_actions)]
return
end
if(self.npc_id==nil) then
abort("Trying to use destroyed object!")
end
local camp_action, is_director = self.camp:get_camp_action(self.npc_id)
local tbl = {}
if(is_director) then
--printf(" [%s] is director", self.npc_id)
tbl = assoc_tbl[camp_action].director
else
--printf(" [%s] is not director", self.npc_id)
tbl = assoc_tbl[camp_action].listener
end
local found = false
for k,v in pairs(self.st.approved_actions) do
for i = 1, #tbl do
if(descr..tbl[i]==v.name) then
--printf(" approved %s", tostring(v.name))
table.insert(tmp_actions, v.name)
found = true
end
end
end
if not found then
--[[
printf("***")
print_table(self.st.approved_actions)
printf("***")
print_table(tbl)
printf("***")
abort("No actions found %s", self.npc_id)
]]
table.insert(tmp_actions, descr)
end
local rnd = math.random(#tmp_actions)
local action = tmp_actions[rnd]
--action - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(self.st.base_action) then
--printf(" have base_action")
if(self.st.base_action==descr.."_weapon") then
--printf(" still play_weapon_anim")
action = descr.."_weapon"
end
--printf(" *** [%s]==[%s] and [%s]==[%s]", action, descr.."_weapon", self.st.base_action, descr )
if(action==descr.."_weapon") and (self.st.base_action==descr) then
--printf(" LFN")
table.remove(tmp_actions, rnd)
action = tmp_actions[math.random(#tmp_actions)]
end
else
if(action==descr.."_weapon") then
self.st.base_action = action
else
self.st.base_action = descr
end
end
--printf("update_current_action %s", tostring(action))
self.current_action = action
end
--------------------------------------------------------------------------------
-- Smartcover binder
--------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, storage)
printf("DEBUG: add_to_binder: scheme='%s', section='%s'", scheme, section)
local operators = {}
local properties = {}
local manager = npc:motivation_action_manager()
properties["need_animpoint"] = xr_evaluators_id.animpoint_property + 1
properties["reach_animpoint"] = xr_evaluators_id.animpoint_property + 2
properties["state_mgr_logic_active"] = xr_evaluators_id.state_mgr + 4
operators["action_animpoint"] = xr_actions_id.animpoint_action + 1
operators["action_reach_animpoint"] = xr_actions_id.animpoint_action + 2
-- -- evaluators
manager:add_evaluator(properties["need_animpoint"], this.evaluator_need_animpoint(storage, "animpoint_need"))
manager:add_evaluator(properties["reach_animpoint"], this.evaluator_reach_animpoint(storage, "animpoint_reach"))
storage.animpoint = animpoint(npc, storage)
-- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> actions, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> reset_scheme <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>:
xr_logic.subscribe_action_for_events(npc, storage, storage.animpoint)
local new_action = this.action_reach_animpoint(npc, "action_reach_animpoint", storage)
new_action:add_precondition(world_property(stalker_ids.property_alive, true))
new_action:add_precondition(world_property(stalker_ids.property_anomaly,false))
new_action:add_precondition(world_property(stalker_ids.property_enemy,false))
new_action:add_precondition(world_property(properties["need_animpoint"], true))
new_action:add_precondition(world_property(properties["reach_animpoint"], false))
xr_motivator.addCommonPrecondition(new_action)
new_action:add_effect (world_property(properties["need_animpoint"], false))
new_action:add_effect (world_property(properties["state_mgr_logic_active"], false))
manager:add_action(operators["action_reach_animpoint"], new_action)
xr_logic.subscribe_action_for_events(npc, storage, new_action)
new_action = this.action_animpoint(npc, "action_animpoint", storage)
new_action:add_precondition(world_property(stalker_ids.property_alive, true))
new_action:add_precondition(world_property(stalker_ids.property_anomaly,false))
new_action:add_precondition(world_property(stalker_ids.property_enemy,false))
new_action:add_precondition(world_property(properties["need_animpoint"], true))
new_action:add_precondition(world_property(properties["reach_animpoint"], true))
xr_motivator.addCommonPrecondition(new_action)
new_action:add_effect (world_property(properties["need_animpoint"], false))
new_action:add_effect (world_property(properties["state_mgr_logic_active"], false))
manager:add_action(operators["action_animpoint"], new_action)
xr_logic.subscribe_action_for_events(npc, storage, new_action)
new_action = manager:action(xr_actions_id.alife)
new_action:add_precondition(world_property(properties["need_animpoint"], false))
end
function set_scheme(npc, ini, scheme, section, gulag_name)
printf("DEBUG: %s set_scheme: scheme='%s', section='%s'", npc:name(), scheme, section)
local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
st.logic = xr_logic.cfg_get_switch_conditions(ini, section, npc)
st.cover_name = utils.cfg_get_string(ini, section, "cover_name", npc, false, "", "$script_id$_cover")
st.use_camp = utils.cfg_get_bool(ini, section, "use_camp", npc, false, true)
st.reach_distance = utils.cfg_get_number(ini, section, "reach_distance", npc, false, 0.75)
st.reach_movement = utils.cfg_get_string(ini, section, "reach_movement", npc, false, "", "walk")
st.reach_distance = st.reach_distance*st.reach_distance
local tmp = utils.cfg_get_string(ini, section, "avail_animations", npc, false, "", nil)
if(tmp~=nil) then
st.avail_animations = parse_names(tmp)
else
st.avail_animations = nil
end
end