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

139 lines
No EOL
4 KiB
Text
Raw Permalink Blame History

local light_zones = {}
local indoor_levels = {
jupiter_underground = true
}
---------------------------------------------------------------------------------------------------------------------
class "action_light"
function action_light:__init (obj, storage)
self.object = obj
self.st = storage
self.active = false
self.id = obj:id()
end
function action_light:reset_scheme()
printf("Light zone insert")
light_zones[self.id] = self
end
function action_light:update(delta)
if xr_logic.try_switch_to_another_section(self.object, self.st, db.actor) then
self.active = false
self.stalkers = {}
printf("Light zone set nil")
light_zones[self.id] = nil
return
end
self.active = true
end
function action_light:check_stalker(stalker)
if self.active == false then
return false, false
end
if self.object:inside(stalker:position()) then
return self.st.light, true
end
return false, false
end
---------------------------------------------------------------------------------------------------------------------
function add_to_binder(npc, ini, scheme, section, storage)
--' printf("DEBUG: add_to_binder: scheme='%s', section='%s'", scheme, section)
local new_action = action_light (npc, storage)
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.light = utils.cfg_get_bool (ini, section, "light_on", npc, false, false)
end
---------------------------------------------------------------------------------------------------------------------
function check_light(stalker)
--' printf("[check_light %s] start", stalker:name())
if stalker == nil then
return
end
--' printf("[check_light %s] start_passed", stalker:name())
local torch = stalker:object("device_torch")
if torch == nil then
return
end
--' printf("[check_light %s] torch_passed", stalker:name())
local light = false
local forced = false
if benchmark.light then
light = true
forced = true
end
if stalker:alive() == false then
light = false
forced = true
end
--' printf("[check_light %s] alive_passed: light=%s, forced=%s", stalker:name(), tostring(light), tostring(forced))
--' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if not forced then
for k,v in pairs(light_zones) do
light, forced = v:check_stalker(stalker)
if forced == true then
break
end
end
end
--' printf("[check_light %s] lightzone_passed: light=%s, forced=%s", stalker:name(), tostring(light), tostring(forced))
if not forced then
--' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
local htime = level.get_time_hours()
if htime <= 4 or htime >= 22 then
light = true
end
--' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
if light == false then
if indoor_levels[level.name()] == true then
light = true
end
end
end
--' printf("[check_light %s] timezone_passed: light=%s, forced=%s", stalker:name(), tostring(light), tostring(forced))
--' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if not forced and light == true then
--' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
local scheme = db.storage[stalker:id()].active_scheme
if scheme == "kamp" or
scheme == "camper" or
scheme == "sleeper"
then
light = false
forced = true
end
end
--' printf("[check_light %s] scheme_passed: light=%s, forced=%s", stalker:name(), tostring(light), tostring(forced))
if not forced and light == true then
--' <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD>. <20><> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> - <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
if stalker:best_enemy() ~= nil and indoor_levels[level.name()] ~= true then
light = false
end
end
if light ~= nil then
torch:enable_attachable_item(light)
end
end
function clean_up ()
--' printf("Light zones cleanup")
light_zones = {}
end