// 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.
}