namespace XFEEDToolBox.Core.Navigation; /// Converts the original SCO energy curve to tonnes per second using this ship's original fuel conversion. 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; } }