
--local metod = 4

-------
-- вывод отладочной информации
-------
function printf(fmt, ...)
	local msg = string.format(fmt, ...)
	local msg_no_ws = string.gsub(msg, "%s", "_")
	get_console():execute("dbg:" .. msg_no_ws)
end

-------
-- задание вектора
-------
function v3f(x,y,z)
	return vector():set(x,y,z)
end


-------
-- сделать на арене новое освещение
-------
--function lights_on()
	--if metod == 1 then
		--lights_on1()
	--elseif metod == 2 then
		--lights_on2()
	--elseif metod == 3 then
		--lights_on3()
	--elseif metod == 4 then
		--lights_on4()
	--end
--end

-------
-- вернуть прежнее освещение
-------
function lights_off()
	if metod == 1 then
		lights_off1()
	elseif metod == 2 then
		lights_off2()
	elseif metod == 3 then
		lights_off3()
	elseif metod == 4 then
		lights_off4()
	end
end


---------------------------------------------------------------------------------------------------
-- первый метод
-- делает посветлее в центре, но по бокам остаётся темно
---------------------------------------------------------------------------------------------------

-------
-- три лампы вдоль центра арены, лампы крепятся к крану - это не очень 'красиво'
-------
function lights_on1()
	create_lamp(v3f(151.78, -13.28,  89.7), nil, "physics\\light\\lampa01_v", 0.4, true)
	create_lamp(v3f(151.78, -13.28, 104.0), nil, "physics\\light\\lampa01_v", 0.4, true)
	create_lamp(v3f(151.78, -13.28, 119.1), nil, "physics\\light\\lampa01_v", 0.4, true)
end

-------
-- удаляет все онлайновые лампы мода ("aem_lamp")
-------
function lights_off1()
	remove_all_aem_lamps()
end


---------------------------------------------------------------------------------------------------
-- второй метод, подмена ламп
---------------------------------------------------------------------------------------------------

-------
-- отключаем все аренные лампы и на их месте создаём новые
-------
function lights_on2()
	create_lamp(v3f(156.786255,-12.37,80.203362), nil, "physics\\light\\lamp_mike_2_glass", 0.3, false)
	create_lamp(v3f(146.552338,-12.37,80.203362), nil, "physics\\light\\lamp_mike_2_glass", 0.3, false)
	create_lamp(v3f(156.786255,-12.37,95.740120), nil, "physics\\light\\lamp_mike_2_glass", 0.3, false)
	create_lamp(v3f(146.552338,-12.37,95.740120), nil, "physics\\light\\lamp_mike_2_glass", 0.3, false)
	create_lamp(v3f(156.786255,-12.37,111.093575), nil, "physics\\light\\lamp_mike_2_glass", 0.3, false)
	create_lamp(v3f(146.552338,-12.37,111.093575), nil, "physics\\light\\lamp_mike_2_glass", 0.3, false)
	create_lamp(v3f(156.786255,-12.37,125.917412), nil, "physics\\light\\lamp_mike_2_glass", 0.3, false)
	create_lamp(v3f(146.552338,-12.37,125.917412), nil, "physics\\light\\lamp_mike_2_glass", 0.3, false)
	turn_arena_lamps_off()
end

-------
--
-------
function lights_off2()
	turn_arena_lamps_on()
	remove_all_aem_lamps()
end

---------------------------------------------------------------------------------------------------
-- третий метод
---------------------------------------------------------------------------------------------------

