Map.java

package com.vikingz.campustycoon.Game.Maps;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import com.vikingz.campustycoon.Game.Buildings.*;
import com.vikingz.campustycoon.Game.GameLogic.MoneyHandler;
import com.vikingz.campustycoon.Game.GameLogic.SatisfactionMeter;
import com.vikingz.campustycoon.Game.Tiles.*;
import com.vikingz.campustycoon.UI.Screens.GameplayScreen;
import com.vikingz.campustycoon.UI.Systems.BuildingDisplay;
import com.vikingz.campustycoon.UI.Systems.MapDisplay;
import com.vikingz.campustycoon.Util.Drawer;
import com.vikingz.campustycoon.Util.GameSounds;
import com.vikingz.campustycoon.Util.MapUtils;
import com.vikingz.campustycoon.Util.ScreenUtils;
import com.vikingz.campustycoon.Util.Types.Coordinate;

/**
 * This class is used to create a map.
 */
public class Map {
	public static String defaultMap = "York.txt";

	public ArrayList<ArrayList<Tile>> grid;
	public int width, height;
	public Random rng = new Random();

	public static List<Building> buildings = new ArrayList<Building>();

	private MapDisplay display;
	public BuildingDisplay buildingDisplay;
	private MapUtils mapUtils;

	public boolean placing;
	public String placementType;

	/**
	 * Constructor for the Map class.
	 */
	public Map() {
		mapUtils = new MapUtils(this);
		mapUtils.initialiseGrid();
		mapUtils.initialiseBuildings();

		display = new MapDisplay(this);
		display.drawMap();
		buildingDisplay = new BuildingDisplay(buildings);
		buildingDisplay.drawBuildings();
	}

	/**
	 * Toggles the ability to place a building.
	 * @param building
	 */
	public void toggleBuildingPlacement(String building) {
		if (placementType == building) {
			this.placing = !placing;
			return;
		}

		this.placementType = building;
		this.placing = true;
	}

	/**
	 * Places a building on the map, bypassing the user.
	 * @param position The position to place the building.
	 */
    public void placeBuildingBypass(Coordinate position){
        if (!placing) {
            return; // Placement mode currently toggled off
        }
        Building building = MapUtils.getBuilding(placementType);
        building.setPosition(position);
        building.buildingName = placementType.replaceAll("\\d","");
        building.score = MapUtils.getBuilding(placementType).score;

        //Adds building
        buildings.add(building);
        Drawer.add(-1, building.drawInfo);

        building.incrementBuildingCounter(); // Number go up (by 1)
        SatisfactionMeter.updateSatisfactionScore(); // Placing buildings satisfies students!!!

    }

	/**
	 * Places a building on the map.
	 * @param position The position to place the building.
	 */
	public void placeBuilding(Coordinate position) {
		if (!placing) {
			return; // Placement mode currently toggled off
		}

		Building building = MapUtils.getBuilding(placementType);
		building.setPosition(position);
		placing = false;
		if (!mapUtils.buildingPlaceable(building)) {
            GameSounds.playPlaceError();
			return; // Building location invalid
		}

		if (mapUtils.outsideMap(position)) {
			// Tried to place a building in the void, so places a space station instead
			building = new SpaceStation(position);
            GameSounds.playPlaceError();
		}

        if (!MoneyHandler.addMoney(-building.cost)){
            ((GameplayScreen) ScreenUtils.gameplayScreen).displayBankruptWarning();
            GameSounds.playPlaceError();
            return; //no money
        }

		// Else if placing and building location valid:
		buildings.add(building);
        building.buildingName = placementType.replaceAll("\\d","");
        System.out.println("Score: " + MapUtils.getBuilding(placementType).score);
        building.score = MapUtils.getBuilding(placementType).score;
		Drawer.add(-1, building.drawInfo);

		building.incrementBuildingCounter(); // Number go up (by 1)

		SatisfactionMeter.updateSatisfactionScore(); // Placing buildings satisfies students!!!
        GameSounds.playPlacedBuilding();
	}
}