/*********************************************************************//**
*	\brief Implementace zbrane: MP5 (Samopal).
*	
*	\author Michal Jirous
*	\date 9.12.2008
*	\file wpn_mp5.cpp
**********************************************************************/

#include "wpn_mp5.h"
#include "ctrl_var_definition.h"
#include "game.h"
#include "crosshairs.h"

using namespace modelLib;

enum
{
	IDLE = 0,
	RELOAD,
	DRAW,
	SHOOT1,
	SHOOT2,
	SHOOT3
};



WeaponMP5::WeaponMP5( ) : BasicWeapon( )
{
	m_pMaxStackAmmo = gamevarsLibrary::getVariable( vardef::WEAPON_MP5_MAX_NAME );
	if( m_pMaxStackAmmo )
	{
		m_iMaxAmmoAmount = m_iAmmoAmount = gamevarsLibrary::getiData( m_pMaxStackAmmo );
	}
	m_iAmmoType = AMMO_9MM;
	m_bNeedAmmo = true;
	setModel( "v_mp5.mdl" );
	soundLibrary.loadSound( m_ShootSound1, "weapons/mp5/mp5-1.wav" );
	soundLibrary.loadSound( m_ClipOut, "weapons/mp5/mp5_clipout.wav");
	soundLibrary.loadSound( m_ClipIn, "weapons/mp5/mp5_clipin.wav");
	soundLibrary.loadSound( m_SliderRelease, "weapons/mp5/mp5_slideback.wav" );
	m_pPrimaryAttackDmg = gamevarsLibrary::getVariable( vardef::WEAPON_MP5_DMG_NAME );
	m_iCrosshair = CROSSHAIR_DEFAULT;
}

void WeaponMP5::primaryAttack( bool pulse )
{
	if( m_iAmmoAmount > 0 && playAnimation( SHOOT1, 100 ))
	{
		m_ShootSound1.play();
		int iDamage = gamevarsLibrary::getiData( m_pPrimaryAttackDmg );
		AttackInfo info;
		basic_fight( iDamage, info, INFINITE_DISTANCE, dmg::BULLET );
		m_iAmmoAmount--;
	}

}


void WeaponMP5::reload( bool pulse )
{
	if( game.m_pPlayer && m_iAmmoAmount < m_iMaxAmmoAmount && game.m_pPlayer->AmmoAndWeapons.getAmmoAmount( m_iAmmoType ) > 0 )
	{
		if( playAnimation( RELOAD, 3000, false, NORMAL_LOCK, (WpnFunc)&WeaponMP5::finnish, this ) )
		{

			soundLibrary.postSoundPlay( &m_ClipOut, 500 );
			soundLibrary.postSoundPlay( &m_ClipIn, 1550 );
			soundLibrary.postSoundPlay( &m_SliderRelease, 2200 );
			//m_ClipOut.play();
		}
	}

}

void WeaponMP5::finnish()
{	
	if( game.m_pPlayer )
	{

		AmmoElement *pAmmo = game.m_pPlayer->AmmoAndWeapons.getAmmo( m_iAmmoType );
		unsigned int totalammo = pAmmo->getAmount();
		unsigned int canuse = m_iMaxAmmoAmount - m_iAmmoAmount;
		unsigned int change = min( totalammo, canuse );
		m_iAmmoAmount+=change;
		pAmmo->removeAmmo( change );
	}
}

void WeaponMP5::grab()
{
	playAnimation( DRAW, 1500 );
}


void WeaponMP5::idle()
{
	playAnimation( IDLE, 2000, true, UNLOCKED );
}

void WeaponMP5::secondaryAttack( bool pulse )
{

}

WeaponMP5::~WeaponMP5()
{
	soundLibrary.unloadSound( m_ShootSound1 );
	soundLibrary.unloadSound( m_ClipOut );
	soundLibrary.unloadSound( m_ClipIn );
	soundLibrary.unloadSound( m_SliderRelease );
}
