MapUtils.java

package com.vikingz.campustycoon.Util;

import java.util.ArrayList;

import com.vikingz.campustycoon.Game.Buildings.*;
import com.vikingz.campustycoon.Game.Maps.Map;
import com.vikingz.campustycoon.Game.Maps.York;
import com.vikingz.campustycoon.Game.Tiles.*;
import com.vikingz.campustycoon.UI.Camera;
import com.vikingz.campustycoon.Util.Types.Coordinate;

public class MapUtils {
	private Map map;

	public MapUtils(Map Map) {
		map = Map;
	}

	public abstract class Placement {
		public static final String AccommodationBuilding = "ACCOMMODATION";
		public static final String StudyBuilding = "STUDY";
		public static final String StudyBuilding2 = "STUDY2";
		public static final String CafeteriaBuilding = "CAFETERIA";
		public static final String RelaxationBuilding = "RELAXATION";
		public static final String RelaxationBuilding2 = "RELAXATION2";
		public static final String Road = "ROAD"; // Most definitely not implemented yet
	}


	/**
	 * CHANGED
	 *
	 * To create a new building, i created a new {@class Placement} which
	 * just loads a different texture for the study building.
	 *
	 * TODO:
	 * Do the same for the other types of buildings as for study
	 *
	 * @param buildingType
	 * @return
	 */
	public static Building getBuilding(String buildingType) {
		switch (buildingType) {
			case Placement.AccommodationBuilding:
				return new Accommodation();

			case Placement.StudyBuilding:
				return new Study(0);

			case Placement.StudyBuilding2:
				return new Study(1);

			case Placement.CafeteriaBuilding:
				return new Cafeteria();

			case Placement.RelaxationBuilding:
				return new Relaxation(0);

		    case Placement.RelaxationBuilding2:
				return new Relaxation(1);
			default:
				return new Building();
		}
	}

	public boolean buildingPlaceable(Building newBuilding) {
		for (Building Building : Map.buildings) {
			Coordinate b = Building.position;
			Coordinate newPos = newBuilding.position;

			// Checks if the position of the new building would cause any part of itself to overlap with an existing building
			if (newPos.x + newBuilding.width - 1 >= b.x && newPos.x < b.x + Building.width &&
				newPos.y + newBuilding.height - 1 >= b.y && newPos.y < b.y + Building.height) {
					return false;
				}
		}
        for (int x=0; x < newBuilding.width; x++){
            for (int y=0; y < newBuilding.height;y++){
                //Checks for placing over water
                //System.out.println(Camera.getTileFromCoords(newBuilding.position.x+x,newBuilding.position.y+y));
                if (Camera.getTileFromCoords(newBuilding.position.x+x,newBuilding.position.y+y).getTileID() == 1){
                    return false;
                }
            }
        }
		return true;
	}

	public boolean tileHasBuilding(Coordinate tile) {
		for (Building building : Map.buildings) {
			Coordinate pos = building.position;

			// Checks if a building occupies the current tile space
			if (tile.x >= pos.x && tile.x < pos.x + building.width &&
				tile.y >= pos.y && tile.y < pos.y + building.height) {
					return true;
				}
		}

		return false;
	}

	public boolean outsideMap(Coordinate tile) {
		if (tile.x >= map.width || tile.x < 0 ||
				tile.y >= map.height || tile.y < 0) {
			return true;
		}
		return false;
	}


	public void initialiseBuildings() {
		Map.buildings = new ArrayList<Building>();


		// Forcefully enables placement mode
		//map.placing = true;

		// Adds a few different buildings to the map
		map.placementType = Placement.CafeteriaBuilding;
		map.placeBuildingBypass(new Coordinate(4, 5));

		map.placementType = Placement.StudyBuilding;
		map.placeBuildingBypass(new Coordinate(10, 13));


		map.placementType = Placement.AccommodationBuilding;
		map.placeBuildingBypass(new Coordinate(23, 14));
	}

	public void initialiseGrid() {
		// Read map file from somewhere
		// Format:
		// 		width height
		//		mapTileID
		// e.g. 3 3
		//		0 0 1
		//		0 1 1
		// 		1 2 1

		String content = "";
		try {
			//byte[] byteContent = getClass().getResourceAsStream(Map.defaultMap).readAllBytes();
			//content = new String(byteContent, StandardCharsets.UTF_8);
			content = York.RawMap;
		}
		catch (Exception e) { }

		String[] lines = content.split("\n");

		String[] size = lines[0].split(" ");
		map.width = Integer.parseInt(size[0].toString().strip());
		map.height = Integer.parseInt(size[1].toString().strip());

		map.grid = new ArrayList<ArrayList<Tile>>(map.height);

		for (int i = 0; i < map.height; i++) {
			ArrayList<Tile> row = new ArrayList<Tile>(map.width);
			String[] tiles = lines[1 + i].split(" ");
			for (int j = 0; j < map.width; j++) {
				Tile tile = getTile(Integer.parseInt(tiles[j].strip()));
				row.add(tile);
			}
		map.grid.add(row);
		}
	}

	public Tile getTile(int tileID) {
		Tile tile;
		switch (tileID) {
			case 0:
				tile = new Grass();
				break;
			case 1:
				tile = new Lake();
				break;
			case 2:
				tile = new Mountain();
				break;
			default:
				System.out.println("Unknown tile ID: \"" + tileID + "\"");
				tile = null;
		}
		return tile;
	}
}