@@ -68,6 +68,8 @@ public class Signals
6868 private List<SignalWorldObject> SignalWorldList = new List<SignalWorldObject>();
6969 private Dictionary<uint, SignalRefObject> SignalRefList;
7070 private Dictionary<uint, SignalObject> SignalHeadList;
71+ private List<SpeedPostWorldObject> SpeedPostWorldList = new List<SpeedPostWorldObject>();
72+ private Dictionary<int, int> SpeedPostRefList = new Dictionary<int, int>();
7173 public static SIGSCRfile scrfile;
7274 public static CsSignalScripts CsSignalScripts;
7375 public int ORTSSignalTypeCount { get; private set; }
@@ -467,6 +469,7 @@ private void BuildSignalWorld(Simulator simulator, SignalConfigurationFile sigcf
467469
468470 var Tokens = new List<TokenID>();
469471 Tokens.Add(TokenID.Signal);
472+ Tokens.Add(TokenID.Speedpost);
470473 Tokens.Add(TokenID.Platform);
471474
472475 // loop through files, use only extention .w, skip w+1000000+1000000.w file
@@ -538,7 +541,19 @@ private void BuildSignalWorld(Simulator simulator, SignalConfigurationFile sigcf
538541 }
539542 }
540543 }
541- else if (worldObject.GetType() == typeof(PlatformObj))
544+ else if (worldObject is SpeedPostObj speedPostObj)
545+ {
546+ SpeedPostWorldList.Add(new SpeedPostWorldObject(speedPostObj));
547+ int thisSpeedPostId = SpeedPostWorldList.Count() - 1;
548+ foreach(TrItemId trItemId in speedPostObj.trItemIDList)
549+ {
550+ if (!SpeedPostRefList.ContainsKey(trItemId.dbID))
551+ {
552+ SpeedPostRefList.Add(trItemId.dbID, thisSpeedPostId);
553+ }
554+ }
555+ }
556+ else if (worldObject.GetType() == typeof(PlatformObj))
542557 {
543558 var thisWorldObj = worldObject as PlatformObj;
544559 if (!PlatformSidesList.ContainsKey(thisWorldObj.trItemIDList[0].dbID)) PlatformSidesList.Add(thisWorldObj.trItemIDList[0].dbID, thisWorldObj.PlatformData);
@@ -633,7 +648,7 @@ private void BuildSignalList(TrItem[] TrItems, TrackNode[] trackNodes, TrackSect
633648 else if (trItem.ItemType == TrItem.trItemType.trSPEEDPOST)
634649 {
635650 SpeedPostItem Speedpost = (SpeedPostItem)trItem;
636- if (Speedpost.IsLimit )
651+ if (! Speedpost.IsMilePost )
637652 {
638653 noSignals++;
639654 }
@@ -981,15 +996,14 @@ private void ScanSection(TrItem[] TrItems, TrackNode[] trackNodes, int index,
981996 else if (TrItems[TDBRef].ItemType == TrItem.trItemType.trSPEEDPOST)
982997 {
983998 SpeedPostItem speedItem = (SpeedPostItem)TrItems[TDBRef];
984- if (speedItem.IsLimit )
999+ if (! speedItem.IsMilePost )
9851000 {
9861001 speedItem.SigObj = foundSignals;
9871002
9881003 lastSignal = AddSpeed(index, i, speedItem, TDBRef, tsectiondat, tdbfile, ORTSSignalTypeCount);
9891004 speedItem.SigObj = lastSignal;
990-
9911005 }
992- else if (speedItem.IsMilePost)
1006+ else
9931007 {
9941008 speedItem.SigObj = foundMileposts;
9951009 lastMilepost = AddMilepost(index, i, speedItem, TDBRef, tsectiondat, tdbfile);
@@ -1231,22 +1245,39 @@ private void AddWorldInfo()
12311245 {
12321246 if (signal != null)
12331247 {
1234- foreach (SignalHead head in signal.SignalHeads )
1248+ if ( signal.isSignal )
12351249 {
1250+ foreach (SignalHead head in signal.SignalHeads)
1251+ {
12361252
1237- // get reference using TDB index from head
1253+ // get reference using TDB index from head
12381254
1239- uint TDBRef = Convert.ToUInt32(head.TDBIndex);
1240- SignalRefObject thisRef;
1255+ uint TDBRef = Convert.ToUInt32(head.TDBIndex);
1256+ SignalRefObject thisRef;
12411257
1242- if (SignalRefList.TryGetValue(TDBRef, out thisRef))
1258+ if (SignalRefList.TryGetValue(TDBRef, out thisRef))
1259+ {
1260+ uint signalIndex = thisRef.SignalWorldIndex;
1261+ if (signal.WorldObject == null)
1262+ {
1263+ signal.WorldObject = SignalWorldList[(int)signalIndex];
1264+ }
1265+ SignalRefList.Remove(TDBRef);
1266+ }
1267+ }
1268+ }
1269+ else
1270+ {
1271+ SignalHead head = signal.SignalHeads[0];
1272+ int speedPostIndex;
1273+
1274+ if (SpeedPostRefList.TryGetValue(head.TDBIndex, out speedPostIndex))
12431275 {
1244- uint signalIndex = thisRef.SignalWorldIndex;
1245- if (signal.WorldObject == null)
1276+ if (signal.SpeedPostWorldObject == null)
12461277 {
1247- signal.WorldObject = SignalWorldList[(int)signalIndex ];
1278+ signal.SpeedPostWorldObject = SpeedPostWorldList[speedPostIndex ];
12481279 }
1249- SignalRefList .Remove(TDBRef );
1280+ SpeedPostRefList .Remove(head.TDBIndex );
12501281 }
12511282 }
12521283 }
@@ -8351,6 +8382,7 @@ public enum HoldState // signal is locked in hold
83518382 public static TrackNode[] trackNodes;
83528383 public static TrItem[] trItems;
83538384 public SignalWorldObject WorldObject; // Signal World Object information
8385+ public SpeedPostWorldObject SpeedPostWorldObject; // Speed Post World Object information
83548386
83558387 public int trackNode; // Track node which contains this signal
83568388 public int trRefIndex; // Index to TrItemRef within Track Node
@@ -9205,7 +9237,7 @@ public MstsSignalAspect this_sig_lr(int fn_type, ref bool sigfound)
92059237 public ObjectSpeedInfo this_sig_speed(MstsSignalFunction fn_type)
92069238 {
92079239 var sigAsp = MstsSignalAspect.STOP;
9208- var set_speed = new ObjectSpeedInfo(-1, -1, false, false, 0);
9240+ var set_speed = new ObjectSpeedInfo(-1, -1, false, false, 0, false );
92099241
92109242 foreach (SignalHead sigHead in SignalHeads)
92119243 {
@@ -9363,14 +9395,14 @@ public int SpeedPostType()
93639395
93649396 public ObjectSpeedInfo this_lim_speed(MstsSignalFunction fn_type)
93659397 {
9366- var set_speed = new ObjectSpeedInfo(9E9f, 9E9f, false, false, 0);
9398+ var set_speed = new ObjectSpeedInfo(9E9f, 9E9f, false, false, 0, false );
93679399
93689400 foreach (SignalHead sigHead in SignalHeads)
93699401 {
93709402 if (sigHead.sigFunction == fn_type)
93719403 {
93729404 ObjectSpeedInfo this_speed = sigHead.speed_info[(int)sigHead.state];
9373- if (this_speed != null)
9405+ if (this_speed != null && !this_speed.speed_isWarning )
93749406 {
93759407 if (this_speed.speed_pass > 0 && this_speed.speed_pass < set_speed.speed_pass)
93769408 {
@@ -12806,7 +12838,7 @@ public SignalHead(SignalObject sigOoject, int trItem, int TDBRef, SpeedPostItem
1280612838
1280712839 float passSpeed = speedItem.IsPassenger ? speedMpS : -1;
1280812840 float freightSpeed = speedItem.IsFreight ? speedMpS : -1;
12809- ObjectSpeedInfo speedinfo = new ObjectSpeedInfo(passSpeed, freightSpeed, false, false, speedItem is TempSpeedPostItem? (speedMpS == 999f? 2 : 1) : 0);
12841+ ObjectSpeedInfo speedinfo = new ObjectSpeedInfo(passSpeed, freightSpeed, false, false, speedItem is TempSpeedPostItem? (speedMpS == 999f? 2 : 1) : 0, speedItem.IsWarning );
1281012842 speed_info[(int)state] = speedinfo;
1281112843 }
1281212844
@@ -12837,7 +12869,7 @@ public void SetSignalType(TrItem[] TrItems, SignalConfigurationFile sigCFG)
1283712869 foreach (SignalAspect thisAspect in signalType.Aspects)
1283812870 {
1283912871 int arrindex = (int)thisAspect.Aspect;
12840- speed_info[arrindex] = new ObjectSpeedInfo(thisAspect.SpeedMpS, thisAspect.SpeedMpS, thisAspect.Asap, thisAspect.Reset, thisAspect.NoSpeedReduction? 1 : 0);
12872+ speed_info[arrindex] = new ObjectSpeedInfo(thisAspect.SpeedMpS, thisAspect.SpeedMpS, thisAspect.Asap, thisAspect.Reset, thisAspect.NoSpeedReduction? 1 : 0, false );
1284112873 }
1284212874
1284312875 // set normal subtype
@@ -13558,7 +13590,8 @@ public enum ObjectItemFindState
1355813590 public int speed_flag;
1355913591 public int speed_reset;
1356013592 // for signals: if = 1 no speed reduction; for speedposts: if = 0 standard; = 1 start of temp speedreduction post; = 2 end of temp speed reduction post
13561- public int speed_noSpeedReductionOrIsTempSpeedReduction;
13593+ public int speed_noSpeedReductionOrIsTempSpeedReduction;
13594+ public bool speed_isWarning;
1356213595 public float actual_speed; // set active by TRAIN
1356313596
1356413597 public bool processed; // for AI trains, set active by TRAIN
@@ -13597,6 +13630,7 @@ public ObjectItemInfo(SignalObject thisObject, float distance)
1359713630 speed_flag = speed_info.speed_flag;
1359813631 speed_reset = speed_info.speed_reset;
1359913632 speed_noSpeedReductionOrIsTempSpeedReduction = speed_info.speed_noSpeedReductionOrIsTempSpeedReduction;
13633+ speed_isWarning = speed_info.speed_isWarning;
1360013634 }
1360113635 }
1360213636
@@ -13622,19 +13656,21 @@ public class ObjectSpeedInfo
1362213656 public int speed_flag;
1362313657 public int speed_reset;
1362413658 public int speed_noSpeedReductionOrIsTempSpeedReduction;
13659+ public bool speed_isWarning;
1362513660
1362613661 //================================================================================================//
1362713662 /// <summary>
1362813663 /// Constructor
1362913664 /// </summary>
1363013665
13631- public ObjectSpeedInfo(float pass, float freight, bool asap, bool reset, int nospeedreductionOristempspeedreduction)
13666+ public ObjectSpeedInfo(float pass, float freight, bool asap, bool reset, int nospeedreductionOristempspeedreduction, bool isWarning )
1363213667 {
1363313668 speed_pass = pass;
1363413669 speed_freight = freight;
1363513670 speed_flag = asap ? 1 : 0;
1363613671 speed_reset = reset ? 1 : 0;
1363713672 speed_noSpeedReductionOrIsTempSpeedReduction = nospeedreductionOristempspeedreduction;
13673+ speed_isWarning = isWarning;
1363813674 }
1363913675 }
1364013676
0 commit comments