/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ManicMiner;

import java.io.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.*;
import java.util.Random;
/**
 *
 * @author supervisor
 */
public class MinerCanvas extends GameCanvas implements Runnable {

   

    Personaje minero;

    Nivel nivel;

    MinerCanvas()
    {
        super(true);


        

    }

    public void iniciar() {

             nivel = new Nivel();
            this.setFullScreenMode(true);
            nivel.setNivel(0,this);
            this.minero = nivel.getPersonaje();
          


    }
    
    public void run(){
        int puntosAux;
        
        long start, end;
        int duration;
        //Presentacion del juego iria aqui:

       // int sleepTime = 42;
        int sleepTime = 62;
       // int sleepTime = 1000;

        //Dice si se ha pasado el juego
        boolean gameCompleted = false;

        Graphics g = this.getGraphics();

        while(true){

            //Presentacion

            iniciar();
            
            presentacion(g);


            //Cosas que hacer al inicio


            //dentro de los niveles del juego
            while(minero.getVidas()>0 && (!gameCompleted) ){


            start= System.currentTimeMillis();
            

          //Muevo el minero
            minero.mover(this.getKeyStates());


            //Compruebo colisiones
            puntosAux = minero.colision(nivel.getTilesColision(), nivel.getMonstruos(),nivel.getTiles());

            nivel.sumarPuntos(puntosAux);
            
            minero.animacionInterna();
             //Acutlizo estado del minero
            minero.actualizarEstado(nivel.getTilesColision(),nivel.getTiles());

            nivel.comprobarBarra(); //comprueba si se quedo sin aire

            nivel.actualizarBarra();
            


            nivel.animarMonstruos();

            nivel.animarTiles();



            if (minero.estaMuerto()){
                animacionMatado(g);

                minero.reiniciar();
                nivel.setNivel(nivel.getNivel(),this);
                minero = nivel.getPersonaje();
                this.getKeyStates(); //si se ha pulsado alguna tecla durante la animación no influya
            }else if(minero.nivelPasado && (nivel.getNivel())+1<Nivel.NIVELES){
                animacionMatado(g);
                nivel.animarNivelPasado(g, this);
                
                minero.reiniciar();
                nivel.siguienteNivel(this);
                minero = nivel.getPersonaje();
                this.getKeyStates();
            }else if(minero.nivelPasado && (nivel.getNivel()+1) >= Nivel.NIVELES){
                animacionMatado(g);
                nivel.animarNivelPasado(g, this);
                gameCompleted = true;

            }

            if(!gameCompleted)
                nivel.hacerScroll(this);



            
           g.setColor(0,0,0);
           g.fillRect(0, 0, this.getWidth(), this.getHeight());
           nivel.pintar(g,this);
           flushGraphics(0, 0, this.getWidth(), this.getHeight());



           try {
               end = System.currentTimeMillis();
               duration =  (int)(end - start);
               if (duration < sleepTime){
                    Thread.sleep(sleepTime-duration);
                   // Thread.sleep(1000);
               }
           } catch (InterruptedException ex) {
               ex.printStackTrace();
          }

        }

            //si se completo el juego muestro los creditos
            if(gameCompleted){
                mostrarCreditos(g);
                gameCompleted=false;

            }

           
        }
    }



    private void animacionMatado(Graphics gr){
        Random m = new Random();
        int r;
        int g;
        int b;
        for(int pantallazos = 0; pantallazos < 5;pantallazos++){
            r = Math.abs(m.nextInt())%255;
            g = Math.abs(m.nextInt())%255;
            b = Math.abs(m.nextInt())%255;

            gr.setColor(r,g,b);


            gr.fillRect(0, 0, this.getWidth(), this.getHeight());

            flushGraphics(0, 0, this.getWidth(), this.getHeight());
            try{
                Thread.sleep(50);
            }catch(InterruptedException e){
                System.out.println(e);
            }
         }


    }



    void presentacion(Graphics g){
        int teclas = 0;
        int ciclos = 0;
        boolean dibujada = false;
        Image anyKey = null;
        Image letrasp = null;

        long start;
        long end;
        int duration;

        int sleepTime = 62;

        try{
            letrasp = Image.createImage("/letrasPresentacion.png");
        }catch(IOException e){
            System.out.println("error al cargar las letras"+e);
        }



        while(!minero.nivelPasado)
        {

            start= System.currentTimeMillis();

            teclas = this.getKeyStates();

           
            //Muevo el minero
            minero.mover(this.getKeyStates());


            //Compruebo colisiones
            minero.colision(nivel.getTilesColision(), null,null);


            minero.animacionInterna();

            nivel.animarPuerta();

            nivel.hacerScroll(this);
            
            
            g.setColor(0,0,0);
            g.fillRect(0, 0, this.getWidth(), this.getHeight());


            nivel.pintar(g, this);


           this.flushGraphics(0,0,this.getWidth(),this.getHeight());

           try {
               end = System.currentTimeMillis();
               duration = (int) (end - start);
               if (duration < sleepTime){
                    Thread.sleep(sleepTime-duration);
               //Thread.sleep(1000);
               }
           } catch (InterruptedException ex) {
               ex.printStackTrace();
          }

        }



           animacionMatado(g);
           minero.reiniciar();
           nivel.siguienteNivel(this);
           minero = nivel.getPersonaje();

           this.getKeyStates(); //Para que si se ha pulsado alguna tecla durante la animcacion no influya


    }


    void mostrarCreditos(Graphics g){
        Creditos credito = new Creditos(getWidth(),getHeight());
        
        while (!credito.fin()){

            credito.dibujarCreditos(g);

            this.flushGraphics(0,0,this.getWidth(),this.getHeight());
            
            try{
                Thread.sleep(10000);
            }catch(InterruptedException ie){
                System.out.println("Error en parar 10 segundos:"+ie);
            }
        }
    }

    
}



