#include "ofApp.h"
#include "FichaPpal.h"
#include "Fichita.h"
#include "FichaEnergia.h"
#include "FichaVeneno.h"
#include "FichaComida.h"

FichaPpal ficha_grande;

FichaEnergia fichitaEnergia; //amarilla

Fichita fichita01;          //blanca

FichaVeneno fichaVeneno;  //negra

FichaComida fichaComida;  // roja

//--------------------------------------------------------------
void ofApp::setup(){
    proporcion_4_3 = true;

    if (proporcion_4_3)
    {
        ancho = 1280; //800 x600
        alto = 720;    
    }
    else 
    {
        ancho = 1280;
        alto = 720;
    }

    ofSetWindowShape(ancho, alto);
    
    //ofSetBackgroundColor(100, 255, 60);
    ofSetFrameRate(60);

    pantallaCompleta = true;  //inicia en false

    ofToggleFullscreen();  // estaba comentada

    ofHideCursor();

    // carga texto Presentacion
    presentacion = true;
    estado = 0;
    contadorInstrucciones = 0;

    botonStart = false;
    
    font_01.load("VT3.ttf", 115);
    titulo = "VERY SHOPPER!!!";

    font_02.load("PressStart.ttf", 32);
    start= "PRESIONE START";

    //botonStart = false;  // valor inicial;

    instrucciones= "Trata de tomar solamente\nlo que necesites\n\nCUIDADO CON LA CUENTA!!\n\nSe juega con flechitas\n\nEl juego termina cuando la \nenergía y la felicidad\nse terminan";  


    // =======================================================000000

     //carga de objetos ficha y fichitas

    ficha_grande.setup(ofGetWidth()/2, ofGetHeight()/2); 

    // Blanca
   // fichita01.setup(ofRandom(fichita01.margen, ofGetWidth()-fichita01.margen), ofRandom(fichita01.margen, ofGetHeight()-fichita01.margen));
    fichita01.setup();

    // Amarilla
    fichitaEnergia.setup(ofRandom(fichitaEnergia.margen,ofGetWidth()-fichitaEnergia.margen), ofRandom(fichitaEnergia.margen, ofGetHeight()-fichitaEnergia.margen));
     
    // ROja
    fichaComida.setup(ofRandom(fichaComida.margen,ofGetWidth()-fichaComida.margen), ofRandom(fichaComida.margen, ofGetHeight()-fichaComida.margen));
 
    // negra   
    fichaVeneno.setup(ofRandom(fichaVeneno.margen,ofGetWidth()-fichaVeneno.margen), ofRandom(fichaVeneno.margen, ofGetHeight()-fichaVeneno.margen));
    
        //====================================

   // carga de sonidos
    
    musica.load("music.mp3");

    bienvenida.load("bienvenido.wav");
    collect.load("collect.mp3");
    hurt.load("hurt.mp3");
    high.load("high.mp3");
   
    musica.setVolume(.8);

    bienvenida.setVolume(1);

    contadorSonido = 0;
    
    collect.setVolume(9);
    hurt.setVolume(.9);
    high.setVolume(.9);

    musica.play();
    musica.setLoop(true);
    
    velReproduc = 5;

    velReproducMap = ofMap (velReproduc, 0, 10, 0.0, 1, true); // mapeo

    // ==========================================================
       
     puntos = 0;

    fuente_texto_mensaje.load("KOMIKAP_.ttf", 80);
    fuente_texto_mensaje.load("PressStart.ttf", 26);

    texto_puntos = "Puntos = 0";
    texto_mensaje = "Felicidad";

    // _----------------------

    puntos_energia = 0;
    texto_mensaje_energia = "Energía";

    // posicion barra Energía x e y;    

	posicion_texto_mensaje_energia.x = (ancho / 16);
    posicion_texto_mensaje_energia.y = ofGetHeight() - alto/8 +30; //130;

  // posicion barra felicidad x e y;
  posicion_texto_mensaje.x = ancho / 16;

  posicion_texto_mensaje.y = alto / 8  - 40; //+0;

  // barra de energia valores iniciales

  barra_energia_alto = 80;
  barra_energia_ancho_inicial = 1200;
  barra_energia_ancho = barra_energia_ancho_inicial;

  //posicion barra de energía  
  posicion_energia_tiempo.set(ancho/16, ofGetHeight() - 50);   // alto/8 + 130);

  // Barra de tiempo valores iniciales. (dimensiones iniciales)
  barra_felicidad_alto = 80;
  barra_felicidad_ancho_inicial = 1200;
  barra_felicidad_ancho = barra_felicidad_ancho_inicial;

//posicion de barra de felicidad
  posicion_felicidad_tiempo.set( ancho / 16 , alto / 8 - 30 ); // en y + 0;

  // Tiempo total en segundos antes de perder.
  tiempo_total = 30.0f; // 18 segundos

   // Pausamos el juego al inicio.
  pausa = true; // estaba true
  energiaCero = false;
  felicidadCero = false;

  // boton ayuda

  ayuda = false;

  // ======== PLACA FINAL =======================

  placaFinal.load("placaFinal.png");

  font03.load("PressStart.ttf", 24);

  nroTexto = 0;
  contadorFinal = 0;
  
  textosFinales[0] ="¿Qué es la \nOniomanía?\n\nDenominamos oniomanía \na comprar de forma \ncompulsiva. A dejarse\nllevar por adquirir\nobjetos \ndesproporcionadamente.";
  textosFinales[1] = "Los síntomas de la\nOniomanía\n\nDeseo muy intenso\nde realizar la compra,\nque muchas veces se\ndescribe como\nuna sensación\nirrefrenable\no irresistible.";
  textosFinales[2] ="¿Cómo prevenir \nla oniomanía?\n\nRecomendaciones\npara no comprar\ncompulsivamente\n\n";
  textosFinales[3] = "1 \n\nRealizar un listado \ncon las cosas que\nquieres comprar\ny cíñete a él.";
  textosFinales[4] = "2 \n\nElaborar un\npresupuesto con un\nmáximo a gastar y\nno lo superes.";
  textosFinales[5] = "3 \n\nEsperar media hora\ndesde que te surge\nel deseo antes de\nconseguir el objeto.";
  textosFinales[6] = "4 \n\nSal de la\ntienda y vuelve\nmás tarde.";
  textosFinales[7] = "Visibilicemos\n\nla oniomanía";


}

