#include <STDIO.H>
#include <STRING.H>
#include "SOUREXEC/EXECGRAP.H"
#include "SOUREXEC/EXECCLAV.H"
#include "SOUREXEC/EXECOUTI.H"
#include "SOUREXEC/EXECCHAR.H"
#define ATTRBX 1
#define ATTRBY 1
#define FICHIER_SCORES "scores.dat"
#define FICHIER_FILEDATA "donnees.dat"
#define X_DONNEES 8
#define Y_DONNEES 45
#define SPC_LIGNE 10
#define X_REPERE 24
#define X_NOM 160
#define X_SERIE 24
#define X_TAB_DEB 24
#define X_TAB_FIN 24
#define X_SCORE 0
#define CC_REPERE 96
#define CC_NOM 208
#define CC_SERIE 9
#define CC_TAB_DEB 245
#define CC_TAB_FIN 245
#define CC_SCORE 240
#define CF 0
#define NB_SCORES 30
#define CAR_NOM 20
void Afficher_Scores (char);
BOOL Lire_Scores (void);
BOOL Sauver_Scores (void);
void Init_Scores (void);
BOOL Lire_Filedata (void);
BOOL Sauver_Filedata (ULONG,short);
char Determiner_Rang (ULONG);
void Decaler_Rang (char);
void Inserer_Valeurs (char);
void Saisir_Nom (char,char);
extern char NOM_TABLEAU [];
extern short numero_tableau;
extern short numero_serie;
typedef struct
{
    char noms [NB_SCORES][CAR_NOM];
    short serie [NB_SCORES];
    short tab_deb [NB_SCORES];
    short tab_fin [NB_SCORES];
    ULONG scores [NB_SCORES];
} enreg_scores;
enreg_scores scores;
typedef struct
{
    ULONG score;
    short tableau;
} enreg_filedata;
enreg_filedata filedata;
void Page_Scores (BOOL saisie)
{
    BOOL etat;
    char rang;
    enreg_menu menu4;
    menu4.page = PAGE0;
    menu4.select = 0;
    menu4.cl_car1 = 97;
    menu4.cl_car2 = 113;
    menu4.cl_fond = 0;
    menu4.y_ecran = 392;
    menu4.largeur_ecran = 320;
    menu4.hauteur_option_maxi = 8;
    menu4.nombre_option = 1;
    menu4.echelle_x = 1;
    menu4.echelle_y = 1;
    strcpy (menu4.option[0],"RETOUR");
    etat = Lire_Scores ();
    if (etat == FAUX)
    {
        Init_Scores ();
        etat = Sauver_Scores ();
        if (etat == FAUX)
            return;
    }
    if (saisie == SAISIE_ON)
    {
        etat = Lire_Filedata ();
        if (etat == VRAI)
        {
            if ( (filedata.score >= scores.scores [NB_SCORES - 1]) &
                    (filedata.score != 0) )
            {
                rang = Determiner_Rang (filedata.score);
                Decaler_Rang (rang);
                Inserer_Valeurs (rang);
                Cls (PAGE0,0);
                Print_Titre (PAGE0,0,"SCORES");
                Afficher_Menu (&menu4);
                Marquer_Option_Serpent (PAGE0,&menu4,OFF);
                Afficher_Scores (PAGE0);
                Afficher_Page (PAGE0);
                Saisir_Nom (PAGE0,rang);
                Sauver_Scores ();
                Marquer_Option_Serpent (PAGE0,&menu4,ON);
                Select_Option (PAGE0,&menu4);
                Sauver_Filedata (0L,0);
            }
            else
                Afficher_Page (PAGE0);
        }
    }
    else
    {
        Cls (PAGE0,0);
        Print_Titre (PAGE0,0,"SCORES");
        Afficher_Menu (&menu4);
        Afficher_Scores (PAGE0);
        Afficher_Page (PAGE0);
        Select_Option (PAGE0,&menu4);
        Afficher_Page (PAGE1);
    }
}
void Afficher_Scores (char page)
{
    char attrb;
    short x;
    short y;
    char cpt;
    x = X_DONNEES;
    y = Y_DONNEES;
    for (cpt = 0;
            cpt < NB_SCORES;
            cpt ++)
    {
        attrb = (cpt < 3) ? 1 : 0;
        Print_Vl (page,ATTRBX,ATTRBY + attrb,x,y,CC_REPERE,CF,2,cpt + 1);
        x += X_REPERE;
        Print (PAGE0,ATTRBX,ATTRBY + attrb,x,y,CC_NOM,CF,scores.noms [cpt]);
        x += X_NOM;
        Print_Vl (page,ATTRBX,ATTRBY + attrb,x,y,CC_SERIE,CF,2,scores.serie [cpt]);
        x += X_SERIE;
        Print_Vl (page,ATTRBX,ATTRBY + attrb,x,y,CC_TAB_DEB,CF,2,scores.tab_deb [cpt]);
        x += X_TAB_DEB;
        Print_Vl (page,ATTRBX,ATTRBY + attrb,x,y,CC_TAB_FIN,CF,2,scores.tab_fin [cpt]);
        x += X_TAB_FIN;
        Print_Vl (page,ATTRBX + 0,ATTRBY + attrb,x,y,CC_SCORE,CF,6,scores.scores [cpt]);
        x += X_SCORE;
        x = X_DONNEES;
        y += (ATTRBY + attrb) * SPC_LIGNE;
    }
}
BOOL Lire_Scores (void)
{
    BOOL sortie;
    FILE *flux;
    flux = fopen(FICHIER_SCORES,"rb");
    if (flux == NULL)
        sortie = FAUX;
    else
    {
        fread (&scores.noms[0][0],sizeof (enreg_scores),1,flux);
        fclose (flux);
        sortie = VRAI;
    }
    return (sortie);
}
BOOL Sauver_Scores (void)
{
    BOOL sortie;
    FILE *flux;
    flux = fopen(FICHIER_SCORES,"wb");
    if (flux == NULL)
        sortie = FAUX;
    else
    {
        fwrite (&scores.noms[0][0],sizeof (enreg_scores),1,flux);
        fclose (flux);
        sortie = VRAI;
    }
    return (sortie);
}
void Init_Scores (void)
{
    char ind;
    char cpt;
    for (cpt = 0;
            cpt < NB_SCORES;
            cpt ++)
    {
        for (ind = 0;
                ind < (CAR_NOM - 1);
                ind ++)
            strcpy (&scores.noms [cpt][ind]," ");
        strcpy (&scores.noms [cpt][CAR_NOM - 1],"\0");
        scores.serie [cpt] = 0;
        scores.tab_deb [cpt] = 0;
        scores.tab_fin [cpt] = 0;
        scores.scores [cpt] = 0;
    }
}
BOOL Lire_Filedata (void)
{
    BOOL sortie;
    FILE *flux;
    flux = fopen(FICHIER_FILEDATA,"rb");
    if (flux == NULL)
        sortie = FAUX;
    else
    {
        fread (&filedata.score,sizeof (enreg_filedata),1,flux);
        fclose (flux);
        sortie = VRAI;
    }
    return (sortie);
}
BOOL Sauver_Filedata (ULONG score,short tableau)
{
    BOOL sortie;
    FILE *flux;
    flux = fopen(FICHIER_FILEDATA,"wb");
    if (flux == NULL)
        sortie = FAUX;
    else
    {
        filedata.score = score;
        filedata.tableau = tableau;
        fwrite (&filedata.score,sizeof (enreg_filedata),1,flux);
        fclose (flux);
        sortie = VRAI;
    }
    return (sortie);
}
char Determiner_Rang (ULONG score)
{
    char cpt;
    for (cpt = 0;
            cpt < NB_SCORES;
            cpt ++)
        if (scores.scores [cpt] <= score)
            break;
    return (cpt);
}
void Decaler_Rang (char indice)
{
    char cpt;
    if (indice < (NB_SCORES - 1))
    {
        for (cpt = (NB_SCORES - 1);
                cpt > indice;
                cpt --)
        {
            strcpy (&scores.noms [cpt][0],&scores.noms [cpt - 1][0]);
            scores.serie [cpt] = scores.serie [cpt - 1];
            scores.tab_deb [cpt] = scores.tab_deb [cpt - 1];
            scores.tab_fin [cpt] = scores.tab_fin [cpt - 1];
            scores.scores [cpt] = scores.scores [cpt - 1];
        }
    }
}
void Inserer_Valeurs (char indice)
{
    scores.serie [indice] = numero_serie;
    scores.tab_deb [indice] = numero_tableau;
    scores.tab_fin [indice] = filedata.tableau;
    scores.scores [indice] = filedata.score;
}
void Saisir_Nom (char page,char indice)
{
    short x,y;
    char cpt;
    char attrb;
    x = X_DONNEES + X_REPERE;
    y = Y_DONNEES;
    for (cpt = 0;
            cpt < indice;
            cpt ++)
    {
        attrb = (cpt < 3) ? 1 : 0;
        y += (ATTRBY + attrb) * SPC_LIGNE;
    }
    attrb = (indice < 3) ? 1 : 0;
    Input (page,ATTRBX,
           ATTRBY + attrb,
           x,
           y,
           213,
           0,
           240,
           ALP,
           CAR_NOM - 1,
           &scores.noms [indice][0]);
    for (cpt = 0;
            cpt < CAR_NOM;
            cpt ++)
        Print (page,ATTRBX,
               ATTRBY + attrb,
               x + (cpt * 8),
               y,
               CC_NOM,
               CF,
               " ");
    Print (page,ATTRBX,
           ATTRBY + attrb,
           x,
           y,
           CC_NOM,
           CF,
           &scores.noms [indice][0]);
}