Closed lefouvert closed 6 months ago
If I may add:
ENGINES: access to engine's thrust limiter (R/W). WARP: it's possible to get current_rate and current_index of the actual warp. Is it possible to change them?
@lefouvert I don't understand how Resource and EngineFuel work. What are the numbers next to the resources?
@PhilouDS The numbers in Resource are the ingame ids of the resources.
When you look at a part's resources, you may access to this id
part.resources.list.map(fn(r) -> r.resource.id)
ResourceContainer
ResourceData
ResourceDefinition
Displayed names are more user friendly, but id's are more efficient to link datas.
EngineFuel is just an array that describe which engine burn which fuel.
So if I run a «LV-1 'Ant'» engine, I'm able to know it's a Methalox
engine type
part.engine_module.value.current_engine_mode.engine_type
ModuleEngine
EngineMode
EngineType
which will burn CH4 and Ox. I just have to search for parts inside the decouple stage I consider thoses which have CH4 and Ox.
With thoses two datas, you can know the mass a part will lost, and deduce lot of things as deltaV, isp, burntime etc.
Kontrol System give us access to most of thoses datas, but I gess they are retrieved directly from the game, which implies some are missing.
This nice little thing is able to achieve a circular orbit around Kerbin, at any inclination. However KSP2 and Kontrol System vessel.delta_v.stages[].get_deltav(DeltaVSituation.Vaccum)
are undivided : the 4 firsts stages aren't able to deliver any thrust, and don't provide any delta V.
And I can garantee you that LV-1 'Ant' didn't lift it in the sky.
Thank you for all those explanations. Nice log in the Console. Too bad we can't save that in a txt file... yet ;-) In the BAV, I've created an UI and I compute myself the effective velocity of a stage to calculate then the delta-v. Maybe, I could look deeper of what you did to improve that.
At least, my stage info window (at the bottom) is better than the one from MicroEngineer (which only uses the numbers from KSP).
@untoldwind I see you ^^
Thoses things_array.reduce(<Foobar>[], fn(flat, things) -> flat + things.filter(fn(t) -> t.defined))
seems to had given you some inspiration :)
Thank you very much.
For that and all.
That are a lot of wishes and unluckily I messed my games-saves I use for testing. So there is just a pre-release for now: https://github.com/untoldwind/KontrolSystem2/releases/tag/v0.5.3.5 Updated documentation: https://kontrolsystem2.readthedocs.io/en/prerelease/
From top to bottom (mostly):
I added a .filter_map
to array, which is similar to .map
but the function should return an Option
and only the defined value end up in the result.
vessel.parts.filter_map(fn(part) -> part.solar_panel)
Also added a .flat_map
, in which the function returns an array, that as then concatenated in result.
vessel.parts.flat_map(fn(part) -> part.resources.list)
As for the fairing: I checked the current implementation, part.fairing
seems to be working as intended. Maybe you have a cargo-bay instead, which can be found and controlled via part.deployable
?
As for solar panels: The energy-flow is actually a bit more complicated:
There is now a .base_flow_rate
and .efficiency_multiplier
which seem to be constants of the model
Additionally there is the .star_energy_scale
which changes with the distance to the star (and probably also depends on the type of star once we get the interstellar patch)
The .max_flow
is a shortcut for base_flow_rate * star_energy_scale * efficiency_multiplier
And eventually: .energy_flow
is the current energy flow which is a fraction of .max_flow
depending on sun-exposure (and angle I guess)
As for the propellant/resource information of the engine: Again a bit more complicated
There is now a .current_propellant
which is the currently used propellant depending on the engine mode
Additionally .propellants
returns all the potential propellants in the same order as .engine_modes
(if the engine only has one mode there should be only one element)
Unluckily it gets even more complicated: The propellant might be a mixture different resources.
E.g. most engines will have .current_propellant.name == "Methalox"
, which is a mix of two resources
In these cases .current_propellant.is_recipe
is true
and .current_propellant.recipe_ingredients
will contain a list of all the ingredients and their ratio.
The heatshield has been added with some basic fields: is_deployed
is_ablating
is_ablator_exhausted
ablator_ratio
... maybe this can be a bit more detailed
As for the thrust limiter: This should now be tweakable via engine.thrust_limiter
As for warp: Some basic information should have be already available in the ksp::game::warp
module: https://kontrolsystem2.readthedocs.io/en/prerelease/reference/ksp/game_warp.html
Undoubtly, you may say me 'no' at anytime, if it's bad ideas or too much work. Besides, I'm blown away by the speed you implement all thoses ! From top to bottom ;) :
.filter_map
& flat_map
smell like candies. I'll have to re-read all my code to add this, it will be way more readable :).check_fairing()
method which is unable to see any difference between both, and after having successfully jettisoned the AEFF125, try desperately to jettison the engine fairing. In vain, obviously, since it will be automaticly jettisoned at the staging, not before, not after..energy_flow
is totaly dependent of the angle :).recipe_ingredients
contains a list of 1 ingredient if it's not a recip, (for monoprop, for example) ?Can I say enough 'thank you' to illustrate how much I'm happy with all thoses addings ?
Edit typo, grammar etc as usual
Ah ok, the engine fairing was not on my radar. Quick workaround would be to filter out the engines before using .filter_map
. E.g.
vessel.parts.filter(fn(part) -> !part.is_engine).fitler_map(fn(part) -> part.fairing)
But I understand that this is somewhat confusing. I'll probably split the API in .fairing
and .engine_fairing
As for the the propellants: If .is_recipe
is false than the propellant is just the resource that is used, i.e. .receipe_ingredients
should be empty. Otherwise this would be just a reference to self.
As said, I had think about excluding engine parts, howerver, this behavior is also true for heatshield (nice we can recognize them and exclude them now ^^) AND at least thoses parts :
Created a new pre-release: https://github.com/untoldwind/KontrolSystem2/releases/tag/v0.5.3.6
part.fairing
should now only cover fairings
part.engine.fairing
or part.engine.has_fairing
To get cargo bay (which are deployables) there is now also a part.is_cargo_bay
part.cargo_bay
because cargo bays do not really have any interesting values to tweak that are not covered with part.deployable
As for the time-warping:
ksp::game::warp
module has been extended: https://kontrolsystem2.readthedocs.io/en/prerelease/reference/ksp/game_warp.htmlset_warp_index(int)
function.
Hopefully this is the one: https://github.com/untoldwind/KontrolSystem2/releases/tag/v0.5.3.7
I added part.part_category
and .fairing
should now only contain fairings in the Payload category
Just did few testings :
Notice deployable.value.deploy_state
became a constant instead of a string. Nice touch ^^
Legitim fairings respond positively to .is_cargo_bay
.
Will test others aspects later, but it smell good.
Little engine test.
With is_recipe
false, .recipe_ingredients
is not even instancied (Not really surprizing).
Out of curiosity, why .recipe_ingredients
is not an Option<ResourceReceipeIngredient[]>
? (Just to get a better understanding ! )
Yes good point that should be an option.
I merge it all into the 0.5.4.0 release.
.recipe_ingredients
is now Option<ResourceReceipeIngredient[]>
as suggested
Sorry, I was a bit busy this week-end, so I can't look at all I was expecting on KSP2 & KS2.
Browing datas and engines, I was thinking about propellants.
EngineMode govern which propelant is used, this is why an array is needed for part.engine_module.propellants
. After had read your source code (and what I assume to be KSP2 .dll api's files like _DataEngine.cs), I assume index of part.engine_module.propellants
match index part.engine_module.engine_modes
.
Would it make sense that propellants be a property of EngineMode
(not array, therefore, but keeping the notion of recipe and the recipe array) rather than ModuleEngine?
It's just an idea to talk about.
I just noticed that the underlying structure of EngineMode also has a propellant definition, have to check if that is in sync with the the one on the engine though.
I saw you added some information for engines and solar panels in the VAB too :) Is it possible to have access to the Electricity consumption of any part inside the VAB (to compute the total consumption)?
@PhilouDS I just take a look at PartComponent.cs (little 2k lines file) which seems be a portion of the API. It don't seems to be an easy task. Apparently, all goes through something like a PartResourceFlowRequestBroker which don't seems to have a direct access thru a public method. I didn't explore enough to be fluent into thoses files, but seems to be a chore. Maybe I'm wrong, Untoldwind should be able to correct my assessments.
Looks like all the Data_*
structures (e.g. Data_Command
, Data_Transmitter
etc.) have either resource settings or requiredResources. At first glance this seems to contain ElectricalCharge
as a resource requirement for certain modules.
Though I have to do some restructuring to make this available in VAB and flight ... hopefully I will not break too many eggs in the process.
Thanks for your answer. If it's too complicated, don't worry about this. You certainly have a lot on your plate.
There are some (potential) breaking changes: I noticed that ModuleCommand
and ModuleDockingNode
hat a lot of field from the underlying part, which does not translate well to the VAB version.
So instead I added a .part
field to all the modules (i.e. if your scripts are now missing a moduleDockingNode.something_important
just use moduleDockingNode.part.something_important
now).
Upside to this:
Just a pre-release for now (too many changes ;) ) https://github.com/untoldwind/KontrolSystem2/releases/tag/v0.5.5.0 Documentation: https://kontrolsystem2.readthedocs.io/en/prerelease/
... and most importantly: I added bindings for ModuleLight
. Your disco needs you!
KSP2 tells me than Flight_plan is a now a dependency of this pre release version. Is it normal?
@untoldwind I do not understand what you are talking about
@PhilouDS : Flightplan is marked as a soft dependency (i.e. should be optional) Some time ago we were testing out the possibility to include APIs to other mods. In theory:
flight_plan()
in ksp::addons
Maybe the logic of soft dependency has changed in SpaceWarp recently, I will checkout the latest version
@PhilouDS I just checked the newest pre-release 0.5.5.1 with the latest spacewarp 1.9.4 without flightplan installed, which works fine for me.
Please check the BepInEx/LogOutput.log
file in the game folder. It should contain some more detailed information why the plugin is suddenly creating problems
I have installed the version 0.5.5.1 and I don't have the problem anymore. I don't know why but it's fine now.
@PhilouDS I think I reproduced the problem by downgrading spacewarp to 1.6.0 was able to resolve the dependency issue by removing the BepInEx/cache
folder
Just to note :
This deLICious .flat_map
didn't have been reported on Ranges ^^
(I'm not sure their is any purpose to have a .filter_map
on ranges since ranges are integer only)
Pre-release 0.5.5.3 https://github.com/untoldwind/KontrolSystem2/releases/tag/v0.5.5.3
contains .flat_map
and .filter_map
for ranges.
There actually might be some use-cases for the latter.
VSC doesn't like filter_map
with ObjectAssemblyPart
list. Even with the last vsix. Is this because it's not in the documentation yet?
Created an updated version of the vscode plugin that should fix the problem: https://github.com/untoldwind/KontrolSystem2/releases/download/v0.5.5.3/to2-syntax-0.0.30.vsix (might be slightly better at type guessing as well)
It worked, thanks. I'd like to help you for those little things but I don't know how to do this. During my studies, I learned to code with C++ (a long time ago, it's been 25 years). With KSP1, I learned to code with kOS and, recently, of course, Kontrol System. I have a little understanding of Java or Python but not so much. I've started a book yesterday to learn C#.
Anyway, if I can help you for something, let me know.
Actualy, I still use the 0.0.1 version of to2-syntax VSC extention for syntax highlighting. As soon I switch on most recent version, most of my code is signaled as junk : (On left, in files list, only few have red dot only because I didn't browse them. As soon I focus them, they switch in '100+ error message' mode)
That's why when compilation error message were just 'Negative stack at blablabla', it was intricating. Since massive refacto, at least, when compiler is lost, it says 'expectin Whitespace at GLORIOUS LINE NUMBER'.
But it's not an hard topic, I can do without last vsix version.
@PhilouDS I feel we have similar curriculum / age x)
This is weird. I also use personal library files and functions and I don't have errors like those.
I'm 40 and I went to university to study math and informatic. I'm a math teacher in France. But I really suck in physics, that's why I get lost sometimes in KSP's orbital physics.
As you can see, I mostly use personal library too and they're not properly recognized (in lsp server. compilation goes fine)
I'm 40 and I went to university to study math electronic and informatic. I'm a math teacher software engineer in France. I have old but usable remains in physics and I sporadically study orbitals mechanics since 2 years, time where I discover the existence of KOs for KSP1, from free and public data sources (wikipedia mostly). I told you we have more in commun than expected :)
@lefouvert I guess the problem is that you opened/started the editor on the KontrolSystem2
folder and not the to2Local
folder. If your workspace is just the to2Local
folder a lot of those errors should go away.
Under the hood the plugin has to scan two folders:
to2
folder with the std::
modules, which can be configured in the settingsto2Local
folder, which is implicitly assumed to be the root-folder of the editor workspace (and cannot be configured yet).I will add some better heuristics, or at the very least make the latter configurable as well.
Speaking of the std::
module: That one is still underdeveloped. Would it make sense to integrate some of your to it?
As for the programming language debate:
to2
are inspired by rust, but there are some elements of typescript as well. The main goal was to have a strictly typed language that is async by default, so that it can run as a coroutine in the unity engine, and can be compiled/updated in the game itselfYou'r right :
My workspace is at KontrolSystem2
level and not to2Local
. It was to be able to browse to2
folder at any time I need a hint about how things works.
Switching to to2Local
kind of solve some issues. Modules are found, type hints are visible, however, a lot of things are <unknown>
type leading to error message
About std::
(do not confuse with Sexual Transmissible Disease. Sorry, the joke just pass through my brain, it's the first time I see initials match), I have 2 considerations :
In anycase, I would to git publish my work (when it's done), but maybe you are right, maybe instead I wait to think it's perfect, it's time to share, even if some things are clunky. (Even with years of collaborative work, I still want to reach the unreachable 'perfection' and often solowork. Bad habits. Not good to evolve.)
As soon as I found how to properly publish my work on git, I give you the link. Don't expect to much, I have A LOT of things missing (I'm just able to circularize properly) and maybe some code are just duplicates of existing tools in KS ( I've just seen this afternoon they are a ksp::control::MovingAverage
which could be an evolved version of my math::tools::Derivative
, for exemple) and things are still cluncky (maneuver::takeof::sanityCheck
is my first work, in parallel with ship::stage.to2
. It's obvious with hindsight it should return a Result
type)
And does it make sense to combine efforts to enrich KS ? -> Yes. Yes yes yes.
programing debate :
The main goal was to have a strictly typed language that is async by default, so that it can run as a coroutine in the unity engine, and can be compiled/updated in the game itself
It's all to your credit. Everything in this sentence is beautifull.
inspired by rust
Hahaaaa ! My sight is still fonctional.
typescript as well
Feel like you had seen and wrote typescript (the only respectable usage of javascript :P) as daily routine. Not surprizing it pop out in this mod :)
The parser/compiler [...] in c#
Obviously, as said. Not sure their is an other sane way to do it. As I use frequently C# in my current job's project (in an 'not encline to code' tool, UiPath. Not my jam, UiPath. I would prefer wrote codelines. It look like Scratch), I can confirm : not so far from java. A bit more from modern C++, I feel, but mains concepts are the same.
System.Reflection.Emit
package so that to2 is translated into byte-code
Wow. I was suspecting something like that because of the smoothness of the execution. That's why code is so fast, so. I can imagine both the joy of the performances and the pain of the maintenance and evolving.
The vscode extension is written in typescript
Didn't know it could be done in other way, but I don't doubt any second it's very specific to VSC, well documented, and poorly accessible (Not your work, the VSC incorporation)
There were actually a bunch of array methods missing. Should be fixed in: https://github.com/untoldwind/KontrolSystem2/releases/download/v0.5.5.3/to2-syntax-0.0.31.vsix
I also added a simple logic to automatically look for "to2" and "to2Local" subfolders if the editor is opened on the plugin dir.
Hello MyJunkCode. You can take a look if you want. As it's in 'work in progress' state, it may be not properly tidy. (lol, nope. It's just a mess) Ask as many question you want. I'm open to ... no, I HOPE (constructives) criticisms.
And obvioulsy, you can take anything which seems usefull.
Wow, that is actually a lot ;) Would it be okay to link that repo in a "Code examples"/"Community projects"/"Cool things you can do with this mod" section either to the README or the docs?
One minor (hopefully constructive) criticism: You use a lot of return
in you functions. The final return in a function is not necessary, since every expression has a result and a { code }
block has the result of the last expression in that block.
E.g.:
pub sync fn latitude_from_angle(angle: float) -> float = {
return asin_deg(sin_deg(angle))
}
is the same as
pub sync fn latitude_from_angle(angle: float) -> float = {
asin_deg(sin_deg(angle))
}
And that can be shorted to:
pub sync fn latitude_from_angle(angle: float) -> float = asin_deg(sin_deg(angle))
Edit: Takeaway for me is that the vscode-plugin still has a lot of problems with inline-comments (i.e. the parser in vscode is slightly out of sync with the parser in the mod)
I was not able to fix all the issues in the vscode extension yet, but https://github.com/untoldwind/KontrolSystem2/releases/download/v0.5.5.5/to2-syntax-0.0.33.vsix should have some improvements (at least it is not all red ;) )
Also I found: https://github.com/lefouvert/ToTheMoon/blob/0ecfbb5e239a7e5195866633a60bf427010d9b13/ship/ship.to2#L207
Due to the restructuring in for ksp::oab
this should be now
fn() -> vessel.command_modules[0].part.global_position,
Have to go for tonight, so short answer :
Wow, that is actually a lot ;)
thx ^^
Would it be okay to link that repo in a "Code examples"/"Community projects"/"Cool things you can do with this mod" section either to the README or the docs?
Of course, yes, it's okay.
One minor (hopefully constructive) criticism: You use a lot of return in you functions. The final return in a function is not necessary, since every expression has a result and a { code } block has the result of the last expression in that block.
Totaly true and understood, I work (not enough) on myslef to correct this bias. ship.isp
is what I should do more.
(hopefully constructive) criticism:
The 'constructive' precision is because in my native language, this word is by default 'negative'. I know for sure here is a caring space. And yes, it's a constructive answer.
should have some improvements (at least it is not all red ;) )
Thx !
Due to the restructuring in for ksp::oab this should be now
fn() -> vessel.command_modules[0].part.global_position,
Noted. Will be updated. Thx :)
This one is almost there: https://github.com/untoldwind/KontrolSystem2/releases/download/v0.5.5.5/to2-syntax-0.0.34.vsix
The only remaining problem is that ship.stages
sometimes does not resolve correctly.
The 0.0.36 version in 0.5.6.0 should have ironed out most of the issues. (Thanks for the project btw, that helped a lot finding all the hidden cracks). I also added long overdue string-interpolation (like here: https://github.com/untoldwind/KontrolSystem2/blob/6c69a9a45cc3b06234b401fcd8dd54a52154260f/KSP2Runtime/to2/std/vac.to2#L64) ... that should make formatting all the string output much easier.
Yay ! Happy to know I've done something helpfull :) (but not very proud you have seen how much i'm struggling to just turn my vessel in the direction I want ^^)
I assume string interpolating work in similars ways of core::str
? (Hû, sorry, i'm dumb, it's in the patch note ^^)
About parser for your compiler and for VSC, speaking with a friend today, he reminds me it exists some meta-language usefull to describe the grammar and the syntax of a language, which are able to automaticly generate code for your lexer and parser in various programming language. ANTLR is one of thoses, able to generate C# and typescript. The advantage of this is you decribe one time 'to2', you get as many lexer/parser you want in different language. I'm sure you see why it could be usefull when you have compiler in C# and a VSC extention in Typescript :) I'd never used them so I can't be very helpfull, but now you know :) (At time when I'v done a parser, it was a parser for KOs' KSP1 '.ks' script... in '.ks' script, and ANTLR don't know this language ^^)
Edit :
VSIX parser :
ksp::console::CONSOLE.print_at(17, 15, $"roll: {core::math::clamp_degrees180(testdir0.roll),5:N2}")
everything goes fine
ksp::console::CONSOLE.print_at(17, 15, $"roll: {core::math::clamp_degrees180(testdir0.roll), 5:N2}")
it's apocalypse because of a whitespace after the coma :D. Compiler compile but don't consider the display hint ^^
I probably should update the language documentation as well and not just leave it with a brief patch note ;)
In short: Yes, under the hood a string interpolation is converted into a c#/.dotnet string.Format
call (which pretty much what core::str
does as well).
I will fix the space after comma thing. I wanted to prevent runtime error (string::Format
crashed if there is anything but a number after the comma) and was a bit zealous with the parser.
Speaking about parsers:
Ah... The tedious task of maintaining a documentation... I always run when it's about documentation : Run to read all of it, Run away when I have to write it :D. (Yup, I read the documentation of my calculator, my car, and my washing machine)
ANTLR was just a random example, but as you seem to have a good view of the spectrum of possibilites cough bison meat is savourous cough and limitation, you probably have made the best choice.
As most of my related are essentialy,
I'm pretty sure if I slip a 'Monadic Parser Combinator' in a chatting, I'm going to trigger some laught. Too easy or too hard according to the context ;)
5 years ago !? How didn't I heard about your project at KSP1 times ? Have heard about kRPC
, stick on KOs
, but Kontrol System
? I found you when KSP2 became enough 'early access bug free' (and on sales) and intuitively search for the only kind of mod I really care : A tool which allow me to code launcher behaviors. (maybe Remote tech too, but it's less appealing to me), thanks to this post : KSP Forum
I had a lot of fun with KOs, but the language was not enough rigourous, terribly slow, full of memory leak and other kind of memory breaking (some switch between Archives/onboard code source cause leaks between what should be local variables), not maintained anymore. I blame nobody, it's understandable, but if I had a better alternative and KS is a way better alternative, even if it have less possibilities. Yes, I can't make a satelite to interpret 2001 Space Odyssey intro in chip tune tone each time it reach orbit but hey... it's fine ^^, I would have made the transition without any doubt.
I have to admit it was fun to have different source of code, and different limitations bind with thoses (big code at KSC, cheap and slim code onboard) but it lead to bad practice since limitations are on char number (That why I had done a parser, to minify onboard code, and don't have to wrote 1 char variable/function names). It was fun to warp the language enough to be able to make class via lexicon and delegates but still, KOs always have been intrinsically cluncky.
So, thank you (again) for this mod. It's made with, at my sight, the goods precepts and it don't seems to be able to grow in bad ways.
The 0.5.6.1 release should be a bit more lenient with the alignment part of the format string.
On the other topic: Actually it is good to get challenged from time to time. It is so hard to keep in touch with all the different developments. For example I found this pretty interesting article https://eyalkalderon.com/blog/nom-error-recovery/ with some fresh ideas that might improve the error-reporting a bit.
This issue is stale because it has been open for 60 days with no activity.
version 0.5.3.4 (Ckan) gessed tag : Question, Enhancement
Hi ! Maybe I didn't be able to found thoses, in that case, «My bad», but I miss some acces to definitions datas.
Fairing (feels important to me)
There is 2 kind of fairing : the conveniences ones, and the wanted ones. I mean, when you put a stage under an engine, this one is covered by a fairing. It's thoses I call the conveniences ones. And there is obviously the fairing you put to protect your payload, have better aerodynamics etc aka the wanted ones.
Since
vessel.parts.filter(fn(p) -> p.fairing.defined)
is not able to distinguish them, I would like to know if there is an other way I didn't think about. At first, I was thinking «Nah, easy, I collect fairings, I substract engines, and i'm good to go» BUT ! Because there is a 'but', obviously, engines are not the only ones to have «conveniences» fairings. Heatshields too. And structural hollow tubes. And probably some others parts I didn't think about. And all thoses delicious parts don't have any modules to identify them :) Aspart.is_fairing
is probably an equivalent ofpart.fairing.defined
, his behavior is unsurprizingly the same. I'm not feeling good at the idea to look at the name of a part to identify it. I think it's not reliable. If I didn't miss a way, maybe apart.fairing.value.is_jettisonable
could be a good idea (since I wasn't able to jettison «convenience» fairing)Solar panels (feels important to me)
I have a nice piece of code which is able to give the one of best vectors to expose to the sun. But in order to be able to do it, I needs to know max output of each solar panels. Maybe I miss it, but I haven't be able to found it. I had to write this kind of things :
As said, I don't think it's a reliable way to gather data.
Resources / Engines (seems to be a good idea)
Did I miss a way to connect an engine with the fuel it burn ?
I wrote this :
which is far more reliable than looking at part's name. It connect
part.engine_module.value.current_engine_mode.engine_type
to apart.resources.list.map(fn(r) -> r.resource.id)
. This is way less an issue than others topics, but just in case I miss something... :). But I don't think it's a bad idea to have a way to know what input/output each part are able to. For example, most Liquid Fueled engines have Oxygen and Methan as Input, and have Electric charges as output. Propellant Tanks have their propelant as output Solar panels have Electric charges as output etcThe cherry on the cake would be able to ignite individualy each engine, especially since
part.engine_module.value.independent_throttle
have appeared ^^Heatshield (feels accessory)
Maybe thoses parts would have benefits to have their very own module, since they can be deployed, they have resources (Ablator), fairing, etc It would be a shame to inadvertently deploy one of those (Yes, I look at you, inflatable heatshield) while expecting deploy antennaes, solarpanels, cargoholds etc :) At the time, I'm able to filter them on the resources the part hold. If their is 'Ablator' in it, it's a heatshield.
Edit : typo, grammar etc