
#include <oslib/oslib.h>


//variable
extern OSL_FONT *maFonte, *maFonte2;

OSL_IMAGE *fond;

//variable Jeux par defaut a 1, car le jeux et actif
int Jeux = 1;


//structure pour les raquettes pour des parametres indivuduel
typedef struct	player_s
{
  OSL_IMAGE	*img;
  int		score;
  int		speed;
  int		decision;
}player_t;

//structure pour la gestion des parametre de la balle
typedef struct	ball_s
{
  OSL_OBJECT	*obj;
  int		dir_x; 
  int		dir_y; 
  int		speed;
  int		NbRebond;
}ball_t;

//maintenant on prepare leur utilisations :)
//la ball
ball_t	ball;
//la raquette de gauche
player_t	left;
//la raquette de droite
player_t	right;



//Initialise le jeux
void InitGame2()
{

	fond = oslLoadImageFile("media/fond.png", OSL_IN_RAM, OSL_PF_8888);

	left.img = oslLoadImageFile("media/raquette1.png", OSL_IN_RAM, OSL_PF_5551);
	//possition de la raquette de gauche
	left.img->x = 0;
	left.img->y = 100;
	left.score = 0;

	right.img = oslLoadImageFile("media/raquette2.png", OSL_IN_RAM, OSL_PF_5551);
	//possition de la raquette de droite
	right.img->x = OSL_SCREEN_WIDTH - right.img->stretchX;
	right.img->y = 100;
	right.score = 0;


	ball.obj = oslCreateSprite(oslLoadImageFile("media/balle.png", OSL_IN_RAM, OSL_PF_5551),0, 7 ,30,30,12);
	oslAnimationPlay(ball.obj);
	//possition de la balle
	ball.obj->sprite->x = OSL_SCREEN_WIDTH/2;
	ball.obj->sprite->y = OSL_SCREEN_HEIGHT/2;
	//vitesse par defaut de la balle
	ball.speed = 1;
	//direction par defaut de la balle (possible de mettre un rand a la place pour que ce soient alleatoire
	ball.dir_x = -ball.speed;
	ball.dir_y = -ball.speed;
	//nombre de rebond de la balle par defaut et 0
	ball.NbRebond = 0;

}




//une randavec un minimum et un maximum
int oslrandintMM(int min, int max) 
{ 
    return (((rand() % (int)(((max) + 1) - (min))) + (min)));
}



//Intelligence artificiel de base d'un pong , pas le top mais c'est j'uste une demo
void AIPong(){
     
	//verifie si la balle vas ver le joueur de droite autrement on fait rien
	if (ball.dir_x > 0 && ball.obj->sprite->x > (OSL_SCREEN_WIDTH/2))
	{

	//dans quel sens diriger le joueur artificiel ??
		if ((ball.obj->sprite->y+ball.obj->Animation.height/2) < (OSL_SCREEN_HEIGHT/2) && right.img->y < (OSL_SCREEN_HEIGHT/2) ||  (ball.obj->sprite->y+ball.obj->Animation.height/2) > (OSL_SCREEN_HEIGHT/2) && right.img->y > (OSL_SCREEN_HEIGHT/2))
	{
	  if (ball.dir_y < 0 )
		  right.decision =  oslrandintMM(1,2);

	  if (ball.dir_y > 0 )
		  right.decision = oslrandintMM(4,5);

	}
		else if ((ball.obj->sprite->y+ball.obj->Animation.height/2)< (OSL_SCREEN_HEIGHT/2))
		right.decision =  oslrandintMM(1,2);
		else if ((ball.obj->sprite->y+ball.obj->Animation.height/2) > (OSL_SCREEN_HEIGHT/2))
		 right.decision = oslrandintMM(4,5);


	//deplace le joueur artificiel
    switch (right.decision)
    {
        case 1:
			if (right.img->y-3 > 0) right.img->y -= 3;
            break;        

        case 2:
			if (right.img->y-2 > 0) right.img->y -= 2;
            break;
        
        case 3:
			//reste sur place
            break;
        
        case 4:
			if (right.img->y+right.img->stretchY+2 < OSL_SCREEN_HEIGHT)right.img->y +=2;
            break;
        
        case 5:
			 if (right.img->y+right.img->stretchY+3 < OSL_SCREEN_HEIGHT)right.img->y +=3;
            break;
       }


	}
	 
}


