import java.util.Set;

public class Dungeon {

	private char[][] dungeon;
	private GameEngine game;
	private int N;

	public Dungeon(char[][] dungeon, GameEngine game) {
		N = dungeon.length;
		this.dungeon = dungeon;
		this.game = game;
	}

	public int size() {
		return N;
	}

	public Position getRoguePosition() {
		return game.getRoguePosition();
	}

	public Position getMonsterPosition() {
		return game.getMonsterPosition();
	}
	
	public Set<Position> getPotionPositions() {
		return game.getPotionPositions();
	}

	public boolean isLegalPosition(Position p) {
		int x = p.getX();
		int y = p.getY();
		if (x < 0 || y < 0 || x >= N || y >= N) {
			return false;
		}
		if ((dungeon[x][y] != '+') && (dungeon[x][y] != '.')) {
			return false;
		}
		return true;
	}

	public boolean isCorridor(Position p) {
		if (!isLegalPosition(p)) {
			return false;
		}
		return dungeon[p.getX()][p.getY()] == '+';
	}

	public boolean isRoom(Position p) {
		if (!isLegalPosition(p)) {
			return false;
		}
		return dungeon[p.getX()][p.getY()] == '.';
	}

	public boolean isLegalMove(Position p1, Position p2) {
		int x1 = p1.getX();
		int y1 = p1.getY();
		int x2 = p2.getX();
		int y2 = p2.getY();
		if ((!isLegalPosition(p1)) || (!isLegalPosition(p2))) {
			return false;
		}
		if ((Math.abs(x1 - x2) > 1) || (Math.abs(y1 - y2) > 1)) {
			return false;
		}
		if (isRoom(p1) && isRoom(p2)) {
			return true;
		}
		if ((x1 == x2) || (y1 == y2)) {
			return true;
		}
		return false;
	}

}
