--------- Спавн динамических рандомных аномалий для OGSЕ 0.6.9.х --------------
      ---- корректировка секторов для OGSE - - KamikaZze & Dusty79 ----
		--- предопределение типов аномалий по локациям Dusty79 ----
    --- код спавна артов на месте аномалий KamikaZze, интеграция Dusty79 ----
	--- Перекомпоновка и реализация удаления аномалий Dusty79 13_10_2009 ---
					--- Использованы материалы АМК мода ---
-------------- Copyright 2007-2009 DEXXX, Offbar, KamikaZze, Dusty79 -----------

local list_obj_id = {}
local list_del_anom_id = {}
local list_loc_mob_id = {}
local list_loc_stalk_id = {}
local lc = {}
local anom_to_del_exist = false
local need_update = true
local console = get_console()
local spawn_anom_prob 			= 0.3 -- Коэффициент кол-ва аномалий
local spawn_blow_art_probe 	= 0.5 -- Коэффициент вероятности попытки рождения артефакта аномалией в Выброс

loc = {   
atp_for_test22		 				= 1,
swamp_old            				= 2,
predbannik 			 				= 3,
dead_city           	 				= 4,
l06_rostok           					= 5,
l08_yantar           					= 6,
yantar_old           					= 7,
l10_radar            					= 8,
lost_village          					= 9,
l12_stancia          					= 10,
aver                 					= 11,
generators          					= 12,
red_forest          					= 13,
marsh                					= 14,
zaton                					= 15,
jupiter              					= 16,
pripyat             					= 17,
garbage_old          				= 18,


l01_escape             				= 0,
l02_garbage          				= 0,
l03_agroprom         				= 0,
l04_darkvalley      	 			= 0,
l05_bar              					= 0,
l07_military         				= 0,
l11_pripyat							= 0,
puzir                 					= 0,
limansk              					= 0,
hospital             					= 0,
l03u_agr_underground  		= 0,
l04u_labx18           				= 0,
l08u_brainlab        				= 0,
l10u_bunker           				= 0,
l12u_sarcofag         				= 0,
l12u_control_monolith 		= 0,
l12_stancia_2         				= 0,
av_peshera            				= 0,
peshera            	  				= 0,
warlab               					= 0,
labx8                 					= 0,
jupiter_underground   		= 0,
cs_agroprom_underground  = 0
}


local level_anoms  = {
--	l02_garbage    		= { 40, 90},   -- 88 + 10
--	l03_agroprom   	= { 50, 90},   -- 82
--	l04_darkvalley 		= { 50, 90},   -- 31
--	l05_bar        			= {  5, 8},    --  8
	l06_rostok     		= { 15, 30},   -- 26 + 17 + 15
	l08_yantar     		= { 60, 100},  --  0
--	l07_military   		= { 80, 120},  -- 60 + 6
	l10_radar      		= { 90, 130},  -- 68
--	l12_stancia_2    		= { 40, 50},   -- 34
	aver           			= { 50, 80},
	dead_city      		= { 50, 80},	
	atp_for_test22 		= { 130, 160},
    generators     		= { 130, 160},
    red_forest     		= { 130, 160},
    marsh          			= { 130, 200},
    zaton          			= { 300, 350},
    jupiter        			= { 300, 350},
    garbage_old    		= { 250, 310},
    predbannik     		= { 150, 210},
    yantar_old     		= { 100, 150},
	swamp_old      		= { 130, 160},
	lost_village   		= { 10, 20}
}


local level_vertexes = {
-- levels           							|    gvids  | lvids
l01_escape            				= {   0,  251, 595499},
l02_garbage           				= { 252,  415, 382663},
l03_agroprom          				= { 416,  702, 437420},
l03u_agr_underground  		= { 703,  810,      0},
l04_darkvalley        				= { 811, 1108, 390124},
l04u_labx18           				= {1109, 1167,      0},
l05_bar               					= {1168, 1307,  99538},
l06_rostok            				= {1308, 1437,  67712},
l08_yantar            				= {1438, 1528, 141470},
l08u_brainlab         				= {1529, 1544,      0},
l07_military          				= {1545, 1861, 418267},
l10_radar             					= {1862, 2116, 227188},
l11_pripyat           				= {2117, 2272, 261218},
l12_stancia           				= {2273, 2401, 477922},
l12u_sarcofag         				= {2402, 2466,      0},
l12u_control_monolith 			= {2467, 2516,      0},
l12_stancia_2         				= {2517, 2660,      0},
l10u_bunker           				= {2661, 2791,      0},
atp_for_test22        				= {2792, 2861, 677120},
peshera               					= {2862, 2880, 	  0},
aver                  					= {2886, 2908, 377945},
generators            				= {3076, 3152, 454370},
warlab                					= {3153, 3223,      0},
red_forest            				= {3224, 3323, 165896},
marsh                 					= {3337, 3581, 528468},
dead_city             				= {3582, 3659, 377945},
zaton                 					= {3660, 3699, 1843840},
jupiter               					= {3700, 3747, 1425786},
pripyat               					= {3748, 3770, 427661},
labx8                 					= {3830, 3850,      0},
garbage_old           				= {4032, 4337, 1180142},
yantar_old            				= {4338, 4384, 522157},
swamp_old             				= {4385, 4500, 677120},
lost_village          					= {3324, 3336, 46854},
jupiter_underground   			= {3771, 3829, 522157},
cs_agroprom_underground 	= {3851, 3869,    0},
predbannik            				= {3870, 4031, 827661}
}


function chek_exclusion_position(p_vector, lname, psy)

if bad_sector(p_vector, lname, psy) then return true end
if lc_protect(p_vector, lname, psy) then return true end
if bad_circle(p_vector, lname, psy) then return true end
return false

end


-- Проверяем, попадает ли аномалия в "bad-сектор"
function bad_sector(p_vector, lname, psy)

if not lname then
	lname = level.name()
end

local amendment = 0
if psy then
	amendment = 30
end

local k
local bad_list = {} --формируется по принципу x1>x2, y2>y1

-- Кордон --- fixed by KamikaZze
if lname=="l01_escape" then
bad_list.x1 = {  -89, -107, -160, 145,  10, -65, 136,  35, 373, -146,  83, -126, 145 }
bad_list.x2 = { -286, -150, -180,  90,  -5, -70, 125,  20, 346, -164,  29, -176, 117 }
bad_list.y1 = { -182, -400, -360, -50, -76, 115, 305, 670, -49, -341, 134, -360, 290 }
bad_list.y2 = { -100, -350, -344,  12, -55, 200, 325, 690, -15, -235, 182, -320, 335 }
end

-- Свалка --- fixed by KamikaZze
if lname == "l02_garbage" then
bad_list.x1 = {   38,  -41,  68,   38, -230, 306,  -36,  125,  120,  -182 }
bad_list.x2 = {   25, -146,  15,   32, -306, 291,  -92,   51,   35,  -272 }
bad_list.y1 = { -271,   -9, 199, -323,  -32, 132, -250, -165,  140,  -177 }
bad_list.y2 = { -258,   29, 262, -289,  -13, 154, -195, -111,  185,  -133 }
end