//--------------------------------------------------------------
void ofApp::update(){

if (estado == 0)  // pantalla de incio
{
    //pausa = true;
    ficha_grande.arriba = false;
    ficha_grande.abajo = false;
    ficha_grande.izquierda = false;
    ficha_grande.derecha = false;    

    contadorSonido ++;
    

    if(contadorSonido % 280 == 0)
    {
        bienvenida.play();
        contadorSonido = 0;
    }

    if (botonStart && (estado == 0))
    {
        estado = 1;
        pausa = false;
        botonStart = false;
    }
    
}

else if (estado == 1)   // instrucciones
{
   
    contadorInstrucciones ++;

    if(contadorInstrucciones % 280 == 0)
    {
       estado++;
       pausa = false; //estaba comentado
       contadorInstrucciones = 0;
       ofResetElapsedTimeCounter();

    }   

}
else if ( estado == 2)  // empieza juego;

{

 if( !pausa )  // pongo !pausa
  {
    // Actualizamos el ancho de la barra según el transcurso del tiempo
    // con la siguiente formula:
    // barra_tiempo_ancho = 400 - 400 * ( tiempo / 18 ) 
    // En este caso 400 es el ancho inicial de la barra y 6 son los
    // segundos que tarda en llegar la barra a 0.
    // Cuando el tiempo es 0 segundos el ancho es 400 px.
    // Cuando el tiempo es 3 segundos el ancho es 200 px.
    barra_felicidad_ancho = barra_felicidad_ancho_inicial - barra_felicidad_ancho_inicial * ( ofGetElapsedTimef() / tiempo_total );

    barra_energia_ancho= barra_energia_ancho_inicial - barra_energia_ancho_inicial; // * (ofGetElapsedTimef()/tiempo_total_energia);
    // Si la barra_tiempo llega a cero.
    if( barra_felicidad_ancho <= 0.0f )
    {
      // Pausamos el juego.

     // pausa = true;  //comentado

      felicidadCero = true;
      
      //felicidadCero = true;     // recien agregado

      texto_mensaje = "Felicidad";

      

      // Posicionamos nuevamente el texto_mensaje según el nuevo ancho
      // que tiene el texto nuevo.
     // posicion_texto_mensaje.x = ancho / 2 - fuente_texto_mensaje.stringWidth( texto_mensaje ) / 2;
    }

    if (barra_energia_ancho_inicial <= 0) // estaba barra_energia_ancho_inicial
    {        
    texto_mensaje_energia = "te quedaste sin energia!!!"; //"Energía";
    
    barra_energia_ancho_inicial = 0; // agregado
    
    energiaCero = true;

    // pausa = true;  // recien comentado

    
    }
     else 
    {
        texto_mensaje_energia = "energia"; // "te quedaste sin energia!!!";  // agregado
        energiaCero = false;
        
    }
    
  }

// ========================================================00

    ofClamp(barra_energia_ancho_inicial,0, 800); //-100, 800);
    ofClamp(barra_energia_ancho, 0, 800);       //-100, 800);


    ficha_grande.update(ficha_grande.velocidad);


    // FichaComida

    distancia = ofDist(ficha_grande.x, ficha_grande.y, fichaComida.x, fichaComida.y);
if (colision(distancia, ficha_grande.radio, fichaComida.radio)) 
{
    //se activa Booleana para mostrar img en el draw
   // fichaComida.mostrarImagen = true;
    fichaComida.numeroImagen = ofRandom(CANT_COMIDA);

    barra_energia_ancho_inicial += 800;

   
high.play();
 // incrementa felicidad

fichaComida.x = ofRandom(fichaComida.margen, ofGetWidth() - fichaComida.margen);
fichaComida.y = ofRandom(fichaComida.margen, ofGetHeight() - fichaComida.margen);
}

// segundo circle fichitaEnergia 
 // color amarillo
 // aparece imagen de marca 


 // incrementa barra de felicidad
  
distancia = ofDist(ficha_grande.x, ficha_grande.y, fichitaEnergia.x, fichitaEnergia.y);

if (colision(distancia, ficha_grande.radio, fichitaEnergia.radio)) 
{
collect.play();
puntos += 1;  //puntos = 1;
fichitaEnergia.mostrarImg = true;
fichitaEnergia.numeroImagen = ofRandom(CANT_ELEMENTOS);

//fichitaEnergia.imagenParaMostrar = fichitaEnergia.elementos[fichitaEnergia.numeroImagen];

  // consume energia
  barra_energia_ancho_inicial -= 200;

 // incrementa barra defelicidad 
    barra_felicidad_ancho_inicial += 800;  // antes era barra_tiempo_ancho_ancho;
    tiempo_total += (2 / puntos) + 0.3f;   
 // incrementa velocidad de ficha ppal
 // aparece imagen de marca de iz a der

ficha_grande.velocidad += 1;

velReproduc +=.2;

velReproducMap = ofMap (velReproduc, 0, 10, 0.0, 1, true);

musica.setSpeed(musica.getSpeed()+velReproducMap);

fichitaEnergia.x = ofRandom(fichitaEnergia.margen, ofGetWidth() - fichitaEnergia.margen);
fichitaEnergia.y = ofRandom(fichitaEnergia.margen, ofGetHeight() - fichitaEnergia.margen);
}


// tercer circle fichaVeneno

///////////////////////////////////////////////////////////////////////////////////////////////
 
 // color negra
 // aparece imagen de cuenta a pagar
 // disminuye barra de energia
 // velocidad de reproduccion musical disminuyendo
    
distancia = ofDist(ficha_grande.x, ficha_grande.y, fichaVeneno.x, fichaVeneno.y);
if (colision(distancia, ficha_grande.radio, fichaVeneno.radio)) 
{
// se activa boleana para mostrar imagen

fichaVeneno.mostrarImg = true;

hurt.play();
ficha_grande.velocidad -=  .5; // -= 1;
velReproduc-= .2;

velReproducMap = ofMap (velReproduc, 0, 10, 0.0, 1, true); // mapeo

musica.setSpeed(musica.getSpeed()-velReproducMap);

// aparece imagen de cuenta a pagar
 // disminuye barra de energia y felicidad
 barra_energia_ancho_inicial -= 400;
 barra_felicidad_ancho_inicial -= 400;
 // velocidad de reproduccion musical disminuyendo


fichaVeneno.x = ofRandom(fichaVeneno.margen, ofGetWidth() - fichaVeneno.margen);
fichaVeneno.y = ofRandom(fichaVeneno.margen, ofGetHeight() - fichaVeneno.margen);

}

fichita01.update();
fichaVeneno.update();
fichaComida.update();    
fichitaEnergia.update();

if (ayuda && estado == 2) 
{
    estado = 3;
    ayuda = false;
}

if (felicidadCero || energiaCero ) //|| ficha_grande.velocidad <= 0)
{
    estado = 3;
}



}
  else //if(estado == 3)

{
    ficha_grande.arriba = false;
    ficha_grande.abajo = false;
    ficha_grande.izquierda = false;
    ficha_grande.derecha = false;    

    
    musica.stop();

    contadorFinal ++;

    if (contadorFinal % 240 == 0)
    {
        nroTexto++;
        contadorFinal = 0;
    }

    if (nroTexto >= 8)
    {
       reset();   //// funcion reset();

    }
        
}


}

