Max range display is the guaranteed (worst-case headwind) full-tank range (ISS-099, v0.51.0)
CI / build + unit + e2e (pull_request) Successful in 12m47s
CI / build + unit + e2e (pull_request) Successful in 12m47s
This commit is contained in:
@@ -137,3 +137,16 @@ export function maxRangeKm(burnPerKm: number, emptyWeightKg: number, maxFuel: nu
|
||||
const rho = FUEL_DENSITY_KG_PER_L;
|
||||
return Math.log(1 + (rho * maxFuel) / emptyWeightKg) * ((emptyWeightKg + rho * maxFuel) / (rho * burnPerKm));
|
||||
}
|
||||
|
||||
// Max headwind burn multiplier over the weather domain (v0.51.0, ISS-099): the upper end of
|
||||
// windBurnFactor's [0.8, 1.2] range — a full 30 kt headwind (the max in lib/weather.ts) ÷ 150.
|
||||
export const MAX_WIND_BURN_FACTOR = 1 + 30 / 150;
|
||||
|
||||
// Guaranteed full-tank range (v0.51.0, ISS-099): the maxRangeKm closed form under worst-case
|
||||
// headwind burn — any leg within this distance is flyable in ALL weather, since windBurnFactor
|
||||
// never exceeds MAX_WIND_BURN_FACTOR and requiredFuelFor grows with the burn rate. This is what
|
||||
// the UI displays as "Max range", so a spec-possible leg always passes flyPlane's fuel guard
|
||||
// (requiredFuelFor ≤ maxFuel under the same wind-adjusted burn).
|
||||
export function guaranteedRangeKm(burnPerKm: number, emptyWeightKg: number, maxFuel: number): number {
|
||||
return maxRangeKm(burnPerKm * MAX_WIND_BURN_FACTOR, emptyWeightKg, maxFuel);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user