
/**log systeme de la lib , pour savoir ce qui ce passe et ou ca plente ? par defaut a 0*/
extern int oslLog;

/** convertie une chaine en binaire* /
extern int oslStringToBinary(char *chn);//atob
/** convertie une chaine en hexadecimal */
extern int oslStringToHexa(char *chn);//atox
/** indique le numero du Tile sur la possotion PossX et PossY suivant l'eventuelle scrool de la map */
extern short oslGetTile(OSL_MAP *m,int col, int row);
/** ouverture d'un fichier map en externe */
extern OSL_MAP *oslLoadFileMap(OSL_IMAGE *img,char *file, int tileX, int tileY);
/** sqrt ne fonctionne pas tres bien :) */
extern int oslSqrt(unsigned int n);
/** synchronisation de l'image, du son et fin du dessin */
extern void oslSynchronization();
/** Random avec un max */
extern int oslRandom( int max );

/**chargement de la gestion du clavier virtuel*/
extern void oslKeyboardLoad(const int newX, const int newY,char *file);
/**affichage du clavier virtuel*/
extern char * oslKeyboardDraw();

/**indique si on effectue un log Total de l'application*/
extern void oslLogSystem(int value);

/**Supression de clavier virtuel de type2*/
extern void osl_DelKeyboard2();
/**chargement de la gestion du clavier virtuel  type 2 avec le clavier*/
extern void oslKeyboardLoad2(char *Keyboard1,char *Keyboard2, char *Cursor,int X, int Y);
/**affichage du clavier virtuel type 2 avec le clavier*/
extern char * oslKeyboard2Draw(void);

/**Teste la presence d'un fichier et si present retourne 1*/
extern bool oslTestFile(char * file);
/**Ajouter un commentaire ou une information dans un fichier log*/
extern void oslAddLog(char * file,char * Text);

#ifdef PSP
	/** log information in text file , The format system is the same as printf... */
	#define oslLogFile(file,format...)		({ char __str[1000]; sprintf(__str , ##format); oslAddLog(file,__str); })
#else
	#define oslLogFile(file,...)		{ char __str[1000]; sprintf(__str , __VA_ARGS__); oslAddLog(file,__str); }
#endif


/**initialisation des textures pour les message box*/
extern void oslInitMessageBoxSkin();

/** affichage d'un explorateur de fichier (non fonctionnel pour le moment */
extern int oslExplorerBox(const char *title, unsigned int flags);

/**initialise le curseur (pas encore fonctionnel)*/
extern void oslInitCursor();
extern void oslDrawCursor(int x,int y);

/** Dessine une ligne en degradé */
extern void oslDrawGradientLine(int x0, int y0, int x1, int y1, OSL_COLOR color , OSL_COLOR color2);
/** Dessine un triangle en degradé */
extern void oslDrawGradientTriangle(int x0, int y0, int x1, int y1 , int x2, int y2, OSL_COLOR c1, OSL_COLOR c2, OSL_COLOR c3);
/** Dessine un un Cercle Creux*/
extern void oslDrawCircle ( int centerX , int centerY , int radius , OSL_COLOR color );
/** Dessine un cercle plein */
extern void oslDrawFillCircle ( int centerX , int centerY , int radius , OSL_COLOR color );

/** Define NULL a une valeur de 0. */
#ifndef NULL
#define NULL 0
#endif

/** Define FALSE a une valeur de 0. */
#ifndef FALSE
#define FALSE 0
#endif

/** Define TRUE a une valeur de 1. */
#ifndef TRUE
#define TRUE  !FALSE
#endif


#define boolean int

#define pointer void *


#define MIN(a,b) (((a)<(b))?(a):(b))
#define MAX(a,b) (((a)>(b))?(a):(b))

#define MIN3(a,b,c) MIN(MIN(a,b),MIN(b,c))
#define MAX3(a,b,c) MAX(MAX(a,b),MAX(b,c))

#define ABS(a)   ((a >= 0)?(a):-(a))



//----------animation--------



typedef struct	{
	int position; //position du joueur. exemple : HAUT/BAS/GAUCHE/DROITE/SAUTE/BAISSE
	int anim_possition;  // pour l'animation indique la possition actuel de l'annimation //anim_marche
	int temp_animation; // pour l'animation //temp_anim_marche
//	int piece_gagner;  // pour le compteur de Mario
	int animation; //Nombre d'annimation pour l'object
	int width;  // Largeur X de la taille du sprite pour l'annimation)//anim_X
	int height; //Hauteur de l'annimation
	int speed; // Vitesse de l'annimation
	int BonusTime; // temps pour l'affichage d'un bonus

	int left, right ,up, down,sens;
	bool flipv, fliph, Active;

} OSL_ANIM;


/**
* \struct OSL_OBJECT
* \brief Utilisé pour l'animation des objets ainsi que pour les collisions
*
* OBJETS est une structure pour la gestion des objets pour l'animation et les collisions
*/
typedef struct    OSL_OBJECT{

	OSL_IMAGE *sprite ;/*!< Sprite a utiliser pour l'objet */

    OSL_ANIM Animation;/*!< pour pouvoir utiliser la structure pour l'animation*/

	//variable temporaire concernant l'objet.
	int Etat_objet;

} OSL_OBJECT; 



/*-------------------------------------------------------------------------*/
/**
  @brief    effet de mirroir d'une image
  @param    img sprite a inverser
  @param    flipType flipType 0  = filp horizontal / flipType = 1 flip vertical

dessine une image et fait un effet de mirroir Horizontal ou vertical
 */