-------
-- 
-------
function lights_on3()
	create_lamp(v3f(151.78, -13.28,  89.7), nil, "physics\\light\\lampa01_v", 0.4, true)
	create_lamp(v3f(151.78, -13.28, 104.0), nil, "physics\\light\\lampa01_v", 0.4, true)
	create_lamp(v3f(151.78, -13.28, 119.1), nil, "physics\\light\\lampa01_v", 0.4, true)
	create_lamp(v3f(156.786255,-10.79,80.203362), v3f(0,0,3.14), "physics\\light\\new_light\\light_big_1_glass", 0.3, true)
	create_lamp(v3f(146.552338,-10.79,80.203362), v3f(0,0,3.14), "physics\\light\\new_light\\light_big_1_glass", 0.3, true)
	create_lamp(v3f(156.786255,-10.79,95.740120), v3f(0,0,3.14), "physics\\light\\new_light\\light_big_1_glass", 0.3, false)
	create_lamp(v3f(146.552338,-10.79,95.740120), v3f(0,0,3.14), "physics\\light\\new_light\\light_big_1_glass", 0.3, false)
	create_lamp(v3f(156.786255,-10.79,111.093575), v3f(0,0,3.14), "physics\\light\\new_light\\light_big_1_glass", 0.3, false)
	create_lamp(v3f(146.552338,-10.79,111.093575), v3f(0,0,3.14), "physics\\light\\new_light\\light_big_1_glass", 0.3, false)
	create_lamp(v3f(156.786255,-10.79,125.917412), v3f(0,0,3.14), "physics\\light\\new_light\\light_big_1_glass", 0.3, false)
	create_lamp(v3f(146.552338,-10.79,125.917412), v3f(0,0,3.14), "physics\\light\\new_light\\light_big_1_glass", 0.3, false)
	turn_arena_lamps_off()
	--create_lamp(v3f(160.30,7.04,74.19), nil, "physics\\light\\lampa_walls_01", 0.3, true, -128)
	--create_lamp(v3f(162.95,7.04,74.19), nil, "physics\\light\\lampa_walls_01", 0.1, true, -128)
end

-------
--
-------
function lights_off3()
	turn_arena_lamps_on()
	remove_all_aem_lamps()
end

---------------------------------------------------------------------------------------------------
-- четвёртый метод - аварийное освещение
---------------------------------------------------------------------------------------------------

