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

package colisoes;

import java.awt.Graphics;
import java.awt.Point;
import javaPlay.GameEngine;
import javaPlay.GameStateController;
import javaPlay.Keyboard;
import javaPlay.Sprite;

/**
 *
 * @author Gefersom
 */
public class Jogar implements GameStateController
{
    //Instãncias da classe Sprites usadas no jogo
    private Sprite inimigoSprite;
    private Sprite fundo;
    private Sprite playerSprite;

    private Player player;
    private Inimigo inimigos[];

    //Quardará o número de vidas
    private Score score;

    private int NUMERO_INIMIGOS;
    private int NUMERO_MAX_INIMIGOS = 20;
    private int NUMERO_MAX_FASES;
    private int NUMERO_TOTAL_VIDAS;

    private Point pontoInicialInimigo;
    private Point pontoFinalInimigo;
    
    //Quarda algumas informações relativas à fase
    private Fase numeroFase;

    //Faz o carregamento dos itens do jogo na memória
    public void load( )
    {

        player = new Player();
        inimigos = new Inimigo[NUMERO_MAX_INIMIGOS];
        pontoInicialInimigo = new Point();
        pontoFinalInimigo = new Point();
        NUMERO_TOTAL_VIDAS = 4;
        NUMERO_MAX_FASES = 4;
        score = new Score( NUMERO_TOTAL_VIDAS );
        numeroFase = new Fase();

        playerSprite = new Sprite ( "player.png", 1, 40, 41 );

        inimigoSprite = new Sprite ( "inimigo.png", 1, 30, 42 );
        fundo = new Sprite("fundo.png", 1, 800, 600);

        player.setSprite( playerSprite );
       
        for ( int i = 0; i< NUMERO_MAX_INIMIGOS; i++ ){
            inimigos[i] = new Inimigo();
            inimigos[i].setSprite(inimigoSprite);
        }        
    }

    public void unload() {
        
    }

    private void setPosicaoInicialPlayer( )
    {
        player.x = 360;
        player.y = 500;
    }

    //Seta o caminho que o inimigo irá percorrer no plano cartesiano
    private void posicaoInimigos( int numeroInimigo, int xInicio, int yInicio )
    {
        pontoInicialInimigo.x = xInicio;
        pontoInicialInimigo.y = yInicio;
        inimigos[numeroInimigo].setPosicaoIncial( pontoInicialInimigo );
    }      

    private void posicoesInimigosFaseUm( )
    {
        //Informa a posição inicial dos inimigos
        posicaoInimigos( 0, 251, 400 );        
        posicaoInimigos( 1, 501, 270 );
        posicaoInimigos( 2, 400, 150 );

        //Informa em qual eixo o inimigos irão se mover, aqui é o Eixo X
        inimigos[0].setMexerEixoX( true );
        inimigos[1].setMexerEixoX( true );
        inimigos[2].setMexerEixoX( true );

        NUMERO_INIMIGOS = 3;
    }

    private void posicoesInimigosFaseDois( )
    {
        //Seta as posicoes iniciais dos inimigos na tela
        posicaoInimigos( 0, 251, 160 );        
        posicaoInimigos( 1, 201, 252 );
        posicaoInimigos( 2, 401, 300 );
        posicaoInimigos( 3, 550, 400 );
        posicaoInimigos( 4, 251, 456 );
        posicaoInimigos( 5, 450, 456 );

        //Informa em qual eixo o inimigos irão se mover
        inimigos[0].setMexerEixoX( true );
        inimigos[1].setMexerEixoX( true );        
        inimigos[2].setMexerEixoX( true );        
        inimigos[3].setMexerEixoX( true );
        inimigos[4].setMexerEixoX( false );//Irá se mover no eixo Y
        inimigos[5].setMexerEixoX( false );//Irá se mover no eixo Y

        NUMERO_INIMIGOS = 6;
    }

