XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
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;
    }
}