-- Темная долина --- fixed by KamikaZze
if lname == "l04_darkvalley" then
bad_list.x1 = { -131, -100,  -36,  191, 122,  51,  51, -29, -26, 20,   73,   71 }
bad_list.x2 = { -217, -155,  -53,  96,   82, -12, -33, -73, -32,  8,   35,   40 }
bad_list.y1 = { -211, -532, -547, -301, -20, -91,  25, -23, -22,  5, -249, -225 }
bad_list.y2 = { -175, -455, -536, -200,   8, -16,  50, -18,  25, 17, -208, -179 }
end

-- Агропром --- fixed by KamikaZze
if lname == "l03_agroprom" then
bad_list.x1 = {   67, -188,  -89, 291, 255, -158 }
bad_list.x2 = { -100, -209, -211, 265, 220, -170 }
bad_list.y1 = {  -36,   78, -241,   0, -16,   90 }
bad_list.y2 = {   58,  102, -117,   5,   7,   98 }
end

-- Дикая территория --- fixed by KamikaZze
if lname == "l06_rostok" then
bad_list.x1 = {  37,  -58, -226, -235, -218, -113, -215, -242 }
bad_list.x2 = {   9, -103, -235, -285, -242, -213, -297, -266 }
bad_list.y1 = { 117,  113,  135,   78,   29, -123,  119,    2 }
bad_list.y2 = { 156,  151,  165,  112,   64,  -49,  172,   24 }
end

-- Армейские склады --- fixed by KamikaZze
if lname == "l07_military" then
bad_list.x1 = { -305, -317, -198, -259, -324, -160,  -83, 104, 113, -203, -117,   75, -14, 77,  -2, -186,  92 }
bad_list.x2 = { -322, -347, -233, -277, -386, -195, -105,  85,  87, -247, -146, -141, -60,  0, -10, -202,  12 }
bad_list.y1 = {   55,   37,  185,  234,  371,  350,  207, 300, 160,   31,    7,  -62, -34, 10,   0,   35, 335 }
bad_list.y2 = {   67,   50,  211,  249,  411,  391,  235, 316, 184,   72,   37,  122, -10, 23, 109,   46, 403 }
end

-- Радар --- fixed by KamikaZze
if lname == "l10_radar" then
bad_list.x1 = { 149, 390, 664, 404, 314 }
bad_list.x2 = {  75, 377, 609, 355, 297 }
bad_list.y1 = { -35, 141, 167, -11, -30 }
bad_list.y2 = { -20, 162, 200,  40, -15 }
end

-- Припять  --- fixed by KamikaZze
if lname == "l11_pripyat" then
bad_list.x1 = {   31, 118, 115,  36,  18,   33 }
bad_list.x2 = {   11,  58,  96,  27, -17,  -15 }
bad_list.y1 = { -296,  -2, 110, 280, 191, -307 }
bad_list.y2 = { -266,  33, 159, 301, 210,  -60 }
end


if bad_list.x1 and bad_list.x2 and bad_list.y1 and bad_list.y2 then
	for k,v in pairs(bad_list.x1) do
		if (p_vector.x >= (bad_list.x2[k]-amendment) and (p_vector.x <= bad_list.x1[k]+amendment)) and (p_vector.z >= (bad_list.y1[k]-amendment) and p_vector.z <= (bad_list.y2[k]+amendment)) then
			return true
		end
	end
end

return false

end


function bad_circle(p_vector, lname, psy)

if not lname then
	lname = level.name()
end

local amendment = 0
if psy then
	amendment = 30
end

local bad_list = {}

-- Кордон ---
if lname=="l01_escape" then
bad_list = 	{
			{vector():set( 313.16,   3.70, 116.90), 15},	-- лагерь "в поле"
			{vector():set(-156.70, -29.60,-369.30),200},	-- армейский кордон
			{vector():set(-130.51, -0.41,  311.68), 50},	-- место встречи
			{vector():set(-130.51, -0.41,  311.68),100} 	-- туннель
			}

end

-- Свалка ---
if lname == "l02_garbage" then
bad_list = 	{
			{vector():set( -16.76,   0.54, 284.90), 10},-- точка перехода
			{vector():set(-282.50,   3.29, -24.80), 10},-- точка перехода
			{vector():set( 39.62,   0.48, 222.866), 50},-- блокпост "Долга"
			{vector():set(-225.36,  -8.24,-139.30), 35},-- лагерь за кладбищем техники
			{vector():set(  15.16,   0.40, -14.70), 15},-- автобусная остановка напротив ангара
			{vector():set(  31.69,   0.48,-263.05), 25},-- сценка с Юриком
			{vector():set(  36.45,   0.48,-305.70), 10},-- точка перехода
			{vector():set(-183.00,   0.00,-160.00), 20},-- старт квестовых бандитов за кладбищем техники
			{vector():set(-100.00,   0.00,-204.00), 10},-- наблюдатель с биноклем, пасущий бандитов
			{vector():set( -82.00,   0.00,-208.00), 40}	-- Бес, поле боя с бандитами
			}
end

-- Агропром ---
if lname == "l03_agroprom" then
bad_list = 	{
			{vector():set(  223.52,   -0.20,  52.59), 50},		-- туннель
			{vector():set(  106.15,   15.34,  103.74), 20},	-- маршрут
			{vector():set(  150.00,   -0.05,  47.58), 10},		-- маршрут
			{vector():set(  35.73,   11.07,  110.88), 10}		-- маршрут
			}
end

-- Темная долина ---
if lname == "l04_darkvalley" then
bad_list = 	{
			{vector():set(-9.36,   6.80,  98.10), 10},		-- точка перехода
			{vector():set(-217.17, 2.00, -183.55), 10},	-- точка перехода
			{vector():set(-26.97,  0.11, -36.13), 200}	-- база бандитов
			}
end

-- Бар ---
if lname == "l05_bar" then
bad_list = 	{
			{vector():set( 389.00,  11.23,-419.00), 10},	-- точка перехода
			{vector():set( -30.30,  -6.45, 380.60), 10},		-- точка перехода
			{vector():set(  48.00,  -0.20, 142.00), 20},		-- точка перехода
			{vector():set( 160.00,   0.00, 100.00),150}	-- территория
			}
end

-- Дикая территория ---
if lname == "l06_rostok" then
bad_list = 	{
			{vector():set(-162.27, -11.08,-345.90), 10},	-- точка перехода
			{vector():set(  34.96,  -0.57, 139.10), 10},	-- точка перехода
			{vector():set(-280.60,   0.00,  97.70), 10},	-- точка перехода
			{vector():set( -27.35,   0.00, 141.50), 30},	-- пост долговцев на ДТ
			{vector():set(-106.80,   1.40, 135.50), 20},	-- бульдозер
			{vector():set(-236.37,   0.00,  -9.50), 10}		-- дозорный одиночка (после X-10)
			}
