/*********************************************************************//**
*	\brief 3D General sounds.
*	V tomto souboru jsou definovany Pooly casto pouzivanych zvuku.
*
*	\author Michal Jirous
*	\date 09.04..2009
*	\file general_sounds.h
**********************************************************************/

#ifndef __GENERAL_SOUNDS_H__
#define __GENERAL_SOUNDS_H__

#include "soundslib.h"
#include "textureslib.h"
enum
{
	SOUND_LOCKED_1 = 0,
	SOUND_LOCKED_2_LATCH,
	LOCKED_SOUNDS_COUNT
};

enum
{
	SOUND_UNLOCKED_1 = 0,
	UNLOCKED_SOUNDS_COUNT
};

/* Pozor: tento enum koresponduje s enum v textureslib.h ohledne materialu,
takze zacatek musi byt stejny jako v textureslib.h */
enum
{
	SOUND_MATERIAL_CONCRETE = 0,
	SOUND_MATERIAL_SAND,
	SOUND_MATERIAL_METAL,
	SOUND_MATERIAL_WOOD,
	SOUND_MATERIAL_FLESH,
	SOUND_MATERIAL_GLASS,
	SOUND_MATERIAL_SNOW,
	SOUND_FALLPAIN,
	SOUND_LADDER,

	STEP_SOUND_USAGE_COUNT
};



namespace general_sounds
{
	/* Zvuky pri chuzi po materialu */
	enum 
	{
		STEP_CONCRETE_1 = 0,
		STEP_CONCRETE_2,
		STEP_CONCRETE_3,
		STEP_CONCRETE_4,

		STEP_SAND_1,
		STEP_SAND_2,
		STEP_SAND_3,
		STEP_SAND_4,

		STEP_METAL_1,
		STEP_METAL_2,
		STEP_METAL_3,
		STEP_METAL_4,

		STEP_WOOD_1,
		STEP_WOOD_2,
		STEP_WOOD_3,
		STEP_WOOD_4,
		STEP_WOOD_5,

		STEP_SNOW_1,
		STEP_SNOW_2,
		STEP_SNOW_3,
		STEP_SNOW_4,

		STEP_FALL_1,
		STEP_FALL_2,

		STEP_LADDER_1,
		STEP_LADDER_2,
		STEP_LADDER_3,

		STEP_TOTAL_COUNT
	};

	const int STEP_SOUNDS_COUNT = STEP_SOUND_USAGE_COUNT;
	const int STEP_ELEM_COUNT[STEP_SOUNDS_COUNT] = { 4, 4, 4, 5, 4, 4, 4, 2, 3 };	//concrete, sand, metal, wood, flesh, glass, snow, fall, ladder
	const int STEP_ELEM_START[STEP_SOUNDS_COUNT] = { STEP_CONCRETE_1, STEP_SAND_1, STEP_METAL_1, STEP_WOOD_1, STEP_CONCRETE_1, STEP_CONCRETE_1, STEP_SNOW_1, STEP_FALL_1, STEP_LADDER_1 };

	/* Zvuky pri niceni materialu */
	enum 
	{
		HURT_CONCRETE_1 = 0,
		HURT_METAL_1,
		HURT_WOOD_1,
		HURT_FLESH_1,
		HURT_GLASS_1,
	
		HURT_TOTAL_COUNT
	};

	const int HURT_SOUNDS_COUNT = TEXTURE_MATERIALS_COUNT;
	const int HURT_ELEM_COUNT[HURT_SOUNDS_COUNT] = { 1, 0, 1, 1, 1, 1, 0 };//stejne jako materialy
	const int HURT_ELEM_START[HURT_SOUNDS_COUNT] = { HURT_CONCRETE_1, HURT_CONCRETE_1, HURT_METAL_1, HURT_WOOD_1, HURT_FLESH_1, HURT_GLASS_1, HURT_CONCRETE_1 };


	/* Zvuky pri uplnem zniceni */
	enum 
	{
		DESTROY_CONCRETE_1 = 0,
		DESTROY_METAL_1,
		DESTROY_WOOD_1,
		DESTROY_FLESH_1,
		DESTROY_GLASS_1,
	
