package com.brackeen.javagamebook.tilegame;

import java.awt.Image;
import java.util.LinkedList;
import java.util.Iterator;

import com.brackeen.javagamebook.graphics.Sprite;

/**
    Klasa TileMap zawiera dane mapy korzystąjcej z kafelków
    i zawierającej duszki. Każdy kafelek jest odwołaniem do obiektu
    Image. Oczywiście obiekty Image są wykorzystywane wielokrotnie.
*/
public class TileMap {

    private Image[][] tiles;
    private LinkedList sprites;
    private Sprite player;

    /**
        Tworzenie nowego obiektu TileMap o określonej szerokości
        i wysokości (wyrażonej liczbą kafelków) mapy.
    */
    public TileMap(int width, int height) {
        tiles = new Image[width][height];
        sprites = new LinkedList();
    }

    /**
        Zwraca szerokość bieżącego obiektu TileMap (ilość kafelków w poziomie).
    */
    public int getWidth() {
        return tiles.length;
    }

    /**
        Zwraca wysokość bieżącego obiektu TileMap (ilość kafelków w pionie).
    */
    public int getHeight() {
        return tiles[0].length;
    }

    /**
        Zwraca kafelek o określonych współrzędnych. Zwraca null jeżeli
        w tych współrzędnych nie ma kafelka lub współrzędne są poza zakresem.
    */
    public Image getTile(int x, int y) {
        if (x < 0 || x >= getWidth() ||
            y < 0 || y >= getHeight())
        {
            return null;
        }
        else {
            return tiles[x][y];
        }
    }

    /**
        Ustawia kafelek na określonych współrzędnych
    */
    public void setTile(int x, int y, Image tile) {
        tiles[x][y] = tile;
    }

    /**
        Zwraca duszka bohatera.
    */
    public Sprite getPlayer() {
        return player;
    }

    /**
        Ustawia duszka bohatera.
    */
    public void setPlayer(Sprite player) {
        this.player = player;
    }

    /**
        Dodaje obiekt Sprite do mapy.
    */
    public void addSprite(Sprite sprite) {
        sprites.add(sprite);
    }

    /**
        Usuwa obiekt Sprite z mapy.
    */
    public void removeSprite(Sprite sprite) {
        sprites.remove(sprite);
    }

    /**
        Zwraca obiekt Iterator dla wszystkich duszków tej mapy,
        poza duszkiem bohatera.
    */
    public Iterator getSprites() {
        return sprites.iterator();
    }
}