end

-- Армейские склады ---
if lname == "l07_military" then
bad_list = 	{
			{vector():set(  -217.90,   -12.66,  44.73), 40}	-- хутор
			}
end

-- Янтарь ---
if lname == "l08_yantar" then
bad_list = 	{
			{vector():set( 255.40,   6.70,-281.00), 10},	-- точка перехода
			{vector():set( -66.65,  -0.50,-353.40), 30},	-- точка перехода
			{vector():set( 161.65,  -7.70, -96.70), 50},	-- лагерь у автобуса
			{vector():set(  31.55, -11.70,-272.40), 70},	-- лагерь экологов
			{vector():set(  -0.70,   0.00,-132.70), 30},	-- доктор Томпсон
			{vector():set( -14.00,   0.35, -40.50), 30},	-- свободовец в закутке
			{vector():set( -25.70,   0.80, -10.30), 50}		-- тусовка контролёра, точка перехода
			}
end

-- Радар ---
if lname == "l10_radar" then
bad_list = 	{
			{vector():set(  28.01,   -1.90,  9.70), 200}	-- излучатель
			}
end

-- Припять ---
if lname == "l11_pripyat" then
bad_list = 	{
			{vector():set( -109.58,  -2.23,  7.81), 50},		-- автовокзал
			{vector():set( 31.67, 0.28, 493.51), 15}			-- Билетёр
			}
end

-- Пустые Земли ---
if lname == "aver" then
bad_list = 	{
			{vector():set( 376.60,-9.82,-319.16), 50}		-- переход в Долину
			}

end

--fixed by valdemar093

if lname=="marsh" then
bad_list = 	{
			{vector():set( 531.15, 2.29, -170.74), 50},	 	-- Южный Хутор
			{vector():set( 602.06, 3.22, 431.56), 60},	  		-- Северный Хутор
			{vector():set( 286.53, -0.41, -149.75), 60},  		-- церковь
			{vector():set( 115.97, 1.41, -151.14), 30},	  		-- вышка
			{vector():set( 151.37, 1.03, -155.98), 30},	  		-- вышка-2
			{vector():set( -1.645, 3.359, 11.116), 30},	  		-- насосная станция
			{vector():set( 406.48, 3.07, 252.26), 100},	  	-- мехдвор
			{vector():set( 81.75, 1.07, 123.09), 25},     		-- пост
			{vector():set( 107.24, 1.01, 337.11), 20},    		-- пост-2
			{vector():set( 300.86, 0.410, -40.341), 30},  		-- пост-3
			{vector():set( 286.30, 0.393, -81.61), 30},   		-- пост-4
			{vector():set( -197.06, 2.362, 522.343), 20}, 	-- вход в шахту
			{vector():set( -56.24, 1.22, 284.07), 60},    		-- деревенька
			{vector():set( -184.43, 1.38, 406.34), 50},   		-- лодочная станция
			{vector():set( 25.34, 3.08, -236.91), 60},	 		-- Рыбацкий Хутор
			{vector():set( 84.69, 1.67, -209.51), 20},	  		-- мост
			{vector():set( 106.73, 0.73, -187.98), 20},	  		-- мост_1
			{vector():set( -205.88,  0.60,-105.77), 30},  		-- северный пост
			{vector():set( -161.10, 0.10, -291.70), 140},  	-- база "Чистое Небо"
			{vector():set(-279.74,0.94,14.68), 50},  			-- фортпост
			{vector():set(202.26,20.98,578.72), 5},  			-- арсенал ВОВ
			{vector():set(-153.74,0.87,83.66), 30},  			-- бандитский лагерь
			{vector():set(147.76,2.21,493.26), 20}  			-- бандитский лагерь-2
			}
end

if lname=="zaton" then
bad_list = 	{
			{vector():set(120.50,-2.60,183.50), 100}, 	-- скадовск
			{vector():set(38.18,-5.21,36.22), 100}, 		-- шевченко
			{vector():set(255.83,7.58,6.50), 100}, 		-- портовые краны
			{vector():set(131.47,-7.01,43.09), 50}, 		-- между ними
			{vector():set(-128.39,24.15,-403.68), 50},-- лагерь наёмников
			{vector():set(25.80,4.00,367.00), 20},		-- пещера Тремора
			{vector():set(153.04,-6.83,-138.49), 20},	-- баржа Ноя
			{vector():set(-400.33,11.0,-12.43), 75}, 	-- "круг"
			{vector():set(-332.81,17.73,362.41), 75}, 	-- лесопилка
			{vector():set(430.19,29.44,-428.00), 10} 	-- переход в Окресности "Юпитера"
			}
end

if lname=="jupiter" then
bad_list = 	{
			{vector():set(-50.5,3.4,198.70), 100},		-- янов
			{vector():set(-217.80,-3.50,74.0), 120},		-- бункер
		    {vector():set(-417.57,3.18,-359.36), 50},	-- контейнерный склад
			{vector():set(347.51,27.81,-356.01), 50},	-- главный цех "Юпитера"
			{vector():set(334.68,20.90,-330.41), 10},	-- переход в Путепровод
			{vector():set(434.81,2.77,410.47), 20},		-- переход на Затон
			{vector():set(-39.53,29.88,-244.53), 50},	-- засада спецназа
			{vector():set(-128.39,24.15,-403.68), 30},-- подстанция
			{vector():set(-386.05,-1.77,203.28), 10},	-- Додж
			{vector():set(-331.60,19.11,438.37), 20},	-- район тоннеля
			{vector():set(-334.89,18.27,420.45), 20},	-- район тоннеля
			{vector():set(-334.59,17.32,399.90), 20},	-- район тоннеля
			{vector():set(-335.72,16.97,383.37), 20},	-- район тоннеля
			{vector():set(-337.29,16.12,365.26), 20},	-- район тоннеля
			{vector():set(608.16,11.179,-283.607), 20},	-- "Глаз дракона"
			{vector():set(-381.085,2.640,-5.452), 10},	-- ЗРК "Волхов"
			{vector():set(-399.04,14.31,342.45), 10},	-- могила
			{vector():set(78.14,3.12,337.28), 30},		-- полустанок
			{vector():set(-351.91,4.37,398.20), 30}		-- тоннель
			}
end

if lname=="garbage_old" then
bad_list = 	{
			{vector():set( 90.00, 4.29, 467.99), 100}	-- переход в Окресности "Юпитера"
			}
end


if lname=="generators" then
bad_list = 	{
			{vector():set(166.59,30.85,-478.07), 100}, 	-- база
			{vector():set(224.72,18.93,-109.71), 25},		-- переход в Припять
			}
end


if lname=="atp_for_test22" then
bad_list = 	{
			{vector():set( 138.95, -6.75, -28.80), 100}, 	-- центр АТП
			{vector():set( -173.99, 3.56, 225.53), 30},		-- лагерь в поле
			{vector():set( -323.5, -6.16, -287.84), 30}	 	-- лагерь в поле-2
			}
