
#include <oslib/oslib.h>


PSP_MODULE_INFO("Devslib Sample", 0, 1, 1);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);

////////declaration
//creer un son
OSL_SOUND *Toucher, *Musique;

OSL_FONT *maFonte;
//pour le fond
OSL_IMAGE *Titre;
//Pour le player avec un simple sprites
OSL_IMAGE *Player;

//nombre de fois toucher
int Nb_toucher = 0;

//declaration des bebetes en tant que Objet
#define Nb_bebetes 20

//creation d'une structure adapter a nos besoins , direction ou autre qui et propre a chaque ennemie
typedef struct {
 //direction des bebetes
 int direction;
 //type de bebetes
 int Type;
 //image de nos petites bebetes
 OSL_IMAGE *Image;

} ENNEMIE;

ENNEMIE bebetes[Nb_bebetes];
//////////


//gestion des touches
void Touche_menu()
{
 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->x >= 1)Player->x -= 6;
		Player->angle = 180;
	}

	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->x + Player->stretchX)  <= 479)Player->x += 6;
		Player->angle = 0;
	}

   if (osl_keys->held.up){
	   if (Player->y >= 1)Player->y -= 6;
	   Player->angle = 270;
	}

    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->y + Player->stretchY) <= 271)Player->y += 6;
		Player->angle = 90;
	}

}


//une rand maison avec comme minimum 1 comme retour
int TestRandAI(int max)
{
	int retour;
	retour = rand() % max;
	if (retour < 1)retour = 1;
	
	return retour;
}


//Fonction pour le changement de direction et le placement sur la carte suivant le sens
void Direction(ENNEMIE *Bebetes)
{

	Bebetes->direction += TestRandAI(4);
	if (Bebetes->direction >=5)Bebetes->direction = TestRandAI(2);

	switch (Bebetes->direction)
	{
		case 1:
			//gauche
			//les X sont fixe
			Bebetes->Image->x = -Bebetes->Image->stretchX;
			//possition alleatoire en Y
			Bebetes->Image->y = TestRandAI(272-Bebetes->Image->stretchY);
			//angle de direction de la bebetes :)
			Bebetes->Image->angle = 90;
			break;
		case 2:
			//droite
			Bebetes->Image->x = 480;
			Bebetes->Image->y = TestRandAI(272-Bebetes->Image->stretchY);
			Bebetes->Image->angle = 270;
			break;
		case 3:
			//Haut
			Bebetes->Image->y = -Bebetes->Image->stretchY;
			Bebetes->Image->x = TestRandAI(480-Bebetes->Image->stretchX);
			Bebetes->Image->angle = 180;
			break;

		case 4:
			//Bas
			Bebetes->Image->y = 272;
			Bebetes->Image->x = TestRandAI(480-Bebetes->Image->stretchX);
			Bebetes->Image->angle = 0;
			break;
		
	}



}

//Nouvelle fonction qui vas gerer les deplacement des ennemie
void Deplace_Direction(ENNEMIE *Bebetes)
{

	switch (Bebetes->direction)
	{
		case 1:
			//gauche
			Bebetes->Image->x += 2;
			//test si on sort de l'ecran alors on reset
			if (Bebetes->Image->x >= 480)Direction(Bebetes);
			break;
		case 2:
			//droite
			Bebetes->Image->x -= 2;
			////test si on sort de l'ecran alors on reset
			if (Bebetes->Image->x + Bebetes->Image->stretchX <= 0)Direction(Bebetes);
			break;
		case 3:
			//Bas
			Bebetes->Image->y += 2;
			//test si on sort de l'ecran alors on reset
			if (Bebetes->Image->y >= 270)Direction(Bebetes);
			break;
		case 4:
			//Haut
			Bebetes->Image->y -= 2;
			//test si on sort de l'ecran alors on reset
			if (Bebetes->Image->y + Bebetes->Image->stretchY <= 0)Direction(Bebetes);
			break;

		
	}

	//maintenant on peut afficher la bebetes
	oslDrawImage(Bebetes->Image);


}

//on fait un reset de tout le monde
void ResetAll()
{
	int i;

	for (i = 0 ; i <Nb_bebetes ; i +=1)
	{
		Direction(&bebetes[i]);
	}

	//repossitionne le player
	Player->x = 200;
	Player->y = 100;

}

