#library "chasecam"
#include "zcommon.acs"

#define C_TID		1000	//Default camera tid
#define MAX_R		50	//Maximum radius (or distance from the player)
#define ADJUST_R	8	//Amount to adjust the camera by
#define VIEW_HEIGHT	100.0	//The approximate hight of the player's view

bool camera_mode[8];		//Variable for turning the camera on or off.

Script "BDStartCamera" (VOID)
{
	camera_mode[PlayerNumber ()] = ON;
	ACS_NamedExecuteAlways ("InitializeChasecam", 0, PlayerNumber ());
}


Script "InitializeChasecam" (int p_num)
{
	int r = MAX_R;
	
	while (camera_mode[p_num] == ON)
	{	
		int a = GetActorAngle (0);
		int p = GetActorPitch (0);
		int x = GetActorX (0);
		int y = GetActorY (0);
		int z = GetActorZ (0) + VIEW_HEIGHT;
		int xyr = r * cos (p) >> 16;
		
		if (!ThingCountName ("ChaseCam2", C_TID+p_num))
		{
			while (!Spawn ("ChaseCam2", x-cos(a)*xyr, y-sin(a)*xyr, z+sin(p)*r, C_TID+p_num, a >> 8) && r > 0)
			{
				r -= ADJUST_R;
				xyr = cos (p) * r >> 16;
			}
			
			if (ThingCountName ("ChaseCam2", C_TID + p_num))
				ChangeCamera (C_TID + p_num, 0, 0);
				
			else
			{
				camera_mode[p_num] = OFF;
				print (s:"Camera script failed to initialize.");
			}
		}





	        else
		{
			//while (!SetActorPosition (C_TID+p_num, x-cos(a)*xyr, y-sin(a)*xyr, z+sin(p)*r, 0) && r > 0)


			{
				r -= ADJUST_R;
				xyr = cos (p) * r >> 16;
			}
			SetActorAngle (C_TID + p_num, a);
			SetActorPitch (C_TID + p_num, p);
			
			if (r < MAX_R) 
                                r += ADJUST_R;
		}
		
		delay (2);
	}
}



Script "BDStartCamera2" (VOID)
{
	camera_mode[PlayerNumber ()] = ON;
	ACS_NamedExecuteAlways ("InitializeChasecam2", 0, PlayerNumber ());
}


Script "InitializeChasecam2" (int p_num)
{
	int r = MAX_R;
	
	while (camera_mode[p_num] == ON)
	{	
		int a = GetActorAngle (0);
		int p = GetActorPitch (0);
		int x = GetActorX (0);
		int y = GetActorY (0);
		int z = GetActorZ (0) + VIEW_HEIGHT;
		int xyr = r * cos (p) >> 16;
		
		if (!ThingCountName ("ChaseCam2Big", C_TID+p_num))
		{
			while (!Spawn ("ChaseCam2Big", x-cos(a)*xyr, y-sin(a)*xyr, z+sin(p)*r, C_TID+p_num, a >> 8) && r > 0)
			{
				r -= ADJUST_R;
				xyr = cos (p) * r >> 16;
			}
			
			if (ThingCountName ("ChaseCam2Big", C_TID + p_num))
				ChangeCamera (C_TID + p_num, 0, 0);
				
			else
			{
				camera_mode[p_num] = OFF;
				print (s:"Camera script failed to initialize.");
			}
		}





	        else
		{
			//while (!SetActorPosition (C_TID+p_num, x-cos(a)*xyr, y-sin(a)*xyr, z+sin(p)*r, 0) && r > 0)


			{
				r -= ADJUST_R;
				xyr = cos (p) * r >> 16;
			}
			SetActorAngle (C_TID + p_num, a);
			SetActorPitch (C_TID + p_num, p);
			
			if (r < MAX_R) 
                                r += ADJUST_R;
		}
		
		delay (2);
	}
}