//--------------------------------------------------------------
void ofApp::draw(){

    if(pantallaCompleta)
    {
        escala = ofGetScreenHeight() / alto;
        ancho_escalado = ancho * escala;

        margen = (ofGetScreenWidth() - ancho_escalado) / 2;

        //ofTranslate(margen, 0); /// si dibujo un  cuadrado o pongo una imagen habilito esta line

        ofScale(escala, escala);

    }

    ofSetBackgroundColor (176, 215, 254); //(100, 200, 100);
    
    if (estado == 0) {

    ofSetColor(255);
    
    font_01.drawString(titulo, ofGetWidth()/2-font_01.stringWidth(titulo)/2 , ofGetHeight()/4 + 100);
    font_02.drawString(start,ofGetWidth()/2-font_02.stringWidth(titulo)/2,ofGetHeight()/2 +100);
  
    } 
    else if (estado == 1)
    {
    
    // instruciones
    
    font_02.drawString(instrucciones, ofGetWidth()/2-font_02.stringWidth(instrucciones)/2,ofGetHeight()/4);
    
    }
    else if (estado == 2)
    {
    // /////////juego. ///////////////////////

    // Dibujamos la barra_tiempo.
ofPushMatrix();
    ofSetColor(250);
  fuente_texto_mensaje.drawString(texto_mensaje, posicion_texto_mensaje.x, posicion_texto_mensaje.y); 
  ofSetColor( ofColor::red );
  ofDrawRectangle( posicion_felicidad_tiempo, barra_felicidad_ancho, barra_felicidad_alto );
  ofSetColor( ofColor::white );

  fuente_texto_mensaje.drawString(texto_mensaje_energia, posicion_texto_mensaje_energia.x, posicion_texto_mensaje_energia.y);
    ofSetColor( ofColor::red );
    ofDrawRectangle(posicion_energia_tiempo, barra_energia_ancho_inicial, barra_energia_alto);
  // Mostramos los textos.
 // fuente_texto_puntos.drawString( texto_puntos, 20, 120 );

  if( pausa || energiaCero)  //agregue energiaCero y !
  {
    ofSetColor(250);
    fuente_texto_mensaje.drawString( texto_mensaje, posicion_texto_mensaje.x, posicion_texto_mensaje.y );
    fuente_texto_mensaje.drawString(texto_mensaje_energia, posicion_texto_mensaje_energia.x, posicion_texto_mensaje_energia.y);
  }
ofPopMatrix();    

    // ===================================

    fichita01.draw();
   // fichita01.pregunta.drawString(fichita01.preguntas[fichita01.numeroDePreg], ofGetWidth()/2 - fichita01.pregunta.stringWidth(fichita01.preguntas[fichita01.numeroDePreg])/2, fichita01.coordY);  

    fichitaEnergia.draw();

    fichaComida.draw();

    fichaVeneno.draw();

    ficha_grande.draw();

   
    } else // if (estado == 3)
    {
        // patalla de salida
        ofSetBackgroundColor(176, 215, 254);
        ofSetColor(255);
        placaFinal.setAnchorPercent(.5, .5);
        placaFinal.draw(ofGetWidth()/2, ofGetHeight()/2);
       
        ofSetColor(ofColor::whiteSmoke);
        font03.drawString(textosFinales[nroTexto], ofGetWidth()/2 , ofGetHeight()/6);  //- font03.stringWidth(textosFinales[nroTexto])/2,

    }

}

