/*
 * Shot.java
 */
package iut.info1.spaceInvadersRebirth.gameObjects;

import iut.info1.spaceInvadersRebirth.gameStates.LevelState;
import iut.info1.spaceInvadersRebirth.res.Resources;

import java.awt.image.BufferedImage;

/**
 * Reprsente un projectile du joueur ou des ennemis.
 * @author
 * @version
 */
public class Shot extends MovableGameObject {
    
    /**
     * True si ce projectile est un tir du joueur,
     * false si c'est un tir de l'ennemi.
     */
    private boolean isPlayerShot;

    /**
     * Construit un nouveau projectile.
     * @param levelState le LevelState ou crer le projectile.
     * @param isPlayerShot True si ce projectile est un tir du joueur,
     *                     false si c'est un tir de l'ennemi.
     * @throws NullPointerException si levelState == null.
     */
    public Shot(LevelState levelState, boolean isPlayerShot)
    throws NullPointerException {
        super(levelState, isPlayerShot ? 
              Resources.playerShotSprite : 
              Resources.enemiesShotSprite);
        
        this.isPlayerShot = isPlayerShot;
        
        // Dfinis la vitesse des projectiles
        speed = 10;
    }

    /* 
     * (non-Javadoc)
     * @see iut.info1.spaceInvadersRebirth.gameObjects.GameObject#update()
     */
    @Override
    public void update() {
        checkCollision();
        move();
    }
    
    /* 
     * (non-Javadoc)
     * @see iut.info1.spaceInvadersRebirth.gameObjects.MovableGameObject#move()
     */
    @Override
    public void move() {
        translate(0, isPlayerShot ? -speed : speed);
    }
    
    /** 
     * Teste si le projectile entre en collision avec les ennemis 
     * (si c'est un projectile du joueur), avec le joueur 
     * (si c'est un projectile des ennemis) et avec les barricades.<br>
     * Si il y a collision, enlve un point de vie au GameObject concern 
     * et dtruit le projectile. 
     */
    private void checkCollision() {
        checkCollisionWithShelters();
        
        if (isPlayerShot) {
            checkCollisonWithEnemies();
        } else {
            checkCollisonWithPlayer();
        }
        
    }
    /**
     * 
     */
    private void checkCollisonWithPlayer() {
        GameObject player = levelState.getPlayer();
        if (player != null && !player.isDead() 
                && player.getCollisionBox().intersects(getCollisionBox())) {
                
                // Collision !
                // Enlve un point de vie au vaisseau mystre
                player.hit();
                
                Resources.explosionSound.play();

                // Dtruit le projectile
                kill();
            }
    }
    
    /**
     * Teste si le projectile du joueur entre en collision avec un ennemi.<br>
     * Si oui, enlve 1 point de vie  l'ennemi et dtruit le projectile.
     */
    private void checkCollisonWithEnemies() {
        // Rcupre les ennemis
        GameObject[][] enemies = levelState.getEnemyWave().getEnemies();
        GameObject mysteryShip = levelState.getMysteryShip();
        
        // Parcours les barricades
        for (int i = 0 ; i < enemies.length ; i++) {
            for (int j = 0 ; j < enemies[i].length ; j++) {
                // Test de collision
                if (enemies[i][j] != null && !enemies[i][j].isDead()
                    && getCollisionBox().intersects(enemies[i][j].getCollisionBox())) {
                    
                    // Collision !
                    // Enlve un point de vie  l'ennemi concerne
                    enemies[i][j].hit();
                    
                    Resources.explosionSound.play();
    
                    // Dtruit le projectile
                    kill();
                }
                
                if (mysteryShip != null && !mysteryShip.isDead() 
                    && mysteryShip.getCollisionBox().intersects(getCollisionBox())) {
                    
                    // Collision !
                    // Enlve un point de vie au vaisseau mystre
                    mysteryShip.hit();
                    
                    Resources.explosionSound.play();
    
                    // Dtruit le projectile
                    kill();
                }
            }
        }
    }

    /** 
     * Teste si le projectile entre en collision avec une barricade.<br>
     * Si oui, enlve 1 point de vie  la barricade et dtruit le projectile.
     */
    private void checkCollisionWithShelters() {
        // Rcupre les barricades
        GameObject[] shelters = levelState.getShelters();
        
        // Parcours les barricades
        for (int i = 0 ; i < shelters.length ; i++) {
            
            // Test de collision
            if (shelters[i] != null && !shelters[i].isDead()
                && getCollisionBox().intersects(shelters[i].getCollisionBox())) {
                
                // Collision !
                // Enlve un point de vie  la barricade concerne
                shelters[i].hit();
                
                Resources.explosionSound.play();

                // Dtruit le projectile
                kill();
            }
        }
    }

    /* 
     * (non-Javadoc)
     * @see iut.info1.spaceInvadersRebirth.gameObjects.GameObject#getFrame()
     */
    @Override
    public BufferedImage getFrame() {
        return sprite.getSprite();
    }
}

@@ -62,24 +62,240 @@
 meObjects;%0A%0A
+import iut.info1.spaceInvadersRebirth.gameObjects.enemies.BigInvader;%0Aimport iut.info1.spaceInvadersRebirth.gameObjects.enemies.LittleInvader;%0Aimport iut.info1.spaceInvadersRebirth.gameObjects.enemies.MediumInvader;%0A
 import iut.i
@@ -343,16 +343,16 @@
 lState;%0A
-
 import i
@@ -2521,32 +2521,49 @@
 layer.isDead() %0A
+                %0A
                 
@@ -3949,32 +3949,405 @@
         kill();%0A
+                    if(enemies%5Bi%5D%5Bj%5D instanceof BigInvader)%7B%0A                        levelState.addPoints(10);%0A                    %7Delse if(enemies%5Bi%5D%5Bj%5D instanceof MediumInvader)%7B%0A                        levelState.addPoints(20);%0A                    %7Delse if(enemies%5Bi%5D%5Bj%5D instanceof LittleInvader)%7B%0A                        levelState.addPoints(30);%0A                    %7D%0A
                 
@@ -4791,32 +4791,32 @@
 t le projectile%0A
-
                 
@@ -4819,32 +4819,212 @@
         kill();%0A
+                    int%5B%5D points = %7B50, 100, 150, 300%7D;%0A                    int random = ((int) (Math.random() * 100))%253;%0A                    levelState.addPoints(points%5Brandom%5D);%0A
                 

Add points for each type of alien