Skip to content

Commit 624f795

Browse files
committed
Adjust fuel masses in steam locomotive
1 parent 8e14b45 commit 624f795

File tree

5 files changed

+76
-44
lines changed

5 files changed

+76
-44
lines changed

Source/Orts.Simulation/Simulation/AIs/AI.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -923,7 +923,7 @@ public AITrain CreateAITrainDetail(Service_Definition sd, Traffic_Service_Defini
923923
if (Simulator.Activity != null && car is MSTSSteamLocomotive mstsSteamLocomotive)
924924
{
925925
mstsSteamLocomotive.CombinedTenderWaterVolumeUKG = ORTS.Common.Kg.ToLb(mstsSteamLocomotive.MaxLocoTenderWaterMassKG) / 10.0f * Simulator.Activity.Tr_Activity.Tr_Activity_Header.FuelWater / 100.0f;
926-
mstsSteamLocomotive.TenderCoalMassKG = mstsSteamLocomotive.MaxTenderCoalMassKG * Simulator.Activity.Tr_Activity.Tr_Activity_Header.FuelCoal / 100.0f;
926+
mstsSteamLocomotive.TenderFuelMassKG = mstsSteamLocomotive.MaxTenderFuelMassKG * Simulator.Activity.Tr_Activity.Tr_Activity_Header.FuelCoal / 100.0f;
927927
}
928928

929929
if (train.InitialSpeed != 0 && car is MSTSLocomotive loco)

Source/Orts.Simulation/Simulation/RollingStocks/MSTSSteamLocomotive.cs

Lines changed: 67 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)