end


if lname=="red_forest" then
bad_list = 	{
			{vector():set( -153.83,2.18,-28.05), 50},  	-- база в пещере
			{vector():set( 26.71,0.00,21.66), 25},	  	-- башня
			{vector():set( 6.91,0.0,-41.60), 20},	 	 	-- блокпост_1
			{vector():set( -65.98,-0.00,55.51), 20},	 	-- блокпост_2
			{vector():set( -140.07,1.53,-270.37), 75}	-- мост
			}
end


if lname=="predbannik" then
bad_list = 	{
			{vector():set( -36.8, 1.4, 346.5), 300},		-- заброшенная деревня с торговцем
			{vector():set( -218.9, 31.3, 276.7), 300},	-- лагерь сталкеров у пещеры
            {vector():set( -552.7, 14.5, 279.0), 200},	-- блокпост
            {vector():set( -481.9, -0.5, -156.3), 500},  -- сталкерский городок
			{vector():set( -244.9, 28.0, -123.9), 300}  -- вертолётная база
			}
end

for k, v in pairs(bad_list) do
	if v then
		if p_vector:distance_to(v[1]) <= (v[2]+amendment) then
			return true
		end
	end
end
return false

end

function lc_protect(p_vector, lname, psy)

if not lname then
	lname = level.name()
end

local amendment = 0
if psy then
	amendment = 30
end

local bad_list = {}
if lc[lname] ~= nil then
	bad_list = lc[lname]
end

for k, v in pairs(bad_list) do
	if v then
		if p_vector:distance_to(v) <= (10+amendment) then
			return true
		end
	end
end
return false

end


-- Ищем точки входа на локации
function lc_collect(lname)
	lc = {}
	for a = 1, 65535 do
	local sobj = alife():object(a)
		if sobj then
			local obj_sect = sobj:section_name()
			if string.find(obj_sect, "level_changer") then
-- -- amk.logf("Обрабатывается переход.")
				local sobj_id = sobj.id
				local lc_params = m_net_utils.get_lc_data(sobj)
-- -- amk.logf("Локация назначения: " .. lc_params.dest_level_name)
				if string.lower(lc_params.dest_level_name) == lname then
					if lc[lname] == nil then
						lc[lname] = {}
					end
					lc[lname][sobj_id] = lc_params.dest_position
-- -- amk.logf("На текущей локации найден вход.")
				end
			end
		end
	end
end


-- Проверяем исключения локаций
function chek_exclusion_location(lname)

if not lname then
	lname = level.name()
end

if lname == "l03u_agr_underground" or
	lname == "l04u_labx18" or
--	lname == "l05_bar" or
	(lname == "l06_rostok" and not has_alife_info("bar_rescue_research_done") and not has_alife_info("bar_rescue_research_fail")) or
	(lname == "l08_yantar" and not has_alife_info("yan_find_scientist_done") and not has_alife_info("yan_scientist_die") and not has_alife_info("yan_scientist_return_to_bunker")) or
	lname == "l08u_brainlab" or
	lname == "l10u_bunker" or
	lname == "l12_stancia" or 
	lname == "l12u_sarcofag" or
    lname == "jupiter_underground" or
	lname == "l12u_control_monolith" or
	lname == "l12_stancia_2" or
    lname == "warlab" then
    return true
end

return false

end


-- Проверяем исключения обрабатываемых аномалий
function chek_exclusion_anomaly(obj)

if obj then
	local name_anom=obj:name()
	if string.find(name_anom,"^noartf_") then return true end
	if
	
-- общие
	   not string.find(name_anom,"teleport") and
	   not string.find(name_anom,"burning_fuzz") and
	   not string.find(name_anom,"rusty_hair") and
	   not string.find(name_anom,"radioactive") and

-- Кордон
	 not (name_anom == "esc_zone_witches_galantine" or
			name_anom == "esc_zone_witches_galantine_0000" or
			name_anom == "esc_zone_witches_galantine_0001" or
			name_anom == "esc_zone_witches_galantine_0002" or
			name_anom == "esc_zone_witches_galantine_0003" or
			name_anom == "esc_zone_witches_galantine_0004" or
			name_anom == "esc_zone_witches_galantine_0005" or
			name_anom == "esc_zone_witches_galantine_0006" or
			name_anom == "esc_zone_witches_galantine_0007") and

-- Свалка
	   not (name_anom == "gar_zone_mosquito_bald_weak_noart_0000" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0001" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0002" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0003" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0004" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0005" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0006" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0007" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0008" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0009" or
			name_anom == "gar_zone_mosquito_bald_weak_noart_0010") and

-- Дикая Территория
	   not (name_anom == "rostok_zone_buzz" or
			string.find(name_anom,"rostok_zone_witches_galantine_average") or
			string.find(name_anom,"rostok_zone_zharka_static_average")) and

-- Армейские Склады
	   not (name_anom == "mil_zone_witches_galantine0000_0000" or
			name_anom == "mil_zone_witches_galantine0000" or
			name_anom == "mil_zone_zharka_static_strong" or
			name_anom == "mil_zone_zharka_static_strong_0000" or
			name_anom == "mil_zone_zharka_static_strong_0001" or
			name_anom == "mil_zone_zharka_static_strong_0002") and
	   
-- Припять
	   not (name_anom == "pri_zone_witches_galantine_0004" or
			name_anom == "pri_zone_witches_galantine_0005" or
			name_anom == "pri_zone_witches_galantine_0006" or
			name_anom == "pri_zone_witches_galantine_0007" or
			string.find(name_anom,"secret"))
	   then
		return true
	else
		return false
	end
end
return false

end

--[[	Не используется
function get_lists()

local levelname = level.name()
local sim = alife()

local list_obj_id = {}
local list_loc_mob_id = {}
local list_loc_stalk_id = {}

for i = 0, 65534 do
	local sobj = sim:object(i)
	if sobj then
		local map = sim:level_name(game_graph():vertex(sobj.m_game_vertex_id):level_id())
		if map == levelname then
			if isAnomaly(sobj) then
				get_anom(i)
			elseif IsStalker(sobj) then
				get_stalker(i)
			elseif IsMonster(sobj) then
				get_mob(i)
			end
		end
	end
end

end
]]

-- Получаем список всех аномалий на уровне
function get_anom(obj_id)
	if list_obj_id == nil then
		list_obj_id = {}
	end
	list_obj_id[obj_id] = obj_id
-- -- amk.logf("Получен элемент списка аномалий с идентификатором: "..tostring(obj_id))
	local status = get_anomaly_mode(obj_id)
	if status == "anom_off" then
		local obj = level.object_by_id(obj_id)
		if obj then
			obj:disable_anomaly()
		end
	end
end


-- Удаляем аномалию из списка аномалий на уровне
function delete_anom(obj_id)
	if list_obj_id then
