#include "scripts/common.txt"
#include "scripts/BP_common.txt"

//Wall Width/Radius (float) (Shoot Delay)
//(0) Target ID -32768..32767 (target TID, 0 = none)
//(7) Params 1 -128..127 (Type of Projectile)
//(6) Params 2 -128..127 (0 = Play Sound, 1 = No Sound)

class BP_ProjectileTrap : ScriptObject
{
    kActor @self;
	int targetTID;
	int particleType;
	bool canPlaySound;
	float shootDelay;
	float delay;
	//------------------------------------------------------------------------------------------------------------------------
    BP_ProjectileTrap(kActor @actor)
	{
        @self = actor;
    }
	//------------------------------------------------------------------------------------------------------------------------
	void OnActivate()
	{
		if (self.TID() <= 0)
		{
			return;
		}
		
		self.MarkPersistentBit(false);
		self.Remove();
	}
	//------------------------------------------------------------------------------------------------------------------------
    void OnBeginLevel()
    {
		self.Flags() |= (AF_HIDDEN|AF_DISABLED|AF_NODRAW);
		targetTID = self.SpawnParams(0);
		particleType = self.SpawnParams(7);
		canPlaySound = self.SpawnParams(6) == 0;
		shootDelay = self.WallRadius();
		delay = shootDelay;
		
		if (targetTID > 0)
		{
			self.SetTarget(World.GetActorByTID(targetTID));
		}
	}
	//------------------------------------------------------------------------------------------------------------------------
	void PlaySound(const kStr &in path)
	{
		if (canPlaySound)
		{
			self.PlaySound(path);
		}
	}
	//------------------------------------------------------------------------------------------------------------------------
    void OnRestore()
    {
		self.Remove();
    }
	//------------------------------------------------------------------------------------------------------------------------
    void OnTick()
	{
		delay -= GAME_DELTA_TIME;
		if (delay <= 0.0f)
		{
			delay = shootDelay;
			kActor@ target = self.GetTarget();
			if (target !is null)
			{
				switch(particleType)
				{
					case 0: //demon attack (hadoken)
					{
						self.SpawnProjectile("fx/generic_256.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
					case 1: //trex breath (should be fast)
					{
						PlaySound("sounds/shaders/fire_rumble.ksnd");
						self.SpawnProjectile("fx/breath.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
					case 2: //trex eye laser
					{
						self.SpawnProjectile("fx/eyefire.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
					case 3: //Longhunter Plasma
					{
						PlaySound("sounds/shaders/machine_gun_shot_2.ksnd");
						self.SpawnProjectile("fx/enemy_longhunter.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
					case 4: //Raptor Plasma
					{
						self.SpawnProjectile("fx/generic_178.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
					case 5: //Shaman fire attack
					{
						PlaySound("sounds/shaders/high_priest_spell_attack.ksnd");
						self.SpawnProjectile("fx/spellcast.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
					case 6: //Grenade
					{
						self.SpawnProjectile("fx/generic_114.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
					case 7: //Rider Rockets
					{
			            PlaySound("sounds/shaders/missile_launch.ksnd");
						self.SpawnProjectile("fx/generic_200.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
					case 8: //Alien Plasma
					{
						PlaySound("sounds/shaders/tek_weapon_1.ksnd");
						self.SpawnProjectile("fx/enemy_plasma1.kfx", Math::vecZero, target.Origin(), Math::Deg2Rad(45.0f));
						break;
					}
				}
			}
		}
    }
	//------------------------------------------------------------------------------------------------------------------------
    void OnSpawn()
	{
    }
	//------------------------------------------------------------------------------------------------------------------------
}
