totems = totems or {}

-- настройки тотемов
totems.params = 
{
	-- центр всех тотемов
	center = {135,135},
	
	-- время, за которое тотет активируется (выезжает на передний план)
	activate_time =	200,
	-- время, за которое тотем деактивируется (возвращается в исходное состояние)
	deactivate_time = 400,
	-- задержка после срабатывания тотема перед деактивацией
	delay_before_deactivate = 600,
	-- длительность демонстрации тотема
	demonstrate_time = 1000,
	
	-- масштаб, от которого начнет увеличиваться тотем при активировании
	small_scale = {0.3, 0.3},
	
	-- настройки желтого тотема
	yellow_totem = 
	{
		-- 1-й уровень
		{
			contour = "screens_game_totems_yellow_contur_state1",
			small = "screens_game_totems_yellow_small_state1",
			big = "screens_game_totems_yellow_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				--- после 1-го мача
				{"totem_yellow_state01" ,"totem_yellow_left-eye"},
				-- после 2-го мача
				{"totem_yellow_state01","totem_yellow_left-eye", "totem_yelow_right-eye"},
				-- после 3-го мача
				{}
			}
		},
		-- 2-й уровень
		{
			contour = "screens_game_totems_yellow_contur_state2",
			small = "screens_game_totems_yellow_small_state2",
			big = "screens_game_totems_yellow_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_yellow_state02" , "totem_yellow_left-eye" },
				-- после 2-го мача
				{"totem_yellow_state02" ,"totem_yellow_left-eye", "totem_yelow_right-eye"},
				-- после 3-го мача
				{}
			}
		},
		-- 3-й уровень
		{
			contour = "screens_game_totems_yellow_contur_state3",
			small = "screens_game_totems_yellow_small_state3",
			big = "screens_game_totems_yellow_state3",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_yellow_state03", "totem_yellow_left-eye" },
				-- после 2-го мача
				{"totem_yellow_state03","totem_yellow_left-eye", "totem_yelow_right-eye"},
				-- после 3-го мача
				{"totem_yellow_state03","totem_yellow_left-eye", "totem_yelow_right-eye", "totem_yelow_mouth"}
			}
		},
		-- 4-й уровень
		{
			contour = "screens_game_totems_yellow_contur_state3",
			small = "screens_game_totems_yellow_small_state3",
			big = "screens_game_totems_yellow_state3",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_yellow_state04","totem_yellow_left-eye" },
				-- после 2-го мача
				{"totem_yellow_state04" ,"totem_yellow_left-eye", "totem_yelow_right-eye"},
				-- после 3-го мача
				{"totem_yellow_state04","totem_yellow_left-eye", "totem_yelow_right-eye", "totem_yelow_mouth"}
			}
		},
		-- позиция контура
		contour_pos = {155, 20},
		-- позиция маленького изобрадения
		small_pos = {155, 20},
		-- позиция, от которой начнет двигаться тотем при активировании
		activation_start_pos = {155, 22},
		-- набор клипов дополнитльной фичи (у желтого нет такой фичи)
		feature_clips = {},
		-- звук на использование тотема
		sound = "totem_yellow_use01"
	},
	-- настройки оранжевого тотема
	orange_totem = 
	{
		-- 1-й уровень
		{
			contour = "screens_game_totems_orange_contur_state1",
			small = "screens_game_totems_orange_small_state1",
			big = "screens_game_totems_orange_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_orange_left-eye"},
				-- после 2-го мача
				{"totem_orange_left-eye", "totem_orange_right-eye"},
				-- после 3-го мача
				{"totem_orange_left-eye", "totem_orange_right-eye", "totem_orange_mouth"}
			}
		},
		-- 2-й уровень
		{
			contour = "screens_game_totems_orange_contur_state1",
			small = "screens_game_totems_orange_small_state1",
			big = "screens_game_totems_orange_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_orange_left-eye"},
				-- после 2-го мача
				{"totem_orange_left-eye", "totem_orange_right-eye"},
				-- после 3-го мача
				{"totem_orange_left-eye", "totem_orange_right-eye", "totem_orange_mouth"}
			}
		},
		-- 3-й уровень
		{
			contour = "screens_game_totems_orange_contur_state1",
			small = "screens_game_totems_orange_small_state2",
			big = "screens_game_totems_orange_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_orange_left-eye"},
				-- после 2-го мача
				{"totem_orange_left-eye", "totem_orange_right-eye"},
				-- после 3-го мача
				{"totem_orange_left-eye", "totem_orange_right-eye", "totem_orange_mouth"}
			}
		},
		-- 4-й уровень
		{
			contour = "screens_game_totems_orange_contur_state1",
			small = "screens_game_totems_orange_small_state2",
			big = "screens_game_totems_orange_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_orange_left-eye"},
				-- после 2-го мача
				{"totem_orange_left-eye", "totem_orange_right-eye"},
				-- после 3-го мача
				{"totem_orange_left-eye", "totem_orange_right-eye", "totem_orange_mouth"}
			}
		},
		-- позиция контура
		contour_pos = {210, 95},
		-- позиция маленького изобрадения
		small_pos = {210, 95},
		-- позиция, от которой начнет двигаться тотем при активировании
		activation_start_pos = {190, 93},
		-- набор клипов дополнитльной фичи (у оранжевого нет такой фичи)
		feature_clips = {},
		-- звук на использование тотема
		sound = "totem_orange_use01"
	},
	-- настройки белого тотема
	white_totem = 
	{
		-- 1-й уровень
		{
			contour = "screens_game_totems_white_contur_state1",
			small = "screens_game_totems_white_small_state1",
			big = "screens_game_totems_white_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_white_state1", "totem_white_state01_02_water", "totem_white_left-eye"},
				-- после 2-го мача
				{"totem_white_state1", "totem_white_state01_02_water", "totem_white_left-eye", "totem_white_right-eye"},
				-- после 3-го мача
				{}
			}
		},
		-- 2-й уровень
		{
			contour = "screens_game_totems_white_contur_state1",
			small = "screens_game_totems_white_small_state1",
			big = "screens_game_totems_white_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_white_state2", "totem_white_state01_02_water", "totem_white_left-eye"},
				-- после 2-го мача
				{"totem_white_state2", "totem_white_state01_02_water", "totem_white_left-eye", "totem_white_right-eye"},
				-- после 3-го мача
				{"totem_white_state2", "totem_white_state01_02_water", "totem_white_left-eye", "totem_white_right-eye", "totem_white_mouth"}
			}
		},
		-- 3-й уровень
		{
			contour = "screens_game_totems_white_contur_state2",
			small = "screens_game_totems_white_small_state2",
			big = "screens_game_totems_white_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_white_state3", "totem_white_state03_04_water", "totem_white_left-eye"},
				-- после 2-го мача
				{"totem_white_state3", "totem_white_state03_04_water", "totem_white_left-eye", "totem_white_right-eye"},
				-- после 3-го мача
				{"totem_white_state3", "totem_white_state03_04_water", "totem_white_left-eye", "totem_white_right-eye", "totem_white_mouth"}
			}
		},
		-- 4-й уровень
		{
			contour = "screens_game_totems_white_contur_state2",
			small = "screens_game_totems_white_small_state2",
			big = "screens_game_totems_white_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
			    -- после 1-го мача
				{"totem_white_state4", "totem_white_state03_04_water", "totem_white_left-eye"},
				-- после 2-го мача
				{"totem_white_state4", "totem_white_state03_04_water", "totem_white_left-eye", "totem_white_right-eye"},
				-- после 3-го мача
				{"totem_white_state4", "totem_white_state03_04_water", "totem_white_left-eye", "totem_white_right-eye", "totem_white_mouth"}
			}
		},
		-- позиция контура
		contour_pos = {55, 20},
		-- позиция маленького изобрадения
		small_pos = {55, 20},
		-- позиция, от которой начнет двигаться тотем при активировании
		activation_start_pos = {32, 19},
		-- набор клипов дополнитльной фичи (у белого нет такой фичи)
		feature_clips = {},
		-- звук на использование тотема
		sound = "totem_white_use01"
	},
	-- настройки фиолетового тотема
	violet_totem = 
	{
		-- 1-й уровень
		{
			contour = "screens_game_totems_violet_contur_state1",
			small = "screens_game_totems_violet_small_state1",
			big = "screens_game_totems_violet_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_violet_state1" , "totem_violet_left-eye"},
				-- после 2-го мача
				{"totem_violet_state1" , "totem_violet_left-eye", "totem_violet_right-eye"},
				-- после 3-го мача
				{}
			}
		},
		-- 2-й уровень
		{
			contour = "screens_game_totems_violet_contur_state1",
			small = "screens_game_totems_violet_small_state1",
			big = "screens_game_totems_violet_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_violet_state2" , "totem_violet_left-eye"},
				-- после 2-го мача
				{"totem_violet_state2" , "totem_violet_left-eye", "totem_violet_right-eye"},
				-- после 3-го мача
				{}
			}
		},
		-- 3-й уровень
		{
			contour = "screens_game_totems_violet_contur_state2",
			small = "screens_game_totems_violet_small_state2",
			big = "screens_game_totems_violet_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_violet_state3" , "totem_violet_left-eye"},
				-- после 2-го мача
				{"totem_violet_state3" , "totem_violet_left-eye", "totem_violet_right-eye"},
				-- после 3-го мача
				{"totem_violet_state3" , "totem_violet_left-eye", "totem_violet_right-eye","totem_violet_mouth"}
			}
		},
		-- 4-й уровень
		{
			contour = "screens_game_totems_violet_contur_state2",
			small = "screens_game_totems_violet_small_state2",
			big = "screens_game_totems_violet_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_violet_state3" , "totem_violet_left-eye"},
				-- после 2-го мача
				{"totem_violet_state4" , "totem_violet_left-eye", "totem_violet_right-eye"},
				-- после 3-го мача
				{"totem_violet_state4" , "totem_violet_left-eye", "totem_violet_right-eye", "totem_violet_mouth"}
			}
		},
		-- позиция контура
		contour_pos = {5, 80},
		-- позиция маленького изобрадения
		small_pos = {5, 80},
		-- позиция, от которой начнет двигаться тотем при активировании
		activation_start_pos = {-8, 83},
		-- набор клипов дополнитльной фичи (у фиолетового нет такой фичи)
		feature_clips = {},
		-- звук на использование тотема
		sound = "totem_violet_use01"
	},
	-- настройки зеленого тотема
	green_totem = 
	{
		-- 1-й уровень
		{
			contour = "screens_game_totems_green_contur_state1",
			small = "screens_game_totems_green_small_state1",
			big = "screens_game_totems_green_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_green_left-eye"},
				-- после 2-го мача
				{"totem_green_left-eye", "totem_green_right-eye"},
				-- после 3-го мача
				{"totem_green_left-eye", "totem_green_right-eye", "totem_green_mouth"}
			}
		},
		-- 2-й уровень
		{
			contour = "screens_game_totems_green_contur_state2",
			small = "screens_game_totems_green_small_state2",
			big = "screens_game_totems_green_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_green_state01" , "totem_green_left-eye"},
				-- после 2-го мача
				{"totem_green_state01" ,"totem_green_left-eye", "totem_green_right-eye"},
				-- после 3-го мача
				{"totem_green_state01" ,"totem_green_left-eye", "totem_green_right-eye", "totem_green_mouth"}
			}
		},
		-- 3-й уровень
		{
			contour = "screens_game_totems_green_contur_state2",
			small = "screens_game_totems_green_small_state2",
			big = "screens_game_totems_green_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_green_state02" ,"totem_green_left-eye"},
				-- после 2-го мача
				{"totem_green_state02" ,"totem_green_left-eye", "totem_green_right-eye"},
				-- после 3-го мача
				{"totem_green_state02" ,"totem_green_left-eye", "totem_green_right-eye", "totem_green_mouth"}
			}
		},
		-- 4-й уровень
		{
			contour = "screens_game_totems_green_contur_state2",
			small = "screens_game_totems_green_small_state2",
			big = "screens_game_totems_green_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_green_state03" ,"totem_green_left-eye"},
				-- после 2-го мача
				{"totem_green_state03" ,"totem_green_left-eye", "totem_green_right-eye"},
				-- после 3-го мача
				{"totem_green_state03" ,"totem_green_left-eye", "totem_green_right-eye", "totem_green_mouth"}
			}
		},
		-- позиция контура
		contour_pos = {180, 182},
		-- позиция маленького изобрадения
		small_pos = {180, 182},
		-- позиция, от которой начнет двигаться тотем при активировании
		activation_start_pos = {178, 180},
		-- набор клипов дополнитльной фичи (у зеленого нет такой фичи)
		feature_clips = {},
		-- задержка после срабатывания тотема перед деактивацией
		delay_before_deactivate = 1400
	},
	-- настройки синего тотема
	blue_totem = 
	{
		-- 1-й уровень
		{
			contour = "screens_game_totems_blue_contur_state1",
			small = "screens_game_totems_blue_small_state1",
			big = "screens_game_totems_blue_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_blue_left-eye"},
				-- после 2-го мача
				{"totem_blue_left-eye", "totem_blue_right-eye"},
				-- после 3-го мача
				{}
			}
		},
		-- 2-й уровень
		{
			contour = "screens_game_totems_blue_contur_state2",
			small = "screens_game_totems_blue_small_state2",
			big = "screens_game_totems_blue_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_blue_left-eye"},
				-- после 2-го мача
				{"totem_blue_left-eye", "totem_blue_right-eye"},
				-- после 3-го мача
				{},
			}
		},
		-- 3-й уровень
		{
			contour = "screens_game_totems_blue_contur_state3",
			small = "screens_game_totems_blue_small_state3",
			big = "screens_game_totems_blue_state3",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_blue_left-eye"},
				-- после 2-го мача
				{"totem_blue_left-eye", "totem_blue_right-eye"},
				-- после 3-го мача
				{"totem_blue_left-eye", "totem_blue_right-eye","totem_blue_mouth"},
			}
		},
		-- 4-й уровень
		{
			contour = "screens_game_totems_blue_contur_state3",
			small = "screens_game_totems_blue_small_state4",
			big = "screens_game_totems_blue_state4",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_blue_left-eye"},
				-- после 2-го мача
				{"totem_blue_left-eye", "totem_blue_right-eye"},
				-- после 3-го мача
				{"totem_blue_left-eye", "totem_blue_right-eye","totem_blue_mouth"},
			}
		},
		-- позиция контура
		contour_pos = {110, 7},
		-- позиция маленького изобрадения
		small_pos = {110, 7},
		-- позиция, от которой начнет двигаться тотем при активировании
		activation_start_pos = {90, 9},
		-- набор клипов дополнитльной фичи (у синего - это клип с изображением щита)
		feature_clips = {"totem_blue_glow"},
		-- звук на использование тотема
		sound = "totem_blue_use01"
	},
	-- настройки красного тотема
	red_totem = 
	{
		-- 1-й уровень
		{
			contour = "screens_game_totems_red_contur_state1",
			small = "screens_game_totems_red_small_state1",
			big = "screens_game_totems_red_state1",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_red_state01_left-eye", "totem_red_state02"},
				-- после 2-го мача
				{"totem_red_state01_left-eye", "totem_red_right_eye"},
				-- после 3-го мача
				{}
			}
		},
		-- 2-й уровень
		{
			contour = "screens_game_totems_red_contur_state2",
			small = "screens_game_totems_red_small_state2",
			big = "screens_game_totems_red_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_red_state01_left-eye","totem_red_state03_fireballs00"},
				-- после 2-го мача
				{"totem_red_state01_left-eye" ,"totem_red_state03_fireballs00", "totem_red_right_eye"},
				-- после 3-го мача
				{}
			}
		},
		-- 3-й уровень
		{
			contour = "screens_game_totems_red_contur_state2",
			small = "screens_game_totems_red_small_state2",
			big = "screens_game_totems_red_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_red_state01_left-eye","totem_red_state03_fireballs01"},
				-- после 2-го мача
				{"totem_red_state01_left-eye", "totem_red_state03_fireballs02", "totem_red_right_eye"},
				-- после 3-го мача
				{"totem_red_state01_left-eye", "totem_red_state03_fireballs02", "totem_red_right_eye", "totem_red_mouth"},
			}
		},
		-- 4-й уровень
		{
			contour = "screens_game_totems_red_contur_state2",
			small = "screens_game_totems_red_small_state2",
			big = "screens_game_totems_red_state2",
			-- клипы, которые рисуются поверх выдвинутого в центр изображения тотема
			clips = 
			{
				-- после 1-го мача
				{"totem_red_state01_left-eye","totem_red_state03_fireballs02"},
				-- после 2-го мача
				{"totem_red_state01_left-eye", "totem_red_state03_fireballs02", "totem_red_right_eye"},
				-- после 3-го мача
				{"totem_red_state01_left-eye", "totem_red_state03_fireballs02", "totem_red_right_eye", "totem_red_mouth"},
			}
		},
		-- позиция контура
		contour_pos = {5, 180},
		-- позиция маленького изобрадения
		small_pos = {5, 180},
		-- позиция, от которой начнет двигаться тотем при активировании
		activation_start_pos = {5, 180},
		-- набор клипов дополнитльной фичи (у красного нет такой фичи)
		feature_clips = {},
		-- звук на использование тотема
		sound = "totem_red_use01"
	}
}