-- -- amk.logf("Удаляется элемент списка аномалий с идентификатором: "..tostring(obj_id))
		list_obj_id[obj_id] = nil
	end
	
	if list_del_anom_id == nil then
		list_del_anom_id = {}
	end
-- -- amk.logf("Добавляется элемент списка удаляемых аномалий с идентификатором: "..tostring(obj_id))
	list_del_anom_id[obj_id] = obj_id
	anom_to_del_exist = true
end


-- Учитываем мутантов на локации
function get_mob(obj_id)

	if list_loc_mob_id == nil then
		list_loc_mob_id = {}
	end
	list_loc_mob_id[obj_id] = obj_id

end


-- Учитываем сталкеров на локации
function get_stalker(obj_id)

	if list_loc_stalk_id == nil then
		list_loc_stalk_id = {}
	end
	list_loc_stalk_id[obj_id] = obj_id

end


-- Отключаем все текущие динамические аномалии на локации и вызываем новую порцию
function add_anom(param)

local levelname = level.name()
-- -- amk.logf("Старт респавна аномалий на локации " .. levelname)
if chek_exclusion_location(levelname) then
-- -- amk.logf("Опускаем флаг выброса для локации как для исключения.")
	amk.del_variable("an"..loc[levelname])
	return
end

if list_obj_id then
-- -- amk.logf("Список аномалий существует.")
	for k,v in pairs(list_obj_id) do
	if v then
		local obj=level.object_by_id(list_obj_id[v])
		if obj then
			if chek_exclusion_anomaly(obj) then
-- -- amk.logf("Выключается аномалия: "..tostring(obj:name()))
				obj:disable_anomaly()
				spawn_blow_art(obj)
-- -- amk.logf("И отмечается на удаление.")
				set_anomaly_mode(v,"anom_off")
				--level.map_remove_object_spot(list_obj_id[v], "green_location")
				if param then
-- -- amk.logf("И передаётся в список на удаление.")
					delete_anom(k)
				end
			end
		end
	end
	end

	if param and anom_to_del_exist then
-- -- amk.logf("Зачистим из рестрикторов и удалим аномалии по списку удаляемых.")
		remove_anom()
	end

-- -- amk.logf("Генерим новую порцию аномалий...")
	generate_anoms(levelname)

	if param then
-- -- amk.logf("Опускаем флаг выброса для локации.")
		amk.del_variable("an"..loc[levelname])
	else
		amk.save_variable("an"..loc[levelname], 1)
	end

end
end


-- Создаёт набор аномалий на уровне
function generate_anoms(lname)
	local cnt, rnd, game_difficulty = 0,0,0
	local v = level_anoms[lname]
	if v then
		lc_collect(lname)
		game_difficulty = level.get_game_difficulty() or 0
		rnd = math.floor(spawn_anom_prob * math.random(v[1],v[2]) * (0.9+(game_difficulty+1)*0.1))
		while cnt < rnd do
			if generate_anomaly(lname) then
				cnt = cnt + 1
			end
		end
	end
end

function generate_anomaly(lname)

	local pos, new_lv, new_gv = anomaly_position_choice(lname, false)
	local section, shape = anomaly_section_choice(lname)

	return spawn_rand_anom(section, pos, new_lv, new_gv, shape)
end


function spawn_rand_anom(name_new_anom, pos, lvid, gvid, shape)

-- -- amk.logf("Новая аномалия: "..tostring(name_new_anom))
	local sobj = alife():create(name_new_anom, pos, lvid, gvid)
	if sobj then
-- -- amk.logf("Обработаем её...")
		local obj_id = sobj.id
-- -- amk.logf("ID = "..tostring(obj_id))
		local tbl = m_net_utils.get_anomaly_data(sobj)
		tbl.shapes = shape
		m_net_utils.set_anomaly_data(tbl, sobj)

		get_anom(obj_id)
		-- level.map_add_object_spot(sobj.id, "green_location", sobj:name())
	end
	return sobj
end


-- Обновляем менеджер аномалий при загрузке
function anom_update()

if need_update == false then return end
-- -- amk.logf("Проверим, надо ли обновлять аномалии для этой локации.")
local anom_chek = amk.load_variable("an"..loc[level.name()],0)
	if anom_chek == 2 then
-- -- amk.logf("Да. Обновляем.")
		add_anom("param")
	elseif anom_chek == 1 then
-- -- amk.logf("Нет. Проверим отметки аномалий на удаление.")
		chek_for_del()
-- -- amk.logf("Опускаем флаг выброса для локации.")
		amk.del_variable("an"..loc[level.name()])
	else
-- -- amk.logf("Нет. Обновление не требуется.")
	end
need_update = false
end

function chek_for_del()
	for k,v in pairs(list_obj_id) do
	if v then
-- -- amk.logf("Проверяется аномалия с идентификатором: "..tostring(v))
		local sobj = alife():object(v)
		if sobj then
-- -- amk.logf("Она существует.")
			local status = get_anomaly_mode(v)
			if status == "anom_off" then
-- -- amk.logf("И передаётся в список на удаление.")
				delete_anom(k)
			end
		end
	end
	end
	if anom_to_del_exist then
-- -- amk.logf("Зачистим из рестрикторов и удалим аномалии по списку удаляемых.")
		remove_anom()
	end
end


-- Поднимаем флаги выброса для локаций
function blow_flags()
	for k,v in pairs(loc) do
		amk.save_variable("an"..loc[k], 2)
-- -- amk.logf("Подняли флаг выброса для локации: "..tostring(loc[k]))
	end
end


-- Получаем статус аномалии
function get_anomaly_mode(anom_id)
if not anom_id then return "" end
	local sobj = alife():object(anom_id)
	if sobj then
		local tbl = m_net_utils.get_anomaly_data(sobj)
		local cd = tbl.custom
		cd = m_net_utils.parse_custom_data(cd)
		if cd and cd.m_anom and cd.m_anom.status then
			return cd.m_anom.status
		end
	end
	return ""
end

-- Устанавливаем статус аномалии
function set_anomaly_mode(anom_id, status)
	local sobj = alife():object(anom_id)
	local tbl = m_net_utils.get_anomaly_data(sobj)
	tbl.custom = modify_anomaly_custom_data(tbl.custom,status)
	m_net_utils.set_anomaly_data(tbl, sobj)
end

function modify_anomaly_custom_data(cd,status)
	cd = m_net_utils.parse_custom_data(cd)
	if not cd then cd = {} end
	if not cd.m_anom then cd.m_anom = {} end
	cd.m_anom.status = status
	return m_net_utils.gen_custom_data(cd)
end


-- Чистим и релизим аномалии по спискам
function remove_anom()
	if list_del_anom_id then
-- -- amk.logf("Список удаляемых аномалий существует.")
		restr_reset()
		release_anom()
-- -- amk.logf("Очистим список удаляемых аномалий.")
		list_del_anom_id = {}
		anom_to_del_exist = false
	end
