/*


    Evolute version 0.7
    Copyright (C) 2010 Antti Vainio

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.


*/

//          custommapit.cpp

#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <math.h>
#include "global.hpp"

//karttavalikko
void custommap() {
     bool pois1 = false; //aloita poistuminen
     bool pois2 = false; //ulos loopista!
     float kasautuminen = 0;
     float nappikasautuminen = 0;
     bool napit = false;
     short int valinta = 0;
     short int prewvalinta = 0;
     short int mappivalinta = -10;
     
     //tuetaan 100 eri mappia kerralla
     char maptiedostot[100][100];
     short int a = 0;
     DIR *dp;
     struct dirent *ep;
     dp = opendir("./maps");
     if(dp != NULL) {
           while((ep = readdir(dp)) != NULL) {
                    sprintf(maptiedostot[a], "%s", ep->d_name);
                    a++;
           }
           closedir(dp);
     }
     else naytavirhe("Couldn't open \"maps\" directory");
     
     //selvitetään, mitkä löydetyistä tiedostoista ovat mappeja ja tallennetaan ne omaan char-taulukkoon
     char mapit[100][100];
     short int maplkm = 0;
     for(int i=0;i<100;i++) {
           if(char *kohta = strstr(maptiedostot[i], ".txt")) {
                    *kohta = 0;
                    sprintf(mapit[maplkm], "%s", maptiedostot[i]);
                    maplkm++;
           }
     }
     
     //selvitetään, mitkä mapeista ovat stageja
     bool onstage[100];
     for(int i=maplkm-1;i>=0;i--) {
           char tiedostopolku[40];
           sprintf(tiedostopolku, "maps/%s.txt", mapit[i]);
           tiedosto = fopen(tiedostopolku, "r");
           if(tiedosto == NULL) {
                       sprintf(viesti, "Couldn't open map %s", mapit[i]);
                       naytavirhe(viesti);
                       i = -1;
                       pois2 = true;
                       menuvalinta = 1;
           }
           else {
                       fgets(tiedostorivi, 7, tiedosto); //time
                       if(strcmp(tiedostorivi, "time\t\t") != 0) {
                               sprintf(viesti, "Declaration for 'time' missing or invalid in map %s", mapit[i]);
                               naytavirhe(viesti);
                               i = -1;
                               pois2 = true;
                               menuvalinta = 1;
                       }
                       else {
                               fgets(tiedostorivi, 20, tiedosto); //value for time
                               short int peliaika = atoi(tiedostorivi);
                               if(peliaika > 0) onstage[i] = true;
                               else onstage[i] = false;
                       }
                       fclose(tiedosto);
           }
     }
     
     //lasketaan paljonko tarvitaan sivuja kartoille
     int sivukasautuminenmax = (maplkm - 9) * 32;
     if(sivukasautuminenmax < 0) sivukasautuminenmax = 0;
     float sivukasautuminen = 0;
     int sivukasautuminenkohde = 0;
     
     //more-nappien oma kasautuminen
     float morekasautuminen = 100;
     
     while(!pois2) {
                 alkuaika = SDL_GetTicks();
                 
                 //hiiri ja nappulat
                 SDL_GetMouseState(&hiirix,&hiiriy);
                 pelaajaninputit = SDL_GetKeyState(NULL);
                 if(SDL_GetMouseState(NULL, NULL)&SDL_BUTTON(1)) hiiriekanappi = true;
                 else hiiriekanappi = false;
                 
                 //lasketaan kasautuminen
                 if(!pois1) kasautuminen++;
                 else if(menuvalinta != 100) kasautuminen--;
                 else kasautuminen-= 0.25;
                 if(pois1 && menuvalinta != 100 && kasautuminen < 1) pois2 = true;
                 if(pois1 && menuvalinta == 100 && kasautuminen < 0.25) pois2 = true;
                 if(kasautuminen < 20) SDL_SetAlpha(valkoinenfade, SDL_SRCALPHA, int(round(255 - kasautuminen * 12.75)));
                 else SDL_SetAlpha(valkoinenfade, SDL_SRCALPHA, 0);
                 if(napit) nappikasautuminen++;
                 else nappikasautuminen--;
                 if(sivukasautuminenkohde < sivukasautuminen) sivukasautuminen-= 4;
                 else if(sivukasautuminenkohde > sivukasautuminen) sivukasautuminen+= 4;
                 morekasautuminen++;
                 
                 //testataan onko hiiri nappien päällä
                 valinta = 0;
                 if(kasautuminen > 20) {
                                 if(nappikasautuminen > 10 && hiiriy > 500 && hiiriy < 550) {
                                                 if(hiirix > 150 && hiirix < 275) valinta = 100; //suoraan peliin
                                                 else if(hiirix > 363 && hiirix < 650 && !onstage[mappivalinta]) valinta = 2;
                                 }
                                 if(morekasautuminen > 10 && hiirix > 630 && hiirix < 770) {
                                                 if(hiiriy > 103 && hiiriy < 147 && sivukasautuminenkohde != 0) valinta = 10;
                                                 else if(hiiriy > 441 && hiiriy < 485 && sivukasautuminenkohde != sivukasautuminenmax && sivukasautuminenmax != 0) valinta = 11;
                                 }
                                 if(hiirix < 150 && hiiriy > 550) valinta = -1; //back-nappi
                 }
                 
                 
                 //testataan irroitettiinko hiiri napin päällä
                 if(kasautuminen > 20 && valinta != 0 && hiiriprewekanappi && !hiiriekanappi) {
                           if(valinta == -1) {
                                      pois1 = true;
                                      menuvalinta = 1;
                                      if(kasautuminen > 20) kasautuminen = 20;
                           }
                           else if(valinta == 10 || valinta == 11) {
                                      if(valinta == 10) sivukasautuminenkohde-= 288;
                                      else sivukasautuminenkohde+= 288;
                                      if(sivukasautuminenkohde < 0) sivukasautuminenkohde = 0;
                                      if(sivukasautuminenkohde > sivukasautuminenmax) sivukasautuminenkohde = sivukasautuminenmax;
                                      mappivalinta = -10;
                                      morekasautuminen = 0;
                                      napit = false;
                                      if(nappikasautuminen > 10) nappikasautuminen = 10;
                           }
                           else {
                                      menuvalinta = valinta;
                                      if(menuvalinta == 100) {
                                                     pois1 = true;
                                                     kasautuminen = 20;
                                                     Mix_FadeOutMusic(2000);
                                      }
                                      else if(menuvalinta == 2) piirtokohta = tempruutu;
                           }
                           soitaaani(nappi2); //ääni
                 }
                 
                 //nappiäänet
                 if(hiiriekanappi && !hiiriprewekanappi && valinta != 0) soitaaani(nappi1);
                 else if(valinta != prewvalinta && valinta != 0) {
                            if(hiiriekanappi) soitaaani(nappi1);
                            else soitaaani(nappion);
                 }
                 
                 //hiiren nappi painettiin
                 if(hiiriekanappi && !hiiriprewekanappi && kasautuminen > 20 && sivukasautuminen == sivukasautuminenkohde) {
                                  //testataan onko hiiri nappien päällä
                                  if(hiirix > 150 && hiirix < 400) {
                                            int i = maplkm - 1 - int(sivukasautuminen / 32);
                                            if(i > 8) i = 8;
                                            for(i=i;i>=0;i--) {
                                                      if(hiiriy > 150 + i * 32 && hiiriy < 181 + i * 32) {
                                                                soitaaani(nappi2); //ääni
                                                                mappivalinta = i + int(sivukasautuminen / 32);
                                                                napit = true;
                                                                if(nappikasautuminen < 0) nappikasautuminen = 0;
                                                      }
                                            }
                                  }
                                  asetakartta(mapit[mappivalinta]);
                 }
                 
                 if(menuvalinta != 100) {
                                if(pelaajaninputit[SDLK_ESCAPE]) {//ESC-nappi
                                                  if(menuvalinta != 1) soitaaani(nappi2); //ääni
                                                  pois1 = true;
                                                  menuvalinta = 1;
                                                  if(kasautuminen > 20) kasautuminen = 20;
                                }
                                else if(pelaajaninputit[SDLK_RETURN] && kasautuminen > 20 && nappikasautuminen > 10) { //ENTER-nappi
                                                  soitaaani(nappi2); //ääni
                                                  pois1 = true;
                                                  menuvalinta = 100; //peliin
                                                  kasautuminen = 20;
                                                  Mix_FadeOutMusic(2000);
                                }
                 }
                 
                      //Piirretään kaikki
                 piirrakuva2(menutausta, 0, 0);
                 if(piirtokohta == ruutu) piirrakuva(otsikko, 400, 50);
                 //vanhat napit
                 if(kasautuminen < 20 && menuvalinta != 100) {
                                 piirrakuva(menunappitutorial1, 400 - 30 * kasautuminen, 175);
                                 piirrakuva(menunappistages1, 400 - 30 * kasautuminen, 275);
                                 piirrakuva(menunappisurvival1, 400 - 30 * kasautuminen, 375);
                                 piirrakuva(menunappicustommap2[0], 400 - 30 * kasautuminen, 475);
                 }
                 //napit
                 if(menuvalinta != 100) {
                                if(valinta == -1 && hiiriprewekanappi) piirrakuva(nappitakaisin[2], 75, 575);
                                else if(valinta == -1) piirrakuva(nappitakaisin[1], 75, 575);
                                else piirrakuva(nappitakaisin[0], 75, 575);
                                
                                if(sivukasautuminenkohde != sivukasautuminenmax && sivukasautuminenmax != 0) {
                                                if(morekasautuminen < 10 && kasautuminen < 20 && sivukasautuminen > sivukasautuminenkohde && sivukasautuminenkohde >= sivukasautuminenmax - 288) piirrakuva(nappimored[0], 1300 - 20 * morekasautuminen - 20 * kasautuminen, 463);
                                                else if(kasautuminen < 20) piirrakuva(nappimored[0], 1100 - 20 * kasautuminen, 463);
                                                else if(morekasautuminen < 10 && sivukasautuminen > sivukasautuminenkohde && sivukasautuminenkohde >= sivukasautuminenmax - 288) piirrakuva(nappimored[0], 900 - 20 * morekasautuminen, 463);
                                                else if(valinta == 11 && hiiriprewekanappi) piirrakuva(nappimored[2], 700, 463);
                                                else if(valinta == 11) piirrakuva(nappimored[1], 700, 463);
                                                else piirrakuva(nappimored[0], 700, 463);
                                }
                                else {
                                                if(kasautuminen < 20) piirrakuva(nappimored[0], 900 + 20 * morekasautuminen - 20 * kasautuminen, 463);
                                                else piirrakuva(nappimored[0], 700 + 20 * morekasautuminen, 463);
                                }
                                if(sivukasautuminenkohde != 0) {
                                                if(morekasautuminen < 10 && kasautuminen < 20 && sivukasautuminen < sivukasautuminenkohde && sivukasautuminenkohde <= 288) piirrakuva(nappimoreu[0], 1300 - 20 * morekasautuminen - 20 * kasautuminen, 125);
                                                else if(kasautuminen < 20) piirrakuva(nappimoreu[0], 1100 - 20 * kasautuminen, 125);
                                                else if(morekasautuminen < 10 && sivukasautuminen < sivukasautuminenkohde && sivukasautuminenkohde <= 288) piirrakuva(nappimoreu[0], 900 - 20 * morekasautuminen, 125);
                                                else if(valinta == 10 && hiiriprewekanappi) piirrakuva(nappimoreu[2], 700, 125);
                                                else if(valinta == 10) piirrakuva(nappimoreu[1], 700, 125);
                                                else piirrakuva(nappimoreu[0], 700, 125);
                                }
                                else {
                                                if(kasautuminen < 20) piirrakuva(nappimoreu[0], 900 + 20 * morekasautuminen - 20 * kasautuminen, 125);
                                                else piirrakuva(nappimoreu[0], 700 + 20 * morekasautuminen, 125);
                                }
                                
                                if(kasautuminen < 20) {
                                                piirrakuva2(mapnappifade, 850 - 35 * kasautuminen, 32 * mappivalinta - sivukasautuminen + 150);
                                                for(int i=maplkm-1;i>=0;i--) {
                                                        if(0 > 32 * i - sivukasautuminen) piirrateksti(mapit[i], 850 - 35 * kasautuminen + 20.3125 * (-32 * i + sivukasautuminen), 150, 1, 0);
                                                        else if(256 < 32 * i - sivukasautuminen) piirrateksti(mapit[i], 850 - 35 * kasautuminen + 20.3125 * (32 * i - sivukasautuminen - 256), 406, 1, 0);
                                                        else piirrateksti(mapit[i], 850 - 35 * kasautuminen, 32 * i - sivukasautuminen + 150, 1, 0);
                                                }
                                }
                                else {
                                                piirrakuva2(mapnappifade, 150, 32 * mappivalinta - sivukasautuminen + 150);
                                                for(int i=maplkm-1;i>=0;i--) {
                                                        if(0 > 32 * i - sivukasautuminen) piirrateksti(mapit[i], 150 + 20.3125 * (-32 * i + sivukasautuminen), 150, 1, 0);
                                                        else if(256 < 32 * i - sivukasautuminen) piirrateksti(mapit[i], 150 + 20.3125 * (32 * i - sivukasautuminen - 256), 406, 1, 0);
                                                        else piirrateksti(mapit[i], 150, 32 * i - sivukasautuminen + 150, 1, 0);
                                                }
                                }
                                
                                //play ja hiscoret
                                if(kasautuminen < 20) {
                                                if(nappikasautuminen > 10) piirrakuva(nappipelaa[0], 912 - 35 * kasautuminen, 525);
                                                else piirrakuva(nappipelaa[0], 912 - 35 * kasautuminen, 625 - 10 * nappikasautuminen);
                                }
                                else if(nappikasautuminen < 10) piirrakuva(nappipelaa[0], 212, 625 - 10 * nappikasautuminen);
                                else if(valinta == 100 && hiiriprewekanappi) piirrakuva(nappipelaa[2], 212, 525);
                                else if(valinta == 100) piirrakuva(nappipelaa[1], 212, 525);
                                else piirrakuva(nappipelaa[0], 212, 525);
                                
                                if(onstage[mappivalinta]) {
                                     if(kasautuminen < 20) {
                                                if(nappikasautuminen > 10) piirrakuva(nappiscores[3], 1206 - 35 * kasautuminen, 525);
                                                else piirrakuva(nappiscores[3], 1206 - 35 * kasautuminen, 625 - 10 * nappikasautuminen);
                                     }
                                     else if(nappikasautuminen < 10) piirrakuva(nappiscores[3], 506, 625 - 10 * nappikasautuminen);
                                     else piirrakuva(nappiscores[3], 506, 525);
                                }
                                else {
                                     if(kasautuminen < 20) {
                                                if(nappikasautuminen > 10) piirrakuva(nappiscores[0], 1206 - 35 * kasautuminen, 525);
                                                else piirrakuva(nappiscores[0], 1206 - 35 * kasautuminen, 625 - 10 * nappikasautuminen);
                                     }
                                     else if(nappikasautuminen < 10) piirrakuva(nappiscores[0], 506, 625 - 10 * nappikasautuminen);
                                     else if(valinta == 2 && hiiriprewekanappi) piirrakuva(nappiscores[2], 506, 525);
                                     else if(valinta == 2) piirrakuva(nappiscores[1], 506, 525);
                                     else piirrakuva(nappiscores[0], 506, 525);
                                }
                 }
                 else {
                                piirrakuva(nappitakaisin[0], 75, 1375 - 40 * kasautuminen);
                                if(sivukasautuminenkohde != sivukasautuminenmax && sivukasautuminenmax != 0) piirrakuva(nappimored[0], 2300 - 80 * kasautuminen, 463);
                                if(sivukasautuminenkohde != 0) piirrakuva(nappimoreu[0], 2300 - 80 * kasautuminen, 125);
                                piirrakuva2(mapnappifade, 150, 32 * mappivalinta - sivukasautuminen + 150);
                                for(int i=maplkm-1;i>=0;i--) {
                                        if(0 <= 32 * i - sivukasautuminen && 256 >= 32 * i - sivukasautuminen) piirrateksti(mapit[i], 150, 32 * i - sivukasautuminen + 150, 1, 0);
                                }
                                piirrakuva(nappipelaa2, 212, 525);
                                if(onstage[mappivalinta]) piirrakuva(nappiscores[3], 506, 525);
                                else piirrakuva(nappiscores[0], 506, 525);
                 }
                 //loput
                 if(showfpseverywhere == 2) piirraexpluku(fps, 7);
                 piirrakuva2(menutahtain, hiirix - 1, hiiriy - 1);
                 if(kasautuminen < 20 && menuvalinta == 100) piirrakuva2(valkoinenfade, 0, 0); //fade kaiken päälle
                 
                 SDL_Flip(ruutu);
                 
                 //Lopussa tehtävät asiat
                 if(hiiriekanappi) hiiriprewekanappi = true;
                 else hiiriprewekanappi = false;
                 prewvalinta = valinta;
                 
                      if(hoidatapahtumat()) pois2 = true;
                      laskefps();
                      
                 if(menuvalinta == 2) naytahiscoret(false); //näytetään hiscoret tähän väliin
                      
    //tähän loppuu menun looppi
    }
}
