/**
 * Title:        Pommeja taivaalta
 * Description:  Geneerinen räiskintäpeli Javalla
 * Copyright:    Copyright (c) 2003
 *
 * @author Juho Makkonen
 * @version 1.0
 */


import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;


/**
 * Luokan <code>Pommi</code> olio on näytölle piirtyvä
 * musta ympyrä. Pelaaja yrittää tuhota pommeja, ennen
 * kuin ne ehtivät kaupunkiin asti.
 */
public class Pommi {

    /** Luokkakohtainen vakio pommin koko. */
    private static final int POMMIN_KOKO = 20;
    
    /** Luokkakohtainen vakio satunnaisluku. */
    private static final Random satunnaisluku = new Random();

    /** Pommin x-koordinaatti. */
    private int x;
    
    /** Pommin y-koordinaatti. */
    private int y;

    /** Pommin liikkumissuunta x-akselilla. */
    private int suuntaX;

    /** Pommin liikkumissuunta y-akselilla. */
    private int suuntaY;

    /** Onko pommi olemassa. */
    private boolean onOlemassa = true;

    /** Pommipaneeli, jossa pommi on. */
    private Pommipaneeli pommipaneeli;


    /** 
     * Luo uuden pommin.
     *
     * @param pommipaneeli pommipaneeli, jossa pommi on
     */
    public Pommi(Pommipaneeli pommipaneeli) {

	// Ominaismuuttujan <code>pommipaneeli</code>
	// arvoksi parametrina annettu pommipaneeli.
	this.pommipaneeli = pommipaneeli;

	// Pommin x-koordinaatti alussa määräytyy
	// satunnaisesti.
	this.x = 10 + satunnaisluku.nextInt(660);

	// Pommin y-koordinaatti alussa on 25 (ei 0,
	// ettei pommi peitä pistetilanteen ilmaisevaa
	// paneelia.
	this.y = 25;

	// Pommin x- ja y-suunta määräytyvät
	// satunnaisesti. X-suunta on väliltä -2-2,
	// y-suunta väliltä 3 - 8. X-suunta määrää
	// pommin tulokulman, y-suunta nopeuden.
	this.suuntaX = -2 + satunnaisluku.nextInt(5);
	this.suuntaY = 3 + satunnaisluku.nextInt(6);

    }   

    
    /**
     * Palauttaa pommin x-koordinaatin.
     *
     * @return pommin x-koordinaatti
     */
    public int annaX() {
	return x;
    }

 
    /** 
     * Palauttaa pommin y-koordinaatin.
     *
     * @return pommin y-koordinaatti
     */
    public int annaY() {
	return y;
    }


    /**
     * Palauttaa tiedon siitä, onko pommi
     * olemassa.
     *
     * @return muuttujan
     * <code>onOlemassa</code> arvo,
     * joka voi olla true tai false
     */
    public boolean onOlemassa() {
	return onOlemassa();
    }


    /**
     * Tuhoaa pommin ja kasvattaa pommipaneelin
     * <code>osumatKaupunkiin</code> -muuttujan
     * arvoa yhdellä. Soittaa räjähdysefektin.
     */
    public void osuKaupunkiin() {	
	onOlemassa = false;
	pommipaneeli.annaPommit().removeElement(this);
	pommipaneeli.lisaaOsumiin();
	pommipaneeli.soitaAani("cityhit.au");
    }


    /**
     * Tuhoaa pommin ja kasvattaa pommipaneelin
     * <code>tuhotutPommit</code> -muuttujan
     * arvoa yhdellä. Soittaa tuhoutumisefektin.
     */
    public void tuhoudu() {
	onOlemassa = false;
	pommipaneeli.annaPommit().removeElement(this);
	pommipaneeli.lisaaTuhottuihinPommeihin();
	pommipaneeli.soitaAani("levelup.au");
    }


    /**
     * Piirtää pommin, jos se on olemassa. Muussa tapauksessa
     * peittää pommin viimeisen sijainnin turkoosilla.
     *
     * @param g grafiikkakonteksti, johon piirretään 
     */
    public void piirraPommi(Graphics g) {
	if (onOlemassa) {
	    g.setColor(Color.black);
	    g.fillOval(x,y,POMMIN_KOKO,POMMIN_KOKO);
	} else {
	    g.setColor(new Color(0,255,255));
	    g.fillRect(x,y,POMMIN_KOKO,POMMIN_KOKO);
	}	    
    }


    /**
     * Päivittää pommin sijainnin liikkeen aikaansaamiseksi. 
     */
    public void liikutaPommia() {

	// Jos pommi on menossa ohi kaupungin, muutetaan
	// sen suuntaa.
	if (x + POMMIN_KOKO + suuntaX >= pommipaneeli.getSize().width
	    || x + suuntaX < 0) {
	    suuntaX *= -1;
	}

	// Jos pommi on saavuttanut pommipaneelin alareunan,
	// se osuu kaupunkiin.
	if (y + POMMIN_KOKO >= pommipaneeli.getSize().height ) {
	    osuKaupunkiin();
	}	

	// Päivitetään pommin sijainti.
	x += suuntaX;
	y += suuntaY;

    }

}


