static void HandleMovement(Dungeon dungeon) { var room = dungeon.Rooms.FirstOrDefault(r => r is StartRoom); RoomCoords userPos = new RoomCoords(0, 0); PrintMap(dungeon, userPos); int cursorTop = Console.CursorTop; while (true) { var previousPos = userPos; List <Direction> directions = new List <Direction>(); if (room.AdjacentNorth != null) { directions.Add(Direction.North); } if (room.AdjacentEast != null) { directions.Add(Direction.East); } if (room.AdjacentSouth != null) { directions.Add(Direction.South); } if (room.AdjacentWest != null) { directions.Add(Direction.West); } PrintMoveOptions(directions, cursorTop); EvaluatePlayerMove(ref room, ref userPos, directions); UpdatePlayerPosition(dungeon, userPos, previousPos); } }
static void UpdateChamber(RoomCoords previousPos, List <int> xValues, List <int> yValues, char label) { var left = xValues.IndexOf(previousPos.X); Console.CursorLeft = left * 2; var top = yValues.IndexOf(previousPos.Y); Console.CursorTop = top * 2; PrintRoomLabel(label); }
static void UpdatePlayerPosition(Dungeon dungeon, RoomCoords currentPos, RoomCoords previousPos) { var orderedRooms = dungeon.Rooms.OrderBy(r => r.Coords.X).ThenBy(r => r.Coords.Y).ToList(); var xValues = orderedRooms.Select(r => r.Coords.X).OrderBy(x => x).ToHashSet().ToList(); var yValues = orderedRooms.Select(r => r.Coords.Y).OrderByDescending(y => y).ToHashSet().ToList(); var roomAtPreviousPos = dungeon.Rooms.FirstOrDefault(r => r.Coords.Equals(previousPos)); UpdateChamber(previousPos, xValues, yValues, roomAtPreviousPos.GetType().Name[0]); UpdateChamber(currentPos, xValues, yValues, 'U'); }
static void PrintMap(Dungeon dungeon, RoomCoords userPos) { var orderedRooms = dungeon.Rooms.OrderBy(r => r.Coords.X).ThenBy(r => r.Coords.Y).ToList(); var xValues = orderedRooms.Select(r => r.Coords.X).OrderBy(x => x).ToList(); var yValues = orderedRooms.Select(r => r.Coords.Y).OrderBy(y => y).ToList(); var farLeft = xValues.First(); var farRight = xValues.Last(); var farUp = yValues.Last(); var farDown = yValues.First(); for (int y = farUp; y >= farDown; y--) { List <string> verticalConnections = new List <string>(); for (int x = farLeft; x <= farRight; x++) { var allRooms = orderedRooms.Where(r => r.Coords.X == x && r.Coords.Y == y).ToList(); var room = allRooms.FirstOrDefault(); if (allRooms.Count > 1) { Console.Write(allRooms.Count); } else if (room is null) { Console.Write(" "); verticalConnections.Add(" "); } else { // Print Chamber PrintRoomLabel(room.Coords.Equals(userPos) ? 'U' : room.GetType().Name[0]); verticalConnections.Add(room.AdjacentSouth != null ? "| " : " "); } // Connect Halls Console.Write(room != null && room.AdjacentEast != null ? "-" : " "); } Console.WriteLine(); // Print Vertical Connections foreach (var connection in verticalConnections) { Console.Write(connection); } Console.WriteLine(); } Console.WriteLine(); }
private void ConvertEndOfHall(Room endOfHall, int directionalId, RoomCoords newCoords) { var neighborCell = Rooms.FirstOrDefault(r => r.Coords.Equals(newCoords)); var newChamber = new Chamber { AdjacentNorth = endOfHall.AdjacentNorth, AdjacentEast = endOfHall.AdjacentEast, AdjacentSouth = endOfHall.AdjacentSouth, AdjacentWest = endOfHall.AdjacentWest, Coords = endOfHall.Coords }; ConnectRoom(newChamber, neighborCell, directionalId); var hallIndex = Rooms.IndexOf(endOfHall); Rooms[hallIndex] = newChamber; }
static void EvaluatePlayerMove(ref Room room, ref RoomCoords userPos, List <Direction> directions) { var moveDirection = GetMoveDirection(directions); switch (moveDirection) { case Direction.North: if (room.AdjacentNorth != null) { room = room.AdjacentNorth; userPos.Y++; } break; case Direction.West: if (room.AdjacentWest != null) { room = room.AdjacentWest; userPos.X--; } break; case Direction.South: if (room.AdjacentSouth != null) { room = room.AdjacentSouth; userPos.Y--; } break; case Direction.East: if (room.AdjacentEast != null) { room = room.AdjacentEast; userPos.X++; } break; default: break; } }
public StartRoom() { Coords = new RoomCoords(0, 0); Name = "Starting Chamber"; }