Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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');
        }
Пример #4
0
        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();
        }
Пример #5
0
        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;
        }
Пример #6
0
        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;
            }
        }
Пример #7
0
 public StartRoom()
 {
     Coords = new RoomCoords(0, 0);
     Name   = "Starting Chamber";
 }