/*--------------------------------------------------------------------------*/
extern void oslDrawImageSimpleFlip(OSL_IMAGE *img, int flipType);

/*-------------------------------------------------------------------------*/
/**
  @brief    Creation d'un objet
  @param    Image Image a charger pour creer l'annimation
  @param    startFrameY Possition de depard sur la planche de sprite pour l'annimation
  @param    animation Nombre de frame pour l'annimation
  @param    width Largeur du sprite pour une Frame
  @param    height hauteur du sprite pour une Frame
  @param    speed Vitesse pour l'annimation(De la premiere frame a la derniere)
  @return   Retourne un Objet creer et donc utilisable

  Cette fonction Permet de Creer un Objet pour pouvoir l'utiliser pour plusieur chose :
  (Simple annimation, Personnage, Collision...)
 */
/*--------------------------------------------------------------------------*/
extern OSL_OBJECT *oslCreateSprite(OSL_IMAGE *Image,int startFrameY,int animation ,int width,int height,int speed );

/*-------------------------------------------------------------------------*/
/**
  @brief    Annimation d'un Objet
  @param    Obj Objet a Annimer 

  Cette fonction Permet d'annimer un objet frame par frame en tenant compte de la vitesse et de totu les parametres
 */
/*--------------------------------------------------------------------------*/
extern void oslAnimSprite(OSL_OBJECT* Obj);


/*-------------------------------------------------------------------------*/
/**
  @brief    Modification du nombre Maximum de frame
  @param    Obj Objet pointer
  @param    animation Modifie le nombre Maximum d'annimation

  Cette fonction Permet de Modifier le nombre maximum de frame d'un objet
 */
/*--------------------------------------------------------------------------*/
extern void oslSetAnimFrameMax(OSL_OBJECT* Obj,int animation);



/*-------------------------------------------------------------------------*/
/**
  @brief    Pause sur une Frame tres Precise
  @param    Obj Objet pointer
  @param    Poss Possition de l'Objet (Serie d'annimation au niveau de la height)
  @param    animation Numero de la frame sur l'esquel on doit faire une pause

  Cette fonction Permet de faire une pause sur une frame bien presise
 */
/*--------------------------------------------------------------------------*/
extern void oslSetAnimFrameBreak(OSL_OBJECT* Obj,int Poss,int animation);



/*-------------------------------------------------------------------------*/
/**
  @brief    Changement de possition de l'objet
  @param    Obj Objet pointer
  @param    Poss Nouvelle Possition de l'Objet (possition = ligne concernet)

  Cette fonction Permet de changer la possition de l'objet (gauche, droite , saute, tir ....)
 */
/*--------------------------------------------------------------------------*/
extern void oslChangePossition(OSL_OBJECT* Obj, int Poss);


/*-------------------------------------------------------------------------*/
/**
  @brief    effet mirroir de l'objet

  Active le flip Horizontal du sprite pour l'annimation en cour (ideal pour la gauche et la droite qui sont en fait la meme chose mais en mirroir)
 */
/*--------------------------------------------------------------------------*/
extern void oslSetFliphOn(OSL_OBJECT* Obj);

/*-------------------------------------------------------------------------*/
/**
  @brief    Annule l'effet mirroir d'une annimation
  @param    Obj Objet pointer

  Cette fonction Permet d'annuler l'effet mirroir d'une annimation
 */
/*--------------------------------------------------------------------------*/
extern void oslSetFliphOff(OSL_OBJECT* Obj);

/*-------------------------------------------------------------------------*/
/**
  @brief    Annimation d'un Objet
  @param    Obj Objet a Annimer ou a Dessiner

  Cette fonction Permet de Dessinez le sprite et de l'animée si il et actif
 */
/*--------------------------------------------------------------------------*/
extern void oslDrawImageAnime(OSL_OBJECT* Obj);


/*-------------------------------------------------------------------------*/
/**
  @brief    Rendre actif une annimation
  @param    Obj Objet pointer

  Cette fonction Permet de mettre actif l'annimation de l'objet
 */
/*--------------------------------------------------------------------------*/
extern void oslAnimationPlay(OSL_OBJECT* Obj);

/*-------------------------------------------------------------------------*/
/**
  @brief    Mettre en Pause une annimation
  @param    Obj Objet pointer

  Cette fonction Permet de mettre en pause l'annimation de l'objet
 */
/*--------------------------------------------------------------------------*/
extern void oslAnimationStop(OSL_OBJECT* Obj);

/*-------------------------------------------------------------------------*/
/**
  @brief    Faire un Reset de l'annimation en COUR
  @param    Obj Objet pointer

  Cette fonction Permet de faire un reset de l'annimation en cour (Frame 0)
 */
/*--------------------------------------------------------------------------*/
extern void oslResetPossition(OSL_OBJECT* Obj);

/*-------------------------------------------------------------------------*/
/**
  @brief    Modifier des parametre d'un objet deja Initialiser
  @param    Obj Objet pointer
  @param    animation Nombre de frame pour l'annimation
  @param    width Largeur du sprite pour une Frame
  @param    height Hauteur du sprite pour une Frame
  @param    speed Vitesse pour l'annimation(De la premiere frame a la derniere)

  Cette fonction Permet de Modifier des parametre d'un objet deja Initialiser
 */
