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

153 lines
No EOL
5 KiB
Text

class "evaluator_combat_enemy" (property_evaluator)
function evaluator_combat_enemy:__init(storage, name) super(nil, name)
self.st = storage
--' Òàéìåð îæèäàíèÿ âûõîäà èç áîÿ
self.st.timer = time_global()
end
function evaluator_combat_enemy:evaluate()
local best_enemy = self.object:best_enemy()
if best_enemy ~= nil and not xr_combat_ignore.is_enemy(self.object, best_enemy, db.storage[self.object:id()].combat_ignore, true) then
return false
end
if best_enemy ~= nil and self.st.timer ~= nil then
self.st.last_best_enemy_id = best_enemy:id()
self.st.last_best_enemy_name = best_enemy:name()
self.st.timer = nil
return true
end
if best_enemy == nil and self.st.timer == nil then
--printf("object name is [%s]", self.object:name())
local overrides = db.storage[self.object:id()].overrides
local min = (overrides and overrides.min_post_combat_time*1000) or 10000
local max = (overrides and overrides.max_post_combat_time*1000) or 15000
if self.st.last_best_enemy_id == db.actor:id() then
self.st.timer = time_global()
else
self.st.timer = time_global() + math.random(min, max)
end
end
if self.st.timer == nil then
return best_enemy ~= nil
end
if time_global() < self.st.timer then
return true
end
if self.st.animation == nil then
return false
end
self.st.animation:set_state(nil)
return self.st.animation.states.anim_marker ~= nil
end
----------------------------------------------------------------------------------------------------------------------
class "action_post_combat_wait" (action_base)
function action_post_combat_wait:__init(npc, storage, action_name) super(nil, action_name)
self.st = storage
end
function action_post_combat_wait:initialize()
action_base.initialize(self)
-- state_mgr.set_state(self.object, "hide")
self.object:set_item(object.idle, self.object:best_weapon())
self.object:set_mental_state(anim.danger)
self.object:set_body_state(move.crouch)
self.object:set_movement_type(move.stand)
self.object:set_sight(look.danger, nil, 0)
self.anim_st = { animstate = { states = {anim_marker = nil } } }
self.st.animation = state_mgr_animation.animation(self.object, self.anim_st, "state_mgr_animation_list")
self.anim_started = false
end
function action_post_combat_wait:execute()
action_base.execute(self)
if not self.object:in_smart_cover() then
if self.anim_started == false and
not weapon_locked(self.object)
then
self.anim_started = true
self.st.animation:set_state("hide")
self.st.animation:set_control()
end
end
xr_sound.set_sound_play(self.object:id(), "post_combat_wait")
end
function action_post_combat_wait:finalize()
xr_sound.set_sound_play(self.object:id(), "post_combat_relax")
if self.anim_started == true then
self.st.animation:set_state(nil, true)
end
self.st.animation = nil
action_base.finalize(self)
end
function weapon_locked(npc)
local weapon_strapped = npc:weapon_strapped()
local weapon_unstrapped = npc:weapon_unstrapped()
--log(string.format("%s [%s] [%s]", self.object:name(), tostring(weapon_strapped), tostring(weapon_unstrapped)))
if not (weapon_unstrapped or weapon_strapped) then
return true
end
local bestweapon = npc:best_weapon()
if bestweapon == nil then
return false
end
if npc:active_item() == nil then
return false
end
local weapon_going_to_be_strapped = npc:is_weapon_going_to_be_strapped(bestweapon)
if weapon_going_to_be_strapped and not weapon_strapped then
return true
end
if not weapon_going_to_be_strapped and not weapon_unstrapped then
return true
end
return false
end
function add_post_combat_idle(npc)
local manager = npc:motivation_action_manager()
local combat_action = manager:action(stalker_ids.action_combat_planner)
--combat_action:show("")
local combat_action_planner = cast_planner(combat_action)
db.storage[npc:id()].post_combat_wait = {}
local storage = db.storage[npc:id()].post_combat_wait
manager:remove_evaluator(stalker_ids.property_enemy)
manager:add_evaluator(stalker_ids.property_enemy, evaluator_combat_enemy(storage, "evaluator_combat_enemy"))
combat_action_planner:remove_evaluator(stalker_ids.property_enemy)
combat_action_planner:add_evaluator(stalker_ids.property_enemy, evaluator_combat_enemy(storage, "evaluator_combat_enemy"))
combat_action_planner:remove_action(stalker_ids.action_post_combat_wait)
local new_action = this.action_post_combat_wait(npc, storage, "action_post_combat_wait")
new_action:add_precondition(world_property(stalker_ids.property_enemy, true))
new_action:add_precondition(world_property(stalker_ids.property_pure_enemy, false))
new_action:add_precondition(world_property(stalker_ids.property_critically_wounded, false))
new_action:add_precondition(world_property(stalker_ids.property_danger_grenade, false))
new_action:add_effect(world_property(stalker_ids.property_enemy, false))
combat_action_planner:add_action(stalker_ids.action_post_combat_wait, new_action)
end