#include <stdio.h>
#include <stdlib.h>
#include <allegro5/allegro5.h>
#include <allegro5/allegro_font.h>
#include <allegro5/allegro_image.h>
#include <allegro5/allegro_audio.h> // biblioteca de som
#include <allegro5/allegro_acodec.h> // biblioteca complementar para o som
#include <allegro5/allegro_primitives.h> // permite colocar formas simples, linhas, pontos, etc. (formas primitivas)
#include <allegro5/allegro_ttf.h> //Para as TTF FONTS

//GAME STATES, informamos o "status" do jogo
#define STATE_START 1
#define STATE_PRESSED_BURACO 2
#define STATE_PRESSED_PULA_BURACO 3
#define STATE_PRESSED_CAI_BURACO 4
#define STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE 5
#define STATE_PRESSED_SONO_DESCANSA_OU_CORRE 6
#define STATE_PRESSED_MACHUCADO_CORRE 7
#define STATE_PRESSED_MACHUCADO_DESCANSA 8
#define STATE_PRESSED_GAME_OVER 9
#define STATE_PRESSED_SONO_CORRE 10
#define STATE_PRESSED_SONO_DESCANSA 11
#define STATE_PRESSED_CAI_BURACO_AJUDA 12
#define STATE_PRESSED_CAI_BURACO_CORRE 13
#define STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO 14
#define STATE_PRESSED_CAI_BURACO_CAVANDO 15
#define STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE 16
#define STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA 17
#define STATE_CORRE 18
#define STATE_ABRIGO 19

int gameState = STATE_START; //Definimos o STATE de início


char text[255] = "                                                                                          PRESSIONE ENTER PARA COMEÇAR O JOGO";
char text1[255] = "";
char text2[255] = "";
char text3[255] = "@ TODOS DIREITOS RESERVADOS AO DINO PESCOÇUDO @";

void must_init(bool test, const char *description){
    if(test) return;

    printf("couldn't initialize %s\n", description);
    exit(1);
}

