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

//Tag IDs
//2014: Start Warp + Checkpoint
//1000: Center Area Point
//1001: Fireborn Boss
//1002: Shockwave Spawn Point 1
//1003: Shockwave Spawn Point 2
//1004: Shockwave Spawn Point 3
//1005: Shockwave Spawn Point 4
//1006: Shockwave Spawn Point 5
//1007: Shockwave Spawn Point 6
//1008: Shockwave Spawn Point 7
//1009: Shockwave Spawn Point 8
//1010: Direct Bolts Spawn Point
//1011: Actors Health is Number of Spawned Fireborn from firerocks
//1012: Rolling Rock 1
//1013: Rolling Rock 2
//1014:
//1015:
//1016:
//1017:
//1018: 


kActor@ centerPoint;
kActor@ boss;
kActor@ spawnedFireborn; //Health is the number of Spawned Fireborn from firerocks
bool spawnedIntroRocks = false;
//------------------------------------------------------------------------------------------------------------------------
// Start Map
//------------------------------------------------------------------------------------------------------------------------
$script 0
{
	StartMap();
	@centerPoint = World.GetActorByTID(1000);
	@boss = World.GetActorByTID(1001);
	@spawnedFireborn = World.GetActorByTID(1011);
	Game.CallDelayedMapScript(1, instigator, 0.0f); //Update Map	
	
	if (ActorExists(boss))
	{
		if (GetFBBossStarted())
		{
			Game.CallDelayedMapScript(2, instigator, 0.0f); //Update Boss
		}
		else
		{
			Game.CallDelayedMapScript(4, instigator, 0.0f); //Start Boss Cinematic Intro
		}
	}
	
}
//------------------------------------------------------------------------------------------------------------------------
// Update Map
//------------------------------------------------------------------------------------------------------------------------
$script 1
{
	TickMap();
	
	//if player is inside center area then throw back out
	kActor@ pActor = Player.Actor().CastToActor();
	const int areaID = pActor.AreaID();
    int arg6 = World.GetAreaArg(areaID, 5);
	if (arg6 == 32000 && pActor.Origin().z <= 0.0f)
	{
		Player.Actor().PlayerFlags() |= PF_NOAIRFRICTION;
		kVec3 v = (pActor.Origin() - Math::vecZero).Normalize() * 15.0f;
		v.z = 25.0f;
		pActor.Velocity() = v;
	}
	
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
// Update Boss
//------------------------------------------------------------------------------------------------------------------------
$script 2
{
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
// Update Cinematic Boss Intro
//------------------------------------------------------------------------------------------------------------------------
$script 3
{
    if (Camera.UserInterrupted())
    {
		EndBossIntro(instigator);
        return;
    }
    
	$restart;
}
//------------------------------------------------------------------------------------------------------------------------
// Start Cinematic Boss Intro
//------------------------------------------------------------------------------------------------------------------------
$script 4
{
	ClearHUDMessages();
	PlayLoop.RemoveBossActor();
	boss.AnimState().Set(anim_aiTeleportIn, 32.0f, 0);
	Camera.SetLookAtActor(boss);
	Camera.ClearFinalView();
	Camera.ClearViewTracks();
	Camera.SetFinalView(0);
	Camera.SetRotationTrack(0,
							Math::Deg2Rad(-75.0f),    // start angle
							Math::Deg2Rad(450.0f),  // dest angle
							250*GAME_SCALE,           // start distance
							220*GAME_SCALE,          // dest distance
							230*GAME_SCALE,          // start height
							220*GAME_SCALE,           // dest height
							100*GAME_SCALE,           // start look at height
							220*GAME_SCALE);          // dest look at height
									   
	Camera.AutoPlayRotationTrack(0, 12.0f, CMLT_COSINE);
	Camera.StartCinematic(CMF_NO_LETTERBOX | CMF_LOCK_PLAYER | CMF_UNLOCK_PLAYER_ON_FINISH | CMF_NO_INITIAL_FADEOUT);
	delay(0.1f);
	boss.AnimState().Blend(anim_event04, 200.0f, 200.0f, ANF_LOOP|ANF_BLEND); //hands in air
	delay(0.3f);
	CheckNotStarted();
	Game.CallDelayedMapScript(3, instigator, 0.0f); //Update Boss Intro
	delay(2.2f);
	Game.PlaySound("sounds/shaders/trex_scream.ksnd");
	boss.StepHeight() = 0.0f; //flaming rocks msg
	World.TriggerActorsByTID(instigator, boss.TID()); //trigger boss spawn flaming rocks
	delay(0.1f);
	boss.StepHeight() = 0.0f; //flaming rocks msg
	World.TriggerActorsByTID(instigator, boss.TID()); //trigger boss spawn flaming rocks
	spawnedIntroRocks = true;
	delay(5.0f);
	//boss.AnimState().Blend(anim_aiTeleportOut, 12.0f, 24.0f, ANF_LOOP|ANF_BLEND);
	//delay(6.0f);
	EndBossIntro(instigator);
}
//------------------------------------------------------------------------------------------------------------------------
// Start Cinematic Boss Death
//------------------------------------------------------------------------------------------------------------------------
$script 5
{
	Game.HaltMapScript(2); //Update Boss
	PlayLoop.RemoveBossActor();
	Camera.SetLookAtActor(boss);
	Camera.ClearFinalView();
	Camera.ClearViewTracks();
	Camera.SetFinalView(0);
	Camera.SetRotationTrack(0,
							Math::Deg2Rad(-90.0f),    // start angle
							Math::Deg2Rad(0.0f),  // dest angle
							250*GAME_SCALE,           // start distance
							220*GAME_SCALE,          // dest distance
							230*GAME_SCALE,          // start height
							220*GAME_SCALE,           // dest height
							100*GAME_SCALE,           // start look at height
							220*GAME_SCALE);          // dest look at height
									   
	Camera.AutoPlayRotationTrack(0, 6.0f, CMLT_COSINE);
	Camera.StartCinematic(CMF_NO_LETTERBOX | CMF_LOCK_PLAYER | CMF_UNLOCK_PLAYER_ON_FINISH);
	delay(0.4f);
	Game.PlaySound("sounds/shaders/trex_scream.ksnd");
	delay(5.0f);
	Camera.StopCinematic();
	PlayLoop.StartWarp(Player.Actor().CastToActor(), 1000, 113);
}
//------------------------------------------------------------------------------------------------------------------------
void EndBossIntro(kActor@ instigator)
{
	PlayLoop.TagActorForBossBar(boss);
	boss.AnimState().Blend(anim_aiStanding, 12.0f, 24.0f, ANF_LOOP|ANF_BLEND);
	boss.StepHeight() = 1.0f; //set boss state to think
	World.TriggerActorsByTID(instigator, boss.TID()); //trigger set boss state to think
	
	if (!spawnedIntroRocks)
	{
		boss.StepHeight() = 0.0f; //flaming rocks msg
		World.TriggerActorsByTID(instigator, boss.TID()); //trigger boss spawn flaming rocks
		delay(0.1f);
		boss.StepHeight() = 0.0f; //flaming rocks msg
		World.TriggerActorsByTID(instigator, boss.TID()); //trigger boss spawn flaming rocks
	}
	Game.HaltMapScript(3); //Update Boss Intro
	Game.HaltMapScript(4); //Start Boss Intro
	Camera.StopCinematic();
}
//------------------------------------------------------------------------------------------------------------------------
// Spawned Fireborn Killed
//------------------------------------------------------------------------------------------------------------------------
$script 9994
{
	if (ActorExists(spawnedFireborn))
	{
		spawnedFireborn.Health() = Math::Max(spawnedFireborn.Health() - 1, 0);
	}
}
//------------------------------------------------------------------------------------------------------------------------
// Enemy Killed
//------------------------------------------------------------------------------------------------------------------------
$script 9999
{
	if (instigator.TID() == boss.TID())
	{
		Game.CallDelayedMapScript(5, instigator, 0.0f); //Start Boss Death Cinematic
	}
}
//------------------------------------------------------------------------------------------------------------------------
