//------------------------------------------------------------------------------
// Gestion des touches standard
//------------------------------------------------------------------------------

void    GestionClavier(unsigned char key, int x, int y)  
 {  
    switch (key)
     {
        // Console ON/OFF
        case 178 /* Touche Puissance 2 */:
            if (cg_console_size <= 0) cg_console_size=480;
            if (cg_console==0) cg_console=1;
            else cg_console=0;
            PlaySound("sons/plasmx1a.wav",NULL,SND_ASYNC);
            break;

        // Menu ON/OFF
        case 27 /* Touche Echap */ :
            main_menu=!main_menu;
            map_menu=false;
            graph_menu=false;
            break;

        // Autres touches, notamment pour les déplacements
        default:
            g_keys[key] = true;                     // Grace au booleen, on peut combiner les touches
            break;
     }
 }

//------------------------------------------------------------------------------
// Gestion des touches avancées du clavier (flèches, F1-12, etc ...)
//------------------------------------------------------------------------------

void    GestionSpecial(int key, int x, int y)  
 {  
    switch (key) 
     {  
        // Recentrer
        case GLUT_KEY_HOME :
            mouse_up=mouse_rl=move_rl=run=jump=0;
            break;

        // Descendre
        case GLUT_KEY_PAGE_DOWN :
            jump-=0.5;
            break;

        // Monter
        case GLUT_KEY_PAGE_UP :
            jump+=0.5;
            break;

        case GLUT_KEY_F10:
            exit(0);
            break;
     }
 }

//------------------------------------------------------------------------------
// Gestion des mouvements
//------------------------------------------------------------------------------

