179 lines
No EOL
5.6 KiB
Text
179 lines
No EOL
5.6 KiB
Text
----------------------------------------------------------------------------------------------------------------------
|
|
-- Ñõåìà ðåàêöèè ñòàëêåðîâ íà íàäîåäàíèÿ èãðîêà
|
|
-- àâòîð: Äèäåíêî Ðóñëàí (Stohe)
|
|
-- TODO:
|
|
----------------------------------------------------------------------------------------------------------------------
|
|
|
|
---------------------------------------------------------------------------------------------------------------------
|
|
--Evaluators
|
|
----------------------------------------------------------------------------------------------------------------------
|
|
--' Íóæíî ëè ïíóòü êîãî òî â ëèöî
|
|
class "evaluator_abuse" (property_evaluator)
|
|
function evaluator_abuse:__init(name, storage) super (nil, name)
|
|
self.a = storage
|
|
end
|
|
function evaluator_abuse:evaluate()
|
|
return self.a.abuse_manager:update()
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------
|
|
--Actions
|
|
----------------------------------------------------------------------------------------------------------------------
|
|
--' Óäàð â ëèöî
|
|
class "action_abuse_hit" (action_base)
|
|
function action_abuse_hit:__init (npc_name,action_name, storage, char_ini) super (nil, action_name)
|
|
self.a = storage
|
|
end
|
|
function action_abuse_hit: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()
|
|
|
|
state_mgr.set_state(self.object, "punch", nil, nil, {look_object = db.actor}, {animation = true})
|
|
-- xr_sound.set_sound_play(self.object:id(), "use_abuse")
|
|
self.hit_done = true --' xStream 02.2008
|
|
end
|
|
function action_abuse_hit:execute ()
|
|
action_base.execute(self)
|
|
end
|
|
function action_abuse_hit:finalize ()
|
|
action_base.finalize(self)
|
|
end
|
|
|
|
class "CAbuseManager"
|
|
function CAbuseManager:__init(npc, storage)
|
|
self.npc = npc
|
|
self.a = storage
|
|
self.enable = true
|
|
self.abuse_rate = 2
|
|
self.abuse_value = 0
|
|
self.abuse_threshold = 5
|
|
self.last_update = nil
|
|
self.hit_done = false --' xStream 02.2008
|
|
end
|
|
function CAbuseManager:SetAbuseRate(rate)
|
|
self.abuse_rate = rate
|
|
end
|
|
function CAbuseManager:abused()
|
|
return self.abuse_value >= self.abuse_threshold
|
|
end
|
|
function CAbuseManager:update()
|
|
if self.last_update == nil then
|
|
self.last_update = time_global()
|
|
end
|
|
if self.abuse_value > 0 then
|
|
self.abuse_value = self.abuse_value - (time_global() - self.last_update)*0.00005
|
|
else
|
|
self.abuse_value = 0
|
|
end
|
|
--xStream 02.2008--
|
|
if self.abuse_value > self.abuse_threshold*1.1 then
|
|
self.abuse_value = self.abuse_threshold*1.1
|
|
end
|
|
|
|
if self.hit_done and self.abuse_value < self.abuse_threshold*2/3 then
|
|
self.hit_done = false
|
|
end
|
|
--end--
|
|
self.last_update = time_global()
|
|
|
|
--printf("*ABUSE* %s [%s]", self.npc:name(), self.abuse_value)
|
|
if self:abused() then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
function CAbuseManager:addAbuse(value)
|
|
if self.enable == true then
|
|
self.abuse_value = self.abuse_value + value*self.abuse_rate
|
|
end
|
|
end
|
|
function CAbuseManager:clearAbuse()
|
|
self.abuse_value = 0
|
|
end
|
|
function CAbuseManager:disableAbuse()
|
|
self.enable = false
|
|
end
|
|
function CAbuseManager:enableAbuse()
|
|
self.enable = true
|
|
end
|
|
|
|
----------------------------------------------------------------------------------------------------------------------
|
|
-- binder
|
|
----------------------------------------------------------------------------------------------------------------------
|
|
function add_to_binder(object, char_ini, scheme, section, st)
|
|
local operators = {}
|
|
local properties = {}
|
|
|
|
local manager = object:motivation_action_manager()
|
|
|
|
properties["abuse"] = xr_evaluators_id.abuse_base
|
|
properties["wounded"] = xr_evaluators_id.sidor_wounded_base
|
|
|
|
operators["abuse"] = xr_actions_id.abuse_base
|
|
|
|
-- Evaluators
|
|
manager:add_evaluator (properties["abuse"], evaluator_abuse("evaluator_abuse", st))
|
|
|
|
-- Actions
|
|
local action = action_abuse_hit(object:name(),"action_abuse_hit", st, char_ini)
|
|
action:add_precondition (world_property(stalker_ids.property_alive, true))
|
|
action:add_precondition (world_property(stalker_ids.property_danger,false))
|
|
action:add_precondition (world_property(properties["wounded"], false))
|
|
action:add_precondition (world_property(properties["abuse"], true))
|
|
action:add_effect (world_property(properties["abuse"], false))
|
|
manager:add_action (operators["abuse"], action)
|
|
|
|
action = manager:action (xr_actions_id.alife)
|
|
action:add_precondition (world_property(properties["abuse"], false))
|
|
|
|
st.abuse_manager = CAbuseManager(object, st)
|
|
end
|
|
|
|
|
|
|
|
------------
|
|
-- Âûçûâàåòñÿ òîëüêî â íà÷àëå íà ÷òåíèè ëîãèêè, ñîçäàåò ýêøåíû, ýâàëóàòîðû è ïðîèçâîäèò
|
|
-- ïåðâè÷íóþ íàñòðîéêó.
|
|
function set_abuse(npc, ini, scheme, section)
|
|
local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
|
|
end
|
|
-- Âûçûâàåòñÿ ïðè ïåðåêëþ÷åíèè íà íîâóþ ñåêöèþ. Ïðîèçâîäèò âû÷èòûâàíèå íàñòðîåê èç òåêóùåé ñåêöèè.
|
|
function reset_abuse(npc, scheme, st, section)
|
|
end
|
|
|
|
|
|
function add_abuse(npc, value)
|
|
local t = db.storage[npc:id()].abuse
|
|
if t then
|
|
t.abuse_manager:addAbuse(value)
|
|
end
|
|
end
|
|
function clear_abuse(npc)
|
|
local t = db.storage[npc:id()].abuse
|
|
if t then
|
|
t.abuse_manager:clearAbuse()
|
|
end
|
|
end
|
|
function disable_abuse(npc)
|
|
local t = db.storage[npc:id()].abuse
|
|
if t then
|
|
t.abuse_manager:disableAbuse()
|
|
end
|
|
end
|
|
function enable_abuse(npc)
|
|
local t = db.storage[npc:id()].abuse
|
|
if t then
|
|
t.abuse_manager:enableAbuse()
|
|
end
|
|
end
|
|
function is_abuse(npc)
|
|
local t = db.storage[npc:id()].abuse
|
|
if t == nil then
|
|
return false
|
|
end
|
|
return t.abuse_manager.enable
|
|
end |