//Places a room in the given tilemap using given coordinates and given constraints
        //enumerated at the top of the class.
        //Returns a Room object, which contains x,y coordinates, width, and height.
        public Room placeRoom(int[,] map, bool[,] cMap, int xCoor, int yCoor)
        {
            Room placedRoom;

            int randomWidthMax = random.Next(minRoomWidth, maxRoomWidth);
            int randomHeightMax = random.Next(minRoomHeight, maxRoomHeight);

            //Console.WriteLine("Random Width Max" + randomWidthMax);
            //Console.WriteLine("Random Height Max" + randomHeightMax);

            int leftMapBound = 0;
            int rightMapBound = map.GetLength(1) - 1;
            int upperMapBound = 0;
            int lowerMapBound = map.GetLength(0) - 1;
            int leftBound = xCoor - minRoomWidth;
            int rightBound = xCoor + minRoomWidth;
            int upperBound = yCoor - minRoomHeight;
            int lowerBound = yCoor + minRoomHeight;
            bool leftSet = false;
            bool rightSet = false;
            bool upperSet = false;
            bool lowerSet = false;

            //Console.WriteLine("X:" + xCoor);
            //Console.WriteLine("Y:" + yCoor);
            //Console.WriteLine("LeftBound:" + leftBound);
            //Console.WriteLine("Right Bound:" + rightBound);
            //Console.WriteLine("UpperBound:" + upperBound);
            //Console.WriteLine("Lower Bound:" + lowerBound);

            //for (int i = minRoomWidth; i < randomWidthMax; i++)
            //{
            //    if (map[yCoor, xCoor - i] != 0 || map[yCoor, xCoor + i] != 0)
            //    {
            //        leftBound = xCoor - i + 1;
            //        rightBound = xCoor + i - 1;
            //        i = randomWidthMax;
            //    }
            //}

            //for (int i = minRoomHeight; i < randomHeightMax; i++)
            //{
            //    if (map[yCoor - i, xCoor] != 0 || map[yCoor + i, xCoor] != 0)
            //    {
            //        upperBound = yCoor - i + 1;
            //        lowerBound = yCoor + i - 1;
            //        i = randomHeightMax;
            //    }
            //}

            int sizeCounter = (int)MathHelper.Min(minRoomHeight, minRoomWidth);
            while (sizeCounter <= randomWidthMax || sizeCounter <= randomHeightMax )
            {

                //Console.WriteLine(sizeCounter);

                if ((!leftSet || !upperSet) && map[yCoor - sizeCounter, xCoor - sizeCounter] != 0)
                {
                    //Console.WriteLine("Upper Left collision detected");
                    if (!leftSet)
                    {
                        leftBound = xCoor - sizeCounter + 1;
                        leftSet = true;
                    }
                    else if (!upperSet)
                    {
                        upperBound = yCoor - sizeCounter + 1;
                        upperSet = true;
                    }
                }

                if ((!rightSet || !upperSet) && map[yCoor - sizeCounter, xCoor + sizeCounter] != 0)
                {
                    //Console.WriteLine("Upper right collision detected");
                    if (!rightSet)
                    {
                        rightBound = xCoor + sizeCounter - 1;
                        rightSet = true;
                    }
                    if (!upperSet)
                    {
                        upperBound = yCoor - sizeCounter + 1;
                        upperSet = true;
                    }
                }

                if ((!leftSet || !lowerSet) && map[yCoor + sizeCounter, xCoor - sizeCounter] != 0)
                {
                    //Console.WriteLine("Lower Left collision detected");

                    if (!leftSet)
                    {
                        leftBound = xCoor - sizeCounter + 1;
                        leftSet = true;
                    }
                    if (!lowerSet)
                    {
                        lowerBound = yCoor + sizeCounter - 1;
                        lowerSet = true;
                    }
                }

                if ((!rightSet && !lowerSet) && map[yCoor + sizeCounter, xCoor + sizeCounter] != 0)
                {

                    //Console.WriteLine("Lower right collision detected");

                    if (!lowerSet)
                    {
                        lowerBound = yCoor + sizeCounter - 1;
                        lowerSet = true;
                    }
                    if (!rightSet)
                    {
                        rightBound = xCoor + sizeCounter - 1;
                        rightSet = true;
                    }
                }

                if (sizeCounter <= randomWidthMax)
                {
                    if (!leftSet)
                    {
                        if (map[yCoor, xCoor - sizeCounter] != 0)
                        {
                            leftBound = xCoor - sizeCounter + 1;
                            leftSet = true;
                        }
                        if (map[yCoor, xCoor - sizeCounter] == 0)
                        {
                            leftBound = xCoor - sizeCounter;
                        }
                    }

                    if (!rightSet)
                    {
                        if (map[yCoor, xCoor + sizeCounter] != 0)
                        {
                            rightBound = xCoor + sizeCounter - 1;
                            rightSet = true;
                        }
                        if (map[yCoor, xCoor + sizeCounter] == 0)
                        {
                            rightBound = xCoor + sizeCounter;
                        }
                    }
                }

                if (sizeCounter <= randomHeightMax)
                {
                    if (!upperSet)
                    {
                        if (map[yCoor - sizeCounter, xCoor] != 0)
                        {
                            upperBound = yCoor - sizeCounter + 1;
                            upperSet = true;
                        }
                        else if (map[yCoor - sizeCounter, xCoor] == 0)
                        {
                            upperBound = yCoor - sizeCounter;
                        }
                    }

                    if (!lowerSet)
                    {
                        if (map[yCoor + sizeCounter, xCoor] != 0)
                        {
                            lowerBound = yCoor + sizeCounter - 1;
                            lowerSet = true;
                        }
                        else if (map[yCoor + sizeCounter, xCoor] == 0)
                        {
                            lowerBound = yCoor + sizeCounter;
                        }

                    }
                }

                if (leftSet && rightSet && upperSet && lowerSet)
                {
                    //Console.WriteLine("Terminating loop - all bounds set");
                    sizeCounter = (int)MathHelper.Max(maxRoomWidth, maxRoomHeight) + 1;
                }

                sizeCounter++;

                if (xCoor - sizeCounter < leftMapBound || xCoor + sizeCounter > rightMapBound || yCoor - sizeCounter < upperMapBound || yCoor + sizeCounter > lowerMapBound)
                {
                    //Console.WriteLine("Terminating loop - room bounds went are illegal");
                    sizeCounter = (int)MathHelper.Max(maxRoomWidth, maxRoomHeight);
                }
            }

            //Console.WriteLine("LeftBound:" + leftBound);
            //Console.WriteLine("Right Bound:" + rightBound);
            //Console.WriteLine("UpperBound:" + upperBound);
            //Console.WriteLine("Lower Bound:" + lowerBound);

            map[upperBound, leftBound] = 1;
            map[upperBound, rightBound] = 3;
            map[lowerBound, leftBound] = 7;
            map[lowerBound, rightBound] = 9;

            for (int i = upperBound +1; i < lowerBound; i++)
            {
                map[i, leftBound] = 4;
                map[i, rightBound] = 6;
            }
            for (int i = leftBound +1; i < rightBound; i++)
            {
                map[upperBound, i] = 2;
                map[lowerBound, i] = 8;
            }

            for (int i = upperBound + 1; i < lowerBound; i++)
            {
                for (int j = leftBound + 1; j < rightBound; j++)
                {
                    map[i,j] = 5;
                    cMap[i, j] = true;
                }
            }
            //tileMap[yCoor, xCoor] = 14;

            //Console.WriteLine("Actual Width:" + (rightBound - leftBound + 1));
            //Console.WriteLine("Actual Height:" + (lowerBound - upperBound + 1));
            Rectangle dimensions = new Rectangle(leftBound, upperBound, rightBound - leftBound + 1, lowerBound - upperBound + 1);
            placedRoom = new Room(dimensions);
            return placedRoom;

        }
        public void placeKey(bool[,] cMap, Room room)
        {
            Rectangle dimensions = room.dimensions;
            Point coors;

            coors.X = (int)random.Next(dimensions.X + 1, dimensions.X + dimensions.Width - 2);
            coors.Y = (int)random.Next(dimensions.Y + 1, dimensions.Y + dimensions.Height - 2);

            SpawnFlag curSpawn;
            for (int i = 0; i < spawns.Count; i++)
            {
                curSpawn = spawns[0];
                if (curSpawn.tilePosition.X == coors.X && curSpawn.tilePosition.Y == coors.Y)
                {
                    coors.X = (int)random.Next(dimensions.X + 1, dimensions.X + dimensions.Width - 2);
                    coors.Y = (int)random.Next(dimensions.Y + 1, dimensions.Y + dimensions.Height - 2);
                }
            }

            SpawnFlag spawnFlag = new SpawnFlag("key", coors, (int)SPAWNTYPES.KEY);
            spawns.Add(spawnFlag);
            room.spawns.Add(spawnFlag);
        }
        public void placeEnemy(bool[,] cMap, Room room, List<SpawnFlag> spawns, String enemyType)
        {
            Rectangle dimensions = room.dimensions;
            Point coors;

            coors.X = (int)random.Next(dimensions.X + 1, dimensions.X + dimensions.Width - 2);
            coors.Y = (int)random.Next(dimensions.Y + 1, dimensions.Y + dimensions.Height - 2);

            SpawnFlag curSpawn;
            for (int i = 0; i < spawns.Count; i++ )
            {
                curSpawn = spawns[0];
                if (curSpawn.tilePosition.X == coors.X && curSpawn.tilePosition.Y == coors.Y)
                {
                    coors.X = (int)random.Next(dimensions.X + 1, dimensions.X + dimensions.Width - 2);
                    coors.Y = (int)random.Next(dimensions.Y + 1, dimensions.Y + dimensions.Height - 2);
                }
            }

            SpawnFlag spawnFlag = new SpawnFlag(enemyType, coors, 2);
            spawns.Add(spawnFlag);
        }
        public List<Room> partitionPastRoom(List<Room> rooms, Room lockedBranch)
        {
            rooms.Remove(lockedBranch);
            if (lockedBranch.children.Count > 0)
            {
                foreach (Room child in lockedBranch.children)
                {
                    rooms = partitionPastRoom(rooms, child);
                }
                return rooms;
            }else
            { 
                return rooms;
            }

        }