internal override string GetLabel(Vessel vessel, EvaluationContext context, SubRequirementState state) { string label = string.Empty; AboveWaypointState wpState = (AboveWaypointState)state; string elevationString = Lib.BuildString(wpState.elevation.ToString("F1"), " °"); if (wpState.elevation < minElevation) { label = Localizer.Format("#KerCon_elevAboveXisY", // elevation above <<1>>: <<2>> context.waypoint.name, Lib.Color(elevationString, Lib.Kolor.Red)); } else if (wpState.elevation - (90 - minElevation) / 3 < minElevation) { label = Localizer.Format("#KerCon_elevAboveXisY", // elevation above <<1>>: <<2>> context.waypoint.name, Lib.Color(elevationString, Lib.Kolor.Yellow)); } else { label = Localizer.Format("#KerCon_elevAboveXisY", // elevation above <<1>>: <<2>> context.waypoint.name, Lib.Color(elevationString, Lib.Kolor.Green)); } if (minDistance > 0 || maxDistance > 0) { label += "\n\t" + Localizer.Format("#KerCon_DistanceX", Lib.Color(Lib.HumanReadableDistance(wpState.distance), // distance: <<1>> wpState.distanceMet ? Lib.Kolor.Green : Lib.Kolor.Red)); } if (minRadialVelocity > 0) { label += "\n\t" + Localizer.Format("#KerCon_RadialVelX", Lib.Color(Lib.HumanReadableSpeed(wpState.radialVelocity), // radial velocity: <<1>> wpState.radialVelocity >= minRadialVelocity ? Lib.Kolor.Green : Lib.Kolor.Red)); } if (minRadialVelocityChange > 0) { var radialVelocityChangeString = Lib.HumanReadableSpeed(wpState.radialVelocityChange) + "/s"; label += "\n\t" + Localizer.Format("#KerCon_RadialVelChangeX", Lib.Color(radialVelocityChangeString, // radial velocity change: <<1>> wpState.radialVelocityChange >= minRadialVelocityChange ? Lib.Kolor.Green : Lib.Kolor.Red)); } if (minAngularVelocity > 0 || maxAngularVelocity > 0) { label += "\n\t" + Localizer.Format("#KerCon_AngularVelX", Lib.Color(wpState.angularVelocity.ToString("F1") + " °/m", // angular velocity: <<1>> wpState.angularRequirementMet ? Lib.Kolor.Green : Lib.Kolor.Red)); } return(label); }
internal override SubRequirementState VesselMeetsCondition(Vessel vessel, EvaluationContext context) { AboveWaypointState state = new AboveWaypointState(); state.elevation = GetElevation(vessel, context); state.distance = GetDistance(vessel, context); bool meetsCondition = state.elevation >= minElevation; if (minDistance > 0 || maxDistance > 0) { state.distanceMet = true; if (minDistance > 0) { state.distanceMet &= minDistance <= state.distance; } if (maxDistance > 0) { state.distanceMet &= maxDistance >= state.distance; } meetsCondition &= state.distanceMet; } if (minRadialVelocity > 0 || minRadialVelocityChange > 0) { state.distance10sago = GetDistance(vessel, context, 10); state.radialVelocity = Math.Abs((state.distance10sago - state.distance) / 10.0); if (minRadialVelocity > 0) { meetsCondition &= state.radialVelocity >= minRadialVelocity; } if (minRadialVelocityChange > 0) { state.distanceIn10s = GetDistance(vessel, context, -10); var radialVelocityIn10s = Math.Abs((state.distanceIn10s - state.distance) / 10.0); state.radialVelocityChange = Math.Abs((radialVelocityIn10s - state.radialVelocity) / 10.0); meetsCondition &= state.radialVelocityChange >= minRadialVelocityChange; //Utils.LogDebug($"{context.waypoint.name} {context.now} el {state.elevation.ToString("F2")} dist {state.distance.ToString("F0")} dist-10s {state.distance10sago.ToString("F0")} dist-20s {state.distanceIn10s.ToString("F0")} radvel {state.radialVelocity.ToString("F1")} radvel-10s {radialVelocityIn10s.ToString("F1")} delta radvel {state.radialVelocityChange.ToString("F1")}"); } } if (minAngularVelocity > 0 || maxAngularVelocity > 0) { state.elev10sago = GetElevation(vessel, context, 10); state.angularVelocity = Math.Abs((state.elev10sago - state.elevation) * 6.0); // radial velocity is in degrees/minute state.angularRequirementMet = true; if (minAngularVelocity > 0) { state.angularRequirementMet &= state.angularVelocity >= minAngularVelocity; } if (maxAngularVelocity > 0) { state.angularRequirementMet &= state.angularVelocity <= maxAngularVelocity; } meetsCondition &= state.angularRequirementMet; } state.requirementMet = meetsCondition; return(state); }