void    ClavierBouge()                           
{
    // utilisées pour les déplacements temporaires et les collisions
    register    double  pas_run, pas_move_rl;       // Pas effectués
    register    double  move_rl_tmp=1;              // Droite-Gauche
    register    double  run_tmp=1;                  // Avant-Arrière

    //  EXPLICATIONS
    //
    //  SI une touche est appuyée
    //   {
    //      on calcule un RUN temporaire, avec la formule du TARGETX, pour voir si la position voulue aura un sol
    //      on calcule un MOVE_RL temporaire, avec la formule du TARGETY, idem
    //      SI notre nouvelle position a un sol OU si on est en spectateur
    //       {
    //          on donne la valeur temporaire à RUN
    //          on donne la valeur temporaire à MOVE_RL
    //          SI on est en spectateur, on calcule le nouveau JUMP, avec la formule du targetz
    //          SINON on fait un léger effet de haut-bas lors du déplacement
    //       }
    //      SINON
    //       {
    //          SI il y a un mur devant, on peut toujours "glisser" dessus vers la gauche ou la droite
    //              on donne la valeur temporaire à MOVE_RL, c'est-à-dire qu'on glissera sur le mur sans avancer dans le mur.
    //          SINON
    //              SI il y a un mur devant, on peut toujours "glisser" dessus devant ou derrière
    //                  on donne la valeur temporaire à RUN, c'est-à-dire qu'on glissera sur le mur sans le transpercer
    //       }
    //   }

    // Avancer
    if (g_keys['e'])
     {
        pas_run=(10/temps.fps)*cos(((width-mouse_rl)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
        pas_move_rl=(10/temps.fps)*sin(((mouse_rl-width)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
        run_tmp=run+pas_run;
        move_rl_tmp=move_rl+pas_move_rl;
        if ((mat[(int)((move_rl_tmp+9*pas_move_rl)/scal+1)][(int)((run_tmp+9*pas_run)/scal+1)]==1) || (cg_player==0))
         {
            run=run_tmp;
            move_rl=move_rl_tmp;
            if (cg_player==0) jump+=0.1*sin(((height-mouse_up)/height)*pi/2);
            else jump=2+cos(move_hb/pi/pi)/pi;
         }
        else 
         {
            if (mat[(int)((move_rl_tmp+9*pas_move_rl)/scal+1)][(int)(run/scal+1)]==1) move_rl=move_rl_tmp;
            else if (mat[(int)(move_rl/scal+1)][(int)((run_tmp+9*pas_run)/scal+1)]==1) run=run_tmp;
         }
     }

    // Reculer
    if (g_keys['d'])
     {
        pas_run=(10/temps.fps)*cos(((width-mouse_rl)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
        pas_move_rl=(10/temps.fps)*sin(((mouse_rl-width)/width)*pi/2)*cos(((height-mouse_up)/height)*pi/2);
        run_tmp=run-pas_run;
        move_rl_tmp=move_rl-pas_move_rl;
        if ((mat[(int)((move_rl_tmp-6*pas_move_rl)/scal+1)][(int)((run_tmp-6*pas_run)/scal+1)]==1) || (cg_player==0))
         {
            run=run_tmp;
            move_rl=move_rl_tmp;
            if (cg_player==0) jump-=0.1*sin(((height-mouse_up)/height)*pi/2);
            else jump=2+cos(move_hb/pi/pi)/pi;
         }
        else
         {
            if (mat[(int)((move_rl_tmp-6*pas_move_rl)/scal+1)][(int)(run/scal+1)]==1) move_rl=move_rl_tmp;
            else if (mat[(int)(move_rl/scal+1)][(int)((run_tmp-6*pas_run)/scal+1)]==1) run=run_tmp;
         }
     }

    // Gauche
    if (g_keys['s'])
     {
        pas_run=(10/temps.fps)*sin(((width-mouse_rl)/width)*pi/2);
        pas_move_rl=(10/temps.fps)*cos(((mouse_rl-width)/width)*pi/2);
        run_tmp=run-pas_run;
        move_rl_tmp=move_rl-pas_move_rl;
        if ((mat[(int)((move_rl_tmp-6*pas_move_rl)/scal+1)][(int)((run_tmp-6*pas_run)/scal+1)]==1) || (cg_player==0))
         {
            run=run_tmp;
            move_rl=move_rl_tmp;
            if (cg_player!=0) jump=2+cos(move_hb/pi/pi)/pi;
         }
        else 
         {
            if (mat[(int)((move_rl_tmp-6*pas_move_rl)/scal+1)][(int)(run/scal+1)]==1) move_rl=move_rl_tmp;
            else if (mat[(int)(move_rl/scal+1)][(int)((run_tmp-6*pas_run)/scal+1)]==1) run=run_tmp;
         }
     }

    // Droite
    if (g_keys['f'])
     {
        pas_run=(10/temps.fps)*sin(((width-mouse_rl)/width)*pi/2);
        pas_move_rl=(10/temps.fps)*cos(((mouse_rl-width)/width)*pi/2);
        run_tmp=run+pas_run;
        move_rl_tmp=move_rl+pas_move_rl;
        if ((mat[(int)((move_rl_tmp+6*pas_move_rl)/scal+1)][(int)((run_tmp+6*pas_run)/scal+1)]==1) || (cg_player==0))
         {
            run=run_tmp;
            move_rl=move_rl_tmp;
            if (cg_player!=0) jump=2+cos(move_hb/pi/pi)/pi;
         }
        else 
         {
            if (mat[(int)((move_rl_tmp+6*pas_move_rl)/scal+1)][(int)(run/scal+1)]==1) move_rl=move_rl_tmp;
            else if (mat[(int)(move_rl/scal+1)][(int)((run_tmp+6*pas_run)/scal+1)]==1) run=run_tmp;
         }
     }

    if ((g_keys['e']) || (g_keys['s']) || (g_keys['d']) || (g_keys['f']))
    move_hb+=temps.ecart*75;                                      // Monter-Descendre lorsqu'on marche

    // Zoom ON/OFF, touche espace
    zoom=g_keys[32];

    // Blending ON/OFF
    g_blend = g_keys['b'];
    if (g_blend) Blend_ON
    else Blend_OFF

    // Light ON/OFF
    light=g_keys['l'];
    if (!light) glDisable(GL_LIGHTING);
    else glEnable(GL_LIGHTING);

    // Scroll Up
    if (g_keys['i'] && (scroll>0))                  // Is Up Arrow Being Pressed?
        scroll-=4;                                  // If So, Decrease 'scroll' Moving Screen Down

    // Scroll Down
    if (g_keys['k'] && (scroll<16*(maxtokens-16)))  // Is Down Arrow Being Pressed?
        scroll+=4;                                  // If So, Increase 'scroll' Moving Screen Up
}

//------------------------------------------------------------------------------
// Détecte si une touche normale est relachée, et la désactive si nécessaire
//------------------------------------------------------------------------------

void    KeyN_up(unsigned char key, int x, int y)
 {
    g_keys[key] = false;
 }

//------------------------------------------------------------------------------
// Gestion des mouvements de la souris - dépend de la sensitivity
//------------------------------------------------------------------------------

void    SourisBouge()
 {
    GetCursorPos(&mpos);                            // On récupère la position actuelle du curseur

    // Aucun effet si on regarde à plus de 90° en haut ou 90° en bas
    if ((mouse_up>0-(mpos.y-height)*sensitivity) && (mouse_up<height*2-(mpos.y-height)*sensitivity))
        mouse_up+=(mpos.y-height)*sensitivity;      // souris Haut - Bas
    mouse_rl+=(mpos.x-width)*sensitivity;           // Souris Gauche - Droite

    SetCursorPos(width, height);                    // Repositionne le curseur au centre
 }

//------------------------------------------------------------------------------
// Gestion des tirs à la souris
//------------------------------------------------------------------------------

void    SourisTir(int button, int state, int x, int y)
 {
    int boucle;
    if ((button==GLUT_LEFT_BUTTON) && (state==GLUT_DOWN))
     {
        fire=true;                                  // on active le tir, pour la fumée
        for (boucle=1; boucle<=TOTAL_BOUTON; boucle++)    // Pour les boutons
            if ((mpos.x>bouton[boucle].x1) && (mpos.y>bouton[boucle].y1) && (mpos.x<bouton[boucle].x2) && (mpos.y<bouton[boucle].y2))
                bouton[boucle].clic=!bouton[boucle].clic;
    if (!menu)
        PlaySound("sons/sshotf1b.wav",NULL,SND_ASYNC); // Pour le son du tir
    else
        PlaySound("sons/change.wav",NULL,SND_ASYNC);   // Pour le son du tir
     }
 }

//------------------------------------------------------------------------------
// Fin Du Fichier
//------------------------------------------------------------------------------