end


-- Сбрасываем рестрикторы мобов и сталкеров
function restr_reset()
	mob_restr_reset()
	stalker_restr_reset()
end

function mob_restr_reset()
	for k,v in pairs(list_loc_mob_id) do
-- -- amk.logf("Зачищается моб с идентификатором: "..tostring(v))
		if v then
			local sobj = alife():object(v)
			if sobj then
-- -- amk.logf("Моб существует.")
				local tbl = m_net_utils.get_monster_data(sobj)
				local current_restriction = tbl.crvu32u16u2

				for r_num,r_id in pairs(current_restriction) do
-- if r_id then -- amk.logf("r_id = " .. r_id) end
					if list_del_anom_id[r_id] ~= nil then
-- -- amk.logf("Зачищается аномалия с идентификатором: "..tostring(r_id))
						alife():remove_in_restriction(sobj, r_id)
					end
				end
			end
		end
	end
end

function stalker_restr_reset()
	for k,v in pairs(list_loc_stalk_id) do
-- -- amk.logf("Зачищается сталкер с идентификатором: "..tostring(v))
		if v then
			local sobj = alife():object(v)
			if sobj then
-- -- amk.logf("Сталкер существует.")
				local tbl = m_net_utils.get_stalker_data(sobj)
				local current_restriction = tbl.crvu32u16u2

				for r_num,r_id in pairs(current_restriction) do
-- if r_id then -- amk.logf("r_id = " .. r_id) end
					if list_del_anom_id[r_id] ~= nil then
-- -- amk.logf("Зачищается аномалия с идентификатором: "..tostring(r_id))
						alife():remove_in_restriction(sobj, r_id)
					end
				end
			end
		end
	end
end


-- Релизим аномалии по списку удаляемых аномалий на уровне
function release_anom()
	for k,v in pairs(list_del_anom_id) do
		if v then
			local sobj = alife():object(v)
			if sobj then
-- -- amk.logf("Релизится аномалия с идентификатором: "..tostring(v))
				alife():release(sobj, true)
				list_del_anom_id[k] = nil
			end
		end
	end
end

--[[	Не используется
function isAnomaly(obj)
	if (obj:clsid() > 167 and obj:clsid() < 180) then
		return true
	end
	return false
end
]]

-- Рожание артефактов в Выброс
function spawn_blow_art(obj)

	if obj == nil then return end
	local an_obj = alife():object(obj:id())
	local anom_sect = an_obj:section_name()
	if string.find(anom_sect, "handmade_") then return end
	local noart_chk = string.find(anom_sect, "noartf_", 1, true)
	if noart_chk then
		anom_sect = string.sub(anom_sect,(noart_chk +7),string.len(anom_sect))
		anom_sect = "zone_"..anom_sect
-- -- amk.logf("ARTF_D Dinamic anomaly found - restored its parent: "..tostring(anom_sect))
	end		
	local rand_chk = utils.cfg_get_number(system_ini(), anom_sect, "artefact_spawn_probability", an_obj, false, 0.1)
-- -- amk.logf("Проверим, будет ли пробовать рожать артефакт аномалия: "..tostring(anom_sect))
	if math.random() <= rand_chk * spawn_blow_art_probe then
		local art_section = ogsm_funcs.parse_string_arts(anom_sect)
		if art_section then
			local pos = obj:position()
			local lv, gv = an_obj.m_level_vertex_id, an_obj.m_game_vertex_id
			ogsm_funcs.quest_spawn(tostring(art_section), 1, pos, 1, lv, gv)							
-- -- amk.logf("В Выброс заспавнен артефакт: "..tostring(art_section))
		end
	end

end


function anomaly_position_choice(lname, psy)

	if not lname then 
		lname = level.name()
	end

	if not level_vertexes[lname] or level_vertexes[lname][3] == 0 then return false end
	local gvn,gvx,lvx = level_vertexes[lname][1], level_vertexes[lname][2], level_vertexes[lname][3]

	local new_lv = math.random(1,lvx)
	local pos = level.vertex_position(new_lv)

	while chek_exclusion_position(pos, lname, psy) do
		new_lv = math.random(1,lvx)
		pos = level.vertex_position(new_lv)
	end
	
	local new_gv = 0
	local min_dist = 10000000
	-- подбираем геймвертекс
	for a = gvn, gvx do
		local tmp = game_graph():vertex(a):game_point()
		if tmp:distance_to(pos) < min_dist then
			min_dist = tmp:distance_to(pos)
			new_gv = a
		end
	end

	return pos, new_lv, new_gv

end


local anom_prefix = "noartf_"

