Exemple #1
0
        // Restore
        public void RestorePresentPosition(BinaryReader inf, Train train)
        {
            if (null == train)
            {
                throw new ArgumentNullException(nameof(train));
            }
            if (null == inf)
            {
                throw new ArgumentNullException(nameof(inf));
            }

            TrackNode      tn        = train.FrontTDBTraveller.TN;
            float          offset    = train.FrontTDBTraveller.TrackNodeOffset;
            TrackDirection direction = (TrackDirection)train.FrontTDBTraveller.Direction;

            TrackCircuitPosition tempPosition = new TrackCircuitPosition();

            tempPosition.SetPosition(tn.TrackCircuitCrossReferences, offset, direction);

            TrackCircuitSectionIndex = inf.ReadInt32();
            Direction         = (TrackDirection)inf.ReadInt32();
            Offset            = inf.ReadSingle();
            RouteListIndex    = inf.ReadInt32();
            TrackNode         = inf.ReadInt32();
            DistanceTravelled = inf.ReadSingle();

            float offsetDif = Math.Abs(Offset - tempPosition.Offset);

            if (TrackCircuitSectionIndex != tempPosition.TrackCircuitSectionIndex ||
                (TrackCircuitSectionIndex == tempPosition.TrackCircuitSectionIndex && offsetDif > 5.0f))
            {
                Trace.TraceWarning("Train {0} restored at different present position : was {1} - {3}, is {2} - {4}",
                                   train.Number, TrackCircuitSectionIndex, tempPosition.TrackCircuitSectionIndex,
                                   Offset, tempPosition.Offset);
            }
        }
