
#include <oslib/oslib.h>

////////declaration
extern OSL_FONT *maFonte;
//pour le fond
extern OSL_IMAGE *Fond2;
//creer ds objet pour le viseur
extern OSL_OBJECT *Player;
//creer un son
OSL_SOUND *valide;
//information de la largeur entre les bulles
#define Espace 5
//information du nombre de bulles en largeur le + 1 et pour fixer la derniere ligne
#define Nb_Large (480/(31 + Espace)) + 1
//information du nombre de ligne pour les bulles le + 1 et pour fixer la derniere ligne
#define Nb_Haut (272/(31 + Espace)) + 1
//nb de bulle en tout
#define Nb_Bulle Nb_Large*Nb_Haut 
//creer des objet pour toute les bubulles :)
// double tableau  car autant de bulles dans une ligne pour autant de ligne en tout
OSL_OBJECT *Bulle[Nb_Haut][Nb_Large];



/*
=================
oslcolisionObj_Rayon()

vas etre ajouter bientot dans la lib a paramment ca sert ^^
identique a oslcolision_rayon  mais direcetement avec des objets
=================
*/
int oslcolisionObj_Rayon(OSL_OBJECT* sprite1,OSL_OBJECT* sprite2 , int rayon)
{
	//reduit le rayon des collisions ca permet de ne pas craquer des bulle inutilement alorsd que on a
	return oslCollSpriteCircle(sprite1->sprite,sprite1->sprite->x, sprite1->sprite->y, sprite2->sprite, sprite2->sprite->x, sprite2->sprite->y , rayon);

}


//genere un rand int compris entre min et max
int oslrandintMM(int min, int max) 
{ 
   return min+((max-min+1)*rand()/(RAND_MAX+1.0)); 
} 



/*
=================
Touche_menu()

gestion des touches
=================
*/
void Touche_Petobulle02()
{
		int i,e;
		oslReadKeys();

 ///verifie que le sprite de la cible soit dans le cadre si okj alors on peut bouger

	if (osl_keys->held.left){
		if (Player->sprite->x >= 1)Player->sprite->x -= 3;
	}

	if (osl_keys->held.right){
		//la on prend en plus la largeur de l'annimation car le point x du sprite et en haut a  gauche et nous on veux verifier si le point en haut a droite et dans la cadre
		if ((Player->sprite->x + Player->Animation.width)  <= 479)Player->sprite->x += 3;
	}

   if (osl_keys->held.up){
	   if (Player->sprite->y >= 1)Player->sprite->y -= 3;
	}

    if (osl_keys->held.down){
		//la on prend en plus la hauteur de l'annimation car le point x du sprite et en haut a  gauche et nous on veux verifier si le poiont en bas et dans la cadre
		if ((Player->sprite->y + Player->Animation.height) <= 271)Player->sprite->y += 3;
	}

	if (osl_keys->pressed.cross){
		//ici on tire donc on verifie quel bubule a etait toucher
		//methode assez barbare mais c'est pour vous faire comprendre les bases (pas tres economique en memoire)

			//une premiere boucle pour le nombre de ligne
		for (i = 0 ; i <Nb_Haut ; i ++)
		{
			//ensuite chaque ligne possede un nombre de bulle
			for (e = 0 ; e <Nb_Large ; e ++)
			{
				//etre sur que la bulle et pas deja craquer
				if (Bulle[i][e]->Etat_objet)
				{
					//verifie si il y a collision
					if (oslcolisionObj_Rayon(Player,Bulle[i][e],-5))
					{
						//on la craque
						Bulle[i][e]->Etat_objet = 0;
						//on change l'etat
						oslSetAnimFrameBreak(Bulle[i][e],0,oslrandintMM(2,3));
						//et on jour un son
						#ifdef PSP
						oslPlaySound(valide, 1);
						#endif

					}
				}
			}

		}

	}

}



/*
=================
InitJeux()

initialise tout ce qui appartient au jeux
=================
*/
void InitJeuxPEtoBulle02()
{

	int i,e;
	//chargement de ma police perso
	oslSetFont(maFonte);

	//chargement du fond
	Fond2 = oslLoadImageFile("media/image/fond.png", OSL_IN_RAM, OSL_PF_5551);

	//creer le joueur
	Player = oslCreateSprite(oslLoadImageFile("media/image/cible.png", OSL_IN_RAM, OSL_PF_8888),0, 1 ,30,30,1);
	//le viseur et pas annimer
	oslAnimationStop(Player);
	//possition de base du joueur
	Player->sprite->x = 50;
	Player->sprite->y = 50;



	//initialisation des bouttons

	//une premiere boucle pour le nombre de ligne
	for (i = 0 ; i <Nb_Haut ; i ++)
	{
			//ensuite chaque ligne possede un nombre de bulle
			for (e = 0 ; e <Nb_Large ; e ++)
			{
				//creer le sprite de chaque bulle
				Bulle[i][e] = oslCreateSprite(oslLoadImageFile("media/image/bulle.png", OSL_IN_RAM, OSL_PF_5551),0, 4 ,31,31,1);
				//surtout pas d'annimation, le clacage des bulles et uniquement sur demande
				oslAnimationStop(Bulle[i][e]);
				//on indique que la bule et pas creuver !!
				Bulle[i][e]->Etat_objet = 1;
				Bulle[i][e]->sprite->x = e * (Bulle[i][e]->Animation.width + Espace );
				Bulle[i][e]->sprite->y = i * (Bulle[i][e]->Animation.height + Espace );
			}


	}

	#ifdef PSP
	valide = oslLoadSoundFile("media/Sound/sound2.wav", OSL_FMT_NONE);
	#endif


}




void PetoBulle02()
{
	int i,e;


	InitJeuxPEtoBulle02();

	while (!osl_quit)
	{
		oslStartDrawing();

		//on dessine le fond en premier	
		oslDrawImage(Fond2);

		//puis les bulles
		//une premiere boucle pour le nombre de ligne
		for (i = 0 ; i <Nb_Haut ; i ++)
		{
			//ensuite chaque ligne possede un nombre de bulle
			for (e = 0 ; e <Nb_Large ; e ++)
			{
				oslDrawImageAnime(Bulle[i][e]);

			}
	
		}


		//puis le player en dernier (premier plan)
		oslDrawImageAnime(Player);

		//verifie les touche
		Touche_Petobulle02();


		oslSynchronization();

		if (osl_keys->pressed.start)break;

	}


	#ifdef PSP
	oslStopSound(valide);
	oslDeleteSound(valide);
	#endif

	oslDeleteImage(Fond2);
	oslDeleteAnnimation(Player);
	for (i = 0 ; i <Nb_Haut ; i ++)
	{
			for (e = 0 ; e <Nb_Large ; e ++)
			{
				oslDeleteAnnimation(Bulle[i][e]);
			}

	}




}