-- эффект плавного увелечения/уменьшения тотема с изменением позиции.
-- _totem - тотем CTotem;
-- _pos1 - начальная позиция;
-- _pos2 - конечная позиция;
-- _scale1 - начальный масштаб;
-- _scale2 - конечный масштаб;
-- _time - продолжительность эффекта;
-- _delay - задержка перед началом эффекта;
-- _pre_func - функция, которая будет запущена перед началом эффекта;
-- _post_func - функция, которая будет запущена по завершению эффекта.
function totems.CFadeEffect(_totem, _pos1, _pos2, _scale1, _scale2, _time, _delay, _pre_func, _post_func)
	return
	{
		_totem = _totem,
		_pos1 = _pos1,
		_pos2 = _pos2,
		_scale1 = _scale1,
		_scale2 = _scale2,
		_time = _time,
		_delay = _delay,
		_pre_func = _pre_func,
		_post_func = _post_func,
		
		-- время создания эффекта
		_start_time = _totem._timer.Get().GetTime(),
		-- текущая позиция тотема
		_pos = {_pos1[1], _pos1[2]},
		-- текущий масштаб тотема
		_scale = {_scale1[1], _scale1[2]},
		-- признак того, что эффект отработал
		_is_dead = false,
		
		-- обновление позиции и масштаба
		Update = function(_self)
			local dt = _self._totem._timer.Get().GetTime() - _self._start_time - _self._delay
			-- пока время задержки не прошло, ничего не делаем
			if dt <= 0 then
				return false
			end
			-- запускаем _pre_func
			if _self._pre_func then
				_self._pre_func()
				_self._pre_func = nil
			end
			-- коэффициент
			local k = dt / _self._time
			if k > 1.0 then
				-- эффект отработал. помечаем его мертвым.
				_self._is_dead = true
				-- запускаем _post_func
				if _self._post_func then
					_self._post_func()
					_self._post_func = nil
				end
				return false
			end
			-- новая позиция
			_self._pos[1] = _self._pos1[1] + k * (_self._pos2[1] - _self._pos1[1])
			_self._pos[2] = _self._pos1[2] + k * (_self._pos2[2] - _self._pos1[2])
			-- новый масштаб
			_self._scale[1] = _self._scale1[1] + k * (_self._scale2[1] - _self._scale1[1])
			_self._scale[2] = _self._scale1[2] + k * (_self._scale2[2] - _self._scale1[2])
		end,
		
		-- отрисовка эффекта.
		-- перекрывает отрисовку самого тотема.
		-- сначала рисуется контур тотема.
		-- поверх рисуется изображения тотема в текущих позиции и масштабе.
		-- поверх изображения рисуются клипы допольнителоной фичи(щит синего тотема) в тех же позиции и масштабе, что и основное изображение.
		Draw = function(_self, _renderer)
			_renderer.PushState()
			_renderer.ApplyMatrix(sf.misc.MatrixTranslation(_self._totem._contour_pos[1], _self._totem._contour_pos[2]))
			_self._totem._contour.Draw(_renderer)
			_renderer.PopState()
			
			local m = sf.misc.MatrixScale(_self._scale[1], _self._scale[2])
			m = m * sf.misc.MatrixTranslation(_self._pos[1], _self._pos[2])
			_renderer.PushState()
			_renderer.ApplyMatrix(m)
			
			_self._totem._big.Draw(_renderer)
			
			if _self._totem._extra_feature then
				for _,c in ipairs(_self._totem._feature_clips) do
					c.Draw(_renderer)
				end
			end
			
			_renderer.PopState()
		end,
		
		IsDead = function(_self)
			return _self._is_dead
		end
	}
