#define TAILLEX_ECRAN        16
#define TAILLEY_ECRAN        11
#define LARGEUR_MAP_BUFFER (TAILLEX_ECRAN + 8)
#define HAUTEUR_MAP_BUFFER (TAILLEY_ECRAN + 8)
#define LARGEUR_MAP_HARDWARE 32
// Car des blocs de 8x8 et on calcule tout en 16x16
#define HAUTEUR_MAP_HARDWARE (TAILLEY_ECRAN * 2)
#define LARGEUR_MAP_BG		 32
#define LARGEUR_MAP_BG_VISIBLE 31
#define HAUTEUR_MAP_BG_VISIBLE 21

extern unsigned short EWRAM_DATA tableau1[HAUTEUR_MAP_HARDWARE][LARGEUR_MAP_HARDWARE], tableau3[HAUTEUR_MAP_HARDWARE][LARGEUR_MAP_HARDWARE];
extern u16 EWRAM_DATA MapGfx[HAUTEUR_MAP_BUFFER][LARGEUR_MAP_BUFFER];
extern u16 *cMap;
extern u16 cMapLargeur;
extern u16 (*tableau)[LARGEUR_MAP_HARDWARE];

extern void IWRAM_CODE ClearBloc_16(u32 x, u32 y);
extern void IWRAM_CODE DecompresseDonnees
                                        (
                                                int plan,
                                                int departX,
                                                int departY,
                                                int tailleX,
                                                int tailleY,
                                                int cibleX,
                                                int cibleY,
                                                void *map,
                                                int largeurMap
                                        );

extern u16 map_maxTiles;			//Nombre maximum de tiles dans le moteur de tiles infinies (128 par défaut)
extern u32 map_maxSpriteMem;			//Taille maximum de la VRAM pour les sprites (24 ko par défaut)
extern u8 map_bitsPerPixelShift;	// (1 << ce_nombre) => nombre d'octets par tile (128 en mode 4 bits, donc cette variable vaut 7)

extern u16 EWRAM_DATA utilTiles[2000];
extern u16 EWRAM_DATA numTiles[800];        //C'est trop. map_maxTiles+16*11 suffirait largement, je suppose.
extern u16 EWRAM_DATA copieTiles[2000];
extern u16 map_nTiles;

extern void InitTileSystem();

extern int depassement;                        //Uniquement pour la détection d'erreurs. Il faut que l'on sache que si le jeu plante, il faudra prévoir plus de tiles à disposition ou (en l'occurence) réduire le nombre de tiles utilisées par un monde. En imaginant que chaque tile est différente, cela nécessiterait 176 tiles, mais avec 128 tiles, je remplis déjà la VRAM à moitié, reste le fond, le texte, ... faut pas exagérer!
extern void CopieTile(unsigned short tileVirtuelle, unsigned short tile);
extern void OptTiles();
extern int IWRAM_CODE ChercheTile(int val);

//extern void IWRAM_CODE CopieBloc_16(int x, int y, unsigned short bloc);
extern void IWRAM_CODE CopieBloc_16(int x, int y, unsigned short bloc, unsigned short flags);

extern void IWRAM_CODE DessineRect(int rLeft, int rTop, int rRight, int rBottom);
extern void CopieMap_16
                        (
                                int departX,
                                int departY,        /* int tailleX, int tailleY,*/
                                int tailleMapX,
                                int tailleMapY,
                                int largeurEcran
                        );

extern void calcIndex(int plan, unsigned short *ptr);
extern void IWRAM_CODE ClipSpriteXY(int no_objet, int posX, int posY);

extern void IWRAM_CODE AnalyseRect(int rLeft, int rTop, int rRight, int rBottom, int departX, int departY);
extern void AffObjets(int scrlX, int scrlY, int tailleX, int tailleY, int tailleMapX, int tailleMapY, int largeurEcran);

#define modulo8(nombre)			((nombre) - (((nombre) >> 3) << 3))
#define modulo16(nombre)		((nombre) - (((nombre) >> 4) << 4))
#define TILE					16

extern void GereScrolling(SONIC *sonic, int *scrlX, int *scrlY);

extern void CopieSpriteMem(const unsigned char *tiles, unsigned int taille);
extern void CopieSprites();

extern void GereAnims();
extern void ChangeTile(int tileSrc, int tileDst);
extern void ChangePlusieursTiles(int tileSrc, int tileDst, int nombre);

extern void IWRAM_CODE CopieMapBG(int scrlX, int scrlY);
extern const u8 *adrTiles256;
extern void ExecHandler(const SPRITE_LISTE *sl);

extern u16 decompMap[128][128] EWRAM_DATA;
extern s16 advMapOffsetX, advMapOffsetY;

extern int gblNoObjet;

extern s32 viewportX0, viewportY0, viewportX1, viewportY1;
extern s32 desiredViewportX0, desiredViewportY0, desiredViewportX1, desiredViewportY1;

extern u8 gblSFXTrembleCamera;
