

namespace Map53Enemies
{
	//------------------------------------------------------------------------------------------------------------------------
    void Setup(TurokEnemy @e) {
		//remove normal enemies on the map
		if (e.bpEnemyID == -1) {
			e.self.Remove();
			return;
		}
		
		int waveID;
		GameVariables.GetInt("BP.ArenaCinID", waveID, 1);
		
		//e.SetOnGunFireCallBack(@ArenaOnGunFire);
		
		kVec3 p = kVec3(-4745.727539f, -1607.423828f, -0.000070f);
		
		if (waveID == 2) {
			if (e.bpEnemyID == 0) { //is purlin boss
				e.SetOnTickDeathCallBack(@Wave2BossOnDeath);
				e.SetOnDamageCallBack(@Wave2BossOnDamage);
			}
		} else if (waveID == 4) {
			if (e.bpEnemyID == 0) { //is izzie boss
				e.SetOnTickDeathCallBack(@Wave4BossOnDeath);
				e.SetOnDamageCallBack(@Wave4BossOnDamage);
			}
		}
		
		//remove the rest (self.Remove)
		// if (!e.isMovedEnemy) {
			// //if a normal enemy on the map then remove it
			// TurokBPEnemy @bpEnemy = cast<TurokBPEnemy@>(e);
			// if (bpEnemy is null) {
				// e.self.Remove();
			// }
		// } else {
			// //kRenderModel @model = self.RenderModel();
		// }
		
		//MoveEnemyFromTo(-2449, 3674, 0, p.x, p.y, p.z); //beetle
		//MoveEnemyFromTo(-1224, 3674, -30, p.x, p.y, p.z); //dragonfly
		//MoveEnemyFromTo(0, 3674, 0, p.x, p.y, p.z); //GV_GENERIC_AXE
		//MoveEnemyFromTo(1224, 3674, 0, p.x, p.y, p.z); //GV_GENERIC_CLUB (Grenades)
		// MoveEnemyFromTo(2449, 3674, 0, p.x, p.y, p.z); //GV_COMMANDER_SPEAR
		// MoveEnemyFromTo(2449, 2449, 0, p.x, p.y, p.z); //raptor
		// MoveEnemyFromTo(1224, 2449, 0, p.x, p.y, p.z); //GV_POACHER_RIFLE
		// MoveEnemyFromTo(0, 2449, 0, p.x, p.y, p.z); //GV_POACHER_PISTOL1
		// MoveEnemyFromTo(-1224, 2449, 0, p.x, p.y, p.z); //GV_COMMANDER_RIFLE4 plasma
		// MoveEnemyFromTo(-2449, 2449, 0, p.x, p.y, p.z); //GV_COMMANDER_RIFLE3 gunner
		// MoveEnemyFromTo(-2449, 1224, 0, p.x, p.y, p.z); //raptor plasma gun
		// MoveEnemyFromTo(-1224, 1224, 0, p.x, p.y, p.z); //stalker
		// MoveEnemyFromTo(0, 1224, 0, p.x, p.y, p.z); //hulk melee
		// MoveEnemyFromTo(1224, 1224, 0, p.x, p.y, p.z); //alien
		// MoveEnemyFromTo(2449, 1224, 0, p.x, p.y, p.z); //grunt ancient bone
		// MoveEnemyFromTo(2449, 0, 0, p.x, p.y, p.z); //grunt robot melee staff
		// MoveEnemyFromTo(1224, 0, 0, p.x, p.y, p.z); //grunt robot melee knife
		// MoveEnemyFromTo(0, 0, 0, p.x, p.y, p.z); //shaman caster
		// MoveEnemyFromTo(-1224, 0, 0, p.x, p.y, p.z); //grunt ancient pipe blower
		// MoveEnemyFromTo(-2449, 0, 0, p.x, p.y, p.z); //grunt ancient staff
		// MoveEnemyFromTo(-2449, -1224, 0, p.x, p.y, p.z); //grunt robot plasma rifle (always melees)
		// MoveEnemyFromTo(-1224, -1224, 0, p.x, p.y, p.z); //grunt robot melee axe
		// MoveEnemyFromTo(0, -1224, 0, p.x, p.y, p.z); //grunt robot melee polearm
		// MoveEnemyFromTo(1224, -1224, 0, p.x, p.y, p.z); //grunt robot (no weapon but shoots like pistol)
		// MoveEnemyFromTo(2449, -1224, 0, p.x, p.y, p.z); //shaman fire caster
		// MoveEnemyFromTo(2449, -2449, 0, p.x, p.y, p.z); //rider - tri rockets
		// MoveEnemyFromTo(1224, -2449, 0, p.x, p.y, p.z); //Red Robot
		// MoveEnemyFromTo(0, -2449, 0, p.x, p.y, p.z); //killer plant
		// MoveEnemyFromTo(-1224, -2449, 0, p.x, p.y, p.z); //sewer crab
		// MoveEnemyFromTo(-2449, -2449, 0, p.x, p.y, p.z); //sandworm
		// MoveEnemyFromTo(-2449, -3674, 0, p.x, p.y, p.z); //igauna melee
		
		if (e.onTickStart is null) {
			e.SetOnTickStartCallBack(@ArenaTickStart);
		}
		if (e.onTick is null) {
			e.SetOnTickCallBack(@ArenaTick);
		}
		if (e.onTickDeath is null) {
			e.SetOnTickDeathCallBack(@ArenaTickDeath);
		}
    }
	//------------------------------------------------------------------------------------------------------------------------
	void ArenaTickStart(TurokEnemy @e) {
		
	}
	//------------------------------------------------------------------------------------------------------------------------
	void ArenaTick(TurokEnemy @e) {
		
		//self.SpawnFx("fx/ponly_deathrain.kfx", kVec3(0, 0, 0));
		
		bool isDead = (e.self.Flags() & AF_DEAD) != 0;
		if (!isDead) {
			if (e.didTickDeath) {
				e.self.Flags() |= AF_DISABLED; //stops respawning
			} else {
				e.self.SetTarget(Player.Actor().CastToActor()); //make sure they don't attack each other
			}
		}
		e.self.MarkPersistentBit(true); //makes the enemy reappear on map load after death
	}
	//------------------------------------------------------------------------------------------------------------------------
	void ArenaTickDeath(TurokEnemy @e) {
		Game.CallDelayedMapScript(2, e.self, 0);
	}
	//------------------------------------------------------------------------------------------------------------------------
	void ArenaOnDamage(TurokEnemy @e, kActor @instigator, kDictMem @damageDef, const int damage) {
	}
	//------------------------------------------------------------------------------------------------------------------------
	void ArenaOnGunFire(TurokEnemy @e, kActor @instigator, const float w, const float x, const float y, const float z) {
		e.self.SpawnProjectile("fx/ponly_deathrain.kfx", kVec3(0, 0, 0), Player.Actor().Origin(), Math::Deg2Rad(45.0f));
	}
	//------------------------------------------------------------------------------------------------------------------------
	void Wave2BossOnDamage(TurokEnemy @e, kActor @instigator, kDictMem @damageDef, const int damage) {
		TurokBPPurlinBoss @boss = cast<TurokBPPurlinBoss@>(e);
		if (boss !is null) {
			if (boss.anger == 1) {
				Game.CallDelayedMapScript(5, e.self, 0.1f);
			}
		}
	}
	//------------------------------------------------------------------------------------------------------------------------
	void Wave2BossOnDeath(TurokEnemy @e) {
		Game.CallDelayedMapScript(6, e.self, 0.0f);
		ArenaTickDeath(@e);
	}
	//------------------------------------------------------------------------------------------------------------------------
	void Wave4BossOnDamage(TurokEnemy @e, kActor @instigator, kDictMem @damageDef, const int damage) {
		// if (e.self.ImpactType() == IT_FORCEFIELD) {
			// e.self.Health() += damage;
			// return;
		// }
		// Sys.Print("HP: " + e.self.Health() + ", After Damage: " + (e.self.Health() - damage));
		if (e.self.Health() > 1500.0f and e.self.Health() - damage <= 1500.0f) {
			e.self.ImpactType() = IT_FORCEFIELD;
			Game.CallDelayedMapScript(15, e.self, 0.0f);
		} else if (e.self.Health() > 1000.0f and e.self.Health() - damage <= 1000.0f) {
			e.self.ImpactType() = IT_FORCEFIELD;
			Game.CallDelayedMapScript(16, e.self, 0.0f);
		} else if (e.self.Health() > 500.0f and e.self.Health() - damage <= 500.0f) {
			e.self.ImpactType() = IT_FORCEFIELD;
			Game.CallDelayedMapScript(17, e.self, 0.0f);
		}
		
	}
	//------------------------------------------------------------------------------------------------------------------------
	void Wave4BossOnDeath(TurokEnemy @e) {
		Game.CallDelayedMapScript(14, e.self, 0.0f);
		ArenaTickDeath(@e);
	}
	//------------------------------------------------------------------------------------------------------------------------
}