		DESTROY_TOTAL_COUNT
	};

	const int DESTROY_SOUNDS_COUNT = TEXTURE_MATERIALS_COUNT;
	const int DESTROY_ELEM_COUNT[DESTROY_SOUNDS_COUNT] = { 1, 0, 1, 1, 1, 1, 0 };	//stejne jako materialy
	const int DESTROY_ELEM_START[DESTROY_SOUNDS_COUNT] = { DESTROY_CONCRETE_1, DESTROY_CONCRETE_1, DESTROY_METAL_1, DESTROY_WOOD_1, DESTROY_FLESH_1, DESTROY_GLASS_1, DESTROY_CONCRETE_1 };
	
	class GeneralSounds
	{
		


		SoundElemPool<STEP_TOTAL_COUNT> m_StepSounds;
		SoundElemPool<HURT_TOTAL_COUNT> m_HurtSounds;
		SoundElemPool<DESTROY_TOTAL_COUNT> m_DestroySounds;
	public:
		GeneralSounds();
		
		void init();	//add sounds to pool
		void playStepSound( const unsigned int type, SoundElement &elem );
		void playHurtSound( const unsigned int type, SoundElement &elem );
		void playDestroySound( const unsigned int type, SoundElement &elem );

		bool setLockSound( const unsigned type, SoundElement &elem );
		bool setUnLockSound( const unsigned type, SoundElement &elem );
		
		void destroy();
	};

	
	

	const std::string STEP_SOUNDS[STEP_TOTAL_COUNT] = {
		"Steps/pl_step1.wav",
		"Steps/pl_step2.wav",
		"Steps/pl_step3.wav",
		"Steps/pl_step4.wav",
		"Steps/pl_dirt1.wav",
		"Steps/pl_dirt2.wav",
		"Steps/pl_dirt3.wav",
		"Steps/pl_dirt4.wav",
		"Steps/pl_metal1.wav",
		"Steps/pl_metal2.wav",
		"Steps/pl_metal3.wav",
		"Steps/pl_metal4.wav",
		"Steps/pl_tile1.wav",
		"Steps/pl_tile2.wav",
		"Steps/pl_tile3.wav",
		"Steps/pl_tile4.wav",
		"Steps/pl_tile5.wav",
		"Steps/pl_snow1.wav",
		"Steps/pl_snow2.wav",
		"Steps/pl_snow3.wav",
		"Steps/pl_snow4.wav",
		"Steps/pl_fallpain1.wav",
		"Steps/pl_fallpain2.wav",
		"Steps/LadderClink1.wav",
		"Steps/LadderClink2.wav",
		"Steps/LadderClink3.wav"
	};



	const std::string HURT_SOUNDS[HURT_TOTAL_COUNT] = {
		"Hurt/concrete1.wav",
		"Hurt/metal1.wav",
		"Hurt/wood1.wav",
		"Hurt/flesh1.wav",
		"Hurt/glass1.wav"
	};

	const std::string DESTROY_SOUNDS[DESTROY_TOTAL_COUNT] = {
		"Destroy/bustconcrete1.wav",
		"Destroy/bustmetal2.wav",
		"Destroy/bustcrate1.wav",
		"Destroy/bustflesh1.wav",
		"Destroy/bustglass1.wav"
	};


	const std::string LOCKED_SOUNDS[LOCKED_SOUNDS_COUNT] = {
		"Locked/locked01_buzz.wav",
		"Locked/locked02_latch.wav"
	};
	const std::string UNLOCKED_SOUNDS[UNLOCKED_SOUNDS_COUNT] = { "Locked/locked01_buzz.wav" };
};







extern general_sounds::GeneralSounds generalSounds;











//const std::string SHOT_SOUNDS[SHOT_SOUNDS_COUNT] = {""};

//const int	SHOT_CONCRETE = STEP_CONCRETE_1;
//const int	SHOT_SAND = STEP_SAND_1;
//const int	SHOT_METAL = STEP_METAL_1;
//const int	SHOT_WOOD = STEP_WOOD_1;
//const int	SHOT_SOUND_COUNT = 4;



#endif /*__GENERAL_SOUNDS_H__*/