//--------------------------------------------------------------

bool ofApp::colision (int distancia_, int radio_M_, int radio_m_)
{
if (distancia_ <= (radio_M_ - 15 )) //+ borro radio_m_
{
return true;
} else 
{
return false;
}

}
//-----------------------------------------------------------------

float ofApp::manipularVelMusic (float velReproduc_, float velReproducMap_)
{
 velReproducMap_ = ofMap (velReproduc_, 0, 10, 0.0, 1, true);

 return velReproducMap_;
}

//--------------------------------------------------------------

void ofApp::reset()
{
    estado = 0;
    nroTexto = 0;

    contadorSonido = 0;
    contadorInstrucciones = 0;
    contadorFinal = 0;

    velReproduc = 5;    
    velReproducMap = 1;

    ficha_grande.velocidad = 2;

    puntos = 0;
    puntos_energia = 0;

    tiempo_total = 30.0f; 

    barra_energia_ancho_inicial = 1200;
    barra_energia_ancho = barra_energia_ancho_inicial;


    barra_felicidad_ancho_inicial = 1200;
    barra_felicidad_ancho = barra_felicidad_ancho_inicial;


    pausa = true;  //false;

    ayuda = false;

    botonStart = false;

    ofResetElapsedTimeCounter();

   energiaCero = false;   // false;
   felicidadCero = false;
    
    musica.setSpeed(velReproducMap);
    musica.play();
    musica.setLoop(true);
    
   
}