end

CWaterColorChanger = function(_totem)
	
	return
	{
		_totem = _totem,
		_water = _totem._clips[1][2],
		
		SetTargetColor = function(_self, _color, _change_time)
			_self._totem._bonus_color = _color
			_self._start_time = _self._totem._timer.Get().GetTime()
			_self._end_time = _self._totem._timer.Get().GetTime() + (_change_time or totems_widget._white_totem_options.paint_water_time)
			_self._start_color = sf.graphics.Color(_self._water.GetColor())
			_self._end_color = sf.graphics.Color(totems_widget._white_totem_options.colors_map[_color])
		end,
		
		Update = function(_self)
			if not _self._totem._bonus_color then
				return
			end			
			local t = _self._totem._timer.Get().GetTime()
			local k = 1
			if _self._end_time ~= _self._start_time then
				k = (t - _self._start_time) / (_self._end_time - _self._start_time)
			end
			if k > 1 then k = 1 end
			if k < 0 then k = 0 end
			local c = sf.graphics.Color()
			c.Alpha = _self._start_color.Alpha + (_self._end_color.Alpha - _self._start_color.Alpha) * k
			c.Red = _self._start_color.Red + (_self._end_color.Red - _self._start_color.Red) * k
			c.Green = _self._start_color.Green + (_self._end_color.Green - _self._start_color.Green) * k
			c.Blue = _self._start_color.Blue + (_self._end_color.Blue - _self._start_color.Blue) * k
			c.Clamp()
			_self._water.SetColor(c)
		end
	}
