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

//Tag IDs
//1000: Start Warp
//1001: Checkpoint
//1002: Mission Help
//1003: Player Start
//1004: trex eye scene
//1005: trex eye
//1006: trex eye cam target
//1007: 

kActor @trex = null;
kActor @missionHelp = null;
kActor @playerStart = null;
kActor @trexEyeScene = null;
kActor @trexEye = null;
kActor @trexEyeCamTarget = null;

bool inTrexEyeScene = false;
float fovzoomTime = 0.0f;
int helpPage = 0;
uint16 mapInputButtons = 0;
//------------------------------------------------------------------------------------------------------------------------
// Start Map
//------------------------------------------------------------------------------------------------------------------------
$script 0
{
	StartMap();
	@trex = World.GetActorByTID(400);
	@missionHelp = World.GetActorByTID(1002);
	@playerStart = World.GetActorByTID(1003);
	@trexEyeScene = World.GetActorByTID(1004);
	@trexEye = World.GetActorByTID(1005);
	@trexEyeCamTarget = World.GetActorByTID(1006);
	
	Game.CallDelayedMapScript(1, instigator, 0); //Update Map	
	
	if (!missionHelp.IsPersistentMarked())
	{
		World.TriggerActorsByTID(instigator, 1002); //Activate Mission Help
		delay(0.5f);
		Game.PlayMusic("music/track02.ogg", true);
		kActor@ pActor = Player.Actor().CastToActor();
		pActor.Pitch() = Math::Deg2Rad(-25.0f);
		pActor.Yaw() = 0.0f;
		pActor.Roll() = 0.0f;
		pActor.Origin() = playerStart.Origin();
		pActor.SetSector(playerStart.SectorIndex());
		Player.Lock();
		Player.Actor().PlayerFlags() |= (1 << 30); //hide weapon
		helpPage = 0;
		Game.PrintHelp(LTKey(17));
		delay(0.2f);
		Game.CallDelayedMapScript(2, instigator, 0); //Update Mission Help
	}
}
//------------------------------------------------------------------------------------------------------------------------
// Update Map
//------------------------------------------------------------------------------------------------------------------------
$script 1
{
	TickMap();
	
	if (PlayLoop.Ticks() % 4 == 0)
	{
		trex.SpawnFx("fx/spurt_blood.kfx", kVec3(0, -450, 0));
	}
	
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
// Update Mission Help
//------------------------------------------------------------------------------------------------------------------------
$script 2
{
	if (helpPage == 0)
	{
		Game.PrintHelp(LTKey(17));
	}
	else
	{
		Game.PrintHelp(LTKey(18));
	}
	
	mapInputButtons = InputUpdate(mapInputButtons);
	if (InputAttackDown() || InputJumpDown())
	{
		Game.PlaySound("sounds/shaders/generic_216.ksnd");
		if (helpPage == 0)
		{
			helpPage++;
		}
		else
		{
			Game.PlayMusic("music/track11.ogg", true);
			delay(0.2f);
			Game.PrintHelp(LTKey(16)); //clear text
			Player.Actor().PlayerFlags() &= ~(1 << 30); //unhide weapon
			Player.Unlock();
			return;
		}
	}
	
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
// Trex Eye Fov Zoom
//------------------------------------------------------------------------------------------------------------------------
$script 3
{
	fovzoomTime += GAME_DELTA_TIME;
	float t = fovzoomTime / 3.5f;
	Camera.fov = Math::SmoothStepBP(74.0f, 64.0f, t);
	if (t >= 1.0f)
		return;
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
// Update Trex Eye Cinematic
//------------------------------------------------------------------------------------------------------------------------
$script 4
{
    if (Camera.UserInterrupted())
    {
		EndTrexEyeCinematic(10000);
        return;
    }
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
void EndTrexEyeCinematic(const int haltScriptID)
{
	Game.PlayMusic("music/track11.ogg", true);
	Camera.StopCinematic();
	Game.HaltMapScript(3); //Trex Eye Fov Zoom
	Game.HaltMapScript(haltScriptID);
	PlayLoop.StartWarp(Player.Actor().CastToActor(), 1000, 100);
}
//------------------------------------------------------------------------------------------------------------------------
$script 10000
{
	if (!inTrexEyeScene && Player.Actor().OnGround())
	{
		if (!trexEyeScene.IsPersistentMarked())
		{
			inTrexEyeScene = true;
			trexEyeScene.MarkPersistentBit(false);
			Game.StopMusic();
			Camera.StartCinematic(CMF_LOCK_PLAYER | CMF_UNLOCK_PLAYER_ON_FINISH);
			Camera.SetLookAtActor(trexEyeCamTarget);
			Camera.ClearFinalView();
			Camera.ClearViewTracks();
			Camera.fov = 74.0f;
			Camera.origin = kVec3(-5934.0f, 1459.0f, 621.0f);
			while (Camera.CinematicState() < 2) { delay(0.000001f); }
			Game.CallDelayedMapScript(4, instigator, 0); //Update Trex Eye Cinematic
			Game.PlaySound("sounds/shaders/event02.ksnd");
			delay(1.0f);
			Game.CallDelayedMapScript(3, instigator, 0); //Trex Eye Fov Zoom
			delay(1.0f);
			Game.SpawnFx("fx/redeyeflash.kfx", trexEyeCamTarget.Origin() + kVec3(0.0f, 3.0f, 4.0f), trexEyeCamTarget.SectorIndex());
			Game.PlaySound("sounds/shaders/robot_short_2.ksnd");
			delay(2.5f);
			EndTrexEyeCinematic(4);
		}
		else
		{
			PlayLoop.StartWarp(Player.Actor().CastToActor(), 1000, 100);
		}
	}
}
//------------------------------------------------------------------------------------------------------------------------
