
#include <oslib/oslib.h>
//inclure les fichiers map dans les sources :)
#include "12-collisions.h"
#include "12-sprite.h"

//declaration
OSL_OBJECT *Joueur ;
OSL_MAP *Map01, *Map_collision;
OSL_IMAGE *Map01_tileset, *collision_tileset;
extern OSL_FONT *maFonte;


//utiliser pour les collisions 0 c'est passable et 1 impoassable
#define  TILE_NOSOLID  0
#define  TILE_SOLID  1


//fonction
void Touchecollision();
void Gestion_Map();
int oslCollisionMap(OSL_MAP *m,OSL_OBJECT* npc,int haut,int bas, int gauche, int droit);




void Collision12()
{

	//chargement de nos images (oui, le "loading" :p)
	//chargement de la carte des sprites
	Map01_tileset = oslLoadImageFile("media/sprite_s.png", OSL_IN_RAM, OSL_PF_5551);
	//chargement de la carte des collisions
	collision_tileset = oslLoadImageFile("media/collisions_s.png", OSL_IN_RAM, OSL_PF_5551);

	Joueur = oslCreateSprite(oslLoadImageFile("media/player.png", OSL_IN_RAM, OSL_PF_5551),0, 0 ,16,16,0);
	// pas d'annimation car 1 seul sprites
	oslAnimationStop(Joueur);
	//place Le joueur vers le centre de l'écran et dans sa position de départ
	Joueur->sprite->x = 240;
	Joueur->sprite->y = 130;
	//Initialisation des map
	Gestion_Map();


	//utilise une fonte
	oslSetFont(maFonte);

	while (!osl_quit)
	{
		oslStartDrawing();
				
		//check des touches
		Touchecollision();

		//Affiche la map concerner, mais n'affiche pas la map des collision
		oslDrawMapSimple(Map01);

		//dessine nos sprite
		oslDrawImageAnime(Joueur);

		oslPrintColorShadow(2, 2,JAUNE,"UTILISE LES FLECHES", 0);

		

		oslSynchronization();
		if (osl_keys->pressed.start)break;

	}

}






/*
====================
Touche()

Gestion des touches
====================
*/
//verifie les collisions au momment du deplacement pour eviter de les tester tout le temps
void Touchecollision()
{
	oslReadKeys();

	if (osl_keys->held.up){

	  	if (!oslCollisionMap(Map_collision,Joueur,1,0,0,0))
		{
		Joueur->sprite->y -= 2;
		}		
		
	}

	if (osl_keys->held.down){
		if (!oslCollisionMap(Map_collision,Joueur,0,1,0,0))
		{
			Joueur->sprite->y += 2;
		}
	}

	if (osl_keys->held.left){
		
		if (!oslCollisionMap(Map_collision,Joueur,0,0,1,0))
		{
		Joueur->sprite->x -= 2;
		}
	
	}

	if (osl_keys->held.right){
		
		if (!oslCollisionMap(Map_collision,Joueur,0,0,0,1))
		{
		Joueur->sprite->x += 2;
		}

	}

	//si aucune touche alors on remet l'annimation dans lequel il ce trouve a 0 et on arrete l'annimation
	if (!osl_keys->held.value){

	}


	
	
}




/*
====================
Gestion_Map()

Initialilsation des map
====================
*/

void Gestion_Map()
{

    //configuration de la map
    Map01= oslCreateMap(
        Map01_tileset,                        //Tileset
        (void *)sprite_map,                            //Map
        16,16,                                //Taille des tiles
        30,17,                                //Taille de la Map
        OSL_MF_U16);                        //Format de la Map

    //configuration de la map
    Map_collision= oslCreateMap(
        collision_tileset,                        //Tileset
        (void *)collisions_map,                            //Map
        16,16,                                //Taille des tiles 
        30,17,                                //Taille de la Map
        OSL_MF_U16);                        //Format de la Map

}




/*
====================
oslCollisionMap

Gestion des collitions avec les map et le perso
Attention car celon la taille du personnage et celon le type de jeux, certainne variable doit changer pour tester
une partie du personnage car si le perso fait plus de 16x16 pixel la possition calculer par defaut et la possition
des 16x16 a partir du haut, mais dans le cas d'un rpg on doit prendre ces 16x16 a partir du bas du personnage !!!
====================
*/

int oslCollisionMap(OSL_MAP *m,OSL_OBJECT* npc,int haut,int bas, int gauche, int droit)  
{
 int tile;
 int rel_posX;
 int rel_posY;

 
//Test de collition pour la partie Demander suivant la touche appuyer haut, bas, gauche, droit.

if (haut)
 {
  tile = oslGetTile(m,((m->scrollX + npc->sprite->x +npc->sprite->stretchX ))/ m->tileX, (m->scrollY + npc->sprite->y - 2)/ m->tileY);
  if (!tile)
  {
  tile = oslGetTile(m,((m->scrollX + npc->sprite->x))/ m->tileX, (m->scrollY + npc->sprite->y - 2)/ m->tileY);  //essaye avec la moitier du personnage pour que la tete passe quoi qu'il arrive                   
  }
 }

if (bas)
 {
  tile = oslGetTile(m,((m->scrollX + npc->sprite->x +npc->sprite->stretchX ))/ m->tileX, (m->scrollY + npc->sprite->y + npc->sprite->stretchY + 2)/ m->tileY);
  if (!tile)
  {
  tile = oslGetTile(m,((m->scrollX + npc->sprite->x))/ m->tileX, (m->scrollY + npc->sprite->y + npc->sprite->stretchY + 2)/ m->tileY);
  }
 }
if (gauche)
 {
  tile = oslGetTile(m,((m->scrollX + npc->sprite->x - 2))/ m->tileX, (m->scrollY + npc->sprite->y + npc->sprite->stretchY)/ m->tileY);
  if (!tile)
  {
  tile = oslGetTile(m,((m->scrollX + npc->sprite->x - 2))/ m->tileX, (m->scrollY + npc->sprite->y)/ m->tileY);
  }
 }

if (droit)
 {
   tile = oslGetTile(m,((m->scrollX + npc->sprite->x +npc->sprite->stretchX + 2))/ m->tileX, (m->scrollY + npc->sprite->y + npc->sprite->stretchY)/ m->tileY);
   if (!tile)
  {
  tile = oslGetTile(m,((m->scrollX + npc->sprite->x +npc->sprite->stretchX + 2))/ m->tileX, (m->scrollY + npc->sprite->y)/ m->tileY);
  }
 }


  switch(tile)
  {
   case TILE_NOSOLID:
    // pas de collision sur le sprite retourne donc 0
    return 0;
    break;
   case TILE_SOLID:
    // impassable retourne simplement 1 car impossable
    return 1;
    break;

   //On peut rajouter autant de case que besoin celon ce que on recherche.
  }


return 0;
}