end

-- ТОТЕМ.
-- _color - цвет.
-- _id - строковый идентификатор тотема.
-- _level - уровень прокачки тотема. 0 - тотем не куплен. 1 - 1й уровень и т.д...
-- _timer - таймер - используется в эффекта активации/деактивации.
-- _extra_feature_functions - таблица функци {get, set} для получения и установки значения дополнительной фичи (для синего - признак наличия щита).
function totems.CTotem(_color, _id, _level, _timer, _extra_feature_functions)
	totem = 
	{
		_color = _color,
		_id = _id,
		_level = _level,
		-- состояние объекта. 0 - тотем не активен. 1 - тотем активизирован. 2 - тотем сработал один раз. 3 - тотем сработал два раза.
		_state = 0,
		_timer = _timer,
		
		_extra_feature = false,
		_extra_feature_functions = _extra_feature_functions,
		
		-- изображение контура
		_contour,
		-- изображение маленького тотема
		_small,
		-- изображение большого тотема
		_big,
		-- набор клипов, которые рисуются на активном тотеме. каждому состоянию (_state) соответсвует свой набор клипов
		_clips,
		-- набор отрисовываемых в данный момент клипов
		_active_clips = {},
		-- набор клипов допольнительной фичи
		_feature_clips = {},
		
		-- позиция контура
		_contour_pos = {0, 0},
		-- позиция маленького изобрадения
		_small_pos = {0, 0},
		-- -- позиция, от которой начнет двигаться тотем при активировании
		_activation_start_pos = {0,0},
		
		-- проверка на, происходит ли в данный момент активация/деактивация тотема
		IsFade = function(_self)
			return _self._fade_effect ~= nil
		end,
		
		-- установка состояния тотема.
		-- со сменой состояния меняется набор отображаемых на тотеме клипов.
		SetState = function(_self, _state)
			_self._state = _state
			_self:_UpdateClips()
			if _self._water_changer and (_state == 1 or (_state == 2 and _self._level > 2)) and not _self._bonus_color then
				_self._water_changer:SetTargetColor(game_window.game_field.GetRandomColor(), 0)
			end
		end,
		
		-- обновление эффекта активирования/деактивирования, если он в данный момент есть, и клипов
		Update = function(_self)
			if _self._fade_effect then
				_self._fade_effect:Update()
				if _self._fade_effect:IsDead() then
					_self._fade_effect = nil
				end
			end
			if _self._state > 0 then
				for _,c in ipairs(_self._active_clips) do
					c.Update()
				end
			end
			if _self._extra_feature then
				for _,c in ipairs(_self._feature_clips) do
					c.Update()
				end
			end
			if _self._water_changer then
				_self._water_changer:Update()
			end
			if _self._demonstrate_end_time then
				if _self._demonstrate_end_time <= _self._timer.Get().GetTime() then
					_self._demonstrate_end_time = nil
					if _self._active_totem then
						for _,t in pairs(totems_widget._totems) do
							t:OnMatch(_self._active_totem._color)
						end
					else
						_self:_Deactivate(0)
					end
				end
			end
		end,
		
		-- отрисовка тотема.
		-- если в данный момент работает эффект активировании/деактивирования, то отрисовкой изображений тотема управляет сам эффект.
		Draw = function(_self, _renderer)
			if _self._fade_effect then
				_self._fade_effect:Draw(_renderer)
			else
				-- рисуем контур, если тотем еще не куплен или же куплен и активизирован
				if _self._level == 0 or _self._state > 0 then
					_renderer.PushState()
					_renderer.ApplyMatrix(sf.misc.MatrixTranslation(_self._contour_pos[1], _self._contour_pos[2]))
					_self._contour.Draw(_renderer)
					_renderer.PopState()
				end

				-- рисуем малеьнкое изображние, если тотем куплен и неактивен.
				-- если имеется дополнительная фича, то рисуем её клипы поверх маленького изображения. клипы подгоняются под размер и позицию
				-- маленького изображения
				if _self._level > 0 and _self._state == 0 then
					_renderer.PushState()
					_renderer.ApplyMatrix(sf.misc.MatrixTranslation(_self._small_pos[1], _self._small_pos[2]))
					_self._small.Draw(_renderer)
					_renderer.PopState()
					
					if _self._extra_feature then
						local m = sf.misc.MatrixScale(totems.params.small_scale[1], totems.params.small_scale[2])
						m = m * sf.misc.MatrixTranslation(_self._activation_start_pos[1], _self._activation_start_pos[2])
						
						_renderer.PushState()
						_renderer.ApplyMatrix(m)
						
						for _,c in ipairs(_self._feature_clips) do
							c.Draw(_renderer)
						end
						
						_renderer.PopState()
					end
				end

				-- рисуем большое изображение, если тотем активен.
				-- если имеется дополнительная фича, то рисуем её клипы поверх большого изображения
				if _self._state > 0 then
					_self._big.Draw(_renderer)
					
					if _self._extra_feature then
						for _,c in ipairs(_self._feature_clips) do
							c.Draw(_renderer)
						end
					end
				end
			end
			
			-- если тотем активен, рисуем клипы, который сооттветствуют текущему состоянию тотема.
			if _self._state > 0 then
				for _,c in ipairs(_self._active_clips) do
					c.Draw(_renderer)
				end
			end
		end,
		
		-- обработка очредного мача
		OnMatch = function(_self, _color)
			-- если тотем не куплен, то делать ничего недо
			if _self._level == 0 then
				return
			end
			-- если цвет тотема совпадает с цветом мача, то...
			if _self._color == _color then
				-- если в данный момент тотм не активен, то активируем его
				if _self._state == 0 then
					_self:_Activate()
				-- если в данный момент тотем активен, то используем его по первой схеме
				elseif _self._state == 1 then
					_self:_Use1()
				-- если тотем уже раз использован, используем его по второй схеме
				elseif _self._state == 2 then
					_self:_Use2()
				end
			else
				-- если в данный момент тотем активен, деактивируем его
				if _self._state ~= 0 then
					_self:_Deactivate(0)
				end
			end
		end,
		
		-- демонстрация тотема
		Demonstrate = function(_self)
			if totems_widget.active_totem and totems_widget.active_totem == _self then
				return
			end
			for _,t in pairs(totems_widget._totems) do
				t._active_totem = nil
				t._demonstrate_end_time = nil
				t:OnMatch(_self._color)
			end
			_self._active_totem = totems_widget.active_totem
			_self._demonstrate_end_time = _self._timer.Get().GetTime() + totems.params.demonstrate_time
		end,
		
		-- активирование тотема
		_Activate = function(_self)
			-- активируем
			totems_widget.ActivateTotem(_self)
			-- создаем эффект плавного увелечения тотема с выездом на центр.
			-- по заверешению эффект перейти в состояние "активен"
			local post_func = function()
					_self:SetState(1)
					__sound("totem_activation")
				end
			_self._fade_effect = totems.CFadeEffect(
											_self, 
											totems.params[_self._id].activation_start_pos, {0,0},
											totems.params.small_scale, {1,1},
											totems.params.activate_time, 0,
											nil, post_func)
			if _self._water_changer then
				_self._water_changer:SetTargetColor(game_window.game_field.GetRandomColor(), 0)
			end
		end,
		
		-- исполльзование по первой схеме
		_Use1 = function(_self)
			-- используем
			avatar_widget.ChangeMood("totem_use_1")
			totems_widget.UseTotem(_self, 1)
			-- устанавливаем текущее состояние в "использован один раз"
			_self:SetState(2)
			__sound("totem_activation")
			-- проигрываем звук на использование, если он задан для тотема
			__sound(_self._sound)
			-- если уровень тотема еще не достиг 3, деактивируем его с задержкой
			if _self._level <= 2 then
				_self:_Deactivate(_self._delay_before_deactivate)
			else
				if _self._water_changer then
					_self._water_changer:SetTargetColor(game_window.game_field.GetRandomColor())
				end
			end
		end,
		
		-- использование по второй схеме
		_Use2 = function(_self)
			avatar_widget.ChangeMood("totem_use_2")
			-- используем
			totems_widget.UseTotem(_self, 2)
			-- устанавливаем текущее состояние в "использован два раза"
			_self:SetState(3)
			__sound("totem_activation")
			-- проигрываем звук на использование
			__sound(_self._sound)
			-- если тотем поддерживает допольнитльную фичу и она еще не активирована, то активируем её
			if not _self._extra_feature and #_self._feature_clips > 0 then
				_self._extra_feature = true
				
				-- запускаем фичеклипы 
				for _,c in ipairs(_self._feature_clips) do
					c.Stop()
					c.Play()
				end
				
				-- устанавливаем глобальное значение этой фичи в true
				if _self._extra_feature_functions then
					_self._extra_feature_functions.set(true)
				end
			end
			-- деактивируем тотем с задержкой
			_self:_Deactivate(_self._delay_before_deactivate)
		end,
		
		-- деактивирование тотема
		_Deactivate = function(_self, _delay)
			-- деактивируем
			totems_widget.DeactivateTotem(_self)
			-- запускаем эффект плавного уменшения тотема с перемещением в позицию маленького изображения.
			-- по завершению эффект установить состояние тотема в "не активен"
			local pre_func = function()
					_self:SetState(0)
				end
			_self._fade_effect = totems.CFadeEffect(
										_self, 
										{0,0}, totems.params[_self._id].activation_start_pos,
										{1,1}, totems.params.small_scale,
										totems.params.deactivate_time, _delay,
										pre_func)
		end,
		
		-- обновление списка отображаемых в данный момент клипов в соответствии с состоянием тотема
		_UpdateClips = function(_self)
			-- изначального список клипов пустой.
			-- если тотем не активен, то он пустым и останется.
			local active_clips = {}
			-- если тотем активен, то...
			if _self._state > 0 then
				-- получаем набор клипов для текущего состояния тотема
				for _,c in ipairs(_self._clips[_self._state]) do
					-- если клип еще не отображается на тотеме, то создаем его, устанавливаем время в 0 и запускаем.
					-- созданный клип добавляем в список активных клипов.
					-- если же клип уже отображается, то просто добавляем его в список активных клипов, не перезапуская.
					local new_clip = true
					for _,ac in ipairs(_self._active_clips) do
						if ac == c then
							table.insert(active_clips, c)
							new_clip = false
							break
						end
					end
					if new_clip then
						c.Stop()
						c.Play()
						table.insert(active_clips, c)
					end
				end
			end
			_self._active_clips = active_clips
		end
	}
	
	-- начальная настройка тотема.
	
	-- менеджер ресурсов
	local rm = g_App.GetResourceManager()
		
	-- если тотем еще не куплен, то достаточно создать только изображеие контура.
	if _level == 0 then
		totem._contour =  sf.graphics.CImage(totems.params[_id][1].contour)
		totem._contour_pos = totems.params[_id].contour_pos
	else
		-- настройки тотема
		local params = totems.params[_id][_level]
		
		-- создаем изображения
		-- контур
		totem._contour = sf.graphics.CImage(params.contour)
		-- маленький тотем
		totem._small = sf.graphics.CImage(params.small)
		-- большой тотем
		totem._big = sf.graphics.CImage(params.big)
		
		-- создаем клипы
		totem._clips = {}
		
		local clips = {}
		
		-- у тотема 2 состояния, в которых могут отображаться клипы (активен, после первого использования, после второго использования).
		-- создаем набор клипов для каждого из состояний.
		for i=1,3 do
			totem._clips[i] = {}
			if params.clips and params.clips[i] then
				for _,clip_id in ipairs(params.clips[i]) do
					local clip = clips[clip_id]
					-- если клип с таким идентификатором еще не создан, то создаем его, загружаем и добавляем в множесто клипов этого тотема.
					-- если клип  таким идентификатором уже создан, то просто достаем его из множества клипов тотема, и помещаем в список, 
					-- соответствующий обрабатываемому состоянию
					if not clip then
						clip = sf.misc.anim.CClip()
						clip.Load(clip_id, true)
						clip.SetPos(sf.misc.FloatVector(totems.params.center[1], totems.params.center[2]))
						clips[clip_id] = clip
					end
					table.insert(totem._clips[i], clip)
				end
			end
		end
		
		-- загружаем клипы дополнительной фичи
		totem._feature_clips = {}
		if totems.params[_id].feature_clips then
			for _,clip_id in ipairs(totems.params[_id].feature_clips) do
				local clip = sf.misc.anim.CClip()
				clip.Load(clip_id, true)
				clip.SetPos(sf.misc.FloatVector(totems.params.center[1], totems.params.center[2]))
				table.insert(totem._feature_clips, clip)
			end
		end
		
		totem._contour_pos = totems.params[_id].contour_pos
		totem._small_pos = totems.params[_id].small_pos
		totem._activation_start_pos = totems.params[_id].activation_start_pos
		
		-- пробуем получит признак включения дополнительной фичи
		if totem._extra_feature_functions then
			totem._extra_feature = totem._extra_feature_functions.get()
		end
		
		totem._sound = totems.params[_id].sound
		totem._delay_before_deactivate = totems.params[_id].delay_before_deactivate or totems.params.delay_before_deactivate
		
		if _id == "white_totem" then
			totem._water_changer = CWaterColorChanger(totem)
		end
	end
	
	return totem
end
