Beispiel #1
0
        private void LoadCustomerIntoHisCarIfPossible(ChildEnterEngineEventArgs args)
        {
            var correspondingEntry = _carToPassengerMappings.FirstOrDefault(_ => _.Value.Contains(args.EnteringChild));

            if (correspondingEntry.Key == null)
            {
                // entering customer does not have his car parked here -> disallow entering
                args.EnteringChild.SetParent(args.OldParent, Reasons.NotAllowed);
            }
            else
            {
                // car found -> load customer into it.
                var car     = correspondingEntry.Key.GetBehavior <CarBehavior>();
                var success = car.TryLoad(args.EnteringChild);
                if (!success)
                {
                    // could not load into car -> set entity back
                    args.EnteringChild.SetParent(args.OldParent, Reasons.Processing.Unsuccessful);
                    return;
                }

                // if all passengers for the car are loaded, enable the car
                if (correspondingEntry.Value.All(p => car.Passengers.Contains(p)))
                {
                    // car is fully loaded -> enable it
                    car.Entity.IsEnabled = true;
                }
            }
        }
Beispiel #2
0
        private void OnChildEnter(ChildEnterEngineEventArgs args)
        {
            if (_queue.Count >= MaxQueueSize)
            {
                // no space
                args.EnteringChild.SetParent(args.OldParent, Reasons.NoSpace.InWaitingQueue);
                return;
            }

            _queue.Add(args.EnteringChild);
            _waitingEntityArrivedSubject.OnNext(args.EnteringChild);
        }
Beispiel #3
0
        private void OnChildEnter(ChildEnterEngineEventArgs args)
        {
            if (!args.EnteringChild.HasBehavior <CarBehavior>())
            {
                return;
            }

            var car = args.EnteringChild.GetBehavior <CarBehavior>();

            if (car.HasBeenParkedAtSomeTime)
            {
                Entity.Level.Destroy(args.EnteringChild);
            }
        }
Beispiel #4
0
 private void OnChildEnter(ChildEnterEngineEventArgs args)
 {
     if (args.EnteringChild.HasBehavior <CustomerBehavior>())
     {
         LoadCustomerIntoHisCarIfPossible(args);
     }
     else if (args.EnteringChild.HasBehavior <CarBehavior>())
     {
         ParkAndUnloadCarIfSlotsAreAvailable(args);
     }
     else
     {
         // unknown entity type -> disallow entering
         args.EnteringChild.SetParent(args.OldParent, Reasons.NotAllowed);
     }
 }
Beispiel #5
0
        private void ParkAndUnloadCarIfSlotsAreAvailable(ChildEnterEngineEventArgs args)
        {
            var car = args.EnteringChild.GetBehavior <CarBehavior>();

            // car enters
            if (FreeSlots == 0)
            {
                // disallow entering of car since there is no space, mark that it already tried this parkinglot
                car.TriedParkingLots.Add(Entity);
                args.EnteringChild.SetParent(args.OldParent, Reasons.NoSpace.InCarParkingLot);
                car.SetTargetToNextPointTowardsParkingLot(args.OldParent.GetImplementation <IGraphNode>());
                return;
            }

            // there is space -> unload passengers to IO node and increase used slots
            UsedSlots++;
            var passengers = new List <Entity>(car.Passengers);

            _carToPassengerMappings.Add(car.Entity, passengers);
            car.UnloadAllTo(Entity);
            car.Entity.IsEnabled = false;
        }
Beispiel #6
0
 private void TeleportEntityToUpperGraph(ChildEnterEngineEventArgs args)
 {
     args.EnteringChild.SetParent(UpperGraphNode.Entity, Reasons.Subgraph.Leaving);
 }
Beispiel #7
0
 private async void ProcessEnteringChild(ChildEnterEngineEventArgs args)
 {
     await SellTicketAndSetEntityToNextNode(args.EnteringChild);
 }