/**************************************************************************
DECOR TILEMAP: Ce programme construit aléatoirement un decor à l'écran
               en utilisant des éléments graphiques standardisés
               de taille 100x100 ( tuiles )

               L'image finale est assemblée en juxtaposant ces éléments,
               sélectionnés au hasard, dans une table de tuiles.

               Appuyer sur une touche pour refaire un nouveau labyrinthe.

**************************************************************************/

#include <allegro.h>
#include <time.h>


// Pour plus de simplicité : constantes des tuiles utilisées en globale
// ( pour gérer plusieurs ensembles de tuiles il faudrait
//   mettre ces informations dans une structure ... )

#define NTUILE       6    // Nombre de tuiles graphiques utilisées
#define TXTUILE    100    // Largeur des tuiles
#define TYTUILE    100    // Hauteur des tuiles
#define NCOLTUILE    3    // Nombre de colonnes de tuiles dans le fichier image

// Sur cet exemple on a un seul ensemble de tuiles
// ( on s'autorise une globale, là encore pour simplifier )
BITMAP *tableTuiles;



/******************************************/
/*         SOUS-PROGRAMMES                */
/******************************************/


// Dessine la tuile numéro ituile sur la bitmap bmp au coordonnées xmap ymap
// (unité en nombre de tuiles, pas en pixels)
void dessineTuile(BITMAP *bmp, int ituile, int xmap, int ymap){
    int lig, col; // ligne et colonne de la tuile source dans tableTuiles

    // Le numéro de ligne et de colonne dans un tableau 2D
    // à partir de l'indice du ième élément (en comptant de gauche à droite
    // et de haut en bas) s'obtiennent avec le quotient et le reste
    // dans la division de l'indice par le nombre de colonnes du tableau
    lig = ituile / NCOLTUILE;
    col = ituile % NCOLTUILE;

    // on copie juste le morceau concerné
    blit(tableTuiles, bmp, col*TXTUILE, lig*TYTUILE,
         xmap*TXTUILE, ymap*TYTUILE, TXTUILE, TYTUILE);
}

// Chargement "sécurisé" d'une image :
// interrompt le programme avec un message si problème...
BITMAP * load_bitmap_check(char *nomImage){
    BITMAP *bmp;
    bmp=load_bitmap(nomImage,NULL);
    if (!bmp)
    {
        allegro_message("pas pu trouver %s",nomImage);
        exit(EXIT_FAILURE);
    }
    return bmp;
}


/******************************************/
/* PROGRAMME PRINCIPAL                    */
/* initialisation puis boucle de jeu      */
/******************************************/

int main()
{
    int xmap,ymap;

    srand(time(NULL));

    // Lancer allegro et le mode graphique
    allegro_init();
    install_keyboard();

    set_color_depth(desktop_color_depth());
    if (set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0)!=0)
    {
        allegro_message("prb gfx mode");
        allegro_exit();
        exit(EXIT_FAILURE);
    }

    // Charger le fichier avec les tuiles
    tableTuiles=load_bitmap_check("images/tilemapLaby/tableTuiles.bmp");

    // Boucle de jeu : dessiner des labyrinthes
    while (!key[KEY_ESC])
    {
        // Créer labyrinthe directement à l'écran
        for (ymap=0;ymap<6;ymap++)
            for (xmap=0;xmap<8;xmap++)
                dessineTuile(screen,rand()%6,xmap,ymap);

        // Attendre l'appui d'une touche
        readkey();
    }

    return 0;
}
END_OF_MAIN();