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

212 lines
7.5 KiB
Text

----------------------------------------------------------------------------------------------------
-- Guide
----------------------------------------------------------------------------------------------------
-- Ðàçðàáîò÷èê: Andrey Fidrya (Zmey) af@svitonline.com
----------------------------------------------------------------------------------------------------
local state_main = 1
local state_lead = 2
local state_wait = 3
---------------------------------------------------------------------------------------------------------------------
class "evaluator_need_guide" (property_evaluator)
function evaluator_need_guide:__init(storage) super(nil, name)
self.st = storage
end
function evaluator_need_guide:evaluate()
--printf("guide [%s] best_enemy = ", self.object:name()--[[,
-- if_then_else(self.object:best_enemy(), self.object:best_enemy():name(), "none")]])
return self.st.enabled == true
end
----------------------------------------------------------------------------------------------------------------------
class "action_guide_activity" (action_base)
function action_guide_activity:__init (npc_name, action_name, storage) super(nil, action_name)
self.st = storage
self.move_mgr = move_mgr.move_mgr()
end
function action_guide_activity:initialize()
--printf("_bp: action_guide_activity: initialize")
action_base.initialize(self)
-- self.object:set_node_evaluator()
-- self.object:set_path_evaluator()
self.object:set_desired_position()
self.object:set_desired_direction()
self.move_mgr:initialize(self.object)
--printf("initiz")
self.initialized = true
self:reset_scheme()
end
function action_guide_activity:reset_scheme()
--printf("reset_scheme, initialized=%s", utils.to_str(self.initialized))
if not self.initialized then
return
end
self.object:clear_animations()
if self.st.path_main_walk_info == nil then
self.st.path_main_walk_info = utils.path_parse_waypoints(self.st.path_main_walk)
end
if self.st.path_main_look_info == nil then
self.st.path_main_look_info = utils.path_parse_waypoints(self.st.path_main_look)
end
if self.st.path_lead_walk_info == nil then
self.st.path_lead_walk_info = utils.path_parse_waypoints(self.st.path_lead_walk)
end
if self.st.path_lead_look_info == nil then
self.st.path_lead_look_info = utils.path_parse_waypoints(self.st.path_lead_look)
end
self.state = state_main
self.move_mgr:reset(self.st.path_main_walk, self.st.path_main_walk_info,
self.st.path_main_look, self.st.path_main_look_info,
self.st.team,
nil, {obj = self, func = self.move_callback})
end
function action_guide_activity:move_callback(mode, number)
if number == 1 then
printf("WAIT")
local actor = level.actor()
if not actor then
return false
end
if distance_between(self.object, actor) > 5 then
utils.stalker_stop(self.object)
utils.stalker_look_at_stalker(self.object, actor)
self.state = state_wait
return true
end
return false
elseif number == 2 then
printf("SWITCH_TO_ROBBER")
self.st.enabled = false
xr_motivator.storage[self.object:id()].robber.enabled = true
return false -- false ò.ê. ìû íå ìåíÿëè ïàðàìåòðû äâèæåíèÿ â ñõåìå, ïðîñòî àêòèâèðîâàëè äðóãóþ...
end
abort("object '%s': invalid 'ret' value specified in path: ret = %d", self.object:name(), number)
return false
end
function action_guide_activity:execute()
action_base.execute(self)
local actor = level.actor()
if not actor then
return
end
if self.state == state_main then
if self.object:see(actor) and distance_between(self.object, actor) < 3 then
self.move_mgr:reset(self.st.path_lead_walk, self.st.path_lead_walk_info,
self.st.path_lead_look, self.st.path_lead_look_info,
self.st.team,
nil, {obj = self, func = self.move_callback})
self.state = state_lead
else
self.move_mgr:update()
end
return
end
if self.state == state_lead then
self.move_mgr:update()
return
end
if self.state == state_wait then
if distance_between(self.object, actor) < 4 then
self.move_mgr:update_movement_state()
self.state = state_lead
else
utils.stalker_look_at_stalker(self.object, actor)
end
end
end
function action_guide_activity:finalize()
self.move_mgr:finalize()
self.object:clear_animations()
action_base.finalize(self)
end
----------------------------------------------------------------------------------------------------------------------
--guide binder
----------------------------------------------------------------------------------------------------------------------
function add_to_binder(npc, char_ini)
if char_ini == nil or char_ini:section_exist ("guide") == true then
printf("xr_guide: add_to_binder")
local operators = {}
local properties = {}
local manager = npc:motivation_action_manager()
properties["event"] = xr_evaluators_id.reaction
properties["need_guide"] = xr_evaluators_id.zmey_guide_base + 1
--properties["override_fight"] = xr_evaluators_id.zmey_guide_base + 2
operators["action_guide"] = xr_actions_id.zmey_guide_base + 1
operators["action_guide_2"] = xr_actions_id.zmey_guide_base + 2
-- evaluators
manager:add_evaluator(properties["need_guide"], this.evaluator_need_guide(xr_motivator.storage[npc:id()].guide, "guide_need_guide"))
local new_action = this.action_guide_activity(npc, "action_guide_activity", xr_motivator.storage[npc:id()].guide)
new_action:add_precondition(world_property(stalker_ids.property_alive, true))
new_action:add_precondition(world_property(stalker_ids.property_enemy, false))
new_action:add_precondition(world_property(properties["need_guide"], true))
new_action:add_precondition(world_property(properties["event"], false))
xr_motivator.addCommonPrecondition(new_action)
new_action:add_effect(world_property(properties["need_guide"], false))
manager:add_action(operators["action_guide"], new_action)
local st = xr_motivator.storage[npc:id()].guide
st.action = new_action
new_action = manager:action(xr_actions_id.alife)
new_action:add_precondition(world_property(properties["need_guide"], false))
if char_ini ~= nil then
xr_guide.set_guide(npc)
end
end
end
-- Âêëþ÷åíèå ñõåìû
--
-- enabled - âêëþ÷åíà ëè ñõåìà
function set_guide(object, enabled, path_main_walk, path_main_look, path_lead_walk, path_lead_look, team)
--printf("_bp: set_guide (path_main_walk=%s)", path_main_walk)
local char_ini = object:spawn_ini()
local st = xr_motivator.storage[object:id()].guide
st.enabled = utils.conf_get_bool(char_ini, "guide", "enabled", enabled, object, true)
st.path_main_walk = utils.conf_get_string(char_ini, "guide", "path_main_walk", path_main_walk, object, true)
st.path_main_look = utils.conf_get_string(char_ini, "guide", "path_main_look", path_main_look, object, false)
st.path_lead_walk = utils.conf_get_string(char_ini, "guide", "path_lead_walk", path_lead_walk, object, true)
st.path_lead_look = utils.conf_get_string(char_ini, "guide", "path_lead_look", path_lead_look, object, false)
st.team = utils.conf_get_string(char_ini, "guide", "team", team, object, false)
st.path_main_walk_info = nil -- Áóäóò èíèöèàëèçèðîâàíû â reset(), ñåé÷àñ ïóòè ìîãóò áûòü åùå
st.path_main_look_info = nil -- íå çàãðóæåíû.
st.path_lead_walk_info = nil -- Áóäóò èíèöèàëèçèðîâàíû â reset(), ñåé÷àñ ïóòè ìîãóò áûòü åùå
st.path_lead_look_info = nil -- íå çàãðóæåíû.
if st.action ~= nil then
printf("_bp: set_guide: reset_scheme")
st.action:reset_scheme()
end
xr_motivator.checkStorage(object)
end