#include "marbleenemy.h"



void MarbleEnemy::init_posizione(float x, float y, float z) 
{
    vet_compon_controllo.Zero();

    vet_posizione[0]= x + 0.5;
    vet_posizione[1]= y + 0.5;
    vet_posizione[2]= z + 0.5;
    palla_viva=true; // setta la palla viva
    muro_di_morte = 4; //inizializza la var che determina se la pallina si e' spiaccicata su un muro(0..3) o sul pavimento (4)
    vet_velocita.Zero();
    //==================intell===============
    vista_impedita=false;//booleani che determinano se c'e' la mappa tra la palla e l'enemy e se c'e' un precipizio nel percorso
    cado=false;
    //==============================
    //=============texture===========
 //   init_texture=false;     
    //============================*/
}




void MarbleEnemy::Draw(int option)
{glMatrixMode(GL_MODELVIEW);
        Point3f zero;
        zero[XX]=0;
        zero[YY]=0;
        zero[ZZ]=0;  
        glLoadIdentity();
    
        glTranslatef(vet_posizione[0],vet_posizione[1],vet_posizione[2]);
        glBindTexture(GL_TEXTURE_2D,ti); 
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  if (palla_viva)
    {
        
        
    

        glRotatef(angolo_rotazione,vettore_rotazione[0],vettore_rotazione[1],vettore_rotazione[2]);
    
        switch(option) {
                case SOLID:
                    glDisable(GL_TEXTURE_2D);
            
                case TEXTURED:
            
                    CreateSphere(zero,0.5,30);
                
                    break; 
                default:
                    CreateSphere(zero,0.35,30);
        
                
                    
                case WIREFRAME:
    //glTranslatef(vet_posizione[0],vet_posizione[1],vet_posizione[2]-0.75);
                
                    glDisable(GL_TEXTURE_2D);
                    glutWireSphere(0.5,10,10);
                
    //glTranslatef(-vet_posizione[0],-vet_posizione[1],-vet_posizione[2]-0.75);
            break;

        }
    glEnable(GL_TEXTURE_2D);


    }
  else
    {   glEnable(GL_TEXTURE_2D);
            glMatrixMode(GL_MODELVIEW);
                    
                    glLoadIdentity();
        //          glColor3f(0,1,0);   

        switch (muro_di_morte)

            {
                case 0: 
                
                    glTranslatef(vet_posizione[0],vet_posizione[1],vet_posizione[2]-0.75);
                    //zero[ZZ]=-0.75;
                    CreateSphere(zero,0.4,0);
                    
                            break;

                        
                case 1:
                
                    glTranslatef(vet_posizione[0]+0.75,vet_posizione[1],vet_posizione[2]);
                    glRotatef(90,0,1,0);
                    //zero[XX]=+0.75;
            
                            break;

                        
                case 2:
                
                    glTranslatef(vet_posizione[0],vet_posizione[1],vet_posizione[2]+0.75);
                    
            
                            break;

                        
                case 3:
            
                    glTranslatef(vet_posizione[0]-0.75,vet_posizione[1],vet_posizione[2]);
                    glRotatef(90,0,1,0);
            
                
                            break;
                case 4:
            
                    glTranslatef(vet_posizione[0],vet_posizione[1]-0.5,vet_posizione[2]);
                    glRotatef(90,1,0,0);
                    //zero[YY]=-0.5;
                
                            break;
            }
    CreateSphere(zero,0.35,30);
    glDisable(GL_TEXTURE_2D);
                    
    glutWireTorus(0.35,0.25,20,20); 
    }
    glEnable(GL_TEXTURE_2D);
}


MarbleEnemy::MarbleEnemy(void)
{

float circonferenza = 0.5*0.5*M_PI;
angolo_rotazione=0.0;
lung_arco_per_grado =circonferenza/360.0;
attrito=ATTRITONORMALE;

tocca_mappa_piana = true;
tocca_mappa_inclinata = true;
}

MarbleEnemy::~MarbleEnemy(void)
{
}