//gere les collision de la balle et son deplacement
void Gere_balle_collision()
{
		// pour que la balle avance toute seule celont la vitesse et la direction
		ball.obj->sprite->x += ball.dir_x*ball.speed;
		ball.obj->sprite->y += ball.dir_y*ball.speed;

		// rebond de la balle contre certainne parois : détermination de son orientation
		//si la balle sort a gauche ou a droite on reinitialise le tout
		if (ball.obj->sprite->y> (OSL_SCREEN_HEIGHT-ball.obj->Animation.height) ) ball.dir_y = -2;
		else if (ball.obj->sprite->y< 0 ) ball.dir_y = 2;

		if (ball.obj->sprite->x> (OSL_SCREEN_WIDTH-ball.obj->Animation.width) ) {ball.obj->sprite->x = OSL_SCREEN_WIDTH/2;ball.obj->sprite->y = OSL_SCREEN_HEIGHT/2;left.score ++;ball.speed = 1;ball.NbRebond = 0;}
		else if (ball.obj->sprite->x < 0 ) {ball.obj->sprite->x = OSL_SCREEN_WIDTH/2;ball.obj->sprite->y = OSL_SCREEN_HEIGHT/2;right.score ++;ball.speed = 1;ball.NbRebond = 0;}


		// rebond de la balle contre la raquette de gauche
		if (oslCollObjetImageOffset(ball.obj,left.img,left.img->x, left.img->y , 0))
		{
			ball.dir_x = 2;
			ball.NbRebond ++;
		}

		//ici aussi mais pour l'autre raquette
		if (oslCollObjetImageOffset(ball.obj,right.img,right.img->x , right.img->y , 0))
		{
			ball.dir_x = -2;
			ball.NbRebond ++;
		}

		//gere la vitesse de la balle suivant le nombre de rebond deja effectuer
		if (ball.NbRebond >= 7 )ball.speed = 2; 

}

//gestion des touches
void Touche_Jeux()
{
 oslReadKeys();

//deplace le perso ver le haut
 if (osl_keys->held.up)
 {
	 if (left.img->y-3 > 0)left.img->y -=3;
 }
//deplace le perso ver le bas
 if (osl_keys->held.down)
 {
	if (left.img->y+left.img->stretchY+3 < OSL_SCREEN_HEIGHT)left.img->y +=3;
 }



 if (osl_keys->pressed.start)Jeux = 0;


}



//Gestion et affichage du menu
void Game()
{
		//initialise le jeux en lui meme
		InitGame2();
		//Affichage du Titre
		oslSetTextColor(RGBA(255,255,255,255));
		oslSetBkColor(RGBA(0,0,0,0));
		//utilise une fonte
		oslSetFont(maFonte);


		while (Jeux)
		{
			oslStartDrawing();
			oslCls();

			Touche_Jeux();

			//dessine le fond
			oslDrawImage(fond);

			//Affichage du Titre
			oslSetTextColor(ROUGE);
			//utilise une fonte
			oslSetFont(maFonte);
			oslPrintf_xy((OSL_SCREEN_WIDTH/2)-(oslStringLength("%d - %d")/2)+ 20, 2,"%d - %d",left.score,right.score);
			
			//affiche le nombre de rebond
			oslPrintf_xy((OSL_SCREEN_WIDTH/2)-(oslStringLength("%d")/2), 20,"%d",ball.NbRebond);
			

			//dessine l'animation tres legere de la balle
			oslDrawImageAnime(ball.obj);
			//dessine les raquettes
			oslDrawImage(left.img);
			oslDrawImage(right.img);
			//gere la balle, dirrection, collisions..
			Gere_balle_collision();
			//Gere l'intelligence artificiel de la raquettes de droite
			AIPong();

			
			oslSynchronization();

		}	

		//supprime les image utiliser
		oslDeleteImage(fond);
		oslDeleteImage(left.img);
		oslDeleteImage(right.img);


}



