// functions for calculating steering values. function GetPitch { parameter v is SHIP:FACING:FOREVECTOR. return 90 - vectorangle(SHIP:UP:FOREVECTOR, v). } function GetAscentVector { parameter minPitch. // face prograde, but hold a solid eastern heading and don't // rotate the ship local newHeading is lookdirup(SHIP:SRFPROGRADE:FOREVECTOR, heading(90, 0, 270):TOPVECTOR). if GetPitch(newHeading:FOREVECTOR) < minPitch { set newHeading to heading(90, minPitch, 270). } return newHeading. } // Create a node that will circularize the orbit. // 'where' can be one of: // the special string "APO", for the next Apoapsis. // the special string "PERI", for the next Periapsis. // a time value (either a Time struct or a scalar), representing a target time. function CreateCircularizationNode { parameter where is "APO". local dt is 0. local a is 0. local t is 0. if where:IsType("String") { if where = "APO" { set dt to SHIP:ORBIT:ETA:APOAPSIS. set a to SHIP:ORBIT:APOAPSIS. } else if where = "PERI" { set dt to SHIP:ORBIT:ETA:PERIAPSIS. set a to SHIP:ORBIT:PERIAPSIS. } else { print "WARNING: Invalid string passed to CreateCirculazationNode(). Node is invalid.". } set t to TIME + dt. } else { set t to where. } local Vc is sqrt(SHIP:BODY:MU/(SHIP:BODY:RADIUS + a)). local dV is Vc - VelocityAt(SHIP, t):ORBIT:MAG. local n is Node(t, 0, 0, dV). return n. }