    private void posicoesInimigosFaseTres( )
    {
        //Seta as posicoes iniciais dos inimigos na tela        
        posicaoInimigos( 0, 201, 160 );
        posicaoInimigos( 1, 201, 252 );
        posicaoInimigos( 2, 401, 300 );
        posicaoInimigos( 3, 501, 360 );
        posicaoInimigos( 4, 401, 400 );
        posicaoInimigos( 5, 401, 200 );

        //Informa em qual eixo o inimigos irão se mover
        inimigos[0].setMexerEixoX( true );
        inimigos[1].setMexerEixoX( true );
        inimigos[2].setMexerEixoX( true );
        inimigos[3].setMexerEixoX( true );
        inimigos[4].setMexerEixoX( true );
        inimigos[5].setMexerEixoX( false );//Irá se mover no eixo Y

        NUMERO_INIMIGOS = 6;
    }

    public void start()
    {
        setPosicaoInicialPlayer();
        posicoesInimigosFaseUm();
    }
    

    public void step( long timeElapsed )
    {        
        //Se você completou todas as fases entao aparecerá uma tela dizendo que vc ganhou
        if ( numeroFase.getNumeroFase() ==  NUMERO_MAX_FASES )
           GameEngine.getInstance().setNextGameStateController( NumerosControle.GANHOU );

        //Seta o tempo em milisegundos do player
        player.step( timeElapsed );

        //Verifica se o player atingiu o topo da tela
        if ( player.y < 11 )
        {   
            //Retorna o player a posicao inicial
            setPosicaoInicialPlayer();

            //Avança a fase
            numeroFase.avancaFase();            

            //Verifica qual é a fase e a partir de aí seta as posições dos inimigos de acordo com a fase
            //A fase 1 não está listada pois ela é sempre iniciada pelo método start()
            switch ( numeroFase.getNumeroFase() )
            {
                case 2: posicoesInimigosFaseDois(); break;
                case 3: posicoesInimigosFaseTres(); break;
            }                      
        }

        //Retorna uma instância da classe de Teclado que será usada para controlar o player
        Keyboard k = GameEngine.getInstance().getKeyboard();

        //Move player para cima
        if( k.keyDown(Keyboard.UP_KEY) == true )
            if ( player.y > 10 ) //Nao pode ir para abaixo da tela
                player.y--;               

        //Move player para baixo
        if( k.keyDown(Keyboard.DOWN_KEY) == true )
            if ( player.y < 500 ) //Nao pode ir acima da tela
                player.y++;        

        //Move player para Direita
        if( k.keyDown(Keyboard.LEFT_KEY) == true )
            if ( player.x > 205 ) //Nao pode ultrapassar a parede da esquerda
                player.x--;

        //Move player para Esquerda
        if( k.keyDown(Keyboard.RIGHT_KEY) == true )
            if ( player.x < 560 )//Nao pode ultrapassar a parede da direita
                player.x++;
            
        //*//Parte de Verificação de Colisões

        Point playerMin = new Point( player.x, player.y );

        //Posicao final do inimigo no instante de temp T
        Point playerMax = new Point( player.x + NumerosControle.LARGURA_PLAYER,
                                    player.y + NumerosControle.ALTURA_PLAYER );

        for(int i = 0 ; i < NUMERO_INIMIGOS ; i++)
        {
            inimigos[i].step(  timeElapsed );

            Point enemyMin = new Point( inimigos[i].x , inimigos[i].y +10);
            Point enemyMax = new Point( inimigos[i].x + NumerosControle.LARGURA_INIMIGO -5,
                                        inimigos[i].y + NumerosControle.ALTURA_INIMIGO );

            //Se o player colidiu com a paredes ou com algum inimigo ele volta a posicao inicial e perde-se uma vida
            if( player.colidiuInimigo( playerMin, playerMax, enemyMin, enemyMax) || player.colidiuParede() )
            {
                // atualiza score
                score.setScore(-1);                

                //Retorna Player a posição inicial
                setPosicaoInicialPlayer();

                //Termina o jogo se  ( score = 0 )
                if ( score.getScore() == 0 )
                    GameEngine.getInstance().setNextGameStateController( NumerosControle.PERDEU );
            }
        }//Fim senao                
    }

    
    public void draw(Graphics g) {
        fundo.draw(g, 0, 0);
        score.draw(g);
        numeroFase.draw(g);
        player.draw(g);                
        for ( int i = 0; i< NUMERO_INIMIGOS; i++ )
            inimigos[i].draw(g);
    }   
    
    public void stop() {        
    }


}
