From 73868e47dbb7e1361e0ec97acb1cb6abaf7c884e Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Sun, 3 May 2026 04:14:03 -0400 Subject: [PATCH] HUD overhaul. --- ayame.ks | 4 +- ayame.ksm | Bin 0 -> 647 bytes defaults.ks | 9 +- genericOrbit.ks | 5 +- genericOrbit.ksm | Bin 0 -> 821 bytes hazuki.ks | 4 +- hazuki.ksm | Bin 0 -> 599 bytes library/defaults.ks | 4 + library/lib_ascent.ks | 226 +++++++++++++++++++++++---- library/lib_ascent.ksm | Bin 0 -> 6192 bytes library/lib_gui.ks | 89 +++++++++++ library/lib_gui.ksm | Bin 0 -> 1568 bytes library/lib_gui_box.ks | 50 +++--- library/lib_gui_box.ksm | Bin 0 -> 869 bytes library/lib_import.ks | 20 ++- library/lib_import.ksm | Bin 0 -> 617 bytes library/lib_math.ks | 16 +- library/lib_math.ksm | Bin 0 -> 628 bytes library/lib_num_to_formatted_str.ksm | Bin 0 -> 2801 bytes library/lib_orbits.ks | 3 +- library/lib_orbits.ksm | Bin 0 -> 414 bytes library/lib_staging.ks | 8 +- library/lib_staging.ksm | Bin 0 -> 696 bytes library/lib_vessel_utils.ks | 112 ++++++------- library/lib_vessel_utils.ksm | Bin 0 -> 3505 bytes tests.ks | 25 +-- tests.ksm | Bin 0 -> 251 bytes 27 files changed, 397 insertions(+), 178 deletions(-) create mode 100644 ayame.ksm create mode 100644 genericOrbit.ksm create mode 100644 hazuki.ksm create mode 100644 library/defaults.ks create mode 100644 library/lib_ascent.ksm create mode 100644 library/lib_gui.ks create mode 100644 library/lib_gui.ksm create mode 100644 library/lib_gui_box.ksm create mode 100644 library/lib_import.ksm create mode 100644 library/lib_math.ksm create mode 100644 library/lib_num_to_formatted_str.ksm create mode 100644 library/lib_orbits.ksm create mode 100644 library/lib_staging.ksm create mode 100644 library/lib_vessel_utils.ksm create mode 100644 tests.ksm diff --git a/ayame.ks b/ayame.ks index 4a30e68..f8ee633 100644 --- a/ayame.ks +++ b/ayame.ks @@ -8,7 +8,7 @@ if status = "PRELAUNCH" { set profile to 0.7. set turn_start to 1000. - set target_orbit to 120000. + set target_orbit to 100000. when altitude > 80000 then { ag1 on. @@ -16,6 +16,8 @@ if status = "PRELAUNCH" { Ascent(target_orbit, turn_start, profile, 3). + wait 30. + SET V0 TO GETVOICE(0). V0:PLAY( NOTE(400, 2.5) ). diff --git a/ayame.ksm b/ayame.ksm new file mode 100644 index 0000000000000000000000000000000000000000..82512b9680b90d0b41d819e063d3feae923d5d7d GIT binary patch literal 647 zcmV;20(ku&iwFP#u=Z&H|4ow5PZL2D$G_7p%=!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$ literal 0 HcmV?d00001 diff --git a/defaults.ks b/defaults.ks index 642ffd3..f0bcf62 100644 --- a/defaults.ks +++ b/defaults.ks @@ -1,4 +1,7 @@ set terminal:charheight to 20. - -copyPath("0:/library/lib_import", "1:/library/lib_import"). -run "library/lib_import". \ No newline at end of file +if status = "PRELAUNCH" +{ + compile "0:/library/lib_import.ks" to "0:/library/lib_import.ksm". + copyPath("0:/library/lib_import.ksm", "1:/library/lib_import.ksm"). +} +runOncePath("library/lib_import"). \ No newline at end of file diff --git a/genericOrbit.ks b/genericOrbit.ks index 96b8239..2d6760a 100644 --- a/genericOrbit.ks +++ b/genericOrbit.ks @@ -10,20 +10,19 @@ if status = "PRELAUNCH" { print "Verical Ascent: ". set turn_start to terminal_input_number(16, 1, 6, 1000). print "Target Orbit: ". - set target_orbit to terminal_input_number(14, 2, 8, 120000). + set target_orbit to terminal_input_number(14, 2, 8, 96000). print "Inclination: ". set inclination to terminal_input_number(13, 3, 8, 0). print "Circularization: ". set circ to terminal_input_number(17, 4, 8, 3). - print "Waiting for Engine Start...". - WaitForEngineStart(). clearScreen. sas off. Ascent(target_orbit:toscalar(0), turn_start:toscalar(0), profile:toscalar(0), circ:toscalar(0), inclination:toscalar(0)). + wait 30. CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Close Terminal"). sas on. SHUTDOWN. diff --git a/genericOrbit.ksm b/genericOrbit.ksm new file mode 100644 index 0000000000000000000000000000000000000000..290018f0d9446f82396a135ca193f482f27f52eb GIT binary patch literal 821 zcmV-51Iqj#iwFSNd-iDn|4orgZxdG($IlrX-)mUgCBLX^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=+ literal 0 HcmV?d00001 diff --git a/hazuki.ks b/hazuki.ks index c56b6d6..167c291 100644 --- a/hazuki.ks +++ b/hazuki.ks @@ -7,7 +7,7 @@ if status = "PRELAUNCH" { set profile to 0.7. set turn_start to 1000. - set target_orbit to 100000. + set target_orbit to 960000. when altitude > 80000 then { ag1 on. @@ -15,6 +15,8 @@ if status = "PRELAUNCH" { Ascent(target_orbit, turn_start, profile, 3). + wait 30. + print "Orbit Achieved, Releasing Controls". CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Close Terminal"). SHUTDOWN. diff --git a/hazuki.ksm b/hazuki.ksm new file mode 100644 index 0000000000000000000000000000000000000000..19c13c98a9146c1678115b2b01eb55c1642edd0d GIT binary patch literal 599 zcmV-d0;v5TiwFQ2%Jyjh|4mTOPZL2D{$95*yJaB+;o^m2b`gw(AC^i85i3G4lqmrX zq$I+&JCv1Wx7nRaycjRyMK5|$PjK?C(L3JtsQ-WxFaAh8c`?pbW0*|d%=_Lq@0;)K zXlt`}A;nrQkBp3rGQ)Cw>B)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" { + preserve. + } + } + WaitForEngineStart(). + + lock steering to heading(head, tgtPitch, 270). local lock asccent_prog to Map(apoapsis, 0, targetOrbit, 0.0, 1.0). + SetState("Vertical Ascent"). wait until altitude > vericalAscent and asccent_prog > 0. - print "Start Gravity turn. Target Apoapsis: " + targetOrbit. + SetState("Gravity Turn"). local lock ease to EaseOutExp(asccent_prog, ascentProfile). - local lock tgtPitch to (1 - ease) * 90. + lock tgtPitch to (1 - ease) * 90. - when periapsis < targetOrbit then { - print "P: " + round(asccent_prog, 2) + " T:" + round(ease, 2) + " Pitch: " + round(tgtPitch, 2) + " " at(0, 3). - print "Ap: " + round(apoapsis, 2) + " Pe:" + round(periapsis, 2) + " Alt: " + round(altitude, 2) + " " at(0, 4). - wait 0.1. - if not isDone{ - preserve. - } - } + //Auto Staging when periapsis < targetOrbit then{ AutoStage(). wait 0.01. - if not isDone{ + if ASCENT_STATE <> "DONE" { preserve. } } wait until apoapsis >= targetOrbit. + lock throttle to 0. + unlock tgt_pitch. lock tgtPitch to 0. unlock steering. + SetState("Circularization"). + if circ = 1 { CircularizeBrute(targetOrbit, head). }else if circ = 2{ @@ -60,12 +72,9 @@ declare function Ascent{ }else if circ = 3 { lock steering to heading(head, 0, 270). CreateCircularizationNode(apoapsis). - // if periapsis < targetOrbit and eta:apoapsis < orbit:period / 2{ - // CreateCircularizationNode(apoapsis). - // } } - set isDone to true. + SetState("Done"). unlock steering. unlock throttle. @@ -73,8 +82,7 @@ declare function Ascent{ } local function Circularize{ - parameter tgt. - parameter head. + parameter tgt, head. lock throttle to 0. lock steering to heading(head, 0, 270). @@ -104,8 +112,7 @@ local function Circularize{ } local function CircularizeBrute{ - parameter tgt. - parameter head. + parameter tgt, head. lock throttle to 1. lock steering to heading(head, 0, 270). wait until periapsis >= tgt. @@ -116,13 +123,33 @@ local function CreateCircularizationNode{ parameter tgt. lock throttle to 0. + local c is terminal:width /2. + PrepareCircNodeHUD(). + local burnDvSI is " ---". + local burnDurationSI is " ---". + local burnDuration is 0. + when true then { + PrintRightAligned(2, 12, c - 4, burnDvSI). + 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)). + } + wait 0.01. + if ASCENT_STATE = "Circularization" { + preserve. + } + } + wait until altitude > 80000. local burnDv is CalculateCircularizationDV(tgt, orbit:semimajoraxis). + set burnDvSI to si_formatting(burnDv, "m/s"). local circNode is Node(time:seconds + eta:apoapsis, 0, 0, burnDv). add circNode. wait 0.01. lock steering to circNode:burnvector. - local burnDuration is CalculateMultiStageBurnDuration(burnDv). + set burnDuration to CalculateMultiStageBurnDuration(burnDv). + set burnDurationSI to time_formatting(burnDuration). wait until circNode:eta <= burnDuration /2. lock throttle to 1. wait until nextNode:deltav:mag <= 10. @@ -133,4 +160,145 @@ local function CreateCircularizationNode{ remove nextNode. wait 0.01. wait until throttle = 0. +} + +local function PrepareHUD{ + parameter targetOrbit, + vericalAscent, + ascentProfile, + circ, + inc. + + clearScreen. + DrawWindow(0, 0, terminal:width, terminal:height, " Air Tako OS "). + + print "Ascent: " + si_formatting(vericalAscent, "m") + " with a " + ascentProfile + " ascent profile." at (2, 1). + print "Orbit: " + si_formatting(targetOrbit, "m") + " at " + inc + "°" at (2, 2). + local circText is "None". + if circ = 1 { + set circText to "Brute Force". + }else if circ = 2{ + set circText to "Blind Calculated". + }else if circ = 3 { + set circText to "Manuever Node". + } + print "Circularization Method: " + circText at (2, 3). + //Orbit Separator + DrawHorizontalLineCapped(0, 4, terminal:width, "┉"). + PrintCentered(0, 5, terminal:width, "Orbit"). + PrepareOrbitHUD(). + //Guidance Separator + DrawHorizontalLineCapped(0, 10, terminal:width, "┉"). + PrintCentered(0, 11, terminal:width, "Guidance - " + ASCENT_STATE). + //Status Bar + DrawHorizontalLineCapped(0, terminal:height - 4, terminal:width, "┉"). + + PrepareGuidanceHUD(). +} + +local function PrepareOrbitHUD{ + local c is terminal:width /2. + print "Altitude:" at (2, 6). + print "Surface Alt:" at (c, 6). + //Ap + print "Ap:" at (2, 7). + print "ETA:" at (c, 7). + //Pe + print "Pe:" at (2, 8). + print "ETA:" at (c, 8). + //Speeds + print "Air Speed:" at (2, 9). + print "Orbit Speed:" at (c, 9). +} + +local function PrepareGuidanceHUD{ + local c is terminal:width /2. + if ASCENT_STATE = "Pre-Launch" { + print "Waiting for engine start..." at (2, 12). + }else if ASCENT_STATE = "Vertical Ascent" { + print "Vertical Ascent:" at (2, 12). + }else if ASCENT_STATE = "Gravity Turn" { + print "Target Pitch:" at (2, 12). + print "Current Pitch:" at (c, 12). + print "Deviation:" at (2, 13). + print "AoA:" at (c, 13). + }else if ASCENT_STATE = "Circularization" { + + }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). + } + } +} + +local function PrepareCircNodeHUD{ + local c is terminal:width /2. + + print "Delta V:" at (2, 12). + print "Duration:" at (c, 12). + print "Burn:" at (2, 13). + print "ETA:" at (c, 13). +} + + +local function RenderHUD{ + parameter veriticalAscSI. + parameter tgtPitch. + + local c is terminal:width /2. + //Orbit Section + //altitude + PrintRightAligned(2, 6, c - 4, si_formatting(altitude, "m")). + PrintRightAligned(c, 6, c - 2, si_formatting(alt:radar, "m")). + //Ap + PrintRightAligned(2, 7, c - 4, si_formatting(apoapsis, "m")). + if airspeed < constant:e { + PrintRightAligned(c, 7, c - 2, "Inf" ). + }else{ + PrintRightAligned(c, 7, c - 2, time_formatting(eta:apoapsis) ). + } + //Pe + PrintRightAligned(2, 8, c - 4, si_formatting(periapsis, "m")). + PrintRightAligned(c, 8, c - 2, time_formatting(eta:periapsis)). + //Speeds + PrintRightAligned(2, 9, c - 4, si_formatting(airspeed, "m/s")). + PrintRightAligned(c, 9, c - 2, si_formatting(ship:velocity:orbit:mag, "m/s")). + + if ASCENT_STATE = "Pre-Launch" { + }else if ASCENT_STATE = "Vertical Ascent" { + print si_formatting(altitude, "m") + " of " + veriticalAscSI at (2 + 16, 12). + }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) + "°"). + }else if ASCENT_STATE = "Circularization" { + + }else if ASCENT_STATE = "Done" { + + } + + + + RenderStatusBar(). +} + + +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). + PrepareGuidanceHUD(). +} + +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). } \ No newline at end of file diff --git a/library/lib_ascent.ksm b/library/lib_ascent.ksm new file mode 100644 index 0000000000000000000000000000000000000000..1264f9c28f03cdbde38598a728174a0d95637942 GIT binary patch literal 6192 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 O= terminal:height { + set h to max(1,min(terminal:height - 2 - y,h)). + } + + DrawHorizontalLineCapped(x, y, w, "━", "┏", "┓"). + DrawHorizontalLineCapped(x, y+h, w, "━", "┗", "┛"). + set i to 0. + until i > h - 2 { + set i to i + 1. + print "┃" at (x, y + i). + print "┃" at (x + w, y + i). + } +} + +function DrawHorizontalLine{ + parameter x,y,w,lineChar is "━". + DrawHorizontalLineCapped(x,y,w,lineChar, lineChar, lineChar). +} + +function DrawHorizontalLineCapped{ + parameter x,y,w,lineChar is "━", capCharLeft is "┣", capCharRight is "┫". + + set i to 0. + local line is "". + until i > w - 1 { + set line to line + lineChar. + set i to i + 1. + } + print line at (x, y). + print capCharLeft at (x, y). + print capCharRight at (x + w -1, y). +} + +function DrawVerticalLineCapped{ + parameter x,y,h,lineChar is "┃", capCharTop is "┳", capCharBottom is "┻". + + if h < 0 or y + h >= terminal:height { + set h to max(1,min(terminal:height - 1 - y,h)). + } + + set i to 1. + until i > h - 2 { + print lineChar at (x, y+i). + set i to i + 1. + } + print capCharTop at (x, y). + print capCharBottom at (x, y + h - 1). +} + +function PrintCentered { + parameter x, y, + w, + text. + set l to text:length. + + print text at (x + (w/2) - (l/2), y). +} + +function PrintRightAligned { + parameter x, y, w, text. + set l to text:length. + + print text at (x + w - l, y). +} + +function ClearArea{ + parameter x, y, w, h, clearChar is " ". + + set j to 0. + local line is "". + until j > w - 1 { + set line to line + clearChar. + set j to j + 1. + } + set i to 0. + until i > h - 1 { + print line at (x,y + i). + set i to i + 1. + } +} \ No newline at end of file diff --git a/library/lib_gui.ksm b/library/lib_gui.ksm new file mode 100644 index 0000000000000000000000000000000000000000..1dd007cc02c0361b99bc1f77062ec69deeeeaea4 GIT binary patch literal 1568 zcmV+*2H*J~iwFQ3%Jyjh|9zHgY*a-Q$Ir~%_HG}%3&oaVfnEBt*G{^rh^`Op8Hdv4opEV$IMn5xr538SMU8V|K~G?XvUnv8IBbI8XiFam1I z)8*ymE|uCl@v|L29r%f;sdh7J#=g5TOy`HF-(YD;0Z7VY-t2% zY-v<(!?lG)2&1#G$d<`&9^NA^uZzneHAk9@v?ZcD+Tx}Wi$&w%CZoL_y~(vl#N`;K z6czGLr^Zr12KK6HG8Mx_Re7}EspgFq!-QM`cc{s$`B^GhB0dS1hPlY|B1Xcd&Ku7N zDg?Y7a;}Vh6>V#w@A?lThBJyCl#^+@= zOV#7I*=*_@;p3%n!i+YJaN+d^nmtX8UX~`;yYR6~NHZ>{JnLgMBYBqD)@}v7BG9c) zOa>a;OtY<3##{jjx0j`ZO_tH+D`y#C4c%x+ojI&y(1yq73izDZfSHz!KslykhC59) zH5QJym=SzhF`Jqz_sN8fShOWB_qu(}{>H{8HbHLHoL-xn)f5XG2_q3UFm8lAVSm8W z$R=6~tU_yUPbSG%)9rGpNCA)7DkI(in`ABZI3)ran{3(Fd`^5MgYQnUnl(nV6{|Dt zV^_Rbon{}EL$RoD(r~e3*?nL-2f*OZ?HJf3-+^uB@eWJnxi zg&%T4lHq-BlFIQ%Sn8=>Tw6iXbutA{7js=zGMdH7^nMkRT7^4FP8}zXf-KO4xg3iV=O6SzUX=#u;akP-rr9rxUpi!tkW}{F; zrxBXP={C_QG?r|XuJIeCYvkjmtvWS@Mu#Z+sE0hX9<-CwU7R|HWlwi=x_oGhbybg@ zJ>8?zVS0?N7Pc!d_@WLQOAOAnsT8lBl@9-b)^c`^H|n zN8IyXdS2YW+)Hl=9&A8i#}Z0_;&+;IM)`vRfpnO~5P9HK5H47jf_N6{RKy0Tw;?t| zYdRthhcXa{;j>IcH(Z#A_#D2Ugt!WQlM#QzqbZ2TWXe?huVO06orai2oLLALSuq{N zZ=uyQ5Nn7&6Je0Z6No6;m4nz#j^-kck>h!Y56DNe5ogJd`G{-e<{ZQ=^2=PrujJu8 z#3Pz&2SQak*@2isXUs=r)4~Eo5v?dhRMK@ti1oC-1QDX!N)a*o##4wRw5JSlf!-=d z+@?Rf5O?Tr8sc{bZXk@X86HG7%l9JYu=zej0rUG20k$T9Sj#q5A{tq=3bB=KUxe7f zUR{jX%TClFPO>vg5a(F;QbZ5?dKuyycIi39Wp=j~agX(_Ks;7bRsvB{l_xnOUvbnS z<|`%7BTAJ;s}WBtwQCT|m9=XT>y(Y_5W2EuJ)%K*aRb6sUV8ztUpW*+99G`i2vj+$ Syr=xB{PiE9bllvV3IG5cU-3i$ literal 0 HcmV?d00001 diff --git a/library/lib_gui_box.ks b/library/lib_gui_box.ks index 75f8fc2..4338963 100644 --- a/library/lib_gui_box.ks +++ b/library/lib_gui_box.ks @@ -5,64 +5,56 @@ function draw_custom_gui_box { parameter - x, y, w, h, - horizontal_char, - vertical_char, - corner_char. - -// Start Input Sanitization + x, y, w, h, + horizontal_char, + vertical_char, + corner_char. if x < 0 or x >= terminal:width { - set x to max(0,min(terminal:width - 1,x)). - HUDTEXT("Error: [draw_custom_gui_box] X value outside terminal.", 10, 2, 30, RED, FALSE). + set x to max(0,min(terminal:width - 1,x)). } if y < 0 or y >= (terminal:height - 1) { - set y to max(0,min(terminal:height - 2,y)). - HUDTEXT("Error: [draw_custom_gui_box] Y value outside terminal", 10, 2, 30, RED, FALSE). + set y to max(0,min(terminal:height - 2,y)). } if w < 1 or x + w > terminal:width { - set w to max(1,min(terminal:width - x,w)). - HUDTEXT("Error: [draw_custom_gui_box] W value outside terminal.", 10, 2, 30, RED, FALSE). + set w to max(1,min(terminal:width - x,w)). } if h < 1 or y + h >= terminal:height { - set h to max(1,min(terminal:height - 1 - y,h)). - HUDTEXT("Error: [draw_custom_gui_box] H value outside terminal.", 10, 2, 30, RED, FALSE). + set h to max(1,min(terminal:height - 1 - y,h)). } - // End Input Sanitization - local horizontal_str is "". local i is 1. until i > w { - if i = 1 or i = w { - set horizontal_str to horizontal_str + corner_char. - } else { - set horizontal_str to horizontal_str + horizontal_char. - } - set i to i + 1. + if i = 1 or i = w { + set horizontal_str to horizontal_str + corner_char. + } else { + set horizontal_str to horizontal_str + horizontal_char. + } + set i to i + 1. } print horizontal_str at(x, y). print horizontal_str at(x, y + h - 1). set i to 1. until i >= h - 1 { - print vertical_char at(x , y + i). - print vertical_char at(x + w - 1, y + i). - set i to i + 1. + print vertical_char at(x , y + i). + print vertical_char at(x + w - 1, y + i). + set i to i + 1. } } function draw_gui_box { parameter - x, y, w, h. + x, y, w, h. draw_custom_gui_box(x, y, w, h, "-", "|", "+"). } function draw_one_char_gui_box { parameter - x, y, w, h, - border_char. + x, y, w, h, + border_char. draw_custom_gui_box(x, y, w, h, border_char, border_char, border_char). -} +} \ No newline at end of file diff --git a/library/lib_gui_box.ksm b/library/lib_gui_box.ksm new file mode 100644 index 0000000000000000000000000000000000000000..074b394373e883ed985429334e6fb9f26fde2aa9 GIT binary patch literal 869 zcmV-r1DgCFiwFSPH1=r#|811nYZFlv#?QIaWD<$i6&J8-GpTL0I!Pv58?{v{)Mdmz z4I|oS89T9>$e7xyeHGtC5g!ymi-OCGxS$A%8@^er3gW-e2Ui3i6!F|UiKf_OW`6gc z`rE(tM$@^*Lwp#P`Uw=I=_-#J?-$(gzwye z=40J^;fK4@UEScfi5~c_^So?YgAe4>fj$%KE5Xi6&^4gRq)^P&aj{re-9m85P8~yk zBRZthl_-p9m2%SJ&3f9g$;37)2}#*o)lXLS7_LT>X}4*$t5d6p@WL>)1J{RoLObZ# zu**b~jt%$J9$UYT`RYDNUI$t_+Byz$)8fwmOiq}1jhoz@a`t$ee4b48x$R!l`tT>! zg6qfWw|`c{;y8A3J{`vsoD=<&5ZcVV!078|TiJjN2s5B@CLsu$XA!z#pq^mE{yBs} zI6aqe2JX%y+=Kf|2@l{=1K}||Uq*NVZqe46Y<77;7fPaa#*vJML;F^rE$jun&)~CXC|wHo^tGvW9RKZ>%NU#5-ZaLwp(` vJi`f%@CHA{2%qssg7BMpl7P(17IhF7vv?X9ORx>hX8ZpDBl!MSSOow88CkKA literal 0 HcmV?d00001 diff --git a/library/lib_import.ks b/library/lib_import.ks index d8b9aaf..474ec65 100644 --- a/library/lib_import.ks +++ b/library/lib_import.ks @@ -1,6 +1,20 @@ declare function import { - parameter import_path. - copyPath("0:/" + import_path, "1:/" + import_path). - runOncePath(import_path). + parameter p, compileImport is true. + if status = "PRELAUNCH" { + if compileImport { + hudtext("Compiling " + p + " to ksm...", 5, 3, 21, yellow, false). + compile "0:/" + p + ".ks" to "0:/" + p + ".ksm". + SET ks TO archive:OPEN(p + ".ks"). + SET ksm TO archive:OPEN(p + ".ksm"). + if ks:size > ksm:size { + copyPath("0:/" + p + ".ksm", "1:/" + p). + } else{ + copyPath("0:/" + p + ".ks", "1:/" + p). + } + } else{ + copyPath("0:/" + p + ".ks", "1:/" + p). + } + } + runOncePath(p). } \ No newline at end of file diff --git a/library/lib_import.ksm b/library/lib_import.ksm new file mode 100644 index 0000000000000000000000000000000000000000..4a988bb620fb248ba8730487f98b0cf955d94730 GIT binary patch literal 617 zcmV-v0+#(BiwFQ2%Jyjh|9y}#OcPNU$N%5GmUk@&iYNv(2IU$l;BmzYQi-7=Mof7a zBB3dXp_ap5+Hws&RM=cxT-1#icX4oGa?v;&2i*m6CL!sHW*pV<$b^R{`ddB z`@buR>_jZB$u_rA^;Y}^`|MI-$tj#0$_ovGAj4y}Z4XM#tTwho%_LjRf>)`!Wv9_3 zrCIay{%XyL+?bijq-WLmwZNRPF9^|?Fp?A@=tgwB-sdjg=`x~SzSmW%RV>SjgaJfE zP>yind23F&?A>dIgp3qd7k%fx-xJpjVW$QRVU=n|h)YE_mA(98Ph9F|ex*=!?>aK% zRh?yBMn~P{MR&z1_?M(GOEq1F%%CAubJv}EqTvw{=0qZq8j#U~S6!>-{UVR5ryUec z&>L46781H195OSujS%MpC*@BzF5erwx(ks*2Re6gB8%>P3TG6oEbIk^F@?#A6mI4) zj}8Spg9g2qpTX6d#DLKMeBjN^!h8NEn0G0tO7GO}3H8S8iwVLZiVl<^X8ni+5L z*Y6X=aFjU~Tfj#GTIXG- zDKIJ(x0*Ag^r{C9%^$t*%q+Q@j5>oV=nQ3*m31xbIt%XX(xSUupQXC&q?2X0l9Mf- zI;Hkn_R>tCom+8U4+xd0kLj#z^|Fj1{RsHf!avW-o%sqqGu2$y$W*IR^D47?8#DjH z-27sHT|Jc{}+39U8C(r}H5V?(riGdRI*tJ+msnRxzN_Ex3xP=J| zlNKBcHEJCbHAZU3O-vAz3ZsYnOxsvhK94P|IYW46V%@?9UDiyzC=TJJjZLgFFCj$n zMZC4~uKB^lmWhoqR*n?%-s%DOZ5unv{VUz+`MoJq&g^QdkiU)}_<2}YyS9+j34gOI z5oEO`LS9!}rU;D`4yshN5rN*|r96=mJq@H4&o(fv7;j)((P&^-acqhPvCBRIAK!qu zAs+f5(2lSqBIs`+;u!Q321YfafSYZ^Ez|?V93C7YR`8^Qc#8EP@f@!@iPzZdBHrNr zQQ`wW9wR>C^Ks$}c0$BA{OTrtV>e9v5&j5xmqgb|A}o4)h%@5cDdM~sK279Bv6pxx OR{jFJXp6Ow0{{Rwi7=r6 literal 0 HcmV?d00001 diff --git a/library/lib_num_to_formatted_str.ksm b/library/lib_num_to_formatted_str.ksm new file mode 100644 index 0000000000000000000000000000000000000000..ed47600f80c55732e5af7bc861a58d1fea1ce31c GIT binary patch literal 2801 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 DXiRMe literal 0 HcmV?d00001 diff --git a/library/lib_orbits.ks b/library/lib_orbits.ks index aeb2cc1..f4d17d5 100644 --- a/library/lib_orbits.ks +++ b/library/lib_orbits.ks @@ -1,6 +1,5 @@ declare function CalculateCircularizationDV{ - parameter ap is 0. - parameter sma is 0. + parameter ap is 0, sma is 0. local mu is body:mu. if ap = 0 { set ap to apoapsis. diff --git a/library/lib_orbits.ksm b/library/lib_orbits.ksm new file mode 100644 index 0000000000000000000000000000000000000000..221a4db52164b88b1135a1d50580e91bd46e8328 GIT binary patch literal 414 zcmV;P0b%|hiwFQ3%Jyjh|8{(&Qt#*tYU7Y7Fy6XT!oCwQx~cQ_x-=7TZnkn-`BzmqGKSeoFvh}<%5$%kp;)&j#s4h#83BubSjYeZW;SHB&%p1bzx>@B} z0nrpTth{L%CDU@P`jlKD?KSuBIpgIS4|vFcXxT58%O`tvW6Dr+ zvZqoz78SK&Tc67tw(H0_cOr#LfH@=XG3xo7j{ckR7Dm}w!CH9X3=tOiC*E$74%u7ShhV9Z)oS7 zl1bSIe`Oty`bh-MQcgGLOe?>8y0NM5?o=`tldCIkiXx)q+)S> za$1pVDxN(tXOFuV)gcIwC_`kTnDm+Cs~OiW4eMD(D(P3hCiAMm1bP zP{p`oxOP!R?($WHc&aF7U`K`{87ISnh9xJ%gDjRg$rBY%oq&}DRyAy3NyVyyPg!iL z*i^8c#!qKKo-Fw_3SdJeze0^FmIu?+tWhfkTuUTPr`(0oNBt^YO4B)wRBGjA1{;+| zc=pj)+-Zrl%--H;T%!f_QW1_QKN^B`e+~3d20y4Ug!T@OVHzWEHIH?r*Y@| z#X2oITyp{=0}?^vr;d)(pu`tmkFd;$pwq+XLbsO@L!ye2#AzR602itmBN+8F#xPOK z(6Ly@xP!a(j3qofz<7?82F5GA4lv%}?Lo#ntQ}&!$A?D7M|^H#e8JZvjBofJWc!p0{{S}PgE5E literal 0 HcmV?d00001 diff --git a/library/lib_vessel_utils.ks b/library/lib_vessel_utils.ks index f73c490..f306083 100644 --- a/library/lib_vessel_utils.ks +++ b/library/lib_vessel_utils.ks @@ -4,14 +4,13 @@ declare function WaitForEngineStart{ } declare function GetDrag{ - parameter localGravity. - return ship:sensors:acc:mag + localGravity. + parameter lg. + return ship:sensors:acc:mag + lg. } declare function GetDragDir{ - parameter localGravity. - parameter dir. - return vDot(ship:sensors:acc, dir) + localGravity. + parameter lg, dir. + return vDot(ship:sensors:acc, dir) + lg. } declare function AnyEngineActive{ @@ -41,19 +40,18 @@ declare function GetIsp{ } declare function GetIspForStage{ - parameter engineStage. - parameter pressure is 0. + parameter eS, p is 0. LIST ENGINES IN egs. - local totalThrust is GetThrustOfStage(engineStage, pressure). + local totalThrust is GetThrustOfStage(eS, p). if totalThrust = 0{ return 0. } local sum is 0. local weights is 0. for eng in egs{ - if eng:stage = engineStage { - local w is eng:POSSIBLETHRUSTAT(pressure) / totalThrust. - local ispW is eng:ispat(pressure) * w. + if eng:stage = eS { + local w is eng:POSSIBLETHRUSTAT(p) / totalThrust. + local ispW is eng:ispat(p) * w. set sum to sum + ispW. set weights to weights + w. } @@ -73,70 +71,56 @@ declare function GetMaxMassFlow{ } declare function GetMaxMassFlowForStage{ - parameter engineStage. + parameter eS. LIST ENGINES IN egs. local sum is 0. for eng in egs{ - if eng:stage = engineStage { + if eng:stage = eS { set sum to sum + eng:maxmassflow. } } return sum. } - - - -declare function CalculateSuicideBurnDuration -{ +declare function CalculateSuicideBurnDuration{ parameter isp. return CalculateBurnDuration(verticalSpeed, isp, ship:mass, GetMaxMassFlow() * 1000). } -declare function CalculateBurnDuration -{ - parameter dv. - parameter burnIsp. - parameter initialMass. - parameter massFlow. +declare function CalculateBurnDuration{ + parameter dv, burnIsp, iM, mF. if burnIsp = 0 { return 0. } set dv to abs(dv). local exp is -dv / (burnIsp * constant:g0). - local massRatio is constant:e ^ (-exp). - local finalMass is initialMass / massRatio. - local fuelUsed is initialMass - finalMass. + local mR is constant:e ^ (-exp). + local fM is iM / mR. + local f is iM - fM. - if massFlow <= 0{ + if mF <= 0{ return 0. } - return fuelUsed / massFlow. + return f / mF. } - declare function CalculateSuicideBurnAltitude { - parameter vertSpeed. - parameter localGravity. - parameter tgtAltitude is 0.0. - parameter drag is 0.0. + parameter vS, lg, cAlt is 0.0, drag is 0.0. - local vertAcc is CalculateAverageDecceleration(localGravity, drag). - local burnAltitude is ((vertSpeed^2) / (2 * (vertAcc))). - return burnAltitude + tgtAltitude. + local vertAcc is CalculateAverageDecceleration(lg, drag). + local burnAltitude is ((vS^2) / (2 * (vertAcc))). + return burnAltitude + cAlt. } - - declare function CalculateAverageDecceleration{ - parameter localGravity. - parameter drag is 0. - local maxVertAcc is (ship:availablethrust / ship:mass) - localGravity. + parameter lg. + parameter d is 0. + local maxVertAcc is (ship:availablethrust / ship:mass) - lg. - return maxVertAcc + drag. + return maxVertAcc + d. } declare function GetLocalGravity{ @@ -149,20 +133,17 @@ declare function GetLocalGravity{ } declare function CalculateTimeToImpact{ - parameter vertSpeed. - parameter curAltitude. - parameter gravity. - parameter tgtAltitude is 0.0. + parameter vS, cAlt, cG, tAlt is 0.0. - if gravity <= 0 or curAltitude <= 0{ + if cG <= 0 or cAlt <= 0{ return 0.0. } - local vs is abs(vertSpeed). - local g is gravity. - local hRel is curAltitude - tgtAltitude. - local disc is ((vs^2) + (2 * g * hRel)). - return (vs + sqrt(disc)) / g. + set vS to abs(vS). + local g is cG. + local hRel is cAlt - tAlt. + local disc is ((vS^2) + (2 * g * hRel)). + return (vS + sqrt(disc)) / g. } function CalculateMultiStageBurnDuration{ @@ -170,54 +151,51 @@ function CalculateMultiStageBurnDuration{ if ship:STAGEDELTAV(ship:stagenum):current >= dv { return CalculateBurnDuration(dv, GetIsp(), ship:mass, GetMaxMassFlow()). }else{ - local burnTime is 0. + 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 burnTime. + 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. - print cdv. if cdv >= remDv { set sdv to remDv. }else{ set sdv to cdv. } - set burnTime to burnTime + CalculateBurnDuration(sdv, cisp, cmass, cflow). + set bT to bT + CalculateBurnDuration(sdv, cisp, cmass, cflow). set remDv to remDv - cdv. } - return burnTime. + return bT. } } - function GetThrustOfStage { - parameter st. - parameter pressure is 0. + parameter st, p is 0. - local totalThrust is 0. + local tTh is 0. LIST ENGINES IN egs. for eng in egs{ if eng:stage = st { - set totalThrust to totalThrust + eng:POSSIBLETHRUSTAT(pressure). + set tTh to tTh + eng:POSSIBLETHRUSTAT(p). } } - return totalThrust. + return tTh. } function GetMassOfStage { parameter st. - local total is 0. + local sum is 0. LIST PARTS IN allP. for p in allP { if p:stage <= st and p:DECOUPLEDIN < st { - set total to total + p:mass. + set sum to sum + p:mass. } } - return total. + return sum. } \ No newline at end of file diff --git a/library/lib_vessel_utils.ksm b/library/lib_vessel_utils.ksm new file mode 100644 index 0000000000000000000000000000000000000000..e996b9dbd70943509afb442d49e5a6d647521549 GIT binary patch literal 3505 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 literal 0 HcmV?d00001 diff --git a/tests.ks b/tests.ks index a971ce7..237cd33 100644 --- a/tests.ks +++ b/tests.ks @@ -1,26 +1,5 @@ -import("library/lib_vessel_utils"). +import("library/lib_ascent"). CORE:PART:GETMODULE("kOSProcessor"):DOEVENT("Open Terminal"). -print "Waiting for Engine start". -WaitForEngineStart(). - - -function printStatge { - parameter s is ship:stagenum. - local curDv is ship:STAGEDELTAV(s):current. - local isp is GetIspForStage(s). - local smass is GetMassOfStage(s). - local flow is GetMaxMassFlowForStage(s). - local thrust is GetThrustOfStage(s). - - print "------ Stage: " + s + " ------". - print "Thrust: " + thrust + "kN Mass: " + round(smass, 3) + "t". - print "DV: " + round(curDv, 2) + "m/s ISP: " + round(isp, 2) + "s Flow: " + round(flow, 4) + "Mg/s". - print "Burn Duration: " + round(CalculateBurnDuration(curDv, isp, smass, flow), 2). -} - -// printStatge(ship:stagenum). -// printStatge(ship:stagenum - 1). - -print "Total Burn Time: " + CalculateMultiStageBurnDuration(ship:deltav:current). \ No newline at end of file +Ascent(95000, 1000, 0.7, 3). diff --git a/tests.ksm b/tests.ksm new file mode 100644 index 0000000000000000000000000000000000000000..e81e6db9e951cd815132736f9043d4a5892450f9 GIT binary patch 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