/// <summary> /// search all rooms in AreaList assigning coords then checking neighbours /// and repeating until AreaList is empty /// /// Completed rooms are added to CompletedRooms and removed from AreaList /// /// </summary> /// <returns>Returns CompletedRooms which contains the list of rooms that have coordinates set</returns> public List <Room.Room> AssignCoords() { var startingLoc = AreaList.FirstOrDefault(x => x.areaId == 0); if (startingLoc == null) { return(null); } SetCoords(startingLoc, new Coordinates()); /* * Takes the 1st room and search all 4 exits * and assigns them coordinates adding them * to the completed list */ ProcessRoom(startingLoc); /* * Now completedList has areas, loop areaList looking for rooms * that have exits that lead to one of the rooms in the completed list */ while (AreaList.Count > 0) { var getRoom = AreaList.Last(); //Check if getRoom has a neighbour in the completed List var getNeighbour = GetNeighbour(getRoom); if (getNeighbour != null) { var getExitToNeighbour = GetNeighbourExit(getRoom, getNeighbour); if (getExitToNeighbour != null) { SetCoords(getRoom, GetNewCoord(getNeighbour.coords, getExitToNeighbour.name, true)); } ProcessRoom(getRoom); } else { /* * if nothing found remove the room from areaList * and add back to the top of the Area:ist */ AreaList.Remove(getRoom); AreaList.Insert(0, getRoom); } } //Once all rooms in areaList have been processed return the list of completed rooms return(CompletedRooms); }
/// <summary> /// loops through the exits of getRoom looking for adjacent rooms in AreaList /// then assigns coords to getRoom relating to the adjacent room /// /// For example: /// getRoom is (0,0,0) and has an exit which leads to areaId 1 /// /// nextRoom is a room that has the matching areaId of one of getRoom's exits /// in this case 1. /// /// So the coordinates it will assign to nextRoom is (1,0,0) /// /// Because GetNewCoord(getRoom.coords, exit.name); /// would look like this: /// GetNewCoord((0,0,0), "North"); /// /// Once the coord has been given to a room it adds it to the completed /// list and removes it from area list /// /// </summary> /// <param name="getRoom">Last room from area list</param> public void ProcessRoom(Room.Room getRoom) { foreach (var exit in getRoom.exits) { var nextRoom = AreaList.FirstOrDefault(x => x.areaId == exit.areaId); var nextRoomCoords = GetNewCoord(getRoom.coords, exit.name); if (nextRoom != null && nextRoom.visited == false) { SetCoords(nextRoom, nextRoomCoords); nextRoom.visited = true; CompletedRooms.Add(nextRoom); AreaList.Remove(nextRoom); } } getRoom.visited = true; CompletedRooms.Add(getRoom); AreaList.Remove(getRoom); }