//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "plasmaprojectile_shared.h"

#define PLASMA_LIFETIME				2.0

ConVar	plasma_gravity( "plasma_gravity","1000", FCVAR_REPLICATED, "Plasma gravity" );
ConVar	plasma_drag( "plasma_drag","2", FCVAR_REPLICATED, "Plasma drag" );


//-----------------------------------------------------------------------------
// Setup state needed to perform the physics computation
//-----------------------------------------------------------------------------
void CPlasmaProjectileShared::Init( const Vector &vecStart, const Vector &vecDir, float flSpawnSpeed )
{
	m_vecSpawnPosition = vecStart;
	m_vTracerDir = vecDir;
	m_flSpawnSpeed = flSpawnSpeed;
}

void CPlasmaProjectileShared::SetSpawnTime( float flSpawnTime )
{
	m_flSpawnTime = flSpawnTime;
}

void CPlasmaProjectileShared::SetDeathTime( float flDeathTime )
{
	m_flDeathTime = flDeathTime;
}


//-----------------------------------------------------------------------------
// Perform custom physics on this dude (when we're in ballistic mode)
//-----------------------------------------------------------------------------
void CPlasmaProjectileShared::ComputePosition( float flTime, Vector *pNewPosition, Vector *pNewVelocity, QAngle *pNewAngles, QAngle *pNewAngVelocity )
{
	float flLifeTime = flTime - m_flSpawnTime;
	if (flLifeTime < 0)
		return;

	// Travel ballistically until we run out of juice..
	if (flTime <= m_flDeathTime)
	{
		VectorMultiply( m_vTracerDir, m_flSpawnSpeed, *pNewVelocity );
		VectorMA( m_vecSpawnPosition, flLifeTime, *pNewVelocity, *pNewPosition );
	}
	else
	{
		VectorMultiply( m_vTracerDir, m_flSpawnSpeed, *pNewVelocity );
		VectorMA( m_vecSpawnPosition, m_flDeathTime - m_flSpawnTime, *pNewVelocity, *pNewPosition );

		// Ran out of juice... fall!
		float flFallTime = flTime - m_flDeathTime;

		float flDragFactor = exp( -plasma_drag.GetFloat() * flFallTime );
		*pNewVelocity *= flDragFactor;

		float flDist = (m_flSpawnSpeed / plasma_drag.GetFloat()) * ( 1.0f - flDragFactor );
		VectorMA( *pNewPosition, flDist, m_vTracerDir, *pNewPosition );

		// Add in the effects of gravity!
		pNewVelocity->z -= flFallTime * plasma_gravity.GetFloat();
		pNewPosition->z -= 0.5f * plasma_gravity.GetFloat() * flFallTime * flFallTime; 
	}
}