/* All the comon types, which are used in more than one .c file */
/* P.K. */

/* ---------- Structures and types for the structures---------- */
/* animation */
#ifndef __animation__
#define __animation__
typedef struct {
  Uint8 **frame;
  int nframes;
}animation;
#endif // __animation__

/* Sprite */
#ifndef __Sprite__
#define __Sprite__
typedef struct {
  Uint8 decalage;
  SDL_Palette *palette;
  animation **anims;
  int nanims;
  char *nom;
}Sprite;
#endif // __Sprite__

/* Coordinates x and y */
#ifndef __Coord__
#define __Coord__
typedef struct {
  int x;
  int y;
}Coord;
#endif // __Coord__

/* Bombe */
#ifndef __Bombe__
#define __Bombe__
typedef struct _Bombe Bombe;

struct _Bombe {
  Coord pos;
  int rebours;
  int lflammes;
  int car;
  Bombe * suiv;
  Bombe * prec;
};
#endif // __Bombe__

/* Bombelist */
#ifndef __Bombelist__
#define __Bombelist__
typedef struct _Bombelist Bombelist;

struct _Bombelist {
  Bombe * contenu;
  Bombelist * suiv;
};
#endif // __Bombelist__

/* Anims */
#ifndef __Anims__
#define __Anims__
typedef struct _Anims Anims;

struct _Anims {
  Coord pos;
  Sprite *sprite;
  int anim;
  int frame;
  int vitesse;
  int compteur;
  int duree;
  Anims * suiv;
  Anims * prec;
};
#endif // __Anims__

/* Evenements */
#ifndef __Evenements__
#define __Evenements__
typedef struct _Evenement Evenement;

struct _Evenement{
  int delai;
  int delaisg;
  int fois;
  int proprietaire;
  int param;
  Coord pos;
  void (*fonction)(Evenement *);
  void (*termine)(Evenement *);
  Evenement * suiv;
  Evenement * prec;
};
#endif // __Evenements__

/* Pouvoir */
#ifndef __Pouvoir__
#define __Pouvoir__
typedef struct {
  void (*f)(int n, int p, int action);
  int energie;
  int type;
}Pouvoir;
#endif // __Pouvoir__


/* Commandes ?? */
#ifndef __Commandes__
#define __Commandes__
typedef struct {
  SDL_Joystick *joy; // NULL si clavier
  int haut; // Indique aussi le no du joy le cas échéant
  int bas;
  int gauche;
  int droite;
  int b1;
  int b2;
  int actif;
  int precedent;
}Commandes;
#endif // __Commandes__

/* One "Personnage" */
#ifndef __Personnage__
#define __Personnage__
typedef struct {
  int joueurIA;
  // Variables : -de mouvement
  Coord pos;
  Coord pixpos;
  unsigned int anim;
  int dir;
  int mv;
  // -de situation
  unsigned int statut;
  int animdroite;
  //  int framedroite;
  unsigned int energie;
  unsigned int lflammes;
  // -de bombes
  Bombe * bombes;
  //  int nbbombes;
  // -de pouvoirs
  int pouvactif[4];
  int pouvoirparam;
  // Constantes
  Commandes cmd;
  Pouvoir pouv[4];
}Personnage;
#endif // __Personnage__


/* Plateau element and its parameter */
#ifndef __Plan__
#define __Plan__
typedef int Parameter; //Parameter of the element

typedef struct {       // One element of the nive (uniform structure for both nived and main)
  int type;            // type of the element
  int bombe;           // is there a bombe?
  Sprite *elem;        // sprite object
  int anim;            // which animation
  int frame;           // which frame of the animation
  Parameter *params;   // poiter to the first Parameter
  int nparams;         // number of parametres
  /* Si le sol doit être dessiné en-dessous de l'élément */
  int sol;             // space as background
  int fixe;            // ceratin sprinte number
  void (*evt)(Evenement *); // ??
  /* Pour la sauvegarde en cas de changement (bouton...) */
  int typesg, animsg, framesg; //??
  Sprite *elemsg;      //??
} PlateauElement;

/* Game plan */
typedef PlateauElement ** Plan_; // The gameplan is a dynamic field

typedef struct {
  PlateauElement ** element;    // elements on the plane
  int nivewidth;                // size of the nive
  int niveheight;
} Plan;

#endif // __Plan__


/* Game modes (gamemode, danslemenu, tete) */
#ifndef __Modes__
#define __Modes__
typedef struct {
  int tete;
  int gamemode;
  int danslemenu;
} Modes;
#endif // __Modes__


/* Pouvoirspecial */
#ifndef __Pouvoirspecial__
#define __Pouvoirspecial__
typedef void (*Pouvoirspecial)(int n, int p);
#endif // __Pouvoirspecial__

/* paletsg */
#ifndef __paletsg__
#define __paletsg__
typedef struct {
  SDL_Color *pal1;
  SDL_Color *pal2;
  int debut1;
  int fin1;
  int debut2;
  int fin2;
}paletsg;
#endif // __paletsg__


/* Resolution variables */
#ifndef __Resolution__
#define __Resolution__
typedef struct {
  int window_width;  // Size of the window
  int window_height;
  int plan_width;    // Size of the playground
  int plan_height;
  int x_offset;      // Offset of the playground
  int y_offset;
} Resolution;
#endif // __Resolution__