Exemple #2
0
 private static int GetDirectionRotation(TrackDirection direction) => direction switch
 {
        private Sprite GetTrackSprite(Node previousNode, Node node, Node nextNode)
        {
            TrackDirection previousTrackDir = TrackDirection.None;

            if (previousNode != null)
            {
                previousTrackDir = GetRelativeTrackDirection(node, previousNode);
            }

            TrackDirection nextTrackDir = TrackDirection.None;

            if (nextNode != null)
            {
                nextTrackDir = GetRelativeTrackDirection(node, nextNode);
            }

            if (previousTrackDir == TrackDirection.None)
            {
                if (nextTrackDir == TrackDirection.Up)
                {
                    return(verticalTrack [0]);
                }
                else if (nextTrackDir == TrackDirection.Down)
                {
                    return(verticalTrack [2]);
                }
                else if (nextTrackDir == TrackDirection.Left)
                {
                    return(horizontalTrack [2]);
                }
                else
                {
                    return(horizontalTrack [0]);
                }
            }
            else if (nextTrackDir == TrackDirection.None)
            {
                if (previousTrackDir == TrackDirection.Up)
                {
                    return(verticalTrack [0]);
                }
                else if (previousTrackDir == TrackDirection.Down)
                {
                    return(verticalTrack [2]);
                }
                else if (previousTrackDir == TrackDirection.Left)
                {
                    return(horizontalTrack [2]);
                }
                else
                {
                    return(horizontalTrack [0]);
                }
            }

            if ((previousTrackDir == TrackDirection.Left && nextTrackDir == TrackDirection.Right) ||
                (previousTrackDir == TrackDirection.Right && nextTrackDir == TrackDirection.Left))
            {
                return(horizontalTrack[1]);
            }
            else if ((previousTrackDir == TrackDirection.Up && nextTrackDir == TrackDirection.Down) ||
                     (previousTrackDir == TrackDirection.Down && nextTrackDir == TrackDirection.Up))
            {
                return(verticalTrack[1]);
            }


            if (previousTrackDir == TrackDirection.Left && nextTrackDir == TrackDirection.Down)
            {
                return(trackCorners [3]);
            }
            else if (previousTrackDir == TrackDirection.Left && nextTrackDir == TrackDirection.Up)
            {
                return(trackCorners [1]);
            }
            else if (previousTrackDir == TrackDirection.Right && nextTrackDir == TrackDirection.Down)
            {
                return(trackCorners [2]);
            }
            else if (previousTrackDir == TrackDirection.Right && nextTrackDir == TrackDirection.Up)
            {
                return(trackCorners [0]);
            }

            if (previousTrackDir == TrackDirection.Down && nextTrackDir == TrackDirection.Left)
            {
                return(trackCorners [3]);
            }
            else if (previousTrackDir == TrackDirection.Down && nextTrackDir == TrackDirection.Right)
            {
                return(trackCorners [2]);
            }
            else if (previousTrackDir == TrackDirection.Up && nextTrackDir == TrackDirection.Left)
            {
                return(trackCorners [1]);
            }
            else if (previousTrackDir == TrackDirection.Up && nextTrackDir == TrackDirection.Right)
            {
                return(trackCorners [0]);
            }


            return(horizontalTrack[1]);
        }
Exemple #4
0
 public static Track Create(string description, TrackDirection direction, DateTime?trackDateOn)
 {
     return(new Track(description, direction.ToFriendlyString(), trackDateOn));
 }
Exemple #5
0
        /// <summary>
        /// Set the position based on the trackcircuit section.
        /// </summary>
        /// <param name="trackCircuitCrossReferecenList">List of cross-references from tracknode to trackcircuitsection</param>
        /// <param name="offset">Offset along the tracknode</param>
        /// <param name="direction">direction along the tracknode (1 is forward)</param>
        internal void SetPosition(TrackCircuitCrossReferences trackCircuitCrossReferecenList, float offset, TrackDirection direction)
        {
            if (null == trackCircuitCrossReferecenList)
            {
                throw new ArgumentNullException(nameof(trackCircuitCrossReferecenList));
            }

            int crossRefIndex = trackCircuitCrossReferecenList.GetCrossReferenceIndex(offset, (int)direction);

            if (crossRefIndex < 0)
            {
                return;
            }

            TrackCircuitSectionCrossReference crossReference = trackCircuitCrossReferecenList[crossRefIndex];

            TrackCircuitSectionIndex = crossReference.Index;
            Direction = direction;
            Offset    = offset - crossReference.OffsetLength[(int)direction];
        }
Exemple #6
0
 public Track(int x, int y, TrackDirection direction)
 {
     this.Position       = new Point(x, y);
     this.TrackDirection = direction;
 }
 public static TrackDefinition Create(string description, string tag, CaptureRule captureRule, TrackDirection direction)
 {
     return(new TrackDefinition(description, tag, captureRule.ToFriendlyString(), direction.ToFriendlyString()));
 }
        // Check on deadlock
        private protected void CheckDeadlock(TrackCircuitPartialPathRoute route, int number)
        {
            // clear existing deadlock info
            ClearDeadlocks();

            // build new deadlock info
            foreach (Train otherTrain in simulator.Trains)
            {
                // check if not AI_Static
                if (Simulator.Instance.SignalEnvironment.UseLocationPassingPaths && otherTrain.GetAiMovementState() == AiMovementState.Static)
                {
                    continue;
                }

                if (otherTrain.Number != number && otherTrain.TrainType != TrainType.Static)
                {
                    TrackCircuitPartialPathRoute  otherRoute     = otherTrain.ValidRoute[0];
                    ILookup <int, TrackDirection> otherRouteDict = otherRoute.ConvertRoute();

                    for (int i = 0; i < route.Count; i++)
                    {
                        TrackCircuitRouteElement routeElement     = route[i];
                        TrackCircuitSection      section          = routeElement.TrackCircuitSection;
                        TrackDirection           sectionDirection = routeElement.Direction;

                        if (section.CircuitType != TrackCircuitType.Crossover)
                        {
                            if (otherRouteDict.Contains(section.Index))
                            {
                                TrackDirection otherTrainDirection = otherRouteDict[section.Index].First();
                                //<CSComment> Right part of OR clause refers to initial placement with trains back-to-back and running away one from the other</CSComment>
                                if (otherTrainDirection == sectionDirection ||
                                    (PresentPosition[Direction.Backward].TrackCircuitSectionIndex == otherTrain.PresentPosition[Direction.Backward].TrackCircuitSectionIndex && section.Index == PresentPosition[Direction.Backward].TrackCircuitSectionIndex &&
                                     PresentPosition[Direction.Backward].Offset + otherTrain.PresentPosition[Direction.Backward].Offset - 1 > section.Length))
                                {
                                    i = EndCommonSection(i, route, otherRoute);
                                }
                                else
                                {
                                    if (Simulator.Instance.SignalEnvironment.UseLocationPassingPaths) //new style location based logic
                                    {
                                        if (CheckRealDeadlockLocationBased(route, otherRoute, ref i))
                                        {
                                            int[] endDeadlock = SetDeadlockLocationBased(i, route, otherRoute, otherTrain);
                                            // use end of alternative path if set
                                            i = endDeadlock[1] > 0 ? --endDeadlock[1] : endDeadlock[0];
                                        }
                                    }
                                    else //old style path based logic
                                    {
                                        int[] endDeadlock = SetDeadlockPathBased(i, route, otherRoute, otherTrain);
                                        // use end of alternative path if set - if so, compensate for iElement++
                                        i = endDeadlock[1] > 0 ? --endDeadlock[1] : endDeadlock[0];
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #9
0
 public TrackModel(TrackEnum trackType, TrackDirection trackDirection)
 {
     TrackType      = trackType;
     TrackDirection = trackDirection;
 }
 public static float TrackRotationAngle(this TrackDirection direction) => direction switch
 {
 public static bool IsThreeWay(this TrackDirection direction) => direction == TrackDirection.RightUpDown ||
 direction == TrackDirection.LeftRightDown ||
 direction == TrackDirection.LeftUpDown ||
 direction == TrackDirection.LeftRightUp;
        public void GetConnectedNeighbors(TrackDirection centerDir, TrackDirection leftDir, TrackDirection upDir, TrackDirection rightDir, TrackDirection downDir, bool left, bool up, bool right, bool down)
        {
            // The real layout evaluates the best direction, so we can't use it. We just want storage
            var layout = new TestLayout();

            layout.AddTrack(5, 5, centerDir);

            layout.AddTrack(4, 5, leftDir);
            layout.AddTrack(5, 4, upDir);
            layout.AddTrack(6, 5, rightDir);
            layout.AddTrack(5, 6, downDir);

            var track     = layout.GetTrackAt(5, 5);
            var neighbors = track.GetConnectedNeighbors();

            Assert.Equal(left, neighbors.Left != null);
            Assert.Equal(up, neighbors.Up != null);
            Assert.Equal(right, neighbors.Right != null);
            Assert.Equal(down, neighbors.Down != null);
        }