@@ -403,11 +403,11 @@ public class MSTSSteamLocomotive : MSTSLocomotive
403403 float FuelDensityKGpM3 = 864.5f; // Anthracite Coal : 50 - 58 (lb/ft3), 800 - 929 (kg/m3)
404404 float DamperFactorManual = 1.0f; // factor to control draft through fire when locomotive is running in Manual mode
405405 public float WaterLBpUKG = 10.021f; // lbs of water in 1 gal (uk)
406- public float MaxTenderCoalMassKG = 1; // Maximum read from Eng File - - this value must be non-zero, if not defined in ENG file, can cause NaN errors
407- public float TenderCoalMassKG // Decreased by firing and increased by refilling
406+ public float MaxTenderFuelMassKG = 1; // Maximum read from Eng File - - this value must be non-zero, if not defined in ENG file, can cause NaN errors
407+ public float TenderFuelMassKG // Decreased by firing and increased by refilling
408408 {
409- get { return FuelController.CurrentValue * MaxTenderCoalMassKG ; }
410- set { FuelController.CurrentValue = value / MaxTenderCoalMassKG ; }
409+ get { return FuelController.CurrentValue * MaxTenderFuelMassKG ; }
410+ set { FuelController.CurrentValue = value / MaxTenderFuelMassKG ; }
411411 }
412412
413413 float MaxTenderOilMassL;
@@ -856,7 +856,7 @@ public void RefillTenderWithWater()
856856 /// </summary>
857857 public void InitializeTenderWithCoal()
858858 {
859- FuelController.CurrentValue = TenderCoalMassKG / MaxTenderCoalMassKG ;
859+ FuelController.CurrentValue = TenderFuelMassKG / MaxTenderFuelMassKG ;
860860 }
861861
862862 /// <summary>
@@ -934,7 +934,7 @@ public override void Parse(string lowercasetoken, STFReader stf)
934934 case "engine(vacuumbrakessmallejectorusagerate": EjectorSmallSteamConsumptionLbpS = pS.FrompH(stf.ReadFloatBlock(STFReader.UNITS.MassRateDefaultLBpH, null)); break;
935935 case "engine(ortssuperheatcutoffpressurefactor": SuperheatCutoffPressureFactor = stf.ReadFloatBlock(STFReader.UNITS.None, null); break;
936936 case "engine(shovelcoalmass": ShovelMassKG = stf.ReadFloatBlock(STFReader.UNITS.Mass, null); break;
937- case "engine(maxtendercoalmass": MaxTenderCoalMassKG = stf.ReadFloatBlock(STFReader.UNITS.Mass, null); break;
937+ case "engine(maxtendercoalmass": MaxTenderFuelMassKG = stf.ReadFloatBlock(STFReader.UNITS.Mass, null); break;
938938 case "engine(ortsmaxtenderfueloilvolume": MaxTenderOilMassL = stf.ReadFloatBlock(STFReader.UNITS.Volume, null); break;
939939 case "engine(maxtenderwatermass": MaxLocoTenderWaterMassKG = stf.ReadFloatBlock(STFReader.UNITS.Mass, null); break;
940940 case "engine(steamfiremanmaxpossiblefiringrate": MaxFiringRateKGpS = stf.ReadFloatBlock(STFReader.UNITS.MassRateDefaultLBpH, null) / 2.2046f / 3600; break;
@@ -1083,7 +1083,7 @@ public override void Copy(MSTSWagon copy)
10831083 ShovelMassKG = locoCopy.ShovelMassKG;
10841084 GearedTractiveEffortFactor = locoCopy.GearedTractiveEffortFactor;
10851085 TractiveEffortFactor = locoCopy.TractiveEffortFactor;
1086- MaxTenderCoalMassKG = locoCopy.MaxTenderCoalMassKG ;
1086+ MaxTenderFuelMassKG = locoCopy.MaxTenderFuelMassKG ;
10871087 MaxLocoTenderWaterMassKG = locoCopy.MaxLocoTenderWaterMassKG;
10881088 MaxFiringRateKGpS = locoCopy.MaxFiringRateKGpS;
10891089 Stoker = locoCopy.Stoker;
@@ -1143,7 +1143,7 @@ public override void Save(BinaryWriter outf)
11431143 outf.Write(PreviousBoilerHeatOutBTUpS);
11441144 outf.Write(PreviousBoilerHeatSmoothedBTU);
11451145 outf.Write(BurnRateRawKGpS);
1146- outf.Write(TenderCoalMassKG );
1146+ outf.Write(TenderFuelMassKG );
11471147 outf.Write(MaxTotalCombinedWaterVolumeUKG);
11481148 outf.Write(CombinedTenderWaterVolumeUKG);
11491149 outf.Write(CumulativeWaterConsumptionLbs);
@@ -1208,7 +1208,7 @@ public override void Restore(BinaryReader inf)
12081208 PreviousBoilerHeatOutBTUpS = inf.ReadSingle();
12091209 PreviousBoilerHeatSmoothedBTU = inf.ReadSingle();
12101210 BurnRateRawKGpS = inf.ReadSingle();
1211- TenderCoalMassKG = inf.ReadSingle();
1211+ TenderFuelMassKG = inf.ReadSingle();
12121212 MaxTotalCombinedWaterVolumeUKG = inf.ReadSingle();
12131213 CombinedTenderWaterVolumeUKG = inf.ReadSingle();
12141214 CumulativeWaterConsumptionLbs = inf.ReadSingle();
@@ -1350,7 +1350,7 @@ public override void Initialize()
13501350 // Set Oil mass - if an oil locomotive
13511351 if (SteamLocomotiveFuelType == SteamLocomotiveFuelTypes.Oil && MaxTenderOilMassL != 0)
13521352 {
1353- MaxTenderCoalMassKG = MaxTenderOilMassL * OilSpecificGravity;
1353+ MaxTenderFuelMassKG = MaxTenderOilMassL * OilSpecificGravity;
13541354 }
13551355
13561356 // Oil burning locomotives will always have mechanical stokers
@@ -2327,7 +2327,7 @@ public override void Initialize()
23272327
23282328 Trace.TraceInformation("**************** Fire ****************");
23292329 Trace.TraceInformation("Grate - Area {0:N1} sq ft, Limit {1:N1} lb/sq ft", Me2.ToFt2(GrateAreaM2), GrateLimitLBpFt2);
2330- Trace.TraceInformation("Fuel - Calorific {0} btu/lb, Max Firing Rate {1} lbs/h Max Coal Load {2} lbs", KJpKg.ToBTUpLb(FuelCalorificKJpKG), Kg.ToLb(pS.TopH(MaxFiringRateKGpS)), Kg.ToLb(MaxTenderCoalMassKG ));
2330+ Trace.TraceInformation("Fuel - Calorific {0} btu/lb, Max Firing Rate {1} lbs/h Max Coal Load {2} lbs", KJpKg.ToBTUpLb(FuelCalorificKJpKG), Kg.ToLb(pS.TopH(MaxFiringRateKGpS)), Kg.ToLb(MaxTenderFuelMassKG ));
23312331
23322332 Trace.TraceInformation("========================================================================================================================================================");
23332333
@@ -3741,23 +3741,23 @@ private void UpdateTender(float elapsedClockSeconds)
37413741
37423742 if (HasTenderCoupled) // If a tender is coupled then coal is available
37433743 {
3744- TenderCoalMassKG -= elapsedClockSeconds * pS.FrompH(Kg.FromLb(NewBurnRateSteamToFuelLbspH[pS.TopH(TempCylinderSteamUsageLbpS)])); // Current Tender coal mass determined by burn rate.
3745- TenderCoalMassKG = MathHelper.Clamp(TenderCoalMassKG , 0, MaxTenderCoalMassKG ); // Clamp value so that it doesn't go out of bounds
3744+ TenderFuelMassKG -= elapsedClockSeconds * pS.FrompH(Kg.FromLb(NewBurnRateSteamToFuelLbspH[pS.TopH(TempCylinderSteamUsageLbpS)])); // Current Tender coal mass determined by burn rate.
3745+ TenderFuelMassKG = MathHelper.Clamp(TenderFuelMassKG , 0, MaxTenderFuelMassKG ); // Clamp value so that it doesn't go out of bounds
37463746 }
37473747 else // if no tender coupled then check whether a tender is required
37483748 {
37493749 if (IsTenderRequired == 1.0) // Tender is required
37503750 {
3751- TenderCoalMassKG = 0.0f; // Set tender coal to zero (none available)
3751+ TenderFuelMassKG = 0.0f; // Set tender coal to zero (none available)
37523752 }
37533753 else // Tender is not required (ie tank locomotive) - therefore coal will be carried on the locomotive
37543754 {
3755- TenderCoalMassKG -= elapsedClockSeconds * pS.FrompH(Kg.FromLb(NewBurnRateSteamToFuelLbspH[pS.TopH(TempCylinderSteamUsageLbpS)])); // Current Tender coal mass determined by burn rate.
3756- TenderCoalMassKG = MathHelper.Clamp(TenderCoalMassKG , 0, MaxTenderCoalMassKG ); // Clamp value so that it doesn't go out of bounds
3755+ TenderFuelMassKG -= elapsedClockSeconds * pS.FrompH(Kg.FromLb(NewBurnRateSteamToFuelLbspH[pS.TopH(TempCylinderSteamUsageLbpS)])); // Current Tender coal mass determined by burn rate.
3756+ TenderFuelMassKG = MathHelper.Clamp(TenderFuelMassKG , 0, MaxTenderFuelMassKG ); // Clamp value so that it doesn't go out of bounds
37573757 }
37583758 }
37593759
3760- if (TenderCoalMassKG < 1.0)
3760+ if (TenderFuelMassKG < 1.0)
37613761 {
37623762 if (!CoalIsExhausted)
37633763 {
@@ -7758,9 +7758,9 @@ public override float GetDataOf(CabViewControl cvc)
77587758 }
77597759 case CABViewControlTypes.FUEL_GAUGE:
77607760 if (cvc.Units == CABViewControlUnits.LBS)
7761- data = Kg.ToLb(TenderCoalMassKG );
7761+ data = Kg.ToLb(TenderFuelMassKG );
77627762 else
7763- data = TenderCoalMassKG ;
7763+ data = TenderFuelMassKG ;
77647764 break;
77657765 default:
77667766 data = base.GetDataOf(cvc);
@@ -7783,7 +7783,7 @@ public override string GetStatus()
77837783 boilerPressureSafety = boilerPressurePercent <= 0.25 ? "!!!" : boilerPressurePercent <= 0.5 ? "???" : "";
77847784 }
77857785 var boilerWaterSafety = WaterFraction < WaterMinLevel || WaterFraction > WaterMaxLevel ? "!!!" : WaterFraction < WaterMinLevelSafe || WaterFraction > WaterMaxLevelSafe ? "???" : "";
7786- var coalPercent = TenderCoalMassKG / MaxTenderCoalMassKG ;
7786+ var coalPercent = TenderFuelMassKG / MaxTenderFuelMassKG ;
77877787 var waterPercent = CombinedTenderWaterVolumeUKG / MaxTotalCombinedWaterVolumeUKG;
77887788 var fuelSafety = CoalIsExhausted || WaterIsExhausted ? "!!!" : coalPercent <= 0.105 || waterPercent <= 0.105 ? "???" : "";
77897789 var steamusagesafety = PreviousTotalSteamUsageLBpS > EvaporationLBpS ? "!!!" : PreviousTotalSteamUsageLBpS > EvaporationLBpS * 0.95f ? "???" : "";
@@ -8361,8 +8361,8 @@ public override string GetDebugStatus()
83618361 status.AppendFormat("{0}\t{1}\t{2}\t{3:N0}%\t{4}\t{5}\t\t{6:N0}%\t{7}\t{8}\t\t{9}\t{10}\t\t{11}\t{12:N0}\t{13}\t{14:N0}\n",
83628362 Simulator.Catalog.GetString("Tender:"),
83638363 Simulator.Catalog.GetString("Coal"),
8364- FormatStrings.FormatMass(TenderCoalMassKG , IsMetric),
8365- TenderCoalMassKG / MaxTenderCoalMassKG * 100,
8364+ FormatStrings.FormatMass(TenderFuelMassKG , IsMetric),
8365+ TenderFuelMassKG / MaxTenderFuelMassKG * 100,
83668366 Simulator.Catalog.GetString("Water(C)"),
83678367 FormatStrings.FormatFuelVolume(L.FromGUK(CombinedTenderWaterVolumeUKG), IsMetric, IsUK),
83688368 CombinedTenderWaterVolumeUKG / MaxTotalCombinedWaterVolumeUKG * 100,
@@ -8383,8 +8383,8 @@ public override string GetDebugStatus()
83838383 status.AppendFormat("{0}\t{1}\t{2:N0}\t\t{3:N0}%\t{4}\t{5}\t\t{6:N0}%\t{7}\t{8:N0}\t{9}\t\t{10:N0}\n",
83848384 Simulator.Catalog.GetString("Tender:"),
83858385 Simulator.Catalog.GetString("Oil"),
8386- FormatStrings.FormatFuelVolume(L.FromGUK(OilSpecificGravity * (Kg.ToLb(TenderCoalMassKG ) / WaterLBpUKG)), IsMetric, IsUK),
8387- TenderCoalMassKG / MaxTenderCoalMassKG * 100,
8386+ FormatStrings.FormatFuelVolume(L.FromGUK(OilSpecificGravity * (Kg.ToLb(TenderFuelMassKG ) / WaterLBpUKG)), IsMetric, IsUK),
8387+ TenderFuelMassKG / MaxTenderFuelMassKG * 100,
83888388 Simulator.Catalog.GetString("Water"),
83898389 FormatStrings.FormatFuelVolume(L.FromGUK(CombinedTenderWaterVolumeUKG), IsMetric, IsUK),
83908390 CombinedTenderWaterVolumeUKG / MaxTotalCombinedWaterVolumeUKG * 100,
@@ -8399,8 +8399,8 @@ public override string GetDebugStatus()
83998399 status.AppendFormat("{0}\t{1}\t{2:N0}\t\t{3:N0}%\t{4}\t{5}\t\t{6:N0}%\t{7}\t{8:N0}\t{9}\t\t{10:N0}\n",
84008400 Simulator.Catalog.GetString("Tender:"),
84018401 Simulator.Catalog.GetString("Wood"),
8402- FormatStrings.FormatFuelVolume(L.FromGUK(OilSpecificGravity * (Kg.ToLb(TenderCoalMassKG) / WaterLBpUKG)) , IsMetric, IsUK ),
8403- TenderCoalMassKG / MaxTenderCoalMassKG * 100,
8402+ FormatStrings.FormatMass(TenderFuelMassKG , IsMetric),
8403+ TenderFuelMassKG / MaxTenderFuelMassKG * 100,
84048404 Simulator.Catalog.GetString("Water"),
84058405 FormatStrings.FormatFuelVolume(L.FromGUK(CombinedTenderWaterVolumeUKG), IsMetric, IsUK),
84068406 CombinedTenderWaterVolumeUKG / MaxTotalCombinedWaterVolumeUKG * 100,
@@ -8415,8 +8415,8 @@ public override string GetDebugStatus()
84158415 status.AppendFormat("{0}\t{1}\t{2}\t{3:N0}%\t{4}\t{5}\t\t{6:N0}%\t{7}\t{8:N0}\t{9}\t\t{10:N0}\n",
84168416 Simulator.Catalog.GetString("Tender:"),
84178417 Simulator.Catalog.GetString("Coal"),
8418- FormatStrings.FormatMass(TenderCoalMassKG , IsMetric),
8419- TenderCoalMassKG / MaxTenderCoalMassKG * 100,
8418+ FormatStrings.FormatMass(TenderFuelMassKG , IsMetric),
8419+ TenderFuelMassKG / MaxTenderFuelMassKG * 100,
84208420 Simulator.Catalog.GetString("Water"),
84218421 FormatStrings.FormatFuelVolume(L.FromGUK(CombinedTenderWaterVolumeUKG), IsMetric, IsUK),
84228422 CombinedTenderWaterVolumeUKG / MaxTotalCombinedWaterVolumeUKG * 100,
@@ -9802,7 +9802,19 @@ public void AIFireReset()
98029802 /// <returns>Matching controller or null</returns>
98039803 public override MSTSNotchController GetRefillController(uint type)
98049804 {
9805- if (type == (uint)PickupType.FuelCoal) return FuelController;
9805+ if (SteamLocomotiveFuelType == SteamLocomotiveFuelTypes.Wood)
9806+ {
9807+ if (type == (uint)PickupType.FuelWood) return FuelController;
9808+ }
9809+ else if (SteamLocomotiveFuelType == SteamLocomotiveFuelTypes.Oil)
9810+ {
9811+ if (type == (uint)PickupType.FuelDiesel) return FuelController;
9812+ }
9813+ else
9814+ {
9815+ if (type == (uint)PickupType.FuelCoal) return FuelController;
9816+ }
9817+
98069818 if (type == (uint)PickupType.FuelWater) return WaterController;
98079819 return null;
98089820 }
@@ -9814,8 +9826,8 @@ public override MSTSNotchController GetRefillController(uint type)
98149826 public override void SetStepSize(PickupObj matchPickup)
98159827 {
98169828 uint type = matchPickup.PickupType;
9817- if (type == (uint)PickupType.FuelCoal && MaxTenderCoalMassKG != 0)
9818- FuelController.SetStepSize(matchPickup.PickupCapacity.FeedRateKGpS / MSTSNotchController.StandardBoost / MaxTenderCoalMassKG );
9829+ if (type == (uint)PickupType.FuelCoal && MaxTenderFuelMassKG != 0)
9830+ FuelController.SetStepSize(matchPickup.PickupCapacity.FeedRateKGpS / MSTSNotchController.StandardBoost / MaxTenderFuelMassKG );
98199831 else if (type == (uint)PickupType.FuelWater && MaxLocoTenderWaterMassKG != 0)
98209832 WaterController.SetStepSize(matchPickup.PickupCapacity.FeedRateKGpS / MSTSNotchController.StandardBoost / MaxLocoTenderWaterMassKG);
98219833 }
@@ -9837,14 +9849,34 @@ public override void RefillImmediately()
98379849 /// <returns>0.0 to 1.0. If type is unknown, returns 0.0</returns>
98389850 public override float GetFilledFraction(uint pickupType)
98399851 {
9840- if (pickupType == (uint)PickupType.FuelWater )
9852+ if (SteamLocomotiveFuelType == SteamLocomotiveFuelTypes.Wood )
98419853 {
9842- return WaterController.CurrentValue;
9854+ if (pickupType == (uint)PickupType.FuelWood)
9855+ {
9856+ return FuelController.CurrentValue;
9857+ }
98439858 }
9844- if (pickupType == (uint)PickupType.FuelCoal)
9859+ else if (SteamLocomotiveFuelType == SteamLocomotiveFuelTypes.Oil)
9860+ {
9861+ if (pickupType == (uint)PickupType.FuelDiesel)
9862+ {
9863+ return FuelController.CurrentValue;
9864+ }
9865+ }
9866+ else
98459867 {
9846- return FuelController.CurrentValue;
9868+ if (pickupType == (uint)PickupType.FuelCoal)
9869+ {
9870+ return FuelController.CurrentValue;
9871+ }
98479872 }
9873+
9874+
9875+ if (pickupType == (uint)PickupType.FuelWater)
9876+ {
9877+ return WaterController.CurrentValue;
9878+ }
9879+
98489880 return 0f;
98499881 }
98509882
0 commit comments