/*--------------------------------------------------------------------------*/
extern void oslSetAnimation(OSL_OBJECT* Obj,int animation ,int width,int height,int speed );

/*-------------------------------------------------------------------------*/
/**
  @brief    Supprime un Objet
  @param    Obj Objet pointer


  Cette fonction Permet de Supprimez un Objet (le liberer de la memoire)
 */
/*--------------------------------------------------------------------------*/
extern void oslDeleteAnnimation(OSL_OBJECT* Obj);




//-----Collision----------


/*-------------------------------------------------------------------------*/
/**
  @brief    Collision par algorithme bounding box
  @param    img1 1er sprite a comparer
  @param    img1posX Possition en X du Premier Sprite
  @param    img1posY Possition en Y du Premier Sprite
  @param    img2 2eme sprite a comparer
  @param    img2posX Possition en X du deuxieme Sprite
  @param    img2posY Possition en Y du deuxieme Sprite

Verifie si il y a une colision entre 2 sprites
algorithme bounding box
 */
/*--------------------------------------------------------------------------*/
extern int oslCollImage(OSL_IMAGE *img1,float img1posX, float img1posY, OSL_IMAGE *img2, float img2posX, float img2posY );

 /*-------------------------------------------------------------------------*/
/**
  @brief    Collision par algorithme bounding box
  @param    img1 1er sprite a comparer
  @param    img1posX Possition en X du Premier Sprite
  @param    img1posY Possition en Y du Premier Sprite
  @param    img2 2eme sprite a comparer
  @param    img2posX Possition en X du deuxieme Sprite
  @param    img2posY Possition en Y du deuxieme Sprite
  @param    Rayon Perimetre qui s'agrandi ou retricit pour la colision

Verifie si il y a une colision dans un rayon de X  pour le sprite img2 pixel entre 2 sprites
Utile par exemple pour une detection de perimetre pour donner des nouvele instruction
algorithme bounding box
 */
/*--------------------------------------------------------------------------*/
extern int oslCollImageOffset(OSL_IMAGE *img1,float img1posX, float img1posY, OSL_IMAGE *img2, float img2posX, float img2posY , float Rayon);


/*-------------------------------------------------------------------------*/
/**
  @brief    Collision par algorithme bounding box controler
  @param    sprite1 Objet1 a comparer
  @param    sprite1 Objet2 a comparer
  @param    Gauche verifie si  il y a une collision venant de la Gauche
  @param    Droite verifie si  il y a une collision venant de la Droite
  @param    Haut verifie si  il y a une collision venant de le Haut
  @param    Bas verifie si  il y a une collision venant de le Bas

Verifie si il y a une colision entre 2 sprites dans toute les directions.
utile pour plusieur cas :
							-Gestion de la partie toucher dans un mario (venant du haut l'ennemi et mort)
							-Pour les collision avec les coffre dans un RPG (venant du bas peut ouvrir le coffre....)
							-......
algorithme bounding box
 */
/*--------------------------------------------------------------------------*/
extern int oslCollObjectSens(OSL_OBJECT* sprite1,OSL_OBJECT* sprite2,int left,int right,int up,int down );


/*-------------------------------------------------------------------------*/
/**
  @brief    Collision par algorithme bounding box
  @param    sprite1 sprite du premier objet
  @param    sprite2 sprite du dexieme objet

Verifie si il y a une colision entre 2 objets de DevsLib
algorithme bounding box
 */
/*--------------------------------------------------------------------------*/
extern int oslCollObject(OSL_OBJECT* sprite1,OSL_OBJECT* sprite2 );


/*-------------------------------------------------------------------------*/
/**
  @brief    Collision par Cercle
  @param    x1 Centre en X du premier cercle
  @param    y1 Centre en y du premier cercle
  @param    r1 rayon du Premier cercle
  @param    x2 Centre en X du dexieme cercle
  @param    y2 Centre en y du dexieme cercle
  @param    r2 rayon du dexieme cercle
  @param    offset l'ofset et la distence entre les 2 cercles


Verifie si il y a une intersection entre 2 cercles
algorithme bounding Cercle

cercle1 : centre (x1,y1) avec rayon r1
cercle2 : centre (x2,y2) avec rayon r2
(l'ofset et la distence entre les 2 cercle)
 */
/*--------------------------------------------------------------------------*/
extern int oslCollCircle(int x1 , int y1 , int r1 ,int x2 , int y2 , int r2 , int offset);


/*-------------------------------------------------------------------------*/
/**
  @brief    Collision par Cercle avec image
  @param    a Image du Premier cercle
  @param    x1 Centre en X du premier cercle
  @param    y1 Centre en y du premier cercle
  @param    b Image du dexieme cercle
  @param    x2 Centre en X du dexieme cercle
  @param    y2 Centre en y du dexieme cercle
  @param    offset l'ofset et la distence entre les 2 cercles


intersection entre 2 cercle avec l'utilisation des images
ne pas oublier de prendre en compte pour le rayon la height et la largeur de l'immage
ex : largeur de 4 et hauteur de 6   ca donne un rayon global de 2.5
 */
/*--------------------------------------------------------------------------*/
extern int oslCollSpriteCircle(OSL_IMAGE *a , int x1 , int y1 , OSL_IMAGE *b , int x2 , int y2 , int offset);


