#include "scripts/common.txt"
#include "scripts/BP_common.txt"
#include "scripts/BP_MapCommon.txt"

//Tag IDs
//2016: Checkpoint (Temple of Time Warp)
//1000: Start Warp
//1001: Temple of Time Warp
//1002: Top of Temple Warp
//1003: button for door 1 + visibilty blocker
//1004: Door 1
//1005: Statue Enemy 1
//1006: Drop Enemies 1
//1007: Birds 1
//1008: Drop Enemies 2
//1009: Drop Enemies 3
//1010: Trex
//1011: Drop Enemies 4
//1012: Birds 2
//1013: Trex Enemies
//1014: Mantis
//1015: Door Temple of Time + Raptors
//1016: side Mantises
//1017: Camera LookAt Point
//1018: Cinema Forcefield
//1019: Cinema Campaigner
//1020: Cinema Player Position
//1021: 


kActor@ door1;
kActor@ trex;
kActor@ mantis;
kActor@ camLookAt;
kActor@ cinemaForceField;
kActor@ cinemaPlayerPos;
kActor@ cinemaCampaigner;
float lerpTime;
const float CamTotalLerpTime = 8.0f;
bool playMusic;
int timeTrialActive = 0;

//------------------------------------------------------------------------------------------------------------------------
// Start Map
//------------------------------------------------------------------------------------------------------------------------
$script 0
{
    GameVariables.GetInt("g_timetrial", timeTrialActive);
    if (timeTrialActive != 0)
    {
        Game.StartTimer();
    }
	
	SetStarted(true);
	StartMap();

	playMusic = true;
	@door1 = World.GetActorByTID(1004);
	@trex = World.GetActorByTID(1010);
	@mantis = World.GetActorByTID(1014);
	@camLookAt = World.GetActorByTID(1017);
	@cinemaForceField = World.GetActorByTID(1018);
	cinemaForceField.Flags() |= AF_NODRAW;
	@cinemaCampaigner = World.GetActorByTID(1019);
	cinemaCampaigner.Flags() |= AF_NODRAW;
	@cinemaPlayerPos = World.GetActorByTID(1020);
	
	if (door1.IsPersistentMarked())
	{
		World.TriggerActorsByTID(instigator, 1005); //Statue Enemy 1
		door1.Remove();
	}
	if (!trex.IsPersistentMarked())
	{
		HideAI(trex);
	}
	if (mantis.IsPersistentMarked())
	{
		World.TriggerActorsByTID(instigator, 1015); //Door Temple of Time + Raptors
	}
	Game.CallDelayedMapScript(1, instigator, 0); //Update Map
	
	if (GetNPickups() == 0)
	{
		Game.PrintLine(LTKey(32), 0, 300);
	}
	
}
//------------------------------------------------------------------------------------------------------------------------
// Update Map
//------------------------------------------------------------------------------------------------------------------------
$script 1
{
	TickMap();
	
	if (playMusic)
	{
		const int areaID = Player.Actor().AreaID();
		int arg6 = World.GetAreaArg(areaID, 5);
		if (arg6 != 32000)
		{
			PlayWavMusic("music_temple.ksnd");
		}
		else
		{
			StopWavMusic();
		}
	}
	if (Player.HasWeapon(TW_WEAPON_MINIGUN) && GetWeaponUpgrade(WUF_DUALMINIGUN))
	{
		Player.GiveWeapon(TW_WEAPON_MINIGUN, 9999);
	}
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
// Lerp Cinema Camera
//------------------------------------------------------------------------------------------------------------------------
$script 2
{
	lerpTime += GAME_DELTA_TIME;
	float positionLerpTime = lerpTime / (CamTotalLerpTime - 1.0f);
	float camX = Math::SmoothStepBP(-10304, -10925, positionLerpTime);
	float camY = Math::SmoothStepBP(-513, -748, positionLerpTime);
	float camZ = Math::SmoothStepBP(-1076, 134, positionLerpTime);
	Camera.origin = kVec3(camX, camY, camZ);
	
	if (positionLerpTime < 1.0f)
	{
		$restart;
	}
}
//------------------------------------------------------------------------------------------------------------------------
// Local Teleport To Temple of Time
//------------------------------------------------------------------------------------------------------------------------
$script 10000
{
	if ((instigator.Flags() & AF_ENTEREDAREAEVENT) == 0)
	{
		if (GetNPickups() >= 7)
		{
			WarpWithMusic(1001, false);
		}
		else
		{
			Game.PrintLine(LTKey(32), 0, 300);
		}
	}
}
//------------------------------------------------------------------------------------------------------------------------
// Local Teleport To Top of Temple
//------------------------------------------------------------------------------------------------------------------------
$script 10001
{
	if (!ActorExists(mantis) || IsActorDead(mantis))
	{
		WarpWithMusic(1002, false);
	}
}
//------------------------------------------------------------------------------------------------------------------------
// On Button for Door 1
//------------------------------------------------------------------------------------------------------------------------
$script 10002
{
	if (ActorExists(door1) && !door1.IsPersistentMarked())
	{
		door1.MarkPersistentBit(false);
		door1.Remove();
		World.TriggerActorsByTID(instigator, 1003); //button for door 1 + visibilty blocker
		World.TriggerActorsByTID(instigator, 1005); //Statue Enemy 1
	}
}
//------------------------------------------------------------------------------------------------------------------------
// In Trex Area
//------------------------------------------------------------------------------------------------------------------------
$script 10003
{
	if (ActorExists(trex) && !trex.IsPersistentMarked() && IsAIDisabled(trex))
	{
		ShowAI(trex);
		World.TriggerActorsByTID(instigator, 1013); //Trex Enemies
	}
}
//------------------------------------------------------------------------------------------------------------------------
// In Mantis Area
//------------------------------------------------------------------------------------------------------------------------
$script 10004
{
	if ((instigator.Flags() & AF_ENTEREDAREAEVENT) == 0 && IsAIDisabled(mantis))
	{
		delay(1.5f);
		World.TriggerActorsByTID(instigator, 1014); //Mantis
		delay(8.0f);
		World.TriggerActorsByTID(instigator, 1016); //side Mantises
	}
}
//------------------------------------------------------------------------------------------------------------------------
// In Finish Area
//------------------------------------------------------------------------------------------------------------------------
$script 10005
{
	if ((instigator.Flags() & AF_ENTEREDAREAEVENT) == 0)
	{
		if (timeTrialActive != 0)
		{
			Game.StopTimer();
		}

		Player.Actor().ModelVariation() = TV_KNIFE;
		Player.Actor().AnimState().Set(anim_aiStanding, 8.0f, ANF_LOOP);
		//Player.Actor().AnimState().Set(anim_player_idle, 8.0f, ANF_LOOP|ANF_ROOTMOTION);

		Camera.StartCinematic(CMF_LOCK_PLAYER);
		Camera.ClearFinalView();
		Camera.ClearViewTracks();
		Camera.SetLookAtActor(camLookAt);
	    Camera.fov = 74.0f;
		
		Game.StopMusic();
		playMusic = false;
		StopWavMusic();
		Game.PlaySound("sounds/shaders/mastersword.ksnd");
		delay(0.3f);
		Player.Actor().Origin() = cinemaPlayerPos.Origin();
		Player.Actor().Yaw() = cinemaPlayerPos.Yaw();
		Player.Actor().Pitch() = 0.0f;
		Player.Actor().Roll() = 0.0f;
		Player.Actor().Flags() &= ~AF_NODRAW;
		cinemaForceField.Flags() &= ~AF_NODRAW;
		cinemaCampaigner.Flags() &= ~AF_NODRAW;
		lerpTime = 0.0f;
		Game.CallDelayedMapScript(2, instigator, 0); //Lerp Cinema Camera
		delay(8.5f);
		Game.PlaySound("sounds/shaders/campainger_rage.ksnd");
		delay(4.5f);
		Game.Restart();
	}
}
//------------------------------------------------------------------------------------------------------------------------
