//========= Copyright © 1996-2002, Valve LLC, All rights reserved. ============
//
// Purpose: A stationary gun that players can man
//
// $NoKeywords: $
//=============================================================================

#ifndef TF_VEHICLE_MORTAR_H
#define TF_VEHICLE_MORTAR_H

#ifdef _WIN32
#pragma once
#endif

#include "tf_basefourwheelvehicle.h"
#include "vphysics/vehicles.h"


// ------------------------------------------------------------------------ //
// A wagon that players can build one object on the back of
// ------------------------------------------------------------------------ //
class CVehicleMortar : public CBaseTFFourWheelVehicle
{
	DECLARE_CLASS( CVehicleMortar, CBaseTFFourWheelVehicle );

public:
	DECLARE_SERVERCLASS();

	static CVehicleMortar* Create(const Vector &vOrigin, const QAngle &vAngles);

					CVehicleMortar();

	virtual void	Spawn();
	virtual void	Precache();
	virtual void	GetControlPanelInfo( int nPanelIndex, const char *&pPanelName );
	virtual bool	CanTakeEMPDamage( void ) { return true; }
	virtual bool	ClientCommand( CBaseTFPlayer *pPlayer, const char *pCmd, ICommandArguments *pArg );

	// Vehicle overrides
	virtual bool	IsPassengerVisible( int nRole ) { return true; }
	virtual void	OnFinishedDeploy( void );
	virtual void	OnFinishedUnDeploy( void );
	virtual void SetPassenger( int nRole, CBasePlayer *pEnt );

protected:
	virtual bool CanGetInVehicle( CBaseTFPlayer *pPlayer );

	// Here's where we deal with weapons
	virtual void	OnItemPostFrame( CBaseTFPlayer *pDriver );

	// Called when we are deployed.
	void ElevationThink();

	void UpdateElevation( const Vector &vecTargetVel );

	bool CalcFireInfo( 
		float flFiringPower, 
		float flFiringAccuracy, 
		bool bRangeUpgraded, 
		bool bAccuracyUpgraded,
		Vector &vStartPt,
		Vector &vecTargetVel,
		float &fallTime
		);

	bool FireMortar( float flFiringPower, float flFiringAccuracy, bool bRangeUpgraded, bool bAccuracyUpgraded );

private:
	void NextFireThink();
	
	// Start/end the attack
	void StartAttack();
	void FinishAttack();

	void AttackThink();

	int	m_nBuildPoint;

	CNetworkVar( float, m_flMortarYaw );
	CNetworkVar( float, m_flMortarPitch );	// Elevation angle, recalculated periodically.

	CNetworkVar( bool, m_bAllowedToFire );
};

#endif // TF_VEHICLE_MORTAR_H
