Files
kos-scripts/lib/stage/atlas.ks
2025-10-29 15:40:14 -07:00

102 lines
3.5 KiB
Plaintext

@lazyglobal off.
runoncepath("0:/lib/common.ks").
global atlas is lex(
"launch", launch@
).
local function launch {
parameter hdg, target_ap, target_pitch is 6.
lock throttle to 1.0.
local engine is ship:partsdubbed("ROE-LR89.2")[0].
stage.
wait until stage:ready.
wait until engine:thrust > (engine:maxthrust * 0.9).
stage.
local booster_drop is time:seconds + 160.
local target_vel is 150.
lock steering to heading(hdg, 90 - min(target_pitch, target_pitch * (ship:velocity:surface:mag / target_vel)), -hdg).
wait until ship:velocity:surface:mag > target_vel.
print "Heading stable, switching to gravity turn".
set warpmode to "physics".
set warp to 3.
lock steering to lookdirup(ship:srfprograde:forevector, ship:up:forevector).
wait until time:seconds > booster_drop.
set warp to 0.
wait until kuniverse:timewarp:issettled.
stage.
wait 2.
set warp to 3.
wait until ship:altitude > 100000.
print "Dropping Fairings".
if not ship:partsdubbed("SSTUHollowRing"):empty {
set warp to 0.
wait until kuniverse:timewarp:issettled.
print "Dropping Fairings".
stage.
wait 2.
set warp to 3.
}
print "Switching to target PE mode".
lock steering to insert_orbit_pe(hdg, target_ap).
wait until ship:thrust = 0.
unlock steering.
lock throttle to 0.0.
set warp to 0.
wait until kuniverse:timewarp:issettled.
}
local function drawvec {
parameter vec, color, desc.
local origin is ship:position.
return vecdraw(origin, origin + vec:normalized, color, desc, 5.0, TRUE, 0.2, TRUE, FALSE).
}
local function insert_orbit_pe {
parameter azimuth, target_ap.
//clearvecdraws().
local ap_hdg is ap_prograde().
local origin is ship:position.
//drawvec(ship:facing:forevector, RGB(0, 1, 0), "Ship Facing").
//drawvec(ap_hdg:forevector, RGB(1, 1, 0), "AP Prograde").
local ap_delta is ship:orbit:apoapsis - target_ap.
local cur_burn_angle is mod(vang(vxcl(ship:facing:forevector, ap_hdg:starvector), ap_hdg:forevector) + 360, 360).
local ap_burn_ang is symmetric_clamp(ap_delta/3000, 90).
local target_burn_hdg is angleaxis(ap_burn_ang, ap_hdg:starvector) * ap_hdg.
//drawvec(target_burn_hdg:forevector, RGB(1, 0, 0), "Non-azimuth-corrected burn vector").
// Vector pointing exactly towards our azimuth, flat with our orbital position
local azimuth_vector is heading(azimuth, 0, 0):forevector.
//drawvec(azimuth_vector, RGB(0, 1, 1), "Azimuth").
// Vector pointing exactly towards AP, flat with our orbital position
local steering_vector is vxcl(ship:up:forevector, target_burn_hdg:forevector).
//drawvec(steering_vector, RGB(1, 0, 1), "AP Steering Vector").
// Angle to rotate to bring our AP vector to our azimuth
local azimuth_ang is vang(steering_vector, azimuth_vector).
local azimuth_adjustment is angleaxis(-azimuth_ang, ship:up:forevector).
local azimuth_burn_hdg is azimuth_adjustment * target_burn_hdg.
//drawvec(azimuth_burn_hdg:forevector, RGB(0, 1, 0), "Azimuth-corrected burn vector").
local steering_ang is symmetric_clamp(vang(ship:facing:forevector, azimuth_burn_hdg:forevector), 10).
local steering_hdg is angleaxis(steering_ang, vcrs(ship:facing:forevector, azimuth_burn_hdg:forevector)) * ship:facing.
return steering_hdg.
}
local function symmetric_clamp {
parameter val, limit.
return min(max(val, -limit), limit).
}