Пример #1
0
 public void CleanupDelegates()
 {
     // Drivers_Changed -= OnDriversChanged;
     foreach (DriversChanged d in Drivers_Changed.GetInvocationList())
     {
         Drivers_Changed -= d;
     }
 }
Пример #2
0
        public virtual void OnTimedEvent(Object source, ElapsedEventArgs e)
        {
            timer.Stop();
            ///Console.WriteLine("DriversChanged at {0:HH:mm:ss.fff}", e.SignalTime);

            foreach (Section section in track.Sections)
            {
                SectionData data = GetSectionData(section);

                if (data.Left != null)
                {
                    int leftDistance = data.DistanceLeft + getTravelDistanceOfDriver((Driver)data.Left); //berekent te reizen afstand. works

                    if (leftDistance > 200)
                    {
                        for (int i = 0; i < _positions.Count; i++)
                        {
                            if (_positions.ElementAt(i).Value.Left == data.Left) //if the left contains the participant im looking for
                            {
                                var MovingDriver = _positions.ElementAt(i).Value.Left;

                                ShouldBeBroken(MovingDriver.Equipment); //chance that this will break the car

                                //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged

                                if (i == _positions.Count - 1)                                                          //is hij aan het "einde" van de track
                                {
                                    if (_positions.ElementAt(0).Value.Left == null && !MovingDriver.Equipment.IsBroken) //kan ik vooruit (naar het begin)
                                    {
                                        LapCompletedTest(MovingDriver);

                                        MovingDriver.LapTime += (stopwatch.Elapsed - MovingDriver.LapTime);

                                        if (MovingDriver.LapsCompleted == LapsAmount) //ronden zijn gereden, driver verdwijnt
                                        {
                                            ParticipantsOnTrack--;
                                            eindstand.AddLast((Driver)MovingDriver); //adds the finished driver to the eindstand list
                                        }
                                        else
                                        {
                                            _positions.ElementAt(0).Value.Left         = MovingDriver;
                                            _positions.ElementAt(0).Value.DistanceLeft = leftDistance - 200;
                                        }
                                        data.DistanceLeft = 0;
                                        data.Left         = null;
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                                    }
                                    else if (_positions.ElementAt(0).Value.Right == null && !MovingDriver.Equipment.IsBroken)    //kan ik van baan wisselen (naar het begin)
                                    {
                                        LapCompletedTest(MovingDriver);

                                        MovingDriver.LapTime += (stopwatch.Elapsed - MovingDriver.LapTime);

                                        if (MovingDriver.LapsCompleted == LapsAmount) //ronden zijn gereden, driver verdwijnt
                                        {
                                            ParticipantsOnTrack--;
                                            eindstand.AddLast((Driver)MovingDriver);
                                        }
                                        else
                                        {
                                            _positions.ElementAt(0).Value.Right         = MovingDriver;
                                            _positions.ElementAt(0).Value.DistanceRight = leftDistance - 200;
                                        }
                                        data.DistanceLeft = 0;
                                        data.Left         = null;
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                                    }
                                    else
                                    {
                                        data.DistanceLeft = 0;//ik kan niet inhalen en niet doorrijden of isbroken: distance wordt gereset
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                                    }
                                }
                                else                                                            //hij is niet aan het einde
                                {
                                    if (_positions.ElementAt(i + 1).Value.Left == null)         //kan ik vooruit
                                    {
                                        _positions.ElementAt(i + 1).Value.Left         = MovingDriver;
                                        _positions.ElementAt(i + 1).Value.DistanceLeft = leftDistance - 200;
                                        data.DistanceLeft = 0;
                                        data.Left         = null;
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track));
                                        break;
                                    }
                                    else if (_positions.ElementAt(i + 1).Value.Right == null)    //kan ik van baan wisselen
                                    {
                                        _positions.ElementAt(i + 1).Value.Right         = MovingDriver;
                                        _positions.ElementAt(i + 1).Value.DistanceRight = leftDistance - 200;
                                        data.DistanceLeft = 0;
                                        data.Left         = null;
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track));
                                        break;
                                    }


                                    else
                                    {
                                        data.DistanceLeft = 0; //ik kan niet inhalen en niet doorrijden : distance wordt gereset
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        data.DistanceLeft += leftDistance;
                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                    }
                }

                if (data.Right != null)
                {
                    int rightDistance = data.DistanceRight + getTravelDistanceOfDriver((Driver)data.Right); //berekent te reizen afstand. works

                    if (rightDistance > 200)
                    {
                        for (int i = 0; i < _positions.Count; i++)
                        {
                            if (_positions.ElementAt(i).Value.Right == data.Right) //if the left contains the participant im looking for
                            {
                                var MovingDriver = _positions.ElementAt(i).Value.Right;

                                ShouldBeBroken(MovingDriver.Equipment); //chance that this will break the car

                                //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged

                                if (i == _positions.Count - 1)                                                           //is hij aan het "einde" van de track
                                {
                                    if (_positions.ElementAt(0).Value.Right == null && !MovingDriver.Equipment.IsBroken) //kan ik vooruit (naar het begin)
                                    {
                                        LapCompletedTest(MovingDriver);

                                        MovingDriver.LapTime += (stopwatch.Elapsed - MovingDriver.LapTime);

                                        if (MovingDriver.LapsCompleted == LapsAmount) //ronden zijn gereden, driver verdwijnt
                                        {
                                            ParticipantsOnTrack--;
                                            eindstand.AddLast((Driver)MovingDriver);
                                        }
                                        else
                                        {
                                            _positions.ElementAt(0).Value.Right         = MovingDriver;
                                            _positions.ElementAt(0).Value.DistanceRight = rightDistance - 200;
                                        }
                                        data.DistanceRight = 0;
                                        data.Right         = null;
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                                    }
                                    else if (_positions.ElementAt(0).Value.Left == null && !MovingDriver.Equipment.IsBroken)    //kan ik van baan wisselen (naar het begin)
                                    {
                                        LapCompletedTest(MovingDriver);

                                        MovingDriver.LapTime += (stopwatch.Elapsed - MovingDriver.LapTime);

                                        if (MovingDriver.LapsCompleted == LapsAmount) //ronden zijn gereden, driver verdwijnt
                                        {
                                            ParticipantsOnTrack--;
                                            eindstand.AddLast((Driver)MovingDriver);
                                        }
                                        else
                                        {
                                            _positions.ElementAt(0).Value.Left         = MovingDriver;
                                            _positions.ElementAt(0).Value.DistanceLeft = rightDistance - 200;
                                        }
                                        data.DistanceRight = 0;
                                        data.Right         = null;
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                                    }
                                    else
                                    {
                                        data.DistanceRight = 0;//ik kan niet inhalen en niet doorrijden of isbroken: distance wordt gereset
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                                    }
                                }
                                else                                                             //hij is niet aan het einde
                                {
                                    if (_positions.ElementAt(i + 1).Value.Right == null)         //kan ik vooruit
                                    {
                                        _positions.ElementAt(i + 1).Value.Right         = MovingDriver;
                                        _positions.ElementAt(i + 1).Value.DistanceRight = rightDistance - 200;
                                        data.DistanceRight = 0;
                                        data.Right         = null;
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track));
                                        break;
                                    }
                                    else if (_positions.ElementAt(i + 1).Value.Left == null)    //kan ik van baan wisselen
                                    {
                                        _positions.ElementAt(i + 1).Value.Left         = MovingDriver;
                                        _positions.ElementAt(i + 1).Value.DistanceLeft = rightDistance - 200;
                                        data.DistanceRight = 0;
                                        data.Right         = null;
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track));
                                        break;
                                    }

                                    else
                                    {
                                        data.DistanceRight = 0; //ik kan niet inhalen en niet doorrijden : distance wordt gereset
                                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        data.DistanceRight += rightDistance;
                        //Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged
                    }
                }
            }
            //GiveData();
            Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track)); //activates OnDriversChanged

            timer.Start();
            if (RaceEnded_NoParticipantsLeft())
            {
                timer.Stop();
                stopwatch.Reset();
                GiveData();
                Drivers_Changed?.Invoke(this, new DriversChangedEventArgs(track));
                CleanupDelegates();
                Race_Finished?.Invoke(this, new RaceFinishedEventArgs()
                {
                    Participants = Participants
                });
            }
        }