#include "scripts/common.txt"
#include "scripts/bp_common.txt"
#include "scripts/map/common_level_script.txt"

array<kActor@> targets;
int targetsKilled = 0;
float ammoTime = 5.0f;
float objDisplayTime = 5.0f;
//------------------------------------------------------------------------------------------------------------------------
$script 0 {
	Player.GiveWeapon(TW_WEAPON_BOW, 30); //Refill normal arrow ammo
	SetOnlyEnabledWeapon(TW_WEAPON_BOW); //disable all weapons except the bow
	
	SpawnSolidActor("BPBlocker", 6163, -8030, 1228, 957);
	SpawnSolidActor("BPBlocker", 2450, -8047, 920, 672);
	
	targets.insertLast(SpawnSolidActor("Animal_Deer", 5327, -8044, 1228, 771, Math::Deg2Rad(90)));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 5065.661133f, -8417.932617f, 1228.799194f, 770, -1.963495f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 5040.139160f, -8937.392578f, 1228.799194f, 766, -1.963495f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 5255.422363f, -7510.292480f, 1228.798706f, 770, 0.392699f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 4531.275391f, -7301.243164f, 921.599976f, 854, 1.178097f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 4451.780273f, -7971.361816f, 920.413879f, 863, -2.748894f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 4702.949707f, -8760.415039f, 921.599976f, 865, 2.748894f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 4034.850342f, -8728.444336f, 920.597900f, 885, -1.178097f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 4030.944336f, -7863.527344f, 1049.501587f, 2825, 0.785398f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 4070.547607f, -8289.704102f, 1049.501587f, 2827, 2.356194f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 3824.253174f, -8076.030762f, 1049.501587f, 2827, -1.178097f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 3306.565430f, -7393.093262f, 920.174744f, 682, -0.392699f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 3278.990723f, -8654.810547f, 921.539307f, 1574, 0.000000f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 3092.502197f, -7825.577637f, 919.424133f, 672, 0.000000f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 3475.779053f, -8047.275391f, 917.908691f, 713, 2.748894f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 4391.284180f, -9028.473633f, 1163.228882f, 1915, -1.570796f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 4265.788086f, -7059.497559f, 1118.437744f, 737, -1.570796f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 5022.060547f, -7097.211426f, 1228.799316f, 754, 0.000000f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 3518.664551f, -7500.335938f, 1253.642212f, 2677, -1.963495f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 3519.669189f, -8568.610352f, 1253.642212f, 2684, -1.178097f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 4442.881348f, -8225.575195f, 919.679993f, 865, -0.392699f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 4489.978516f, -8727.474609f, 920.039978f, 883, 2.748893f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 3975.318359f, -7468.646484f, 918.930664f, 851, -0.785398f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 3523.345215f, -7082.974121f, 921.307068f, 697, -1.570796f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 4750.250977f, -7712.504883f, 1228.799561f, 761, -1.570796f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 4230.880859f, -8705.774414f, 919.673340f, 886, 2.356194f));
	targets.insertLast(SpawnSolidActor("Animal_Boar", 2941.052490f, -8342.421875f, 920.083679f, 716, -1.963495f));
	targets.insertLast(SpawnSolidActor("Animal_Deer", 4441.362305f, -7693.286133f, 918.674927f, 864, 2.356194f));

	Game.CallDelayedMapScript(1, instigator, 0); //Update Game
}
//------------------------------------------------------------------------------------------------------------------------
// Update Game
//------------------------------------------------------------------------------------------------------------------------
$script 1 {
	if (objDisplayTime > 0.0f) {
		objDisplayTime -= GAME_DELTA_TIME;
		Game.PrintLine("with the bow", 0, 30);
		Game.PrintLine("Hunt 15 animals", 1, 30);
	}
	
	//check if 15 are dead
	int lastKillCount = targetsKilled;
	int targetsLength = int(targets.length());
	for (int i = targetsLength - 1; i >= 0; i--) {
		kActor @actor = targets[i];
		if (actor.Health() <= 0) {
			targetsKilled++;
			targets.removeAt(i);
		}
	}
	if (lastKillCount != targetsKilled) {
		if (targetsKilled < 15) {
			Game.PrintLine("" + (15 - targetsKilled) + " remaining", 5);
		}
	}
	
	if (targetsKilled >= 15) {
		Game.CallDelayedMapScript(4, instigator, 0); //Victory
		return;
	} else {
		//if runs out of ammo or is killed then warp back
		if (!Player.HasAmmo(TW_WEAPON_BOW) and !Player.HasAltAmmo(TW_WEAPON_BOW)) {
			ammoTime -= GAME_DELTA_TIME;
			if (ammoTime <= 0.0f) {
				Game.CallDelayedMapScript(3, instigator, 0); //Failed
				return;
			} else {
				Game.PrintLine("Failure in " + int(Math::Ceil(ammoTime)), 1);
			}
		} else {
			ammoTime = 5.0f;
		}
	}
	
	BlockAreaMinMax(kVec3(6893, -8175, 1200), kVec3(7192, -7895, 3228), kVec3(-1.0f, 0.0f, 0.0f));
	BlockAreaMinMax(kVec3(2535, -8467, 900), kVec3(2805, -7622, 2900), kVec3(1.0f, 0.0f, 0.0f));
	UpdateGeneralGame();
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
// On Player Death
//------------------------------------------------------------------------------------------------------------------------
$script 2 {
	PlayLoop.HandlePlayerDeath();
	ExitChallengeWarp();
}
//------------------------------------------------------------------------------------------------------------------------
// Failed (Out of ammo)
//------------------------------------------------------------------------------------------------------------------------
$script 3 {
	ExitChallengeWarp();
}
//------------------------------------------------------------------------------------------------------------------------
// Victory
//------------------------------------------------------------------------------------------------------------------------
$script 4 {
	Camera.StartCinematic(CMF_LOCK_PLAYER|CMF_NO_INITIAL_FADEOUT);
	Camera.SetLookAtActor(Player.Actor().CastToActor());
	Camera.fov = 74.0f;
	Player.Actor().ModelVariation() = TV_BOW;
	Player.Actor().AnimState().Set(anim_player_acquire_key, 8.0f, ANF_LOOP);
	Player.Actor().Flags() &= ~AF_NODRAW;
	Camera.SetFinalView(0);
	Camera.SetRotationTrack(0,
							Math::Deg2Rad(0.0f),  // start angle
							Math::Deg2Rad(25.0f),   // dest angle
							10*GAME_SCALE,           // start distance
							6*GAME_SCALE,           // dest distance
							7*GAME_SCALE,           // start height
							12*GAME_SCALE,           // dest height
							4*GAME_SCALE,           // start look at height
							7*GAME_SCALE);          // dest look at height
	Camera.AutoPlayRotationTrack(0, 4.0f, CMLT_COSINE);
	delay(2.0f);
	Game.PlaySound("sounds/shaders/ItemCatch.ksnd");
	Game.PrintLine("The Power is yours", 0, 120);
	delay(2.0f);
	Player.GiveWeapon(TW_WEAPON_BOW, 30); //Refill normal arrow ammo
	SetUpgradeBow(true);
	ExitChallengeWarp();
	return;
}
//------------------------------------------------------------------------------------------------------------------------
