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

184 lines
No EOL
7.4 KiB
Text
Raw Permalink Blame History

--------------------------------------------------------------------------------
-- Fear zone -------------------------------------------------------------------
-- Made by Peacemaker ----------------------------------------------------------
-- 21.05.2009 ------------------------------------------------------------------
--------------------------------------------------------------------------------
local pp_effector_id = 5
local cam_effector_id = 6
local pp_effector2_id = 7
class "CDeimos"
function CDeimos:__init (obj, storage)
self.object = obj
self.st = storage
self.st.intensity = 0
self.cam_effector_time = 0
self.phase = 0
end
function CDeimos:update(delta)
if not(db.actor) or (device().precache_frame>1) then
return
end
if(db.actor.deimos_intensity) then
self.st.intensity = db.actor.deimos_intensity
db.actor.deimos_intensity = nil
if(self.st.intensity>self.st.disable_bound) then
level.add_pp_effector(self.st.pp_effector..".ppe", pp_effector_id, true)
xr_sound.play_sound_looped(db.actor:id(), self.st.noise_sound)
self.phase = 1
end
if(self.st.intensity>self.st.switch_lower_bound) then
xr_sound.play_sound_looped(db.actor:id(), self.st.heartbeet_sound)
self.phase = 2
end
end
local vec = db.actor:get_movement_speed()
local cur_speed = math.sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z)
local intensity_delta = (self.st.movement_speed-cur_speed)*0.005
if(intensity_delta>0) then
intensity_delta = self.st.growing_koef*intensity_delta
else
intensity_delta = self.st.lowering_koef*intensity_delta
end
self.st.intensity = self.st.intensity + intensity_delta
if(self.st.intensity>1) then
self.st.intensity = 1
elseif(self.st.intensity<0) then
self.st.intensity = 0
end
local pp_intensity = self.st.intensity
local noise_intensity = self.st.intensity
local heartbeet_intensity = self.st.intensity
if(self.phase>0) then
level.set_pp_effector_factor(pp_effector_id, pp_intensity)
xr_sound.set_volume_sound_looped(db.actor:id(), self.st.noise_sound, noise_intensity)
if(self.phase>1) then
xr_sound.set_volume_sound_looped(db.actor:id(), self.st.heartbeet_sound, heartbeet_intensity)
end
end
if(intensity_delta>0) then
if(self.st.intensity>self.st.switch_upper_bound) then
local cur_time = time_global()
if(cur_time - self.cam_effector_time > self.st.cam_effector_repeating_time) then
self.cam_effector_time = time_global()
level.add_cam_effector("camera_effects\\"..self.st.cam_effector..".anm", cam_effector_id, false, "")
level.add_pp_effector(self.st.pp_effector2..".ppe", pp_effector2_id, false)
db.actor.health = -self.st.health_lost
end
elseif(self.st.intensity>self.st.switch_lower_bound) then
if(self.phase<2) then
xr_sound.play_sound_looped(db.actor:id(), self.st.heartbeet_sound)
xr_sound.set_volume_sound_looped(db.actor:id(), self.st.heartbeet_sound, heartbeet_intensity)
self.phase = 2
end
elseif(self.st.intensity>self.st.disable_bound) then
if(self.phase<1) then
level.add_pp_effector(self.st.pp_effector..".ppe", pp_effector_id, true)
level.set_pp_effector_factor(pp_effector_id, pp_intensity)
xr_sound.play_sound_looped(db.actor:id(), self.st.noise_sound)
xr_sound.set_volume_sound_looped(db.actor:id(), self.st.noise_sound, noise_intensity)
self.phase = 1
end
end
else
if(self.st.intensity<self.st.disable_bound) then
if(self.phase>0) then
xr_sound.stop_sound_looped(db.actor:id(), self.st.noise_sound)
level.remove_pp_effector(pp_effector_id)
self.phase = 0
end
elseif(self.st.intensity<self.st.switch_lower_bound) then
if(self.phase>1) then
xr_sound.stop_sound_looped(db.actor:id(), self.st.heartbeet_sound)
self.phase = 1
end
elseif(self.st.intensity<self.st.switch_upper_bound) then
level.remove_cam_effector(cam_effector_id)
level.remove_pp_effector(pp_effector2_id)
end
end
if xr_logic.try_switch_to_another_section (self.object, self.st, db.actor) then
if(self.phase>0) then
xr_sound.stop_sound_looped(db.actor:id(), self.st.noise_sound)
level.remove_pp_effector(pp_effector_id)
if(self.phase>1) then
xr_sound.stop_sound_looped(db.actor:id(), self.st.heartbeet_sound)
level.remove_cam_effector(cam_effector_id)
level.remove_pp_effector(pp_effector2_id)
end
end
return
end
end
---------------------------------------------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, 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, CDeimos(npc, storage))
end
function set_scheme(npc, ini, scheme, section, gulag_name)
local st = xr_logic.assign_storage_and_bind(npc, ini, scheme, section)
st.logic = xr_logic.cfg_get_switch_conditions(ini, section, npc)
st.movement_speed = utils.cfg_get_number(ini, section, "movement_speed", npc, false, 100)
st.growing_koef = utils.cfg_get_number(ini, section, "growing_koef", npc, false, 0.1)
st.lowering_koef = utils.cfg_get_number(ini, section, "lowering_koef", npc, false, st.growing_koef)
st.pp_effector = utils.cfg_get_string(ini, section, "pp_effector", npc, false, "", "")
st.cam_effector = utils.cfg_get_string(ini, section, "cam_effector", npc, false, "", "")
st.pp_effector2 = utils.cfg_get_string(ini, section, "pp_effector2", npc, false, "", "")
st.cam_effector_repeating_time = utils.cfg_get_number(ini, section, "cam_effector_repeating_time", npc, false, 10)*1000 -- per second
st.noise_sound = utils.cfg_get_string(ini, section, "noise_sound", npc, false, "", "")
st.heartbeet_sound = utils.cfg_get_string(ini, section, "heartbeet_sound", npc, false, "", "")
st.health_lost = utils.cfg_get_number(ini, section, "health_lost", npc, false, 0.01)
st.disable_bound = utils.cfg_get_number(ini, section, "disable_bound", npc, false, 0.1)
st.switch_lower_bound = utils.cfg_get_number(ini, section, "switch_lower_bound", npc, false, 0.5)
st.switch_upper_bound = utils.cfg_get_number(ini, section, "switch_upper_bound", npc, false, 0.75)
end
function check_intensity_delta(obj)
if(obj.active_scheme=="sr_deimos") then
local st = obj[obj.active_scheme]
local vec = db.actor:get_movement_speed()
local cur_speed = math.sqrt(vec.x*vec.x+vec.y*vec.y+vec.z*vec.z)
local intensity_delta = st.growing_koef*(st.movement_speed-cur_speed)*0.005
if(intensity_delta<0) then
return true
end
end
return false
end
function check_disable_bound(obj)
if(obj.active_scheme=="sr_deimos") then
local st = obj[obj.active_scheme]
if(st.intensity<st.disable_bound) then
return true
end
end
return false
end
function check_lower_bound(obj)
if(obj.active_scheme=="sr_deimos") then
local st = obj[obj.active_scheme]
if(st.intensity<st.switch_lower_bound) then
return true
end
end
return false
end
function check_upper_bound(obj)
if(obj.active_scheme=="sr_deimos") then
local st = obj[obj.active_scheme]
if(st.intensity<st.switch_upper_bound) then
return true
end
end
return false
end