-------
-- 
-------
function lights_on4()
	turn_arena_lamps_off()
	create_lamp(v3f(151.78, -13.28,  87.3), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -96238)
	create_lamp(v3f(151.78, -13.28, 104.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -96238)
	create_lamp(v3f(151.78, -13.28, 126.7), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -96238)
end

-------
--
-------
function lights_off4()
	turn_arena_lamps_on()
	remove_all_aem_lamps()
end

---------------------------------------------------------------------------------------------------
-- освещение щита "Арена"
---------------------------------------------------------------------------------------------------

-------
-- включение ламп
-------
function shield_on()
	turn_arena_lamps_on()
	create_lamp(v3f(160.30,7.04,74.19), nil, "physics\\light\\lampa_walls_01", 1.0, true, -8878179)
	create_lamp(v3f(162.95,7.04,74.19), nil, "physics\\light\\lampa_walls_01", 1.0, true, -8878179)
end

-------
-- отключение ламп
-------
function shield_off()
	remove_all_aem_lamps()
	turn_arena_lamps_off()
end

---------------------------------------------------------------------------------------------------
-- восстановление освещения после боя
---------------------------------------------------------------------------------------------------
function lights_reset()
	remove_all_aem_lamps()
	if db.actor:has_info("aem_megafone") then
		create_lamp(v3f(160.30,7.04,74.19), nil, "physics\\light\\lampa_walls_01", 1.0, true, -8878179)
		create_lamp(v3f(162.95,7.04,74.19), nil, "physics\\light\\lampa_walls_01", 1.0, true, -8878179)
		lights_on()
	end
end

---------------------------------------------------------------------------------------------------
-- освещение в боях на время
---------------------------------------------------------------------------------------------------
	
-------
-- освещение при фоле
-------
function foul()
	remove_all_aem_lamps()
	create_lamp(v3f(151.78, -13.28,  93.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -8454144)
	create_lamp(v3f(151.78, -13.28, 104.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -8454144)
	create_lamp(v3f(151.78, -13.28, 120.5), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -8454144)
end

-------
-- освещение при ничьей
-------
function draw()
	remove_all_aem_lamps()
	create_lamp(v3f(151.78, -13.28,  93.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -96238)
	create_lamp(v3f(151.78, -13.28, 104.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -96238)
	create_lamp(v3f(151.78, -13.28, 120.5), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -96238)
end

-------
-- освещение при победе
-------
function win()
	remove_all_aem_lamps()
	create_lamp(v3f(151.78, -13.28,  93.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -15435776)
	create_lamp(v3f(151.78, -13.28, 104.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -15435776)
	create_lamp(v3f(151.78, -13.28, 120.5), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 1.0, true, -15435776)
end

---------------------------------------------------------------------------------------------------
-- освещение в тотализаторе
---------------------------------------------------------------------------------------------------

-------
-- победа  team1
-------
function win_team1()
	create_lamp(v3f(151.78, -13.28,  93.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 0.8, true, -8454144)
	create_lamp(v3f(151.78, -13.28, 120.5), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 0.8, true, -15435776)
end

-------
-- победа  team2
-------
function win_team2()
	create_lamp(v3f(151.78, -13.28,  93.0), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 0.8, true, -15435776)
	create_lamp(v3f(151.78, -13.28, 120.5), v3f(0,0,3.14), "physics\\light\\new_light\\light_alarm_1", 0.8, true, -8454144)
end

---------------------------------------------------------------------------------------------------
-- вспомогательные функции
---------------------------------------------------------------------------------------------------

-------
-- возвращает айдишники аренных ламп
-- проблема в том, что имена этих ламп в all.spawn не уникальны,
-- лампы с подобными именами есть и на других локациях
-------
function enum_arena_lamps()
	local id, obj
	local ids = {}
	for id=0, 65535 do
		obj = level.object_by_id(id)
		if obj ~= nil and
		   obj:section() == "lights_hanging_lamp" and
		   string.find(obj:name(), "light_big_glass_000")
		then
			table.insert(ids, obj:id())
		end
	end
	return ids
end

-------
-- возвращает айдишник лампы в коморке зрителя
-------
function get_stake_room_lamp()
	local id, obj
	for id=0, 65535 do
		obj = level.object_by_id(id)
		if obj ~= nil and
		   obj:section() == "lights_hanging_lamp" and
		   obj:name() == "light_alarm_glass_0017"
		then
			return id
		end
	end
	return -1
end

-------
-- включить лампу (свет), используется "C++ class hanging_lamp : CGameObject"
-------
function turn_lamp_on(id)
	local obj = level.object_by_id(id)
	if obj ~= nil then
		local hl = obj:get_hanging_lamp()
		if hl ~= nil then
			hl:turn_on()
		end
	end
end

-------
-- выключить лампу (свет), используется "C++ class hanging_lamp : CGameObject"
-------
function turn_lamp_off(id)
	local obj = level.object_by_id(id)
	if obj ~= nil then
		local hl = obj:get_hanging_lamp()
		if hl ~= nil then
			hl:turn_off()
		end
	end
end

-------
-- включить все аренные лампы
-------
function turn_arena_lamps_on()
	local id, obj
	for id=0, 65535 do
		obj = level.object_by_id(id)
		if obj ~= nil and
		   obj:section() == "lights_hanging_lamp" and
		   string.find(obj:name(), "light_big_glass_000")
		then
			local hl = obj:get_hanging_lamp()
			if hl ~= nil then
				hl:turn_on()
			end
		end
	end
end

-------
-- выключить все аренные лампы
-------
function turn_arena_lamps_off()
	local id, obj, name, hl
	for id=0, 65535 do
		obj = level.object_by_id(id)
		if obj ~= nil and
		   obj:section() == "lights_hanging_lamp" and
		   string.find(obj:name(), "light_big_glass_000")
		then
			local hl = obj:get_hanging_lamp()
			if hl ~= nil then
				hl:turn_off()
			end
		end
	end
end

-------
-- удаляет все онлайновые лампы мода ("aem_lamp")
-------
function remove_all_aem_lamps()
	local id, obj
	for id=0, 65535 do
		obj = level.object_by_id(id)
		if obj ~= nil and obj:section() == "aem_lamp" then
			alife():release(alife():object(id), true)
		end
	end
end

-------
-- создание лампы
-------
function create_lamp(pos, dir, visual, brightness, shadow, color)
	local lvid = 76465
	local gvid = 1168
	local light_flags = 56				-- 0x38==56, 0x1c==28
	if shadow then light_flags = light_flags + 2 end

	local packet = net_packet()
	packet:w_u16(gvid)
	packet:w_float(0.0)
	packet:w_s32(1)
	packet:w_s32(lvid)
	packet:w_s32(-70)				-- 0xffffffba
	packet:w_stringZ("")
	packet:w_s32(-1)
	packet:w_s32(-1)
	packet:w_stringZ(visual)
	packet:w_u8(0)
	packet:w_stringZ("$editor")
	packet:w_u8(0)
	packet:w_u16(-1)
	if color ~= nil then
		packet:w_s32(color)
		packet:w_float(brightness)
		packet:w_stringZ("")
	else
		packet:w_s32(-1)
		packet:w_float(brightness)
		packet:w_stringZ("light\\light_omni_white_idle")
	end
	packet:w_float(14.0)
	packet:w_u16(light_flags)
	packet:w_stringZ("$editor")
	packet:w_stringZ("link")
	packet:w_float(100.0)
	packet:w_float(0.1)
	packet:w_float(4.0)
	packet:w_float(0.3)
	packet:w_stringZ("")
	packet:w_stringZ("")
	packet:w_stringZ("bone_lamp")
	packet:w_float(1.0)			-- сделаем луч пошире, чем у стандартных
	packet:w_stringZ("")
	packet:w_float(0.7)
	packet:w_stringZ("bone_omni")

	local se_obj = alife():create("aem_lamp", pos, lvid, gvid)
	se_obj:STATE_Read(packet, packet:w_tell())

	if dir ~= nil then
		se_obj.direction = vector():set(dir)
	end
end


-------
--
-------
function print_lamp(se_obj)
	local packet = net_packet()
	cse_alife_object_hanging_lamp.STATE_Write(se_obj, packet)

	local game_vertex_id	= packet:r_u16()
	local distance		= packet:r_float()
	local direct_control	= packet:r_s32()
	local level_vertex_id	= packet:r_s32()
	local object_flags	= packet:r_s32()
	local custom_data	= packet:r_stringZ()
	local story_id		= packet:r_s32()
	local spawn_story_id	= packet:r_s32()
	local visual_name	= packet:r_stringZ()
	local visual_flags	= packet:r_u8()
	local skeleton_name	= packet:r_stringZ()
	local skeleton_flags	= packet:r_u8()
	local source_id		= packet:r_u16()
	local main_color	= packet:r_s32()
	local main_brightness	= packet:r_float()
	local main_color_animator = packet:r_stringZ()
	local main_range	= packet:r_float()
	local light_flags	= packet:r_u16()
	local lamp_editor	= packet:r_stringZ()
	local lamp_fixed_bones	= packet:r_stringZ()
	local health		= packet:r_float()
	local main_virtual_size	= packet:r_float()
	local ambient_radius	= packet:r_float()
	local ambient_power	= packet:r_float()
	local ambient_texture	= packet:r_stringZ()
	local main_texture	= packet:r_stringZ()
	local main_bone		= packet:r_stringZ()
	local main_cone_angle	= packet:r_float()
	local glow_texture	= packet:r_stringZ()
	local glow_radius	= packet:r_float()
	local ambient_bone	= packet:r_stringZ()

	printf("hanging_lamp('%s')", se_obj:name())
	printf(" cse_alife_object")
	printf("  gvid=%d", game_vertex_id)
	printf("  dist=%f", distance)
	printf("  ctrl=%d", direct_control)
	printf("  lvid=%d", level_vertex_id)
	printf("  flags=%x", object_flags)
	printf("  custom=%s", custom_data)
	printf("  sid=%d", story_id)
	printf("  ssid=%d", spawn_story_id)
	printf(" cse_visual")
	printf("  visual_name=%s", visual_name)
	printf("  visual_flags=%x", visual_flags)
	printf(" cse_ph_skeleton")
	printf("  skeleton_name=%s", skeleton_name)
	printf("  skeleton_flags=%x", skeleton_flags)
	printf("  source_id=%x", source_id)
	printf(" cse_alife_object_hanging_lamp")
	printf("  main_color=%x", main_color)
	printf("  main_brightness=%f", main_brightness)
	printf("  main_color_animator=%s", main_color_animator)
	printf("  main_range=%f", main_range)
	printf("  light_flags=%x", light_flags)
	printf("  lamp_editor=%s", lamp_editor)
	printf("  lamp_fixed_bones=%s", lamp_fixed_bones)
	printf("  health=%f", health)
	printf("  main_virtual_size=%f", main_virtual_size)
	printf("  ambient_radius=%f", ambient_radius)
	printf("  ambient_power=%f", ambient_power)
	printf("  ambient_texture=%s", ambient_texture)
	printf("  main_texture=%s", main_texture)
	printf("  main_bone=%s", main_bone)
	printf("  main_cone_angle=%f", main_cone_angle)
	printf("  glow_texture=%s", glow_texture)
	printf("  glow_radius=%f", glow_radius)
	printf("  ambient_bone=%s", ambient_bone)
end


---------------------------------------------------------------------------------------------------
-- серверный класс лампы
---------------------------------------------------------------------------------------------------

class "se_lamp" (cse_alife_object_hanging_lamp)
function se_lamp:__init(section) super(section)
	--printf("se_lamp:__init")
end

-- для задания нужного направления достаточно перепаковать один первый вызов
--
function se_lamp:STATE_Write(packet)
	if self.direction ~= nil then
		repack_abstract(packet, self.direction)
		self.direction = nil
	end
	cse_alife_object_hanging_lamp.STATE_Write(self, packet)
end

-- переупаковка cse_abstract
--
function repack_abstract(packet, dir)
	--printf("repack_abstract(dir=%f,%f,%f)", dir.x, dir.y, dir.z)
	local r_tell = packet:r_tell()

	--printf("tell=%d,%d", packet:w_tell(), packet:r_tell())
	--printf("unpack se_abstract:")

	packet:r_seek(0)
	local dummy16		= packet:r_u16()
	local section_name	= packet:r_stringZ()
	local name		= packet:r_stringZ()
	local s_gameid		= packet:r_u8()
	local s_rp		= packet:r_u8()
	local position		= packet:r_vec3()
	local direction		= packet:r_vec3()
	local respawn_time	= packet:r_u16()
	local unknown_id	= packet:r_u16()
	local parent_id		= packet:r_u16()
	local phantom_id	= packet:r_u16()
	local s_flags		= packet:r_u16()
	local version		= packet:r_u16()
	local script_version	= packet:r_u16()
	local unused_pad	= packet:r_u16()
	local unused_ext	= {}			-- ещё одна непонятность
	if unused_pad > 0 then				-- возможно, что иногда это не верно
		local num
		for num=1, unused_pad do
			unused_ext[num] = packet:r_u8()
		end
	end
	local spawn_id		= packet:r_u16()
	local extended_size	= packet:r_u16()

	--printf("tell=%d,%d", packet:w_tell(), packet:r_tell())
	--printf("pack se_abstract:")

	direction = dir

	packet:w_begin(dummy16)
	packet:w_stringZ(section_name)
	packet:w_stringZ(name)
	packet:w_u8(s_gameid)
	packet:w_u8(s_rp)
	packet:w_vec3(position)
	packet:w_vec3(direction)
	packet:w_u16(respawn_time)
	packet:w_u16(unknown_id)
	packet:w_u16(parent_id)
	packet:w_u16(phantom_id)
	packet:w_u16(s_flags)
	packet:w_u16(version)
	packet:w_u16(script_version)
	packet:w_u16(unused_pad)
	if unused_pad > 0 then
		local num
		for num=1, unused_pad do
			 packet:w_u8(unused_ext[num])
		end
	end
	packet:w_u16(spawn_id)
	packet:w_u16(extended_size)

	--printf("tell=%d,%d", packet:w_tell(), packet:r_tell())
	packet:r_seek(r_tell)
	--printf("tell=%d,%d", packet:w_tell(), packet:r_tell())
end


---------------------------------------------------------------------------------------------------
-- результаты функции print_lamp
---------------------------------------------------------------------------------------------------
-- hanging_lamp('light_big_glass_0005')		одна из ламп на арене
--  cse_alife_object
--   gvid=1168
--   dist=0.000000
--   ctrl=1
--   lvid=76465
--   flags=ffffffba
--   custom=[collide]__ignore_static__
--   sid=-1
--   ssid=-1
--  cse_visual
--   visual_name=physics\light\new_light\light_big_1_glass
--   visual_flags=0
--  cse_ph_skeleton
--   skeleton_name=$editor
--   skeleton_flags=0
--   source_id=ffff
--  cse_alife_object_hanging_lamp
--   main_color=ffffffff
--   main_brightness=1.500000
--   main_color_animator=light\light_omni_white_idle
--   main_range=11.000000
--   light_flags=3a
--   cse_alife_object_hanging_lamp__unk1_sz=$editor
--   lamp_fixed_bones=link
--   health=100.000000
--   main_virtual_size=0.100000
--   ambient_radius=4.000000
--   ambient_power=0.300000
--   ambient_texture=
--   main_texture=
--   main_bone=bone_lamp
--   main_cone_angle=1.308997
--   glow_texture=
--   glow_radius=0.700000
--   ambient_bone=bone_omni
---------------------------------------------------------------------------------------------------
-- hanging_lamp('aem_lights27428')		сразу после создания объекта (свет без источника, направлен вперёд, т.е. вдоль оси x)
--  cse_alife_object
--   gvid=1180
--   dist=0.000000
--   ctrl=1
--   lvid=40037
--   flags=ffffffba
--   custom=
--   sid=-1
--   ssid=-1
--  cse_visual
--   visual_name=
--   visual_flags=0
--  cse_ph_skeleton
--   skeleton_name=$editor
--   skeleton_flags=0
--   source_id=ffff
--  cse_alife_object_hanging_lamp
--   main_color=ffffffff
--   main_brightness=1.000000
--   main_color_animator=
--   main_range=10.000000
--   light_flags=1c
--   cse_alife_object_hanging_lamp__unk1_sz=$editor
--   lamp_fixed_bones=
--   health=100.000000
--   main_virtual_size=0.100000
--   ambient_radius=10.000000
--   ambient_power=0.100000
--   ambient_texture=
--   main_texture=
--   main_bone=
--   main_cone_angle=2.094395
--   glow_texture=
--   glow_radius=0.700000
--   ambient_bone=
---------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------
-- аренные лампы
---------------------------------------------------------------------------------------------------
-- name='light_big_glass_0007'_pos=156.786255,-10.788004,80.203362
-- name='light_big_glass_0000'_pos=146.552338,-10.788004,80.203362
-- name='light_big_glass_0001'_pos=156.786255,-10.788004,95.740120
-- name='light_big_glass_0002'_pos=146.552338,-10.788004,95.740120
-- name='light_big_glass_0003'_pos=156.786255,-10.788004,111.093575
-- name='light_big_glass_0004'_pos=146.552338,-10.788004,111.093575
-- name='light_big_glass_0005'_pos=156.786255,-10.788004,125.917412
-- name='light_big_glass_0006'_pos=146.552338,-10.788004,125.917412

---------------------------------------------------------------------------------------------------
-- имеющиеся в игре лампы (visual)
---------------------------------------------------------------------------------------------------
-- physics\light\
-- lamp_mike_2_glass		- голая лампочка, направлена вниз
-- lampa01_alarm		- красная крутящаяся в вертикальной плоскости лампа
-- lampa01_ugl			- минипрожектор, направлен под углом 45 вперёд-вверх
-- lampa01_ugl_2		- аналогично
-- lampa01_ugl_3		- аналогично
-- lampa01_v			- лампочка, с железной ногой, направлена вниз
-- lampa_01_on			- настольная лампа
-- lampa_abajur_01		- лампа на цепочке с металическим 'обожуром', светит вниз
-- lampa_abajur_02		- аналогично
-- lampa_abajur_03		- аналогично
-- lampa_galogen_1_ph		- ...
-- lampa_galogen_4		- ...
-- lampa_provod_01		- лампочка на цепочке, светит вниз
-- lampa_provod_02		- аналогично
-- lampa_walls_01		- лампочка с Г-образным креплением к стене, светит вниз
-- light_koster			- свет без объекта, в верх
-- light_torch			- фонарик
-- projector_01_nolight		- ...
-- rail_svetofor_blue		- светофор
-- rope_projector_01		- прожектор
-- physics\light\new_light\
-- light_alarm_1		- крутящаяся в горизонтальной плоскости лампа
-- light_alarm_glass		- лампа, светит в верх
-- light_alarm_white_glass	- аналогично
-- light_big_1_glass		- аналогично
-- light_big_2_glass		- аналогично
-- light_controll_monolith_glass - что-то большое, светит в верх
-- light_galogen_1_glass	- лампа дневного освещения
-- light_galogen_rtut_1_glass	- тоже самое, только голубенькое
-- light_osoznanie_glass	- опять что-то большое, светит в верх
-- light_sharnir_1		- лампочка с Г-образным креплением к полу, светит в сторону
-- light_uglovaya_1_glass	- лампочка с каким-то уголком светит в сторону и в верх
-- light_white_glass		- лампочка светит в сторону и в верх
-- light_wire_1_glass		- лампочка светит в верх
---------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------
-- main_color_animator - всякие мигания, лежат в файле "lanims.xr"
---------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------
-- выдержки для ламп из acdc_21aug от bardak-а
---------------------------------------------------------------------------------------------------
--package cse_alife_object_hanging_lamp;
--use strict;
--use constant flPhysic		=> 0x0001;
--use constant flCastShadow	=> 0x0002;
--use constant flR1		=> 0x0004;
--use constant flR2		=> 0x0008;
--use constant flTypeSpot	=> 0x0010;
--use constant flPointAmbient	=> 0x0020;
--use constant properties_info => (
--	{ name => 'main_color',		type => 'h32',	default => 0x00ffffff },# 0x134
--	{ name => 'main_brightness',	type => 'f32',	default => 0.0 },	# 0x140
--	{ name => 'main_color_animator',type => 'sz',	default => '' },	# 0x144
--	{ name => 'main_range',		type => 'f32',	default => 0.0 },	# 0x14c
--	{ name => 'light_flags',	type => 'h16',	default => 0 },		# 0x138
--	{ name => 'cse_alife_object_hanging_lamp__unk1_sz',	type => 'sz',	default => '$editor' },	# 0xe0
--	{ name => 'lamp_fixed_bones',	type => 'sz',	default => '' },	# 0x15c
--	{ name => 'health',		type => 'f32',	default => 1.0 },	# 0x178
--	{ name => 'main_virtual_size',	type => 'f32',	default => 0.0 },	# 0x150
--	{ name => 'ambient_radius',	type => 'f32',	default => 0.0 },	# 0x164
--	{ name => 'ambient_power',	type => 'f32',	default => 0.0 },	# 0x168
--	{ name => 'ambient_texture',	type => 'sz',	default => '' },	# 0x16c
--	{ name => 'main_texture',	type => 'sz',	default => '' },	# 0x148
--	{ name => 'main_bone',		type => 'sz',	default => '' },	# 0x158
--	{ name => 'main_cone_angle',	type => 'f32',	default => 0.0 },	# 0x160
--	{ name => 'glow_texture',	type => 'sz',	default => '' },	# 0x170
--	{ name => 'glow_radius',	type => 'f32',	default => 0.0 },	# 0x174
--	{ name => 'ambient_bone',	type => 'sz',	default => '' },	# 0x154
--);
--sub state_read {
--	cse_alife_dynamic_object_visual::state_read(@_);
--	cse_ph_skeleton::state_read(@_);
--	$_[1]->unpack_properties($_[0], properties_info);
--}
--
--package cse_alife_dynamic_object_visual;
--use strict;
--sub state_read {
--	cse_alife_object::state_read(@_);
--	cse_visual::state_read(@_);
--}
--
--package cse_alife_object;
--use strict;
--use constant flUseSwitches		=> 0x00000001;
--use constant flSwitchOnline		=> 0x00000002;
--use constant flSwitchOffline		=> 0x00000004;
--use constant flInteractive		=> 0x00000008; 
--use constant flVisibleForAI		=> 0x00000010;
--use constant flUsefulForAI		=> 0x00000020;
--use constant flOfflineNoMove		=> 0x00000040;
--use constant flUsedAI_Locations	=> 0x00000080;
--use constant flUseGroupBehaviour	=> 0x00000100;
--use constant flCanSave		=> 0x00000200;
--use constant flVisibleForMap		=> 0x00000400;
--use constant flUseSmartTerrains	=> 0x00000800;
--use constant flCheckForSeparator	=> 0x00001000;
--use constant flCorpseRemoval		=> 0x00002000;
--use constant properties_info => (
--	{ name => 'game_vertex_id',	type => 'u16',	default => 0xffff },	# 0xa4
--	{ name => 'distance',		type => 'f32',	default => 0.0 },	# 0xa8
--	{ name => 'direct_control',	type => 'u32',	default => 1 },		# 0xad
--	{ name => 'level_vertex_id',	type => 'u32',	default => 0xffffffff },# 0xb0
--	{ name => 'object_flags',	type => 'h32',	default => 0 },		# 0xb4
--	{ name => 'custom_data',	type => 'sz',	default => '' },	# 0x7c
--	{ name => 'story_id',		type => 's32',	default => -1 },	# 0xb8
--	{ name => 'spawn_story_id',	type => 's32',	default => -1 },	# 0xbc
--);
--
--package cse_visual;
--use strict;
--use constant flObstacle	=> 0x01;
--use constant properties_info => (
--	{ name => 'visual_name',	type => 'sz',	default => '' },	# 0x04
--	{ name => 'visual_flags',	type => 'h8',	default => 0 },		# 0x0c
--);
--
--package cse_ph_skeleton;
--use strict;
--use constant properties_info => (
--	{ name => 'skeleton_name',	type => 'sz',	default => '$editor' },	# smthg|0x08
--	{ name => 'skeleton_flags',	type => 'u8',	default => 0 },		# 0x08
--	{ name => 'source_id',		type => 'h16',	default => 0xffff },	# 0x48
--);
---------------------------------------------------------------------------------------------------


---------------------------------------------------------------------------------------------------
-- заметки
---------------------------------------------------------------------------------------------------
-- * задавать параметры при помощи STATE_Read можно только для
--   вновь созданной лампы, любые попытки изменить данные после
--   эффекта не дают. Поэтому пока можно лишь удалять прежнюю и
--   создавать новую
-- * созданные лампы можно разбивать, где-то наверное есть флаги,
--   при установки которых можно их сделать не разрушаемыми
-- * при помещении источника света в лампы арены появились ужасные
--   тени от решётки, слишком толстые, наверное потому что источник
--   света точечный. отключил у них тени.
-- * при отключенных тенях лампы светят сквозь стены и другие объекты
-- * можно задавать цвет света 'main_color', только нужно отключить
--   'main_color_animator' (="")
-- * не проверял работу на статике
-- * если отключить всё лампы арены, то можно увидеть некие световые
--   пятна/освещение, думаю с ними ничего не поделаешь
-- * при увеличении main_cone_angle (расхождение луча) примерно до PI
--   могут возникать глюки, какие-то тёмные полосы поперёк экрана,
--   конечно возможно что это особенности только моей видеокарты...

