/**
* @file collison.c
* @author fatma & omar <3
* @version 1.0
* @date 20 mai 2013
* @brief Définit la collision
*/
#include <stdio.h>
#include <stdlib.h>
#include <allegro.h>
#include "background.h"
#include "chien.h"
#include "collision.h"
#include "jennyfer.h"
#include "perso.h"





/**
* @fn int bounding_box_collision(Sprite Sprite1,Sprite Sprite2)
* @details la collision entre deux objet 
* @param sprite1 , sprites2 qui sont de type Sprite
* @return soit 0 si il n'y a pas de collision 
*1 si il y a collision */

int bounding_box_collision(Sprite Sprite1,Sprite Sprite2)
{
	if ((Sprite1.x > Sprite2.x + Sprite2.w - 1) ||
			(Sprite1.y > Sprite2.y + Sprite2.h - 1) ||
			(Sprite2.x > Sprite1.x + Sprite1.w - 1) ||
			(Sprite2.y > Sprite1.y + Sprite1.h - 1))
	{
		// no collision
		return (0);
	}

	// collision
	return (1); 
}

/**
* @fn void game_over (BITMAP *Buffer, chien *chien , jennyfer *jenn, BITMAP *OVER,BITMAP *BLOOD, int *k)
* @details elle diminue l'energie de jennyfer jusqu'a zero ---> game over
* @param jenn Un pointeur sur la structure jennyfer, Buffer memoire ou se charge les images 
*BLOOD de type BITMAP elle stocke la dernière image chargè
*k son adress nous permet le passae d'une image d'energie a une autre 
*chien un pointeur sur la structure chien
*OVER de type BITMAP  qui charge l'image "game over "
* @return void */

void game_over (BITMAP *Buffer, chien *chien , jennyfer *jenn, BITMAP *OVER,BITMAP *BLOOD, int *k)
 {
    Sprite Sprite1;
    Sprite Sprite2;
    Sprite1.x=jenn->x;
    Sprite1.y=jenn->y;
    Sprite1.w=jenn->right[0]->w;
    Sprite1.h=jenn->right[0]->h;
    Sprite2.x=chien->x; 
    Sprite2.y=chien->y;
    Sprite2.w=chien->right[0]->w;
    Sprite2.h=chien->right[0]->h;

 if (*k==5)
   {
    draw_sprite(Buffer,OVER,0,0); 
   }

else
   {
    if (bounding_box_collision(Sprite1,Sprite2)==0)
      {   
	BLOOD=jenn->blood[*k % (5)];
	draw_sprite(Buffer, BLOOD,0,0 ) ;
      }
    else if (bounding_box_collision(Sprite1,Sprite2)==1)
      {  
	*k+=1;
	BLOOD=jenn->blood[*k % (5)];
	draw_sprite(Buffer, BLOOD,0,0 );
	usleep(1000);
      }
    }
}

/**
* @fn int collision_background_left(Sprite sprite1,BITMAP* Backgroundcol)
* @details la collision a gauche d'un perso avec le background de collision 
* @param sprite1 de type Sprite , Backgroundcol de type BITMAP qui stocke l'image du background de collision
* @return soit 0 si il n'y a pas de collision 
*1 si il y a collision */

int collision_background_left(Sprite sprite1,BITMAP* Backgroundcol)
{
	int x;
	int y;
	x=sprite1.x;
	y=sprite1.y + (sprite1.h /2);

	if( get_pixel(Backgroundcol,x,y)== 255)
		return (1);

	return (0); 
}

/**
* @fn int collision_background_right(Sprite sprite1,BITMAP* Backgroundcol)
* @details la collision a droite d'un perso avec le background de collision 
* @param sprite1 de type Sprite , Backgroundcol de type BITMAP qui stocke l'image du background de collision
* @return soit 0 si il n'y a pas de collision 
*1 si il y a collision */

