@@ -319,7 +319,22 @@ internal VariableEvaluator GetEvaluator(string input, out VariableUpdateType upd
319319 {
320320 return ScienceUtil . GetExperimentBiome ( vessel . mainBody , vessel . latitude , vessel . longitude ) ;
321321 } ;
322-
322+ case "PATCHENCOUNTERBODY" :
323+ return ( RPMVesselComputer comp ) =>
324+ {
325+ if ( ! JUtil . OrbitMakesSense ( vessel ) ) return string . Empty ;
326+ Orbit patch = GetSelectedPatchOrbit ( ) ;
327+ switch ( patch . patchEndTransition )
328+ {
329+ case Orbit . PatchTransitionType . ENCOUNTER :
330+ return patch . nextPatch . referenceBody . bodyName ;
331+ case Orbit . PatchTransitionType . ESCAPE :
332+ return patch . referenceBody . bodyName ;
333+ }
334+ return string . Empty ;
335+ } ;
336+ case "PATCHORBITBODY" :
337+ return ( RPMVesselComputer comp ) => GetSelectedPatchOrbit ( ) . referenceBody . name ;
323338 }
324339
325340 return null ;
@@ -1600,6 +1615,8 @@ internal NumericVariableEvaluator GetNumericEvaluator(string input, out Variable
16001615 }
16011616 return double . NaN ;
16021617 } ;
1618+ case "ANYTARGETEXISTS" :
1619+ return ( RPMVesselComputer comp ) => comp . target == null ? - 1d : 1d ;
16031620 case "TARGETEXISTS" :
16041621 return ( RPMVesselComputer comp ) =>
16051622 {
@@ -2626,6 +2643,138 @@ internal NumericVariableEvaluator GetNumericEvaluator(string input, out Variable
26262643 }
26272644 return - 1d ;
26282645 } ;
2646+ case "PATCHINDEX" :
2647+ return ( RPMVesselComputer comp ) =>
2648+ {
2649+ ( int index , Orbit _ ) = GetSelectedPatch ( ) ;
2650+ return index + 1 ;
2651+ } ;
2652+ case "PATCHCOUNT" :
2653+ return ( RPMVesselComputer comp ) =>
2654+ {
2655+ ( int index , Orbit _ ) = GetLastPatch ( ) ;
2656+ return index + 1 ;
2657+ } ;
2658+ case "PATCHALTITUDE" :
2659+ return ( RPMVesselComputer comp ) => GetSelectedPatchOrbit ( ) . referenceBody . GetAltitude ( vessel . CoM ) ;
2660+ case "PATCHORBTSPEED" :
2661+ return ( RPMVesselComputer comp ) => GetSelectedPatchOrbit ( ) . GetVel ( ) . magnitude ;
2662+ case "PATCHAPOAPSIS" :
2663+ return ( RPMVesselComputer comp ) => JUtil . OrbitMakesSense ( vessel ) ? GetSelectedPatchOrbit ( ) . ApA : double . NaN ;
2664+ case "PATCHPERIAPSIS" :
2665+ return ( RPMVesselComputer comp ) => JUtil . OrbitMakesSense ( vessel ) ? GetSelectedPatchOrbit ( ) . PeA : double . NaN ;
2666+ case "PATCHINCLINATION" :
2667+ return ( RPMVesselComputer comp ) => JUtil . OrbitMakesSense ( vessel ) ? GetSelectedPatchOrbit ( ) . inclination : double . NaN ;
2668+ case "PATCHECCENTRICITY" :
2669+ return ( RPMVesselComputer comp ) => JUtil . OrbitMakesSense ( vessel ) ? GetSelectedPatchOrbit ( ) . eccentricity : double . NaN ;
2670+ case "PATCHTIMETOAPSECS" :
2671+ return ( RPMVesselComputer comp ) =>
2672+ {
2673+ if ( ! JUtil . OrbitMakesSense ( vessel ) ) return double . NaN ;
2674+ Orbit patch = GetSelectedPatchOrbit ( ) ;
2675+ // When the tracking station is not upgraded, StartUT will not be updated to the current time.
2676+ if ( patch . StartUT == 0.0 ) return patch . timeToAp ;
2677+ return patch . timeToAp + patch . StartUT - Planetarium . GetUniversalTime ( ) ;
2678+ } ;
2679+ case "PATCHTIMETOPESECS" :
2680+ return ( RPMVesselComputer comp ) =>
2681+ {
2682+ if ( ! JUtil . OrbitMakesSense ( vessel ) ) return double . NaN ;
2683+ Orbit patch = GetSelectedPatchOrbit ( ) ;
2684+ // When the tracking station is not upgraded, StartUT will not be updated to the current time.
2685+ if ( patch . StartUT == 0.0 ) return patch . timeToPe ;
2686+ return patch . timeToPe + patch . StartUT - Planetarium . GetUniversalTime ( ) ;
2687+ } ;
2688+ case "PATCHORBPERIODSECS" :
2689+ return ( RPMVesselComputer comp ) => JUtil . OrbitMakesSense ( vessel ) ? GetSelectedPatchOrbit ( ) . period : double . NaN ;
2690+ case "PATCHTIMETOANEQUATORIAL" :
2691+ return ( RPMVesselComputer comp ) =>
2692+ {
2693+ Orbit patch = GetSelectedPatchOrbit ( ) ;
2694+ if ( ! JUtil . OrbitMakesSense ( vessel ) || ! patch . AscendingNodeEquatorialExists ( ) )
2695+ {
2696+ return double . NaN ;
2697+ }
2698+ return patch . TimeOfAscendingNodeEquatorial ( Planetarium . GetUniversalTime ( ) ) - Planetarium . GetUniversalTime ( ) ;
2699+ } ;
2700+ case "PATCHTIMETODNEQUATORIAL" :
2701+ return ( RPMVesselComputer comp ) =>
2702+ {
2703+ Orbit patch = GetSelectedPatchOrbit ( ) ;
2704+ if ( ! JUtil . OrbitMakesSense ( vessel ) || ! patch . DescendingNodeEquatorialExists ( ) )
2705+ {
2706+ return double . NaN ;
2707+ }
2708+ return patch . TimeOfDescendingNodeEquatorial ( Planetarium . GetUniversalTime ( ) ) - Planetarium . GetUniversalTime ( ) ;
2709+ } ;
2710+ case "PATCHFIRST" :
2711+ return ( RPMVesselComputer comp ) =>
2712+ {
2713+ ( int index , Orbit _ ) = GetSelectedPatch ( ) ;
2714+ return index == 0 ? 1.0d : 0.0d ;
2715+ } ;
2716+ case "PATCHLAST" :
2717+ return ( RPMVesselComputer comp ) =>
2718+ {
2719+ ( int selected , Orbit _ ) = GetSelectedPatch ( ) ;
2720+ ( int last , Orbit _ ) = GetLastPatch ( ) ;
2721+ return selected == last ? 1.0d : 0.0d ;
2722+ } ;
2723+ case "PATCHNEXTAPSISTYPE" :
2724+ return ( RPMVesselComputer comp ) =>
2725+ {
2726+ Orbit patch = GetSelectedPatchOrbit ( ) ;
2727+ if ( patch . eccentricity < 1.0 )
2728+ {
2729+ // Which one will we reach first?
2730+ return ( patch . timeToPe < patch . timeToAp ) ? - 1.0 : 1.0 ;
2731+ }
2732+
2733+ // Ship is hyperbolic. There is no Ap. Have we already
2734+ // passed Pe?
2735+ return ( patch . timeToPe > 0.0 ) ? - 1.0 : 0.0 ;
2736+ } ;
2737+ case "PATCHNEXT_ANDN_EQUATORIAL" :
2738+ return ( RPMVesselComputer comp ) =>
2739+ {
2740+ Orbit patch = GetSelectedPatchOrbit ( ) ;
2741+ double universalTime = Planetarium . GetUniversalTime ( ) ;
2742+ if ( ! JUtil . OrbitMakesSense ( vessel ) ) return 0.0 ;
2743+
2744+ double dnTime = patch . DescendingNodeEquatorialExists ( ) ? patch . TimeOfDescendingNodeEquatorial ( universalTime ) : double . NaN ;
2745+ double anTime = patch . AscendingNodeEquatorialExists ( ) ? patch . TimeOfAscendingNodeEquatorial ( universalTime ) : double . NaN ;
2746+
2747+ if ( double . IsNaN ( anTime ) ) return - 1.0 ;
2748+ if ( double . IsNaN ( dnTime ) ) return 1.0 ;
2749+ return Math . Max ( 0.0 , anTime ) < Math . Max ( dnTime , 0.0 ) ? 1.0 : - 1.0 ;
2750+ } ;
2751+ case "PATCHENCOUNTEREXISTS" :
2752+ return ( RPMVesselComputer comp ) =>
2753+ {
2754+ if ( ! JUtil . OrbitMakesSense ( vessel ) ) return 0.0 ;
2755+ Orbit patch = GetSelectedPatchOrbit ( ) ;
2756+ switch ( patch . patchEndTransition )
2757+ {
2758+ case Orbit . PatchTransitionType . ESCAPE :
2759+ return - 1d ;
2760+ case Orbit . PatchTransitionType . ENCOUNTER :
2761+ return 1d ;
2762+ default :
2763+ return 0.0d ;
2764+ }
2765+ } ;
2766+ case "PATCHENCOUNTERTIME" :
2767+ return ( RPMVesselComputer comp ) =>
2768+ {
2769+ if ( ! JUtil . OrbitMakesSense ( vessel ) ) return 0.0 ;
2770+ Orbit patch = GetSelectedPatchOrbit ( ) ;
2771+ if ( patch . patchEndTransition == Orbit . PatchTransitionType . ENCOUNTER ||
2772+ patch . patchEndTransition == Orbit . PatchTransitionType . ESCAPE )
2773+ {
2774+ return patch . UTsoi - Planetarium . GetUniversalTime ( ) ;
2775+ }
2776+ return 0.0 ;
2777+ } ;
26292778 }
26302779
26312780 return null ;
0 commit comments