namespace BP
{
	const float MONKEYROBBER_SCREAMTIME_MIN = 2.0f;
	const float MONKEYROBBER_SCREAMTIME_MAX = 6.0f;
	const float MONKEYROBBER_LIFETIME_MIN = 12.5f;
	const float MONKEYROBBER_LIFETIME_MAX = 17.5f;
	
	class MonkeyRobber : AI
	{
		kMovementComponent@ movementComp;
		kAnimTrackComponent@ animComp;
		float lifeTimer;
		float screamTimer;
		//------------------------------------------------------------------------------------------------------------------------
		MonkeyRobber(kActor@ actor)
		{
			super(actor);
			lifeTimer = Math::RandRange(MONKEYROBBER_LIFETIME_MIN, MONKEYROBBER_LIFETIME_MAX);
			screamTimer = Math::RandRange(MONKEYROBBER_SCREAMTIME_MIN, MONKEYROBBER_SCREAMTIME_MAX) + 1.0f;
		}
		//------------------------------------------------------------------------------------------------------------------------
		void BP_OnSerialize(kDict dict) override
		{
			AI::BP_OnSerialize(dict);
			SERIALIZE_FLOAT(lifeTimer);
		}
		//------------------------------------------------------------------------------------------------------------------------
		void BP_OnDeserialize(kDict& in dict) override
		{
			AI::BP_OnDeserialize(dict);
			DESERIALIZE_FLOAT(lifeTimer);
		}
		//------------------------------------------------------------------------------------------------------------------------
		void BP_OnStart() override
		{
			AI::BP_OnStart();
			self.EnemyAIComponent().SpawnFlags() |= EAIGF_CLIMBUP | EAIGF_DROPOFF;
			BP::Actor::AIIgnorePlayer(@self, true);
			@animComp = self.AnimTrackComponent();
			@movementComp = self.MovementComponent();
		}
		//------------------------------------------------------------------------------------------------------------------------
		void BP_OnDeserializeStart() override
		{
			AI::BP_OnDeserializeStart();
			@animComp = self.AnimTrackComponent();
			@movementComp = self.MovementComponent();
		}
		//------------------------------------------------------------------------------------------------------------------------
		void BP_OnTick() override
		{
			AI::BP_OnTick();
			kVec3 destPoint = self.Origin() + (self.Origin() - BP::LocalPlayer::Actor.Origin()).Normalize() * 256.0f;
			MoveToPoint(destPoint);
			
			if (!animComp.IsPlaying(ANIM_GROUND_REACTION_SHOCKED))
			{
				kVec3 vel = BP::Actor::Forward(@self) * 5.0f;
				vel.z = 0.0f; //movementComp.Velocity().z;
				movementComp.Velocity() += vel;
			}
			
			screamTimer -= GAME_DELTA_TIME;
			if (screamTimer <= 0.0f && lifeTimer > 1.0f)
			{
				screamTimer = Math::RandRange(MONKEYROBBER_SCREAMTIME_MIN, MONKEYROBBER_SCREAMTIME_MAX);
				self.PlaySound(kSfx_Monkey_Flinch);
				movementComp.Velocity().z += 14.0f;
			}
			
			if (lifeTimer > 0.0f)
			{
				//we remove here instead of on death so damage popup will be shown
				if (self.Health() <= 0.0f)
				{
					self.Remove();
					return;
				}
			
				lifeTimer -= GAME_DELTA_TIME;
				if (lifeTimer <= 0.0f)
				{
					self.Flags() |= AF_NODAMAGE;
					self.PlaySound(kSfx_Monkey_Scream);
					self.RunFxEvent("Hostage_Fade");
				}
			}
			else
			{
				//incase the RunFxEvent doesn't trigger remove later on
				lifeTimer -= GAME_DELTA_TIME;
				if (lifeTimer <= -2.0f)
				{
					self.Remove();
				}
			}
			
		}
		//------------------------------------------------------------------------------------------------------------------------
		// void BP_OnDamage(kDamageInfo& in dmgInfo) override
		// {
			// AI::BP_OnDamage(dmgInfo);
		// }
		//------------------------------------------------------------------------------------------------------------------------
		void BP_OnDeath(kDamageInfo& in dmgInfo) override
		{
			AI::BP_OnDeath(dmgInfo);
			self.Flags() &= ~AF_NOGENERATE;
			uint genFlags = Math::RandMax(2) == 0 ? GENERATE_FLAG_CLIP : GENERATE_FLAG_SHELLS;
			self.GenerateActors(genFlags, 0);
			self.PlaySound(kSfx_Monkey_Death);
			//blood particle
			kVec3 particlePos = BP::Actor::CenterOrigin(@self, 1.0f);
			BP::Spawn::Particle("particles/zPlaceholder_12.particle", @self, particlePos, kQuat(self.Pitch(), 0, self.Yaw()));
		}
		//------------------------------------------------------------------------------------------------------------------------
	};
}