/*-------------------------------------------------------------------------*/
/**
  @brief    Collision par Cercle avec objet
  @param    sprite1 sprite du premier objet
  @param    sprite2 sprite du deuxieme objet
  @param    offset l'ofset et la distence entre les 2 cercles

intersection entre 2 cercle avec l'utilisation des images
ne pas oublier de prendre en compte pour le rayon la hauteur et la largeur de l'immage
ex : largeur de 4 et hauteur de 6   ca donne un rayon global de 2.5
 */
/*--------------------------------------------------------------------------*/
extern int oslCollObjectCircle(OSL_OBJECT* sprite1,OSL_OBJECT* sprite2 ,int offset);

 /*-------------------------------------------------------------------------*/
/**
  @brief    Collision par algorithme bounding box
  @param    img1 1er sprite a comparer
  @param    img1posX Possition en X du Premier Sprite
  @param    img1posY Possition en Y du Premier Sprite
  @param    img2 2eme sprite a comparer
  @param    img2posX Possition en X du deuxieme Sprite
  @param    img2posY Possition en Y du deuxieme Sprite
  @param    Rayon Perimetre qui s'agrandi ou retricit pour la colision

Verifie si il y a une colision dans un rayon de X  pour le sprite img2 pixel entre 2 sprites
Utile par exemple pour une detection de perimetre pour donner des nouvele instruction
algorithme bounding box
 */
/*--------------------------------------------------------------------------*/
extern int oslCollObjetOffset(OSL_OBJECT* sprite1, OSL_OBJECT* sprite2 , float Rayon);


 /*-------------------------------------------------------------------------*/
/**
  @brief    Collision par algorithme bounding box
  @param    img1 1er sprite a comparer
  @param    img1posX Possition en X du Premier Sprite
  @param    img1posY Possition en Y du Premier Sprite
  @param    img2 2eme sprite a comparer
  @param    img2posX Possition en X du deuxieme Sprite
  @param    img2posY Possition en Y du deuxieme Sprite
  @param    Rayon Perimetre qui s'agrandi ou retricit pour la colision

Verifie si il y a une colision dans un rayon de X  pour le sprite img2 pixel entre 2 sprites
Utile par exemple pour une detection de perimetre pour donner des nouvele instruction
algorithme bounding box
 */
/*--------------------------------------------------------------------------*/
extern int oslCollObjetImageOffset(OSL_OBJECT* sprite1, OSL_IMAGE *img2, float img2posX, float img2posY , float Rayon);




//-------EFFET FX--------



/**
 * \struct OSL_EFFECT
 * \brief Utiliser pour la gestion des effets speciaux
 *
 * OSL_EFFECT est une structure pour la gestion des different effets speciaux et masque
 * Pas détailler car il n'est pas necessaire de toucher a quoi que ce soient,les fonctions permette de tout modifier directement
 */
typedef struct {
 int tile;
 int type;
 int speed;
 int tempo;
 OSL_IMAGE *Image;
 int moin,plus;
 int width,height;
 int active;// pour les masques si 1 alor le masque et lancer

 
 unsigned int tempsAB;
 unsigned int tempsBA;
 unsigned int compteur;
 int from;
 int to;
 int nbLoops;
 int currentLoop;
 bool aToB;

 unsigned int duree;
 unsigned int dureemini;
 bool direction;

 unsigned short ZoomX;
 unsigned short unZoomX;
 unsigned short ZoomY;
 unsigned short unZoomY;
 bool growing;

} OSL_EFFECT;



/*-------------------------------------------------------------------------*/
/**
  @brief    Reinitialise les parametres pour reutiliser l'annimation du CUBE
  @param    FX pointeur ver un objet OSL_EFFECT

Reinitialise les parametres pour reutiliser l'annimation du CUBE
 */
/*--------------------------------------------------------------------------*/
extern void oslResetEffect(OSL_EFFECT *FX);

/*-------------------------------------------------------------------------*/
/**
  @brief    Initialisation d'un effet de division de l'image en Cube
  @param    file Fichier Image pour l'annimation
  @param    width largeur de l'annimation (ex : 480)
  @param    height Hauteur de l'annimation (ex : 272)
  @param    type sens de l'annimation (0 = Bas ou 1 = Droite)
  @param    speed Vitesse de l'annimation
  @param    tile taille du tile pour l'effet
  @return   un objet FX Initialiser

Declaration et Initialisation d'un effet de division de l'image en Cube
 */
/*--------------------------------------------------------------------------*/
extern OSL_EFFECT *oslLoadCubeEffect(char *file,int Largeur,int height,int type, int vitesse, int tile);

/*-------------------------------------------------------------------------*/
/**
  @brief    Dessine l'image pour l'annimation du CUBE selont l'animation en X ou en Y
  @param    FX pointeur ver un objet OSL_EFFECT

Dessine l'image pour l'annimation du CUBE selont l'animation en X ou en Y
 */
/*--------------------------------------------------------------------------*/
extern void oslLogoDrawTiles(OSL_EFFECT *FX);

/*-------------------------------------------------------------------------*/
/**
  @brief    Utilisation d'un effet de division de l'image en Cube
  @param    FX pointeur ver un objet OSL_EFFECT

Utilisation d'un effet de division de l'image en Cube
 */
/*--------------------------------------------------------------------------*/
extern void oslActiveCubeFX(OSL_EFFECT *FX);

/*-------------------------------------------------------------------------*/
/**
  @brief    Initialise une effet pour l'utilisation des masque
  @param    file a utiliser pour le Masque (chargement interne, indiquez que le chemin et le fichier)

Initialise une effet pour l'utilisation des masque
 */
