212 lines
7.5 KiB
Text
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
|
|
|