/*********************************************************************//**
*	Sklad zbrani a naboju.
*	Implementace objektu, ktery udrzuje informace o zbranich
*	a poctech naboju.
*
*	author: Michal Jirous
*	date: 8.12.2008
*	file: war_storage.cpp
**********************************************************************/

#include "war_storage.h"
#include "ctrl_gamevars.h"
#include "mathematic.h"
#include "soundslib.h"
#include "sys_snd_reserv.h"

WarStorage::WarStorage()
{
	memset( weapons, NULL, sizeof( weapons ) );
}

WarStorage::~WarStorage()
{
	for( int i = 0; i < WEAPONS_COUNT; i++ )
		delete weapons[i];
}

void WarStorage::init( )
{
	soundLibrary.pushAttrib();
	soundLibrary.setDefaultRelativity( AL_TRUE );
	soundLibrary.setDefaultForceSourceUse( AL_TRUE );
	soundLibrary.setDefaultSourdeId( RESERVED_SND_PLAYER_WEAPONS );

	for( int i = 0; i < AMMO_COUNT; i++ )
		ammunition[i].setType( i );
	for( int i = 0; i < WEAPONS_COUNT; i++ )
		if( !weapons[i] )
			weapons[i] = createWeapon( i );

	soundLibrary.popAttrib();
}


/** @param ammo_type Identifikacni cislo naboju. 
*	@return Ukazatel na objekt naboje.
*/
AmmoElement *WarStorage::getAmmo( unsigned int ammo_type )
{
	ammo_type %= AMMO_COUNT;

	return &ammunition[ammo_type];
}

/** @param weapon_type Identifikacni cislo zbrane.
*	@return Ukazatel na objekt zbrane.
*/
BasicWeapon* WarStorage::getWeapon( unsigned int weapon_type )
{
	weapon_type %= WEAPONS_COUNT;

	return weapons[weapon_type];
}

/** @param ammo_type Identifikacni cislo naboju. 
*	@return Mnozstvi naboju zadanych parametrem. 
*/
unsigned int WarStorage::getAmmoAmount( unsigned int ammo_type )
{
	return ammunition[ammo_type%AMMO_COUNT].getAmount();
}

/** @param ammo_type Identifikacni cislo naboju. 
*	@param amount Mnozstvi naboju. 
*/
void WarStorage::addAmmo( unsigned int ammo_type, unsigned int amount )
{
	ammunition[ammo_type%AMMO_COUNT].addAmmo(amount);
}

/** @param ammo_type Identifikacni cislo naboju. 
*	@param amount Mnozstvi naboju. 
*/
void WarStorage::removeAmmo( unsigned int ammo_type, unsigned int amount )
{
	ammunition[ammo_type%AMMO_COUNT].removeAmmo(amount);
}

/** @param ammo_type Identifikacni cislo naboju. 
*	@param amount Mnozstvi naboju. 
*/
void WarStorage::setAmmo( unsigned int ammo_type, unsigned int amount )
{
	ammunition[ammo_type%AMMO_COUNT].setAmount(amount);
}