int collision_background_right(Sprite sprite1,BITMAP* Backgroundcol)
{
	int x;
	int y;
	x=sprite1.x + sprite1.w;
	y=sprite1.y + (sprite1.h / 2);

	if( get_pixel(Backgroundcol,x,y)== 255)
		return (1);

	return (0);
}
/**
* @fn int collision_background_down(Sprite sprite1,BITMAP* Backgroundcol)
* @details la collision en bas d'un perso avc le background de collision
*@brief  cette fonction fait appel a get_pixel qui nous retourne la couleur blanche si cette couleur se manifeste 
* c'est que il y'a collision sinon c'est pas le cas
* @param sprite1 de type Sprite , Backgroundcol de type BITMAP qui stocke l'image du background de collision
* @return soit 0 si il n'y a pas de collision 
*1 si il y a collision */
int collision_background_down(Sprite sprite1,BITMAP* Backgroundcol)
{
	int x;
	int y;
	x=sprite1.x + (sprite1.w /2);
	y=sprite1.y + sprite1.h;

	if( get_pixel(Backgroundcol,x,y)== 255)
		return (1);

	return (0);

}
/**
* @fn int collision_background_up(Sprite sprite1,BITMAP* Backgroundcol)
* @details la collision en haut d'un perso avc le background de collision 
*@brief  cette fonction fait appel a get_pixel qui nous retourne la couleur blanche si cette couleur se manifeste 
* c'est que il y'a collision sinon c'est pas le cas
* @param sprite1 de type Sprite , Backgroundcol de type BITMAP qui stocke l'image du background de collision
* @return soit 0 si il n'y a pas de collision 
*1 si il y a collision */

int collision_background_up(Sprite sprite1,BITMAP* Backgroundcol)
{
	int x;
	int y;
	x=sprite1.x + (sprite1.w /2);
	y=sprite1.y;

	if( get_pixel(Backgroundcol,x,y)== 255)
		return (1);

	return (0);

}
/**
* @fn intget_pixel (BITMAP* Buffer,int x,int y)
* @details la moyenne des pixels
* @param Buffer de type BITMAP ou se charge les images et la position x et y celle du perso 
* @return soit 0 si il n'y a pas de collision 
*1 si il y a collision */

 int get_pixel(BITMAP* Buffer,int x,int y)
{
	int tmp;
	tmp=getpixel(Buffer,x,y);
	return((getr(tmp) + getb(tmp) + getg(tmp)) / 3);
}


/**
* @fn game_over_rat(BITMAP *Buffer, rat *rat , jennyfer *jenn, BITMAP *OVER,BITMAP *BLOOD, int *k)
* @details elle diminue l'energie de jennyfer jusqu'a zero ---> game over
*@brief le faite de toucher le rat l'energie de jennyfer dimminue 
* @param jenn Un pointeur sur la structure jennyfer, Buffer memoire ou se charge les images 
*BLOOD de type BITMAP elle stocke la dernière image chargè
*k son adress nous permet le passae d'une image d'energie a une autre 
*rat un pointeur sur la structure rat
*OVER de type BITMAP  qui charge l'image "game over "
* @return void */

void game_over_rat(BITMAP *Buffer, rat *rat , jennyfer *jenn, BITMAP *OVER,BITMAP *BLOOD, int *k)
 {



    Sprite Sprite1;
    Sprite Sprite2;
    Sprite1.x=jenn->x;
    Sprite1.y=jenn->y;
    Sprite1.w=jenn->right[0]->w;
    Sprite1.h=jenn->right[0]->h;
    Sprite2.x=rat->x;
    Sprite2.y=rat->y;
    Sprite2.w=rat->RAT[0]->w;
    Sprite2.h=rat->RAT[0]->h;


if (*k==5)
{
   draw_sprite(Buffer,OVER,0,0);
}
else
{

  if ((jenn->x>267) && (jenn->x<336) && (jenn->y> 320))
    { 
    *k+=1; 
    }
                     
  if (bounding_box_collision(Sprite1,Sprite2)==0)
   {
    BLOOD=jenn->blood[*k % (5)];
    draw_sprite(Buffer, BLOOD,0,0 ) ;
   }
  else if (bounding_box_collision(Sprite1,Sprite2)==1)
   {
    *k+=1;
    BLOOD=jenn->blood[*k % (5)];
    draw_sprite(Buffer, BLOOD,0,0 );
    usleep(50000);
   }
}


}
