/// <summary> /// Constructs a route from its spec. /// </summary> /// <param name="schema">The schema object containing data about this route.</param> /// <param name="region">The region the route exists in.</param> /// <param name="entrance">The signal at which this route begins.</param> public Route(Schema.Route schema, Region region, ControlledSignal entrance) { Entrance = entrance; Exit = region.GetSignal(schema.Exit, entrance.SubArea); Divergence = schema.Divergence; Restricting = schema.Restricting; DivergenceDistanceStraightOnly = schema.DivergenceDistanceStraightOnly; { RouteElement[] elts = new RouteElement[schema.TCs.Count]; for (int i = 0; i != schema.TCs.Count; ++i) { elts[i] = new RouteElement(schema.TCs[i], region, entrance.SubArea); } Elements = Array.AsReadOnly(elts); } { RoutePointPosition[] elts = new RoutePointPosition[schema.Points.Count]; for (int i = 0; i != schema.Points.Count; ++i) { elts[i] = new RoutePointPosition(schema.Points[i], region, entrance.SubArea); } PointPositions = Array.AsReadOnly(elts); } { TrackCircuit[] tcs = new TrackCircuit[schema.FreeTCs.Count]; for (int i = 0; i != schema.FreeTCs.Count; ++i) { tcs[i] = region.GetTrackCircuit(schema.FreeTCs[i], entrance.SubArea); } FreeTrackCircuits = Array.AsReadOnly(tcs); } }
/// <summary> /// Checks whether this exemption applies. /// </summary> /// <returns><c>true</c> if this exemption applies, or <c>false</c> if not.</returns> public bool Check() { foreach (TrackCircuit i in ClearTCs) { if (i.Occupied || i.ReversedHandPoints) { return(false); } } foreach (RoutePointPosition i in PointPositions) { if ((i.Points.Reversed != i.Reverse) || !i.Points.Proved) { return(false); } } foreach (Signal i in SignalsOn) { if (i.Aspects.Off) { ControlledSignal cs = i as ControlledSignal; if ((cs == null) || !cs.ApproachLocked) { return(false); } } } return(true); }
/// <summary> /// Constructs a new sub-area. /// </summary> /// <param name="schema">Data about this sub-area.</param> /// <param name="id">The sub-area ID.</param> /// <param name="world">The communication interface to Run8.</param> public SubArea(Schema.SubArea schema, ushort id, World world) { ID = id; Name = schema.Name ?? string.Empty; { ushort maxID = 0; foreach (Schema.TrackCircuit i in schema.TrackCircuits) { maxID = Math.Max(maxID, i.ID); } TrackCircuit[] trackCircuits = new TrackCircuit[maxID + 1]; foreach (Schema.TrackCircuit i in schema.TrackCircuits) { Debug.Assert(trackCircuits[i.ID] == null); trackCircuits[i.ID] = new TrackCircuit(i, ID, i.ID); } TrackCircuits = Array.AsReadOnly(trackCircuits); } { Points[] points = new Points[schema.Points.Count]; for (ushort i = 0; i != schema.Points.Count; ++i) { points[i] = new Points(schema.Points[i], i, this, world); } PowerPoints = Array.AsReadOnly(points); } { ControlledSignal[] sigs = new ControlledSignal[schema.ControlledSignals.Count]; for (ushort i = 0; i != schema.ControlledSignals.Count; ++i) { sigs[i] = new ControlledSignal(schema.ControlledSignals[i], i, ID, world); } ControlledSignals = Array.AsReadOnly(sigs); } { AutomaticSignal[] sigs = new AutomaticSignal[schema.AutomaticSignals.Count]; for (ushort i = 0; i != schema.AutomaticSignals.Count; ++i) { sigs[i] = new AutomaticSignal(schema.AutomaticSignals[i], (short)(-i - 1), ID); } AutomaticSignals = Array.AsReadOnly(sigs); } Signals = new SignalsArray(this); }