extern s32 plan;

#define VIRGULE 8
#define UNITE 256
#define VITESSE_MIN 32
#define vDIV_(x)		((x)/256)
#define vMUL_(x)		((x)*256)
#define vDIV(x)		((x)>>8)
#define vMUL(x)		((x)<<8)
//#define vDIV_rapide(x)		((x)>>8)
//#define vMUL_rapide(x)		((x)<<8)

//#define Element(x,y)        (Map[(y)>>4][(x)>>4]&masque)
extern u32 IWRAM_CODE Element(u32 x, u32 y);
extern u32 IWRAM_CODE Map(u32 x, u32 y);
extern unsigned int calcPA(SONIC *s);
extern int zoneValide(int pX, int pY, int tolX, int tolY);

/*
    CONSTANTES PHYSIQUES

    Indispensable pour que le programme puisse fonctionner ;-)
    Attention: les vitesses ne doivent pas dépasser 16!
*/
enum points_d_attration {PA_BAS, PA_DROITE, PA_HAUT, PA_GAUCHE};
//#define vitesseMAX	vMUL(15)
#define vitesseMAX	vMUL(32)
extern int vitesseAMAX;
//#define vitesseAMAX	vMUL(8)
#define G				2
#define F				2
#define ACCEL           1
#define GRAVITE_DEPART	vMUL(1)
//#define GRAVITE_DEPART	1
#define GRAVITE_MIN	    (GRAVITE_DEPART+_vMUL(1)/2)
//#define VECTEUR_SAUT    5.7
//#define VECTEUR_SAUT    1459
#define VECTEUR_SAUT    (7<<8)
#define DIV 16
#define MIN_DECOLE 2            //Décollage minimum nécessitant la fin de la boule. Si cela vaut 2, ça signifie que le moteur est stable, sinon faudra aviser =)
#define VMAX_STANDARD   vMUL(6)
#define VMAX_SUPER_VITESSE vMUL(10)

extern void GereTouches(SONIC *s);
extern void Moteur2D(SONIC *s);

#define P 16

#define TYPE_BAS  0x10
#define TYPE_HAUT 0x100
#define TYPE_SPEC 0x1d0

#define PASSE_BAS 0x0f
#define MASQUE_PASSE_BAS 0x800
#define MASQUE_PAS_ANGLE 0x1000
#define MASQUE_ENNEMIS (0x600|MASQUE_PASSE_BAS|MASQUE_PAS_ANGLE)
#define MASQUE_SONIC (MASQUE_PASSE_BAS|MASQUE_PAS_ANGLE)

extern u32 IWRAM_CODE PointDeCollision(unsigned int x, unsigned int y);
extern u32 IWRAM_CODE MoteurCollisions(SONIC *s, int vx, int vy);

extern void InitSonic(SONIC *s, short x, short y, short l, short h, short vitesse);
extern int coordValide(int coordX, int coordY);


