/// <summary>
 /// A function that returns true if it has added a neighbour
 /// </summary>
 /// <param name="area">From area</param>
 /// <param name="xOffset">X Offset for finding neighbour</param>
 /// <param name="yOffset">Y Offset for finding neighbour</param>
 /// <param name="weight">The weight that is given to the edge</param>
 /// <returns>True if a neighbour has been added, otherwise false</returns>
 private bool AddNeighbour(IArea area, int xOffset, int yOffset, int weight)
 {
     if (!(HotelAreas.Find(X => X.Position == new Point(area.Position.X + xOffset, area.Position.Y + yOffset)) is null))
     {
         area.Edge.Add(HotelAreas.Find(X => X.Position == new Point(area.Position.X + xOffset, area.Position.Y + yOffset)), weight);
         return(true);
     }
     return(false);
 }
Exemple #2
0
        /// <summary>
        /// Handles checkin events and add the ariving guest to the list
        /// </summary>
        /// <param name="evt">The given event</param>
        public void Notify(HotelEvent evt)
        {
            if (evt.EventType.Equals(HotelEventType.CHECK_IN))
            {
                string name    = string.Empty;
                string request = string.Empty;
                int    requestInt;
                int    id = 0;

                if (!(evt.Data is null))
                {
                    foreach (var DataSet in evt.Data)
                    {
                        if (DataSet.Key.Contains("Gast"))
                        {
                            id = int.Parse(Regex.Match(DataSet.Key, @"\d+").Value);
                        }
                    }

                    name    = evt.Data.FirstOrDefault().Key;
                    request = evt.Data.FirstOrDefault().Value;

                    requestInt = int.Parse(Regex.Match(request, @"\d+").Value);
                }
                else
                {
                    // Kill test events
                    return;
                }

                Guest guest = new Guest(this, name, requestInt, new Point(0, HotelHeight), id)
                {
                    Area = HotelAreas.Find(X => X.Position == new Point(0, HotelHeight))
                };

                guest.Area = HotelAreas.Find(X => X.Position == guest.Position);


                guest.Hotel = this;



                ArivingGuests.Add(guest);
            }
Exemple #3
0
        /// <summary>
        /// Creates a function hotel
        /// </summary>
        /// <param name="layout">A file which contains a functioning layout</param>
        /// <param name="settings">The Settings for the simulation</param>
        /// <param name="TypeOfBuilder">A type of builder that can handle the provided file</param>
        public Hotel(List <JsonModel> layout, SettingsModel settings, IHotelBuilder TypeOfBuilder)
        {
            // Hotel will handle the CheckIn_events so it can add them to its list
            // making it possible to keep the list private
            HotelEventManager.Register(this);

            _hotelBuilder = TypeOfBuilder;

            // Build the hotel
            HotelAreas    = _hotelBuilder.BuildHotel(layout, settings);
            HotelMovables = _hotelBuilder.BuildMovable(settings, this);

            // Set calculation properties
            HotelWidth  = HotelAreas.OrderBy(X => X.Position.X).Last().Position.X;
            HotelHeight = HotelAreas.OrderBy(Y => Y.Position.Y).Last().Position.Y;

            _elevatorCart = (ElevatorCart)HotelMovables.Find(X => X is ElevatorCart);

            // Methods for final initialization
            Dijkstra.IntilazeDijkstra(this);
            HotelEventManager.Start();
        }
        /// <summary>
        /// Provide a generic file and an Settings model
        /// Through these parameters create a list of IAreas
        /// This method is also responsible for setting the neighbours
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="file">A file providing information to build an IArea list</param>
        /// <param name="settings">The Settings model used for the simulation</param>
        /// <returns></returns>
        public List <IArea> BuildHotel <T>(T file, SettingsModel settings)
        {
            #region Casting the file to a List<JsonModel>
            List <JsonModel> jsonModel;

            if (file is List <JsonModel> )
            {
                jsonModel = file as List <JsonModel>;
            }
            else
            {
                // the provided file is incorrect
                // The error handling is not fully implemented
                return(null);
            }
            #endregion

            #region Read out the json file and add rooms to the layout
            foreach (JsonModel i in jsonModel)
            {
                int classificationNum = 0;

                if (i.Classification != null)
                {
                    classificationNum = int.Parse(Regex.Match(i.Classification, @"\d+").Value);
                }

                IArea area = Factory.GetArea(i.AreaType);
                area.SetJsonValues(i.ID, i.Position, i.Capacity, i.Dimension, classificationNum);
                HotelAreas.Add(area);
            }

            HotelWidth  = HotelAreas.OrderBy(X => X.Position.X).Last().Position.X + 1;
            HotelHeight = HotelAreas.OrderBy(Y => Y.Position.Y).Last().Position.Y + 1;
            #endregion

            #region Set constant objects
            // Set Elevator and staircase
            for (int i = 1; i < HotelHeight + 1; i++)
            {
                IArea elevator  = Factory.GetArea("Elevator");
                IArea staircase = Factory.GetArea("Staircase");

                elevator.SetJsonValues(HotelAreas.Count() + 1, new Point(0, i), settings.ElevatorCapicity, new Size(1, 1), i);
                staircase.SetJsonValues(HotelAreas.Count() + 1, new Point(HotelWidth, i), 5, new Size(1, 1), 0);

                HotelAreas.Add(elevator);
                HotelAreas.Add(staircase);
            }

            // Set reception and lobby
            for (int i = 1; i < HotelWidth; i++)
            {
                if (i == 1)
                {
                    IArea reception = Factory.GetArea("Reception");

                    reception.SetJsonValues(HotelAreas.Count() + 1, new Point(1, HotelHeight), 5, new Size(1, 1), 1);

                    HotelAreas.Add(reception);
                }
                else
                {
                    IArea Lobby = Factory.GetArea("Lobby");

                    Lobby.SetJsonValues(HotelAreas.Count() + 1, new Point(i, HotelHeight), 5, new Size(1, 1), i);

                    HotelAreas.Add(Lobby);
                }
            }
            #endregion

            #region Settings infromation from the settings model and the neigbors
            foreach (IArea area in HotelAreas)
            {
                // Set Settings for cinema
                if (area is Cinema)
                {
                    ((Cinema)area).Duration = settings.CinemaDuration;
                }

                // Set Settings for fitness
                else if (area is Fitness)
                {
                    ((Fitness)area).Capacity = settings.FitnessCapicity;
                }

                // Set Settings for restaurant
                else if (area is Restaurant)
                {
                    ((Restaurant)area).Capacity = settings.RestaurantCapicity;
                    ((Restaurant)area).Duration = settings.RestaurantDuration;
                }

                else if (area is null)
                {
                    HotelAreas.Remove(area);
                }

                // All neighbours weights are 1 since it has been stated in one
                // of the meetings with the PO that they can jump over the other rooms
                // it would be nicer to add a hallway tile and walk that way but there
                // was no time to do this

                // Add right neighbour
                for (int i = 1; i < HotelWidth; i++)
                {
                    if (AddNeighbour(area, i, 0, 1))
                    {
                        break;
                    }
                }
                // Add left neighbour
                for (int i = 1; i < HotelWidth - 1; i++)
                {
                    if (AddNeighbour(area, -i, 0, 1))
                    {
                        break;
                    }
                }
                if (area.Position.X == 0 || area.Position.X == HotelWidth)
                {
                    // The elevator won't get any neighbours
                    if (area is Elevator)
                    {
                        continue;
                    }

                    // Add top neighbour
                    AddNeighbour(area, 0, 1, 1);
                    // Add bottom neighbour
                    AddNeighbour(area, 0, -1, 1);
                }
            }
            #endregion

            // Returning the hotel layout
            return(HotelAreas);
        }