/*--------------------------------------------------------------------------*/
extern OSL_EFFECT *oslLoadMaskEffect(char *file);

/*-------------------------------------------------------------------------*/
/**
  @brief    Mise a jour de l'effet pour les masques
  @param    FX pointeur ver un objet OSL_EFFECT

Mise a jour de l'effet pour les masques
 */
/*--------------------------------------------------------------------------*/
extern void oslUpdateMaskEffect(OSL_EFFECT *fx);

/*-------------------------------------------------------------------------*/
/**
  @brief    Affiche l'effet pour le masque
  @param    FX pointeur ver un objet OSL_EFFECT

Affiche l'effet pour le masque
 */
/*--------------------------------------------------------------------------*/
extern void oslDrawMaskEffect(OSL_EFFECT *fx);

/*-------------------------------------------------------------------------*/
/**
  @brief    Indique le sens de l'animation , soit en s'agrandissant , sois en retrecissant
  @param    FX pointeur ver un objet OSL_EFFECT
  @param    plus Indique si l'annimation vas de l'interrieur en s'agrandissant
  @param    moin Indique si l'objet vas de L'exterrieur ver l'interrieur

Indique le sens de l'animation , soit en s'agrandissant , sois en retrecissant
 */
/*--------------------------------------------------------------------------*/
extern void oslActiveEffect(OSL_EFFECT *fx,int plus, int moin);

/*-------------------------------------------------------------------------*/
/**
  @brief    Libere un effet de la memoire
  @param    FX pointeur ver un objet OSL_EFFECT

Libere un effet OSL_EFFECT de la memoire
 */
/*--------------------------------------------------------------------------*/
extern void oslDeleteEffect(OSL_EFFECT *FX);

/*-------------------------------------------------------------------------*/
/**
  @brief    Fait un fade de depard (FadeIn)

Fait un fade de depard avec un Enregistrement de l'image actuel (tout ce fait en Interne)
 */
/*--------------------------------------------------------------------------*/
extern void oslFadeInEffect();


/*-------------------------------------------------------------------------*/
/**
  @brief    faire un masque en carrer en dur
  @param    color Indique la couleur du masque 

faire un masque en carrer en dur qui part de l'exterrieur ver l'interrieur
 */
/*--------------------------------------------------------------------------*/
extern void oslDrawRectangleMaskEffect(OSL_COLOR color);


/*-------------------------------------------------------------------------*/
/**
  @brief    Fait un masque avec plein de petit cube
  @param    tailleX Taille en Largeur des cubes
  @param    TailleY Taille en hauteur des cubes
  @param    color Indique la couleur du masque 

Fait un masque avec plein de petit cube (de la Gauche ver la droite)
 */
/*--------------------------------------------------------------------------*/
extern void oslDrawCubeMaskEffect(int tailleX,int TailleY ,OSL_COLOR color);




#include "chipmunk/chipmunk.h"



//----------INIPARSER--------------


typedef struct _dictionary_ {
	int				n ;		/** Number of entries in dictionary */
	int				size ;	/** Storage size */
	char 		**	val ;	/** List of string values */
	char 		**  key ;	/** List of string keys */
	unsigned	 *	hash ;	/** List of hash values for keys */
} dictionary ;

extern unsigned dictionary_hash(char * key);
extern dictionary * dictionary_new(int size);
extern void dictionary_del(dictionary * vd);
extern char * dictionary_get(dictionary * d, char * key, char * def);
extern int dictionary_set(dictionary * vd, char * key, char * val);
extern void dictionary_unset(dictionary * d, char * key);
extern void dictionary_dump(dictionary * d, FILE * out);


#define iniparser_getstr(d, k)  iniparser_getstring(d, k, NULL)
#define iniparser_setstr        iniparser_set

extern int iniparser_getnsec(dictionary * d);
extern char * iniparser_getsecname(dictionary * d, int n);
extern void iniparser_dump_ini(dictionary * d, FILE * f);
extern void iniparser_dump(dictionary * d, FILE * f);
extern char * iniparser_getstring(dictionary * d, const char * key, char * def);
extern int iniparser_getint(dictionary * d, const char * key, int notfound);
extern double iniparser_getdouble(dictionary * d, char * key, double notfound);
extern int iniparser_getboolean(dictionary * d, const char * key, int notfound);
extern int iniparser_set(dictionary * ini, char * entry, char * val);
extern void iniparser_unset(dictionary * ini, char * entry);
extern int iniparser_find_entry(dictionary * ini, char * entry) ;
extern dictionary * iniparser_load(const char * ininame);
extern void iniparser_freedict(dictionary * d);



//---------PARTICULE--------



#define cGfxParticleSet		4
#define MaxParticles	600
#define cGfxParticleState	4


/**
 * \struct PARTICLE
 * \brief Utiliser pour la gestion des particules
 *
 * PARTICLE est une structure pour la gestion des particules
 * Pas détailler car il n'est pas necessaire de toucher a quoi que ce soient,les fonction permette de tout medifier
 */
typedef struct PARTICLE
{
	int	x[ cGfxParticleSet ];//poss x
	int	y[ cGfxParticleSet ];//poss y
	int	dx[ cGfxParticleSet ];//distance x
	int	dy[ cGfxParticleSet ];//distance y
	int sx[ cGfxParticleSet ];//direction y
	int sy[ cGfxParticleSet ];//direction y
	int	status;


} PARTICLE;

