@@ -68,6 +68,8 @@ public class Signals
68
68
private List<SignalWorldObject> SignalWorldList = new List<SignalWorldObject>();
69
69
private Dictionary<uint, SignalRefObject> SignalRefList;
70
70
private Dictionary<uint, SignalObject> SignalHeadList;
71
+ private List<SpeedPostWorldObject> SpeedPostWorldList = new List<SpeedPostWorldObject>();
72
+ private Dictionary<int, int> SpeedPostRefList = new Dictionary<int, int>();
71
73
public static SIGSCRfile scrfile;
72
74
public static CsSignalScripts CsSignalScripts;
73
75
public int ORTSSignalTypeCount { get; private set; }
@@ -467,6 +469,7 @@ private void BuildSignalWorld(Simulator simulator, SignalConfigurationFile sigcf
467
469
468
470
var Tokens = new List<TokenID>();
469
471
Tokens.Add(TokenID.Signal);
472
+ Tokens.Add(TokenID.Speedpost);
470
473
Tokens.Add(TokenID.Platform);
471
474
472
475
// loop through files, use only extention .w, skip w+1000000+1000000.w file
@@ -538,7 +541,19 @@ private void BuildSignalWorld(Simulator simulator, SignalConfigurationFile sigcf
538
541
}
539
542
}
540
543
}
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))
542
557
{
543
558
var thisWorldObj = worldObject as PlatformObj;
544
559
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
633
648
else if (trItem.ItemType == TrItem.trItemType.trSPEEDPOST)
634
649
{
635
650
SpeedPostItem Speedpost = (SpeedPostItem)trItem;
636
- if (Speedpost.IsLimit )
651
+ if (! Speedpost.IsMilePost )
637
652
{
638
653
noSignals++;
639
654
}
@@ -981,15 +996,14 @@ private void ScanSection(TrItem[] TrItems, TrackNode[] trackNodes, int index,
981
996
else if (TrItems[TDBRef].ItemType == TrItem.trItemType.trSPEEDPOST)
982
997
{
983
998
SpeedPostItem speedItem = (SpeedPostItem)TrItems[TDBRef];
984
- if (speedItem.IsLimit )
999
+ if (! speedItem.IsMilePost )
985
1000
{
986
1001
speedItem.SigObj = foundSignals;
987
1002
988
1003
lastSignal = AddSpeed(index, i, speedItem, TDBRef, tsectiondat, tdbfile, ORTSSignalTypeCount);
989
1004
speedItem.SigObj = lastSignal;
990
-
991
1005
}
992
- else if (speedItem.IsMilePost)
1006
+ else
993
1007
{
994
1008
speedItem.SigObj = foundMileposts;
995
1009
lastMilepost = AddMilepost(index, i, speedItem, TDBRef, tsectiondat, tdbfile);
@@ -1231,22 +1245,39 @@ private void AddWorldInfo()
1231
1245
{
1232
1246
if (signal != null)
1233
1247
{
1234
- foreach (SignalHead head in signal.SignalHeads )
1248
+ if ( signal.isSignal )
1235
1249
{
1250
+ foreach (SignalHead head in signal.SignalHeads)
1251
+ {
1236
1252
1237
- // get reference using TDB index from head
1253
+ // get reference using TDB index from head
1238
1254
1239
- uint TDBRef = Convert.ToUInt32(head.TDBIndex);
1240
- SignalRefObject thisRef;
1255
+ uint TDBRef = Convert.ToUInt32(head.TDBIndex);
1256
+ SignalRefObject thisRef;
1241
1257
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))
1243
1275
{
1244
- uint signalIndex = thisRef.SignalWorldIndex;
1245
- if (signal.WorldObject == null)
1276
+ if (signal.SpeedPostWorldObject == null)
1246
1277
{
1247
- signal.WorldObject = SignalWorldList[(int)signalIndex ];
1278
+ signal.SpeedPostWorldObject = SpeedPostWorldList[speedPostIndex ];
1248
1279
}
1249
- SignalRefList .Remove(TDBRef );
1280
+ SpeedPostRefList .Remove(head.TDBIndex );
1250
1281
}
1251
1282
}
1252
1283
}
@@ -8351,6 +8382,7 @@ public enum HoldState // signal is locked in hold
8351
8382
public static TrackNode[] trackNodes;
8352
8383
public static TrItem[] trItems;
8353
8384
public SignalWorldObject WorldObject; // Signal World Object information
8385
+ public SpeedPostWorldObject SpeedPostWorldObject; // Speed Post World Object information
8354
8386
8355
8387
public int trackNode; // Track node which contains this signal
8356
8388
public int trRefIndex; // Index to TrItemRef within Track Node
@@ -9205,7 +9237,7 @@ public MstsSignalAspect this_sig_lr(int fn_type, ref bool sigfound)
9205
9237
public ObjectSpeedInfo this_sig_speed(MstsSignalFunction fn_type)
9206
9238
{
9207
9239
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 );
9209
9241
9210
9242
foreach (SignalHead sigHead in SignalHeads)
9211
9243
{
@@ -9363,14 +9395,14 @@ public int SpeedPostType()
9363
9395
9364
9396
public ObjectSpeedInfo this_lim_speed(MstsSignalFunction fn_type)
9365
9397
{
9366
- var set_speed = new ObjectSpeedInfo(9E9f, 9E9f, false, false, 0);
9398
+ var set_speed = new ObjectSpeedInfo(9E9f, 9E9f, false, false, 0, false );
9367
9399
9368
9400
foreach (SignalHead sigHead in SignalHeads)
9369
9401
{
9370
9402
if (sigHead.sigFunction == fn_type)
9371
9403
{
9372
9404
ObjectSpeedInfo this_speed = sigHead.speed_info[(int)sigHead.state];
9373
- if (this_speed != null)
9405
+ if (this_speed != null && !this_speed.speed_isWarning )
9374
9406
{
9375
9407
if (this_speed.speed_pass > 0 && this_speed.speed_pass < set_speed.speed_pass)
9376
9408
{
@@ -12806,7 +12838,7 @@ public SignalHead(SignalObject sigOoject, int trItem, int TDBRef, SpeedPostItem
12806
12838
12807
12839
float passSpeed = speedItem.IsPassenger ? speedMpS : -1;
12808
12840
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 );
12810
12842
speed_info[(int)state] = speedinfo;
12811
12843
}
12812
12844
@@ -12837,7 +12869,7 @@ public void SetSignalType(TrItem[] TrItems, SignalConfigurationFile sigCFG)
12837
12869
foreach (SignalAspect thisAspect in signalType.Aspects)
12838
12870
{
12839
12871
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 );
12841
12873
}
12842
12874
12843
12875
// set normal subtype
@@ -13558,7 +13590,8 @@ public enum ObjectItemFindState
13558
13590
public int speed_flag;
13559
13591
public int speed_reset;
13560
13592
// 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;
13562
13595
public float actual_speed; // set active by TRAIN
13563
13596
13564
13597
public bool processed; // for AI trains, set active by TRAIN
@@ -13597,6 +13630,7 @@ public ObjectItemInfo(SignalObject thisObject, float distance)
13597
13630
speed_flag = speed_info.speed_flag;
13598
13631
speed_reset = speed_info.speed_reset;
13599
13632
speed_noSpeedReductionOrIsTempSpeedReduction = speed_info.speed_noSpeedReductionOrIsTempSpeedReduction;
13633
+ speed_isWarning = speed_info.speed_isWarning;
13600
13634
}
13601
13635
}
13602
13636
@@ -13622,19 +13656,21 @@ public class ObjectSpeedInfo
13622
13656
public int speed_flag;
13623
13657
public int speed_reset;
13624
13658
public int speed_noSpeedReductionOrIsTempSpeedReduction;
13659
+ public bool speed_isWarning;
13625
13660
13626
13661
//================================================================================================//
13627
13662
/// <summary>
13628
13663
/// Constructor
13629
13664
/// </summary>
13630
13665
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 )
13632
13667
{
13633
13668
speed_pass = pass;
13634
13669
speed_freight = freight;
13635
13670
speed_flag = asap ? 1 : 0;
13636
13671
speed_reset = reset ? 1 : 0;
13637
13672
speed_noSpeedReductionOrIsTempSpeedReduction = nospeedreductionOristempspeedreduction;
13673
+ speed_isWarning = isWarning;
13638
13674
}
13639
13675
}
13640
13676
0 commit comments