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

//anim_activate is default(and his only animation)

//breath fire when close
//shot projectiles when far

class TurokBPIzzie : TurokBPEnemy
{
	float meleeRange = 143.36f;
	float minAttackDelay = 2.0f; //in seconds
	float maxAttackDelay = 4.0f; //in seconds
	float curAttackTime = 0.0f;
	
	bool isRunning = false;
	float breathFireTime = 0.0f;
	//------------------------------------------------------------------------------------------------------------------------
    TurokBPIzzie(kActor @actor) {
        super(actor);
		self.AnimState().Stop();
		self.ImpactType() = IT_FLESH_HUMAN;
    }
	//------------------------------------------------------------------------------------------------------------------------
	void OnTickStart() {
		self.RenderModel().HideSection(4, 4, true);
		TurokBPEnemy::OnTickStart();
		curAttackTime = Math::RandRange(minAttackDelay, maxAttackDelay);
		StartStanding();
	}
	//------------------------------------------------------------------------------------------------------------------------
	void OnTickDeath() {
		TurokBPEnemy::OnTickDeath();
		StartRunning();
		self.SetTarget(null);
	}
	//------------------------------------------------------------------------------------------------------------------------
	void StartRunning() {
		isRunning = true;
		animSpeed = 0.15f;
		self.AnimState().Stop();
		self.AnimState().Set(anim_activate, animSpeed, ANF_BLEND);
	}
	//------------------------------------------------------------------------------------------------------------------------
	void StartStanding() {
		isRunning = false;
		animSpeed = 32.0f;
		self.AnimState().Stop();
		self.AnimState().Blend(anim_activate, animSpeed, animSpeed * 2, ANF_BLEND);
	}
	//------------------------------------------------------------------------------------------------------------------------
    void OnTick() {
		TurokBPEnemy::OnTick();
		
		if (isRunning) {
			if (self.AnimState().TrackTime() >= 0.9f) {
				self.Remove();
			} else {
				if (self.AnimState().TrackTime() >= 0.20f) {
					self.AnimState().ChangeSpeed(8.0f);
				}
			}
		} else {
			//blend back into same animation
			if (self.AnimState().TrackTime() >= 0.08f) {
				self.AnimState().Stop();
				self.AnimState().Blend(anim_activate, animSpeed, animSpeed * 2, ANF_BLEND);
			}
		}
		
		if (Debug::IsActorsDisabled()) {
			return;
		}

		if (self.ImpactType() == 0) {
			return;
		}
		
		if (IsDead()) {
			return;
		}
		
		UpdateAI();
	}
	//------------------------------------------------------------------------------------------------------------------------
    void OnDamage(kActor @instigator, kDictMem @damageDef, const int damage) {
		TurokBPEnemy::OnDamage(@instigator, @damageDef, damage);
		// Sys.Print("Damaged Izzie - Damage = " + damage + ", Health = " + self.Health());
	}
	//------------------------------------------------------------------------------------------------------------------------
	void UpdateAI() {
		if (!HasTarget()) {
			return;
		}
		
		kVec3 targetPos = self.GetTarget().Origin();
		float targetDist = Math::Sqrt(self.DistanceToPoint(targetPos));
		
		if (IsBreathingFire()) {
			breathFireTime -= GAME_DELTA_TIME;
			if (targetDist <= 1000.0f) {
				self.SpawnProjectile("fx/breath.kfx", kVec3(0, 0, 100), self.GetTarget().Origin(), Math::Deg2Rad(45.0f));
			} else {
				breathFireTime = 0.0f;
				curAttackTime = 0.0f;
			}
		}

		curAttackTime = Math::Maxf(curAttackTime - GAME_DELTA_TIME, 0.0f);
		
		if (CanAttack()) {
			curAttackTime = Math::RandRange(minAttackDelay, maxAttackDelay);
			int r = Math::RandMax(4);
			if (r == 2) {
				//bubble lightning seek attack
				self.SpawnProjectile("fx/generic_133.kfx", kVec3(0, 0, 100), self.GetTarget().Origin(), Math::Deg2Rad(45.0f));
			} else if (r == 3) {
				//blue seeker
				self.SpawnProjectile("fx/ponly_generic_143.kfx", kVec3(0, 0, 100), self.GetTarget().Origin(), Math::Deg2Rad(45.0f));
			} else if (r < 2) {
				breathFireTime = 5.0f;
			}
			
			// self.SpawnFx("fx/generic_178.kfx", kVec3(0, 0, 0));
		}
	}
	//------------------------------------------------------------------------------------------------------------------------
	bool CanAttack() {
		return (!IsBreathingFire() and curAttackTime <= 0);
	}
	//------------------------------------------------------------------------------------------------------------------------
	bool IsBreathingFire() {
		return breathFireTime > 0;
	}
	//------------------------------------------------------------------------------------------------------------------------
}
