-- ухудшение зрения неписей ночью -- учитывает опыт непися - подразумевая наличие ПНВ --
--------------------------- Copyright 2009 KamikaZze для OGSE -------------------------

local laststate={}

local warn_timer = time_global()
local warn_check_timer = {}

local range_normal = 80
local fov_normal = 160

-- как выяснилось, озвучка "reactions" в папке "human_01" есть не у всех коммунити - при попытке выбрать её будет вылет
-- кроме того, она у всех коммунити одинаковая абсолютно, поэтому выбирать по коммунити её бессмысленно... 

local nothing_there = {

[1] = [[characters_voice\human_01\dolg\reactions\nothing\nothing_1]],
[2] = [[characters_voice\human_01\dolg\reactions\nothing\nothing_2]],
[3] = [[characters_voice\human_01\dolg\reactions\nothing\nothing_3]],
[4] = [[characters_voice\human_01\dolg\reactions\nothing\nothing_4]],
[5] = [[characters_voice\human_01\dolg\reactions\nothing\nothing_5]],
[6] = [[characters_voice\human_01\dolg\reactions\nothing\nothing_6]],
[7] = [[characters_voice\human_01\dolg\reactions\nothing\nothing_7]]

}

function silent_level()
	if level.name() == "l03u_agr_underground" or
		level.name() == "l04u_labx18" or
		level.name() == "l05_bar" or
		level.name() == "l06_rostok" or
		level.name() == "l08u_brainlab" or
		level.name() == "l10u_bunker" or
		level.name() == "l12_stancia" or 
		level.name() == "l12u_sarcofag" or
		level.name() == "l12u_control_monolith" or
		level.name() == "jupiter_underground" or
		level.name() == "l12_stancia_2" then
		return true 
	else 
		return false
	end
end

function check_range(obj)
	if obj then
		local npc = level.object_by_id(obj:id())
		if npc and IsStalker(npc) then
			-- по умолчанию 80 метров
			-- и 160 градусов
			local range = npc:range()
			local fov = npc:fov()
		end
	end
end

function check_night(obj)
	local htime = level.get_time_hours()
	if htime and obj then
	
		if xr_companion.is_companion(obj:id()) then
			return
		end		
	
		local nid = obj:id()
		if laststate[nid] == nil then
			laststate[nid] = false
		end
		local npc = level.object_by_id(obj:id())
		if npc and IsStalker(npc) then
		
		if npc:character_community() == "zombied"  
		or npc:character_community() == "monolith" then
			return
		end
		
		local npc_rank = ranks.get_obj_rank_name(npc)
			if (not npc:best_danger() and not npc:best_enemy()) then
			-- пока мы спокойны
				if htime <= 4 or htime >= 21 then
					-- ночь
					local range = npc:range()
					local fov = npc:fov()
					if range and range >= range_normal then
						if npc_rank == "novice" then 
							npc:set_range(20)
						elseif npc_rank == "experienced" then 
							npc:set_range(25)
						elseif npc_rank == "veteran" then
							npc:set_range(30)
						elseif npc_rank == "master" then
							npc:set_range(35)
						end				
					end
					if fov and fov >= fov_normal then
						if npc_rank == "novice" then 
							npc:set_fov(70)
						elseif npc_rank == "experienced" then 
							npc:set_fov(80)
						elseif npc_rank == "veteran" then
							npc:set_fov(90)
						elseif npc_rank == "master" then
							npc:set_fov(100)
						end					
					end
					if laststate[nid] == true then
						if npc and not silent_level() then
							warn_check_timer[npc:id()] = time_global()
							if warn_check_timer[npc:id()] > warn_timer then  
								local snd_name = nothing_there[amk.real_rand(1,7)]
								if snd_name then
									local snd_obj = xr_sound.get_safe_sound_object(snd_name)
									if snd_obj and not snd_obj:playing() then
										snd_obj:play_no_feedback(npc, sound_object.s3d, 0, npc:position(), 1.0)
									end
								end
								warn_timer = warn_check_timer[npc:id()] + math.random(15000, 25000) 
							end
						end
						laststate[nid] = false
					end
				elseif (htime <= 6 and htime > 4) or (htime >= 19 and htime < 21) then	
					-- сумерки
					local range = npc:range()
					local fov = npc:fov()
					if range and range >= range_normal then
						if npc_rank == "novice" then 
							npc:set_range(60)
						elseif npc_rank == "experienced" then 
							npc:set_range(65)
						elseif npc_rank == "veteran" then
							npc:set_range(70)
						elseif npc_rank == "master" then
							npc:set_range(75)
						end				
					end
				else
					-- день
					local range = npc:range()
					local fov = npc:fov()
					if range and range < range_normal then
						npc:set_range(range_normal)
					end
					if fov and fov < fov_normal then
						npc:set_fov(fov_normal)
					end
				end
			elseif (npc:best_danger() and not npc:best_enemy()) then
			-- если мы напуганы увеличим угол обзора
			-- имитируя опасливое осматривание по сторонам
			-- и повышенную внимательность
				local range = npc:range()
				local fov = npc:fov()
				if fov and fov < 150 then
					npc:set_fov(150)
				end
			elseif npc:best_enemy() or (npc:best_enemy() and npc:best_danger()) then
			-- если мы заметили врага то увеличим и
			-- дальность обзора тоже, так как
			-- по сути нас уже заметили
				local range = npc:range()
				local fov = npc:fov()
				if htime <= 4 or htime >= 21 then
					-- ночь
					if range and range < 75 then
						npc:set_range(75)
					end
				elseif (htime <= 6 and htime > 4) or (htime >= 19 and htime < 21) then
					-- сумерки
					if range and range < range_normal then
						npc:set_range(range_normal)
					end													
				end
				if fov and fov < 150 then
					npc:set_fov(150)
				end
				laststate[nid] = false
			end
		end
	end
end

-- ухудшение зрения неписей ночью -- учитывает опыт непися - подразумевая наличие ПНВ --
--------------------------- Copyright 2009 KamikaZze для OGSE -------------------------