add game&rawdata
This commit is contained in:
parent
0133cd976c
commit
49b34b5546
45731 changed files with 709831 additions and 0 deletions
422
gamedata/scripts/sr_psy_antenna.script
Normal file
422
gamedata/scripts/sr_psy_antenna.script
Normal file
|
|
@ -0,0 +1,422 @@
|
|||
--[[------------------------------------------------------------------------------------------------
|
||||
Çîíû ïñè-èçëó÷åíèÿ. Îòûãðûâàþò ïîñòïðîöåññ è ôàíòîìîâ ïî íàñòðîéêàì èç custom_data
|
||||
--------------------------------------------------------------------------------------------------]]
|
||||
|
||||
|
||||
class "PsyAntenna"
|
||||
function PsyAntenna:__init ()
|
||||
-- ----------------------------------------------------------------------------------------
|
||||
-- settings
|
||||
-- ----------------------------------------------------------------------------------------
|
||||
-- phantom gen
|
||||
-- ----------------------------------------------------------------------------------------
|
||||
self.phantom_max = 8 --10 -- max phantoms
|
||||
self.phantom_spawn_probability = 0 -- spawn probability (0..1)
|
||||
self.phantom_spawn_radius = 30.0 -- average radius 30.0m +-15m
|
||||
self.phantom_spawn_height = 2.5 --3 -- average height from actor pos +-1.5m
|
||||
self.phantom_fov = 45 -- øèðèíà ñåêòîðà ïåðåä ãëàçàìè àêò¸ðà, â êîòîðîì ìîãóò ðîæäàòüñÿ ôàíòîìû
|
||||
-- antenna
|
||||
self.hit_amplitude = 1.0 -- ðàçìåð õèòà = self.hit_amplitude*self.hit_intensity
|
||||
-- ----------------------------------------------------------------------------------------
|
||||
-- class variables initialize
|
||||
-- ----------------------------------------------------------------------------------------
|
||||
self.eff_time = 0
|
||||
self.hit_time = 0
|
||||
self.phantom_time = 0
|
||||
self.intensity_inertion = 0.05 -- ñêîðîñòü èçìåíåíèÿ èíòåíñèâíîñòè åä/ñåêóíäó
|
||||
self.hit_intensity = 0
|
||||
self.sound_intensity = 0
|
||||
self.sound_intensity_base = 0 -- áàçîâàÿ èíòåíñèâíîñòü. ê íåé ñòðåìèòñÿ òåêóùàÿ ñî ñêîðîñòüþ self.intensity_inertion
|
||||
self.postprocess_count = 0 --'ñ÷åò÷èê çàðåãèñòðèðîâàííûõ ïîñòïðîöåññîâ
|
||||
self.postprocess = {} --'êîíòåéíåð ïîñòïðîöåññîâ
|
||||
|
||||
-- ----------------------------------------------------------------------------------------
|
||||
-- sound
|
||||
-- ----------------------------------------------------------------------------------------
|
||||
self.sound_initialized = false
|
||||
|
||||
self.sound_obj_right, self.sound_obj_left = sound_object("anomaly\\psy_voices_1_r"), sound_object("anomaly\\psy_voices_1_l")
|
||||
|
||||
self.sound_obj_left.volume = self.sound_intensity
|
||||
self.sound_obj_right.volume = self.sound_intensity
|
||||
self.snd_volume = level.get_snd_volume()
|
||||
self.mute_sound_threshold = 0 --' Ïðåäåë äî êîòîðîãî ìîæíî çàíèæàòü çâóê óðîâíÿ. 0 - ìîæíî çàãëóøèòü ïîëíîñòüþ
|
||||
self.max_mumble_volume = 10
|
||||
|
||||
self.no_static = false
|
||||
self.no_mumble = false
|
||||
self.hit_type = "wound"
|
||||
self.hit_freq = 5000
|
||||
|
||||
end
|
||||
function PsyAntenna:destroy ()
|
||||
self.sound_obj_right:stop()
|
||||
self.sound_obj_left:stop()
|
||||
level.set_snd_volume (self.snd_volume)
|
||||
get_hud():enable_fake_indicators(false)
|
||||
end
|
||||
function PsyAntenna:construct ()
|
||||
end
|
||||
function PsyAntenna:update_psy_hit(dt)
|
||||
local hud = get_hud()
|
||||
local custom_static = hud:GetCustomStatic("cs_psy_danger")
|
||||
if self.hit_intensity > 0.0001 then
|
||||
if custom_static == nil and not self.no_static then
|
||||
hud:AddCustomStatic("cs_psy_danger", true)
|
||||
hud:GetCustomStatic("cs_psy_danger"):wnd():TextControl():SetTextST("st_psy_danger")
|
||||
end
|
||||
else
|
||||
if custom_static ~= nil then
|
||||
hud:RemoveCustomStatic("cs_psy_danger")
|
||||
end
|
||||
end
|
||||
if time_global() - self.hit_time > self.hit_freq then
|
||||
self.hit_time = time_global()
|
||||
|
||||
local power = self.hit_amplitude*self.hit_intensity
|
||||
|
||||
|
||||
|
||||
--printf("HIT: power = %s", tostring(power))
|
||||
|
||||
if power > 0.0001 then
|
||||
|
||||
local psy_hit = hit()
|
||||
psy_hit.power = power
|
||||
psy_hit.direction = vector():set( 0, 0, 0 )
|
||||
psy_hit.impulse = 0
|
||||
psy_hit.draftsman = db.actor
|
||||
local hit_value = ((power <= 1) and power) or 1
|
||||
if self.hit_type == "chemical" then
|
||||
get_hud():update_fake_indicators(2, hit_value)
|
||||
psy_hit.type = hit.chemical_burn
|
||||
else
|
||||
get_hud():update_fake_indicators(3, hit_value)
|
||||
psy_hit.type = hit.telepatic
|
||||
end
|
||||
|
||||
--[[
|
||||
if self.last_health then
|
||||
printf("actor health [%s], hit taken [%s]", tostring(db.actor.health), tostring(self.last_health-db.actor.health))
|
||||
end
|
||||
self.last_health = db.actor.health
|
||||
]]--
|
||||
|
||||
db.actor:hit(psy_hit)
|
||||
|
||||
if db.actor.health < 0.0001 and db.actor:alive() then
|
||||
db.actor:kill( db.actor )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function PsyAntenna:generate_phantoms()
|
||||
if self.phantom_idle == nil then
|
||||
self.phantom_idle = math.random(2000,5000)
|
||||
end
|
||||
if time_global() - self.phantom_time > self.phantom_idle then
|
||||
self.phantom_time = time_global()
|
||||
self.phantom_idle = math.random(5000,10000)
|
||||
if math.random() < self.phantom_spawn_probability then
|
||||
if phantom_manager:phantom_count() < self.phantom_max then
|
||||
local radius = self.phantom_spawn_radius * ( math.random()/2.0+0.5 )
|
||||
local ang = self.phantom_fov * math.random() - self.phantom_fov * 0.5
|
||||
local dir = vector_rotate_y( db.actor:direction(), ang )
|
||||
|
||||
phantom_manager.spawn_phantom( db.actor:position():add( dir:mul(radius) ) )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function PsyAntenna:update_sound()
|
||||
if not self.sound_initialized then
|
||||
self.sound_obj_left:play_at_pos (db.actor, vector():set(-1, 0, 1), 0, sound_object.s2d + sound_object.looped)
|
||||
self.sound_obj_right:play_at_pos (db.actor, vector():set( 1, 0, 1), 0, sound_object.s2d + sound_object.looped)
|
||||
|
||||
self.sound_initialized = true
|
||||
end
|
||||
|
||||
local vol = 1 - ( self.sound_intensity ^ 3 ) * 0.9
|
||||
|
||||
if vol < self.mute_sound_threshold then
|
||||
level.set_snd_volume( self.mute_sound_threshold )
|
||||
else
|
||||
level.set_snd_volume( vol )
|
||||
end
|
||||
|
||||
self.sound_obj_left.volume = 1 / vol - 1
|
||||
self.sound_obj_right.volume = 1 / vol - 1
|
||||
end
|
||||
function PsyAntenna:update_postprocess(pp)
|
||||
if pp.intensity == 0 then
|
||||
self.postprocess_count = self.postprocess_count - 1
|
||||
level.remove_pp_effector(pp.idx)
|
||||
return false
|
||||
end
|
||||
|
||||
level.set_pp_effector_factor(pp.idx, pp.intensity, 0.3)
|
||||
return true
|
||||
end
|
||||
function PsyAntenna:update(dt)
|
||||
self.eff_time = self.eff_time + dt
|
||||
|
||||
function update_intensity(intensity_base, intensity)
|
||||
local di = self.intensity_inertion * dt * 0.01
|
||||
local ii = intensity_base
|
||||
if math.abs(intensity_base - intensity) >= di then
|
||||
if intensity_base < intensity then
|
||||
ii = intensity - di
|
||||
else
|
||||
ii = intensity + di
|
||||
end
|
||||
end
|
||||
|
||||
if ii < 0.0 then ii = 0.0
|
||||
elseif ii > 1.0 then ii = 1.0 end
|
||||
return ii
|
||||
end
|
||||
|
||||
self:generate_phantoms()
|
||||
|
||||
if not self.no_mumble then
|
||||
self.sound_intensity = update_intensity(self.sound_intensity_base, self.sound_intensity)
|
||||
self:update_sound()
|
||||
end
|
||||
|
||||
for k,v in pairs(self.postprocess) do
|
||||
v.intensity = update_intensity(v.intensity_base, v.intensity)
|
||||
local exist = self:update_postprocess(v)
|
||||
|
||||
if exist == false then
|
||||
self.postprocess[k] = nil
|
||||
end
|
||||
end
|
||||
|
||||
self:update_psy_hit(dt)
|
||||
end
|
||||
function PsyAntenna:save(p)
|
||||
printf("Psy Antenna SAVE")
|
||||
set_save_marker(p, "save", false, "psy_antenna_obj")
|
||||
p:w_float(self.hit_intensity)
|
||||
p:w_float(self.sound_intensity)
|
||||
p:w_float(self.sound_intensity_base)
|
||||
p:w_float(self.mute_sound_threshold)
|
||||
p:w_bool(self.no_static)
|
||||
p:w_bool(self.no_mumble)
|
||||
p:w_stringZ(self.hit_type)
|
||||
p:w_u32(self.hit_freq)
|
||||
|
||||
p:w_u8(self.postprocess_count)
|
||||
for k,v in pairs(self.postprocess) do
|
||||
p:w_stringZ(k)
|
||||
p:w_float(v.intensity)
|
||||
p:w_float(v.intensity_base)
|
||||
p:w_u16(v.idx)
|
||||
end
|
||||
set_save_marker(p, "save", true, "psy_antenna_obj")
|
||||
end
|
||||
function PsyAntenna:load(p)
|
||||
printf("Psy Antenna LOAD")
|
||||
set_save_marker(p, "load", false, "psy_antenna_obj")
|
||||
self.hit_intensity = p:r_float()
|
||||
self.sound_intensity = p:r_float()
|
||||
self.sound_intensity_base = p:r_float()
|
||||
self.mute_sound_threshold = p:r_float()
|
||||
self.no_static = p:r_bool()
|
||||
self.no_mumble = p:r_bool()
|
||||
self.hit_type = p:r_stringZ()
|
||||
self.hit_freq = p:r_u32()
|
||||
|
||||
self.postprocess_count = p:r_u8()
|
||||
|
||||
self.postprocess = {}
|
||||
for i=1, self.postprocess_count do
|
||||
local k = p:r_stringZ()
|
||||
local ii = p:r_float()
|
||||
local ib = p:r_float()
|
||||
local idx = p:r_u16()
|
||||
self.postprocess[k] = {intensity_base = ib, intensity = ii, idx = idx}
|
||||
level.add_pp_effector(k, idx, true)
|
||||
level.set_pp_effector_factor(idx, ii)
|
||||
end
|
||||
set_save_marker(p, "load", true, "psy_antenna_obj")
|
||||
end
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
-- ëîãè÷åñêàÿ ñõåìà äëÿ space restrictor
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
local state_outside = 0 -- àêòåð ñíàðóæè
|
||||
local state_inside = 1 -- àêòåð âíóòðè
|
||||
local state_void = 2 -- íåèçâåñòíûé ñòàòóñ
|
||||
|
||||
psy_antenna = false
|
||||
|
||||
|
||||
class "action_psy_antenna"
|
||||
function action_psy_antenna:__init( obj, storage )
|
||||
self.object = obj
|
||||
self.st = storage
|
||||
self.state = state_void --' åùå íå ÿñíî, â çîíå îí, èëè íåò
|
||||
end
|
||||
function action_psy_antenna:reset_scheme( loading )
|
||||
if loading then
|
||||
self.state = xr_logic.pstor_retrieve( self.object, "inside" )
|
||||
end
|
||||
if self.state == state_inside then
|
||||
self:zone_leave()
|
||||
end
|
||||
|
||||
self.state = state_void
|
||||
|
||||
self:switch_state(db.actor)
|
||||
--' end
|
||||
--' printf("[psy_antenna] reset_scheme %s, inside %s", tostring(loading), tostring(self.state))
|
||||
end
|
||||
function action_psy_antenna:deactivate()
|
||||
if self.state == state_inside then
|
||||
self:zone_leave()
|
||||
end
|
||||
end
|
||||
function action_psy_antenna:update( delta )
|
||||
local actor = db.actor
|
||||
|
||||
if xr_logic.try_switch_to_another_section( self.object, self.st, actor ) then
|
||||
return
|
||||
end
|
||||
self:switch_state( actor )
|
||||
end
|
||||
function action_psy_antenna:switch_state( actor )
|
||||
if self.state ~= state_inside then
|
||||
if self.object:inside( actor:position() ) then
|
||||
self:zone_enter()
|
||||
return
|
||||
end
|
||||
else
|
||||
if not self.object:inside( actor:position() ) then
|
||||
self:zone_leave()
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
function action_psy_antenna:zone_enter()
|
||||
--' printf("[psy_antenna] zone_enter")
|
||||
self.state = state_inside
|
||||
|
||||
--âêëþ÷àåì ôåéêîâûé èíäèêàòîð õèòà.
|
||||
get_hud():enable_fake_indicators(true)
|
||||
|
||||
psy_antenna.sound_intensity_base = psy_antenna.sound_intensity_base + self.st.intensity
|
||||
psy_antenna.mute_sound_threshold = psy_antenna.mute_sound_threshold + self.st.mute_sound_threshold
|
||||
psy_antenna.hit_intensity = psy_antenna.hit_intensity + self.st.hit_intensity
|
||||
psy_antenna.phantom_spawn_probability = psy_antenna.phantom_spawn_probability + self.st.phantom_prob
|
||||
|
||||
psy_antenna.no_static = self.st.no_static
|
||||
psy_antenna.no_mumble = self.st.no_mumble
|
||||
psy_antenna.hit_type = self.st.hit_type
|
||||
psy_antenna.hit_freq = self.st.hit_freq
|
||||
|
||||
--' printf("[psy_antenna] zone_enter. hit_intensity=%s", tostring(psy_antenna.hit_intensity))
|
||||
|
||||
if self.st.postprocess == "nil" then
|
||||
return
|
||||
end
|
||||
|
||||
if psy_antenna.postprocess[self.st.postprocess] == nil then
|
||||
psy_antenna.postprocess_count = psy_antenna.postprocess_count + 1
|
||||
psy_antenna.postprocess[self.st.postprocess] = { intensity_base = 0, intensity = 0, idx = 1500+psy_antenna.postprocess_count}
|
||||
level.add_pp_effector(self.st.postprocess, psy_antenna.postprocess[self.st.postprocess].idx, true)
|
||||
level.set_pp_effector_factor(psy_antenna.postprocess[self.st.postprocess].idx, 0.01)
|
||||
end
|
||||
psy_antenna.postprocess[self.st.postprocess].intensity_base = psy_antenna.postprocess[self.st.postprocess].intensity_base + self.st.intensity
|
||||
end
|
||||
function action_psy_antenna:zone_leave()
|
||||
--' printf("[psy_antenna] zone_leave. hit_intensity=%s", tostring(psy_antenna.hit_intensity))
|
||||
self.state = state_outside
|
||||
|
||||
--âûêëþ÷àåì ôåéêîâûé èíäèêàòîð õèòà.
|
||||
get_hud():enable_fake_indicators(false)
|
||||
|
||||
psy_antenna.sound_intensity_base = psy_antenna.sound_intensity_base - self.st.intensity
|
||||
psy_antenna.mute_sound_threshold = psy_antenna.mute_sound_threshold - self.st.mute_sound_threshold
|
||||
psy_antenna.hit_intensity = psy_antenna.hit_intensity - self.st.hit_intensity
|
||||
|
||||
psy_antenna.phantom_spawn_probability = psy_antenna.phantom_spawn_probability - self.st.phantom_prob
|
||||
|
||||
--' printf("[psy_antenna] zone_leave. hit_intensity=%s, minus=%s", tostring(psy_antenna.hit_intensity), tostring(self.st.hit_intensity))
|
||||
|
||||
if self.st.postprocess == "nil" then
|
||||
return
|
||||
end
|
||||
|
||||
if psy_antenna.postprocess[self.st.postprocess] ~= nil then
|
||||
psy_antenna.postprocess[self.st.postprocess].intensity_base = psy_antenna.postprocess[self.st.postprocess].intensity_base - self.st.intensity
|
||||
end
|
||||
end
|
||||
function action_psy_antenna:save()
|
||||
xr_logic.pstor_store( self.object, "inside", self.state )
|
||||
end
|
||||
|
||||
---------------------------------------------------------------------------------------------------------------------
|
||||
function save( p )
|
||||
set_save_marker(p, "save", false, "sr_psy_antenna")
|
||||
if psy_antenna and not utils.level_changing() then
|
||||
p:w_bool( true )
|
||||
|
||||
psy_antenna:save( p )
|
||||
else
|
||||
p:w_bool( false )
|
||||
end
|
||||
set_save_marker(p, "save", true, "sr_psy_antenna")
|
||||
end
|
||||
|
||||
function load(p)
|
||||
set_save_marker(p, "load", false, "sr_psy_antenna")
|
||||
local b = p:r_bool()
|
||||
|
||||
if b then
|
||||
if psy_antenna then
|
||||
abort("sr_psy_antenna.psy_antenna already exists!")
|
||||
end
|
||||
|
||||
psy_antenna = PsyAntenna()
|
||||
psy_antenna:construct()
|
||||
|
||||
psy_antenna:load(p)
|
||||
end
|
||||
set_save_marker(p, "load", true, "sr_psy_antenna")
|
||||
end
|
||||
|
||||
function add_to_binder(npc, ini, scheme, section, storage)
|
||||
printf("DEBUG: add_to_binder: scheme='%s', section='%s'", scheme, section)
|
||||
|
||||
if not psy_antenna then
|
||||
psy_antenna = PsyAntenna()
|
||||
psy_antenna:construct()
|
||||
end
|
||||
|
||||
local new_action = action_psy_antenna(npc, storage)
|
||||
|
||||
-- Çàðåãèñòðèðîâàòü âñå actions, â êîòîðûõ äîëæåí áûòü âûçâàí ìåòîä reset_scheme ïðè èçìåíåíèè íàñòðîåê ñõåìû:
|
||||
xr_logic.subscribe_action_for_events(npc, storage, new_action)
|
||||
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.intensity = utils.cfg_get_number(ini, section, "eff_intensity", npc, true) * 0.01
|
||||
st.postprocess = utils.cfg_get_string(ini, section, "postprocess", npc, false, "", "psy_antenna.ppe")
|
||||
|
||||
st.hit_intensity = utils.cfg_get_number(ini, section, "hit_intensity", npc, true) * 0.01
|
||||
st.phantom_prob = utils.cfg_get_number(ini, section, "phantom_prob", npc, false, 0) * 0.01
|
||||
|
||||
st.mute_sound_threshold = utils.cfg_get_number(ini, section, "mute_sound_threshold", npc, false, 0)
|
||||
|
||||
st.no_static = utils.cfg_get_bool(ini, section, "no_static", npc, false, false)
|
||||
st.no_mumble = utils.cfg_get_bool(ini, section, "no_mumble", npc, false, false)
|
||||
st.hit_type = utils.cfg_get_string(ini, section, "hit_type", npc, false, "", "wound")
|
||||
st.hit_freq = utils.cfg_get_number(ini, section, "hit_freq", npc, false, 5000)
|
||||
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue