private Collection<TileType> getApplicableTileTypes(int _x, int _y) {
            TileType northNeighbour = null;
            if (_y - 1 >= 0)
                northNeighbour = ModelManager.this.tileIdToTileTypeMap.get(ModelManager.this.tiles[_x][_y - 1]);
            TileType southNeighbour = null;
            if (_y + 1 < ModelManager.this.mapHeight)
                southNeighbour = ModelManager.this.tileIdToTileTypeMap.get(ModelManager.this.tiles[_x][_y + 1]);
            TileType westNeighbour = null;
            if (_x - 1 >= 0)
                westNeighbour = ModelManager.this.tileIdToTileTypeMap.get(ModelManager.this.tiles[_x - 1][_y]);
            TileType eastNeighbour = null;
            if (_x + 1 < ModelManager.this.mapWidth)
                eastNeighbour = ModelManager.this.tileIdToTileTypeMap.get(ModelManager.this.tiles[_x + 1][_y]);
            Collection<TileType> intersection = new ArrayList<TileType>();
            for (TileType t : tileTypes)
                intersection.add(t);
            if (northNeighbour != null)
                intersection = northNeighbour.getApplicableTileTypes(intersection, TileType.Side.SSE, TileType.Side.SSW);
            if (southNeighbour != null)
                intersection = southNeighbour.getApplicableTileTypes(intersection, TileType.Side.NNW, TileType.Side.NNE);
            if (westNeighbour != null)
                intersection = westNeighbour.getApplicableTileTypes(intersection, TileType.Side.ENE, TileType.Side.ESE);
            if (eastNeighbour != null)
                intersection = eastNeighbour.getApplicableTileTypes(intersection, TileType.Side.WSW, TileType.Side.WNW);
            return intersection;
        }