class DynamicLight : Actor native
{
	native double SpotInnerAngle;
	native double SpotOuterAngle;

	property SpotInnerAngle: SpotInnerAngle;
	property SpotOuterAngle: SpotOuterAngle;

	enum EArgs
	{
	   LIGHT_RED = 0,
	   LIGHT_GREEN = 1,
	   LIGHT_BLUE = 2,
	   LIGHT_INTENSITY = 3,
	   LIGHT_SECONDARY_INTENSITY = 4,
	   LIGHT_SCALE = 3,
	};

	enum ELightType
	{
		PointLight,
		PulseLight,
		FlickerLight,
		RandomFlickerLight,
		SectorLight,
		DummyLight,
		ColorPulseLight,
		ColorFlickerLight, 
		RandomColorFlickerLight
	};
	
	Default
	{
		Height 0;
		Radius 0.1;
		FloatBobPhase 0;
		RenderRadius -1;
		DynamicLight.SpotInnerAngle 10;
		DynamicLight.SpotOuterAngle 25;
		+NOBLOCKMAP
		+NOGRAVITY
		+FIXMAPTHINGPOS
		+INVISIBLE
	}
}


class PointLight : DynamicLight
{
	Default
	{
		DynamicLight.Type "Point";
	}
}

class PointLightPulse : PointLight
{
	Default
	{
		DynamicLight.Type "Pulse";
	}
}

class PointLightFlicker : PointLight
{
	Default
	{
		DynamicLight.Type "Flicker";
	}
}

class SectorPointLight : PointLight
{
	Default
	{
		DynamicLight.Type "Sector";
	}
}

class PointLightFlickerRandom : PointLight
{
	Default
	{
		DynamicLight.Type "RandomFlicker";
	}
}

// DYNAMICLIGHT.ADDITIVE and DYNAMICLIGHT.SUBTRACTIVE are used by the lights for additive and subtractive lights

class PointLightAdditive : PointLight
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class PointLightPulseAdditive : PointLightPulse
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class PointLightFlickerAdditive : PointLightFlicker
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class SectorPointLightAdditive : SectorPointLight
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class PointLightFlickerRandomAdditive :PointLightFlickerRandom
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class PointLightSubtractive : PointLight
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class PointLightPulseSubtractive : PointLightPulse
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class PointLightFlickerSubtractive : PointLightFlicker
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class SectorPointLightSubtractive : SectorPointLight
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class PointLightFlickerRandomSubtractive : PointLightFlickerRandom
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class PointLightAttenuated : PointLight
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class PointLightPulseAttenuated : PointLightPulse
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class PointLightFlickerAttenuated : PointLightFlicker
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class SectorPointLightAttenuated : SectorPointLight
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class PointLightFlickerRandomAttenuated :PointLightFlickerRandom
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class SpotLight : DynamicLight
{
	Default
	{
		DynamicLight.Type "Point";
		+DYNAMICLIGHT.SPOT
	}
}

class SpotLightPulse : SpotLight
{
	Default
	{
		DynamicLight.Type "Pulse";
	}
}

class SpotLightFlicker : SpotLight
{
	Default
	{
		DynamicLight.Type "Flicker";
	}
}

class SectorSpotLight : SpotLight
{
	Default
	{
		DynamicLight.Type "Sector";
	}
}

class SpotLightFlickerRandom : SpotLight
{
	Default
	{
		DynamicLight.Type "RandomFlicker";
	}
}

class SpotLightAdditive : SpotLight
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class SpotLightPulseAdditive : SpotLightPulse
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class SpotLightFlickerAdditive : SpotLightFlicker
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class SectorSpotLightAdditive : SectorSpotLight
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class SpotLightFlickerRandomAdditive : SpotLightFlickerRandom
{
	Default
	{
		+DYNAMICLIGHT.ADDITIVE
	}
}

class SpotLightSubtractive : SpotLight
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class SpotLightPulseSubtractive : SpotLightPulse
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class SpotLightFlickerSubtractive : SpotLightFlicker
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class SectorSpotLightSubtractive : SectorSpotLight
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class SpotLightFlickerRandomSubtractive : SpotLightFlickerRandom
{
	Default
	{
		+DYNAMICLIGHT.SUBTRACTIVE
	}
}

class SpotLightAttenuated : SpotLight
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class SpotLightPulseAttenuated : SpotLightPulse
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class SpotLightFlickerAttenuated : SpotLightFlicker
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class SectorSpotLightAttenuated : SectorSpotLight
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class SpotLightFlickerRandomAttenuated : SpotLightFlickerRandom
{
	Default
	{
		+DYNAMICLIGHT.ATTENUATE
	}
}

class VavoomLight : DynamicLight 
{
	Default
	{
		DynamicLight.Type "Point";
	}
	
	override void BeginPlay ()
	{
		if (CurSector) AddZ(-CurSector.floorplane.ZatPoint(pos.XY), false); // z is absolute for Vavoom lights
		Super.BeginPlay();
	}
}

class VavoomLightWhite : VavoomLight
{
	override void BeginPlay ()
	{
		args[LIGHT_INTENSITY] = args[0] * 4;
		args[LIGHT_RED] = 128;
		args[LIGHT_GREEN] = 128;
		args[LIGHT_BLUE] = 128;

		Super.BeginPlay();
	}
}

class VavoomLightColor : VavoomLight
{
	override void BeginPlay ()
	{
		int radius = args[0] * 4;
		args[LIGHT_RED] = args[1] >> 1;
		args[LIGHT_GREEN] = args[2] >> 1;
		args[LIGHT_BLUE] = args[3] >> 1;
		args[LIGHT_INTENSITY] = radius;
		Super.BeginPlay();
	}
}


