#include "scripts/common.txt"

//firerocks thrown by Fireborn boss

class BP_FireRock : ScriptObject
{
    kActor@ self;
	bool collided;
	bool airRotation;
	int lifeTime;
	//------------------------------------------------------------------------------------------------------------------------
    BP_FireRock(kActor @actor)
    {
        @self = actor;
		collided = false;
		airRotation = true;
		lifeTime = 250 + Math::RandMax(100);
		
        actor.Scale().Set(0.35f, 0.35f, 0.35f);
		self.Flags() |= AF_CANBETOUCHED | AF_CASTSHADOW | AF_ALWAYSACTIVE;
        actor.ClipFlags() = (CF_DROPOFF|CF_CLIPEDGES|CF_NOCLIPACTORS|CF_COLLIDEFLOORS|CF_COLLIDEHEIGHT);
		
		float vx = Math::RandRange(5.0f, 15.0f);
		float vy = Math::RandRange(5.0f, 15.0f);
		float vz = Math::RandRange(20.0f, 25.0f);
		if (Math::RandMax(2) == 0)
			vx *= -1;
		if (Math::RandMax(2) == 0)
			vy *= -1;
		
        actor.Velocity() = kVec3(vx, vy, vz);
		actor.BounceDamp() = Math::RandRange(0.2f, 0.5f);
		actor.Gravity() = 0.25f;
		actor.RunFxEvent("FireRock");
    }
	//------------------------------------------------------------------------------------------------------------------------
    void OnSpawn()
	{
		kRenderModel@ model = self.RenderModel();
		//int rockIndex = Math::RandMax(8) + 1;
		int rockIndex = 2;
		model.SetModel("models/cave_rock0" + rockIndex + ".bin", "anims/empty.bin");
		model.AddTrailEffect("Trail_Firerock", 0);
	}
	//------------------------------------------------------------------------------------------------------------------------
    void OnTick(void)
    {
		if (self.GameTicks() > lifeTime)
		{
			kActor@ spawnedFireborn = World.GetActorByTID(1011);
			int maxSpawnFireborn = (Game.GetDifficulty() < DIFFICULTY_HARD) ? 5 : 10;
			if (Game.GetCurrentMapID() == 112 && ActorExists(spawnedFireborn) && spawnedFireborn.Health() < maxSpawnFireborn && Math::RandMax(3) == 0)
			{
				spawnedFireborn.Health() += 1;
				kActor@ actor = ActorFactory.Spawn("Human_Grunt_Soldier_Spawn", self.Origin().x, self.Origin().y, self.FloorHeight(), Math::RandRange(0.0f, Math::pi * 2), self.SectorIndex());
				actor.Flags() = AF_SNAPTOFLOOR | AF_CASTSHADOW | AF_AVOIDWATER | AF_FLOATINWATERONDEATH | AF_ALLOWTINYENEMYCHEAT | AF_ALWAYSACTIVE;
				Game.SpawnFx("fx/greenblood.kfx", kVec3(actor.Origin().x, actor.Origin().y, actor.Origin().z), actor.SectorIndex());
				TurokGrunt @actorScript = cast<TurokGrunt@>(actor.ScriptObject().obj);
				actorScript.spawnFromFireborn = true;
				actorScript.DoFirebornSpawnStart();
				actorScript.OnBeginLevel();
			}
			
			self.SpawnFx("fx/firerock_explosion.kfx", Math::vecZero);
			self.Remove();
			return;
		}
		
		//self.Yaw() += Math::Deg2Rad(1.0f);
		if (airRotation)
			self.Pitch() += Math::Deg2Rad(5.0f);
		
		// if (self.GameTicks() % 4 == 0)
		// {
			// // self.SpawnFx("fx/generic_51.kfx", kVec3(0.0f, 0.0f, 0.0f));
			
			// //self.SpawnFx("fx/generic_147.kfx", kVec3(0.0f, 0.0f, 0.0f));
		// }
			//self.SpawnFx("fx/generic_131.kfx", Math::vecZero); //split explode
    }
	//------------------------------------------------------------------------------------------------------------------------
	void OnTouch(kActor@ touchedActor)
	{
		kActor@ pActor = Player.Actor().CastToActor();
		if (@touchedActor == @pActor)
		{
			pActor.InflictGenericDamage(self, 1);
		}
	}
	//------------------------------------------------------------------------------------------------------------------------
	void OnCollide(kCModel@ cModel)
	{
		collided = true;
		self.ClipFlags() |= CF_NOCOLLIDEFUNC;
		airRotation = false;
		self.Pitch() = 0.0f;
		Game.SpawnFx("fx/firerock_impact.kfx", self.Origin(), self.SectorIndex());
		
		// uint clipResult = cModel.ClipResult();
		// // Sys.Print(CRFString("Firerock OnCollide Result: ", clipResult));
		// if ((clipResult & (CRF_FLOOR | CRF_CEILING | CRF_WALL)) != 0)
		// {
			// //Game.SpawnFx("fx/generic_242.kfx", self.Origin(), self.SectorIndex());
			// //self.SpawnFx("fx/generic_224.kfx", Math::vecZero);
			
				// //generic_242.kfx yellow particles go forward and bounce on floor
				// //generic_224.kfx rock particles explode bounce on floor
				// //generic_240.kfx yellow lightning
				// //generic_90.kfx sparks
				// //shockwave.kfx
		// }
	}
	//------------------------------------------------------------------------------------------------------------------------
	kStr CRFString(kStr &in s, const uint clipResult)
	{
		if ((clipResult & CRF_FLOOR) != 0)
		{
			s += "CRF_FLOOR";
		}
		if ((clipResult & CRF_CEILING) != 0)
		{
			s += ", CRF_CEILING";
		}
		if ((clipResult & CRF_WALL) != 0)
		{
			s += ", CRF_WALL";
		}
		if ((clipResult & CRF_OBJECT) != 0)
		{
			s += ", CRF_OBJECT";
		}
		if ((clipResult & CRF_MESH) != 0)
		{
			s += ", CRF_MESH";
		}
		if ((clipResult & CRF_ADJUST) != 0)
		{
			s += ", CRF_ADJUST";
		}
		if ((clipResult & CRF_WALLRADIUS) != 0)
		{
			s += ", CRF_WALLRADIUS";
		}
		return s;
	}
	//------------------------------------------------------------------------------------------------------------------------
};