local anom_types = {
l01_escape =   {mosquito_bald     = 0.4,
				gravi_zone        = 0.0,
				mincer            = 0.3,
				witches_galantine = 0.0,
				zharka_static     = 0.0,
				buzz              = 0.0,
				fountain          = 0.0,
				ice               = 0.0,
				smallrain         = 0.1,
				zavesa            = 0.0,
                                radioactive       = 0.3
				},
l02_garbage =  {mosquito_bald     = 0.2,
				gravi_zone        = 0.3,
				mincer            = 0.0,
				witches_galantine = 0.2,
				zharka_static     = 0.0,
				buzz              = 0.0,
				fountain          = 0.0,
				ice               = 0.05,
				smallrain         = 0.0,
				zavesa            = 0.0,
                                                               radioactive       = 0.6
				},
l03_agroprom = {mosquito_bald     = 0.3,
				gravi_zone        = 0.2,
				mincer            = 0.0,
				witches_galantine = 0.0,
				zharka_static     = 0.1,
				buzz              = 0.05,
				fountain          = 0.0,
				ice               = 0.2,
				smallrain         = 0.0,
				zavesa            = 0.0,
                                                                radioactive       = 0.2
				},
l04_darkvalley = {mosquito_bald   = 0.1,
				gravi_zone        = 0.2,
				mincer            = 0.3,
				witches_galantine = 0.1,
				zharka_static     = 0.0,
				buzz              = 0.05,
				fountain          = 0.0,
				ice               = 0.05,
				smallrain         = 0.0,
				zavesa            = 0.0,
                                                                radioactive       = 0.35
				},
l05_bar =      {mosquito_bald     = 0.0,
				gravi_zone        = 0.2,
				mincer            = 0.0,
				witches_galantine = 0.1,
				zharka_static     = 0.2,
				buzz              = 0.0,
				fountain          = 0.0,
				ice               = 0.0,
				smallrain         = 0.0,
				zavesa            = 0.2,
                                                                radioactive       = 0.3
				},
l06_rostok =   {mosquito_bald     = 0.1,
				gravi_zone        = 0.0,
				mincer            = 0.3,
				witches_galantine = 0.0,
				zharka_static     = 0.2,
				buzz              = 0.0,
				fountain          = 0.0,
				ice               = 0.3,
				smallrain         = 0.0,
				zavesa            = 0.0,
                                                                radioactive       = 0.2
				},
l07_military = {mosquito_bald     = 0.2,
				gravi_zone        = 0.2,
				mincer            = 0.2,
				witches_galantine = 0.25,
				zharka_static     = 0.1,
				buzz              = 0.1,
				fountain          = 0.0,
				ice               = 0.2,
				smallrain         = 0.0,
				zavesa            = 0.0,
                                                                radioactive       = 0.5
				},
l08_yantar =   {mosquito_bald     = 0.0,
				gravi_zone        = 0.1,
				mincer            = 0.0,
				witches_galantine = 0.0,
				zharka_static     = 0.0,
				buzz              = 0.1,
				fountain          = 0.05,
				ice               = 0.1,
				smallrain         = 0.35,
				zavesa            = 0.2,
                                                                radioactive       = 0.1
				},
l10_radar =    {mosquito_bald     = 0.1,
				gravi_zone        = 0.2,
				mincer            = 0.3,
				witches_galantine = 0.2,
				zharka_static     = 0.0,
				buzz              = 0.0,
				fountain          = 0.0,
				ice               = 0.2,
				smallrain         = 0.3,
				zavesa            = 0.35,
                                                                radioactive       = 0.3
				},
l11_pripyat =  {mosquito_bald     = 0.2,
				gravi_zone        = 0.15,
				mincer            = 0.3,
				witches_galantine = 0.1,
				zharka_static     = 0.1,
				buzz              = 0.0,
				fountain          = 0.05,
				ice               = 0.05,
				smallrain         = 0.0,
				zavesa            = 0.0,
                                                                radioactive       = 0.3
				},
l12_stancia =  {mosquito_bald     = 0.4,
				gravi_zone        = 0.3,
				mincer            = 0.4,
				witches_galantine = 0.3,
				zharka_static     = 0.2,
				buzz              = 0.05,
				fountain          = 0.05,
				ice               = 0.3,
				smallrain         = 0.1,
				zavesa            = 0.1,
                                                                radioactive       = 0.3
				},
aver        =  {mosquito_bald     = 0.1,
				gravi_zone        = 0.05,
				mincer            = 0.05,
				witches_galantine = 0.3,
				zharka_static     = 0.0,
				buzz              = 0.1,
				fountain          = 0.1,
				ice               = 0.0,
				smallrain         = 0.15,
				zavesa            = 0.1,
                                                                radioactive       = 0.2
				},
generators  =  {mosquito_bald     = 0.4,
				gravi_zone        = 0.3,
				mincer            = 0.2,
				witches_galantine = 0.35,
				zharka_static     = 0.1,
				buzz              = 0.05,
				fountain          = 0.1,
				ice               = 0.2,
				smallrain         = 0.35,
				zavesa            = 0.2,
                                                                radioactive       = 0.5
				},
red_forest  =  {mosquito_bald     = 0.0,
				gravi_zone        = 0.1,
				mincer            = 0.25,
				witches_galantine = 0.1,
				zharka_static     = 0.2,
				buzz              = 0.1,
				fountain          = 0.0,
				ice               = 0.2,
				smallrain         = 0.1,
				zavesa            = 0.0,
                                                                radioactive       = 0.5
				},			
marsh       =  {mosquito_bald     = 0.1,
				gravi_zone        = 0.2,
				mincer            = 0.0,
				witches_galantine = 0.05,
				zharka_static     = 0.1,
				buzz              = 0.15,
				fountain          = 0.1,
				ice               = 0.0,
				smallrain         = 0.2,
				zavesa            = 0.1,
                                                                radioactive       = 0.25
				},
zaton       =  {mosquito_bald     = 0.2,
				gravi_zone        = 0.3,
				mincer            = 0.4,
				witches_galantine = 0.1,
				zharka_static     = 0.0,
				buzz              = 0.05,
				fountain          = 0.0,
				ice               = 0.2,
				smallrain         = 0.2,
				zavesa            = 0.05,
                                                                radioactive       = 0.2
				},
jupiter     =  {mosquito_bald     = 0.3,
				gravi_zone        = 0.2,
				mincer            = 0.4,
				witches_galantine = 0.2,
				zharka_static     = 0.1,
				buzz              = 0.0,
				fountain          = 0.05,
				ice               = 0.0,
				smallrain         = 0.05,
				zavesa            = 0.2,
                                                                radioactive       = 0.3
				},
garbage_old  = {mosquito_bald     = 0.4,
				gravi_zone        = 0.35,
				mincer            = 0.45,
				witches_galantine = 0.0,
				zharka_static     = 0.2,
				buzz              = 0.0,
				fountain          = 0.0,
				ice               = 0.0,
				smallrain         = 0.0,
				zavesa            = 0.0,
                                                                radioactive       = 0.5
				},
yantar_old   = {mosquito_bald     = 0.1,
				gravi_zone        = 0.0,
				mincer            = 0.3,
				witches_galantine = 0.0,
				zharka_static     = 0.2,
				buzz              = 0.0,
				fountain          = 0.0,
				ice               = 0.3,
				smallrain         = 0.2,
				zavesa            = 0.2,
                                                                radioactive       = 0.2
				},
predbannik  = {mosquito_bald     = 0.2,
				gravi_zone        = 0.2,
				mincer            = 0.3,
				witches_galantine = 0.05,
				zharka_static     = 0.0,
				buzz              = 0.0,
				fountain          = 0.0,
				ice               = 0.2,
				smallrain         = 0.1,
				zavesa            = 0.05,
                                                                radioactive       = 0.4
				},
other =        {mosquito_bald     = 0.35,
				gravi_zone        = 0.3,
				mincer            = 0.4,
				witches_galantine = 0.2,
				zharka_static     = 0.1,
				buzz              = 0.05,
				fountain          = 0.05,
				ice               = 0.2,
				smallrain         = 0.1,
				zavesa            = 0.05,
                                                                radioactive       = 0.3
				}				
}

