untoldwind / KontrolSystem2

Autopilot scripting system for KSP2
Other
54 stars 15 forks source link

Request for bunch of Quality Of Life data #130

Closed lefouvert closed 4 months ago

lefouvert commented 7 months ago

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 :) As part.is_fairing is probably an equivalent of part.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 a part.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 :

pub const SolarPanel: (Name: string, MaxFlow: float)[] = [
    (Name: "solararray_0v_flat", MaxFlow: 0.145209029316902), // OX-STAT
    (Name: "solararray_1v_1x6", MaxFlow: 0.968068957328796), // OX-4L
    (Name: "solararray_1v_3x2", MaxFlow: 0.968069076538086), // OX-4W
    (Name: "solararray_1v_shielded_1x6", MaxFlow: 0.968068957328796), // SP-4L
    (Name: "solararray_1v_shielded_3x2", MaxFlow: 0.968069076538086), // SP-4W
    (Name: "solararray_1v_flat", MaxFlow: 1.21007525920868), // OX-STAT-XL
    (Name: "solararray_1v_circular", MaxFlow: 3.3882417678833), // OX-10C
    (Name: "solararray_1v_circular_shielded", MaxFlow: 3.3882417678833), // SP-10C
    (Name: "solararray_2v_accordion", MaxFlow: 11.6168279647827), // SP-XL 'Gigantor'
    (Name: "solararray_3v_large", MaxFlow: 33.8824119567871), // SP-XXL 'Colosse'
]

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 :

pub type ResourceConst = int

pub const Resource: (MP: ResourceConst, SF: ResourceConst, Air: ResourceConst, H: ResourceConst, CH4: ResourceConst, Ox: ResourceConst, EC: ResourceConst, Xe: ResourceConst, Ab: ResourceConst) = (
    MP: 1,  // "ME"->"MP" Monopropellant
    SF: 2,  // "ES"->"SF" Solid Fuel
    Air: 3, // "Air"->"Air" Air
    H: 6,   // "H"->"H" Helium
    CH4: 7, // "CH4"->"CH4" Methane (Liquid Fuel)
    Ox: 8,  // "Ox"->"Ox" Oxygen
    EC: 12, // "CE"->"EC" Electrical Charge
    Xe: 13, // "Xe"->"Xe" Xenon
    Ab: 15  // "Ab"->"Ab" Ablator
)

pub const EngineFuel: (Fuel: int, Engine: string)[] = [
    (Fuel: Resource.MP, Engine: "MonoProp"), // "ME"->"MP" Monopropellant
    (Fuel: Resource.SF, Engine: "SolidBooster"), // "ES"->"SF" Solid Fuel
    (Fuel: Resource.Air, Engine: "Turbine"), // "Air"->"Air" Air
    (Fuel: Resource.H, Engine: "Nuclear"), // "H"->"H" Helium
    (Fuel: Resource.CH4, Engine: "Methalox"), // "CH4"->"CH4" Methane (Liquid Fuel)
    (Fuel: Resource.CH4, Engine: "Turbine"), // "CH4"->"LF" Methane (Liquid Fuel)
    (Fuel: Resource.Ox, Engine: "Methalox"), // "Ox"->"Ox" Oxygen
    (Fuel: Resource.EC, Engine: "Electric"), // "CE"->"EC" Electrical Charge
    (Fuel: Resource.Xe, Engine: "Electric") // "Xe"->"Xe" Xenon
]

which is far more reliable than looking at part's name. It connect part.engine_module.value.current_engine_mode.engine_type to a part.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 etc

The 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

PhilouDS commented 7 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?

PhilouDS commented 7 months ago

@lefouvert I don't understand how Resource and EngineFuel work. What are the numbers next to the resources?

lefouvert commented 7 months ago

@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. image 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. image

PhilouDS commented 7 months ago

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).

image

lefouvert commented 7 months ago

@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.

untoldwind commented 7 months ago

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):

lefouvert commented 7 months ago

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 ;) :

Can I say enough 'thank you' to illustrate how much I'm happy with all thoses addings ?

Edit typo, grammar etc as usual

untoldwind commented 7 months ago

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.

lefouvert commented 7 months ago

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 :

untoldwind commented 7 months ago

Created a new pre-release: https://github.com/untoldwind/KontrolSystem2/releases/tag/v0.5.3.6

untoldwind commented 7 months ago

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

lefouvert commented 6 months ago

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.

lefouvert commented 6 months ago

Little engine test. With is_recipe false, .recipe_ingredients is not even instancied (Not really surprizing). Out of curiosity, why .recipe_ingredientsis not an Option<ResourceReceipeIngredient[]> ? (Just to get a better understanding ! )

untoldwind commented 6 months ago

Yes good point that should be an option.

untoldwind commented 6 months ago

I merge it all into the 0.5.4.0 release. .recipe_ingredients is now Option<ResourceReceipeIngredient[]> as suggested

lefouvert commented 6 months ago

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.

untoldwind commented 6 months ago

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.

PhilouDS commented 6 months ago

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)?

lefouvert commented 6 months ago

@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.

untoldwind commented 6 months ago

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.

PhilouDS commented 6 months ago

Thanks for your answer. If it's too complicated, don't worry about this. You certainly have a lot on your plate.

untoldwind commented 6 months ago

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!

PhilouDS commented 6 months ago

KSP2 tells me than Flight_plan is a now a dependency of this pre release version. Is it normal?

image

lefouvert commented 6 months ago

@untoldwind I do not understand what you are talking about image

untoldwind commented 6 months ago

@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:

Maybe the logic of soft dependency has changed in SpaceWarp recently, I will checkout the latest version

untoldwind commented 6 months ago

@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

PhilouDS commented 6 months ago

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.

untoldwind commented 6 months ago

@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

lefouvert commented 6 months ago

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)

untoldwind commented 6 months ago

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.

PhilouDS commented 6 months ago

image VSC doesn't like filter_map with ObjectAssemblyPart list. Even with the last vsix. Is this because it's not in the documentation yet?

untoldwind commented 6 months ago

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)

PhilouDS commented 6 months ago

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.

lefouvert commented 6 months ago

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 : image (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)

PhilouDS commented 6 months ago

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.

lefouvert commented 6 months ago

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 :)

untoldwind commented 6 months ago

@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:

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:

lefouvert commented 6 months ago

You'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 image

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)

untoldwind commented 6 months ago

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.

lefouvert commented 6 months ago

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.

untoldwind commented 6 months ago

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)

untoldwind commented 6 months ago

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,
lefouvert commented 6 months ago

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 :)

untoldwind commented 6 months ago

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.

untoldwind commented 6 months ago

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.

lefouvert commented 6 months ago

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 ^^

untoldwind commented 6 months ago

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:

lefouvert commented 6 months ago

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.

untoldwind commented 6 months ago

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.

github-actions[bot] commented 4 months ago

This issue is stale because it has been open for 60 days with no activity.