//initialise tout ce qui appartient au jeux
void InitJeux()
{
	int i;
	//chargement de ma police perso
	maFonte = oslLoadFontFile("media/font/ArialBlack18.oft"); 
	oslSetFont(maFonte);

	//chargement du titre
	Titre = oslLoadImageFile("media/image/splash.png", OSL_IN_RAM, OSL_PF_5551);
	//Chargement du Personnage Principal
	Player = oslLoadImageFile("media/image/player.png", OSL_IN_RAM, OSL_PF_5551);
	//on deplace le centre de rotation car par defaut il et en Haut a Gauche de l'image
	Player->centerX = Player->stretchX/2;
	Player->centerY = Player->stretchY/2;
	//possition du player
	Player->x = 200;
	Player->y = 100;

	
	//ici on utilise un systeme sans annimation pour les sprite, j'uste l'image
	for (i = 0 ; i <Nb_bebetes ; i +=4)
	{
		//chargement de l'image
		bebetes[i].Image = oslLoadImageFile("media/image/2.png", OSL_IN_RAM, OSL_PF_5551);
		//ici premier type de bebetes
		bebetes[i].Type = 1;
		//ici initialisation de la direction et de la possition de la bebete
		Direction(&bebetes[i]);
		//on deplace le centre de rotation car par defaut il et en Haut a Gauche de l'image
		bebetes[i].Image->centerX = bebetes[i].Image->stretchX/2;
		bebetes[i].Image->centerY = bebetes[i].Image->stretchY/2;

		bebetes[i+1].Image = oslLoadImageFile("media/image/3.png", OSL_IN_RAM, OSL_PF_5551);
		bebetes[i+1].Type = 2;
		Direction(&bebetes[i+1]);
		bebetes[i+1].Image->centerX = bebetes[i+1].Image->stretchX/2;
		bebetes[i+1].Image->centerY = bebetes[i+1].Image->stretchY/2;

		bebetes[i+2].Image = oslLoadImageFile("media/image/4.png", OSL_IN_RAM, OSL_PF_5551);
		bebetes[i+2].Type = 3;
		Direction(&bebetes[i+2]);
		bebetes[i+2].Image->centerX = bebetes[i+2].Image->stretchX/2;
		bebetes[i+2].Image->centerY = bebetes[i+2].Image->stretchY/2;

		bebetes[i+3].Image = oslLoadImageFile("media/image/5.png", OSL_IN_RAM, OSL_PF_5551);
		bebetes[i+3].Type = 4;
		Direction(&bebetes[i+3]);
		bebetes[i+3].Image->centerX = bebetes[i+3].Image->stretchX/2;
		bebetes[i+3].Image->centerY = bebetes[i+3].Image->stretchY/2;

	}

	#ifdef PSP
	Toucher = oslLoadSoundFile("media/sound/sound1.wav", OSL_FMT_NONE);
	Musique = oslLoadSoundFile("media/sound/sound2.bgm", OSL_FMT_STREAM);
	//La misuque en boucle
	oslSetSoundLoop(Musique, 1);	 
	oslPlaySound(Musique, 1);
	#endif


}



int main(int argc, char* argv[])
{


	//Initialisation
	oslInit(0);							//la lib
	oslInitGfx(OSL_PF_8888, 1);			//Gfx
	oslInitAudio();						//Sound

	//variable temporaire
	int i;

	#ifdef PSP
		scePowerSetClockFrequency(333, 333, 166); // etre sur d'utiliser la psp a plein regime lol
	#endif


	InitJeux();

	//////On vas Faire une Petite Intro

	//on demarre le dessin ici
	oslStartDrawing();
	//on dessine le titre
	oslDrawImage(Titre);
	//on synchronise pouyr l'afficher sur l'ecran
	oslSynchronization();
	//on attend l'appuye d'une touche
	oslWaitKey();

	///////////Fin de l'intro


	while (!osl_quit)
	{
		oslStartDrawing();

		//efface l'ecran en blanc :)
		oslClearScreen (RGB(255, 255, 255));

		//on dessine le Personage Principal
		oslDrawImage(Player);

		//on gere le systeme des bebetes il sont autonaume une sorte de pseudo Intelligence Artificiel
		for (i = 0 ; i <Nb_bebetes ; i ++)
		{
			Deplace_Direction(&bebetes[i]);
			//si collision en enleve un petit battement de 3 Pixel juste pour le plaisir
			if (oslCollSpriteCircle(bebetes[i].Image,bebetes[i].Image->x, bebetes[i].Image->y, Player, Player->x, Player->y , -3))
			{
				//alors on incremente de 1 toucher
				Nb_toucher ++; 
				//on joue une musique	uniquement si on et sur une PSP et pas sur la version PC		
				#ifdef PSP
				//ne pas oublier de changer le canal il doit etre different de la musique
				oslPlaySound(Toucher, 2);
				#endif
				//et on reinitialise tout le monde au depard :)
				ResetAll();
			}
		}


		//verifie les touche
		Touche_menu();

		//Affiche le nombre de fois toucher
		oslSetTextColor(RGBA(255,0,255,255));
		oslSetBkColor(RGBA(255,255,255,0));
		oslPrintf_xy(0, 0, "TOUCHER: X %i ", (int)(Nb_toucher));

		oslSynchronization();

	}

	#ifdef PSP
	Toucher = oslLoadSoundFile("media/sound/sound1.wav", OSL_FMT_NONE);
	Musique = oslLoadSoundFile("media/sound/sound2.bgm", OSL_FMT_STREAM);
	//La misuque en boucle
	oslSetSoundLoop(Musique, 1);	 
	oslPlaySound(Musique, 1);
	#endif


	oslEndGfx();
	oslQuit();
	return 0;
}



