예제 #1
0
        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);
        }
예제 #2
0
        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);
        }