lock x to body:geopositionof(ship:facing:vector):heading. lock p to 0. set vectors to ship:partsdubbedpattern("vector"). set nukes to ship:partsdubbedpattern("nuc"). set turbos to ship:partsdubbedpattern("turbofan"). set servos to ship:modulesnamed("ModuleRoboticRotationServo"). set proprad to 5.8. for rap in ship:partsdubbedpattern("rapier") turbos:add(rap). set rotormods to ship:modulesnamed("ModuleRoboticServoRotor"). set rotors to list(). for rm in rotormods { local rotor to lexicon(). if(rm:getfield("motor") <> "Unpowered") { set rotor["part"] to rm:part. set rotor["mod"] to rm. set rotor["blades"] to list(). for bm in rm:part:ModulesNamed("ModuleControlSurface") { local bpart to bm:part. local blade to lexicon(). set blade["mod"] to bm. set blade["offset"] to vdot(-bpart:Facing:starvector, bpart:position - bpart:parent:position). set blade["proprad"] to proprad. bm:setfield("deploy", true). rotor["blades"]:add(blade). } rotors:add(rotor). if rm:hasfield("torque limit(%)") rm:setfield("torque limit(%)", 0). } } function topcontrol { ship:partstaggedpattern("up")[0]:controlfrom(). } function frontcontrol { ship:partstaggedpattern("cockpit")[0]:controlfrom(). } function ThrustLimit { parameter targetEngines. parameter targetThrust. for eng in targetEngines set eng:thrustlimit to targetThrust. } function SetEngines { parameter targetMode to "Activate Engine". parameter engines to ship:partsdubbedpattern("vector"). for engine in engines { if engine:hasmodule("ModuleEnginesFx") set m to engine:getmodule("ModuleEnginesFx"). if engine:hasmodule("ModuleEngines") set m to engine:getmodule("ModuleEngines"). if m:hasaction(targetMode) m:doaction(targetMode, true). } } function shutoff { parameter engines to ship:partsdubbedpattern("vector"). SetEngines("Shutdown Engine", engines). } function startup { parameter engines to ship:partsdubbedpattern("vector"). SetEngines("Activate Engine", engines). } function ImtheRedBaron { set steeringmanager:rollcontrolanglerange to 180. parameter resetengines is true. if resetengines shutoff(ship:engines). frontcontrol(). for rotor in rotors { if rotor:mod:hasfield("torque limit(%)") rotor:mod:setfield("torque limit(%)", 100). if rotor:part:parent:name:contains("bay") { set baymod to rotor:part:parent:getmodule("ModuleAnimateGeneric"). if baymod:hasevent("open") baymod:doevent("open"). } } set props to true. lock rpmtarget to min(459,max(0, throttle * 460)). set props to true. for m in ship:modulesnamed("WBIModuleGeneratorFX") if m:hasevent("activate fusion power") m:doevent("activate fusion power"). on round(time:seconds * 20) { if props { set rpmcopy to rpmtarget. for rotor in rotors { rotor:mod:setfield("rpm limit", rpmcopy ). set calcAirspeed to (2 * constant:pi * (rotor:blades[0]:proprad + rotor:blades[0]:offset) * rpmcopy/60). set deploycopy to max(3, 4.5 + arctan2(airspeed, calcAirspeed)). for blade in rotor:blades { blade:mod:setfield("deploy angle", deploycopy). } } } else { for rotor in rotors { if rotor:mod:hasfield("torque limit(%)") rotor:mod:setfield("torque limit(%)", 0). if rotor:part:parent:name:contains("bay") { set baymod to rotor:part:parent:getmodule("ModuleAnimateGeneric"). if baymod:hasevent("close") baymod:doevent("close"). } } for m in ship:modulesnamed("WBIModuleGeneratorFX") if m:hasevent("deactivate fusion power") m:doevent("deactivate fusion power"). } return props. } } function info { parameter message. set logmessage to round(missionTime,1):ToString():padleft(6) + ": " + message. print logmessage. } function SetAngle { parameter targetangle. for s in servos if s:hasfield("target angle") s:setfield("target angle", targetangle). } print "requires 35360 oxidizer and full liquid fuel". set cam to addons:camera:flightcamera. set cam:mode to "free". wait 1. set cam:heading to 85. set cam:pitch to 15. deploydrills off. radiators off. isru off. fuelcells on. brakes off. for a in ship:modulesnamed("modulefueljettison") a:doevent("jettison tank contents"). thrustlimit(ship:engines, 100). for vec in vectors set vec:gimbal:limit to 10. set steeringmanager:rollcontrolanglerange to 180. brakes off. ImtheRedBaron(). lock x to 90. lock p to 0. lock steering to heading(x,p). lock wheelsteering to x. lock calchead to body:geopositionof(ship:facing:vector):heading. lock throttle to (5-groundspeed)/3. wait until calchead > 80 and calchead < 100. unlock wheelsteering. info("launching"). startup(vectors). thrustlimit(ship:engines, 100). ImtheRedBaron(false). lock rpmtarget to min(460,460*(ship:electriccharge-1000)). lock throttle to 1. lock p to 35. rcs on. setangle(65). when alt:radar > 50 then { info("flight"). setangle(90). for vec in vectors set vec:gimbal:limit to 10. gear off. lock p to max(25,min(80,90-(apoapsis/100e3)*90)). steeringmanager:resetpids(). rcs off. }. lock steering to heading(x,p). steeringmanager:resetpids(). when airspeed > 10 then startup(vectors). when airspeed > 275 then { info("props off"). props off. } when altitude > 14e3 or ship:oxidizer < 100 then {info("nukes"). startup(nukes).} //when apoapsis > body:atm:height-30e3 then lock steering to prograde. when apoapsis > 125e3 and altitude > body:atm:height then { lock steering to srfprograde. if altitude < body:atm:height wait until altitude > body:atm:height. info("warp to circularize"). lock throttle to 0. set warpmode to "rails". set warp to 1. wait 1. warpto(time:seconds + eta:apoapsis - 60). } when ship:liquidfuel < 0.1 then { set remaining to sqrt(body:mu / (ship:obt:apoapsis + body:radius)) - velocity:orbit:mag. print remaining. set ship:name to remaining:tostring(). }