typedef struct OSL_PARTICLES
{

PARTICLE	particle[ MaxParticles ];
OSL_IMAGE		*Images[ cGfxParticleState ];

int life;//	50
int Speed;//	30 //30
int speed_Mini;//	10
int Graviter;//	4

} OSL_PARTICLES;



/*-------------------------------------------------------------------------*/
/**
  @brief    Libere de la memoire du systeme de particule
  @param    Fichier Fichier choisi pour l'image des particules

Initialise un systeme de particule sous la forme : 
OSL_PARTICLES *toto = DevsInitParticule("fichier1.png");
 */
/*--------------------------------------------------------------------------*/
extern OSL_PARTICLES *oslLoadParticles(char *Fichier);


/*-------------------------------------------------------------------------*/
/**
  @brief    Mise a jour des deplacement du systeme de particule
  @param    Part Pointeur ver le Systeme de Particule choisi

Mise a jour des deplacement du systeme de particule
 */
/*--------------------------------------------------------------------------*/
extern void oslUpdateParticles(OSL_PARTICLES *Part);


/*-------------------------------------------------------------------------*/
/**
  @brief    Libere de la memoire du systeme de particule
  @param    Part Pointeur ver le Systeme de Particule choisi
  @param    duree Duree de vie des particules
  @param    vitesse vitesse Max pour les particule
  @param    Graviter Graviter pour les particules
  @param    vitessemini Vitesse minimum des particule

Initialise les parametre du systeme de particule
 */
/*--------------------------------------------------------------------------*/
extern void oslInitParticles(OSL_PARTICLES *Part,int time,int speed,int Graviter,int speedmin);

/*-------------------------------------------------------------------------*/
/**
  @brief    Ajoute des particules
  @param    Part Pointeur ver le Systeme de Particule choisi
  @param    x possition en X
  @param    y possition en Y

Ajoute des particules
 */
/*--------------------------------------------------------------------------*/
extern void oslNewParticles(OSL_PARTICLES *Part, int x, int y );

/*-------------------------------------------------------------------------*/
/**
  @brief    Rendu du systeme de particule
  @param    Part Pointeur ver le Systeme de Particule choisi

Rendu du systeme de particule
 */
/*--------------------------------------------------------------------------*/
extern void oslRenderParticles(OSL_PARTICLES *Part);

/*-------------------------------------------------------------------------*/
/**
  @brief    Libere de la memoire du systeme de particule
  @param    Part Pointeur ver le Systeme de Particule choisi

Libere de la memoire du systeme de particule
 */
/*--------------------------------------------------------------------------*/
extern void oslDeleteParticles(OSL_PARTICLES *Part);

/*-------------------------------------------------------------------------*/
/**
  @brief    modifie la direction X des paticules
  @param    Part Pointeur ver le Systeme de Particule choisi
  @param    x Nouvelle direction en X

modifie la direction X des paticules
 */
/*--------------------------------------------------------------------------*/
extern void oslMoveXParticles( OSL_PARTICLES *Part,int x);


/*-------------------------------------------------------------------------*/
/**
  @brief    modifie la direction X des paticules
  @param    Part Pointeur ver le Systeme de Particule choisi
  @param    x Nouvelle direction en X

modifie la direction X des paticules
 */
/*--------------------------------------------------------------------------*/
extern void oslMoveYParticles( OSL_PARTICLES *Part,int y );



//---------MENUROND--------


/**
 * \struct MENUSPECIAL
 * \brief Utiliser pour la gestion des menu
 *
 * MENUSPECIAL est une structure pour la gestion des menu
 * Pas détailler car il n'est pas necessaire de toucher a quoi que ce soient,les fonction permette de tout medifier
 */
typedef struct {
 
	int AlphaMenu; /*!< alpha celon l'eloignement */
	int AngleVoullue; /*!< angle desiter pour la rotation */
	int nbIcones; /*!< nb d'image dans le cercle */
	int SelectionEncour ; /*!< Ou en et la possition du menu par defaut doit ETRE A 0 */
	OSL_IMAGE *Image; /*!< Image pour le menu */
	int sizeX; /*!< dimantion d'une Icone en X */
	int sizeY; /*!<  dimantion d'une Icone en Y */
	int Eloignement; /*!< Eloignement de menu par rapport a la possition d'origine */
	int test_angle; /*!<  */
	int X; /*!< Possition du menu en X */
	int Y; /*!< Possition du menu en Y */
	int LargeurAnimX; /*!< eloignement de l'annimation entre les icones sur la largeur */
	int LargeurAnimY; /*!< eloignement de l'annimation entre les icones sur la Hauteur */

} OSL_CIRCLE_MENU;


/*-------------------------------------------------------------------------*/
/**
  @brief    Deplacement des Icones dans un sens voulue
  @param    MenuS Pointeur du menu Utiliser
  @param    sens 1 pour la gauche et 0 pour la droite
 
Deplacement des Icones dans un sens voulue
 */
/*--------------------------------------------------------------------------*/
extern void oslMenuMoveIcons(OSL_CIRCLE_MENU *MenuS,int sens);

/*-------------------------------------------------------------------------*/
/**
  @brief    Dessine le menu
  @param    MenuS Pointeur du menu Utiliser
 
dessine le Menu
 */
/*--------------------------------------------------------------------------*/
extern void oslMenuUpdateIcons(OSL_CIRCLE_MENU *MenuS);