int main(){
    must_init(al_init(), "allegro"); // auxilia o must_init(), evitar de colocar instruções a mais par averificar erros.
    must_init(al_install_keyboard(), "keyboard");
    must_init(al_install_mouse(), "mouse"); // instalando o mouse (opcional), mas não o estamos utilizando

    ALLEGRO_TIMER* timer = al_create_timer(1.0 / 30.0);
    must_init(timer, "timer");

    ALLEGRO_TIMER* gameOverTimer = al_create_timer(3); //Game Over timer vai durar 3 segundos
    must_init(gameOverTimer, "gameOverTimer");

    ALLEGRO_EVENT_QUEUE* queue = al_create_event_queue();
    must_init(queue, "queue");

    // Permite que as formas e linhas tenham maior definição, deixar mais suave.
    al_set_new_display_option(ALLEGRO_SAMPLE_BUFFERS, 1, ALLEGRO_SUGGEST); // imagem suave
    al_set_new_display_option(ALLEGRO_SAMPLES, 8, ALLEGRO_SUGGEST); // imagem suave
    al_set_new_bitmap_flags(ALLEGRO_MIN_LINEAR | ALLEGRO_MAG_LINEAR); // imagem suave

    ALLEGRO_DISPLAY* disp = al_create_display(1250, 800);
    must_init(disp, "display");

    // Configuração de fontes, tamanhos etc.
    must_init(al_init_font_addon(), "font"); //WE NEED TO INIT FONT FIRST!
    must_init(al_init_ttf_addon(), "ttf font"); //THEN WE NEED TO INIT TTF FONTS
    ALLEGRO_FONT* font = al_load_ttf_font("Antonio-Bold.ttf", 25, ALLEGRO_ALIGN_LEFT); //NOW WE CAN CHOOSE SIZE
    ALLEGRO_FONT* font1 = al_load_ttf_font("Antonio-Bold.ttf", 25, ALLEGRO_ALIGN_LEFT);
    ALLEGRO_FONT* font2 = al_load_ttf_font("Antonio-Bold.ttf", 25, ALLEGRO_ALIGN_LEFT);
    ALLEGRO_FONT* font3 = al_load_ttf_font("Antonio-Bold.ttf", 8, ALLEGRO_ALIGN_LEFT);


    must_init(al_init_primitives_addon(), "primitives"); // Para inserir linhas, formas e pontos no código. Não utilizamos

    al_start_timer(timer);
    al_register_event_source(queue, al_get_keyboard_event_source());
    al_register_event_source(queue, al_get_display_event_source(disp));
    al_register_event_source(queue, al_get_timer_event_source(timer));
    al_register_event_source(queue, al_get_mouse_event_source());  // adicionado para o mouse funcionar

    // IMAGENS
    must_init(al_init_image_addon(), "image addon");
    ALLEGRO_BITMAP* apresentacao = al_load_bitmap("apresentacao.png");
    must_init(apresentacao, "apresentacao");
    
    ALLEGRO_BITMAP* pula_ignora = al_load_bitmap("pula_ignora.png");
    must_init(pula_ignora, "pula_ignora");

    ALLEGRO_BITMAP* pulando = al_load_bitmap("pulando.png");
    must_init(pulando, "pulando");

    ALLEGRO_BITMAP* no_buraco = al_load_bitmap("no_buraco.png");
    must_init(no_buraco, "no_buraco");

    ALLEGRO_BITMAP* correndo = al_load_bitmap("correndo.png");
    must_init(correndo, "correndo");

    ALLEGRO_BITMAP* descansando = al_load_bitmap("descansando.png");
    must_init(descansando, "descansando");

    ALLEGRO_BITMAP* bebendo_agua = al_load_bitmap("bebendo_agua.png");
    must_init(bebendo_agua, "bebendo_agua");

    ALLEGRO_BITMAP* abrigo = al_load_bitmap("abrigo.png");
    must_init(abrigo, "abrigo");

    ALLEGRO_BITMAP* game_over = al_load_bitmap("game_over.png");
    must_init(game_over, "game_over");

    ALLEGRO_BITMAP* pedindo_ajuda = al_load_bitmap("pedindo_ajuda.png");
    must_init(pedindo_ajuda, "pedindo_ajuda");

    ALLEGRO_BITMAP* planta = al_load_bitmap("planta.png");
    must_init(planta, "planta");

    ALLEGRO_BITMAP* saiu_buraco = al_load_bitmap("saiu_buraco.png");
    must_init(saiu_buraco, "saiu_buraco");

    // adicionando o audio ao jogo
    must_init(al_install_audio(), "audio");
    must_init(al_init_acodec_addon(), "audio codecs");
    must_init(al_reserve_samples(16), "reserve samples");

    // para música longa, música tema do jogo
    ALLEGRO_AUDIO_STREAM* music = al_load_audio_stream("music.opus", 2, 2048); // os números são referentes as áreas da memoria onde a musica sera armazenada. não mudar
    must_init(music, "music");
    al_set_audio_stream_playmode(music, ALLEGRO_PLAYMODE_LOOP); // música em loop
    al_attach_audio_stream_to_mixer(music, al_get_default_mixer()); // linha para o som sair

    bool done = false;
    bool redraw = false;
    ALLEGRO_EVENT event;

    #define KEY_SEEN     1
    #define KEY_RELEASED 2

    unsigned char key[ALLEGRO_KEY_MAX];
    memset(key, 0, sizeof(key));
    al_hide_mouse_cursor(disp);



    while(1){
        al_wait_for_event(queue, &event);

        switch(event.type)
        {
            case ALLEGRO_EVENT_TIMER:
            {
                redraw = true;

                if(gameState == STATE_PRESSED_GAME_OVER && al_get_timer_count(gameOverTimer) > 0) //CASO STATE SEJA GAME OVER
                {
                    sprintf(text, "%s", "RECOMEÇANDO O JOGO");
                    gameState = STATE_START; 

                    //RESET O GAME OVER TIMER!
                    al_stop_timer(gameOverTimer);
                    al_set_timer_count(gameOverTimer, 0);
                }

                break;
            }

            case ALLEGRO_EVENT_KEY_CHAR:
            {
                if(event.keyboard.keycode == ALLEGRO_KEY_ENTER && gameState == STATE_START)  //OK
                {
                    sprintf(text, "%s", "                                EM UM DIA QUALQUER, DINO PERCEBE UM METEORO VINDO EM SUA DIREÇÃO E COMEÇA A FUGIR.");
                    sprintf(text1, "%s", "                                                       APÓS UM TEMPO CORRENDO, DINO VÊ UM BURACO NO SEU CAMINHO.");
                    sprintf(text2, "%s", "                                                  O QUE DINO DEVE FAZER: PULAR (A) OU TENTAR CONTORNAR O BURACO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_BURACO;

                }
                // PULA BURACO
                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_BURACO) //OK
                {
                    sprintf(text, "%s", "                                                                        DINO PULOU O BURACO, MAS MACHUCOU A PATINHA!!! ");
                    sprintf(text1, "%s", "                                                                                                          O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "        CONTINUAR CORRENDO (A), MESMO MACHUCADO, OU COMER UMA PLANTA MEDICINAL PARA PASSAR A DOR (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_PULA_BURACO;
                }

                // DINO PULA BURACO E CORRE
                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_PULA_BURACO) //OK ....
                {
                    sprintf(text, "%s", "                     DINO, MESMO MACHUCADO, CONTINUOU CORRENDO. ENTRETANTO, ESTÁ CORRENDO MUITO DEVAGAR!");
                    sprintf(text1, "%s", "                                                                                                          O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                   CONTINUAR CORRENDO MACHUCADO (A) OU DESCANSAR PARA SARAR A PATINHA (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE) //OK
                {
                    sprintf(text, "%s", "       DINO CONTINUOU CORRENDO, MAS ESTÁ DEVAGAR DEVIDO A PATA MACHUCADA. E O METEORO ESTÁ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                          O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_MACHUCADO_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE) //OK
                {
                    sprintf(text, "%s", "                         DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO E O METEORO ESTÁ MUITO PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                          O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                                     DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_MACHUCADO_DESCANSA;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_CORRE)
                {
                    sprintf(text, "%s", "                                                                                        O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                        O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_CORRE) /// REFAZER, ESTÁ ERRADO
                {
                    sprintf(text, "%s", "                                                                 DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
                {
                    sprintf(text, "%s", "                                                                                        O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                        O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
                {
                    sprintf(text, "%s", "                                                                 DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_CORRE)
                {
                    sprintf(text, "%s", "                                                                                                          VOCÊ MATOU O DINO!");
                    sprintf(text1, "%s", "");
                    sprintf(text2, "%s", "                                                                                 GAME OVER! DESEJA JOGAR NOVAMENTE (S)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_GAME_OVER;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_S && gameState == STATE_PRESSED_GAME_OVER)
                {
                    sprintf(text, "%s", "");
                    sprintf(text1, "%s", "                                                                                                         PARA RECOMEÇA, APERTE");
                    sprintf(text2, "%s", "                                                                                                                               ENTER");
                    sprintf(text3, "%s", "");
                    gameState = STATE_START;
                }


                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_CORRE)
                {
                    sprintf(text, "%s", "                                                                                                          VOCÊ MATOU O DINO!");
                    sprintf(text1, "%s", "");
                    sprintf(text2, "%s", "                                                                                 GAME OVER! DESEJA JOGAR NOVAMENTE (S)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_GAME_OVER;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_ABRIGO)
                {
                    sprintf(text, "%s", "                                                                                                          VOCÊ MATOU O DINO!");
                    sprintf(text1, "%s", "");
                    sprintf(text2, "%s", "                                                                                 GAME OVER! DESEJA JOGAR NOVAMENTE (S)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_GAME_OVER;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_ABRIGO)
                {
                    sprintf(text, "%s", "                                                                                                          VOCÊ MATOU O DINO!");
                    sprintf(text1, "%s", "");
                    sprintf(text2, "%s", "                                                                                 GAME OVER! DESEJA JOGAR NOVAMENTE (S)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_GAME_OVER;
                }

                //DINO PULA O BURACO E COME A PLANTA
                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_PULA_BURACO)
                {
                    sprintf(text, "%s", "        DINO PAROU PARA COMER A PLANTA MEDICINAL, E A DOR PASSOU. ENTRETANTO, A PLANTA DEIXOU DINO COM SONO.");
                    sprintf(text1, "%s", "                                                                                                  O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                       DEVE COMEÇAR A CORRER (A) MESMO SONOLENTO OU PARAR PARA DESCANSAR (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_SONO_DESCANSA_OU_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
                {
                    sprintf(text, "%s", " DINO ESTÁ CORRENDO LENTAMENTE, DEVIDO AO SONO. ENTRETANTO, PERDEU MUITO TEMPO E O METEORO ESTÁ PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                  O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                              DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_SONO_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
                {
                    sprintf(text, "%s", "                                 DINO PAROU PARA DESCANSAR, MAS PERDEU MUITO TEMPO. O METEORO ESTÁ PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                  O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                             DEVE CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_SONO_DESCANSA;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_CORRE)
                {
                    sprintf(text, "%s", "                                          DINO CONTINUA CORRENDO, E O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                  O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                             DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_CORRE)
                {
                    sprintf(text, "%s", "                                                        DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO!");
                    sprintf(text1, "%s", "                                                                                                  O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                             DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
                {
                    sprintf(text, "%s", "                                          DINO CONTINUAR CORRENDO, E O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                  O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                             DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
                {
                    sprintf(text, "%s", "                                                         DINO ESTÁ NO ABRIGO, E O METEORO ESTÁ CHEGANDO!");
                    sprintf(text1, "%s", "                                                                                                  O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                             DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }


                // CAI NO BURACO
                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_BURACO)
                {
                    sprintf(text, "%s", "                                                               DINO TENTOU CONTONAR O BURACO, E ACABOU CAINDO! ");
                    sprintf(text1, "%s", "                                                                                                  O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                             DEVE PEDIR AJUDA (A) OU SAIR DO BURACO CAVANDO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_CAI_BURACO;
                }

                // CAI BURACO SAI COM AJUDA
                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO)
                {
                    sprintf(text, "%s", "                                                 DINO PEDIU AJUDA, MAS DEMOROU MUITO, E ACABOU PERDENDO TEMPO PRECIOSO. ");
                    sprintf(text1, "%s", "                                                                                                      O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                    DEVE CORRER NORMALMENTE (A) OU CORRER O MAIS RÁPIDO POSSIVEL (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_CAI_BURACO_AJUDA;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
                {
                    sprintf(text, "%s", "                                           DINO NÃO ESTÁ CORRENDO RÁPIDO O SUFICIENTE, E O METEORO ESTÁ SE APROXIMANDO.");
                    sprintf(text1, "%s", "                                                                                                      O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                   DINO DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_CAI_BURACO_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
                {
                    sprintf(text, "%s", "                                                                DINO CONTINUA CORRENDO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                      O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                         DINO DEVE CONTINUAR CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE)
                {
                     sprintf(text, "%s", "                                                                 DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
                {
                    sprintf(text, "%s", "                                                                                        O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                        O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
                {
                     sprintf(text, "%s", "                                                                 DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
                {
                    sprintf(text, "%s", " DINO ESTAVA CORRENDO MUITO RÁPIDO, E ACABOU TROPEÇANDO E CAINDO. COM ISSO, O METEORO ESTÁ CADA VEZ MAIS PRÓXIMO ");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       DEVE CONTINUAR CORRENDO DO COMETA (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
                {
                    sprintf(text, "%s", "                                                                                        O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                        O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
                {
                     sprintf(text, "%s", "                                                                 DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_SONO_DESCANSA)
                {
                    sprintf(text, "%s", "                                                                                        O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                        O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_SONO_DESCANSA)
                {
                     sprintf(text, "%s", "                                                                 DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                // CAI BURACO SAI CAVANDO
                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO) //
                {
                    sprintf(text, "%s", "                                                            DINO SAIU DO BURACO CAVANDO, MAS AGORA ESTÁ COM MUITA SEDE.");
                    sprintf(text1, "%s", "                                                                                                      O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE IGNORAR A SEDE E COMEÇAR A CORRER (A) OU BEBER ÁGUA (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_CAI_BURACO_CAVANDO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO) 
                {
                    sprintf(text, "%s", "DINO COMEÇAR A CORRER COM SEDE, E ISSO DEIXA-O MUITO LENTO. DESSA FORMA, O METEORO ESTÁ CADA VEZ MAIS PERTO.");
                    sprintf(text1, "%s", "                                                                                                      O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                              DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", ""); 
                    gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
                {
                    sprintf(text, "%s", "               DINO BEBE ÁGUA, MAS ACABA PERDENDO MUITO TEMPO. E O METEORO ESTÁ CADA VEZ MAIS PERTO!");
                    sprintf(text1, "%s", "                                                                                                      O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                                  DEVE CORRER DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
                {
                    sprintf(text, "%s", "                                                                                        O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                        O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
                {
                     sprintf(text, "%s", "                                                                 DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_A && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
                {
                    sprintf(text, "%s", "                                                                                        O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                        O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                       CONTINUAR CORRENDO DO METEORO (A) OU PROCURAR ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_CORRE;
                }

                else if(event.keyboard.keycode == ALLEGRO_KEY_B && gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
                {
                    sprintf(text, "%s", "                                                                 DINO ESTÁ NO ABRIGO, E O METEORO CADA VEZ MAIS PRÓXIMO!");
                    sprintf(text1, "%s", "                                                                                                    O QUE DINO DEVE FAZER:");
                    sprintf(text2, "%s", "                                                          DEVE VOLTAR A CORRER DO METEORO (A) OU CONTINUAR NO ABRIGO (B)?");
                    sprintf(text3, "%s", "");
                    gameState = STATE_ABRIGO;
                }

                if(event.keyboard.keycode != ALLEGRO_KEY_ESCAPE)
                {
                    break;
                }
            }

            case ALLEGRO_EVENT_DISPLAY_CLOSE:
            {
                done = true;
                break;
            }
        }

        if(done)
            break;

        if(redraw && al_is_event_queue_empty(queue))
        {
            al_clear_to_color(al_map_rgb(0, 0, 0));
            al_draw_text(font, al_map_rgb(255, 255, 255), 100, 550, 0, text);
            al_draw_text(font1, al_map_rgb(255, 255, 255), 100, 600, 0, text1);
            al_draw_text(font2, al_map_rgb(0, 255, 1), 100, 650, 0, text2);
            al_draw_text(font2, al_map_rgb(0, 255, 1), 400, 700, 0, text3);

            if(gameState == STATE_START)
                al_draw_bitmap(apresentacao, 10, 50, 0);
            if(gameState == STATE_PRESSED_BURACO)
                al_draw_bitmap(pula_ignora, 130, 100, 0);
            if(gameState == STATE_PRESSED_PULA_BURACO)
                al_draw_bitmap(pulando, 130, 100, 0);
            if(gameState == STATE_PRESSED_CAI_BURACO)
                al_draw_bitmap(pedindo_ajuda, 130, 100, 0);
            if(gameState == STATE_PRESSED_MACHUCADO_DESCANSA_OU_CORRE)
                al_draw_bitmap(correndo, 130, 100, 0);
            if(gameState == STATE_PRESSED_MACHUCADO_CORRE)
                al_draw_bitmap(correndo, 130, 100, 0);
            if(gameState == STATE_PRESSED_MACHUCADO_DESCANSA)
                al_draw_bitmap(descansando, 130, 100, 0);
            if(gameState == STATE_CORRE)
                al_draw_bitmap(correndo, 130, 100, 0);
            if(gameState == STATE_PRESSED_GAME_OVER)
                al_draw_bitmap(game_over, 130, 100, 0);
            if(gameState == STATE_ABRIGO)
                al_draw_bitmap(abrigo, 10, 50, 0);
            if(gameState == STATE_PRESSED_SONO_DESCANSA_OU_CORRE)
                al_draw_bitmap(planta, 130, 100, 0);
            if(gameState == STATE_PRESSED_SONO_CORRE)
                al_draw_bitmap(correndo, 130, 100, 0);
            if(gameState == STATE_PRESSED_SONO_DESCANSA)
                al_draw_bitmap(descansando, 130, 100, 0);
            if(gameState == STATE_PRESSED_CAI_BURACO_AJUDA)
                al_draw_bitmap(correndo, 130, 100, 0);
            if(gameState == STATE_PRESSED_CAI_BURACO_CAVANDO)
                al_draw_bitmap(descansando, 130, 100, 0);
            if(gameState == STATE_PRESSED_CAI_BURACO_CORRE)
                al_draw_bitmap(correndo, 130, 100, 0);
            if(gameState == STATE_PRESSED_CAI_BURACO_CORRE_RAPIDO)
                al_draw_bitmap(descansando, 130, 100, 0);
            if(gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_CORRE)
                al_draw_bitmap(correndo, 130, 100, 0);
            if(gameState == STATE_PRESSED_CAI_BURACO_CAVANDO_AGUA)
                al_draw_bitmap(bebendo_agua, 130, 100, 0);
            al_flip_display(); 
            redraw = false;
        }

    }

    al_destroy_bitmap(apresentacao);
    al_destroy_bitmap(pula_ignora);
    al_destroy_bitmap(pulando);
    al_destroy_bitmap(no_buraco);
    al_destroy_bitmap(correndo);
    al_destroy_bitmap(descansando);
    al_destroy_bitmap(bebendo_agua);
    al_destroy_bitmap(abrigo);
    al_destroy_bitmap(game_over);
    al_destroy_bitmap(pedindo_ajuda);
    al_destroy_bitmap(planta);
    al_destroy_bitmap(saiu_buraco);
    al_destroy_font(font);
    al_destroy_display(disp);
    al_destroy_audio_stream(music);
    al_destroy_timer(timer);
    al_destroy_event_queue(queue);

    return 0;
}