namespace XFEEDToolBox.Core.Navigation;
/// <summary>Converts the original SCO energy curve to tonnes per second using this ship's original fuel conversion.</summary>
public static class OriginalFuelConsumptionBounds
{
// Original 380B790 and 380AE40 both use the double at 534E798.
// This is an energy conversion, not an assumed kg/tonne or hours/second factor.
public const double OriginalEnergyConversion=45000;
public static bool TryConvertRange(OriginalCurveRange energyCurve,double moduleMultiplier,double fuelConversion,
out OriginalCurveRange tonnesPerSecond)
{
tonnesPerSecond=default;
if(!TryConvert(energyCurve,moduleMultiplier,fuelConversion,out var upper))return false;
var lower=Math.Max(0,energyCurve.Minimum*moduleMultiplier/(fuelConversion*OriginalEnergyConversion)*(1-1e-5)-1e-10);
if(!double.IsFinite(lower)||lower>upper)return false;
tonnesPerSecond=new(lower,upper);return true;
}
public static bool TryConvert(OriginalCurveRange energyCurve,double moduleMultiplier,double fuelConversion,
out double upperTonnesPerSecond)
{
upperTonnesPerSecond=double.NaN;
if(!double.IsFinite(energyCurve.Minimum)||!double.IsFinite(energyCurve.Maximum)||energyCurve.Minimum>energyCurve.Maximum
||energyCurve.Maximum<=0||!double.IsFinite(moduleMultiplier)||moduleMultiplier<=0
||!double.IsFinite(fuelConversion)||fuelConversion<=0)return false;
var energy=energyCurve.Maximum*moduleMultiplier;
var unitsPerTonne=fuelConversion*OriginalEnergyConversion;
if(!double.IsFinite(energy)||!double.IsFinite(unitsPerTonne)||unitsPerTonne<=0)return false;
var upper=energy/unitsPerTonne;
if(!double.IsFinite(upper)||upper<=0)return false;
// The native path mixes float curve/parameter reads with double energy
// arithmetic and finally rounds the fuel change back to float.
upper=upper*(1+1e-5)+1e-10;
if(!double.IsFinite(upper))return false;
upperTonnesPerSecond=upper;return true;
}
}
namespace XFEEDToolBox.Core.Navigation;
/// <summary>Converts the original SCO energy curve to tonnes per second using this ship's original fuel conversion.</summary>
public static class OriginalFuelConsumptionBounds
{
// Original 380B790 and 380AE40 both use the double at 534E798.
// This is an energy conversion, not an assumed kg/tonne or hours/second factor.
public const double OriginalEnergyConversion=45000;
public static bool TryConvertRange(OriginalCurveRange energyCurve,double moduleMultiplier,double fuelConversion,
out OriginalCurveRange tonnesPerSecond)
{
tonnesPerSecond=default;
if(!TryConvert(energyCurve,moduleMultiplier,fuelConversion,out var upper))return false;
var lower=Math.Max(0,energyCurve.Minimum*moduleMultiplier/(fuelConversion*OriginalEnergyConversion)*(1-1e-5)-1e-10);
if(!double.IsFinite(lower)||lower>upper)return false;
tonnesPerSecond=new(lower,upper);return true;
}
public static bool TryConvert(OriginalCurveRange energyCurve,double moduleMultiplier,double fuelConversion,
out double upperTonnesPerSecond)
{
upperTonnesPerSecond=double.NaN;
if(!double.IsFinite(energyCurve.Minimum)||!double.IsFinite(energyCurve.Maximum)||energyCurve.Minimum>energyCurve.Maximum
||energyCurve.Maximum<=0||!double.IsFinite(moduleMultiplier)||moduleMultiplier<=0
||!double.IsFinite(fuelConversion)||fuelConversion<=0)return false;
var energy=energyCurve.Maximum*moduleMultiplier;
var unitsPerTonne=fuelConversion*OriginalEnergyConversion;
if(!double.IsFinite(energy)||!double.IsFinite(unitsPerTonne)||unitsPerTonne<=0)return false;
var upper=energy/unitsPerTonne;
if(!double.IsFinite(upper)||upper<=0)return false;
// The native path mixes float curve/parameter reads with double energy
// arithmetic and finally rounds the fuel change back to float.
upper=upper*(1+1e-5)+1e-10;
if(!double.IsFinite(upper))return false;
upperTonnesPerSecond=upper;return true;
}
}