/*-------------------------------------------------------------------------*/
/**
  @brief    Retourne la possition du menu
  @param    MenuS Pointeur du menu Utiliser
  @return   Retourne la possition actuelle du menu
 
Retourne la possition actuelle du menu ( ca peut servir lol)
 */
/*--------------------------------------------------------------------------*/
extern int oslMenuReturnIconPosition(OSL_CIRCLE_MENU *MenuS);


/*-------------------------------------------------------------------------*/
/**
  @brief    Dessine le menu
  @param    MenuS Pointeur du menu Utiliser
 
dessine le Menu
 */
/*--------------------------------------------------------------------------*/
extern void oslMenuDrawIcons(OSL_CIRCLE_MENU *MenuS,int angle, int Eloignement);


/*-------------------------------------------------------------------------*/
/**
  @brief    Cree un menu "Cercle"
  @param    nbIcones nombre d'icone Utiliser
  @param    Eloignement Eloignement du depard du menu
  @param    SelectionEncour Selection du depard logiquement 0 en depard
  @param    sizeX sizeY sont la largeur eet la hauteur d'une Icone
  @param    Y sont l'emplacement du menu en X et ne Y
  @param    l'eloignement entre les icones la largeur d'un bout a l'autre en X
  @param    l'eloignement entre les icones la Hauteur d'un bout a l'autre en Y

Initialise une nouveau menu avec effet "Celcle"
 */
/*--------------------------------------------------------------------------*/
extern OSL_CIRCLE_MENU *oslCreateCircleMenu(char *file, int nbIcones, int Eloignement, int SelectionEncour,int sizeX,int sizeY,int X, int Y,int LargeurAnimX, int LargeurAnimY);

/*-------------------------------------------------------------------------*/
/**
  @brief    libere de la memoire le menu Rond
  @param    MenuS Pointeur a Supprimer

Supprime l'effet pour le menu Rond (le libere de la memoire)
 */
/*--------------------------------------------------------------------------*/
extern void oslDeleteCircleMenu(OSL_CIRCLE_MENU *MenuS);



//----------TEXTE-----------

/**
 * \struct OSL_SPECIAL_FONT
 * \brief Utiliser pour la gestion des fonts
 *
 * OSL_SPECIAL_FONT est une structure pour la gestion des different type de fonts
 */
typedef struct {
 int width;/*!< Largeur d'une lettre de la font image */
 int height;/*!< Hauteur d'une lettre de la font image */
 double size;/*!< pour pouvoir etablir une taille de la font (valeur 1 = 100%) */
 OSL_IMAGE *Image;/*!< Image utiliser pour la font */

} OSL_SPECIAL_FONT;


//couleur de texte toute faite
#define JAUNE RGBA(255, 255, 0, 255)
#define ROUGE RGBA(255, 0, 0, 255)
#define VERT RGBA(0, 255, 0, 255)
#define BLEU RGBA(0, 0, 255, 255)
#define NOIR RGBA(0, 0, 0, 255)
#define BLANC RGBA(255, 255, 255, 255)


//anglais Text Color (Tristyl)
#define YELLOW RGBA(255, 255, 0, 255)
#define RED RGBA(255, 0, 0, 255)
#define GREEN RGBA(0, 255, 0, 255)
#define BLUE RGBA(0, 0, 255, 255)
#define BLACK RGBA(0, 0, 0, 255)
#define WHITE RGBA(255, 255, 255, 255)



/*-------------------------------------------------------------------------*/
/**
  @brief    Affichage de texte en relief
  @param    x Possition en X
  @param    y Possition en Y
  @param    couleur Couleur du TExte
  @param    texte Chaine de caracteres a afficher
  @param    alphaBack Affiche un fond derriere

AffichageTexte en Couleur et alpha pour le texte et un alphaBack pour l'arriere du texte le tout en RELIEF
 */
/*--------------------------------------------------------------------------*/
extern void oslPrintColorShadow(int x, int y,OSL_COLOR color,char *text, int alphaBack);


/*-------------------------------------------------------------------------*/
/**
  @brief    Initialise une font a l'aide d'une Image 
  @param    Image Indiquer une Image deja charger
  @param    width Largeur d'un caractere
  @param    height Hauteur d'un caractere
  @param    size Taille du caractere a afficher (utilise un ration au max size = 1.0)

Initialise une font a l'aide d'une Image 
 */
/*--------------------------------------------------------------------------*/
extern OSL_SPECIAL_FONT *oslLoadCharacter(OSL_IMAGE *Image,int width, int height, double size);


/*-------------------------------------------------------------------------*/
/**
  @brief    Affiche un texte avec une font a l'aide d'une image
  @param    font pointeur ver une font OSL_SPECIAL_FONT
  @param    Largeur Largeur d'un caractere
  @param    height Hauteur d'un caractere
  @param    Texte Chaine de caractere a afficher

Affiche un texte avec une font a l'aide d'une image
//lettre possible actuement : abcdefghijklmnopqrstuvx0123456,;:?.()
 */
/*--------------------------------------------------------------------------*/
extern void oslDrawLetter(OSL_SPECIAL_FONT* font,int x, int y, char *Text);

/*-------------------------------------------------------------------------*/
/**
  @brief    dessine un chiffre avec une font en IMAGE, personnalisation garentie
  @param    font pointeur ver une font OSL_SPECIAL_FONT
  @param    x Possition X
  @param    y Possition Y
  @param    nombre Chiffre a dessiner

dessine un chiffre avec une font en IMAGE, personnalisation garentie
 */