local anom_power = {
l01_escape =     {{postfix = "_weak", val =   1}, {postfix = "_average", val = 0.3}, {postfix = "_strong", val = 0.01}},
l02_garbage =    {{postfix = "_weak", val =   1}, {postfix = "_average", val = 0.6}, {postfix = "_strong", val = 0.05}},
l03_agroprom =   {{postfix = "_weak", val = 0.8}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.2}},
l04_darkvalley = {{postfix = "_weak", val = 0.7}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.3}},
l05_bar =        {{postfix = "_weak", val =   1}, {postfix = "_average", val = 0.6}, {postfix = "_strong", val =  0.1}},
l06_rostok =     {{postfix = "_weak", val = 0.6}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.3}},
l07_military =   {{postfix = "_weak", val = 0.3}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.6}},
l08_yantar =     {{postfix = "_weak", val = 0.7}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.3}},
l10_radar =      {{postfix = "_weak", val = 0.2}, {postfix = "_average", val = 0.6}, {postfix = "_strong", val =    1}},
l11_pripyat =    {{postfix = "_weak", val = 0.1}, {postfix = "_average", val = 0.5}, {postfix = "_strong", val =    1}},
l12_stancia =    {{postfix = "_weak", val = 0.1}, {postfix = "_average", val = 0.4}, {postfix = "_strong", val =    1}},
aver =           {{postfix = "_weak", val =   1}, {postfix = "_average", val = 0.6}, {postfix = "_strong", val = 0.05}},
generators =     {{postfix = "_weak", val = 0.1}, {postfix = "_average", val = 0.5}, {postfix = "_strong", val =    1}},
red_forest =     {{postfix = "_weak", val = 0.7}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.3}},
marsh =          {{postfix = "_weak", val = 0.8}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.2}},
zaton =          {{postfix = "_weak", val = 0.3}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.6}},
jupiter =        {{postfix = "_weak", val = 0.3}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.6}},
garbage_old =    {{postfix = "_weak", val =   1}, {postfix = "_average", val = 0.6}, {postfix = "_strong", val = 0.05}},
yantar_old =    {{postfix = "_weak", val =   1}, {postfix = "_average", val = 0.3}, {postfix = "_strong", val = 0.01}},
predbannik =  {{postfix = "_weak", val =   1}, {postfix = "_average", val = 0.6}, {postfix = "_strong", val = 0.05}},
other =          {{postfix = "_weak", val = 0.6}, {postfix = "_average", val =   1}, {postfix = "_strong", val =  0.3}}
}

local anoms_sections = {
	buzz              = {"buzz",              {shtype=0, radius=1.5, center={0,0,0}}},
	gravi_zone        = {"gravi_zone",        {shtype=0, radius=3,   center={0,0,0}}},
	mincer            = {"mincer",            {shtype=0, radius=4,   center={0,0,0}}},
	mosquito_bald     = {"mosquito_bald",     {shtype=0, radius=3,   center={0,0,0}}},
	witches_galantine = {"witches_galantine", {shtype=0, radius=4,   center={0,0,0}}},
	zharka_static     = {"zharka_static",     {shtype=1, v1={1,0,0}, v2={0,5,0}, v3={0,0,1}, offset={0,0,0}}},
	fountain          = {"fountain",          {shtype=0, radius=1.0,   center={0,0,0}}},
	ice               = {"ice",               {shtype=0, radius=4,   center={0,0,0}}},
	smallrain         = {"smallrain",         {shtype=0, radius=5,   center={0,0,0}}},
	zavesa            = {"zavesa",            {shtype=0, radius=5, center={0,0,0}}},
	radioactive       = {"radioactive",       {shtype=0, radius=12,   center={0,0,0}}}
}


function anomaly_section_choice(levelname)

	local anom_to_spawn = nil
	local name_anom_to_spawn = nil
	local postfix_anom_to_spawn = nil
	local anom_table_name = {}
	local anom_table_postfix = {}

	if anom_types[levelname] then
		anom_table_name = anom_types[levelname]
	else
		anom_table_name = anom_types.other
	end

	local type_choose = math.random()
	local b1, b2 = 0.0, 0.0
	for k,v in pairs(anom_table_name) do
		b2 = b2 + v
		if type_choose >= b1 and type_choose <= b2 then
			name_anom_to_spawn = anoms_sections[k][1]
			break
		end
		b1 = b2
	end

--	name_anom_to_spawn = anom_table_name[math.random(table.getn(anom_table_name))]

	if anom_power[levelname] then
		anom_table_postfix = anom_power[levelname]
	else
		anom_table_postfix = anom_power.other
	end

	local spawn_choose = math.random()
-- -- amk.logf("spawn_choose = "..tostring(spawn_choose))
	local low_level = 0.0

	table.sort(anom_table_postfix,function(a,b) return a.val < b.val end)

	for key, value in pairs(anom_table_postfix) do
-- -- amk.logf(tostring(value.postfix).." = "..tostring(value.val))
		if spawn_choose < value.val and spawn_choose >= low_level then
			postfix_anom_to_spawn = value.postfix
		end
		low_level = value.val
	end
-- -- amk.logf("postfix_anom_to_spawn = "..tostring(postfix_anom_to_spawn))
-- -- amk.logf("low_level = "..tostring(low_level))

	if name_anom_to_spawn and postfix_anom_to_spawn then
		anom_to_spawn = anom_prefix .. name_anom_to_spawn .. postfix_anom_to_spawn
	end

	local coef_effective_radius = 1
	if 	system_ini():line_exist(anom_to_spawn, "effective_radius") then
		coef_effective_radius = system_ini():r_string(anom_to_spawn, "effective_radius")
	end
-- -- amk.logf("Коэффициент эффективного радиуса выбран: " .. coef_effective_radius)

	local section = anoms_sections[name_anom_to_spawn]
	local shape1 = section[2]
	local shapes = {}
	shapes[1] = {}
	shapes[1].shtype = shape1.shtype
	if shape1.shtype == 0 then
		shapes[1].radius = shape1.radius * coef_effective_radius
		shapes[1].center = vector():set(shape1.center[1],shape1.center[2],shape1.center[3])
	else
		shapes[1].v1 = vector():set(shape1.v1[1],shape1.v1[2],shape1.v1[3])
		shapes[1].v2 = vector():set(shape1.v2[1],shape1.v2[2],shape1.v2[3])
		shapes[1].v3 = vector():set(shape1.v3[1],shape1.v3[2],shape1.v3[3])
		shapes[1].offset = vector():set(shape1.offset[1],shape1.offset[2],shape1.offset[3])
	end

	return anom_to_spawn, shapes

end

--------- Спавн динамических рандомных аномалий для OGSЕ 0.6.9.х --------------
      ---- корректировка секторов для OGSE - - KamikaZze & Dusty79 ----
		--- предопределение типов аномалий по локациям Dusty79 ----
    --- код спавна артов на месте аномалий KamikaZze, интеграция Dusty79 ----
	--- Перекомпоновка и реализация удаления аномалий Dusty79 08_10_2009 ---
					--- Использованы материалы АМК мода ---
-------------- Copyright 2007-2009 DEXXX, Offbar, KamikaZze, Dusty79 -----------

--[[

If you're going to use the whole of this script or its parts in your own creative 
developments for the S.T.A.L.K.E.R. game, please don't become such a goddamn 
motherfucker like the notorious author of the ABC Mod - Carbrobro. Leave the 
copyrights, note the real author(s) and don't claim others' ideas and their 
realization to be your own ones. It's just simple Modmakers' Ethics. Thank you!

Если вы собираетесь использовать данный скрипт целиком или частично в своих 
разработках по игре S.T.A.L.K.E.R., пожалуйста не опускайтесь до уровня печально 
известного автора ABC мода - Carbrobro. Не удаляйте копирайты, указывайте настоящего 
автора(ов) и не выдавайте чужие идеи и их реализацию за свои. Ведь это элементарная 
этика модостроителей! Спасибо за понимание.

]]--