namespace XFEEDToolBox.Core.Navigation;
public sealed partial class NativeSystemFlightControlDriver
{
private NativeCruiseControlChannel? originalCruiseControl;
private Func<double>? originalCruiseFuelReserve;
public NativeCruiseControlChannel? CruiseControl=>originalCruiseControl;
public async Task ConfigureOriginalCruiseControlAsync(Func<double> fuelReserve,bool allowUnqualifiedEmptyTrial=false,CancellationToken token=default,Action<System.Text.Json.JsonElement>? diagnostics=null)
{
if(useNativeSupercruiseAssist)throw new InvalidOperationException("Original SCO requires toolbox navigation with game SCA disabled.");
var state=player();if(allowUnqualifiedEmptyTrial&&(!state.InGame||!state.Docked||state.CurrentShipId is null||state.CargoCount!=0))throw new InvalidOperationException("Unqualified SCO testing requires the empty ship to remain docked during setup.");
var channel=new NativeCruiseControlChannel(processId,gameHash);var capabilities=await channel.InspectAsync(token);
if(!capabilities.Available)throw new NotSupportedException("Original SCO controller is unavailable.");
if(diagnostics is not null)channel.Observed+=diagnostics;
originalCruiseControl=channel;originalCruiseFuelReserve=fuelReserve;
}
private Task UpdateOriginalCruiseAsync(SystemFlightDecision decision,SystemFlightFrame frame,SystemNavigationTarget target,DateTimeOffset deadline,CancellationToken token)
=>originalCruiseControl?.UpdateAsync(owner,checked((ulong)generation),frame,decision,target,originalCruiseFuelReserve!(),deadline,token)??Task.CompletedTask;
}
namespace XFEEDToolBox.Core.Navigation;
public sealed partial class NativeSystemFlightControlDriver
{
private NativeCruiseControlChannel? originalCruiseControl;
private Func<double>? originalCruiseFuelReserve;
public NativeCruiseControlChannel? CruiseControl=>originalCruiseControl;
public async Task ConfigureOriginalCruiseControlAsync(Func<double> fuelReserve,bool allowUnqualifiedEmptyTrial=false,CancellationToken token=default,Action<System.Text.Json.JsonElement>? diagnostics=null)
{
if(useNativeSupercruiseAssist)throw new InvalidOperationException("Original SCO requires toolbox navigation with game SCA disabled.");
var state=player();if(allowUnqualifiedEmptyTrial&&(!state.InGame||!state.Docked||state.CurrentShipId is null||state.CargoCount!=0))throw new InvalidOperationException("Unqualified SCO testing requires the empty ship to remain docked during setup.");
var channel=new NativeCruiseControlChannel(processId,gameHash);var capabilities=await channel.InspectAsync(token);
if(!capabilities.Available)throw new NotSupportedException("Original SCO controller is unavailable.");
if(diagnostics is not null)channel.Observed+=diagnostics;
originalCruiseControl=channel;originalCruiseFuelReserve=fuelReserve;
}
private Task UpdateOriginalCruiseAsync(SystemFlightDecision decision,SystemFlightFrame frame,SystemNavigationTarget target,DateTimeOffset deadline,CancellationToken token)
=>originalCruiseControl?.UpdateAsync(owner,checked((ulong)generation),frame,decision,target,originalCruiseFuelReserve!(),deadline,token)??Task.CompletedTask;
}