/*--------------------------------------------------------------------------*/
extern void oslDrawNumber(OSL_SPECIAL_FONT* font,int x, int y,int number);

/*-------------------------------------------------------------------------*/
/**
  @brief    Retoune la longeur d'un texte au format des fonts de l'oslib
  @param    str chaine de caractere a compter

Retoune la longeur d'un texte au format des fonts de l'oslib
 */
/*--------------------------------------------------------------------------*/
extern int oslStringLength(const char *str);


/*-------------------------------------------------------------------------*/
/**
  @brief    retourne le nombre de chiffre present dans un chiffre ^^
  @param    n Chiffre a verifier

retourne le nombre de chiffre present dans un chiffre ^^
 */
/*--------------------------------------------------------------------------*/
extern unsigned int oslNumberLenght(unsigned int n);


/*-------------------------------------------------------------------------*/
/**
  @brief    Strcpy mais avec une taille max 
  @param    dst Destination de la chaine de caractere
  @param    src source de la chaine de caractere
  @param    maxlen Longueur maximum

Strcpy mais avec une taille max 
 */
/*--------------------------------------------------------------------------*/
extern void oslStringCopy(char *dst, char *src, u32 maxlen);

/*-------------------------------------------------------------------------*/
/**
  @brief    Strcat mais avec une taille max
   @param   dst Destination de la chaine de caractere
  @param    src source de la chaine de caractere
  @param    maxlen Longueur maximum

Strcat mais avec une taille max
 */
/*--------------------------------------------------------------------------*/
extern void oslStringCat(char *dst, char *src, u32 maxlen);


/*-------------------------------------------------------------------------*/
/**
  @brief    retourne le nombre de caractere que un char possede (verification Tres Completes)
  @param    str chaine de caractere a compter 

retourne le nombre de caractere que un char possede (verification Tres Completes)
 */
/*--------------------------------------------------------------------------*/
extern int oslStringToInt (char *str);

///////
extern void oslPrintWavingString( int x, int y, const char *text);


/*-------------------------------------------------------------------------*/
/**
  @brief    affiche un texte avec un deplacement du haut ver le bas
  @param    x Possition X
  @param    y Possition Y
  @param    texte Chaine de caracteres

affiche un texte avec un deplacement du haut ver le bas
 */
/*--------------------------------------------------------------------------*/
extern void oslPrintStirringString( int x, int y, const char *text);


/*-------------------------------------------------------------------------*/
/**
  @brief    Affiche un texte avec une font Devslib a l'aide d'une image avec une limite de longueur
  @param    str Chaine de caractere a afficher
  @param    longeur Longueur Max a afficher

Affiche un texte avec une font Devslib a l'aide d'une image avec une limite de longueur
 */
/*--------------------------------------------------------------------------*/
extern char *oslStringLimit(char *str, int Length);


/*-------------------------------------------------------------------------*/
/**
  @brief    Remplacer des caractere
  @param    txt Texte a rechercher
  @param    Avant Texte Source
  @param    Apres Texte Destination

Remplace toutes les occurances de Avant par Apres dans la chaine txt, puis
renvoie un pointeur sur la nouvelle chaine créée. Renvoie NULL s'il txt
ne contient aucune occurance de Avant.
 */
/*--------------------------------------------------------------------------*/
extern char* oslStringReplace (const char* txt, const char* src, const char* dst);


/*-------------------------------------------------------------------------*/
/**
  @brief    Afficher un texte avec une coloration possible configurable facilement
  @param    PossX Possition X du texte
  @param    PossY Possition Y du texte
  @param    text Chaine de caractere deja scripter

Afficher un texte avec une coloration possible configurable facilement
les defferent parametre sont:
#\w = blanc
#\r = rouge
#\b = bleu
#\p = noir
#\v = vert
#\j = jaune
\n = retour a la ligne
exemple :
"Devsgen test de#\b texte#\r colorer#\j voila\n#\wretour a la #\vligne"

 */
/*--------------------------------------------------------------------------*/
extern void oslScriptText(int PossX, int PossY,char *Text);


/*-------------------------------------------------------------------------*/
/**
  @brief    sert a avoir que l'extention d'un fichier ex:  "toto.txt"  retourne que "txt"
  @param    Depard Chaine de caractere deja scripter

sert a avoir que l'extention d'un fichier ex:  "toto.txt"  retourne que "txt"
 */
/*--------------------------------------------------------------------------*/
extern char *oslFileExtension (char *src);


/*-------------------------------------------------------------------------*/
/**
  @brief    sert a supprimer que l'extention d'un fichier ex:  "toto.txt"  retourne que "toto"
  @param    src Texte a verifier
  @param    dst Destination du texte

sert a supprimer que l'extention d'un fichier ex:  "toto.txt"  retourne que "toto"
 */
/*--------------------------------------------------------------------------*/
extern void oslSuppExtension (char *src, char *dst);


/*-------------------------------------------------------------------------*/
/**
  @brief    sert a supprimer que le chemin d'un fichier ex:  "bidule/toto.txt"  retourne que "toto.txt"
  @param    pathname Chemin a verifier

sert a supprimer que le chemin d'un fichier ex:  "bidule/toto.txt"  retourne que "toto.txt"
 */
/*--------------------------------------------------------------------------*/
extern char *oslSuppPath (char *pathname);


//extern void oslDeleteFont(OSL_SPECIAL_FONT* font);
