//Do initial setup throught Unity Start function.
	void Start()
	{
		controller = GetComponent<KartControllerCustom>();
		SetInitialValues();
		ResetAll();
	}
	//This function takes the current car rates from the controller, and applies modifications to them based on certain states
	public float[] CalculateRates(KartControllerCustom.DrivingState drivingState, float maxSpeed, float currentTurnRate, bool slowing, bool onTerrain, bool holdDrift)
	{
		float[] kartPhysicsValues = new float[2];

		if(speedModded)
			speedModded = false;
		else
			currentSpeed = maxSpeed;



		switch(drivingState)
		{
		case KartControllerCustom.DrivingState.forward:
			if(currentTurnRate < -modifiedTurnRateAcceleration*2)
				currentTurnRate += modifiedTurnRateAcceleration*2;
			else if(currentTurnRate > modifiedTurnRateAcceleration*2)
				currentTurnRate -= modifiedTurnRateAcceleration*2;
			else
				currentTurnRate = 0;
			
			if(currentSpeed < modifiedStraightLineSpeed && !slowing && !onTerrain)
			{
				currentSpeed += modifiedStraightLineAcceleration;
			}
			else if(currentSpeed > modifiedStraightLineSpeed)
			{
				currentSpeed -= modifiedSlowingDeceleration;
			}
			
			rigidbody.drag = groundDrag;
			break;
			
		case KartControllerCustom.DrivingState.left:
			if(currentTurnRate > 0)
			{
				currentTurnRate -= modifiedTurnRateAcceleration * 6;
			}
			else if(currentTurnRate > -modifiedMaxTurnRate)
			{
				currentTurnRate -= modifiedTurnRateAcceleration;
			}
			else if(currentTurnRate < -modifiedMaxTurnRate)
			{
				currentTurnRate += modifiedTurnRateAcceleration;
			}
			else
				currentTurnRate = -modifiedMaxTurnRate;
			
			if(currentSpeed > modifiedStraightLineSpeed - (modifiedStraightLineSpeed - modifiedTurningSpeed ) && !onTerrain)
			{
				currentSpeed -= modifiedTurningAntiAcceleration;
			}
			else if(currentSpeed < modifiedStraightLineSpeed - (modifiedStraightLineSpeed - modifiedTurningSpeed)  && !onTerrain)
				currentSpeed += modifiedStraightLineAcceleration;
			
			rigidbody.drag = groundDrag;
			break;
			
		case KartControllerCustom.DrivingState.right:
			if(currentTurnRate < 0)
			{
				currentTurnRate += modifiedTurnRateAcceleration * 6;
			}
			else if(currentTurnRate < modifiedMaxTurnRate)
				currentTurnRate += modifiedTurnRateAcceleration;
			else if(currentTurnRate > modifiedMaxTurnRate)
				currentTurnRate -= modifiedTurnRateAcceleration;
			else
				currentTurnRate = modifiedMaxTurnRate;
			
			if(currentSpeed > modifiedStraightLineSpeed - (modifiedStraightLineSpeed - modifiedTurningSpeed)  && !onTerrain)
			{
				currentSpeed -= modifiedTurningAntiAcceleration;
			}
			else if( currentSpeed < modifiedStraightLineSpeed - (modifiedStraightLineSpeed - modifiedTurningSpeed)  && !onTerrain)
				currentSpeed += modifiedStraightLineAcceleration;
			
			rigidbody.drag = groundDrag;
			break;
			
		case KartControllerCustom.DrivingState.driftLeft:
			if(!holdDrift)
			{
				if(currentTurnRate > 0)
				{
					currentTurnRate -= modifiedDrift_turnRateAcceleration * 3;
				}
				else if(currentTurnRate > -modifiedDrift_maxTurnRate)
				{
					currentTurnRate -= modifiedDrift_turnRateAcceleration;
				}
				else if(currentTurnRate < -modifiedDrift_maxTurnRate)
				{
					currentTurnRate += modifiedDrift_turnRateAcceleration;
				}
				else
					currentTurnRate = -modifiedDrift_maxTurnRate;
				
				if(currentSpeed > modifiedDrift_turningSpeed   && !onTerrain)
				{
					currentSpeed -= modifiedDrift_turningAntiAcceleration;
				}
				else if(currentSpeed < modifiedDrift_turningSpeed  && !onTerrain)
					currentSpeed += modifiedStraightLineAcceleration;
				
				rigidbody.drag = drift_groundDrag;
			}
			else if(holdDrift)
			{
				if(currentTurnRate > 0)
				{
					currentTurnRate -= modifiedFeatherDrift_turnRateAcceleration * 3;
				}
				else if(currentTurnRate > -modifiedFeatherDrift_maxTurnRate)
				{
					currentTurnRate -= modifiedFeatherDrift_turnRateAcceleration;
				}
				else if(currentTurnRate < -modifiedFeatherDrift_maxTurnRate)
				{
					currentTurnRate += modifiedFeatherDrift_turnRateAcceleration;
				}
				else
					currentTurnRate = -modifiedFeatherDrift_maxTurnRate;
				
				if(currentSpeed > modifiedFeatherDrift_turningSpeed  && !onTerrain)
				{
					currentSpeed -= modifiedFeatherDrift_turningAntiAcceleration;
				}
				else if(currentSpeed < modifiedFeatherDrift_turningSpeed  && !onTerrain)
					currentSpeed += modifiedStraightLineAcceleration;
				
				rigidbody.drag = featherDrift_groundDrag;
			}
			
			
			break;
			
		case KartControllerCustom.DrivingState.driftRight:
			if( !holdDrift )
			{
				
				if(currentTurnRate < 0)
				{
					currentTurnRate += modifiedDrift_turnRateAcceleration *3;
				}
				else if(currentTurnRate < modifiedDrift_maxTurnRate)
				{
					currentTurnRate += modifiedDrift_turnRateAcceleration;
				}
				else if(currentTurnRate > modifiedDrift_maxTurnRate)
				{
					currentTurnRate -= modifiedDrift_turnRateAcceleration;
				}
				else
					currentTurnRate = modifiedDrift_maxTurnRate;
				
				if(currentSpeed > modifiedDrift_turningSpeed  && !onTerrain)
				{
					currentSpeed -= modifiedDrift_turningAntiAcceleration;
				}
				else if( currentSpeed < modifiedDrift_turningSpeed  && !onTerrain)
					currentSpeed += modifiedStraightLineAcceleration;
				
				rigidbody.drag = drift_groundDrag;
			}
			else if(holdDrift)
			{
				if(currentTurnRate < 0)
				{
					currentTurnRate += modifiedFeatherDrift_turnRateAcceleration *3;
				}
				else if(currentTurnRate < modifiedFeatherDrift_maxTurnRate)
				{
					currentTurnRate += modifiedFeatherDrift_turnRateAcceleration;
				}
				else if(currentTurnRate > modifiedFeatherDrift_maxTurnRate)
				{
					currentTurnRate -= modifiedFeatherDrift_turnRateAcceleration;
				}
				else
					currentTurnRate = modifiedFeatherDrift_maxTurnRate;
				
				if(currentSpeed > modifiedFeatherDrift_turningSpeed  && !onTerrain)
				{
					currentSpeed -= modifiedFeatherDrift_turningAntiAcceleration;
				}
				else if( currentSpeed < modifiedFeatherDrift_turningSpeed  && !onTerrain)
					currentSpeed += modifiedStraightLineAcceleration;
				
				rigidbody.drag = featherDrift_groundDrag;
			}
			break;
			
		case KartControllerCustom.DrivingState.stopped:
			currentTurnRate = 0;
			currentSpeed = 0f;
			break;
			
		case KartControllerCustom.DrivingState.finished:
			break;
		}
		
		//apply slow for braking
		if(slowing && currentSpeed > brakingSpeed )
			currentSpeed -= brakingDeceleration;
		
		//apply slow for terrain
		if( onTerrain && currentSpeed > offTrackSpeed)
		{
			currentSpeed -= offTrackDeceleration;
			offTrackDeceleration += offTrackDecelerationRate;

		}
		else if(!onTerrain)
			offTrackDeceleration = offTrackDecelerationOriginal;

		kartPhysicsValues[0] = currentSpeed;
		kartPhysicsValues[1] = currentTurnRate;


		return kartPhysicsValues;

	}
	//The start function finds the approprite components on the current gameobject
	void Start()
	{
		kartBody = gameObject.GetComponent<KartControllerCustom>().kartBody;
		controller = GetComponent<KartControllerCustom>();
	}
 //The start function finds the approprite components on the current gameobject
 void Start()
 {
     kartBody   = gameObject.GetComponent <KartControllerCustom>().kartBody;
     controller = GetComponent <KartControllerCustom>();
 }
 //Do initial setup throught Unity Start function.
 void Start()
 {
     controller = GetComponent <KartControllerCustom>();
     SetInitialValues();
     ResetAll();
 }