//modifica il vet_compon_controllo
void MarbleEnemy::Intelligenza(MarbleSphere *ball,MadMap *mp,MarbleEnemy enemy[])
{
    //vettore direzione  che il nemico prende se rileva la palla
    Point3f direzione;
  
    //distanza dalla palla del player
    float distanza; 

    float norma_velocita; 

    //Punto usato per capire se enemy vede la palla del giocatore nonostante la distanza
    //oppure se sta andando verso un precipizio
    Point3f punto_di_controllo;

    //vettore supporto per capire gli incrementi da dare alle componeti del vet punto di 
    //controllo in modo tale che sia sempre spvrapposto al vet posizione
    Point3f incremento;

    //altezza della mappa nel punto(x,z) considerato
    float livello_del_suolo;
    float dislivello;
    direzione=(ball->vet_posizione -vet_posizione);
    distanza=direzione.Norm();//Norm( direzione );
    //printf("distanza %f,\n",distanza);

    punto_di_controllo = vet_posizione;
   // printf("direzione_x direzione_y direzione_z %f, %f, %f\n",direzione.x(),direzione.y(),direzione.z());

    //Calcolo dll'incremento per il controllo della mappa lungo la direzione
    incremento= (ball->vet_posizione -vet_posizione)/distanza;
    //printf("incremento_x incremento_y incremento_z %f, %f, %f\n",incremento.x(),incremento.y(),incremento.z());

   //collision tra nemici
    for (int i=0;i<MAXENEMY;i++)
    { 
        
            if (enemy[i].vet_posizione != vet_posizione)
            {
                Point3f direzione_tra_enemy = enemy[i].vet_posizione -vet_posizione;
                float distanza_tra_enemy=direzione_tra_enemy.Norm();

                if( distanza_tra_enemy  < 1.0 )
                {
                    vet_posizione=(enemy[i].vet_posizione + ( -( direzione_tra_enemy.Normalize() ) ) );
                    vet_velocita=-vet_velocita;
                    enemy[i].vet_velocita=-(enemy[i].vet_velocita);
                }

            }
    

    }
  
    //rimbalzo tra palline nemiche e palla del giocatore
    if (distanza<1.0)
    { 
    vet_posizione=(ball->vet_posizione+(-(direzione.Normalize())));
    vet_velocita=-vet_velocita;
    ball->vet_velocita=-vet_velocita;
    }
    
    //se la distanza e` minore del RAGGIO_SENSORIALE si sposta verso la palla del giocatore 
    //a meno che non sia in vista o ci sia un precipizio in lungo la direzione
    if (distanza < (float)RAGGIO_SENSORIALE)                   
    {    
        for (int i=1;i<(int)ceil((double)distanza);i++)
            {
                //printf("loooooooooop");
                punto_di_controllo= punto_di_controllo+incremento;
            
                livello_del_suolo=(mp->getY(punto_di_controllo.x(),punto_di_controllo.z()));
               // printf("livello del suolo %f,\n",(float)livello_del_suolo);
                if(livello_del_suolo > (punto_di_controllo.y()))  vista_impedita=true;
                
                dislivello = punto_di_controllo.y() -livello_del_suolo;
                //printf("dislivello %f,\n",dislivello);
                if( dislivello > 6.0 ) cado=true; 
                    
            }
        if ((vista_impedita==false) && (cado==false ))
            {
            vet_compon_controllo= direzione*15;
            vet_compon_controllo.y()=0;
            //printf("sentita pallina \n");
            }
    }
    norma_velocita=vet_velocita.Norm();//Norm(vet_velocita);

    //se la distanza e` maggiore di 7 e si muove gia si ferma velocemente
    if ((distanza > (float)RAGGIO_SENSORIALE)&&(norma_velocita>0.0)&&(tocca_mappa_piana || tocca_mappa_inclinata))//||(cado=true)||(vista_impedita=true))
    {                          
    vet_velocita=vet_velocita/1.1;
    //vet_compon_controllo= direzione*2;
    //vet_compon_controllo.y()=0;
    }
    vista_impedita=false;
    cado=false;
}