Script "BDStartCamera3" (VOID)
{
	camera_mode[PlayerNumber ()] = ON;
	ACS_NamedExecuteAlways ("InitializeChasecam3", 0, PlayerNumber ());
}


Script "InitializeChasecam3" (int p_num)
{
	int r = MAX_R;
	
	while (camera_mode[p_num] == ON)
	{	
		int a = GetActorAngle (0);
		int p = GetActorPitch (0);
		int x = GetActorX (0);
		int y = GetActorY (0);
		int z = GetActorZ (0) + VIEW_HEIGHT;
		int xyr = r * cos (p) >> 16;
		
		if (!ThingCountName ("ChaseCam3Big", C_TID+p_num))
		{
			while (!Spawn ("ChaseCam3Big", x-cos(a)*xyr, y-sin(a)*xyr, z+sin(p)*r, C_TID+p_num, a >> 8) && r > 0)
			{
				r -= ADJUST_R;
				xyr = cos (p) * r >> 16;
			}
			
			if (ThingCountName ("ChaseCam3Big", C_TID + p_num))
				ChangeCamera (C_TID + p_num, 0, 0);
				
			else
			{
				camera_mode[p_num] = OFF;
				print (s:"Camera script failed to initialize.");
			}
		}





	        else
		{
			//while (!SetActorPosition (C_TID+p_num, x-cos(a)*xyr, y-sin(a)*xyr, z+sin(p)*r, 0) && r > 0)


			{
				r -= ADJUST_R;
				xyr = cos (p) * r >> 16;
			}
			SetActorAngle (C_TID + p_num, a);
			SetActorPitch (C_TID + p_num, p);
			
			if (r < MAX_R) 
                                r += ADJUST_R;
		}
		
		delay (2);
	}
}



//Helicopter Camera


Script "BDStartCamera4" (VOID)
{
	camera_mode[PlayerNumber ()] = ON;
	ACS_NamedExecuteAlways ("InitializeChasecam4", 0, PlayerNumber ());
}


Script "InitializeChasecam4" (int p_num)
{
	int r = MAX_R;
	
	while (camera_mode[p_num] == ON)
	{	
		int a = GetActorAngle (0);
		int p = GetActorPitch (0);
		int x = GetActorX (0);
		int y = GetActorY (0);
		int z = GetActorZ (0) + VIEW_HEIGHT;
		int xyr = r * cos (p) >> 16;
		
		if (!ThingCountName ("ChaseCam4Big", C_TID+p_num))
		{
			while (!Spawn ("ChaseCam4Big", x-cos(a)*xyr, y-sin(a)*xyr, z+sin(p)*r, C_TID+p_num, a >> 8) && r > 0)
			{
				r -= ADJUST_R;
				xyr = cos (p) * r >> 16;
			}
			
			if (ThingCountName ("ChaseCam4Big", C_TID + p_num))
				ChangeCamera (C_TID + p_num, 0, 0);
				
			else
			{
				camera_mode[p_num] = OFF;
				print (s:"Camera script failed to initialize.");
			}
		}





	        else
		{
			//while (!SetActorPosition (C_TID+p_num, x-cos(a)*xyr, y-sin(a)*xyr, z+sin(p)*r, 0) && r > 0)


			{
				r -= ADJUST_R;
				xyr = cos (p) * r >> 16;
			}
			SetActorAngle (C_TID + p_num, a);
			SetActorPitch (C_TID + p_num, p);
			
			if (r < MAX_R) 
                                r += ADJUST_R;
		}
		
		delay (2);
	}
}


Script "BDStopCamera" (VOID)
{
	camera_mode[PlayerNumber ()] = OFF;
	Thing_Remove (C_TID + PlayerNumber ());
}

Script "BDDisableCameraDisconnect" (int p_num) DISCONNECT
{
       camera_mode[p_num] = OFF;
       Thing_Remove (C_TID + p_num);
}