#ifndef COMMUN_H
#define COMMUN_H

#define DEBOGAGE

// #Libgba
#include <gba_interrupt.h>
#include <gba_video.h>
#include <gba_dma.h>
#include <gba_input.h>
#include <gba_sprites.h>
#include <gba_affine.h>
#include <gba_base.h>
#include <gba_systemcalls.h>
#include <gba_types.h>
#include <gba_timers.h>
#include <gba_sound.h>

#include "sonictypes.h"
#include "defines.h"
#include "donnees_hp.h"

//Pour les listes de sprites
typedef struct
{
	unsigned short numTile;
	unsigned char forme, taille;
	unsigned char offsetX, offsetY;
} SPRITE_SCRIPT;

typedef struct
{
	unsigned short tileLen;
	unsigned short sptLen;
	const SPRITE_SCRIPT *script;
} SCRIPT_BLOCK;

typedef struct
{
	unsigned short type, x, y;
	unsigned short param1, param2, param3, param4;
} SPRITE_LISTE;

// Map d'avant-plan (normale)
typedef struct
{
	u16 largeur, hauteur;				// Un de moins que la taille réelle de la map sera visible pour éviter des problèmes de décompression. Maximum 1024x512!!!!
	u16 sonicX, sonicY;					// Positions de départ de Sonic
	const unsigned char *tileset;		// Tileset à utiliser

	const unsigned short *mapGfx;		// Map graphique
	const unsigned short *mapCol;		// Map de collisions
	ANIMATION *tblAnims;

	u8 bitsPerPixel;					// Bits par pixel du tileset texte
	u16 maxTiles;						// Maximum de tiles affichables à l'écran. A un impact sur la mémoire vidéo utilisée. Normalement 128, utilisant 50% de la VRAM en mode 8 bits.
} FGMAP_INFO;

//Map d'arrière-plan (fond, plus complexe)
typedef struct
{
	const unsigned char *BGtileset; //Pour l'arrière-plan
	u32 BGtilTaille;        //Taille du tileset
	const unsigned short *BGpalette;				//Palette du BG (la map être en 16 couleurs et doit utiliser les palettes 8 et 9 seulement)
	u32 BGpalTaille;								//Taille de la palette
	const unsigned short *BGmap;					//Map du BG
	u16 bgLargeur, bgHauteur;						//Dimensions du BG

	const unsigned short *linescrollScript;			//Script de scrolling
	s16 scrollY;									//Amplitude de scrolling vertical. Le FG est à 256 (1).
} BGMAP_INFO;

typedef struct
{
	const unsigned int *nbEle;
	const SPRITE_LISTE *liste;
} SPRITE_INFO;

typedef struct
{
	u8 blocage_angle;        //Permet de choisir si aller sur une plate-forme avec bit masque_pas_angle (0x1000) arrondit l'angle aux 45° près (=1) ou garde le dernier angle (=0)
	void (*fctTypesSpeciaux) (SONIC *, u32);
	u8 using_bg3;                //Laisse le BG3 libre
} ENGINE_INFO;

typedef struct
{
	int id;                        //Identificateur du niveau
	int specialite; //Spécialité, doit être nulle!
	char *nom;                //Nom suivi d'un nombre
	int acte;                //Numéro d'acte
	FGMAP_INFO fgmi;        //Infos pour l'avant plan
	int niveau_eau, couleur_eau, alpha_eau; //eau
	BGMAP_INFO bgmi;                        //Infos pour l'arrière-plan
	SPRITE_INFO spi;                        //Infos pour le plan sprites
	ENGINE_INFO ei;                                //Infos pour le moteur
	char *nom_musique;                        //Fichier musique
	void (*fctInit) ();
	void (*fctLoop) ();
	void (*fctPalette) ();
	void (*fctApresPalette) (); //Après que les palettes aient été créées
	void (*fctVBL) ();                        //Après la VSync
}
LEVEL_INFO;

//Tailles des sprites
#define TAILLE_8x8                0, 0
#define TAILLE_16x16        0, 1
#define TAILLE_32x32        0, 2
#define TAILLE_64x64        0, 3
#define TAILLE_16x8                1, 0
#define TAILLE_32x8                1, 1
#define TAILLE_32x16        1, 2
#define TAILLE_64x32        1, 3
#define TAILLE_8x16                2, 0
#define TAILLE_8x32                2, 1
#define TAILLE_16x32        2, 2
#define TAILLE_32x64        2, 3

typedef struct
{
	u16 x, y, no_obj;
}
SPRITE_SUP;

#define SPRITES_SUP_MAX 128
extern SPRITE_SUP sprites_sup[SPRITES_SUP_MAX] EWRAM_DATA;
extern u32 nSpritesSup;

extern void IWRAM_CODE AjSpriteSup(u32 x, u32 y);

//extern void JoueSon(int num_voie, const char *nom);
extern void IWRAM_CODE VerifieSIlYABesoinDePlacerUnSprite(u32 x, u32 y, ECRAN *ecr);

#include "handlers_p.h"
#include "persos.h"
#include "routines.h"
#include "Map.h"
#include "moteur2d.h"
#include "Outils.h"
#include "main.h"
#include "sysSprites.h"
#include "tables.h"
#include "filesystem.h"
#include "son.h"
#include "handlers_cp.h"
#include "handlers_p.h"
#include "fades.h"
//#include "Special_stage.h"
#include "menu.h"
#include "etats.h"
#include "texte.h"

//Externe
#include "Externe/niveaux.h"
#include "Externe/objets.h"
#include "Externe/sonic.h"
#ifndef SONIC_SDK
	#include "Res/all.h"
#else
	#include "../Donnees/all.h"
#endif
#endif //COMMUN_H
