/*
    Curseur.h
    
    Ce fichier sert à la manipulation pure et simple du curseur (la main).
*/

//Initialise le curseur c
void InitCurseur(CURSEUR *c)      {
    //En fait, tout devra être refait dans le cas d'un reset système (la mémoire vidéo est complètement
    //écrasée, y.c. les sprites et leurs mosaïques). Mais on gardera tout de même les positions.
    static BOOL initCurs=0;             //Savoir si c'est la première fois.
    int i;
    
    CopieDMA((void*)main_palette,nPalObj(0),16,DMA_16im);
    i=AjouteSprite(main_tiles,32*32);
    CreeObjetStandard(i,0,TAILLE_32x32);
    PlaceObjetXY(objetsUtilises,0,0);
    //Ne pas réinitialiser la position s'il existe déjà (cf description plus haut).
    if (!initCurs)
        c->x=104, c->y=64;
    c->no_sprite=i, c->tiles=main_tiles;
    c->l=15, c->h=21;
    //Déjà initialisé
    initCurs=1;
}

//Bouge la main en tenant compte de sa vitesse maximum
int BougeMain(int no_obj, int x, int y, int vitesse)         {
    //Dernières positions
    static int ancX, ancY;
    int i;

    if (no_obj==-1)         {                   //Stocke les positions
        ancX=x, ancY=y;
    }
    else        {
        //Vitesse maximum
        for (i=0;i<vitesse;i++)     {
            //Comparatif -> déplacement (on peut faire bien mieux mais bon...)
            if (x>ancX)
                ancX++;
            if (x<ancX)
                ancX--;
            if (y>ancY)
                ancY++;
            if (y<ancY)
                ancY--;
        }
        //Déplace l'objet avec support des positions négatives (même si ça ne devrait pas arriver souvent en fait)
        PlaceObjetEx(no_obj,ancX,ancY);
    }
    //Retourne si les positions sont bonnes (la souris est à l'endroit spécifié).
    return (ancX==x && ancY==y);
}

//Différents points de défilement pour la caméra
enum points_cameras {CAMERA_GAUCHE=80, CAMERA_HAUT=55, CAMERA_DROITE=144, CAMERA_BAS=95};

//Adapte l'écran ecr en fonction du curseur c, ceci en faisant défiler si le curseur en est trop éloigné du centre.
void GereCurseur(CURSEUR *c, ECRAN *ecr)      {
    static int vitesse=8, premFois=1;
    int i;
    
    //Gestion de l'accélération en virgule fixe (3 bits)
    if (vitesse<32)
        vitesse++;

    //Vérification des touches appuyées
    if (REG_TOUCHES&TOUCHE_GAUCHE)
        c->x-=vitesse>>3;
    if (REG_TOUCHES&TOUCHE_DROITE)
        c->x+=vitesse>>3;
    if (REG_TOUCHES&TOUCHE_HAUT)
        c->y-=vitesse>>3;
    if (REG_TOUCHES&TOUCHE_BAS)
        c->y+=vitesse>>3;

    //Aucune touche directionnelle?
    if (!(REG_TOUCHES&0xf0))
        vitesse=8;                  //On reprent la vitesse de départ (minuscule)

    //Vérifications pour savoir si le curseur a dépassé l'un des coins de la carte
    if (c->x<0)         c->x=0;
    if (c->y<0)         c->y=0;
    if (c->x+c->l>=sizeof(plan_map[0])*4)
        c->x=sizeof(plan_map[0])*4-c->l;
    if (c->y+c->h>=sizeof(plan_map)/sizeof(plan_map[0])*8)
        c->y=sizeof(plan_map)/sizeof(plan_map[0])*8-c->h;

    //Bouge la caméra en fonction de la position relative du curseur sur l'écran
    i=c->x-ecr->x;
    if (i<CAMERA_GAUCHE)
        ecr->x-=CAMERA_GAUCHE-i;
    if (i>CAMERA_DROITE)
        ecr->x-=CAMERA_DROITE-i;
    i=c->y-ecr->y;
    if (i<CAMERA_HAUT)
        ecr->y-=CAMERA_HAUT-i;
    if (i>CAMERA_BAS)
        ecr->y-=CAMERA_BAS-i;

    //Vérification des dépassements de la map (de tous les côtés)
    if (ecr->x<0)        ecr->x=0;
    if (ecr->y<0)        ecr->y=0;
    if (ecr->x+240>=sizeof(plan_map[0])*4)
        ecr->x=sizeof(plan_map[0])*4-240;
    if (ecr->y+160>=sizeof(plan_map)/sizeof(plan_map[0])*8)
        ecr->y=sizeof(plan_map)/sizeof(plan_map[0])*8-160;

    //Bouge le sprite de la main
    BougeMain(premFois?-1:c->no_sprite,c->x-ecr->x,c->y-ecr->y,8);
    premFois=0;
}


