From b554b9442881eb47a6a9289969c8ed57534b8316 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Tue, 5 May 2026 03:34:55 -0400 Subject: [PATCH] added orbit correction + mqx q throttle moderation --- .gitignore | 1 + ayame.ks | 4 +- ayame.ksm | Bin 647 -> 652 bytes faris5.ks | 2 +- genericOrbit.ks | 4 +- genericOrbit.ksm | Bin 821 -> 825 bytes hazuki.ks | 11 ++- hazuki.ksm | Bin 599 -> 709 bytes library/lib_ascent.ks | 131 +++++++++++++++++++++------ library/lib_ascent.ksm | Bin 6192 -> 7900 bytes library/lib_gui.ksm | Bin 1568 -> 1568 bytes library/lib_import.ksm | Bin 617 -> 617 bytes library/lib_math.ksm | Bin 628 -> 628 bytes library/lib_num_to_formatted_str.ksm | Bin 2801 -> 2801 bytes library/lib_orbits.ksm | Bin 414 -> 414 bytes library/lib_staging.ksm | Bin 696 -> 696 bytes library/lib_vessel_utils.ks | 69 ++++++++++++++ library/lib_vessel_utils.ksm | Bin 3505 -> 4574 bytes tests.ks | 3 +- tests.ksm | Bin 251 -> 227 bytes 20 files changed, 186 insertions(+), 39 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..88bf31b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.ksm \ No newline at end of file diff --git a/ayame.ks b/ayame.ks index f8ee633..194772f 100644 --- a/ayame.ks +++ b/ayame.ks @@ -6,7 +6,7 @@ if status = "PRELAUNCH" { CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal"). - set profile to 0.7. + set profile to 0.6. set turn_start to 1000. set target_orbit to 100000. @@ -14,7 +14,7 @@ if status = "PRELAUNCH" { ag1 on. } - Ascent(target_orbit, turn_start, profile, 3). + Ascent(target_orbit, turn_start, profile, 3, 0). wait 30. diff --git a/ayame.ksm b/ayame.ksm index 82512b9680b90d0b41d819e063d3feae923d5d7d..1c10e14b9e9c53a588bca86de82a10443cb51675 100644 GIT binary patch literal 652 zcmV;70(1QziwFRK1o>$I|4oulOcOyA#=q$nW_KwV{u$vQkZdc&5Q-FNh+s*DNQ5a7 z2&5QsX$M$acAMQPgp(c=E}9se9OQ;&mzATcMQPkiGek82jM2`(+pUt6mHyo=>GoerjtmVahtug% zO@kHzk6QNTpvIubTFTD4Z~J=##5Fr8NLO+2dS|=h`HFKZP`0WDF=PJ5)a>Mv$X=_} zPLJxmW!HAphUZIn({UxmQGA_MAc03Kp)M33A0};&buoaL;1~J>;Ghn45)-LQbG0pr*!fH;+u1upjCNq`w%!t7W_v zcq8yO6hAHFtH3vb?=_1;j#4-g_?f~l!D1=a{1w^)x>&bhalx7e$>e7V!7fq;OXdVi zF9|j-*hFY&Q;d|{GFucZFW9PJHwCjp&z;i(r#&$L{~lN%nED&S?uQ8vax^Uc@vD(W zMCj|ra~w9&v+P0Q4B-L>7-0<8ql8)H>j=!FG_7E%@9@qFh(;2Z#PO(R{J;CrPF^tIWjby98RY% zC<>Gic-S!41{DT1(pI)tJk#46ATFCVOFBLWZ?-E{*Yi0yYQE{$YY}bk#$15n+ZA3WoweQ}`uVB*kI}Q0CFax&@01784{>oF&N4&gBFfS`aKP z*u`KymSQu4&Ey&BB;OJ&FWBuMB9H!lQ~;~|UjTCibN^b{cCcY5N1f6ezZ!}nL{B%K zV84~FV-FI?2xl?C2&1?jCS*})A}qn;gd%n|!XEDFg!_2dLU@G7F~T#vK0$bcx9x;? h_|QT4h%cuIUl~75w_at(I|(t?@f+UY=7A*x008J;Fl7J$ diff --git a/faris5.ks b/faris5.ks index 767e99a..3dcb1b3 100644 --- a/faris5.ks +++ b/faris5.ks @@ -4,7 +4,7 @@ WaitForEngineStart(). CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal"). -set profile to 0.7. +set profile to 0.5. set turn_start to 1000. set target_orbit to 120000. diff --git a/genericOrbit.ks b/genericOrbit.ks index 2d6760a..1cefcf4 100644 --- a/genericOrbit.ks +++ b/genericOrbit.ks @@ -6,9 +6,9 @@ if status = "PRELAUNCH" { CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal"). print "Enter Launch Profile: ". - set profile to terminal_input_number(22, 0, 4, 0.7). + set profile to terminal_input_number(22, 0, 6, 0.4). print "Verical Ascent: ". - set turn_start to terminal_input_number(16, 1, 6, 1000). + set turn_start to terminal_input_number(16, 1, 6, 500). print "Target Orbit: ". set target_orbit to terminal_input_number(14, 2, 8, 96000). print "Inclination: ". diff --git a/genericOrbit.ksm b/genericOrbit.ksm index 290018f0d9446f82396a135ca193f482f27f52eb..ad6191237a26d183490517b296b65a0cc2baea2c 100644 GIT binary patch literal 825 zcmV-91IGLxiwFRLU-@YO|4oryXcSiz$IqEv_uk#i#-zpdBSyBcOZCBKLxQEjkA^i; zVLh9sYBYUVCzDZ!OlHqEZ1NN?~M0acE}8C&p@{JE;1ZE;TsxamoO( zsALDq5$UF-B9YzaM03GR>^agjXX{^#tH5@`Fi;}5-t}i(<=D|iA!Y(+p4*XTzTR~F z;`UZWX%@zOE?=x!v2X7$a`ax;b4H3nG?nW|tJlbE0RXa~O@>YG+*$qH-z1i_+ip$a z$8*z;60+2MlSG<5J00cPmRB52b}>?v*&dw-wfT>&=qg3A@*6xYFUaiPZYdt8SXa|- zqVCp0LmQbiaS%b|OHra~1X{%dZS`%B+lbu2*D-mm(h*o8^>ncz2q-;*znxIu7JpC9n~A;I4S3k3fXJkicq!&o3J z5`NH<;1J<3;U`*x8(Wep;W**vZHYxVO}LNHBRtTO%oCmtTiuM?aCb4|9{kh8Sb(R! zjAz*WJ|Hf}rArvgu)n}qgWa<4VR)c(tE#4gYuzUgCBLX^VDisI1B?j0Yk4o}d?m@d^nur+0XSW&VA z<%o2{Qjy3WcB1)UCiWa@nsc>%dsSdNVHhZp+wS@^u5#>Xrw}uNbBx=OX1>;N{Nny* zMQIjBeJ)?DTCr~*DRT6z>p4S3AsWi{qm7$nwg3QG&?e0$H=8_5UyD_(wwqJ<@%*%- zge)~aB#~y<0Y|yE!BZzz{N>uegt9Yv2zU^@@ksJ6rCa;y88-!VM+gH-;9&wc&dzNxfeH3?V z9WRw{q{!QzW2w+qj^l6K#HG@u&S(2~p&9wzh%j}jhhN)`yu6JBUZt`J@&ysjm%+>|U5-Xgr+ zlKf40PdB2oTyIM56F%T0KIHrV262gSnQ&ne|0jIWOmvNKEOESSI|_;8RoihtalCFj z78A#tmP6NgTO%Vq(O#jE{d9#!j*O1h3j1{{Mh|})>ucXbj^FYw0|6le>kLK@e3fQw zhV2=~4ya4UA(+cDJUEkMoQ0n{7#CsDWc&&@@{F5suaof)JXpzi2v52g%kZL`@e(^f z2gH@QdKF_0_7)f$aA7Uu2Ryxw@gx4+!}tY%ThI6%Z}c*5;$QCpDkwZyfdl{mhmU=+ diff --git a/hazuki.ks b/hazuki.ks index 167c291..5e42ff3 100644 --- a/hazuki.ks +++ b/hazuki.ks @@ -6,14 +6,19 @@ if status = "PRELAUNCH" { CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal"). set profile to 0.7. - set turn_start to 1000. - set target_orbit to 960000. + set turn_start to 500. + set target_orbit to 96000. + set circ to 3. + + if ship:name = "Hazuki 3.5" { + set profile to 0.4. + } when altitude > 80000 then { ag1 on. } - Ascent(target_orbit, turn_start, profile, 3). + Ascent(target_orbit, turn_start, profile, circ). wait 30. diff --git a/hazuki.ksm b/hazuki.ksm index 19c13c98a9146c1678115b2b01eb55c1642edd0d..6b7988f1920cd82f48a1ef99322424f3b88f0604 100644 GIT binary patch literal 709 zcmV;$0y_O4iwFSPQ~7BC|4oz4PZL2H#-Cv;vs)I7C{fW!FS2lG@D-Lqq|<7|jg4$EZnJKh~^D=U6hGOe7Pj z!Qr$Lfzk#ZG0aL*VNmsM+q&YJ-nA3NCDSiTC*a`i)^gqT0?rLTFoTA#YqN9N-1vDh zG1bbQ$*8=$X<9+q^`uj=97#ITZ!?PI;E{T0XcZYOyQPLLRb8*;=Vv{)D1G1cc=V*@ zlq^pcgVUUsTzQqUs(NR>E}hsp=`CB1X-CVgu{Fw7qwcw7%a+;?2Jj9eXn4+2E1`xa zwc2UWnvyNK-W4m*!dnO{vAiO|uUd5;am;0@N2ko|jhYo3Jf3cKkYi)IQBqYt6;Wq9@3HNZngRq7NorH&Y))ub;$@csPO_{fB)vGjC&J=v<84kMFQ)#c7&)8?QM%-XlQISKR%YvPiPvn z6j<7FYNHxKH@keV5;@VGVRddeaa9D8fwg+O^)Ql*S+R6vBQ}kt<=JB42A`R4N?#n; zS=XN9$*nLFLCp(<;wgTMRaF2>*OSDk3Ar1(4PWS{xl>wMio&Xh<1k{GDKBunNL1w| z#@tZcR;s$$UaE^AdtF4kUf}qdt>!wOX1Z06!Y$7i#uw#`wOO(e1shF4<6vJoZMW22 ziEV^Y#gpl7H3Z#AM!{PDI?~NErKFTCRJT2)=AO?k3tu>~7u2#dVIZT>j~S~+ULXes zb=~Zk@xxgB|BKEt@pePH;a)H>XwUtC#*yLZDcr_bx "DONE" { + if ASCENT_STATE <> "Done" { preserve. } } WaitForEngineStart(). + lock steering to heading(90, 90, 270). - - lock steering to heading(head, tgtPitch, 270). - - local lock asccent_prog to Map(apoapsis, 0, targetOrbit, 0.0, 1.0). + local lock asccent_prog to Map(apoapsis, vericalAscent, targetOrbit, 0.0, 1.0). SetState("Vertical Ascent"). wait until altitude > vericalAscent and asccent_prog > 0. SetState("Gravity Turn"). - local lock ease to EaseOutExp(asccent_prog, ascentProfile). + lock ease to EaseOutExp(asccent_prog, ascentProfile). lock tgtPitch to (1 - ease) * 90. + lock steering to heading(head, tgtPitch, 270). + - //Auto Staging when periapsis < targetOrbit then{ AutoStage(). wait 0.01. - if ASCENT_STATE <> "DONE" { + if ASCENT_STATE <> "Done" { preserve. } } @@ -74,6 +77,11 @@ declare function Ascent{ CreateCircularizationNode(apoapsis). } + if periapsis < 80000 { + SetState("Orbit Correction"). + FixOrbitalInsertion(). + } + SetState("Done"). unlock steering. unlock throttle. @@ -81,6 +89,17 @@ declare function Ascent{ wait until throttle = 0. } + +local function GetThrottle{ + local parameter maxQ. + lock curQ to ship:q * constant:ATMtokPa. + if curQ > maxQ { + return min(1, max(0.5, Map(curQ, maxQ, maxQ * 1.2, 1, 0))). + }else { + return 1. + } +} + local function Circularize{ parameter tgt, head. @@ -114,8 +133,9 @@ local function Circularize{ local function CircularizeBrute{ parameter tgt, head. lock throttle to 1. - lock steering to heading(head, 0, 270). - wait until periapsis >= tgt. + local lock aoa to vAng(heading(head, 0, 270):forevector, ship:velocity:surface). + lock steering to heading(head, -aoa, 270). + wait until periapsis >= 80000. lock throttle to 0. } @@ -133,7 +153,7 @@ local function CreateCircularizationNode{ PrintRightAligned(c, 12, c - 2, burnDurationSI). if hasNode { PrintRightAligned(2, 13, c - 4, si_formatting(nextNode:deltav:mag, "m/s")). - PrintRightAligned(c, 13, c - 2, time_formatting(circNode:eta - burnDuration /2, 0, 0, true, false)). + PrintRightAligned(c, 13, c - 2, time_formatting(nextNode:eta - burnDuration /2, 0, 0, true, false)). } wait 0.01. if ASCENT_STATE = "Circularization" { @@ -150,11 +170,18 @@ local function CreateCircularizationNode{ lock steering to circNode:burnvector. set burnDuration to CalculateMultiStageBurnDuration(burnDv). set burnDurationSI to time_formatting(burnDuration). + local burnStart is circNode:eta - burnDuration /2. + if burnStart > 10 { + warpTo(time:seconds + burnStart - 10). + } + wait until circNode:eta <= burnDuration /2. lock throttle to 1. - wait until nextNode:deltav:mag <= 10. - lock throttle to 0.25. - wait until NEXTNODE:deltav:mag <= 1. + wait until nextNode:deltav:mag <= max(20, burnDv * 0.1). + lock throttle to 0.75. + wait until NEXTNODE:deltav:mag <= max(10, burnDv * 0.05). + lock throttle to 0.4. + wait until NEXTNODE:deltav:mag <= max(1, burnDv * 0.01). lock throttle to 0. unlock steering. remove nextNode. @@ -196,6 +223,7 @@ local function PrepareHUD{ PrepareGuidanceHUD(). } + local function PrepareOrbitHUD{ local c is terminal:width /2. print "Altitude:" at (2, 6). @@ -224,12 +252,12 @@ local function PrepareGuidanceHUD{ print "AoA:" at (c, 13). }else if ASCENT_STATE = "Circularization" { + }else if ASCENT_STATE = "Orbit Correction" { + print "Not yet in orbit! Attempting to Correct..." at (2, 12). + }else if ASCENT_STATE = "Done" { - if periapsis > 80000 { - print "Orbit Achieved" at (2, 12). - } else{ - print "Not yet in orbit! Perform corrections manually!" at (2, 12). - } + print "Orbit Achieved" at (2, 12). + } } @@ -245,7 +273,7 @@ local function PrepareCircNodeHUD{ local function RenderHUD{ parameter veriticalAscSI. - parameter tgtPitch. + parameter tgtPitch is 0. local c is terminal:width /2. //Orbit Section @@ -272,11 +300,11 @@ local function RenderHUD{ }else if ASCENT_STATE = "Gravity Turn" { local curPitch is 90 - VANG(ship:up:forevector, ship:facing:forevector). local aoa is vAng(ship:facing:vector, ship:velocity:surface). - local dPitch is tgtPitch - curPitch. - PrintRightAligned(2, 12, c - 4, round(tgtPitch, 2) + "°"). - PrintRightAligned(c, 12, c - 2, round(curPitch, 2) + "°"). - PrintRightAligned(2, 13, c - 4, round(dPitch, 2) + "°"). - PrintRightAligned(c, 13, c - 2, round(aoa, 2) + "°"). + local dPitch is curPitch - tgtPitch. + PrintRightAligned(2, 12, c - 4, " " + round(tgtPitch, 2) + "°"). + PrintRightAligned(c, 12, c - 2, " " + round(curPitch, 2) + "°"). + PrintRightAligned(2, 13, c - 4, " " + round(dPitch, 2) + "°"). + PrintRightAligned(c, 13, c - 2, " " + round(aoa, 2) + "°"). }else if ASCENT_STATE = "Circularization" { }else if ASCENT_STATE = "Done" { @@ -293,7 +321,7 @@ local function SetState{ parameter stateText. set ASCENT_STATE to stateText. ClearArea(2, 11, terminal:width - 4, 6, " "). - PrintCentered(0, 11, terminal:width, "Guidance - " + ASCENT_STATE). + PrintCentered(2, 11, terminal:width - 4, "Guidance - " + ASCENT_STATE). PrepareGuidanceHUD(). } @@ -301,4 +329,47 @@ local function RenderStatusBar{ // ClearArea(2, terminal:height - 3, terminal:width - 4, 1, " "). print "Status: " + status + " " at (2, terminal:height - 3) . PrintRightAligned(2, terminal:height - 3, terminal:width - 4, ship:NAME + " - " + ship:type). +} + +local function FixOrbitalInsertion{ + local parameter tgtAlt. + // Ap is behind ship + if eta:apoapsis < orbit:period / 2 { + print "Performing Radial Correction..." at (2, 13). + lock steering to up. + wait until vAng(ship:facing:forevector, up:forevector) < 2. + lock throttle to 0.2. + wait until eta:apoapsis <= orbit:period / 2. + lock throttle to 0. + lock steering to prograde. + wait until vAng(ship:facing:forevector, prograde:forevector) < 2. + lock throttle to Map(periapsis, 0, tgtAlt, 1, 0.1). + wait until periapsis > tgtAlt. + lock throttle to 0. + }else{ + //Ap is ahead + print "Performing Circularization Correction..." at (2, 13). + local burnDv is CalculateCircularizationDV(tgtAlt, orbit:semimajoraxis). + local burnDuration to CalculateBurnDuration(burnDv). + local circNode is Node(time:seconds + eta:apoapsis, 0, 0, burnDv). + add circNode. + wait 0.01. + lock steering to circNode:burnvector. + local burnStart is circNode:eta - burnDuration /2. + if burnStart > 10 { + warpTo(time:seconds + burnStart - 10). + } + wait until circNode:eta <= burnDuration /2. + lock throttle to 1. + wait until nextNode:deltav:mag <= max(20, burnDv * 0.1). + lock throttle to 0.75. + wait until NEXTNODE:deltav:mag <= max(10, burnDv * 0.05). + lock throttle to 0.4. + wait until NEXTNODE:deltav:mag <= max(1, burnDv * 0.01). + lock throttle to 0. + unlock steering. + remove nextNode. + wait 0.01. + wait until throttle = 0. + } } \ No newline at end of file diff --git a/library/lib_ascent.ksm b/library/lib_ascent.ksm index 1264f9c28f03cdbde38598a728174a0d95637942..c9bf3bf37f8afa6fe6b285ea128a1424e7934d8a 100644 GIT binary patch literal 7900 zcmV<29wXr&iwFP;WBF+S|BYA)m=jgDu1Y1Ts-&{_3JMV##MXxF8=KAQ0v8m-rbO-P zq`EuM-D%Qk5R`eNBb)1pisCY(GYTs1^Kb)3N1x+1(a{0dad#A4+jUS>-hZo-CJ8w2 zNMcu%e~o5|(6)K*`Un)LYO3HFT)CB7Y;tGG(hHp=2Z(Oto`%ZD}AF5E*>Rcv6vgD5XTg+z^JV*Vw`V ze;J38iUy*Aq>npNpAH5^wo*zY+U{#h`BiRMfhSrv9Zts8SlH+1ybL#7U2Av~ZzC$wF2KlKdcdR}giIh#Z`P67E8uW3; z>C;i4h0#8HCYSN~V@kU}!1A^y#=y;4KZkYBsI(_NDuH zz9H9xkU=XK7bsJj4SQ!zIKk+^@{lf z(T=#`#ZFa8foIGyW&DA7ET|^q5zeab9SG7er@ZvWi#s)ztx>{lZEf&1&ckqSeOU+& zQpys9c|z?el^a@!?Qr?LKd1!Z%L+F__hg@6p!+HrrF^UQU@)3&i$u9&3i0K~`IG5v zvL};Lc}rV=wr81|%w@7=tD=bNNI(g5ClsO}#B&Y(y=6Qhr9B)H&dn+KX^3~1OqX6yGzuZbIi2E%8HtDY0P>G7 zp!$7bPSCF_9uOcw>CNbIW^Y)Ag-N9g%dm=<8gfb&sW+2tOXv8S3Sp(1#NtTOrSm#9 z$~&kNLhZPkgrfu^oT%TRFM=Demn~`3pYe#N_H-8vP8VnTbLu(0yuBc(WY>T%h)bk& z{mIX}^z}4emA1B&8gAF!C8j~xFW$6<)%OpF#XW`K3xwmAp!WHCvi2OIV(G2xPf_03 zknYhRqJGhVcoHPGo456)&u-6TyOmsyn%`M&yuLKc(j`8hpJj~0=ptSyMmX=vWjZ># z)b_3wZ7Y_iv+9^*1X#N_tM)2cwX;9fs4ex!jaAx0_i`nj!(M7nN4iJt!>#0W2E>6- zylz2qEKsvKs)Dy!zd-ncnge?dIYq09xa_W6I@h1lOco3V1fzk`%@7Ru1xcEjRhFf5 zE4=gJ>VmdMD5A}VgMxq^rot@!T}n2+Qpu$=J=#<}%sHu&n$7e{wJnQl(@qfzM8x7A zAzzepfz?*Z+9=X=2X`3Skj$#kHCes~jlD+k*D?L(Lcus!g$r=bp-$W238IhwC3UFn`aYKu%yqaYclWqMRW(2f&ANIR1K*`+jY)flu>{9FygRqMi|IBY{- zXS$bXm(tMB^uT&Bq@d)wbD1T*3U4ngF7d-qRC5^6^(Q}HQ_`=r`kPc=8w#8f(57P{ zq-M(8s3{co2f13DzEG*(nN0OW--EQ47ipiEJ&j^S%ctVYH9+fk-`ipCN0!%dMu zvE108<`k%03~RArxsvV8rMp#H74%@X^{L(IZe?*MtDFOtA#fTh`4Ho$mZAF6yq8)g z@WThWx^eV0Ow*xibNyM}8*B|_kLHxxl~W)A$IViIG&f|`Zb*`jI2{_nXT7 zYj|Gc(ybQ>#knIG&Ds%v+;VQ!-80`^dEsP<@9kXCmrfQ9)D1tQRe>6c=lfJ#eyWcb zG}~ngl7ewv3~f&xC?Bmse^Yxj6${3d7VGD^HD0tYeD(xg8G_@R|yg{x1deC?rdSk>FeuJTcj!y=j- z=H@Y9oJO3PE~d%Nq@-}4l;oiHElr#p^;U}}O3Q4brI0ORu>jXd6NA{$qn?w~YA_nV z4neFcaKwE+M2_AS-mWF@cp#t~BOVIT-2^yXW|^)6h%rB3eK5;XLk6P3KrEzk<8*%4A=Mtb(A=q}J34cc&D)&Ldgm)kGTu4!yu2lqRhBPL_oOn*1xe5|E_GDF zyF8ui^eSG->D6n2w@}c=3KFlSEy`x}DmkxYc>G?;NRXcjjRtBR^#auB2lAw7 z-Wi!}Qq{;b)d27&<7Xu26y&*-cWN;zQ(SLpFh~W!Rd5!M8kd^qk)2fVo35D2DF&~?Rup# zCBiBbT&2|N!M3HeTot6peL-$6Q+x>c3xiOwFo=W;7ZvdNpplhDo4G_)dz+Sbsy$6j zh_0AFjJAR^(Mn})81!wug%1TeGgH1K>I=d=KHQ^(I~SGyTt@4pH2z4OvoT1L2l*rD zn*Exf(R2r)p;PJ8N+Es23P!l2HCMJ4{*Msh#xS~(f?(BiFIr$vSGo=4lLnY(nOQ(*7GkDVqo^{ol36vt z{CbeGR%ULXl;4B0S)*)~na3#Qi9w!cW#(<>y#eN5gFK(gECUM56?s^T%noNq46vgH zDaXldGo?%`u3}G?*;YzPwi0%+M(LB;b(C^3C>u1&^)h=8rQAO#=V6(Bo_%qE-36XE zG|C4u`#q)nSmZHqvY`$X!_Zb@7(ompK_`ZB*q0b$u!o^ph8rm5_eC8In`OgxO8Ik9N5hk{;dM%Rb5PC)tpkRA#Bg9XXBla%D=m0mdxQLr3a|?{nrvJMuP{PcWAZTbDcQIJ9$`EW^S{wHxsYzM zdS)5dC9?5m+^+E!aBYnkAJB-8%f?r5EymYDd{?7!@v%FnIDWTF(4Q#Or)$xUNQ z7MjMj4w$AA(@DBLOs5gkBF*ZiaUs(p%{Hb^*>pb6Zn_YXE+(c+i0K+)+Cr6QHV-<6 zX&VIPiD_3s(EGY!O&`mq{d6(ZFq??kj0I+%m}@B>O&6Mjtpnz%#9Yw8e2Tu%+#)kW z>GTpMVa^isiWburjDAJTt6NOhU~~~NU(sT&#ppWd(PF+CquZcVi}@amwh{A=7G^Xy z{R>ss{5ak3$rkf2da>qvCbSrBd4_XuU&vKGZ{9P{Gtc}bF@HzQ|0eG3VCC64d2SS@ zal?ESJuMYdOUyT8F`ciT^E^Lto_jmrNceG-;KPEQSYTT8JU>mB$Dd62SqJ5rI^Ek_ zaCUwH;ZLWu&N+n7oksW-5RPW)Lc(9HTZd_F9?xGwJo6I#6@Hjn3|#a|SbMJinLn@B`raR_1@CJO>7O1g3;X zaDZp8Y>YEQ^Twmf&m~lqo{I?8I1XK3L)X((B?PA=gqSQ$#s7i`ZZrMiOw>uS~%iI98P~m&t`^F1B*?v7=jF% zo++VHb1^D2tDuHBr$t6 zI$*6QRx9=C2Brxh~gQkj*xuRE^uRZP`ap|y zhxYpv&Hv)7&s$$TnD~%hglC9{bEs~qi@37{C zG*Xrt*%3r)D(E7)Ct#xBiMk0-D_cDcYx3-I<;Ii79^#48I2vwJf=H8zbUZz}AvQ_N z7mzSL&z@W%Vb*_;FdHgS2@)BUaC)BYtB`Qke~@stmeOGURf7`X0@qha=qQz-Wp1hS zFl9+fLoz7RV(nh^t#SurTdgsg6@VX2z}4tI63tT5_eA=E*f?7L2AOTf z3A7y{HjBorr#LX%>@BvcVtKUS6^eJLnLTp{cR;BGEIEp*1p~thWEu7Fs3#;u4(6{P2wn)E|(*FcHRo(Uk1}{?v z_(0{tS2TgI7U^#i+s6}%i@z_}5>~XWop{L7ALwBJAz8xilI=~nDZ8(=JO|jL#2%x^ zu}>`=$9@8_pGfG`AmwyoZ_#+pEK=HtJ*n{wQqsh}SmVhQDY+ugAf=z!muWl~6e(+o zeVxWrpd6z2M%liN>itlK-nNg4{n6Dcvzg9Q}t^Oz46B`(($>lq_t7MaPUmO&52JOu&coxy#(b+L2 z;an^`mpZG6GpGCOpzwa3l^WW)Qg)tCc`mHrS*;f_t=6XzP;(FYY+ORIN<0=ipg z21Tu>qMR3%h$7Cb^pG2Ud@$`pX~cr_XDVU=lvECxE~^Z# zw!^1>S5kKU7v1XuY_y)ZE+Ve0CJ@(++Kualq|l=y+FiGoQA_s1WxDPlu6rkFqiqMx zQNG!B+4Tn9?5!5VxYlC3zcS+b7fl3H60Xl=_C?nl#PtnveOsDm^2W!@yFho%AuY1I zcF^I7@!g`^LCTbbyDrZ@T;BG$hab{7Rj4y9;r8a)4=R=&UH+o>VTD>_4pr-zgKC*f z6SoX5yYwmZ;rb^q-C8&AGc< z@15N}^i|Ql`v2(6-D}D_bCa{;@N3Hs|4ZGsd!6jQ+^~wcH~jy*Z}+;qq2iUAu}p=M5EalI|P+gM=Fo>Au~+%NsUVNVxSsNZ5Qx_wC-2H#}J(;qF7aZ}&Zi z>Av0f9@>4o?>pFiyYD|ttvBy!OK@I@0*SaE*0>iM4q&@Mo>GQKz+hUm&~#EM1IA~8 zMWcYR#l2H@?_!3w689^_you|f93|m_KG8^*2s;9@;^kGux}%WQJ&E#a zVSTDNF+Sm$E_-HqBE&PNyh?cH9=zZ3+Uhx_yheCVrJM)-zYtCC?fS)*_6vnW(t_bR zP4+CpzBr`ETR5c0J9tR?JK#B6W+ri#yt##PwdaL*+}m52ad|Nc6qvlV3CQoxThE}+ zHF@bg`dpp2yMVSQ^7f4s_vankfYzJxj-P?<*Yd7L%Ga59C4sKmylXpMzW^5OC7z}9 zLe}7zml4n9#qrI=^M~Si2l4DIj$b66mx|+Wi09kF*#2mX?PHv1)HFjaV`L1>P<9Qw zfxVi&h1+MWnFPWSaHTIyw#68ZWhV0;-oFaNC$rOPv5t8V!#^`GSZ7%mKaAnu znRl(1S?@fJH8AfnUstWJ`s3*se#4roc2vDCvj*189$S4xbz%{Q$FUQuPps}(g5e}~ zPR)#(R5ylmS*2!O&E^b-ZERo7vo(8`VwhuB*GjdGb&Qd{oqdG;l-m zOdCx1F2S(Vu$B+-bJt_I&TyA_lsNeg4DU8PZkc3RG> zeXnBpkzs%JtJU9)VK{C$cM3P3JKfk}>=}#4MchT)rQC0gcNp)pFf4a9cY_shBX^es zxSM;>26%}3iyiPd_nZUpH*U8R@G|#L58zGivueQS+`sD?);Qc4Ig&9LqsB?Kf3Dr# z0LowFVIdDr;)RE9Oxn8r>Aj58%>0>+z8 zJOOZ$spUk#LR0rifF9F%Cj(ZQu9ywD&$NR8cA6fY3wX@*{3(DJOs}5`c*FGmJirI0 z4^IPpWcq3W;A^w>bcQuc=7xoUQRb)&h?$Q+o8ine%^7pn+;3iQ{_UBdt~8&27T^N& zx>mpy=35lNt>!n|0B@Q1BmsNPpQiv{n7>p3UzvaCU|62zg-(FTySo9W@C!2lneXle z^zi2{1)RrUoCRFMKh_8M3%@G|*v-G!4|t#dav9(&!ML1Z1(P700}uuK3V=fxwGuE| zNSq58FHHO|z?s703jh}hm;MHDnXqvk!wEMEZwl`S?~C=KcQvScgfG?r288b~Vp#Eb zarPyEZn6I|z?M@aE!0ST%7IY5VW<=+5TNt^P3 z>!jPB2iz{*{Q}?~>50Ds{zrP|MZmMtTQ33LmOl6g;9t^5y8wHnpI!$1Y^#2SVQn?G zrdI)DZIRajQ5$&!Fvqs|O~4Y{`nLfW**3fbxYBn0`+z^#?)m_5x9yRC0k+%z_8}l| zdutEiZQH{Xuvs_mmc2OMpWeF2EuPZ|K6Y@hcPK(?!21KRD`ZvcJv z^S=dLV88M^z*Y9!{tdX@{>VPScKZw81O9G*_Xogx_OJH?zHyj-WLSsUQTr31&T-rU zK$D}HVOhr%$2N0j$pI8bFP6L_J`nbH)(BOlS8IfF9=+M*=oD z|2PbAi*v_tz)t5=Ucl4NPmTh7>im2p;0u?#fn{ADS7bCG>XMHJoZ(t~3}BsWVa10e#gMwgOgHU#kE%Rc~$sY^i=K33$5tA1T1D z>Q~wU|E}RXShhx}sp$mN)-!OaZ4Y2e%`?4#y|vaX%hn!SJGBom zt#(chFt>JIKVW`s`!YaBZF)Its9ju}9by~eIB>vFyP|eu?Txh$4rAEbmuvS92Yg)n znHTVR?T<$ReyTH!VAwjY&NLEWuCqq~{fDU9|Mi7Aki{cq5h~c_0 zndHt)WM(oXnE}+Q4>wS06|suerHXBFMJw7`{0TnAx&(ZpQgLZj+_0?!itpLl`u^wM zBqW2*5Ar|x&i8%i+t0}|K0do~1}E3&yRw;lzT0f`HpRTAH_{%B@jSzGj4Yn!^@XA; z%PA5y!;4z zI~cCoPDFyfjzl=XkF>W#-m2~PXw;YLNSgdH3_r@^2*vzW9LYdO(3_0;`7zdZ*js(P z*`D+#JG@^0M+|?g%@K^sb(H~W4<~|AKR?di4MnQtgRzh|8i@J$6YTA<&%s!KuTHPx zizb8KRL~pX8;X3PszXv{N20$wZ-+Z1s|}?+p0RTfjLD8NagxAWfzIVkGn?-1go1D+ z4DDebFWLMNuOf>LU1lPs$P5+j%=e}9$*xJN3%Qh4x&z4x6RWgDeEtq!DjMNy8NSBO zsz0n$v2;W`QmIfN#1AW`Gg`f$YDWsa?Iu6En2sUx$yj@!BN~qK#~0)2hquXeHrbm= znX;q3KifNCCi9uBTvw^JB0k{=BuaZW#Rm^dlu7c)L@t>$d-F^CvYE~{KZ-CEj`{p4 zUbbTs4Jgo%=*uMfa_O9`HRKc7P7_DAr}Hx3ljxI24AD?|eAFxJ4VC+LyrZ()Oyo>3 zhrB*-M=Y4&75lhYL{Vf{mB=LfJHFyuN4gu1Q{ha1-dx!yyNZe`PmKkUPD;1G(Hbvi zlooNIJrzs(qr7V8%o|f=$>N@*8g@$_VfMGf*d!`NFDBTJN<6Y%aj4%Lrj=OSvnfHj z);64WhCdMv`BNcl2W@RZM7{fJ*47;Ksh`sNbu|niGs#4^EotwC90BX^%jx#_82qDU zV0{Y(WT7G5n^ZKmN7i%cr5%}UPa>bE39qTvmP@lNmGOFgEF+ACw~DNk8bz+nXF5B( z&5rI>?W^?8qG_jR69eh| zD$gR+yLANS9^Ldu6$J;(LL~aT6WR1diF`U^aRee>-bHP+!enon?OBwJCiwaj%i3{O_-XjK7;n(Bt;WiGQB2juypzZ@`wr*ZN8>tM=YB1`V;mr z4kAsc4{!?&WX2`EbTXR|a#QbX44fkN%r zb6^Ot)3 zyr%Jz<(!#B5OT6&g)mdp6!I&mvp$rd9brm~_>j(_Sjvnfl3x3QiqRpNH?uv|Pgz`%PUX8~t|6(&!%7WQ8r!syG{Mu<)C3Vbak;eY zu1X9Dw9F%Z_424aAHujAV3|ZU(7qHCDa4(U+%yiAJW8$R>^2kG9Aael zQbDQ9Om}wWHQh5Ko%JkAEX#OW7kXqzDw|lbBHf$HtWY$?o&mH@6wiuuzRQ#FXf+;t zI(droeX^p-t+WX!o8U?0JsS7y7EK^%w&MMV(Qgf#DBfP<8O=G9=F&4KlTBJPB<8gS zL^KxVPh_;3ncX1QQ+`%O$o525v>jT%zkp0mt+R|a*esB}tc{0AG> z%A=?+T^aCXP}<#4YbFzYeP&A0#8$g)t$L>3m|2kJ+EV(huBN$H6xB%;I#2IUrxLwM z)6?X!FG+ggS#wdTD4WhAmo{e{{5AFvFMZh$g+! z4t^4~!{_x!G{^j`*)%WF-)mimJ`8RCBxoCR4z3M4Qc$uU`|j{qm&fGElU2;vIw3q{FE2+(@Zo54rGoz>@ z!cS)SDfXeh5bwpV%l3ChvMY@ON!j)UcptW=kWAjQ3Wue8JysHq_slo5wD~;A3{Fj2 z-RtQ=ZJ|6?9bb-CMfW3GftVLB?P!Si7rl+5A6n=T_AG|MYD;krU@gwXTxiC#5H6+6 ztSz5N#S*b-J0Gyc!+y*UdeP^LSA8yx5~{UIF-vMLE)|CqdsU*+eRlRjij? zI-8@3rHuvC^9hW9mNt>k?+@}p_{`7k?XbQFqI?JyLjN$`OS9GbstlOjnI!ILS+uV& z${!2!VavdvpN>giz!&8sw8R8Yro*Gw6muQ)M))YkKG)wTJLr3&_@tFkvUHwF0}1Qx z4FmhL*6RwhrpP1b?8>HoWfHiM8d5e#>CZaA7vy6M-^|cItE$2L}7;+>;y_VsU*ev4fb?O zIiroR3oMFZuo+6pmZes;4YKP9yWuSMuEx28>^+3tyz~Ng>n?UxkloyP793@tGT7a4 zi+v4h-XiQi!oEL`{eaz1*g=YisUD6oxZ&KWL2gVN;l@!WW?t3)2?iI1m)t4XpZPue zvkWc{54m%(-~K)ONrPJn%ejlOzdFpVvxpnp2Dyg__qc65_YC27TE=r5gWOKbc*zrlY)x4$i=LEzg4 zg^@%UYwHmv+Ij>pj;GtR63xOHL|72#S*#Wl;rzJJj#ZWjtK$3sR;zJPTv&_M4bT}E zZfPUJ9Ykm+!ksu=_*Gokg5!4ye30EA6vkprgj=S@*?k3uccquGn|BG%Ep)3wfe5b= zVGnVoso1-%L>Q#;f+Bu^2x}ok=?7bP3EwSrrA3K|P7p+`wZJ|FJ>1S+qQ}-Fo=C(A zWjzJ%HCH;0=!t$J2B-)IjX3{oBAyN9Gn&OVB6iyGW#-K|MeHJOwOQ;TVxEZoHhY1e zOI7SG@J~{U_wN#~D4GB@$Slv!Y8J08Fiq9|h&NXHQ{eX(g*}UixSpEmR_!gjY>0Rh z5jPYKgu_hZ>}K&kLwt}KL&QgDEZBW?cT4NJ%%oGq=O~Z(GI(A!#J!Yf-w~d-D|rrp z=Q)GJ%qVcokWhV587d+U!W}AqkjfLuMI^UvkY%+r{AjD;EjC6_Ps@)=>{44B-ELfmuI<`I#za7%?SAj&gaNTTPTT zxGdWLb1~&|@7ThV;WunqCuWGGC9aD_6onU;b#}c)H?gp?sov5b~ z^^A&}XDU(8oQm56cs4rfW&7f#jjMJNwTr0BtqZ2ioSjNT3I>1ErI` zqVB1Oiyo@~q`rOEN*u@7W2Z=Wj0W9tJm_A!@L|zn#bw7)g0m^zF{dPWCUL~4mV`Tt zv7}KvJnbmaF3OiasuvxX8IIeKDaRdc)t%%`~cN|-a?l`s*#}kBZl_}2=$MY7? zOC`!~;&|2KDO27gj=dJoJ0;5dC7v?n1LFA5;`yRP`HDCWTRcU|P`jPH;T#9MosC27 zjuYp}vzwh!!#UkKjyPu$=Pat)*;ZC`iqoWQVgPL2hBHUm28eUT53u!vZLQ(FfwJ91 zoEs|Hi1S|J+(ZpMLV27xw^}?qN|c?%`GUo><0$1DpuAu>Uw4i>LX_Mfnuc>PPQ;9* zlgzo#aK7){OPu?O^P{8eJZw0>rJLUojTy3O|Emg}<}7&B>I6CvInTuVaPc(F|_H*i)9w_yI-fZYIsE;i~pIs4q zqR*L1w2jtG({U?SmRwO9t)VY4^f;vPJ3v3zvf#WheoN9tHx>}l^V8z`B}BibL|juc z^ag7;u5TpzUG^_Q{SxrrP4vxn8J7LOpXd+R9L3ig9qXk)JZM*FIS>y)&G+#=Y}ajB z=_3S3eGlIjyPC`T9wo5wD87m?po#Uz4E+z4k)=(n2Mm3iMI`z&)Yt7tHHW^(&_6|U z=%2^+Lv2Jq6ojn)A1nQ(IZus6?d#t`g^Oz?F8znE0hjCh=e)~pxK6@3uE}l06(X)M zah*1mxaL~fwQr5$8x<|>I=hNmVFnWCT1;H$O|@2uBcZ4|On9!nnca$K1W3fyX}uJd zup98yDDzY@(5s2txrBSXk^yV{0=Fq(jJuW@t}B=^u>NX-pP;U5ta6|cS!2IS5I5J& zbDCYZ8?Jj?S3of6T2`EXu4PBmq91v7X0_`34A(YGHBFLhd$qoo4cBX~ZI-_KO8V~m zVKd(_Tz_L7(Dg-i2`i*nUarCFa#fa;HV!ts{$;p1*WZX+tS(izbmTEt-Pmrqx>(&x z)$4Lv@r~t5+mE`+VO4aJRxa)8(b@GjplW&xrq@RQC;RZ8_y{jO2!R0=-ARUJv z(c;?$c{{}|1^FKo4;GXIK;dA)aT(CzD>!+I>4N41D*l3Y5zw`!pzoplEd`ewsBdp0 z?(xKZBFuA7g|KS`g$1@S(J>lC6v5YcvB~?1H2g@^9bAtS(92z_0WRa#=zz7{dKcg(?w4-B9o)TjfKA-v!vI^k?ZW{(xR*u& z4)E+T499c4T06Sd=V4gh!PiXyH1o430_N~tCjruY-Ve5``0Hzz*IwTY$~ykG(*V!% z`(^^(=09!$e8L}|4ft9R<}j=v3dfud7%fcrF<_!F?F_*ALf4sqw6N?fK)0}h09Fb& zv;uAvHZK6&FKqh>;A!FcMSxd?J!b=67v41(RyoJ z)BX!^syu5ophcd01;fc_$O~$B)c*MfP<|pWy%EqR=hg%A@|8CMu9END0Qj~1=*@t~ z=-jF}I74V@vxDjwr5pQQ$rBR9A0f;Nh?gCt=+Tc51U#)i`+LBDtIz)duv2~ekAQd7FSh}{ayXx6Scm2q_6%US z^gRz)?pXB#;Bv=xe*#?Zxb;QAM#udx0UmH{dj;^cV^;yN z+ws@kfcG7TUIl#V6kcOkr|2B92Qbn(;dQ`7r|(Tb)H!P}pv5`=&wvHarEdY+oXhtC zvd*jD23+I3^&P-Q=R@xT9(F$S9$>rkfBph^&H3S90sEbY-v@lHIX+}q&8Z!?AK=j@ ze*~DKo%S(chIZyBfO*>ap8_t>+CBp$wB!LmO6&d`Ag5jWcfe)ZbzcCk*X|eu+^Ics z5U@qtaR~6Nw&zR0>)JbC13uIa{4d~hZSem92eq&M2{^2?|7KX7(;NQ-7_ZM`SXMtv z?_&YW_0=5U3jKB-@Js#I0^m3LOCsQ9y&wa2=?4|SA=hvR%eqFmVopG_t3wBLy82y! z0oS!|z;&+Q)c_uM{izo4qU*CdzyY^Z&$4dWJ$x8ognQ<2z%2KLBLK_X>qi1^az8Z+ z@JILV(STRo`;P^DO;XhOPD2 z&K?7pQ#n^j6KjyJ;O@L)|Za2Dqi}E*5Zq{Roa>>qpj);{hksPZj`E>YGKtDfM$C!0GirQ2-0; OCJY2n delta 16 XcmZ3$vw(+PzMF$V>eRQ5?2>E%D9{AM diff --git a/library/lib_import.ksm b/library/lib_import.ksm index 4a988bb620fb248ba8730487f98b0cf955d94730..ccc97eb4cf40ea17f2035fbc3a8ec3962449f6b2 100644 GIT binary patch delta 16 XcmaFK@{)yJzMF%AEBWU}_9P|%E`6=jF$D#Q diff --git a/library/lib_math.ksm b/library/lib_math.ksm index 4f0c9c696cb79f6a50332f4cba7a0cbd912b7b34..d660d77df558ebdb030786742f575a0ca97be9a8 100644 GIT binary patch delta 16 Xcmeyu@`Z(6zMF%AEBWU}_FN_aFQElD delta 16 Xcmeyu@`Z(6zMF$V>eRQ5?72(;GHeB_ diff --git a/library/lib_num_to_formatted_str.ksm b/library/lib_num_to_formatted_str.ksm index ed47600f80c55732e5af7bc861a58d1fea1ce31c..a5556077c12ba85aec404cbc1518117fbaae6fcb 100644 GIT binary patch delta 16 Xcmew;`caf!zMF%AJNf5E_E%g0GAsqz delta 16 Xcmew;`caf!zMF$V>eRQ5?60^0H1GyY diff --git a/library/lib_orbits.ksm b/library/lib_orbits.ksm index 221a4db52164b88b1135a1d50580e91bd46e8328..49cebb290a80ed92101816ae895463803e0c20fd 100644 GIT binary patch delta 16 XcmbQoJdc@OzMF%AJNf5E_UViOCCdb} delta 16 XcmbQoJdc@OzMF$V>eRQ5?9&+mD31ju diff --git a/library/lib_staging.ksm b/library/lib_staging.ksm index 75f5590d82d012d303a6e4daef8ee75a358814b5..5848e47aa97bbb8ce914a0c90091d6eca42ff933 100644 GIT binary patch delta 16 XcmdnNx`UNnzMF%AEBWU}_Ki#cDLn-R delta 16 XcmdnNx`UNnzMF$V^3=DD>>HT?ECB_0 diff --git a/library/lib_vessel_utils.ks b/library/lib_vessel_utils.ks index f306083..1a43f42 100644 --- a/library/lib_vessel_utils.ks +++ b/library/lib_vessel_utils.ks @@ -174,6 +174,75 @@ function CalculateMultiStageBurnDuration{ } } +function CalculateMultiStageBurnDurationV2{ + parameter dv. + if ship:STAGEDELTAV(ship:stagenum):current >= dv { + return CalculateBurnDuration(dv, GetIsp(), ship:mass, GetMaxMassFlow()). + }else{ + local bT is 0. + local remDv is dv. + from {local s is ship:stagenum. } until s = -1 step { set s to s-1.} do { + if remDv <= 0 { + return bT. + } + local cdv is ship:stagedeltav(s):current. + local cmass is GetMassOfStage(s). + local cflow is GetMaxMassFlowForStage(s). + local cisp is GetIspForStage(s). + local sdv is 0. + if cdv >= remDv { + set sdv to remDv. + }else{ + set sdv to cdv. + } + set bT to bT + CalculateBurnDuration(sdv, cisp, cmass, cflow). + set remDv to remDv - cdv. + } + return bT. + } +} + +function GetPerStageBurnData{ + parameter pressure is 0. + local data is list(). + local i is 0. + until i >= ship:stagenum { + data:add(lex()). + set data[i]["dv"] to ship:stagedeltav(i):current. + set i to i + 1. + } + LIST PARTS IN allP. + for p in allP { + IF p:ISTYPE("Engine") + { + local t is p:POSSIBLETHRUSTAT(pressure). + if data[p:stage]:haskey("thrust") { + set t to t + data[p:stage]["thrust"]. + } + set data[p:stage]["thrust"] to t. + } + if p:DECOUPLEDIN < p:stage or p:DECOUPLEDIN = p:stage { + local m is p:mass. + print "s: " + p:stage + " d: " + p:DECOUPLEDIN + " n: " + p:name. + local s is max(0, p:stage). + if data[s]:haskey("mass") { + set m to m + data[s]["mass"]. + } + set data[s]["mass"] to m. + } + } + set i to 0. + until i >= ship:stagenum { + if i = 0 { + set data[i]["totalMass"] to data[i]["mass"]. + } else { + set data[i]["totalMass"] to data[i]["mass"] + data[i - 1]["totalMass"]. + } + set i to i+1. + } + return data. +} + function GetThrustOfStage { parameter st, p is 0. diff --git a/library/lib_vessel_utils.ksm b/library/lib_vessel_utils.ksm index e996b9dbd70943509afb442d49e5a6d647521549..dfae5c116c26b48338ce5e9a9329894c3a1744ca 100644 GIT binary patch literal 4574 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 I!SEgc07b&b=Kufz literal 3505 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 diff --git a/tests.ks b/tests.ks index 237cd33..c4a90a3 100644 --- a/tests.ks +++ b/tests.ks @@ -2,4 +2,5 @@ import("library/lib_ascent"). CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal"). -Ascent(95000, 1000, 0.7, 3). + +GetPerStageBurnData(). \ No newline at end of file diff --git a/tests.ksm b/tests.ksm index e81e6db9e951cd815132736f9043d4a5892450f9..94bfc87f2302f5cc0bc46f67a99c3987335a0084 100644 GIT binary patch literal 227 zcmV<90381xiwFRI)%R%t{|$`IO2jY}Mib)n*3toWd;k{)K^Ie9%xVw?f1xIV;)pIZ zZ7)M;o0Qv(Ao|cgf?0jvS)9{~*K2vnVRBIv#i`&-FqY08EbR_7$mkI zJO!8>)}9cy1`}a>jiL9=ro%MPTmAG%zQ%F%1liKM#uC=y9H8;|6)R~z)dRYNXQbXb z)1@$r{(v+Fv&L#et}(&L8+k7u{={20{Zu<@x0FX(%@>Q+Qr)V%QogJz)v7KYt$s@R dtKTzu#W~~2OfbHGoG^ZJ_76s7Mhw~j000+)ZTtWL literal 251 zcmVl2)bz8lq$swc!l_nU}>dY z*fjYqLoO30Q4rm@aqGrs6qi1NgPzSf-{yQdyE_vnlsm^!6zwre7$IJ`TBx~6%yZZF zebS^@wVZHQm9;i4ceYY(kT2DV1%H8Usk6rdy)ew>?TyhXHjOqs7^o^!2GjPC^GxHD zeeuGMtg+f0qA69C6rR7)P~v}EYw+-wuOr`rmHlhQxwsP7KWq|oX0Qw^vDlW-?e)e3 zxPZ%8jK*`wp|C^33%tS`yu(K