/*********************************************************************//**
*	\brief Manazer zbrani
*	Manager ovlada vsechny zbrane. Provadi nastavovani zbrani, jejich vymenu
*	za dalsi v inventari, provadi utoky, nabijeni. Dale spousti vykreslovani
*	zbrane a jeji aktualizace. Navic vytvari efekt odporu zbrane.
*
*	\author Michal Jirous
*	\date 9.12.2008
*	\file ctrl_weapon_manager.h
**********************************************************************/

#ifndef __WEAPON_MANAGER_H__
#define __WEAPON_MANAGER_H__

#include "weapons.h"
#include "interpolation.h"
#include "crosshairs.h"

/** @brief Oddeleny prostor pro zbranovy manazer. */
namespace weapon_manager
{
	/** @brief Typy prikazu. */
	enum command_types
	{
		COMMAND_ATTACK = 0,	/*!< @brief Primarni utok. */
		COMMAND_ATTACK2,	/*!< @brief Sekundarni utok. */
		COMMAND_RELOAD,		/*!< @brief Nabijeni. */


		COMMAND_COUNT		/*!< @brief Celkovy pocet prikazu. */
	};

	extern bool commandsActivity[COMMAND_COUNT];	/*!< @brief Pole indikujici aktivaci prikazu. */
	
	//non-pulse commands
	void attack( void *param );		/*!< @brief Funkce primarniho utoku. */
	void attack2( void *param );	/*!< @brief Funkce sekundarniho utoku. */
	void reload( void *param );		/*!< @brief Funkce nabijeni. */

	//simple pulse commands
	void nextweapon( void *param );	/*!< @brief Funkce prepnuti na zbran s vyssim indexem. */
	void prevweapon( void *param );	/*!< @brief Funkce prepnuti na zbran s nizsim indexem. */
	void setweapon( void *param );	/*!< @brief Prime nastaveni zbrane. */

	const float V_DEFLECTION_MAX = 2.0f;	/*!< @brief Maximalni deformace pohledu ve vertikalni rovine. */
	const float H_DEFLECTION_MAX = 2.0f;	/*!< @brief Maximalni deformace pohledu v horizontalni rovine. */

	/** @brief Hlavni obsluhujici trida zbranoveho manageru. */
	class CWeaponManager
	{
		unsigned int m_uiCurrentWeapon;
		float m_fHorizontalDeflection, m_fVerticalDeflection;
		float aH, aV;
		bool m_bDeflecting;
		Interpolation m_WeaponInterpolation;
	public:
		CWeaponManager();		/*!< @brief Kostruktor inicializuje vsechna data. */
		void run();				/*!< @brief Funkce aktualizace dat. */
		void draw();			/*!< @brief Funkce vykreslovani. */
		void reset();			/*!< @brief Resetovani vsech hodnot. */
		void pulse( bool pulse );	/*!< @brief Provedeni prikazu. */
		BasicWeapon *getCurrentWeaponPointer();	 /*!< @brief Zjisteni aktualne drzene zbrane. */
		unsigned int getCurrentWeapon() /*!< @brief Zjisti identifikacni cislo aktualne drzene zbrane. */{ return m_uiCurrentWeapon; }
		void setWeapon( unsigned int weaponId );	/*!< @brief Nastavi zbran dle Id. */
		void addHDeflection( float deflection );	/*!< @brief Prida deformaci v horizontalni rovine. */
		void addVDeflection( float deflection );	/*!< @brief Prida deformaci ve vertikalni rovine. */
		void removeAllWeapons();
	};

	extern CWeaponManager weaponManager;	/*!< @brief Globalni instance zbranoveho manageru, ktera je pro beh hry dostatecna. */
};

#endif