//--------------------------------------------------------------

void ofApp::keyPressed(int key){
    if (key == 'f' || key == 'F')
    {
    pantallaCompleta = !pantallaCompleta;
    ofToggleFullscreen();
    }

switch (key)
{
case OF_KEY_UP:
    ficha_grande.arriba = true;
    ficha_grande.abajo = false;
    ficha_grande.izquierda = false;
    ficha_grande.derecha = false;
    break;

case OF_KEY_DOWN:
    ficha_grande.arriba = false;
    ficha_grande.abajo = true;
    ficha_grande.izquierda = false;
    ficha_grande.derecha = false;
    break;

case OF_KEY_LEFT:
    ficha_grande.arriba = false;
    ficha_grande.abajo = false;
    ficha_grande.izquierda = true;
    ficha_grande.derecha = false;
    break;

case OF_KEY_RIGHT:
    ficha_grande.arriba = false;
    ficha_grande.abajo = false;
    ficha_grande.izquierda = false;
    ficha_grande.derecha = true;
    break;

case 'q':
    
    botonStart = !botonStart;
    break;

/*
case 'a':
    
    estado--;
    break;  

    */  

case 'p':
    
    ayuda = !ayuda;
    break;       

default:
    break;
}
 
 if( key == OF_KEY_RETURN )
  {
    // Inicializamos los valores para jugar.
    puntos = 0;
    tiempo_total = 18.0f;

    // Reseteamos el contador de tiempo.
    ofResetElapsedTimeCounter();

    pausa = false;
    
  }
  
}

//--------------------------------------------------------------
void ofApp::keyReleased(int key){

}

//--------------------------------------------------------------
void ofApp::mouseMoved(int x, int y ){

}

//--------------------------------------------------------------
void ofApp::mouseDragged(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mousePressed(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mouseReleased(int x, int y, int button){

}

//--------------------------------------------------------------
void ofApp::mouseEntered(int x, int y){

}

//--------------------------------------------------------------
void ofApp::mouseExited(int x, int y){

}

//--------------------------------------------------------------
void ofApp::windowResized(int w, int h){

}

//--------------------------------------------------------------
void ofApp::gotMessage(ofMessage msg){

}

//--------------------------------------------------------------
void ofApp::dragEvent(ofDragInfo dragInfo){ 

}
