From 611787190d6d2f5710393f9d660705b7df81bc3e Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 8 Sep 2024 15:31:39 +0300 Subject: [PATCH 001/108] quick and dirty integration of the new lua interpreter --- KSPBuildTools | 2 +- .../kOS/Parts/@thumbs/KAL9000_icon.png | Bin 0 -> 13460 bytes src/kOS.Safe.Test/kOS.Safe.Test.csproj | 6 ++ src/kOS.Safe/kOS.Safe.csproj | 11 +++ src/kOS/Lua/LuaInterpreter.cs | 85 ++++++++++++++++++ src/kOS/Lua/init.lua | 31 +++++++ src/kOS/Screen/Interpreter.cs | 7 +- src/kOS/kOS.csproj | 17 ++++ src/kOS/packages.config | 2 + 9 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 Resources/GameData/kOS/Parts/@thumbs/KAL9000_icon.png create mode 100644 src/kOS/Lua/LuaInterpreter.cs create mode 100644 src/kOS/Lua/init.lua diff --git a/KSPBuildTools b/KSPBuildTools index 6ecd3982d6..1cf9e94e80 160000 --- a/KSPBuildTools +++ b/KSPBuildTools @@ -1 +1 @@ -Subproject commit 6ecd3982d61b31fd71c0bd9d0359ab2c3923d35a +Subproject commit 1cf9e94e80ebd62356688a3f83e7e9093b49bb19 diff --git a/Resources/GameData/kOS/Parts/@thumbs/KAL9000_icon.png b/Resources/GameData/kOS/Parts/@thumbs/KAL9000_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..70e21a32437a90a932b848ae146ad44c058f1aff GIT binary patch literal 13460 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 i|KGfalse + + + + + + $(SolutionDir)packages\NSubstitute.1.8.1.0\lib\net35\NSubstitute.dll false diff --git a/src/kOS.Safe/kOS.Safe.csproj b/src/kOS.Safe/kOS.Safe.csproj index f2aafb9091..4bd2c6a2fd 100644 --- a/src/kOS.Safe/kOS.Safe.csproj +++ b/src/kOS.Safe/kOS.Safe.csproj @@ -44,6 +44,17 @@ false false + + + ..\..\Resources\GameData\kOS\Plugins\ICSharpCode.SharpZipLib.dll + + + + + + + + diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs new file mode 100644 index 0000000000..315149848d --- /dev/null +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -0,0 +1,85 @@ +using JetBrains.Annotations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Unity; +using System.Net; +using System.IO; +using System.Reflection; +using System.CodeDom; +using NLua; +using KeraLua; +using kOS.Safe; + +namespace kOS.Lua +{ + public class LuaInterpreter : IFixedUpdateObserver + { + private NLua.Lua state; + private KeraLua.Lua commandCoroutine; + private bool commandPending = false; + + protected SharedObjects Shared { get; private set; } + + public LuaInterpreter(SharedObjects shared) + { + Shared = shared; + state = new NLua.Lua(); + state["Shared"] = Shared; + state["FlightGlobals"] = UnityEngine.MonoBehaviour.FindObjectOfType(); + using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { + try { + state.DoString(streamReader.ReadToEnd()); + } catch (Exception e) { + Debug.LogException(e); + } + } + Shared.UpdateHandler.AddFixedObserver(this); + } + + static void YieldHook(System.IntPtr L, System.IntPtr ar) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.Yield(0); + } + + // creates a new coroutine with the command and configures it to yield after 2000 instructions + public void ProcessCommand(string command) // cre + { // TODO: handle consecutive commands with some queue. Right now it just overwrites the previous command + state.DoString($@" +commandCoroutine = coroutine.create(assert(load([=[{command}]=], ""chunk"", ""t"", _ENV))) + "); // TODO: command injection from a file + state.State.GetGlobal("commandCoroutine"); + commandCoroutine = state.State.ToThread(-1); + state.State.Pop(1); + commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 2000); + commandPending = true; + } + + public void KOSFixedUpdate(double dt) + { + // resumes the coroutine created by ProcessCommand after it was created and after it yielded due to running out of instructions + if (commandCoroutine != null) + { + if (commandCoroutine.Status == LuaStatus.Yield | commandPending) + { + commandPending= false; + LuaStatus status = commandCoroutine.Resume(state.State, 0); + if (status != LuaStatus.OK & status != LuaStatus.Yield) + { + Shared.Logger.Log(new Exception(commandCoroutine.ToString(-1))); + } + } + } + } + + public void Dispose() + { + state.Dispose(); + Shared.UpdateHandler.RemoveFixedObserver(this); + } + } +} diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua new file mode 100644 index 0000000000..4c85826b1a --- /dev/null +++ b/src/kOS/Lua/init.lua @@ -0,0 +1,31 @@ +function tablelength(t) + local count = 0 + for _ in pairs(t) do count = count + 1 end + return count +end + +function print(...) + local printSum = "" + for i, v in pairs({...}) do + printSum = printSum .. tostring(v) .. (i ~= tablelength({...}) and ", " or "") + end + Shared.Window:Print(printSum) +end + +function dump(obj, depth) + if depth==nil then depth=0 end + if depth==0 then print(obj, type(obj)) end + if type(obj)=="table" or getmetatable(obj) and getmetatable(obj).__pairs then + for k,v in pairs(obj) do + print(string.rep(" ",depth)..tostring(k).."("..type(k)..")", tostring(v).."("..type(v)..")") + dump(v, depth+1) + end + end + if getmetatable(obj) then + print(string.rep(" ",depth).."metatable:") + for k,v in pairs(getmetatable(obj)) do + print(string.rep(" ",depth)..tostring(k).."("..type(k)..")", tostring(v).."("..type(v)..")") + dump(v, depth+1) + end + end +end diff --git a/src/kOS/Screen/Interpreter.cs b/src/kOS/Screen/Interpreter.cs index 997fc3d201..cdd5fa2972 100644 --- a/src/kOS/Screen/Interpreter.cs +++ b/src/kOS/Screen/Interpreter.cs @@ -17,12 +17,14 @@ public class Interpreter : TextEditor, IInterpreter private readonly List commandHistory = new List(); private int commandHistoryIndex; private bool locked; + private readonly Lua.LuaInterpreter luaInterpreter; protected SharedObjects Shared { get; private set; } public Interpreter(SharedObjects shared) { Shared = shared; + luaInterpreter = new Lua.LuaInterpreter(shared); } protected override void NewLine() @@ -134,7 +136,9 @@ protected void CompileCommand(string commandText) try { - CompilerOptions options = new CompilerOptions + UnityEngine.Debug.Log("command: "+commandText); + luaInterpreter.ProcessCommand(commandText); +/* CompilerOptions options = new CompilerOptions { LoadProgramsInSameAddressSpace = false, FuncManager = Shared.FunctionManager, @@ -149,6 +153,7 @@ protected void CompileCommand(string commandText) var interpreterContext = ((CPU)Shared.Cpu).GetInterpreterContext(); interpreterContext.AddParts(commandParts); +*/ } catch (Exception e) { diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index 6e0b895a27..312e158215 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -11,6 +11,8 @@ v4.8 512 + + true @@ -94,6 +96,7 @@ Resources.resx + @@ -260,9 +263,23 @@ + + ..\..\packages\KeraLua.1.4.1\lib\net46\KeraLua.dll + + + ..\..\packages\NLua.1.7.3\lib\net46\NLua.dll + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ No newline at end of file diff --git a/src/kOS/packages.config b/src/kOS/packages.config index cc64ec46e3..ca8ed3ac9c 100644 --- a/src/kOS/packages.config +++ b/src/kOS/packages.config @@ -1,4 +1,6 @@  + + \ No newline at end of file From ef869db31d66f28719b9437e2b71046ab0afd842 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 10 Sep 2024 12:29:50 +0300 Subject: [PATCH 002/108] Interpreter can be selected with field now Separated interpreter specific logic with an new IInterpreterLink interface Created classes KSLink and LuaInterpreter that implement this interface Added a memeber "InterpreterLink" to SafeSharedObjects to access this new interface Created a new field "Interpreter" that calls OnInterpreterChanged function that sets Shared.InterpreterLink to the selected interpreter Atm interpreters can coexist alongside each other --- src/kOS.Safe/Lua/ILuaInterpreter.cs | 13 ++++ src/kOS.Safe/SafeSharedObjects.cs | 2 + src/kOS.Safe/Screen/IInterpreter.cs | 1 + src/kOS.Safe/Screen/IInterpreterLink.cs | 17 +++++ src/kOS.Safe/kOS.Safe.csproj | 2 + src/kOS/Lua/LuaInterpreter.cs | 78 +++++++++++++++++----- src/kOS/Module/kOSProcessor.cs | 48 ++++++++++++-- src/kOS/Screen/Interpreter.cs | 38 +++-------- src/kOS/Screen/KSLink.cs | 87 +++++++++++++++++++++++++ src/kOS/kOS.csproj | 1 + 10 files changed, 236 insertions(+), 51 deletions(-) create mode 100644 src/kOS.Safe/Lua/ILuaInterpreter.cs create mode 100644 src/kOS.Safe/Screen/IInterpreterLink.cs create mode 100644 src/kOS/Screen/KSLink.cs diff --git a/src/kOS.Safe/Lua/ILuaInterpreter.cs b/src/kOS.Safe/Lua/ILuaInterpreter.cs new file mode 100644 index 0000000000..023f048a54 --- /dev/null +++ b/src/kOS.Safe/Lua/ILuaInterpreter.cs @@ -0,0 +1,13 @@ +using kOS.Safe.Screen; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace kOS.Safe.Lua +{ + public interface ILuaInterpreter : IInterpreterLink, IFixedUpdateObserver + { + } +} diff --git a/src/kOS.Safe/SafeSharedObjects.cs b/src/kOS.Safe/SafeSharedObjects.cs index a66ac36eb2..3c7620198c 100644 --- a/src/kOS.Safe/SafeSharedObjects.cs +++ b/src/kOS.Safe/SafeSharedObjects.cs @@ -3,6 +3,7 @@ using kOS.Safe.Compilation; using kOS.Safe.Execution; using kOS.Safe.Function; +using kOS.Safe.Lua; using kOS.Safe.Module; using kOS.Safe.Persistence; using kOS.Safe.Screen; @@ -13,6 +14,7 @@ namespace kOS.Safe public class SafeSharedObjects { public ICpu Cpu { get; set; } + public IInterpreterLink InterpreterLink { get; set; } public IScreenBuffer Screen { get; set; } public IInterpreter Interpreter { get; set; } public IBindingManager BindingMgr { get; set; } diff --git a/src/kOS.Safe/Screen/IInterpreter.cs b/src/kOS.Safe/Screen/IInterpreter.cs index 1b03597dd5..d50613731b 100644 --- a/src/kOS.Safe/Screen/IInterpreter.cs +++ b/src/kOS.Safe/Screen/IInterpreter.cs @@ -7,6 +7,7 @@ public interface IInterpreter : IScreenBuffer void Type(char ch); bool SpecialKey(char key); string GetCommandHistoryAbsolute(int absoluteIndex); + int GetCommandHistoryIndex(); void SetInputLock(bool isLocked); bool IsAtStartOfCommand(); bool IsWaitingForCommand(); diff --git a/src/kOS.Safe/Screen/IInterpreterLink.cs b/src/kOS.Safe/Screen/IInterpreterLink.cs new file mode 100644 index 0000000000..4e38d03135 --- /dev/null +++ b/src/kOS.Safe/Screen/IInterpreterLink.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace kOS.Safe.Screen +{ + public interface IInterpreterLink + { + void ProcessCommand(string commandText); + bool IsCommandComplete(string commandText); + bool IsWaitingForCommand(); + void BreakExecution(bool manual); + int InstructionsThisUpdate(); + } +} diff --git a/src/kOS.Safe/kOS.Safe.csproj b/src/kOS.Safe/kOS.Safe.csproj index 4bd2c6a2fd..284fc16fa5 100644 --- a/src/kOS.Safe/kOS.Safe.csproj +++ b/src/kOS.Safe/kOS.Safe.csproj @@ -197,6 +197,7 @@ + @@ -213,6 +214,7 @@ Resources.resx + diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 315149848d..98a5b5c026 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -13,14 +13,19 @@ using NLua; using KeraLua; using kOS.Safe; +using kOS.Safe.Lua; +using kOS.Safe.Utilities; +using Debug = UnityEngine.Debug; namespace kOS.Lua { - public class LuaInterpreter : IFixedUpdateObserver + public class LuaInterpreter : ILuaInterpreter { private NLua.Lua state; private KeraLua.Lua commandCoroutine; private bool commandPending = false; + private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; + private static int instructionsThisUpdate = 0; protected SharedObjects Shared { get; private set; } @@ -28,6 +33,7 @@ public LuaInterpreter(SharedObjects shared) { Shared = shared; state = new NLua.Lua(); + commandCoroutine = state.State.NewThread(); state["Shared"] = Shared; state["FlightGlobals"] = UnityEngine.MonoBehaviour.FindObjectOfType(); using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { @@ -40,38 +46,74 @@ public LuaInterpreter(SharedObjects shared) Shared.UpdateHandler.AddFixedObserver(this); } - static void YieldHook(System.IntPtr L, System.IntPtr ar) + // This function will be running in c++ land so be careful about stuff being garbage collected + // Setting instructionsThisUpdate and instructionsPerUpdate to static somehow prevents them from being collected + private void YieldHook(System.IntPtr L, System.IntPtr ar) { - var state = KeraLua.Lua.FromIntPtr(L); - state.Yield(0); + if (instructionsThisUpdate++ >= instructionsPerUpdate) + { + KeraLua.Lua.FromIntPtr(L).Yield(0); + } } - // creates a new coroutine with the command and configures it to yield after 2000 instructions - public void ProcessCommand(string command) // cre - { // TODO: handle consecutive commands with some queue. Right now it just overwrites the previous command + public void ProcessCommand(string commandText) + { + // TODO: use the chunk just created by IsCommandComplete and use C api instead of dostring + // reuse commandCoroutine? state.DoString($@" -commandCoroutine = coroutine.create(assert(load([=[{command}]=], ""chunk"", ""t"", _ENV))) - "); // TODO: command injection from a file +commandCoroutine = coroutine.create(assert(load([=[{commandText}]=], ""chunk"", ""t"", _ENV))) + "); state.State.GetGlobal("commandCoroutine"); + commandCoroutine.Dispose(); commandCoroutine = state.State.ToThread(-1); state.State.Pop(1); - commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 2000); + + // TODO: investigate performance and potentially find an alternative + // also make sure calling the yieldhook doesnt count as more instructions and if it does subtract them from instructionsThisUpdate + commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 1); commandPending = true; } + public bool IsCommandComplete(string commandText) + { + var status = commandCoroutine.LoadString(commandText); + if (status == LuaStatus.ErrSyntax) + { + var err = commandCoroutine.ToString(-1); + return !err.EndsWith(""); + } + return true; // TODO: do i need to pop? + } + + public bool IsWaitingForCommand() + { + return commandCoroutine.Status != LuaStatus.Yield; + } + + public void BreakExecution(bool manual) + { + commandCoroutine.Dispose(); + commandCoroutine = state.State.NewThread(); + } + + public int InstructionsThisUpdate() + { + //Debug.Log(Shared.Processor.Tag+" instructionsThisUpdate: "+instructionsThisUpdate); + return instructionsThisUpdate; + } + public void KOSFixedUpdate(double dt) { + instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; + instructionsThisUpdate = 0; // resumes the coroutine created by ProcessCommand after it was created and after it yielded due to running out of instructions - if (commandCoroutine != null) + if (commandCoroutine.Status == LuaStatus.Yield || commandPending) { - if (commandCoroutine.Status == LuaStatus.Yield | commandPending) + commandPending = false; + LuaStatus status = commandCoroutine.Resume(state.State, 0); + if (status != LuaStatus.OK & status != LuaStatus.Yield) { - commandPending= false; - LuaStatus status = commandCoroutine.Resume(state.State, 0); - if (status != LuaStatus.OK & status != LuaStatus.Yield) - { - Shared.Logger.Log(new Exception(commandCoroutine.ToString(-1))); - } + Shared.Logger.Log(new Exception(commandCoroutine.ToString(-1))); } } } diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 68d02feb9f..8dbf98f53b 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -18,13 +18,14 @@ using System.Linq; using System.Reflection; using System.Text.RegularExpressions; - using kOS.Safe.Execution; using UnityEngine; using kOS.Safe.Encapsulation; using KSP.UI; using kOS.Suffixed; using kOS.Safe.Function; +using kOS.Lua; +using kOS.Screen; namespace kOS.Module { @@ -86,6 +87,9 @@ public string Tag private const string BootDirectoryName = "boot"; + [KSPField(isPersistant = true, guiActive = true, guiActiveEditor = true, guiName = "Interpreter", groupName = PAWGroup, groupDisplayName = PAWGroup), UI_ChooseOption(scene = UI_Scene.All)] + public string interpreterLanguage = "KerboScript"; + [KSPField(isPersistant = true, guiActive = false, guiActiveEditor = true, guiName = "Boot File", groupName = PAWGroup, groupDisplayName = PAWGroup), UI_ChooseOption(scene = UI_Scene.Editor)] public string bootFile = "None"; @@ -403,6 +407,7 @@ public override void OnStart(StartState state) { FindRP1Modules(); UpdateRP1TechLevel(state == StartState.Editor); + InitInterpreterField(state); //if in Editor, populate boot script selector, diskSpace selector and etc. if (state == StartState.Editor) { @@ -438,6 +443,29 @@ public static void SetBootListDirty() bootListDirty = true; } + private void InitInterpreterField(StartState state) + { + BaseField interpreterLanguageField = Fields["interpreterLanguage"]; + List interpreterOptions = new List { "KerboScript", "Lua" }; + if (state == StartState.Editor) // TODO: show available boot files based on the selected interpreter + { + var interpreterLanguageOption = (UI_ChooseOption)interpreterLanguageField.uiControlEditor; + interpreterLanguageOption.options = interpreterOptions.ToArray(); + } else + { + var interpreterLanguageOption = (UI_ChooseOption)interpreterLanguageField.uiControlFlight; + interpreterLanguageOption.options = interpreterOptions.ToArray(); + interpreterLanguageOption.onFieldChanged = OnInterpreterChanged; + } + } + + private void OnInterpreterChanged(BaseField field, object prevValue) + { + UnityEngine.Debug.Log("interpreter changed. "+prevValue.ToString()+" to "+interpreterLanguage); + if (interpreterLanguage == "Lua") shared.InterpreterLink = new LuaInterpreter(shared); + else shared.InterpreterLink = new KSLink(shared); + } + private void InitUI() { //Populate selector for boot scripts @@ -589,6 +617,18 @@ public void InitObjects() shared.AddonManager = new AddOns.AddonManager(shared); shared.GameEventDispatchManager = new GameEventDispatchManager(shared); + if (interpreterLanguage == "Lua") shared.InterpreterLink = new LuaInterpreter(shared); + else shared.InterpreterLink = new KSLink(shared); + // TODO: proper names. Interpreter class should probably be called Terminal now + // Interpreter -> Terminal + // ConnectivityInterpreter -> ConnectivityTerminal + // IInterpreter -> ITerminal + // IInterpreterLink -> IInterpreter + // KSLink -> KSInterpreter + + // TODO: add methods like Boot, Shutdown to IInterpreterLink + // OnInterpreterChanged would call them to swap interpreters out so they dont run at the same time + // Make the window that is going to correspond to this kOS part: shared.Window = gameObject.AddComponent(); shared.Window.AttachTo(shared); @@ -864,7 +904,7 @@ public void FixedUpdate() if (!HasBooted) { SafeHouse.Logger.LogWarning("First Update()"); - shared.Cpu.Boot(); + shared.Cpu.Boot(); // TODO: add to InterpreterLink HasBooted = true; } UpdateVessel(); @@ -1096,7 +1136,7 @@ private void ProcessElectricity(Part partObj, float time) { // Because the processor is not STARVED, evaluate the power requirement based on actual operation. // For EC drain purposes, always pretend atleast 1 instruction happened, so idle drain isn't quite zero: - int instructions = System.Math.Max(shared.Cpu.InstructionsThisUpdate, 1); + int instructions = System.Math.Max(shared.InterpreterLink.InstructionsThisUpdate(), 1); var request = volumePower * time + instructions * ECPerInstruction; if (request > 0) { @@ -1152,7 +1192,7 @@ private void ProcessorModeChanged() case ProcessorModes.OFF: case ProcessorModes.STARVED: - if (shared.Cpu != null) shared.Cpu.BreakExecution(true); + if (shared.Cpu != null) shared.InterpreterLink.BreakExecution(true); if (shared.Interpreter != null) shared.Interpreter.SetInputLock(true); if (shared.Window != null) shared.Window.IsPowered = false; if (shared.SoundMaker != null) shared.SoundMaker.StopAllVoices(); diff --git a/src/kOS/Screen/Interpreter.cs b/src/kOS/Screen/Interpreter.cs index cdd5fa2972..81e7412df3 100644 --- a/src/kOS/Screen/Interpreter.cs +++ b/src/kOS/Screen/Interpreter.cs @@ -17,21 +17,21 @@ public class Interpreter : TextEditor, IInterpreter private readonly List commandHistory = new List(); private int commandHistoryIndex; private bool locked; - private readonly Lua.LuaInterpreter luaInterpreter; protected SharedObjects Shared { get; private set; } public Interpreter(SharedObjects shared) { Shared = shared; - luaInterpreter = new Lua.LuaInterpreter(shared); } + + protected override void NewLine() { string commandText = LineBuilder.ToString(); - if (Shared.ScriptHandler.IsCommandComplete(commandText)) + if (Shared.InterpreterLink.IsCommandComplete(commandText)) { base.NewLine(); AddCommandHistoryEntry(commandText); // add to history first so that if ProcessCommand generates an exception, @@ -69,7 +69,7 @@ public override bool SpecialKey(char key) { if (key == (char)UnicodeCommand.BREAK) { - Shared.Cpu.BreakExecution(true); + Shared.InterpreterLink.BreakExecution(true); LineBuilder.Remove(0, LineBuilder.Length); // why isn't there a StringBuilder.Clear()? NewLine(); // process the now emptied line, to make it do all the updates it normally @@ -125,35 +125,19 @@ public string GetCommandHistoryAbsolute(int absoluteIndex) return commandHistory[absoluteIndex-1]; } - protected virtual void ProcessCommand(string commandText) + public int GetCommandHistoryIndex() { - CompileCommand(commandText); + return commandHistoryIndex; } - protected void CompileCommand(string commandText) + protected virtual void ProcessCommand(string commandText) { if (Shared.ScriptHandler == null) return; try { UnityEngine.Debug.Log("command: "+commandText); - luaInterpreter.ProcessCommand(commandText); -/* CompilerOptions options = new CompilerOptions - { - LoadProgramsInSameAddressSpace = false, - FuncManager = Shared.FunctionManager, - BindManager = Shared.BindingMgr, - AllowClobberBuiltins = SafeHouse.Config.AllowClobberBuiltIns, - IsCalledFromRun = false - }; - - List commandParts = Shared.ScriptHandler.Compile(new InterpreterPath(this), - commandHistoryIndex, commandText, InterpreterName, options); - if (commandParts == null) return; - - var interpreterContext = ((CPU)Shared.Cpu).GetInterpreterContext(); - interpreterContext.AddParts(commandParts); -*/ + Shared.InterpreterLink.ProcessCommand(commandText); } catch (Exception e) { @@ -166,11 +150,7 @@ protected void CompileCommand(string commandText) public bool IsWaitingForCommand() { - IProgramContext context = ((CPU)Shared.Cpu).GetInterpreterContext(); - // If running from a boot script, there will be no interpreter instructions, - // only a single OpcodeEOF. So we check to see if the interpreter is locked, - // which is a sign that a sub-program is running. - return !locked && context.Program[context.InstructionPointer] is OpcodeEOF; + return !locked && Shared.InterpreterLink.IsWaitingForCommand(); } public void SetInputLock(bool isLocked) diff --git a/src/kOS/Screen/KSLink.cs b/src/kOS/Screen/KSLink.cs new file mode 100644 index 0000000000..342aa2ad13 --- /dev/null +++ b/src/kOS/Screen/KSLink.cs @@ -0,0 +1,87 @@ +using kOS.Safe.Compilation; +using kOS.Safe.Execution; +using kOS.Safe.Screen; +using kOS.Safe.Utilities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace kOS.Screen +{ + public class KSLink : IInterpreterLink + { + public const string InterpreterName = "interpreter"; + + protected SharedObjects Shared { get; private set; } + + public KSLink(SharedObjects shared) + { + Shared = shared; + } + + public void ProcessCommand(string commandText) + { + CompilerOptions options = new CompilerOptions + { + LoadProgramsInSameAddressSpace = false, + FuncManager = Shared.FunctionManager, + BindManager = Shared.BindingMgr, + AllowClobberBuiltins = SafeHouse.Config.AllowClobberBuiltIns, + IsCalledFromRun = false + }; + + List commandParts = Shared.ScriptHandler.Compile(new InterpreterPath(Shared.Interpreter as Interpreter), + Shared.Interpreter.GetCommandHistoryIndex(), commandText, InterpreterName, options); + if (commandParts == null) return; + + var interpreterContext = ((CPU)Shared.Cpu).GetInterpreterContext(); + interpreterContext.AddParts(commandParts); + } + + public bool IsCommandComplete(string commandText) + { + return Shared.ScriptHandler.IsCommandComplete(commandText); + } + + public bool IsWaitingForCommand() + { + IProgramContext context = ((CPU)Shared.Cpu).GetInterpreterContext(); + // If running from a boot script, there will be no interpreter instructions, + // only a single OpcodeEOF. So we check to see if the interpreter is locked, + // which is a sign that a sub-program is running. + return context.Program[context.InstructionPointer] is OpcodeEOF; + } + + public void BreakExecution(bool manual) + { + Shared.Cpu.BreakExecution(manual); + } + + public int InstructionsThisUpdate() + { + return Shared.Cpu.InstructionsThisUpdate; + } + + private class InterpreterPath : InternalPath + { + private Interpreter interpreter; + + public InterpreterPath(Interpreter interpreter) : base() + { + this.interpreter = interpreter; + } + + public override string Line(int line) + { + return interpreter.GetCommandHistoryAbsolute(line); + } + + public override string ToString() + { + return InterpreterName; + } + } + } +} diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index 312e158215..b39e778369 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -97,6 +97,7 @@ + From 7aff5d4ea7a8fbd233ab54279a1fb6a9a7ca19f8 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 10 Sep 2024 13:33:43 +0300 Subject: [PATCH 003/108] Gitignore part thumbnails added through the KSP symlink --- .gitignore | 3 +++ .../GameData/kOS/Parts/@thumbs/KAL9000_icon.png | Bin 13460 -> 0 bytes 2 files changed, 3 insertions(+) delete mode 100644 Resources/GameData/kOS/Parts/@thumbs/KAL9000_icon.png diff --git a/.gitignore b/.gitignore index 71a83d5306..978952cc5d 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,9 @@ packages/ # Symlink to KSP directory KSPdirlink +# Part thumbnails added through the KSP symlink +Resources/GameData/kOS/Parts/@thumbs/ + # OS Specific .DS_STORE* [Tt]humbs.db diff --git a/Resources/GameData/kOS/Parts/@thumbs/KAL9000_icon.png b/Resources/GameData/kOS/Parts/@thumbs/KAL9000_icon.png deleted file mode 100644 index 70e21a32437a90a932b848ae146ad44c058f1aff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13460 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 i|KG Date: Tue, 10 Sep 2024 15:04:22 +0300 Subject: [PATCH 004/108] Changed class and interface names after logic separation IInterpreter -> ITerminal Interpreter -> Terminal SafeSharedObjects.Interpreter -> SafeSharedObjects.Terminal ConnectivityInterpreter -> ConnectivityTerminal IInterpreterLink -> IInterpreter SafeSharedObjects.InterpreterLink -> SafeSharedObjects.Interpreter KSLink -> KSInterpreter --- src/kOS.Safe/Execution/CPU.cs | 6 ++--- src/kOS.Safe/Lua/ILuaInterpreter.cs | 13 --------- src/kOS.Safe/SafeSharedObjects.cs | 5 ++-- src/kOS.Safe/Screen/IInterpreter.cs | 21 ++++++++------- src/kOS.Safe/Screen/IInterpreterLink.cs | 17 ------------ src/kOS.Safe/Screen/ITerminal.cs | 16 +++++++++++ src/kOS.Safe/kOS.Safe.csproj | 3 +-- src/kOS/KSPLogger.cs | 2 +- src/kOS/Lua/LuaInterpreter.cs | 4 +-- src/kOS/Module/kOSProcessor.cs | 27 +++++++------------ ...Interpreter.cs => ConnectivityTerminal.cs} | 6 ++--- .../Screen/{KSLink.cs => KSInterpreter.cs} | 12 ++++----- src/kOS/Screen/TermWindow.cs | 16 +++++------ .../Screen/{Interpreter.cs => Terminal.cs} | 18 ++++++------- src/kOS/SharedObjects.cs | 2 +- src/kOS/kOS.csproj | 6 ++--- 16 files changed, 76 insertions(+), 98 deletions(-) delete mode 100644 src/kOS.Safe/Lua/ILuaInterpreter.cs delete mode 100644 src/kOS.Safe/Screen/IInterpreterLink.cs create mode 100644 src/kOS.Safe/Screen/ITerminal.cs rename src/kOS/Screen/{ConnectivityInterpreter.cs => ConnectivityTerminal.cs} (97%) rename src/kOS/Screen/{KSLink.cs => KSInterpreter.cs} (86%) rename src/kOS/Screen/{Interpreter.cs => Terminal.cs} (91%) diff --git a/src/kOS.Safe/Execution/CPU.cs b/src/kOS.Safe/Execution/CPU.cs index d6d35cd1dd..682e08f386 100644 --- a/src/kOS.Safe/Execution/CPU.cs +++ b/src/kOS.Safe/Execution/CPU.cs @@ -139,7 +139,7 @@ public void Boot() // clear global variables globalVariables.Clear(); // clear interpreter - if (shared.Interpreter != null) shared.Interpreter.Reset(); + if (shared.Terminal != null) shared.Terminal.Reset(); // load functions if (shared.FunctionManager != null) shared.FunctionManager.Load(); // load bindings @@ -233,7 +233,7 @@ private void PushContext(ProgramContext context) if (contexts.Count > 1) { - shared.Interpreter.SetInputLock(true); + shared.Terminal.SetInputLock(true); } } @@ -268,7 +268,7 @@ private void PopContext() if (contexts.Count == 1) { - shared.Interpreter.SetInputLock(false); + shared.Terminal.SetInputLock(false); } } IsPoppingContext = false; diff --git a/src/kOS.Safe/Lua/ILuaInterpreter.cs b/src/kOS.Safe/Lua/ILuaInterpreter.cs deleted file mode 100644 index 023f048a54..0000000000 --- a/src/kOS.Safe/Lua/ILuaInterpreter.cs +++ /dev/null @@ -1,13 +0,0 @@ -using kOS.Safe.Screen; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace kOS.Safe.Lua -{ - public interface ILuaInterpreter : IInterpreterLink, IFixedUpdateObserver - { - } -} diff --git a/src/kOS.Safe/SafeSharedObjects.cs b/src/kOS.Safe/SafeSharedObjects.cs index 3c7620198c..8a5c48d6de 100644 --- a/src/kOS.Safe/SafeSharedObjects.cs +++ b/src/kOS.Safe/SafeSharedObjects.cs @@ -3,7 +3,6 @@ using kOS.Safe.Compilation; using kOS.Safe.Execution; using kOS.Safe.Function; -using kOS.Safe.Lua; using kOS.Safe.Module; using kOS.Safe.Persistence; using kOS.Safe.Screen; @@ -14,9 +13,9 @@ namespace kOS.Safe public class SafeSharedObjects { public ICpu Cpu { get; set; } - public IInterpreterLink InterpreterLink { get; set; } - public IScreenBuffer Screen { get; set; } public IInterpreter Interpreter { get; set; } + public IScreenBuffer Screen { get; set; } + public ITerminal Terminal { get; set; } public IBindingManager BindingMgr { get; set; } public Script ScriptHandler { get; set; } public ILogger Logger { get; set; } diff --git a/src/kOS.Safe/Screen/IInterpreter.cs b/src/kOS.Safe/Screen/IInterpreter.cs index d50613731b..da0d7d193f 100644 --- a/src/kOS.Safe/Screen/IInterpreter.cs +++ b/src/kOS.Safe/Screen/IInterpreter.cs @@ -1,16 +1,17 @@ -using kOS.Safe.Utilities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; namespace kOS.Safe.Screen { - public interface IInterpreter : IScreenBuffer + public interface IInterpreter { - void Type(char ch); - bool SpecialKey(char key); - string GetCommandHistoryAbsolute(int absoluteIndex); - int GetCommandHistoryIndex(); - void SetInputLock(bool isLocked); - bool IsAtStartOfCommand(); + void ProcessCommand(string commandText); + bool IsCommandComplete(string commandText); bool IsWaitingForCommand(); - void Reset(); + void BreakExecution(bool manual); + int InstructionsThisUpdate(); } -} \ No newline at end of file +} diff --git a/src/kOS.Safe/Screen/IInterpreterLink.cs b/src/kOS.Safe/Screen/IInterpreterLink.cs deleted file mode 100644 index 4e38d03135..0000000000 --- a/src/kOS.Safe/Screen/IInterpreterLink.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace kOS.Safe.Screen -{ - public interface IInterpreterLink - { - void ProcessCommand(string commandText); - bool IsCommandComplete(string commandText); - bool IsWaitingForCommand(); - void BreakExecution(bool manual); - int InstructionsThisUpdate(); - } -} diff --git a/src/kOS.Safe/Screen/ITerminal.cs b/src/kOS.Safe/Screen/ITerminal.cs new file mode 100644 index 0000000000..b9a8e775a7 --- /dev/null +++ b/src/kOS.Safe/Screen/ITerminal.cs @@ -0,0 +1,16 @@ +using kOS.Safe.Utilities; + +namespace kOS.Safe.Screen +{ + public interface ITerminal : IScreenBuffer + { + void Type(char ch); + bool SpecialKey(char key); + string GetCommandHistoryAbsolute(int absoluteIndex); + int GetCommandHistoryIndex(); + void SetInputLock(bool isLocked); + bool IsAtStartOfCommand(); + bool IsWaitingForCommand(); + void Reset(); + } +} \ No newline at end of file diff --git a/src/kOS.Safe/kOS.Safe.csproj b/src/kOS.Safe/kOS.Safe.csproj index 284fc16fa5..6d4e5b2892 100644 --- a/src/kOS.Safe/kOS.Safe.csproj +++ b/src/kOS.Safe/kOS.Safe.csproj @@ -197,7 +197,6 @@ - @@ -213,8 +212,8 @@ True Resources.resx + - diff --git a/src/kOS/KSPLogger.cs b/src/kOS/KSPLogger.cs index 9261c51d51..ceec4f90b9 100644 --- a/src/kOS/KSPLogger.cs +++ b/src/kOS/KSPLogger.cs @@ -130,7 +130,7 @@ private string TraceLog() else msg += "Called from "; - msg += (thisOpcode is OpcodeEOF) ? Interpreter.InterpreterName + msg += (thisOpcode is OpcodeEOF) ? Terminal.InterpreterName : BuildLocationString(thisOpcode.SourcePath, thisOpcode.SourceLine); msg += "\n" + textLine + "\n"; diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 98a5b5c026..330a2a35eb 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -13,13 +13,13 @@ using NLua; using KeraLua; using kOS.Safe; -using kOS.Safe.Lua; using kOS.Safe.Utilities; using Debug = UnityEngine.Debug; +using kOS.Safe.Screen; namespace kOS.Lua { - public class LuaInterpreter : ILuaInterpreter + public class LuaInterpreter : IInterpreter, IFixedUpdateObserver { private NLua.Lua state; private KeraLua.Lua commandCoroutine; diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 8dbf98f53b..72f1ad12d5 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -462,8 +462,8 @@ private void InitInterpreterField(StartState state) private void OnInterpreterChanged(BaseField field, object prevValue) { UnityEngine.Debug.Log("interpreter changed. "+prevValue.ToString()+" to "+interpreterLanguage); - if (interpreterLanguage == "Lua") shared.InterpreterLink = new LuaInterpreter(shared); - else shared.InterpreterLink = new KSLink(shared); + if (interpreterLanguage == "Lua") shared.Interpreter = new LuaInterpreter(shared); + else shared.Interpreter = new KSInterpreter(shared); } private void InitUI() @@ -605,8 +605,8 @@ public void InitObjects() shared.KSPPart = part; shared.UpdateHandler = new UpdateHandler(); shared.BindingMgr = new BindingManager(shared); - shared.Interpreter = new Screen.ConnectivityInterpreter(shared); - shared.Screen = shared.Interpreter; + shared.Terminal = new Screen.ConnectivityTerminal(shared); + shared.Screen = shared.Terminal; shared.ScriptHandler = new KSScript(); shared.Logger = new KSPLogger(shared); shared.VolumeMgr = new ConnectivityVolumeManager(shared); @@ -617,15 +617,8 @@ public void InitObjects() shared.AddonManager = new AddOns.AddonManager(shared); shared.GameEventDispatchManager = new GameEventDispatchManager(shared); - if (interpreterLanguage == "Lua") shared.InterpreterLink = new LuaInterpreter(shared); - else shared.InterpreterLink = new KSLink(shared); - // TODO: proper names. Interpreter class should probably be called Terminal now - // Interpreter -> Terminal - // ConnectivityInterpreter -> ConnectivityTerminal - // IInterpreter -> ITerminal - // IInterpreterLink -> IInterpreter - // KSLink -> KSInterpreter - + if (interpreterLanguage == "Lua") shared.Interpreter = new LuaInterpreter(shared); + else shared.Interpreter = new KSInterpreter(shared); // TODO: add methods like Boot, Shutdown to IInterpreterLink // OnInterpreterChanged would call them to swap interpreters out so they dont run at the same time @@ -1136,7 +1129,7 @@ private void ProcessElectricity(Part partObj, float time) { // Because the processor is not STARVED, evaluate the power requirement based on actual operation. // For EC drain purposes, always pretend atleast 1 instruction happened, so idle drain isn't quite zero: - int instructions = System.Math.Max(shared.InterpreterLink.InstructionsThisUpdate(), 1); + int instructions = System.Math.Max(shared.Interpreter.InstructionsThisUpdate(), 1); var request = volumePower * time + instructions * ECPerInstruction; if (request > 0) { @@ -1185,15 +1178,15 @@ private void ProcessorModeChanged() shared.VolumeMgr.SwitchTo(HardDisk); } HasBooted = false; // When FixedUpdate() first happesn, then the boot will happen. - if (shared.Interpreter != null) shared.Interpreter.SetInputLock(false); + if (shared.Terminal != null) shared.Terminal.SetInputLock(false); if (shared.Window != null) shared.Window.IsPowered = true; foreach (var w in shared.ManagedWindows) w.IsPowered = true; break; case ProcessorModes.OFF: case ProcessorModes.STARVED: - if (shared.Cpu != null) shared.InterpreterLink.BreakExecution(true); - if (shared.Interpreter != null) shared.Interpreter.SetInputLock(true); + if (shared.Cpu != null) shared.Interpreter.BreakExecution(true); + if (shared.Terminal != null) shared.Terminal.SetInputLock(true); if (shared.Window != null) shared.Window.IsPowered = false; if (shared.SoundMaker != null) shared.SoundMaker.StopAllVoices(); foreach (var w in shared.ManagedWindows) w.IsPowered = false; diff --git a/src/kOS/Screen/ConnectivityInterpreter.cs b/src/kOS/Screen/ConnectivityTerminal.cs similarity index 97% rename from src/kOS/Screen/ConnectivityInterpreter.cs rename to src/kOS/Screen/ConnectivityTerminal.cs index c080ddeff4..88cd1b3829 100644 --- a/src/kOS/Screen/ConnectivityInterpreter.cs +++ b/src/kOS/Screen/ConnectivityTerminal.cs @@ -7,7 +7,7 @@ namespace kOS.Screen { - public class ConnectivityInterpreter : Interpreter, IUpdateObserver + public class ConnectivityTerminal : Terminal, IUpdateObserver { private readonly List commandQueue = new List(); private readonly List batchQueue = new List(); @@ -20,14 +20,14 @@ public class ConnectivityInterpreter : Interpreter, IUpdateObserver private string deploymentMessage; private bool signalLossWarning; - public ConnectivityInterpreter(SharedObjects shared) : base(shared) + public ConnectivityTerminal(SharedObjects shared) : base(shared) { Shared.UpdateHandler.AddObserver(this); CreateProgressBarSubBuffer(this); AddResizeNotifier(CreateProgressBarSubBuffer); } - ~ConnectivityInterpreter() + ~ConnectivityTerminal() { // Normally this design pattern would fail because the notifier hooks // would be references that prevent orphaning and thus we can't remove diff --git a/src/kOS/Screen/KSLink.cs b/src/kOS/Screen/KSInterpreter.cs similarity index 86% rename from src/kOS/Screen/KSLink.cs rename to src/kOS/Screen/KSInterpreter.cs index 342aa2ad13..370904805a 100644 --- a/src/kOS/Screen/KSLink.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -10,13 +10,13 @@ namespace kOS.Screen { - public class KSLink : IInterpreterLink + public class KSInterpreter : IInterpreter { public const string InterpreterName = "interpreter"; protected SharedObjects Shared { get; private set; } - public KSLink(SharedObjects shared) + public KSInterpreter(SharedObjects shared) { Shared = shared; } @@ -32,8 +32,8 @@ public void ProcessCommand(string commandText) IsCalledFromRun = false }; - List commandParts = Shared.ScriptHandler.Compile(new InterpreterPath(Shared.Interpreter as Interpreter), - Shared.Interpreter.GetCommandHistoryIndex(), commandText, InterpreterName, options); + List commandParts = Shared.ScriptHandler.Compile(new InterpreterPath(Shared.Terminal as Terminal), + Shared.Terminal.GetCommandHistoryIndex(), commandText, InterpreterName, options); if (commandParts == null) return; var interpreterContext = ((CPU)Shared.Cpu).GetInterpreterContext(); @@ -66,9 +66,9 @@ public int InstructionsThisUpdate() private class InterpreterPath : InternalPath { - private Interpreter interpreter; + private Terminal interpreter; - public InterpreterPath(Interpreter interpreter) : base() + public InterpreterPath(Terminal interpreter) : base() { this.interpreter = interpreter; } diff --git a/src/kOS/Screen/TermWindow.cs b/src/kOS/Screen/TermWindow.cs index a84233f2be..16eb0aa26c 100644 --- a/src/kOS/Screen/TermWindow.cs +++ b/src/kOS/Screen/TermWindow.cs @@ -680,7 +680,7 @@ public bool ProcessOneInputChar(char ch, TelnetSingletonServer whichTelnet, bool case (char)0x0004/*control-D*/: // How users of unix shells are used to doing this. case (char)0x0018/*control-X*/: // How kOS did it in the past in the GUI window. - if (shared.Interpreter.IsAtStartOfCommand()) + if (shared.Terminal.IsAtStartOfCommand()) { if (whichTelnet == null) Close(); @@ -758,9 +758,9 @@ bool Type(char ch, bool doQueuing = true, bool forceQueue = true) bool accepted = false; if (shared != null) { - if ((!forceQueue) && shared.Interpreter != null && shared.Interpreter.IsWaitingForCommand()) + if ((!forceQueue) && shared.Terminal != null && shared.Terminal.IsWaitingForCommand()) { - shared.Interpreter.Type(ch); + shared.Terminal.Type(ch); accepted = true; } else if (doQueuing) @@ -803,10 +803,10 @@ bool SpecialKey(char key, bool doQueuing = true, bool forceQueue = true) bool wasUsed = false; if ((!forceQueue) && - shared.Interpreter != null && - (shared.Interpreter.IsWaitingForCommand() || rudeQueueSkipping)) + shared.Terminal != null && + (shared.Terminal.IsWaitingForCommand() || rudeQueueSkipping)) { - wasUsed = shared.Interpreter.SpecialKey(key); + wasUsed = shared.Terminal.SpecialKey(key); accepted = true; } else if (doQueuing) @@ -834,11 +834,11 @@ void ProcessUnconsumedInput() { return; // Fix race condition (Github issue #2925) where Update() calls this before FixedUpdate() has set up the CPU. } - if (shared != null && shared.Interpreter != null && shared.Interpreter.IsWaitingForCommand()) + if (shared != null && shared.Terminal != null && shared.Terminal.IsWaitingForCommand()) { Queue q = shared.Screen.CharInputQueue; - while (q.Count > 0 && shared.Interpreter.IsWaitingForCommand()) + while (q.Count > 0 && shared.Terminal.IsWaitingForCommand()) { // Setting doQueuing to false here just as an // additional safety measure. Hypothetically it diff --git a/src/kOS/Screen/Interpreter.cs b/src/kOS/Screen/Terminal.cs similarity index 91% rename from src/kOS/Screen/Interpreter.cs rename to src/kOS/Screen/Terminal.cs index 81e7412df3..02ba06f723 100644 --- a/src/kOS/Screen/Interpreter.cs +++ b/src/kOS/Screen/Terminal.cs @@ -11,16 +11,16 @@ namespace kOS.Screen { - public class Interpreter : TextEditor, IInterpreter + public class Terminal : TextEditor, ITerminal { - public const string InterpreterName = "interpreter"; + public const string InterpreterName = "interpreter"; // TODONOW private readonly List commandHistory = new List(); private int commandHistoryIndex; private bool locked; protected SharedObjects Shared { get; private set; } - public Interpreter(SharedObjects shared) + public Terminal(SharedObjects shared) { Shared = shared; } @@ -31,7 +31,7 @@ protected override void NewLine() { string commandText = LineBuilder.ToString(); - if (Shared.InterpreterLink.IsCommandComplete(commandText)) + if (Shared.Interpreter.IsCommandComplete(commandText)) { base.NewLine(); AddCommandHistoryEntry(commandText); // add to history first so that if ProcessCommand generates an exception, @@ -69,7 +69,7 @@ public override bool SpecialKey(char key) { if (key == (char)UnicodeCommand.BREAK) { - Shared.InterpreterLink.BreakExecution(true); + Shared.Interpreter.BreakExecution(true); LineBuilder.Remove(0, LineBuilder.Length); // why isn't there a StringBuilder.Clear()? NewLine(); // process the now emptied line, to make it do all the updates it normally @@ -137,7 +137,7 @@ protected virtual void ProcessCommand(string commandText) try { UnityEngine.Debug.Log("command: "+commandText); - Shared.InterpreterLink.ProcessCommand(commandText); + Shared.Interpreter.ProcessCommand(commandText); } catch (Exception e) { @@ -150,7 +150,7 @@ protected virtual void ProcessCommand(string commandText) public bool IsWaitingForCommand() { - return !locked && Shared.InterpreterLink.IsWaitingForCommand(); + return !locked && Shared.Interpreter.IsWaitingForCommand(); } public void SetInputLock(bool isLocked) @@ -177,9 +177,9 @@ public override void PrintAt(string textToPrint, int row, int column) private class InterpreterPath : InternalPath { - private Interpreter interpreter; + private Terminal interpreter; - public InterpreterPath(Interpreter interpreter) : base() + public InterpreterPath(Terminal interpreter) : base() { this.interpreter = interpreter; } diff --git a/src/kOS/SharedObjects.cs b/src/kOS/SharedObjects.cs index ddcd53e781..f31045f8e1 100644 --- a/src/kOS/SharedObjects.cs +++ b/src/kOS/SharedObjects.cs @@ -53,7 +53,7 @@ public void DestroyObjects() if (SoundMaker != null) { SoundMaker.StopAllVoices(); } if (UpdateHandler != null) { UpdateHandler.ClearAllObservers(); } if (GameEventDispatchManager != null) { GameEventDispatchManager.Clear(); } - if (Interpreter != null) { Interpreter.RemoveAllResizeNotifiers(); } + if (Terminal != null) { Terminal.RemoveAllResizeNotifiers(); } var props = typeof(SharedObjects).GetProperties(); IDisposable tempDisp; foreach (var prop in props) diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index b39e778369..769c0b4770 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -97,14 +97,14 @@ - + - + @@ -144,7 +144,7 @@ - + From b87fd2374380707699d51ebc4b4e6b7c25d7690f Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 11 Sep 2024 12:48:59 +0300 Subject: [PATCH 005/108] Make interpreters not run alongside each other --- src/kOS.Safe/Screen/IInterpreter.cs | 2 ++ src/kOS/Lua/LuaInterpreter.cs | 26 +++++++++++++++++++++++++- src/kOS/Module/kOSProcessor.cs | 29 ++++++++++++++++++++++++----- src/kOS/Screen/KSInterpreter.cs | 25 ++++++++++++++++++++----- src/kOS/Screen/Terminal.cs | 25 +------------------------ 5 files changed, 72 insertions(+), 35 deletions(-) diff --git a/src/kOS.Safe/Screen/IInterpreter.cs b/src/kOS.Safe/Screen/IInterpreter.cs index da0d7d193f..a08f3929f0 100644 --- a/src/kOS.Safe/Screen/IInterpreter.cs +++ b/src/kOS.Safe/Screen/IInterpreter.cs @@ -8,6 +8,8 @@ namespace kOS.Safe.Screen { public interface IInterpreter { + void Boot(); + void Shutdown(); void ProcessCommand(string commandText); bool IsCommandComplete(string commandText); bool IsWaitingForCommand(); diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 330a2a35eb..ef166df562 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -26,12 +26,18 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver private bool commandPending = false; private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; private static int instructionsThisUpdate = 0; + private const string version = "5.4"; protected SharedObjects Shared { get; private set; } public LuaInterpreter(SharedObjects shared) { Shared = shared; + } + + public void Boot() + { + state?.Dispose(); state = new NLua.Lua(); commandCoroutine = state.State.NewThread(); state["Shared"] = Shared; @@ -43,10 +49,28 @@ public LuaInterpreter(SharedObjects shared) Debug.LogException(e); } } + // TODO: boot files + + Shared.Cpu.Boot(); // TODO: do lua only booting when we figure out what lua needs to run + + if (Shared.Terminal != null) Shared.Terminal.Reset(); + // Booting message + if (Shared.Screen != null) + { + Shared.Screen.ClearScreen(); + string bootMessage = string.Format("kOS Operating System\nLua v{0}\n(manual at {1})\n \nProceed.\n", version, SafeHouse.DocumentationURL); + Shared.Screen.Print(bootMessage); + } Shared.UpdateHandler.AddFixedObserver(this); } - // This function will be running in c++ land so be careful about stuff being garbage collected + public void Shutdown() + { + Shared.UpdateHandler.RemoveFixedObserver(this); + BreakExecution(true); + } + + // This function will be running in lua land so be careful about stuff being garbage collected // Setting instructionsThisUpdate and instructionsPerUpdate to static somehow prevents them from being collected private void YieldHook(System.IntPtr L, System.IntPtr ar) { diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 72f1ad12d5..c67c37b85b 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -67,6 +67,7 @@ public string Tag private bool objectsInitialized = false; private int numUpdatesAfterStartHappened = 0; private bool finishedRP1ProceduralAvionicsUpdate = false; + private bool interpreterChanged = false; public float AdditionalMass { get; set; } @@ -459,11 +460,23 @@ private void InitInterpreterField(StartState state) } } - private void OnInterpreterChanged(BaseField field, object prevValue) + private void OnInterpreterChanged(BaseField field, object buggyPrevValue) { - UnityEngine.Debug.Log("interpreter changed. "+prevValue.ToString()+" to "+interpreterLanguage); - if (interpreterLanguage == "Lua") shared.Interpreter = new LuaInterpreter(shared); + // change the interpreter on the next fixed update instead of now because when you 'core:setfield("interpreter", "Lua").' + // it would OnInterpreterChanged() > SetMode(*off*) > ProcessorModeChanged() > Shared.Interpreter.Shutdown() > Shared.Cpu.BreakExecution(true) + // and kerboscript errors when you BreakExecution in the middle of executing + // the error is really harmless but its unplesant when it pops up + interpreterChanged = true; + var prevValue = shared.Interpreter is LuaInterpreter? "Lua" : "KerboScript"; + UnityEngine.Debug.Log("interpreter changed. "+prevValue+" to "+interpreterLanguage); + } + + private void ChangeInterpreter() + { + SetMode(ProcessorModes.OFF); + if (interpreterLanguage.ToLower() == "lua") shared.Interpreter = new LuaInterpreter(shared); else shared.Interpreter = new KSInterpreter(shared); + SetMode(ProcessorModes.READY); } private void InitUI() @@ -897,9 +910,14 @@ public void FixedUpdate() if (!HasBooted) { SafeHouse.Logger.LogWarning("First Update()"); - shared.Cpu.Boot(); // TODO: add to InterpreterLink + shared.Interpreter.Boot(); HasBooted = true; } + if (interpreterChanged) + { + interpreterChanged = false; + ChangeInterpreter(); + } UpdateVessel(); UpdateFixedObservers(); ProcessElectricity(part, TimeWarp.fixedDeltaTime); @@ -1185,7 +1203,7 @@ private void ProcessorModeChanged() case ProcessorModes.OFF: case ProcessorModes.STARVED: - if (shared.Cpu != null) shared.Interpreter.BreakExecution(true); + if (shared.Interpreter != null) shared.Interpreter.Shutdown(); if (shared.Terminal != null) shared.Terminal.SetInputLock(true); if (shared.Window != null) shared.Window.IsPowered = false; if (shared.SoundMaker != null) shared.SoundMaker.StopAllVoices(); @@ -1197,6 +1215,7 @@ private void ProcessorModeChanged() } + // TODO: this never gets called? We can use it to run programs on other kosprocessors. Perhaps even ones that are using different interpreters public void ExecuteInterProcCommand(InterProcCommand command) { if (command != null) diff --git a/src/kOS/Screen/KSInterpreter.cs b/src/kOS/Screen/KSInterpreter.cs index 370904805a..5d4bd4dd11 100644 --- a/src/kOS/Screen/KSInterpreter.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -21,6 +21,21 @@ public KSInterpreter(SharedObjects shared) Shared = shared; } + public void Boot() + { + Shared.UpdateHandler.AddFixedObserver(Shared.Cpu); + Shared.ScriptHandler.ClearContext(InterpreterName); + // TODO: ^ this line was previously in Shared.Terminal.Reset() and was being called from + // v Shared.Cpu.Boot() putting this line here changes the order of operations. Make sure nothing got broken + Shared.Cpu.Boot(); + } + + public void Shutdown() // Shutdown stops execution of kerboscript but keeps it alive + { + Shared.UpdateHandler.RemoveFixedObserver(Shared.Cpu); + BreakExecution(true); + } + public void ProcessCommand(string commandText) { CompilerOptions options = new CompilerOptions @@ -56,7 +71,7 @@ public bool IsWaitingForCommand() public void BreakExecution(bool manual) { - Shared.Cpu.BreakExecution(manual); + Shared.Cpu?.BreakExecution(manual); } public int InstructionsThisUpdate() @@ -66,16 +81,16 @@ public int InstructionsThisUpdate() private class InterpreterPath : InternalPath { - private Terminal interpreter; + private Terminal terminal; - public InterpreterPath(Terminal interpreter) : base() + public InterpreterPath(Terminal terminal) : base() { - this.interpreter = interpreter; + this.terminal = terminal; } public override string Line(int line) { - return interpreter.GetCommandHistoryAbsolute(line); + return terminal.GetCommandHistoryAbsolute(line); } public override string ToString() diff --git a/src/kOS/Screen/Terminal.cs b/src/kOS/Screen/Terminal.cs index 02ba06f723..d1d15ec092 100644 --- a/src/kOS/Screen/Terminal.cs +++ b/src/kOS/Screen/Terminal.cs @@ -13,7 +13,7 @@ namespace kOS.Screen { public class Terminal : TextEditor, ITerminal { - public const string InterpreterName = "interpreter"; // TODONOW + public const string InterpreterName = "interpreter"; // TODO: this is used by KSPLogger, get it from IInterpreter after separating tracing logic private readonly List commandHistory = new List(); private int commandHistoryIndex; private bool locked; @@ -25,8 +25,6 @@ public Terminal(SharedObjects shared) Shared = shared; } - - protected override void NewLine() { string commandText = LineBuilder.ToString(); @@ -162,7 +160,6 @@ public void SetInputLock(bool isLocked) public override void Reset() { - Shared.ScriptHandler.ClearContext(InterpreterName); commandHistory.Clear(); commandHistoryIndex = 0; base.Reset(); @@ -174,25 +171,5 @@ public override void PrintAt(string textToPrint, int row, int column) base.PrintAt(textToPrint, row, column); RestoreCursorPos(); } - - private class InterpreterPath : InternalPath - { - private Terminal interpreter; - - public InterpreterPath(Terminal interpreter) : base() - { - this.interpreter = interpreter; - } - - public override string Line(int line) - { - return interpreter.GetCommandHistoryAbsolute(line); - } - - public override string ToString() - { - return InterpreterName; - } - } } } From adc8653cfce2104fd8c3cf40b209fdd90737df10 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 11 Sep 2024 22:41:57 +0300 Subject: [PATCH 006/108] Interpreter specific error handling --- src/kOS/KSPLogger.cs | 4 +-- src/kOS/Lua/LuaInterpreter.cs | 52 +++++++++++++++++---------------- src/kOS/Screen/KSInterpreter.cs | 39 ++++++++++++++++--------- src/kOS/Screen/Terminal.cs | 16 +--------- 4 files changed, 55 insertions(+), 56 deletions(-) diff --git a/src/kOS/KSPLogger.cs b/src/kOS/KSPLogger.cs index ceec4f90b9..5bda2a1484 100644 --- a/src/kOS/KSPLogger.cs +++ b/src/kOS/KSPLogger.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -130,7 +130,7 @@ private string TraceLog() else msg += "Called from "; - msg += (thisOpcode is OpcodeEOF) ? Terminal.InterpreterName + msg += (thisOpcode is OpcodeEOF) ? KSInterpreter.InterpreterName : BuildLocationString(thisOpcode.SourcePath, thisOpcode.SourceLine); msg += "\n" + textLine + "\n"; diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index ef166df562..1dfc78a23a 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -26,7 +26,7 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver private bool commandPending = false; private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; private static int instructionsThisUpdate = 0; - private const string version = "5.4"; + public const string luaVersion = "5.4"; protected SharedObjects Shared { get; private set; } @@ -37,9 +37,9 @@ public LuaInterpreter(SharedObjects shared) public void Boot() { - state?.Dispose(); state = new NLua.Lua(); commandCoroutine = state.State.NewThread(); + commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 1); state["Shared"] = Shared; state["FlightGlobals"] = UnityEngine.MonoBehaviour.FindObjectOfType(); using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { @@ -58,7 +58,7 @@ public void Boot() if (Shared.Screen != null) { Shared.Screen.ClearScreen(); - string bootMessage = string.Format("kOS Operating System\nLua v{0}\n(manual at {1})\n \nProceed.\n", version, SafeHouse.DocumentationURL); + string bootMessage = string.Format("kOS Operating System\nLua v{0}\n(manual at {1})\n \nProceed.\n", luaVersion, SafeHouse.DocumentationURL); Shared.Screen.Print(bootMessage); } Shared.UpdateHandler.AddFixedObserver(this); @@ -67,7 +67,7 @@ public void Boot() public void Shutdown() { Shared.UpdateHandler.RemoveFixedObserver(this); - BreakExecution(true); + state?.Dispose(); } // This function will be running in lua land so be careful about stuff being garbage collected @@ -82,31 +82,28 @@ private void YieldHook(System.IntPtr L, System.IntPtr ar) public void ProcessCommand(string commandText) { - // TODO: use the chunk just created by IsCommandComplete and use C api instead of dostring - // reuse commandCoroutine? - state.DoString($@" -commandCoroutine = coroutine.create(assert(load([=[{commandText}]=], ""chunk"", ""t"", _ENV))) - "); - state.State.GetGlobal("commandCoroutine"); - commandCoroutine.Dispose(); - commandCoroutine = state.State.ToThread(-1); - state.State.Pop(1); - - // TODO: investigate performance and potentially find an alternative - // also make sure calling the yieldhook doesnt count as more instructions and if it does subtract them from instructionsThisUpdate - commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 1); - commandPending = true; + if ((LuaStatus)commandCoroutine.ResetThread() != LuaStatus.OK || commandCoroutine.LoadString(commandText, "command") != LuaStatus.OK) + { + var err = commandCoroutine.ToString(-1); + commandCoroutine.Pop(1); + DisplayError(err); + } else + { + commandPending = true; + } } public bool IsCommandComplete(string commandText) { - var status = commandCoroutine.LoadString(commandText); - if (status == LuaStatus.ErrSyntax) + if (commandCoroutine.LoadString(commandText) == LuaStatus.ErrSyntax) { var err = commandCoroutine.ToString(-1); + commandCoroutine.Pop(1); + // if the error is not caused by leaving stuff like do('"{ open let it go to ProcessCommand to be displayed to the user return !err.EndsWith(""); } - return true; // TODO: do i need to pop? + commandCoroutine.Pop(1); + return true; } public bool IsWaitingForCommand() @@ -116,13 +113,11 @@ public bool IsWaitingForCommand() public void BreakExecution(bool manual) { - commandCoroutine.Dispose(); - commandCoroutine = state.State.NewThread(); + commandCoroutine.ResetThread(); } public int InstructionsThisUpdate() { - //Debug.Log(Shared.Processor.Tag+" instructionsThisUpdate: "+instructionsThisUpdate); return instructionsThisUpdate; } @@ -137,7 +132,7 @@ public void KOSFixedUpdate(double dt) LuaStatus status = commandCoroutine.Resume(state.State, 0); if (status != LuaStatus.OK & status != LuaStatus.Yield) { - Shared.Logger.Log(new Exception(commandCoroutine.ToString(-1))); + DisplayError(commandCoroutine.ToString(-1)); } } } @@ -147,5 +142,12 @@ public void Dispose() state.Dispose(); Shared.UpdateHandler.RemoveFixedObserver(this); } + + private void DisplayError(string errorMessage) + { + Shared.Logger.Log("lua error: "+errorMessage); + Shared.SoundMaker.BeginFileSound("error"); + Shared.Screen.Print(errorMessage); + } } } diff --git a/src/kOS/Screen/KSInterpreter.cs b/src/kOS/Screen/KSInterpreter.cs index 5d4bd4dd11..a66812d18b 100644 --- a/src/kOS/Screen/KSInterpreter.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -38,21 +38,32 @@ public void Shutdown() // Shutdown stops execution of kerboscript but keeps it a public void ProcessCommand(string commandText) { - CompilerOptions options = new CompilerOptions + if (Shared.ScriptHandler == null) return; + try { - LoadProgramsInSameAddressSpace = false, - FuncManager = Shared.FunctionManager, - BindManager = Shared.BindingMgr, - AllowClobberBuiltins = SafeHouse.Config.AllowClobberBuiltIns, - IsCalledFromRun = false - }; - - List commandParts = Shared.ScriptHandler.Compile(new InterpreterPath(Shared.Terminal as Terminal), - Shared.Terminal.GetCommandHistoryIndex(), commandText, InterpreterName, options); - if (commandParts == null) return; - - var interpreterContext = ((CPU)Shared.Cpu).GetInterpreterContext(); - interpreterContext.AddParts(commandParts); + CompilerOptions options = new CompilerOptions + { + LoadProgramsInSameAddressSpace = false, + FuncManager = Shared.FunctionManager, + BindManager = Shared.BindingMgr, + AllowClobberBuiltins = SafeHouse.Config.AllowClobberBuiltIns, + IsCalledFromRun = false + }; + + List commandParts = Shared.ScriptHandler.Compile(new InterpreterPath(Shared.Terminal as Terminal), + Shared.Terminal.GetCommandHistoryIndex(), commandText, InterpreterName, options); + if (commandParts == null) return; + + var interpreterContext = ((CPU)Shared.Cpu).GetInterpreterContext(); + interpreterContext.AddParts(commandParts); + } + catch (Exception e) + { + if (Shared.Logger != null) + { + Shared.Logger.Log(e); + } + } } public bool IsCommandComplete(string commandText) diff --git a/src/kOS/Screen/Terminal.cs b/src/kOS/Screen/Terminal.cs index d1d15ec092..1f6fcbe50f 100644 --- a/src/kOS/Screen/Terminal.cs +++ b/src/kOS/Screen/Terminal.cs @@ -13,7 +13,6 @@ namespace kOS.Screen { public class Terminal : TextEditor, ITerminal { - public const string InterpreterName = "interpreter"; // TODO: this is used by KSPLogger, get it from IInterpreter after separating tracing logic private readonly List commandHistory = new List(); private int commandHistoryIndex; private bool locked; @@ -130,20 +129,7 @@ public int GetCommandHistoryIndex() protected virtual void ProcessCommand(string commandText) { - if (Shared.ScriptHandler == null) return; - - try - { - UnityEngine.Debug.Log("command: "+commandText); - Shared.Interpreter.ProcessCommand(commandText); - } - catch (Exception e) - { - if (Shared.Logger != null) - { - Shared.Logger.Log(e); - } - } + Shared.Interpreter.ProcessCommand(commandText); } public bool IsWaitingForCommand() From 5314ce5c4ee9bc7e565293af99044f4dc00baa20 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 12 Sep 2024 20:28:17 +0300 Subject: [PATCH 007/108] Field work Make separate boot file fields and boot file selections in editor Make interpreterLanguage field case insensitive --- src/kOS/Binding/BindingManager.cs | 6 ++- src/kOS/Lua/LuaInterpreter.cs | 39 +++++++++++++++++- src/kOS/Module/kOSProcessor.cs | 66 ++++++++++++++++++++----------- src/kOS/Screen/KSInterpreter.cs | 2 + 4 files changed, 86 insertions(+), 27 deletions(-) diff --git a/src/kOS/Binding/BindingManager.cs b/src/kOS/Binding/BindingManager.cs index fab145bedd..a98574a4a3 100644 --- a/src/kOS/Binding/BindingManager.cs +++ b/src/kOS/Binding/BindingManager.cs @@ -1,5 +1,6 @@ using kOS.Safe.Binding; using kOS.Safe.Utilities; +using kOS.Screen; using System; using System.Collections.Generic; using System.Linq; @@ -81,7 +82,10 @@ public void AddBoundVariable(string name, BindingGetDlg getDelegate, BindingSetD Name = name, }; variables.Add(name, variable); - shared.Cpu.AddVariable(variable, name, false); + if (shared.Interpreter is KSInterpreter) + { + shared.Cpu.AddVariable(variable, name, false); + } } if (getDelegate != null) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 1dfc78a23a..bfaa0159f3 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -16,6 +16,7 @@ using kOS.Safe.Utilities; using Debug = UnityEngine.Debug; using kOS.Safe.Screen; +using kOS.Safe.Persistence; namespace kOS.Lua { @@ -27,6 +28,7 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; private static int instructionsThisUpdate = 0; public const string luaVersion = "5.4"; + public static readonly string[] FilenameExtensions = new string[] { "lua" }; protected SharedObjects Shared { get; private set; } @@ -49,9 +51,10 @@ public void Boot() Debug.LogException(e); } } - // TODO: boot files - Shared.Cpu.Boot(); // TODO: do lua only booting when we figure out what lua needs to run + if (Shared.GameEventDispatchManager != null) Shared.GameEventDispatchManager.Clear(); + if (Shared.FunctionManager != null) Shared.FunctionManager.Load(); + if (Shared.BindingMgr != null) Shared.BindingMgr.Load(); if (Shared.Terminal != null) Shared.Terminal.Reset(); // Booting message @@ -61,6 +64,38 @@ public void Boot() string bootMessage = string.Format("kOS Operating System\nLua v{0}\n(manual at {1})\n \nProceed.\n", luaVersion, SafeHouse.DocumentationURL); Shared.Screen.Print(bootMessage); } + + if (!Shared.Processor.CheckCanBoot()) return; + + VolumePath path = Shared.Processor.BootFilePath; + // Check to make sure the boot file name is valid, and then that the boot file exists. + if (path == null) + { + SafeHouse.Logger.Log("Boot file name is empty, skipping boot script"); + } + else + { + // Boot is only called once right after turning the processor on, + // the volume cannot yet have been changed from that set based on + // Config.StartOnArchive, and Processor.CheckCanBoot() has already + // handled the range check for the archive. + Volume sourceVolume = Shared.VolumeMgr.CurrentVolume; + var file = Shared.VolumeMgr.CurrentVolume.Open(path) as VolumeFile; + if (file == null) + { + SafeHouse.Logger.Log(string.Format("Boot file \"{0}\" is missing, skipping boot script", path)); + } + else + { + var content = file.ReadAll(); + if (content == null) + { + DisplayError(string.Format("File '{0}' not found", path)); + return; + } + ProcessCommand(content.String); // TODO: run through dofile when its ready + } + } Shared.UpdateHandler.AddFixedObserver(this); } diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index c67c37b85b..2af5be8deb 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -89,11 +89,14 @@ public string Tag private const string BootDirectoryName = "boot"; [KSPField(isPersistant = true, guiActive = true, guiActiveEditor = true, guiName = "Interpreter", groupName = PAWGroup, groupDisplayName = PAWGroup), UI_ChooseOption(scene = UI_Scene.All)] - public string interpreterLanguage = "KerboScript"; + public string interpreterLanguage = "kerboscript"; [KSPField(isPersistant = true, guiActive = false, guiActiveEditor = true, guiName = "Boot File", groupName = PAWGroup, groupDisplayName = PAWGroup), UI_ChooseOption(scene = UI_Scene.Editor)] public string bootFile = "None"; + [KSPField(isPersistant = true, guiActive = false, guiActiveEditor = true, guiName = "Lua Boot File", groupName = PAWGroup, groupDisplayName = PAWGroup), UI_ChooseOption(scene = UI_Scene.Editor)] + public string luaBootFile = "None"; + [KSPField(isPersistant = true, guiName = "kOS Disk Space", guiActive = true, groupName = PAWGroup, groupDisplayName = PAWGroup)] public int diskSpace = 1024; @@ -150,9 +153,9 @@ public kOSProcessor() public VolumePath BootFilePath { get { - if (string.IsNullOrEmpty(bootFile) || bootFile.Equals("None", StringComparison.OrdinalIgnoreCase)) + if (string.IsNullOrEmpty(BootFilename) || BootFilename.Equals("None", StringComparison.OrdinalIgnoreCase)) return null; - return VolumePath.FromString(bootFile); + return VolumePath.FromString(BootFilename); } } @@ -447,17 +450,19 @@ public static void SetBootListDirty() private void InitInterpreterField(StartState state) { BaseField interpreterLanguageField = Fields["interpreterLanguage"]; - List interpreterOptions = new List { "KerboScript", "Lua" }; - if (state == StartState.Editor) // TODO: show available boot files based on the selected interpreter + string[] interpreterDisplayNames = { "KerboScript", "Lua" }; + UI_ChooseOption interpreterLanguageOption; + if (state == StartState.Editor) { - var interpreterLanguageOption = (UI_ChooseOption)interpreterLanguageField.uiControlEditor; - interpreterLanguageOption.options = interpreterOptions.ToArray(); + interpreterLanguageOption = (UI_ChooseOption)interpreterLanguageField.uiControlEditor; + interpreterLanguageOption.onFieldChanged = (BaseField field, object obj) => InitUI(); } else { - var interpreterLanguageOption = (UI_ChooseOption)interpreterLanguageField.uiControlFlight; - interpreterLanguageOption.options = interpreterOptions.ToArray(); + interpreterLanguageOption = (UI_ChooseOption)interpreterLanguageField.uiControlFlight; interpreterLanguageOption.onFieldChanged = OnInterpreterChanged; } + interpreterLanguageOption.display = interpreterDisplayNames; + interpreterLanguageOption.options = interpreterDisplayNames.Select((display) => display.ToLower()).ToArray(); } private void OnInterpreterChanged(BaseField field, object buggyPrevValue) @@ -466,23 +471,35 @@ private void OnInterpreterChanged(BaseField field, object buggyPrevValue) // it would OnInterpreterChanged() > SetMode(*off*) > ProcessorModeChanged() > Shared.Interpreter.Shutdown() > Shared.Cpu.BreakExecution(true) // and kerboscript errors when you BreakExecution in the middle of executing // the error is really harmless but its unplesant when it pops up + interpreterLanguage = interpreterLanguage.ToLower(); interpreterChanged = true; var prevValue = shared.Interpreter is LuaInterpreter? "Lua" : "KerboScript"; - UnityEngine.Debug.Log("interpreter changed. "+prevValue+" to "+interpreterLanguage); + shared.Logger.Log("interpreter changed. "+prevValue+" to "+interpreterLanguage); } private void ChangeInterpreter() { - SetMode(ProcessorModes.OFF); if (interpreterLanguage.ToLower() == "lua") shared.Interpreter = new LuaInterpreter(shared); else shared.Interpreter = new KSInterpreter(shared); - SetMode(ProcessorModes.READY); } private void InitUI() { //Populate selector for boot scripts - BaseField field = Fields["bootFile"]; + BaseField ksField = Fields["bootFile"]; + BaseField luaField = Fields["luaBootFile"]; + BaseField field; + if (interpreterLanguage == "lua") + { + field = luaField; + ksField.guiActiveEditor = false; + ((UI_ChooseOption)ksField.uiControlEditor).controlEnabled = false; + } else + { + field = ksField; + luaField.guiActiveEditor = false; + ((UI_ChooseOption)luaField.uiControlEditor).controlEnabled = false; + } var options = (UI_ChooseOption)field.uiControlEditor; var bootFiles = new List(); @@ -538,15 +555,15 @@ private void InitUI() if (file != null) { // store the boot file information - bootFile = file.Path.ToString(); + BootFilename = file.Path.ToString(); if (!bootFiles.Contains(file.Path)) { - availableOptions.Insert(1, bootFile); + availableOptions.Insert(1, BootFilename); availableDisplays.Insert(1, "*" + file.Path.Name); // "*" is indication the file is not normally available } } } - SafeHouse.Logger.SuperVerbose("bootFile: " + bootFile); + SafeHouse.Logger.SuperVerbose("bootFile: " + BootFilename); options.options = availableOptions.ToArray(); options.display = availableDisplays.ToArray(); @@ -588,8 +605,10 @@ private IEnumerable BootDirectoryFiles() foreach (KeyValuePair pair in files) { - if (pair.Value is VolumeFile && (pair.Value.Extension.Equals(Volume.KERBOSCRIPT_EXTENSION) - || pair.Value.Extension.Equals(Volume.KOS_MACHINELANGUAGE_EXTENSION))) + string[] filenameExtensions = interpreterLanguage == "lua" ? + LuaInterpreter.FilenameExtensions : + KSInterpreter.FilenameExtensions; + if (pair.Value is VolumeFile && filenameExtensions.Any(extension => extension == pair.Value.Extension)) { result.Add(pair.Value.Path); } @@ -630,10 +649,7 @@ public void InitObjects() shared.AddonManager = new AddOns.AddonManager(shared); shared.GameEventDispatchManager = new GameEventDispatchManager(shared); - if (interpreterLanguage == "Lua") shared.Interpreter = new LuaInterpreter(shared); - else shared.Interpreter = new KSInterpreter(shared); - // TODO: add methods like Boot, Shutdown to IInterpreterLink - // OnInterpreterChanged would call them to swap interpreters out so they dont run at the same time + ChangeInterpreter(); // Make the window that is going to correspond to this kOS part: shared.Window = gameObject.AddComponent(); @@ -916,7 +932,9 @@ public void FixedUpdate() if (interpreterChanged) { interpreterChanged = false; + SetMode(ProcessorModes.OFF); ChangeInterpreter(); + SetMode(ProcessorModes.READY); } UpdateVessel(); UpdateFixedObservers(); @@ -1232,8 +1250,8 @@ public void SetAutopilotMode(int mode) public string BootFilename { - get { return bootFile; } - set { bootFile = value; } + get { return interpreterLanguage == "lua"? luaBootFile : bootFile; } + set { if (interpreterLanguage == "lua") luaBootFile = value; else bootFile = value; } } public bool CheckCanBoot() diff --git a/src/kOS/Screen/KSInterpreter.cs b/src/kOS/Screen/KSInterpreter.cs index a66812d18b..5bdb7f0a5f 100644 --- a/src/kOS/Screen/KSInterpreter.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -1,5 +1,6 @@ using kOS.Safe.Compilation; using kOS.Safe.Execution; +using kOS.Safe.Persistence; using kOS.Safe.Screen; using kOS.Safe.Utilities; using System; @@ -13,6 +14,7 @@ namespace kOS.Screen public class KSInterpreter : IInterpreter { public const string InterpreterName = "interpreter"; + public static readonly string[] FilenameExtensions = new string[] { Volume.KERBOSCRIPT_EXTENSION, Volume.KOS_MACHINELANGUAGE_EXTENSION }; protected SharedObjects Shared { get; private set; } From 286ebb343b6764d54fb65c3b951c93739195dfde Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 17 Sep 2024 11:27:26 +0300 Subject: [PATCH 008/108] Structure lua binding --- .../Suffixes/DelegateSuffixResult.cs | 4 + src/kOS/Binding/BindingManager.cs | 1 + src/kOS/Binding/CPUBinding.cs | 2 +- src/kOS/Lua/Binding.cs | 385 ++++++++++++++++++ src/kOS/Lua/LuaInterpreter.cs | 13 +- src/kOS/kOS.csproj | 1 + 6 files changed, 399 insertions(+), 7 deletions(-) create mode 100644 src/kOS/Lua/Binding.cs diff --git a/src/kOS.Safe/Encapsulation/Suffixes/DelegateSuffixResult.cs b/src/kOS.Safe/Encapsulation/Suffixes/DelegateSuffixResult.cs index cd9f6f146b..0f23a341b0 100644 --- a/src/kOS.Safe/Encapsulation/Suffixes/DelegateSuffixResult.cs +++ b/src/kOS.Safe/Encapsulation/Suffixes/DelegateSuffixResult.cs @@ -29,6 +29,10 @@ public class DelegateSuffixResult : ISuffixResult private readonly CallDel call; private Structure value; + public CallDel RawCall => call; + public DelegateInfo RawDelInfo => delInfo; + public void RawSetValue(Structure newValue) { value = newValue; } + public Structure Value { get { return value; } diff --git a/src/kOS/Binding/BindingManager.cs b/src/kOS/Binding/BindingManager.cs index a98574a4a3..fdda2daded 100644 --- a/src/kOS/Binding/BindingManager.cs +++ b/src/kOS/Binding/BindingManager.cs @@ -26,6 +26,7 @@ public class BindingManager : IBindingManager private static readonly HashSet> rawAttributes = new HashSet>(); private FlightControlManager flightControl; + public Dictionary RawVariables => variables; public BindingManager(SharedObjects shared) { diff --git a/src/kOS/Binding/CPUBinding.cs b/src/kOS/Binding/CPUBinding.cs index cf5f17f1c6..b38afe32b0 100644 --- a/src/kOS/Binding/CPUBinding.cs +++ b/src/kOS/Binding/CPUBinding.cs @@ -8,7 +8,7 @@ public class CPUBinding : Binding { public override void AddTo(SharedObjects shared) { - shared.BindingMgr.AddGetter("OPCODESLEFT", delegate { return kOSCustomParameters.Instance.InstructionsPerUpdate - shared.Cpu.InstructionsThisUpdate; }); + shared.BindingMgr.AddGetter("OPCODESLEFT", delegate { return kOSCustomParameters.Instance.InstructionsPerUpdate - shared.Interpreter.InstructionsThisUpdate(); }); shared.BindingMgr.MarkVolatile("OPCODESLEFT"); } } diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs new file mode 100644 index 0000000000..92934f50de --- /dev/null +++ b/src/kOS/Lua/Binding.cs @@ -0,0 +1,385 @@ +using KeraLua; +using kOS.Binding; +using kOS.Safe.Binding; +using kOS.Safe.Encapsulation; +using kOS.Safe.Encapsulation.Suffixes; +using kOS.Safe.Exceptions; +using kOS.Safe.Execution; +using kOS.Safe.Utilities; +using System; +using System.Collections.Generic; +using Debug = UnityEngine.Debug; + +namespace kOS.Lua +{ + internal class Binding + { + private static readonly Dictionary bindings = new Dictionary(); + + private class BindingData + { + public readonly Dictionary variables; + public readonly Dictionary objects; + public readonly Dictionary userdataPtrs; + public BindingData(Dictionary boundVariables) + { + variables = boundVariables; + objects = new Dictionary(); + userdataPtrs = new Dictionary(); + } + } + + public static void BindToState(KeraLua.Lua state, SharedObjects shared) + { + state = state.MainThread; + bindings[state.Handle] = new BindingData((shared.BindingMgr as BindingManager).RawVariables); + state.PushCFunction(EnvIndex); + state.SetGlobal("envIndex"); + state.PushCFunction(EnvNewIndex); + state.SetGlobal("envNewIndex"); + int oldTop = state.GetTop(); + state.DoString(@"local mt = { __index = envIndex, __newindex = envNewIndex }; setmetatable(_ENV, mt)"); + CreateUserdataMapTable(state); + if (state.NewMetaTable("Structure")) + { + state.PushString("__index"); + state.PushCFunction(StructureIndex); + state.RawSet(-3); + state.PushString("__newindex"); + state.PushCFunction(StructureNewIndex); + state.RawSet(-3); + state.PushString("__call"); + state.PushCFunction(StructureCall); + state.RawSet(-3); + state.PushString("__gc"); + state.PushCFunction(CollectObject); + state.RawSet(-3); + state.PushString("__tostring"); + state.PushCFunction(ObjectToString); + state.RawSet(-3); + } + state.SetTop(oldTop); + } + private static void CreateUserdataMapTable(KeraLua.Lua state) + { + state.PushString("userdataAdressToUserdata"); + state.NewTable(); + state.NewTable(); + state.PushString("__mode"); + state.PushString("v"); + state.SetTable(-3); + state.SetMetaTable(-2); + state.SetTable((int)LuaRegistry.Index); + } + + private static int CollectObject(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = bindings[state.MainThread.Handle]; + var userdataAdress = state.ToUserData(1); + var obj = binding.objects[userdataAdress]; + binding.userdataPtrs.Remove(obj); + binding.objects.Remove(userdataAdress); + return 0; + } + + private static int ObjectToString(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.PushString(bindings[state.MainThread.Handle].objects[state.ToUserData(1)].ToString()); + return 1; + } + + private static int EnvIndex(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var index = state.ToString(2); + var binding = bindings[state.MainThread.Handle]; + if (!binding.variables.TryGetValue(index, out var boundVar)) + { + state.PushNil(); + return 1; + } + try { return PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding); } + catch (Exception e) { return state.Error(e.Message); } + } + + private static int EnvNewIndex(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = bindings[state.MainThread.Handle]; + var index = state.ToString(2); + if (binding.variables.TryGetValue(index, out var boundVar) && boundVar.Set != null) + { + try { boundVar.Value = ToCSharpObject(state, 3, binding); } + catch (Exception e) { return state.Error(e.Message); } + } + else + { + state.RawSet(1); + } + return 0; + } + + private static int StructureIndex(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = bindings[state.MainThread.Handle]; + var structure = (Structure)binding.objects[state.ToUserData(1)]; + object pushValue = null; + if (structure is IIndexable && state.TypeName(2) == "number") + { + int intIndex = (int)state.ToInteger(2); + try { pushValue = Structure.ToPrimitive((structure as IIndexable).GetIndex(intIndex)); } + catch (Exception e) { return state.Error(e.Message); } + return PushLuaType(state, pushValue, binding); + } + var index = state.ToString(2); + if (structure.HasSuffix(index)) + { + var result = structure.GetSuffix(index); + if (result.HasValue) + { + pushValue = Structure.ToPrimitive(result.Value); + } else + { + var delegateResult = result as DelegateSuffixResult; + if (delegateResult.RawDelInfo.Parameters.Length == 0) + { + try { delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(delegateResult.RawCall(null))); } + catch (Exception e) { return state.Error(e.Message); } + pushValue = Structure.ToPrimitive(delegateResult.Value); // TODO: maybe skip the conversions? + } else + { + pushValue = delegateResult; + } + } + } + return PushLuaType(state, pushValue, binding); + } + + private static int StructureNewIndex(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = bindings[state.MainThread.Handle]; + var structure = (Structure)binding.objects[state.ToUserData(1)]; + object value = ToCSharpObject(state, 3, binding); + if (value != null) + { + if (structure is IIndexable && state.TypeName(2) == "number") + { + int intIndex = (int)state.ToInteger(2); + try { (structure as IIndexable).SetIndex(intIndex, Structure.FromPrimitive(value) as Structure); } + catch (Exception e) { return state.Error(e.Message); } + return 0; + } + var index = state.ToString(2); + try { structure.SetSuffix(index, Structure.FromPrimitive(value)); } + catch (Exception e) { return state.Error(e.Message); } + } + return 0; + } + + private static int StructureCall(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = bindings[state.MainThread.Handle]; + var structure = binding.objects[state.ToUserData(1)]; + if (!(structure is DelegateSuffixResult delegateResult)) { + return state.Error(string.Format("attempt to call a structure {0} value", structure.GetType().Name)); + } + // the next entire bit is copied from DelegateSuffixResult.Invoke method with a few changes + // that make it access arguments from the lua stack instead of kerboscript stack + try + { + var delInfo = delegateResult.RawDelInfo; + var args = new List(); + var paramArrayArgs = new List(); + + // Will be true iff the lastmost parameter of the delegate is using the C# 'param' keyword and thus + // expects the remainder of the arguments marshalled together into one array object. + bool isParamArrayArg = false; + + //CpuUtility.ReverseStackArgs(cpu, false); + int popIndex = 2; + for (int i = 0; i < delInfo.Parameters.Length; ++i) + { + DelegateParameter paramInfo = delInfo.Parameters[i]; + + //object arg = cpu.PopValueArgument(); + object arg = popIndex <= state.GetTop()? ToCSharpObject(state, popIndex++, binding) : new KOSArgMarkerType(); + Type argType = arg.GetType(); + isParamArrayArg = i == delInfo.Parameters.Length - 1 && delInfo.Parameters[i].IsParams; + + if (arg != null && arg.GetType() == CpuUtility.ArgMarkerType) + { + if (isParamArrayArg) + break; // with param arguments, you want to consume everything to the arg bottom - it's normal. + else + throw new KOSArgumentMismatchException(delInfo.Parameters.Length, delInfo.Parameters.Length - (i + 1)); + } + + // Either the expected type of this one parameter, or if it's a 'param' array as the last arg, then + // the expected type of that array's elements: + Type paramType = (paramInfo.IsParams ? paramInfo.ParameterType.GetElementType() : paramInfo.ParameterType); + + // Parameter type-safe checking: + bool inheritable = paramType.IsAssignableFrom(argType); + if (!inheritable) + { + bool castError = false; + // If it's not directly assignable to the expected type, maybe it's "castable" to it: + try + { + arg = Convert.ChangeType(arg, Type.GetTypeCode(paramType)); + } + catch (InvalidCastException) + { + throw new KOSCastException(argType, paramType); + } + catch (FormatException) + { + castError = true; + } + if (castError) + { + throw new Exception(string.Format("Argument {0}({1}) to method {2} should be {3} instead of {4}.", (delInfo.Parameters.Length - i), arg, delInfo.Name, paramType.Name, argType)); + } + } + + if (isParamArrayArg) + { + paramArrayArgs.Add(Structure.FromPrimitiveWithAssert(arg)); + --i; // keep hitting the last item in the param list again and again until a forced break because of arg bottom marker. + } + else + { + args.Add(Structure.FromPrimitiveWithAssert(arg)); + } + } + if (isParamArrayArg) + { + // collect the param array args that were at the end into the one single + // array item that will be sent to the method when invoked: + args.Add(paramArrayArgs.ToArray()); + } + // Consume the bottom marker under the args, which had better be + // immediately under the args we just popped, or the count was off. + if (!isParamArrayArg) // A param array arg will have already consumed the arg bottom mark. + { + bool foundArgMarker = false; + int numExtraArgs = 0; + //while (cpu.GetArgumentStackSize() > 0 && !foundArgMarker) + while (state.GetTop()-popIndex >= 0 && !foundArgMarker) + { + //object marker = cpu.PopValueArgument(); + object marker = popIndex <= state.GetTop()? ToCSharpObject(state, popIndex++, binding) : new KOSArgMarkerType(); + if (marker != null && marker.GetType() == CpuUtility.ArgMarkerType) + foundArgMarker = true; + else + ++numExtraArgs; + } + if (numExtraArgs > 0) + throw new KOSArgumentMismatchException(delInfo.Parameters.Length, delInfo.Parameters.Length + numExtraArgs); + } + + // Delegate.DynamicInvoke expects a null, rather than an array of zero length, when + // there are no arguments to pass: + object[] argArray = (args.Count > 0) ? args.ToArray() : null; + + //object val = call(argArray); + object val = delegateResult.RawCall(argArray); + if (delInfo.ReturnType == typeof(void)) + { + //value = ScalarValue.Create(0); + delegateResult.RawSetValue(ScalarValue.Create(0)); + } + else + { + delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(val)); + } + return PushLuaType(state, Structure.ToPrimitive(delegateResult.Value), binding); + } catch (Exception e) + { + return state.Error(e.Message); + } + } + + private static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding) + { + if (obj == null) + { + state.PushNil(); + } + else if (obj is double db) + { + state.PushNumber(db); + } + else if (obj is int i) + { + state.PushInteger(i); + } + else if (obj is string str) + { + state.PushString(str); + } + else if (obj is bool b) + { + state.PushBoolean(b); + } + else + { + PushObject(state, obj, binding); + } + return 1; + } + + private static object ToCSharpObject(KeraLua.Lua state, int index, BindingData binding) + { + switch (state.TypeName(index)) + { + case "number": + return state.ToNumber(index); + case "string": + return state.ToString(index); + case "boolean": + return state.ToBoolean(index); + case "userdata": + return binding.objects.GetValueOrDefault(state.ToUserData(index), null); + default: + return null; + } + } + + private static int PushObject(KeraLua.Lua state, object obj, BindingData binding) + { + state.GetMetaTable("userdataAdressToUserdata"); + if (binding.userdataPtrs.TryGetValue(obj, out IntPtr userdataAdress)) // Object already in the list of object userdata? Push the userdata + { + // Note: starting with lua5.1 the garbage collector may remove weak reference items (such as our userdataAdressToUserdata values) when the initial GC sweep + // occurs, but the actual call of the __gc finalizer for that object may not happen until a little while later. During that window we might call + // this routine and find the element missing from userdataAdressToUserdata, but CollectObject() has not yet been called. In that case, we go ahead and + // do the same thing CollectObject() does and remove from out object maps + state.PushLightUserData(userdataAdress); + if (state.RawGet(-2) != LuaType.Nil) return 1; // if found the objects userdata return it + + state.Remove(-1); // remove the nil value + + binding.objects.Remove(userdataAdress); // Remove from both our maps and fall out to create a new userdata + binding.userdataPtrs.Remove(obj); + } + + userdataAdress = state.NewUserData(0); + state.GetMetaTable("Structure"); + state.SetMetaTable(-2); + state.PushLightUserData(userdataAdress); + state.PushCopy(-2); + state.RawSet(-4); // add userdata on top of the stack to the userdataAdressToUserdata metatable at userdataAdress key + + binding.objects[userdataAdress] = obj; + binding.userdataPtrs[obj] = userdataAdress; + + return 1; + } + } +} diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index bfaa0159f3..ff9fceb145 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -42,6 +42,7 @@ public void Boot() state = new NLua.Lua(); commandCoroutine = state.State.NewThread(); commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 1); + Shared.UpdateHandler.AddFixedObserver(this); state["Shared"] = Shared; state["FlightGlobals"] = UnityEngine.MonoBehaviour.FindObjectOfType(); using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { @@ -56,6 +57,8 @@ public void Boot() if (Shared.FunctionManager != null) Shared.FunctionManager.Load(); if (Shared.BindingMgr != null) Shared.BindingMgr.Load(); + Binding.BindToState(commandCoroutine, Shared); + if (Shared.Terminal != null) Shared.Terminal.Reset(); // Booting message if (Shared.Screen != null) @@ -96,7 +99,6 @@ public void Boot() ProcessCommand(content.String); // TODO: run through dofile when its ready } } - Shared.UpdateHandler.AddFixedObserver(this); } public void Shutdown() @@ -105,11 +107,9 @@ public void Shutdown() state?.Dispose(); } - // This function will be running in lua land so be careful about stuff being garbage collected - // Setting instructionsThisUpdate and instructionsPerUpdate to static somehow prevents them from being collected - private void YieldHook(System.IntPtr L, System.IntPtr ar) + private static void YieldHook(IntPtr L, IntPtr ar) { - if (instructionsThisUpdate++ >= instructionsPerUpdate) + if (++instructionsThisUpdate >= instructionsPerUpdate) { KeraLua.Lua.FromIntPtr(L).Yield(0); } @@ -167,6 +167,7 @@ public void KOSFixedUpdate(double dt) LuaStatus status = commandCoroutine.Resume(state.State, 0); if (status != LuaStatus.OK & status != LuaStatus.Yield) { + commandCoroutine.ResetThread(); DisplayError(commandCoroutine.ToString(-1)); } } @@ -178,7 +179,7 @@ public void Dispose() Shared.UpdateHandler.RemoveFixedObserver(this); } - private void DisplayError(string errorMessage) + public void DisplayError(string errorMessage) { Shared.Logger.Log("lua error: "+errorMessage); Shared.SoundMaker.BeginFileSound("error"); diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index 769c0b4770..c92c2c558e 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -80,6 +80,7 @@ + From a104d58b867e46a92e8fda43baeac405acee8386 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 18 Sep 2024 11:17:08 +0300 Subject: [PATCH 009/108] Kerboscript functions lua binding --- src/kOS.Safe/Function/FunctionManager.cs | 11 +++- src/kOS.Safe/Function/IStackOperator.cs | 46 ++++++++++++++++ src/kOS.Safe/Function/KSStackOperator.cs | 57 +++++++++++++++++++ src/kOS.Safe/Function/LuaStackOperator.cs | 43 +++++++++++++++ src/kOS.Safe/Function/SafeFunctionBase.cs | 67 +++-------------------- src/kOS.Safe/Screen/IInterpreter.cs | 1 + src/kOS.Safe/kOS.Safe.csproj | 3 + src/kOS/KSPLogger.cs | 2 +- src/kOS/Lua/Binding.cs | 57 ++++++++++++++++--- src/kOS/Lua/LuaInterpreter.cs | 3 + src/kOS/Module/kOSProcessor.cs | 4 +- src/kOS/Screen/KSInterpreter.cs | 11 ++-- 12 files changed, 230 insertions(+), 75 deletions(-) create mode 100644 src/kOS.Safe/Function/IStackOperator.cs create mode 100644 src/kOS.Safe/Function/KSStackOperator.cs create mode 100644 src/kOS.Safe/Function/LuaStackOperator.cs diff --git a/src/kOS.Safe/Function/FunctionManager.cs b/src/kOS.Safe/Function/FunctionManager.cs index 2c0043fb6d..1f687b7fd5 100644 --- a/src/kOS.Safe/Function/FunctionManager.cs +++ b/src/kOS.Safe/Function/FunctionManager.cs @@ -13,6 +13,8 @@ public class FunctionManager : IFunctionManager private Dictionary functions; private static readonly Dictionary rawAttributes = new Dictionary(); + public Dictionary RawFunctions => functions; + public FunctionManager(SafeSharedObjects shared) { this.shared = shared; @@ -27,11 +29,18 @@ public void Load() var type = rawAttributes[attr]; if (attr == null || type == null) continue; object functionObject = Activator.CreateInstance(type); + string longestName = attr.Names.Aggregate(string.Empty, (max, cur) => cur.Length > max.Length? cur : max); foreach (string functionName in attr.Names) { if (functionName != string.Empty) { - functions.Add(functionName, (SafeFunctionBase)functionObject); + var function = (SafeFunctionBase)functionObject; + function.functionName = longestName; + if (shared.Interpreter.GetName() == "lua") + function.stackOperator = new LuaStackOperator(); + else + function.stackOperator = new KSStackOperator(); + functions.Add(functionName, function); } } } diff --git a/src/kOS.Safe/Function/IStackOperator.cs b/src/kOS.Safe/Function/IStackOperator.cs new file mode 100644 index 0000000000..7c5697705b --- /dev/null +++ b/src/kOS.Safe/Function/IStackOperator.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace kOS.Safe.Function +{ + public interface IStackOperator + { + /// + /// A utility function that a function's Execute() must use after it has popped all the + /// arguments it was expecting from the stack. It will assert that all the arguments + /// have been consumed exactly, and the next item on the stack is the arg bottom mark. + /// It will consume the arg bottom mark as well. + ///
+ /// If the assert fails, an exception is thrown. + ///
+ /// + void AssertArgBottomAndConsume(SafeSharedObjects shared, string functionName); + + /// + /// A utility function that a function's Execute() may use if it wishes to, to get a count of + /// how many args passed to it that it has not yet consumed still remain on the stack. + /// + /// + /// Number of args as yet unpopped. returns zero if there are no args, or -1 if there's a bug and the argstart marker is missing. + int CountRemainingArgs(SafeSharedObjects shared); + + /// + /// A utility function that a function's Execute() should use in place of cpu.PopValue(), + /// because it will assert that the value being popped is NOT an ARG_MARKER_STRING, and if it + /// is, it will throw the appropriate error. + /// + /// + object PopValueAssert(SafeSharedObjects shared, string functionName, bool barewordOkay = false); + + /// + /// A utility function that a function's Execute() should use in place of cpu.PopArgumentStack(), + /// because it will assert that the value being popped is NOT an ARG_MARKER_STRING, and if it + /// is, it will throw the appropriate error. + /// + /// + object PopStackAssert(SafeSharedObjects shared, string functionName); + } +} diff --git a/src/kOS.Safe/Function/KSStackOperator.cs b/src/kOS.Safe/Function/KSStackOperator.cs new file mode 100644 index 0000000000..644fc83b13 --- /dev/null +++ b/src/kOS.Safe/Function/KSStackOperator.cs @@ -0,0 +1,57 @@ +using kOS.Safe.Compilation; +using kOS.Safe.Exceptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace kOS.Safe.Function +{ + internal class KSStackOperator : IStackOperator + { + public void AssertArgBottomAndConsume(SafeSharedObjects shared, string functionName) + { + object shouldBeBottom = shared.Cpu.PopArgumentStack(); + if (shouldBeBottom != null && shouldBeBottom.GetType() == OpcodeCall.ArgMarkerType) + return; // Assert passed. + + throw new KOSArgumentMismatchException("Too many arguments were passed to " + functionName); + } + + public int CountRemainingArgs(SafeSharedObjects shared) + { + int depth = 0; + bool found = false; + bool stillInStack = true; + while (stillInStack && !found) + { + object peekItem = shared.Cpu.PeekRawArgument(depth, out stillInStack); + if (stillInStack && peekItem != null && peekItem.GetType() == OpcodeCall.ArgMarkerType) + found = true; + else + ++depth; + } + if (found) + return depth; + else + return -1; + } + + public object PopValueAssert(SafeSharedObjects shared, string functionName, bool barewordOkay = false) + { + object returnValue = shared.Cpu.PopValueArgument(barewordOkay); + if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) + throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); + return returnValue; + } + + public object PopStackAssert(SafeSharedObjects shared, string functionName) + { + object returnValue = shared.Cpu.PopArgumentStack(); + if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) + throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); + return returnValue; + } + } +} diff --git a/src/kOS.Safe/Function/LuaStackOperator.cs b/src/kOS.Safe/Function/LuaStackOperator.cs new file mode 100644 index 0000000000..fa75cb4780 --- /dev/null +++ b/src/kOS.Safe/Function/LuaStackOperator.cs @@ -0,0 +1,43 @@ +using kOS.Safe.Compilation; +using kOS.Safe.Exceptions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace kOS.Safe.Function +{ + /// + /// this exists to make functions made for kerboscript compatible with lua + /// + public class LuaStackOperator : IStackOperator + { + public Stack stack = new Stack(); + + public void AssertArgBottomAndConsume(SafeSharedObjects shared, string functionName) + { + if (stack.Count==0) return; + throw new KOSArgumentMismatchException("Too many arguments were passed to " + functionName); + } + + public int CountRemainingArgs(SafeSharedObjects shared) => stack.Count; + + public object PopValueAssert(SafeSharedObjects shared, string functionName, bool barewordOkay = false) + { // if barewordOkay it would transform an identifier into a string if there are no variables with this identifier and return it + // basically impossible to do with lua without changing lua itself + if (stack.TryPop(out var res)) + return res; + else + throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); + } + + public object PopStackAssert(SafeSharedObjects shared, string functionName) + { + if (stack.TryPop(out var res)) + return res; + else + throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); + } + } +} diff --git a/src/kOS.Safe/Function/SafeFunctionBase.cs b/src/kOS.Safe/Function/SafeFunctionBase.cs index 60a8388371..025a924629 100644 --- a/src/kOS.Safe/Function/SafeFunctionBase.cs +++ b/src/kOS.Safe/Function/SafeFunctionBase.cs @@ -1,4 +1,4 @@ -using kOS.Safe.Compilation; +using kOS.Safe.Compilation; using kOS.Safe.Encapsulation; using kOS.Safe.Exceptions; using System; @@ -8,6 +8,9 @@ namespace kOS.Safe.Function { public abstract class SafeFunctionBase { + public IStackOperator stackOperator; + public string functionName; + /// /// ALL FUNCTIONS in kOS will always have exactly one return value. We have no /// "void" functions, to keep the execution logic consistent and simple. Therefore @@ -101,14 +104,7 @@ protected double RadiansToDegrees(double radians) /// If the assert fails, an exception is thrown. /// /// - protected void AssertArgBottomAndConsume(SafeSharedObjects shared) - { - object shouldBeBottom = shared.Cpu.PopArgumentStack(); - if (shouldBeBottom != null && shouldBeBottom.GetType() == OpcodeCall.ArgMarkerType) - return; // Assert passed. - - throw new KOSArgumentMismatchException("Too many arguments were passed to " + GetFuncName()); - } + protected void AssertArgBottomAndConsume(SafeSharedObjects shared) => stackOperator.AssertArgBottomAndConsume(shared, functionName); /// /// A utility function that a function's Execute() may use if it wishes to, to get a count of @@ -116,24 +112,7 @@ protected void AssertArgBottomAndConsume(SafeSharedObjects shared) /// /// /// Number of args as yet unpopped. returns zero if there are no args, or -1 if there's a bug and the argstart marker is missing. - protected int CountRemainingArgs(SafeSharedObjects shared) - { - int depth = 0; - bool found = false; - bool stillInStack = true; - while (stillInStack && !found) - { - object peekItem = shared.Cpu.PeekRawArgument(depth, out stillInStack); - if (stillInStack && peekItem != null && peekItem.GetType() == OpcodeCall.ArgMarkerType) - found = true; - else - ++depth; - } - if (found) - return depth; - else - return -1; - } + protected int CountRemainingArgs(SafeSharedObjects shared) => stackOperator.CountRemainingArgs(shared); /// /// A utility function that a function's Execute() should use in place of cpu.PopValue(), @@ -141,13 +120,7 @@ protected int CountRemainingArgs(SafeSharedObjects shared) /// is, it will throw the appropriate error. /// /// - protected object PopValueAssert(SafeSharedObjects shared, bool barewordOkay = false) - { - object returnValue = shared.Cpu.PopValueArgument(barewordOkay); - if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) - throw new KOSArgumentMismatchException("Too few arguments were passed to " + GetFuncName()); - return returnValue; - } + protected object PopValueAssert(SafeSharedObjects shared, bool barewordOkay = false) => stackOperator.PopValueAssert(shared, functionName, barewordOkay); /// /// A utility function that a function's Execute() should use in place of cpu.PopArgumentStack(), @@ -155,13 +128,7 @@ protected object PopValueAssert(SafeSharedObjects shared, bool barewordOkay = fa /// is, it will throw the appropriate error. /// /// - protected object PopStackAssert(SafeSharedObjects shared) - { - object returnValue = shared.Cpu.PopArgumentStack(); - if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) - throw new KOSArgumentMismatchException("Too few arguments were passed to " + GetFuncName()); - return returnValue; - } + protected object PopStackAssert(SafeSharedObjects shared) => stackOperator.PopStackAssert(shared, functionName); /// /// Identical to PopValueAssert, but with the additional step of coercing the result @@ -174,22 +141,6 @@ protected Structure PopStructureAssertEncapsulated(SafeSharedObjects shared, boo return Structure.FromPrimitiveWithAssert(returnValue); } - protected string GetFuncName() - { - // The following is all just to extract the function name from the attribute. - // That really should be easier - string funcName = ""; // hopefully this cannot ever get seen by the user because of the next lines. - FunctionAttribute attr = (FunctionAttribute)GetType().GetCustomAttributes(typeof(FunctionAttribute), true).FirstOrDefault(); - if (attr != null) - { - // Of all the possible alias names, lets pick the longest one, as the most verbose description: - string longestOne = ""; - foreach (string name in attr.Names) - if (name.Length > longestOne.Length) - longestOne = name; - funcName = longestOne; - } - return funcName; - } + protected string GetFuncName() => functionName; } } \ No newline at end of file diff --git a/src/kOS.Safe/Screen/IInterpreter.cs b/src/kOS.Safe/Screen/IInterpreter.cs index a08f3929f0..10e97d8401 100644 --- a/src/kOS.Safe/Screen/IInterpreter.cs +++ b/src/kOS.Safe/Screen/IInterpreter.cs @@ -8,6 +8,7 @@ namespace kOS.Safe.Screen { public interface IInterpreter { + string GetName(); void Boot(); void Shutdown(); void ProcessCommand(string commandText); diff --git a/src/kOS.Safe/kOS.Safe.csproj b/src/kOS.Safe/kOS.Safe.csproj index 6d4e5b2892..c4ab57eaf4 100644 --- a/src/kOS.Safe/kOS.Safe.csproj +++ b/src/kOS.Safe/kOS.Safe.csproj @@ -192,6 +192,9 @@ + + + diff --git a/src/kOS/KSPLogger.cs b/src/kOS/KSPLogger.cs index 5bda2a1484..478d83c1c1 100644 --- a/src/kOS/KSPLogger.cs +++ b/src/kOS/KSPLogger.cs @@ -130,7 +130,7 @@ private string TraceLog() else msg += "Called from "; - msg += (thisOpcode is OpcodeEOF) ? KSInterpreter.InterpreterName + msg += (thisOpcode is OpcodeEOF) ? KSInterpreter.traceName : BuildLocationString(thisOpcode.SourcePath, thisOpcode.SourceLine); msg += "\n" + textLine + "\n"; diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 92934f50de..ac988e8e58 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -1,10 +1,12 @@ using KeraLua; using kOS.Binding; +using kOS.Safe; using kOS.Safe.Binding; using kOS.Safe.Encapsulation; using kOS.Safe.Encapsulation.Suffixes; using kOS.Safe.Exceptions; using kOS.Safe.Execution; +using kOS.Safe.Function; using kOS.Safe.Utilities; using System; using System.Collections.Generic; @@ -15,6 +17,7 @@ namespace kOS.Lua internal class Binding { private static readonly Dictionary bindings = new Dictionary(); + private static readonly Dictionary functions = new Dictionary(); private class BindingData { @@ -29,10 +32,22 @@ public BindingData(Dictionary boundVariables) } } + private class FunctionManager + { + public readonly Dictionary functions; + public readonly SafeSharedObjects Shared; + public FunctionManager(SafeSharedObjects shared, Dictionary functions) + { + Shared = shared; + this.functions = functions; + } + } + public static void BindToState(KeraLua.Lua state, SharedObjects shared) { state = state.MainThread; bindings[state.Handle] = new BindingData((shared.BindingMgr as BindingManager).RawVariables); + functions[state.Handle] = new FunctionManager(shared, (shared.FunctionManager as Safe.Function.FunctionManager).RawFunctions); state.PushCFunction(EnvIndex); state.SetGlobal("envIndex"); state.PushCFunction(EnvNewIndex); @@ -95,13 +110,17 @@ private static int EnvIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var index = state.ToString(2); var binding = bindings[state.MainThread.Handle]; - if (!binding.variables.TryGetValue(index, out var boundVar)) + if (binding.variables.TryGetValue(index, out var boundVar)) { - state.PushNil(); - return 1; + try { return PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding); } + catch (Exception e) { return state.Error(e.Message); } + } + var functionManager = functions[state.MainThread.Handle]; + if (functionManager.functions.TryGetValue(index, out var function)) + { + return PushLuaType(state, function, binding); } - try { return PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding); } - catch (Exception e) { return state.Error(e.Message); } + return 0; } private static int EnvNewIndex(IntPtr L) @@ -125,7 +144,11 @@ private static int StructureIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; - var structure = (Structure)binding.objects[state.ToUserData(1)]; + object obj = binding.objects[state.ToUserData(1)]; + var structure = obj as Structure; + if (structure == null) + return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); + object pushValue = null; if (structure is IIndexable && state.TypeName(2) == "number") { @@ -162,7 +185,10 @@ private static int StructureNewIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; - var structure = (Structure)binding.objects[state.ToUserData(1)]; + object obj = binding.objects[state.ToUserData(1)]; + var structure = obj as Structure; + if (structure == null) + return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); object value = ToCSharpObject(state, 3, binding); if (value != null) { @@ -185,9 +211,22 @@ private static int StructureCall(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; var structure = binding.objects[state.ToUserData(1)]; - if (!(structure is DelegateSuffixResult delegateResult)) { - return state.Error(string.Format("attempt to call a structure {0} value", structure.GetType().Name)); + if (structure is SafeFunctionBase function) + { + var stackOperator = function.stackOperator as LuaStackOperator; + stackOperator.stack.Clear(); + for (int i = 2; i <= state.GetTop(); i++) + stackOperator.stack.Push(ToCSharpObject(state, i, binding)); + + try { function.Execute(functions[state.MainThread.Handle].Shared); } + catch (Exception e) { return state.Error(e.Message); } + + return PushLuaType(state, Structure.ToPrimitive(function.ReturnValue), binding); } + var delegateResult = structure as DelegateSuffixResult; + if (delegateResult == null) + return state.Error(string.Format("attempt to call a structure {0} value", structure.GetType().Name)); + // the next entire bit is copied from DelegateSuffixResult.Invoke method with a few changes // that make it access arguments from the lua stack instead of kerboscript stack try diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index ff9fceb145..779d591939 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -27,6 +27,7 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver private bool commandPending = false; private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; private static int instructionsThisUpdate = 0; + private const string interpreterName = "lua"; public const string luaVersion = "5.4"; public static readonly string[] FilenameExtensions = new string[] { "lua" }; @@ -37,6 +38,8 @@ public LuaInterpreter(SharedObjects shared) Shared = shared; } + public string GetName() => interpreterName; + public void Boot() { state = new NLua.Lua(); diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 2af5be8deb..3f1684efe9 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -632,6 +632,8 @@ public void InitObjects() shared = new SharedObjects(); + ChangeInterpreter(); + shared.Vessel = vessel; shared.Processor = this; shared.KSPPart = part; @@ -649,8 +651,6 @@ public void InitObjects() shared.AddonManager = new AddOns.AddonManager(shared); shared.GameEventDispatchManager = new GameEventDispatchManager(shared); - ChangeInterpreter(); - // Make the window that is going to correspond to this kOS part: shared.Window = gameObject.AddComponent(); shared.Window.AttachTo(shared); diff --git a/src/kOS/Screen/KSInterpreter.cs b/src/kOS/Screen/KSInterpreter.cs index 5bdb7f0a5f..90d17dea4f 100644 --- a/src/kOS/Screen/KSInterpreter.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -13,7 +13,8 @@ namespace kOS.Screen { public class KSInterpreter : IInterpreter { - public const string InterpreterName = "interpreter"; + private const string interpreterName = "kerboscript"; + public const string traceName = "interpreter"; public static readonly string[] FilenameExtensions = new string[] { Volume.KERBOSCRIPT_EXTENSION, Volume.KOS_MACHINELANGUAGE_EXTENSION }; protected SharedObjects Shared { get; private set; } @@ -23,10 +24,12 @@ public KSInterpreter(SharedObjects shared) Shared = shared; } + public string GetName() => interpreterName; + public void Boot() { Shared.UpdateHandler.AddFixedObserver(Shared.Cpu); - Shared.ScriptHandler.ClearContext(InterpreterName); + Shared.ScriptHandler.ClearContext(traceName); // TODO: ^ this line was previously in Shared.Terminal.Reset() and was being called from // v Shared.Cpu.Boot() putting this line here changes the order of operations. Make sure nothing got broken Shared.Cpu.Boot(); @@ -53,7 +56,7 @@ public void ProcessCommand(string commandText) }; List commandParts = Shared.ScriptHandler.Compile(new InterpreterPath(Shared.Terminal as Terminal), - Shared.Terminal.GetCommandHistoryIndex(), commandText, InterpreterName, options); + Shared.Terminal.GetCommandHistoryIndex(), commandText, traceName, options); if (commandParts == null) return; var interpreterContext = ((CPU)Shared.Cpu).GetInterpreterContext(); @@ -108,7 +111,7 @@ public override string Line(int line) public override string ToString() { - return InterpreterName; + return traceName; } } } From e6007db24af970e5098becd855a36dc23f48bb36 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 21 Sep 2024 15:26:22 +0300 Subject: [PATCH 010/108] Interpreter swap rework Swapping is done in one place during kOSProcessor booting. Revert CPU initialization and booting to how it was done before --- src/kOS.Safe.Test/Execution/Noop.cs | 8 +++ src/kOS.Safe/Execution/CPU.cs | 22 ++++---- src/kOS.Safe/Function/FunctionManager.cs | 2 +- src/kOS.Safe/Module/IProcessor.cs | 2 + src/kOS.Safe/Screen/IInterpreter.cs | 7 +-- src/kOS/KSPLogger.cs | 2 +- src/kOS/Lua/LuaCPU.cs | 61 ++++++++++++++++++++ src/kOS/Lua/LuaInterpreter.cs | 71 ++++++++++++------------ src/kOS/Module/kOSProcessor.cs | 66 +++++++++++++--------- src/kOS/Screen/KSInterpreter.cs | 33 +++-------- src/kOS/Screen/Terminal.cs | 5 +- src/kOS/kOS.csproj | 1 + 12 files changed, 178 insertions(+), 102 deletions(-) create mode 100644 src/kOS/Lua/LuaCPU.cs diff --git a/src/kOS.Safe.Test/Execution/Noop.cs b/src/kOS.Safe.Test/Execution/Noop.cs index b2ff6e8291..c75b859392 100644 --- a/src/kOS.Safe.Test/Execution/Noop.cs +++ b/src/kOS.Safe.Test/Execution/Noop.cs @@ -73,6 +73,14 @@ public int KOSCoreId } } + public string InterpreterLanguage + { + get + { + return String.Empty; + } + } + public string Tag { get diff --git a/src/kOS.Safe/Execution/CPU.cs b/src/kOS.Safe/Execution/CPU.cs index 682e08f386..4b767d44f9 100644 --- a/src/kOS.Safe/Execution/CPU.cs +++ b/src/kOS.Safe/Execution/CPU.cs @@ -49,8 +49,8 @@ public bool Equals(PopContextNotifyeeContainer other) } } - private readonly IStack stack; - private readonly VariableScope globalVariables; + protected readonly IStack stack; + protected readonly VariableScope globalVariables; private class YieldFinishedWithPriority @@ -60,10 +60,10 @@ private class YieldFinishedWithPriority } private List yields; - private double currentTime; - private readonly SafeSharedObjects shared; - private readonly List contexts; - private ProgramContext currentContext; + protected double currentTime; + protected readonly SafeSharedObjects shared; + protected readonly List contexts; + protected ProgramContext currentContext; private VariableScope savedPointers; private int instructionsPerUpdate; @@ -121,12 +121,12 @@ public CPU(SafeSharedObjects shared) globalVariables = new VariableScope(0, null); contexts = new List(); yields = new List(); - if (this.shared.UpdateHandler != null) this.shared.UpdateHandler.AddFixedObserver(this); popContextNotifyees = new HashSet(); } - public void Boot() + public virtual void Boot() { + if (shared.UpdateHandler != null) shared.UpdateHandler.AddFixedObserver(this); // break all running programs currentContext = null; contexts.Clear(); @@ -214,7 +214,7 @@ public void Boot() } } - private void PushInterpreterContext() + protected void PushInterpreterContext() { var interpreterContext = new ProgramContext(true); // initialize the context with an empty program @@ -450,7 +450,7 @@ public IProgramContext SwitchToProgramContext() return currentContext; } - public Opcode GetCurrentOpcode() + public virtual Opcode GetCurrentOpcode() { return currentContext.Program[currentContext.InstructionPointer]; } @@ -1771,7 +1771,7 @@ public void StopCompileStopwatch() compileWatch.Stop(); } - private class BootGlobalPath : InternalPath + protected class BootGlobalPath : InternalPath { private string command; diff --git a/src/kOS.Safe/Function/FunctionManager.cs b/src/kOS.Safe/Function/FunctionManager.cs index 1f687b7fd5..6c32844597 100644 --- a/src/kOS.Safe/Function/FunctionManager.cs +++ b/src/kOS.Safe/Function/FunctionManager.cs @@ -36,7 +36,7 @@ public void Load() { var function = (SafeFunctionBase)functionObject; function.functionName = longestName; - if (shared.Interpreter.GetName() == "lua") + if (shared.Processor.InterpreterLanguage == "lua") function.stackOperator = new LuaStackOperator(); else function.stackOperator = new KSStackOperator(); diff --git a/src/kOS.Safe/Module/IProcessor.cs b/src/kOS.Safe/Module/IProcessor.cs index 58c9cff157..88be5bb455 100644 --- a/src/kOS.Safe/Module/IProcessor.cs +++ b/src/kOS.Safe/Module/IProcessor.cs @@ -13,6 +13,8 @@ public interface IProcessor bool CheckCanBoot(); string Tag { get; } + + string InterpreterLanguage { get; } /// Can be used as a unique ID of which processor this is, but unlike Guid, /// it doesn't remain unique across runs so you shouldn't use it for serialization. diff --git a/src/kOS.Safe/Screen/IInterpreter.cs b/src/kOS.Safe/Screen/IInterpreter.cs index 10e97d8401..3aa03f9f47 100644 --- a/src/kOS.Safe/Screen/IInterpreter.cs +++ b/src/kOS.Safe/Screen/IInterpreter.cs @@ -6,15 +6,14 @@ namespace kOS.Safe.Screen { - public interface IInterpreter + public interface IInterpreter : IDisposable { - string GetName(); + string Name { get; } void Boot(); - void Shutdown(); void ProcessCommand(string commandText); bool IsCommandComplete(string commandText); bool IsWaitingForCommand(); - void BreakExecution(bool manual); + void StopExecution(); int InstructionsThisUpdate(); } } diff --git a/src/kOS/KSPLogger.cs b/src/kOS/KSPLogger.cs index 478d83c1c1..376b5fbc81 100644 --- a/src/kOS/KSPLogger.cs +++ b/src/kOS/KSPLogger.cs @@ -130,7 +130,7 @@ private string TraceLog() else msg += "Called from "; - msg += (thisOpcode is OpcodeEOF) ? KSInterpreter.traceName + msg += (thisOpcode is OpcodeEOF) ? Terminal.InterpreterName : BuildLocationString(thisOpcode.SourcePath, thisOpcode.SourceLine); msg += "\n" + textLine + "\n"; diff --git a/src/kOS/Lua/LuaCPU.cs b/src/kOS/Lua/LuaCPU.cs new file mode 100644 index 0000000000..8e72ede31c --- /dev/null +++ b/src/kOS/Lua/LuaCPU.cs @@ -0,0 +1,61 @@ +using kOS.Safe; +using kOS.Safe.Compilation; +using kOS.Safe.Execution; +using kOS.Safe.Utilities; +using kOS.Safe.Binding; +using kOS.Safe.Callback; +using kOS.Safe.Encapsulation; +using kOS.Safe.Exceptions; +using kOS.Safe.Persistence; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using kOS.Module; + +namespace kOS.Lua +{ + public class LuaCPU : CPU + { + public LuaCPU(SafeSharedObjects shared) : base(shared) { } + + // difference from base Boot method: + // not adding a fixed observer + // changed boot message + // not running a boot script. its done in LuaInterpreter + public override void Boot() + { + // break all running programs + currentContext = null; + contexts.Clear(); + if (shared.GameEventDispatchManager != null) shared.GameEventDispatchManager.Clear(); + PushInterpreterContext(); + CurrentPriority = InterruptPriority.Normal; + currentTime = 0; + // clear stack (which also orphans all local variables so they can get garbage collected) + stack.Clear(); + // clear global variables + globalVariables.Clear(); + // clear interpreter + if (shared.Terminal != null) shared.Terminal.Reset(); + // load functions + if (shared.FunctionManager != null) shared.FunctionManager.Load(); + // load bindings + if (shared.BindingMgr != null) shared.BindingMgr.Load(); + + // Booting message + if (shared.Screen != null) + { + shared.Screen.ClearScreen(); + string bootMessage = string.Format("kOS Operating System\nLua v{0}\n(manual at {1})\n \nProceed.\n", LuaInterpreter.LuaVersion, SafeHouse.DocumentationURL); + shared.Screen.Print(bootMessage); + } + } + + public override Opcode GetCurrentOpcode() + { + return new OpcodeBogus(); + } + } +} diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 779d591939..2998e2b881 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -25,26 +25,35 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver private NLua.Lua state; private KeraLua.Lua commandCoroutine; private bool commandPending = false; + private static readonly Dictionary stateInfo = new Dictionary(); private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; - private static int instructionsThisUpdate = 0; - private const string interpreterName = "lua"; - public const string luaVersion = "5.4"; + public const string LuaVersion = "5.4"; public static readonly string[] FilenameExtensions = new string[] { "lua" }; + public string Name => "lua"; + private SharedObjects Shared { get; } - protected SharedObjects Shared { get; private set; } + private class ExecInfo + { + public int InstructionsThisUpdate = 0; + public bool StopExecution = false; + } public LuaInterpreter(SharedObjects shared) { Shared = shared; } - public string GetName() => interpreterName; - public void Boot() { + if (state != null) + { + stateInfo.Remove(state.State.MainThread.Handle); + state.Dispose(); + } state = new NLua.Lua(); commandCoroutine = state.State.NewThread(); commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 1); + stateInfo.Add(commandCoroutine.MainThread.Handle, new ExecInfo()); Shared.UpdateHandler.AddFixedObserver(this); state["Shared"] = Shared; state["FlightGlobals"] = UnityEngine.MonoBehaviour.FindObjectOfType(); @@ -56,21 +65,8 @@ public void Boot() } } - if (Shared.GameEventDispatchManager != null) Shared.GameEventDispatchManager.Clear(); - if (Shared.FunctionManager != null) Shared.FunctionManager.Load(); - if (Shared.BindingMgr != null) Shared.BindingMgr.Load(); - Binding.BindToState(commandCoroutine, Shared); - if (Shared.Terminal != null) Shared.Terminal.Reset(); - // Booting message - if (Shared.Screen != null) - { - Shared.Screen.ClearScreen(); - string bootMessage = string.Format("kOS Operating System\nLua v{0}\n(manual at {1})\n \nProceed.\n", luaVersion, SafeHouse.DocumentationURL); - Shared.Screen.Print(bootMessage); - } - if (!Shared.Processor.CheckCanBoot()) return; VolumePath path = Shared.Processor.BootFilePath; @@ -99,22 +95,18 @@ public void Boot() DisplayError(string.Format("File '{0}' not found", path)); return; } - ProcessCommand(content.String); // TODO: run through dofile when its ready + ProcessCommand(content.String); } } } - public void Shutdown() - { - Shared.UpdateHandler.RemoveFixedObserver(this); - state?.Dispose(); - } - private static void YieldHook(IntPtr L, IntPtr ar) { - if (++instructionsThisUpdate >= instructionsPerUpdate) + var state = KeraLua.Lua.FromIntPtr(L); + var execInfo = stateInfo[state.MainThread.Handle]; + if (++execInfo.InstructionsThisUpdate >= instructionsPerUpdate || execInfo.StopExecution) { - KeraLua.Lua.FromIntPtr(L).Yield(0); + state.Yield(0); } } @@ -149,21 +141,31 @@ public bool IsWaitingForCommand() return commandCoroutine.Status != LuaStatus.Yield; } - public void BreakExecution(bool manual) + public void StopExecution() { - commandCoroutine.ResetThread(); + stateInfo[commandCoroutine.MainThread.Handle].StopExecution = true; } public int InstructionsThisUpdate() - { - return instructionsThisUpdate; + { // ProcessElectricity() calls this after changing interpreter when stuff is not initialized yet + if (commandCoroutine != null && stateInfo.TryGetValue(commandCoroutine.MainThread.Handle, out var info)) + return info.InstructionsThisUpdate; + return 0; } public void KOSFixedUpdate(double dt) { + if (stateInfo[commandCoroutine.MainThread.Handle].StopExecution) + { // true after StopExecution was called, reset thread to prevent execution of the same program + stateInfo[commandCoroutine.MainThread.Handle].StopExecution = false; + commandCoroutine.ResetThread(); + } instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; - instructionsThisUpdate = 0; - // resumes the coroutine created by ProcessCommand after it was created and after it yielded due to running out of instructions + stateInfo[commandCoroutine.MainThread.Handle].InstructionsThisUpdate = 0; + + Shared.BindingMgr?.PreUpdate(); + + // resumes the coroutine after it yielded due to running out of instructions or after ProcessCommand loaded a new command if (commandCoroutine.Status == LuaStatus.Yield || commandPending) { commandPending = false; @@ -178,6 +180,7 @@ public void KOSFixedUpdate(double dt) public void Dispose() { + StopExecution(); state.Dispose(); Shared.UpdateHandler.RemoveFixedObserver(this); } diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 3f1684efe9..54aec87230 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -67,7 +67,6 @@ public string Tag private bool objectsInitialized = false; private int numUpdatesAfterStartHappened = 0; private bool finishedRP1ProceduralAvionicsUpdate = false; - private bool interpreterChanged = false; public float AdditionalMass { get; set; } @@ -88,6 +87,8 @@ public string Tag private const string BootDirectoryName = "boot"; + public string InterpreterLanguage => interpreterLanguage; + [KSPField(isPersistant = true, guiActive = true, guiActiveEditor = true, guiName = "Interpreter", groupName = PAWGroup, groupDisplayName = PAWGroup), UI_ChooseOption(scene = UI_Scene.All)] public string interpreterLanguage = "kerboscript"; @@ -467,20 +468,11 @@ private void InitInterpreterField(StartState state) private void OnInterpreterChanged(BaseField field, object buggyPrevValue) { - // change the interpreter on the next fixed update instead of now because when you 'core:setfield("interpreter", "Lua").' - // it would OnInterpreterChanged() > SetMode(*off*) > ProcessorModeChanged() > Shared.Interpreter.Shutdown() > Shared.Cpu.BreakExecution(true) - // and kerboscript errors when you BreakExecution in the middle of executing - // the error is really harmless but its unplesant when it pops up - interpreterLanguage = interpreterLanguage.ToLower(); - interpreterChanged = true; - var prevValue = shared.Interpreter is LuaInterpreter? "Lua" : "KerboScript"; - shared.Logger.Log("interpreter changed. "+prevValue+" to "+interpreterLanguage); - } - - private void ChangeInterpreter() - { - if (interpreterLanguage.ToLower() == "lua") shared.Interpreter = new LuaInterpreter(shared); - else shared.Interpreter = new KSInterpreter(shared); + interpreterLanguage = interpreterLanguage.ToLower()[0]=='l'? "lua" : "kerboscript"; + if (shared.Interpreter.Name == interpreterLanguage) return; + shared.Logger.Log("Interpreter changed. "+shared.Interpreter.Name+" to "+interpreterLanguage+". Rebooting"); + SetMode(ProcessorModes.OFF); + SetMode(ProcessorModes.READY); } private void InitUI() @@ -619,6 +611,11 @@ private IEnumerable BootDirectoryFiles() private static Regex VolumeNameRemoveChars = new Regex("[/\\\\<>:\"|?*]*", RegexOptions.Compiled); + private ICpu luaCpu; + private ICpu ksCpu; + private IInterpreter luaInterpreter; + private IInterpreter ksInterpreter; + public void InitObjects() { if (objectsInitialized) @@ -632,8 +629,6 @@ public void InitObjects() shared = new SharedObjects(); - ChangeInterpreter(); - shared.Vessel = vessel; shared.Processor = this; shared.KSPPart = part; @@ -647,7 +642,8 @@ public void InitObjects() shared.ProcessorMgr = new ProcessorManager(); shared.FunctionManager = new FunctionManager(shared); shared.TransferManager = new TransferManager(shared); - shared.Cpu = new CPU(shared); + shared.Cpu = interpreterLanguage == "lua" ? new LuaCPU(shared) : new CPU(shared); + shared.Interpreter = interpreterLanguage == "lua" ? (IInterpreter)new LuaInterpreter(shared) : new KSInterpreter(shared); shared.AddonManager = new AddOns.AddonManager(shared); shared.GameEventDispatchManager = new GameEventDispatchManager(shared); @@ -825,6 +821,7 @@ public void OnDestroy() { shared.Cpu.BreakExecution(false); shared.Cpu.Dispose(); + shared.Interpreter.Dispose(); shared.DestroyObjects(); shared = null; } @@ -926,16 +923,33 @@ public void FixedUpdate() if (!HasBooted) { SafeHouse.Logger.LogWarning("First Update()"); + // interpreter swap + // stop the fixed observers + shared.UpdateHandler.RemoveFixedObserver(shared.Cpu); + if (shared.Interpreter is IFixedUpdateObserver interpreterObserver) + shared.UpdateHandler.RemoveFixedObserver(interpreterObserver); + // save cpu and interpreter references + if (shared.Cpu is LuaCPU) luaCpu = shared.Cpu; + else ksCpu = shared.Cpu; + if (shared.Interpreter is LuaInterpreter) luaInterpreter = shared.Interpreter; + else ksInterpreter = shared.Interpreter; + // update shared cpu and interpreter from references or create new ones if they are null + if (interpreterLanguage == "lua") + { + shared.Cpu = luaCpu ?? new LuaCPU(shared); + shared.Interpreter = luaInterpreter ?? new LuaInterpreter(shared); + } + else + { + shared.Cpu = ksCpu ?? new CPU(shared); + shared.Interpreter = ksInterpreter ?? new KSInterpreter(shared); + } + // run boot methods + shared.Cpu.Boot(); shared.Interpreter.Boot(); + HasBooted = true; } - if (interpreterChanged) - { - interpreterChanged = false; - SetMode(ProcessorModes.OFF); - ChangeInterpreter(); - SetMode(ProcessorModes.READY); - } UpdateVessel(); UpdateFixedObservers(); ProcessElectricity(part, TimeWarp.fixedDeltaTime); @@ -1221,7 +1235,7 @@ private void ProcessorModeChanged() case ProcessorModes.OFF: case ProcessorModes.STARVED: - if (shared.Interpreter != null) shared.Interpreter.Shutdown(); + if (shared.Interpreter != null) shared.Interpreter.StopExecution(); if (shared.Terminal != null) shared.Terminal.SetInputLock(true); if (shared.Window != null) shared.Window.IsPowered = false; if (shared.SoundMaker != null) shared.SoundMaker.StopAllVoices(); diff --git a/src/kOS/Screen/KSInterpreter.cs b/src/kOS/Screen/KSInterpreter.cs index 90d17dea4f..9416840a75 100644 --- a/src/kOS/Screen/KSInterpreter.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -13,33 +13,16 @@ namespace kOS.Screen { public class KSInterpreter : IInterpreter { - private const string interpreterName = "kerboscript"; - public const string traceName = "interpreter"; public static readonly string[] FilenameExtensions = new string[] { Volume.KERBOSCRIPT_EXTENSION, Volume.KOS_MACHINELANGUAGE_EXTENSION }; - - protected SharedObjects Shared { get; private set; } + public string Name => "kerboscript"; + private SharedObjects Shared { get; } public KSInterpreter(SharedObjects shared) { Shared = shared; } - public string GetName() => interpreterName; - - public void Boot() - { - Shared.UpdateHandler.AddFixedObserver(Shared.Cpu); - Shared.ScriptHandler.ClearContext(traceName); - // TODO: ^ this line was previously in Shared.Terminal.Reset() and was being called from - // v Shared.Cpu.Boot() putting this line here changes the order of operations. Make sure nothing got broken - Shared.Cpu.Boot(); - } - - public void Shutdown() // Shutdown stops execution of kerboscript but keeps it alive - { - Shared.UpdateHandler.RemoveFixedObserver(Shared.Cpu); - BreakExecution(true); - } + public void Boot() { } public void ProcessCommand(string commandText) { @@ -56,7 +39,7 @@ public void ProcessCommand(string commandText) }; List commandParts = Shared.ScriptHandler.Compile(new InterpreterPath(Shared.Terminal as Terminal), - Shared.Terminal.GetCommandHistoryIndex(), commandText, traceName, options); + Shared.Terminal.GetCommandHistoryIndex(), commandText, Terminal.InterpreterName, options); if (commandParts == null) return; var interpreterContext = ((CPU)Shared.Cpu).GetInterpreterContext(); @@ -85,9 +68,9 @@ public bool IsWaitingForCommand() return context.Program[context.InstructionPointer] is OpcodeEOF; } - public void BreakExecution(bool manual) + public void StopExecution() { - Shared.Cpu?.BreakExecution(manual); + Shared.Cpu.GetCurrentOpcode().AbortProgram = true; } public int InstructionsThisUpdate() @@ -95,6 +78,8 @@ public int InstructionsThisUpdate() return Shared.Cpu.InstructionsThisUpdate; } + public void Dispose() { } // Everything is disposed in CPU + private class InterpreterPath : InternalPath { private Terminal terminal; @@ -111,7 +96,7 @@ public override string Line(int line) public override string ToString() { - return traceName; + return Terminal.InterpreterName; } } } diff --git a/src/kOS/Screen/Terminal.cs b/src/kOS/Screen/Terminal.cs index 1f6fcbe50f..8d84d3607f 100644 --- a/src/kOS/Screen/Terminal.cs +++ b/src/kOS/Screen/Terminal.cs @@ -13,6 +13,7 @@ namespace kOS.Screen { public class Terminal : TextEditor, ITerminal { + public const string InterpreterName = "interpreter"; private readonly List commandHistory = new List(); private int commandHistoryIndex; private bool locked; @@ -66,7 +67,8 @@ public override bool SpecialKey(char key) { if (key == (char)UnicodeCommand.BREAK) { - Shared.Interpreter.BreakExecution(true); + Shared.Interpreter.StopExecution(); + Shared.Cpu.BreakExecution(true); LineBuilder.Remove(0, LineBuilder.Length); // why isn't there a StringBuilder.Clear()? NewLine(); // process the now emptied line, to make it do all the updates it normally @@ -146,6 +148,7 @@ public void SetInputLock(bool isLocked) public override void Reset() { + Shared.ScriptHandler.ClearContext(InterpreterName); commandHistory.Clear(); commandHistoryIndex = 0; base.Reset(); diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index c92c2c558e..0741cd4e1c 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -81,6 +81,7 @@ + From 279b09154b1683eb6fb9bb5c65e85cdc594469e9 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 21 Sep 2024 15:35:01 +0300 Subject: [PATCH 011/108] Some gitignoring --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 978952cc5d..a71946878f 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,9 @@ packages/ # VisualStudio Code .vscode/ +# Rider +.idea/ + # Vim *.swp @@ -39,6 +42,7 @@ packages/ # Symlink to KSP directory KSPdirlink +KSP # Part thumbnails added through the KSP symlink Resources/GameData/kOS/Parts/@thumbs/ From 702456eed010b0a0eddfbeea2bdcbb36860b9a2e Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 21 Sep 2024 15:37:26 +0300 Subject: [PATCH 012/108] Fix breaking execution for lua --- src/kOS/Lua/LuaInterpreter.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 2998e2b881..62e01dcf70 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -158,6 +158,9 @@ public void KOSFixedUpdate(double dt) if (stateInfo[commandCoroutine.MainThread.Handle].StopExecution) { // true after StopExecution was called, reset thread to prevent execution of the same program stateInfo[commandCoroutine.MainThread.Handle].StopExecution = false; + // sometimes Terminal sends an empty string to ProcessCommand() after you ctrl+c during execution. + // This ignores commands that are sent in the same tick that StopExecution() was called + commandPending = false; commandCoroutine.ResetThread(); } instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; From 442943e30624c780a230f185253303a234fa565b Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 22 Sep 2024 12:42:19 +0300 Subject: [PATCH 013/108] Binding work Userdata type names Efficient print function Pairs metamethod for Structures 1 based indexing for Structures in lua Separate userdata type for kerboscript functions --- src/kOS.Safe/Encapsulation/IIndexable.cs | 3 +- src/kOS.Safe/Encapsulation/Lexicon.cs | 5 +- src/kOS.Safe/Encapsulation/ListValue.cs | 7 +- src/kOS.Safe/Encapsulation/StringValue.cs | 5 +- src/kOS.Safe/Execution/CPU.cs | 2 +- src/kOS/Lua/Binding.cs | 309 +++++++++++++++------- src/kOS/Lua/LuaCPU.cs | 5 + src/kOS/Lua/LuaInterpreter.cs | 13 +- src/kOS/Lua/init.lua | 31 --- 9 files changed, 242 insertions(+), 138 deletions(-) diff --git a/src/kOS.Safe/Encapsulation/IIndexable.cs b/src/kOS.Safe/Encapsulation/IIndexable.cs index 715e3c81c0..f6fa01c6a7 100644 --- a/src/kOS.Safe/Encapsulation/IIndexable.cs +++ b/src/kOS.Safe/Encapsulation/IIndexable.cs @@ -12,8 +12,9 @@ public interface IIndexable /// assume integer indeces: /// /// + /// if failed to find a value return null instead of throwing an exception /// - Structure GetIndex(int index); + Structure GetIndex(int index, bool failOkay = false); /// /// This should redirect to SetIndex(Structure index, Structure value), and is provided as diff --git a/src/kOS.Safe/Encapsulation/Lexicon.cs b/src/kOS.Safe/Encapsulation/Lexicon.cs index e621281051..3fe5a59e88 100644 --- a/src/kOS.Safe/Encapsulation/Lexicon.cs +++ b/src/kOS.Safe/Encapsulation/Lexicon.cs @@ -280,9 +280,10 @@ public Structure GetIndex(Structure key) // Only needed because IIndexable demands it. For a lexicon, none of the code is // actually trying to call this: - public Structure GetIndex(int index) + public Structure GetIndex(int index, bool failOkay = false) { - return internalDictionary[FromPrimitiveWithAssert(index)]; + try { return internalDictionary[FromPrimitiveWithAssert(index)]; } + catch { if (failOkay) return null; throw; } } public void SetIndex(Structure index, Structure value) diff --git a/src/kOS.Safe/Encapsulation/ListValue.cs b/src/kOS.Safe/Encapsulation/ListValue.cs index 5650380282..4075ed8685 100644 --- a/src/kOS.Safe/Encapsulation/ListValue.cs +++ b/src/kOS.Safe/Encapsulation/ListValue.cs @@ -100,8 +100,11 @@ private ListValue SubListMethod(ScalarValue start, ScalarValue runLength) public static ListValue CreateList(IEnumerable list) => new ListValue(list.Cast()); - public Structure GetIndex(int index) => - Collection[index]; + public Structure GetIndex(int index, bool failOkay = false) + { + try { return Collection[index]; } + catch { if (failOkay) return null; throw; } + } public Structure GetIndex(Structure index) { diff --git a/src/kOS.Safe/Encapsulation/StringValue.cs b/src/kOS.Safe/Encapsulation/StringValue.cs index 24f6056eff..5ed209468e 100644 --- a/src/kOS.Safe/Encapsulation/StringValue.cs +++ b/src/kOS.Safe/Encapsulation/StringValue.cs @@ -198,9 +198,10 @@ public ScalarValue ToScalar(ScalarValue defaultIfError = null) throw new KOSNumberParseException(internalString); } - public Structure GetIndex(int index) + public Structure GetIndex(int index, bool failOkay = false) { - return new StringValue(internalString[index]); + try { return new StringValue(internalString[index]); } + catch { if (failOkay) return null; throw; } } public Structure GetIndex(Structure index) diff --git a/src/kOS.Safe/Execution/CPU.cs b/src/kOS.Safe/Execution/CPU.cs index 4b767d44f9..a2878d881a 100644 --- a/src/kOS.Safe/Execution/CPU.cs +++ b/src/kOS.Safe/Execution/CPU.cs @@ -582,7 +582,7 @@ public void BreakExecution(bool manual) /// this purpose. Waiting in mainline code will still allow triggers to run. /// /// - public void YieldProgram(YieldFinishedDetector yieldTracker) + public virtual void YieldProgram(YieldFinishedDetector yieldTracker) { yields.Add(new YieldFinishedWithPriority() { detector = yieldTracker, priority = CurrentPriority }); yieldTracker.creationTimeStamp = currentTime; diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index ac988e8e58..f488171ad1 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -10,74 +10,104 @@ using kOS.Safe.Utilities; using System; using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using Smooth.Collections; using Debug = UnityEngine.Debug; namespace kOS.Lua { - internal class Binding + internal static class Binding { private static readonly Dictionary bindings = new Dictionary(); - private static readonly Dictionary functions = new Dictionary(); + // the CSharp object to userdata binding model was adapted from NLua model + // with some simplifications and changes to make it work on Structures private class BindingData { public readonly Dictionary variables; public readonly Dictionary objects; public readonly Dictionary userdataPtrs; - public BindingData(Dictionary boundVariables) - { - variables = boundVariables; - objects = new Dictionary(); - userdataPtrs = new Dictionary(); - } - } - - private class FunctionManager - { public readonly Dictionary functions; public readonly SafeSharedObjects Shared; - public FunctionManager(SafeSharedObjects shared, Dictionary functions) + + public BindingData(SafeSharedObjects shared, Dictionary boundVariables, Dictionary functions) { Shared = shared; + variables = boundVariables; + objects = new Dictionary(); + userdataPtrs = new Dictionary(); this.functions = functions; } } + public static void DisposeStateBinding(KeraLua.Lua state) => bindings.Remove(state.MainThread.Handle); + public static void BindToState(KeraLua.Lua state, SharedObjects shared) { state = state.MainThread; - bindings[state.Handle] = new BindingData((shared.BindingMgr as BindingManager).RawVariables); - functions[state.Handle] = new FunctionManager(shared, (shared.FunctionManager as Safe.Function.FunctionManager).RawFunctions); + bindings[state.Handle] = new BindingData( + shared, + (shared.BindingMgr as BindingManager).RawVariables, + (shared.FunctionManager as FunctionManager).RawFunctions + ); state.PushCFunction(EnvIndex); state.SetGlobal("envIndex"); state.PushCFunction(EnvNewIndex); state.SetGlobal("envNewIndex"); + state.GetGlobal("type"); + state.SetGlobal("_type"); + state.PushCFunction(UserdataType); + state.SetGlobal("type"); + state.GetGlobal("print"); + state.SetGlobal("_print"); + state.PushCFunction(KosPrint); + state.SetGlobal("print"); int oldTop = state.GetTop(); state.DoString(@"local mt = { __index = envIndex, __newindex = envNewIndex }; setmetatable(_ENV, mt)"); CreateUserdataMapTable(state); if (state.NewMetaTable("Structure")) { + state.PushString("__type"); + state.PushString("Structure"); + state.RawSet(-3); state.PushString("__index"); state.PushCFunction(StructureIndex); state.RawSet(-3); state.PushString("__newindex"); state.PushCFunction(StructureNewIndex); state.RawSet(-3); + state.PushString("__pairs"); + state.PushCFunction(StructurePairs); + state.RawSet(-3); + state.PushString("__gc"); + state.PushCFunction(CollectObject); + state.RawSet(-3); + state.PushString("__tostring"); + state.PushCFunction(StructureToString); + state.RawSet(-3); + } + if (state.NewMetaTable("KerboscriptFunction")) + { + state.PushString("__type"); + state.PushString("KerboscriptFunction"); + state.RawSet(-3); state.PushString("__call"); - state.PushCFunction(StructureCall); + state.PushCFunction(KSFunctionCall); state.RawSet(-3); state.PushString("__gc"); state.PushCFunction(CollectObject); state.RawSet(-3); state.PushString("__tostring"); - state.PushCFunction(ObjectToString); + state.PushCFunction(KSFunctionToString); state.RawSet(-3); } state.SetTop(oldTop); } private static void CreateUserdataMapTable(KeraLua.Lua state) { - state.PushString("userdataAdressToUserdata"); + state.PushString("userdataAddressToUserdata"); state.NewTable(); state.NewTable(); state.PushString("__mode"); @@ -87,21 +117,60 @@ private static void CreateUserdataMapTable(KeraLua.Lua state) state.SetTable((int)LuaRegistry.Index); } + private static int KosPrint(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var argCount = state.GetTop(); + var prints = new string[argCount]; + for (int i = 0; i < argCount; i++) + prints[i] = state.ToString(i + 1); + bindings[state.MainThread.Handle].Shared.Screen.Print(string.Join(" ", prints)); + return 0; + } + + private static int UserdataType(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + if (state.GetMetaField(1, "__type") == LuaType.String) + return 1; + state.PushString(state.TypeName(1)); + return 1; + } + private static int CollectObject(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = bindings[state.MainThread.Handle]; - var userdataAdress = state.ToUserData(1); - var obj = binding.objects[userdataAdress]; + bindings.TryGetValue(state.MainThread.Handle, out var binding); + if (binding == null) return 0; // happens after DisposeStateBinding() was called + var userdataAddress = state.ToUserData(1); + binding.objects.TryGetValue(userdataAddress, out var obj); + if (obj == null) return 0; // read the note in PushObject() to know when this happens binding.userdataPtrs.Remove(obj); - binding.objects.Remove(userdataAdress); + binding.objects.Remove(userdataAddress); return 0; } - private static int ObjectToString(IntPtr L) + private static int StructureToString(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - state.PushString(bindings[state.MainThread.Handle].objects[state.ToUserData(1)].ToString()); + var structure = bindings[state.MainThread.Handle].objects[state.ToUserData(1)]; + if (structure is IEnumerable) + { // make enum structures ToString() method show 1 base indexed values in lua + // replaces "\n [*number*]" with "\n [*number+1*]" + state.PushString(Regex.Replace(structure.ToString(), @"\n\s*\[([0-9]+)\]", (match) => + Regex.Replace(match.Groups[0].Value, match.Groups[1].Value, (int.Parse(match.Groups[1].Value) + 1).ToString()) + )); + } + else + state.PushString(structure.ToString()); + return 1; + } + + private static int KSFunctionToString(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var function = bindings[state.MainThread.Handle].objects[state.ToUserData(1)]; + state.PushString(function.GetType().Name); return 1; } @@ -113,10 +182,9 @@ private static int EnvIndex(IntPtr L) if (binding.variables.TryGetValue(index, out var boundVar)) { try { return PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding); } - catch (Exception e) { return state.Error(e.Message); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } } - var functionManager = functions[state.MainThread.Handle]; - if (functionManager.functions.TryGetValue(index, out var function)) + if (binding.functions.TryGetValue(index, out var function)) { return PushLuaType(state, function, binding); } @@ -131,7 +199,7 @@ private static int EnvNewIndex(IntPtr L) if (binding.variables.TryGetValue(index, out var boundVar) && boundVar.Set != null) { try { boundVar.Value = ToCSharpObject(state, 3, binding); } - catch (Exception e) { return state.Error(e.Message); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } } else { @@ -149,34 +217,38 @@ private static int StructureIndex(IntPtr L) if (structure == null) return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); + try { return PushSuffixResult(state, binding, structure, 2); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + } + + private static int PushSuffixResult(KeraLua.Lua state, BindingData binding, Structure structure, int index) + { object pushValue = null; - if (structure is IIndexable && state.TypeName(2) == "number") + if (state.TypeName(index) == "number" && structure is IIndexable indexable) { - int intIndex = (int)state.ToInteger(2); - try { pushValue = Structure.ToPrimitive((structure as IIndexable).GetIndex(intIndex)); } - catch (Exception e) { return state.Error(e.Message); } + pushValue = Structure.ToPrimitive(indexable.GetIndex((int)state.ToInteger(index)-(structure is Lexicon? 0 : 1), true)); return PushLuaType(state, pushValue, binding); } - var index = state.ToString(2); - if (structure.HasSuffix(index)) + + var result = structure.GetSuffix(state.ToString(index), true); + if (result == null) + return PushLuaType(state, null, binding); + + if (result.HasValue) { - var result = structure.GetSuffix(index); - if (result.HasValue) - { - pushValue = Structure.ToPrimitive(result.Value); - } else - { - var delegateResult = result as DelegateSuffixResult; - if (delegateResult.RawDelInfo.Parameters.Length == 0) - { - try { delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(delegateResult.RawCall(null))); } - catch (Exception e) { return state.Error(e.Message); } - pushValue = Structure.ToPrimitive(delegateResult.Value); // TODO: maybe skip the conversions? - } else - { - pushValue = delegateResult; - } - } + pushValue = Structure.ToPrimitive(result.Value); + } + else if (result is DelegateSuffixResult delegateResult && delegateResult.RawDelInfo.Parameters.Length == 0) + { + var callResult = delegateResult.RawCall(null); + if (delegateResult.RawDelInfo.ReturnType == typeof(void)) + delegateResult.RawSetValue(ScalarValue.Create(0)); // this is what kerboscript does + else + delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(callResult)); + pushValue = Structure.ToPrimitive(delegateResult.Value); + } else + { + pushValue = result as DelegateSuffixResult; // if its somehow not DelegateSuffixResult push null } return PushLuaType(state, pushValue, binding); } @@ -196,36 +268,90 @@ private static int StructureNewIndex(IntPtr L) { int intIndex = (int)state.ToInteger(2); try { (structure as IIndexable).SetIndex(intIndex, Structure.FromPrimitive(value) as Structure); } - catch (Exception e) { return state.Error(e.Message); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } return 0; } var index = state.ToString(2); try { structure.SetSuffix(index, Structure.FromPrimitive(value)); } - catch (Exception e) { return state.Error(e.Message); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } } return 0; } + + private static int StructurePairs(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = bindings[state.MainThread.Handle]; + var structure = binding.objects[state.ToUserData(1)] as Structure; + if (structure == null) + return state.Error("pairs metamethod can only be called with a Structure type"); + + state.PushInteger(1); + var enumCount = (structure is IIndexable && structure is IEnumerable enumerable) + ? enumerable.Count() + : 0; + state.NewTable(); + var index = 1; + for (; index <= enumCount; index++) + { + state.PushInteger(index); + state.PushInteger(index); + state.SetTable(-3); + } + foreach (var name in structure.GetSuffixNames()) + { + state.PushInteger(index++); + state.PushString(name); + state.SetTable(-3); + } + + state.PushCClosure(StructureNext, 2); // pass the starting index and table with index-suffix pairs + state.PushCopy(1); + return 2; + } + + private static int StructureNext(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = bindings[state.MainThread.Handle]; + var structure = binding.objects[state.ToUserData(1)] as Structure; + if (structure == null) + return state.Error("iterator can only be called with a Structure type"); + // ignore the second argument + var currentIndex = state.ToInteger(KeraLua.Lua.UpValueIndex(1)); + state.PushCopy(KeraLua.Lua.UpValueIndex(2)); + state.PushInteger(currentIndex); + state.GetTable(-2); + + try { PushSuffixResult(state, binding, structure, -1); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + + state.PushInteger(currentIndex+1); + state.Copy(-1, KeraLua.Lua.UpValueIndex(1)); + state.Remove(-1); + return 2; + } - private static int StructureCall(IntPtr L) + private static int KSFunctionCall(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; - var structure = binding.objects[state.ToUserData(1)]; - if (structure is SafeFunctionBase function) + var ksFunction = binding.objects[state.ToUserData(1)]; + if (ksFunction is SafeFunctionBase function) { var stackOperator = function.stackOperator as LuaStackOperator; stackOperator.stack.Clear(); for (int i = 2; i <= state.GetTop(); i++) stackOperator.stack.Push(ToCSharpObject(state, i, binding)); - try { function.Execute(functions[state.MainThread.Handle].Shared); } - catch (Exception e) { return state.Error(e.Message); } + try { function.Execute(binding.Shared); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } return PushLuaType(state, Structure.ToPrimitive(function.ReturnValue), binding); } - var delegateResult = structure as DelegateSuffixResult; + var delegateResult = ksFunction as DelegateSuffixResult; if (delegateResult == null) - return state.Error(string.Format("attempt to call a structure {0} value", structure.GetType().Name)); + return state.Error(string.Format("attempt to call a non function {0} value", ksFunction.GetType().Name)); // the next entire bit is copied from DelegateSuffixResult.Invoke method with a few changes // that make it access arguments from the lua stack instead of kerboscript stack @@ -340,6 +466,7 @@ private static int StructureCall(IntPtr L) return PushLuaType(state, Structure.ToPrimitive(delegateResult.Value), binding); } catch (Exception e) { + Debug.Log(e); return state.Error(e.Message); } } @@ -347,33 +474,21 @@ private static int StructureCall(IntPtr L) private static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding) { if (obj == null) - { state.PushNil(); - } else if (obj is double db) - { state.PushNumber(db); - } else if (obj is int i) - { state.PushInteger(i); - } else if (obj is string str) - { state.PushString(str); - } else if (obj is bool b) - { state.PushBoolean(b); - } else - { - PushObject(state, obj, binding); - } + return PushObject(state, obj, binding, obj is Structure? "Structure" : "KerboscriptFunction"); return 1; } - private static object ToCSharpObject(KeraLua.Lua state, int index, BindingData binding) + private static object ToCSharpObject(KeraLua.Lua state, int index, BindingData binding = null) { switch (state.TypeName(index)) { @@ -384,41 +499,53 @@ private static object ToCSharpObject(KeraLua.Lua state, int index, BindingData b case "boolean": return state.ToBoolean(index); case "userdata": - return binding.objects.GetValueOrDefault(state.ToUserData(index), null); + return binding?.objects.GetValueOrDefault(state.ToUserData(index), null); default: return null; } } - private static int PushObject(KeraLua.Lua state, object obj, BindingData binding) + private static int PushObject(KeraLua.Lua state, object obj, BindingData binding, string metatable) { - state.GetMetaTable("userdataAdressToUserdata"); - if (binding.userdataPtrs.TryGetValue(obj, out IntPtr userdataAdress)) // Object already in the list of object userdata? Push the userdata + state.GetMetaTable("userdataAddressToUserdata"); + if (binding.userdataPtrs.TryGetValue(obj, out IntPtr userdataAddress)) // Object already in the list of object userdata? Push the userdata { - // Note: starting with lua5.1 the garbage collector may remove weak reference items (such as our userdataAdressToUserdata values) when the initial GC sweep + // Note: starting with lua5.1 the garbage collector may remove weak reference items (such as our userdataAddressToUserdata values) when the initial GC sweep // occurs, but the actual call of the __gc finalizer for that object may not happen until a little while later. During that window we might call - // this routine and find the element missing from userdataAdressToUserdata, but CollectObject() has not yet been called. In that case, we go ahead and + // this routine and find the element missing from userdataAddressToUserdata, but CollectObject() has not yet been called. In that case, we go ahead and // do the same thing CollectObject() does and remove from out object maps - state.PushLightUserData(userdataAdress); - if (state.RawGet(-2) != LuaType.Nil) return 1; // if found the objects userdata return it - + state.PushLightUserData(userdataAddress); + if (state.RawGet(-2) != LuaType.Nil) + { // if found the objects userdata return it + state.Remove(-2); + return 1; + } state.Remove(-1); // remove the nil value - - binding.objects.Remove(userdataAdress); // Remove from both our maps and fall out to create a new userdata + binding.objects.Remove(userdataAddress); // Remove from both our maps and fall out to create a new userdata binding.userdataPtrs.Remove(obj); } - userdataAdress = state.NewUserData(0); - state.GetMetaTable("Structure"); + userdataAddress = state.NewUserData(0); + state.GetMetaTable(metatable); state.SetMetaTable(-2); - state.PushLightUserData(userdataAdress); + state.PushLightUserData(userdataAddress); state.PushCopy(-2); - state.RawSet(-4); // add userdata on top of the stack to the userdataAdressToUserdata metatable at userdataAdress key + state.RawSet(-4); // add userdata on top of the stack to the userdataAddressToUserdata metatable at userdataAddress key + state.Remove(-2); - binding.objects[userdataAdress] = obj; - binding.userdataPtrs[obj] = userdataAdress; + binding.objects[userdataAddress] = obj; + binding.userdataPtrs[obj] = userdataAddress; return 1; } + + private static void DumpStack(KeraLua.Lua state, string debugName = "", BindingData binding = null) + { + binding = binding ?? bindings[state.MainThread.Handle]; + Debug.Log(debugName+"_________"); + for (int i = 0; i <= state.GetTop(); i++) + Debug.Log(i+" "+state.TypeName(i)+" "+ToCSharpObject(state, i, binding)); + Debug.Log("____________________"); + } } } diff --git a/src/kOS/Lua/LuaCPU.cs b/src/kOS/Lua/LuaCPU.cs index 8e72ede31c..b8290b7938 100644 --- a/src/kOS/Lua/LuaCPU.cs +++ b/src/kOS/Lua/LuaCPU.cs @@ -57,5 +57,10 @@ public override Opcode GetCurrentOpcode() { return new OpcodeBogus(); } + + public override void YieldProgram(YieldFinishedDetector yieldTracker) // lua TODO: implement kerboscript yielding + { + return; + } } } diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 62e01dcf70..50cb4d6d85 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -45,24 +45,21 @@ public LuaInterpreter(SharedObjects shared) public void Boot() { + Shared.UpdateHandler.AddFixedObserver(this); if (state != null) { stateInfo.Remove(state.State.MainThread.Handle); + Binding.DisposeStateBinding(state.State); state.Dispose(); } state = new NLua.Lua(); commandCoroutine = state.State.NewThread(); commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 1); stateInfo.Add(commandCoroutine.MainThread.Handle, new ExecInfo()); - Shared.UpdateHandler.AddFixedObserver(this); - state["Shared"] = Shared; - state["FlightGlobals"] = UnityEngine.MonoBehaviour.FindObjectOfType(); + using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { - try { - state.DoString(streamReader.ReadToEnd()); - } catch (Exception e) { - Debug.LogException(e); - } + try { state.DoString(streamReader.ReadToEnd()); } + catch (Exception e) { Debug.Log(e); DisplayError(e.Message); } } Binding.BindToState(commandCoroutine, Shared); diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua index 4c85826b1a..e69de29bb2 100644 --- a/src/kOS/Lua/init.lua +++ b/src/kOS/Lua/init.lua @@ -1,31 +0,0 @@ -function tablelength(t) - local count = 0 - for _ in pairs(t) do count = count + 1 end - return count -end - -function print(...) - local printSum = "" - for i, v in pairs({...}) do - printSum = printSum .. tostring(v) .. (i ~= tablelength({...}) and ", " or "") - end - Shared.Window:Print(printSum) -end - -function dump(obj, depth) - if depth==nil then depth=0 end - if depth==0 then print(obj, type(obj)) end - if type(obj)=="table" or getmetatable(obj) and getmetatable(obj).__pairs then - for k,v in pairs(obj) do - print(string.rep(" ",depth)..tostring(k).."("..type(k)..")", tostring(v).."("..type(v)..")") - dump(v, depth+1) - end - end - if getmetatable(obj) then - print(string.rep(" ",depth).."metatable:") - for k,v in pairs(getmetatable(obj)) do - print(string.rep(" ",depth)..tostring(k).."("..type(k)..")", tostring(v).."("..type(v)..")") - dump(v, depth+1) - end - end -end From 907c2cf8e447c5ddbda9fbfe57737b7edf0d4420 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 22 Sep 2024 13:21:26 +0300 Subject: [PATCH 014/108] Fix not calling Cpu.BreakExecution(true) on processor shutdown This is what processor was doing on shutdown before Couldn't find anything that broke because of this but better safe than sorry --- src/kOS/Module/kOSProcessor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 54aec87230..1fa6edbd95 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -1236,6 +1236,7 @@ private void ProcessorModeChanged() case ProcessorModes.OFF: case ProcessorModes.STARVED: if (shared.Interpreter != null) shared.Interpreter.StopExecution(); + if (shared.Cpu != null) shared.Cpu.BreakExecution(true); if (shared.Terminal != null) shared.Terminal.SetInputLock(true); if (shared.Window != null) shared.Window.IsPowered = false; if (shared.SoundMaker != null) shared.SoundMaker.StopAllVoices(); From 66096340f55c9d41d079f6b50c6dcdcb6abd80cb Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 22 Sep 2024 14:30:11 +0300 Subject: [PATCH 015/108] Dont turn on kOSProcessor when changing its interpreter --- src/kOS/Module/kOSProcessor.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 1fa6edbd95..40272ee552 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -471,6 +471,7 @@ private void OnInterpreterChanged(BaseField field, object buggyPrevValue) interpreterLanguage = interpreterLanguage.ToLower()[0]=='l'? "lua" : "kerboscript"; if (shared.Interpreter.Name == interpreterLanguage) return; shared.Logger.Log("Interpreter changed. "+shared.Interpreter.Name+" to "+interpreterLanguage+". Rebooting"); + if (ProcessorMode != ProcessorModes.READY) return; SetMode(ProcessorModes.OFF); SetMode(ProcessorModes.READY); } From 3a653207b3fc31aa9c52f68af56078162a5b386f Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 22 Sep 2024 16:35:06 +0300 Subject: [PATCH 016/108] Support kerboscript yields in lua --- src/kOS.Safe/Execution/CPU.cs | 2 +- src/kOS/Lua/LuaCPU.cs | 15 +++++++++------ src/kOS/Lua/LuaInterpreter.cs | 26 +++++++++++++++++--------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/kOS.Safe/Execution/CPU.cs b/src/kOS.Safe/Execution/CPU.cs index a2878d881a..ec67f49d7e 100644 --- a/src/kOS.Safe/Execution/CPU.cs +++ b/src/kOS.Safe/Execution/CPU.cs @@ -589,7 +589,7 @@ public virtual void YieldProgram(YieldFinishedDetector yieldTracker) yieldTracker.Begin(shared); } - private bool IsYielding() + protected bool IsYielding() { int numStillBlocking = 0; diff --git a/src/kOS/Lua/LuaCPU.cs b/src/kOS/Lua/LuaCPU.cs index b8290b7938..60ff6c1aee 100644 --- a/src/kOS/Lua/LuaCPU.cs +++ b/src/kOS/Lua/LuaCPU.cs @@ -18,6 +18,8 @@ namespace kOS.Lua { public class LuaCPU : CPU { + public new bool IsYielding() => base.IsYielding(); + public LuaCPU(SafeSharedObjects shared) : base(shared) { } // difference from base Boot method: @@ -52,15 +54,16 @@ public override void Boot() shared.Screen.Print(bootMessage); } } - - public override Opcode GetCurrentOpcode() + + // this is called from LuaInterpreter KOSFixedUpdate to keep one FixedUpdate function per interpreter and to keep order consistency + public void FixedUpdate() { - return new OpcodeBogus(); + currentTime = shared.UpdateHandler.CurrentFixedTime; } - - public override void YieldProgram(YieldFinishedDetector yieldTracker) // lua TODO: implement kerboscript yielding + + public override Opcode GetCurrentOpcode() { - return; + return new OpcodeBogus(); } } } diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 50cb4d6d85..be74ca7bff 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -36,6 +36,11 @@ private class ExecInfo { public int InstructionsThisUpdate = 0; public bool StopExecution = false; + public SharedObjects Shared; + public ExecInfo(SharedObjects shared) + { + Shared = shared; + } } public LuaInterpreter(SharedObjects shared) @@ -54,8 +59,8 @@ public void Boot() } state = new NLua.Lua(); commandCoroutine = state.State.NewThread(); - commandCoroutine.SetHook(YieldHook, LuaHookMask.Count, 1); - stateInfo.Add(commandCoroutine.MainThread.Handle, new ExecInfo()); + commandCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); + stateInfo.Add(commandCoroutine.MainThread.Handle, new ExecInfo(Shared)); using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { try { state.DoString(streamReader.ReadToEnd()); } @@ -97,11 +102,11 @@ public void Boot() } } - private static void YieldHook(IntPtr L, IntPtr ar) + private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) { var state = KeraLua.Lua.FromIntPtr(L); var execInfo = stateInfo[state.MainThread.Handle]; - if (++execInfo.InstructionsThisUpdate >= instructionsPerUpdate || execInfo.StopExecution) + if (++execInfo.InstructionsThisUpdate >= instructionsPerUpdate || execInfo.StopExecution || (execInfo.Shared.Cpu as LuaCPU).IsYielding()) { state.Yield(0); } @@ -135,7 +140,7 @@ public bool IsCommandComplete(string commandText) public bool IsWaitingForCommand() { - return commandCoroutine.Status != LuaStatus.Yield; + return !(Shared.Cpu as LuaCPU).IsYielding() && commandCoroutine.Status != LuaStatus.Yield; } public void StopExecution() @@ -152,21 +157,24 @@ public int InstructionsThisUpdate() public void KOSFixedUpdate(double dt) { - if (stateInfo[commandCoroutine.MainThread.Handle].StopExecution) + (Shared.Cpu as LuaCPU).FixedUpdate(); + + var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; + if (execInfo.StopExecution) { // true after StopExecution was called, reset thread to prevent execution of the same program - stateInfo[commandCoroutine.MainThread.Handle].StopExecution = false; + execInfo.StopExecution = false; // sometimes Terminal sends an empty string to ProcessCommand() after you ctrl+c during execution. // This ignores commands that are sent in the same tick that StopExecution() was called commandPending = false; commandCoroutine.ResetThread(); } instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; - stateInfo[commandCoroutine.MainThread.Handle].InstructionsThisUpdate = 0; + execInfo.InstructionsThisUpdate = 0; Shared.BindingMgr?.PreUpdate(); // resumes the coroutine after it yielded due to running out of instructions or after ProcessCommand loaded a new command - if (commandCoroutine.Status == LuaStatus.Yield || commandPending) + if (!(Shared.Cpu as LuaCPU).IsYielding() && (commandCoroutine.Status == LuaStatus.Yield || commandPending)) { commandPending = false; LuaStatus status = commandCoroutine.Resume(state.State, 0); From 3ad4f5a401426550afd278401b5fa961e0b94523 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 22 Sep 2024 19:30:29 +0300 Subject: [PATCH 017/108] Use kerboscript stack when calling kerboscript functions from lua Reverted some changes from a104d58b867e46a92e8fda43baeac405acee8386 commit that created a custom stack operator for lua Now kerboscript and lua use the same stack when calling kerboscript functions and SuffixDelegateResults --- src/kOS.Safe/Function/FunctionManager.cs | 4 - src/kOS.Safe/Function/IStackOperator.cs | 46 -------- src/kOS.Safe/Function/KSStackOperator.cs | 57 --------- src/kOS.Safe/Function/LuaStackOperator.cs | 43 ------- src/kOS.Safe/Function/SafeFunctionBase.cs | 45 +++++++- src/kOS.Safe/kOS.Safe.csproj | 3 - src/kOS/Lua/Binding.cs | 134 ++-------------------- src/kOS/Lua/LuaCPU.cs | 2 + 8 files changed, 53 insertions(+), 281 deletions(-) delete mode 100644 src/kOS.Safe/Function/IStackOperator.cs delete mode 100644 src/kOS.Safe/Function/KSStackOperator.cs delete mode 100644 src/kOS.Safe/Function/LuaStackOperator.cs diff --git a/src/kOS.Safe/Function/FunctionManager.cs b/src/kOS.Safe/Function/FunctionManager.cs index 6c32844597..a7a88c46a2 100644 --- a/src/kOS.Safe/Function/FunctionManager.cs +++ b/src/kOS.Safe/Function/FunctionManager.cs @@ -36,10 +36,6 @@ public void Load() { var function = (SafeFunctionBase)functionObject; function.functionName = longestName; - if (shared.Processor.InterpreterLanguage == "lua") - function.stackOperator = new LuaStackOperator(); - else - function.stackOperator = new KSStackOperator(); functions.Add(functionName, function); } } diff --git a/src/kOS.Safe/Function/IStackOperator.cs b/src/kOS.Safe/Function/IStackOperator.cs deleted file mode 100644 index 7c5697705b..0000000000 --- a/src/kOS.Safe/Function/IStackOperator.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace kOS.Safe.Function -{ - public interface IStackOperator - { - /// - /// A utility function that a function's Execute() must use after it has popped all the - /// arguments it was expecting from the stack. It will assert that all the arguments - /// have been consumed exactly, and the next item on the stack is the arg bottom mark. - /// It will consume the arg bottom mark as well. - ///
- /// If the assert fails, an exception is thrown. - ///
- /// - void AssertArgBottomAndConsume(SafeSharedObjects shared, string functionName); - - /// - /// A utility function that a function's Execute() may use if it wishes to, to get a count of - /// how many args passed to it that it has not yet consumed still remain on the stack. - /// - /// - /// Number of args as yet unpopped. returns zero if there are no args, or -1 if there's a bug and the argstart marker is missing. - int CountRemainingArgs(SafeSharedObjects shared); - - /// - /// A utility function that a function's Execute() should use in place of cpu.PopValue(), - /// because it will assert that the value being popped is NOT an ARG_MARKER_STRING, and if it - /// is, it will throw the appropriate error. - /// - /// - object PopValueAssert(SafeSharedObjects shared, string functionName, bool barewordOkay = false); - - /// - /// A utility function that a function's Execute() should use in place of cpu.PopArgumentStack(), - /// because it will assert that the value being popped is NOT an ARG_MARKER_STRING, and if it - /// is, it will throw the appropriate error. - /// - /// - object PopStackAssert(SafeSharedObjects shared, string functionName); - } -} diff --git a/src/kOS.Safe/Function/KSStackOperator.cs b/src/kOS.Safe/Function/KSStackOperator.cs deleted file mode 100644 index 644fc83b13..0000000000 --- a/src/kOS.Safe/Function/KSStackOperator.cs +++ /dev/null @@ -1,57 +0,0 @@ -using kOS.Safe.Compilation; -using kOS.Safe.Exceptions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace kOS.Safe.Function -{ - internal class KSStackOperator : IStackOperator - { - public void AssertArgBottomAndConsume(SafeSharedObjects shared, string functionName) - { - object shouldBeBottom = shared.Cpu.PopArgumentStack(); - if (shouldBeBottom != null && shouldBeBottom.GetType() == OpcodeCall.ArgMarkerType) - return; // Assert passed. - - throw new KOSArgumentMismatchException("Too many arguments were passed to " + functionName); - } - - public int CountRemainingArgs(SafeSharedObjects shared) - { - int depth = 0; - bool found = false; - bool stillInStack = true; - while (stillInStack && !found) - { - object peekItem = shared.Cpu.PeekRawArgument(depth, out stillInStack); - if (stillInStack && peekItem != null && peekItem.GetType() == OpcodeCall.ArgMarkerType) - found = true; - else - ++depth; - } - if (found) - return depth; - else - return -1; - } - - public object PopValueAssert(SafeSharedObjects shared, string functionName, bool barewordOkay = false) - { - object returnValue = shared.Cpu.PopValueArgument(barewordOkay); - if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) - throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); - return returnValue; - } - - public object PopStackAssert(SafeSharedObjects shared, string functionName) - { - object returnValue = shared.Cpu.PopArgumentStack(); - if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) - throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); - return returnValue; - } - } -} diff --git a/src/kOS.Safe/Function/LuaStackOperator.cs b/src/kOS.Safe/Function/LuaStackOperator.cs deleted file mode 100644 index fa75cb4780..0000000000 --- a/src/kOS.Safe/Function/LuaStackOperator.cs +++ /dev/null @@ -1,43 +0,0 @@ -using kOS.Safe.Compilation; -using kOS.Safe.Exceptions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace kOS.Safe.Function -{ - /// - /// this exists to make functions made for kerboscript compatible with lua - /// - public class LuaStackOperator : IStackOperator - { - public Stack stack = new Stack(); - - public void AssertArgBottomAndConsume(SafeSharedObjects shared, string functionName) - { - if (stack.Count==0) return; - throw new KOSArgumentMismatchException("Too many arguments were passed to " + functionName); - } - - public int CountRemainingArgs(SafeSharedObjects shared) => stack.Count; - - public object PopValueAssert(SafeSharedObjects shared, string functionName, bool barewordOkay = false) - { // if barewordOkay it would transform an identifier into a string if there are no variables with this identifier and return it - // basically impossible to do with lua without changing lua itself - if (stack.TryPop(out var res)) - return res; - else - throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); - } - - public object PopStackAssert(SafeSharedObjects shared, string functionName) - { - if (stack.TryPop(out var res)) - return res; - else - throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); - } - } -} diff --git a/src/kOS.Safe/Function/SafeFunctionBase.cs b/src/kOS.Safe/Function/SafeFunctionBase.cs index 025a924629..287e80ed75 100644 --- a/src/kOS.Safe/Function/SafeFunctionBase.cs +++ b/src/kOS.Safe/Function/SafeFunctionBase.cs @@ -8,7 +8,6 @@ namespace kOS.Safe.Function { public abstract class SafeFunctionBase { - public IStackOperator stackOperator; public string functionName; /// @@ -104,7 +103,14 @@ protected double RadiansToDegrees(double radians) /// If the assert fails, an exception is thrown. /// /// - protected void AssertArgBottomAndConsume(SafeSharedObjects shared) => stackOperator.AssertArgBottomAndConsume(shared, functionName); + protected void AssertArgBottomAndConsume(SafeSharedObjects shared) + { + object shouldBeBottom = shared.Cpu.PopArgumentStack(); + if (shouldBeBottom != null && shouldBeBottom.GetType() == OpcodeCall.ArgMarkerType) + return; // Assert passed. + + throw new KOSArgumentMismatchException("Too many arguments were passed to " + functionName); + } /// /// A utility function that a function's Execute() may use if it wishes to, to get a count of @@ -112,7 +118,24 @@ protected double RadiansToDegrees(double radians) /// /// /// Number of args as yet unpopped. returns zero if there are no args, or -1 if there's a bug and the argstart marker is missing. - protected int CountRemainingArgs(SafeSharedObjects shared) => stackOperator.CountRemainingArgs(shared); + protected int CountRemainingArgs(SafeSharedObjects shared) + { + int depth = 0; + bool found = false; + bool stillInStack = true; + while (stillInStack && !found) + { + object peekItem = shared.Cpu.PeekRawArgument(depth, out stillInStack); + if (stillInStack && peekItem != null && peekItem.GetType() == OpcodeCall.ArgMarkerType) + found = true; + else + ++depth; + } + if (found) + return depth; + else + return -1; + } /// /// A utility function that a function's Execute() should use in place of cpu.PopValue(), @@ -120,7 +143,13 @@ protected double RadiansToDegrees(double radians) /// is, it will throw the appropriate error. /// /// - protected object PopValueAssert(SafeSharedObjects shared, bool barewordOkay = false) => stackOperator.PopValueAssert(shared, functionName, barewordOkay); + protected object PopValueAssert(SafeSharedObjects shared, bool barewordOkay = false) + { + object returnValue = shared.Cpu.PopValueArgument(barewordOkay); + if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) + throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); + return returnValue; + } /// /// A utility function that a function's Execute() should use in place of cpu.PopArgumentStack(), @@ -128,7 +157,13 @@ protected double RadiansToDegrees(double radians) /// is, it will throw the appropriate error. /// /// - protected object PopStackAssert(SafeSharedObjects shared) => stackOperator.PopStackAssert(shared, functionName); + protected object PopStackAssert(SafeSharedObjects shared) + { + object returnValue = shared.Cpu.PopArgumentStack(); + if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) + throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); + return returnValue; + } /// /// Identical to PopValueAssert, but with the additional step of coercing the result diff --git a/src/kOS.Safe/kOS.Safe.csproj b/src/kOS.Safe/kOS.Safe.csproj index c4ab57eaf4..6d4e5b2892 100644 --- a/src/kOS.Safe/kOS.Safe.csproj +++ b/src/kOS.Safe/kOS.Safe.csproj @@ -192,9 +192,6 @@ - - - diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index f488171ad1..fdcd64a96f 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -337,138 +337,26 @@ private static int KSFunctionCall(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; var ksFunction = binding.objects[state.ToUserData(1)]; + + var stack = (binding.Shared.Cpu as LuaCPU).Stack; + stack.Clear(); + stack.PushArgument(new KOSArgMarkerType()); + for (int i = 2; i <= state.GetTop(); i++) + stack.PushArgument(ToCSharpObject(state, i, binding)); + if (ksFunction is SafeFunctionBase function) { - var stackOperator = function.stackOperator as LuaStackOperator; - stackOperator.stack.Clear(); - for (int i = 2; i <= state.GetTop(); i++) - stackOperator.stack.Push(ToCSharpObject(state, i, binding)); - try { function.Execute(binding.Shared); } catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - return PushLuaType(state, Structure.ToPrimitive(function.ReturnValue), binding); } - var delegateResult = ksFunction as DelegateSuffixResult; - if (delegateResult == null) - return state.Error(string.Format("attempt to call a non function {0} value", ksFunction.GetType().Name)); - - // the next entire bit is copied from DelegateSuffixResult.Invoke method with a few changes - // that make it access arguments from the lua stack instead of kerboscript stack - try + if (ksFunction is DelegateSuffixResult delegateResult) { - var delInfo = delegateResult.RawDelInfo; - var args = new List(); - var paramArrayArgs = new List(); - - // Will be true iff the lastmost parameter of the delegate is using the C# 'param' keyword and thus - // expects the remainder of the arguments marshalled together into one array object. - bool isParamArrayArg = false; - - //CpuUtility.ReverseStackArgs(cpu, false); - int popIndex = 2; - for (int i = 0; i < delInfo.Parameters.Length; ++i) - { - DelegateParameter paramInfo = delInfo.Parameters[i]; - - //object arg = cpu.PopValueArgument(); - object arg = popIndex <= state.GetTop()? ToCSharpObject(state, popIndex++, binding) : new KOSArgMarkerType(); - Type argType = arg.GetType(); - isParamArrayArg = i == delInfo.Parameters.Length - 1 && delInfo.Parameters[i].IsParams; - - if (arg != null && arg.GetType() == CpuUtility.ArgMarkerType) - { - if (isParamArrayArg) - break; // with param arguments, you want to consume everything to the arg bottom - it's normal. - else - throw new KOSArgumentMismatchException(delInfo.Parameters.Length, delInfo.Parameters.Length - (i + 1)); - } - - // Either the expected type of this one parameter, or if it's a 'param' array as the last arg, then - // the expected type of that array's elements: - Type paramType = (paramInfo.IsParams ? paramInfo.ParameterType.GetElementType() : paramInfo.ParameterType); - - // Parameter type-safe checking: - bool inheritable = paramType.IsAssignableFrom(argType); - if (!inheritable) - { - bool castError = false; - // If it's not directly assignable to the expected type, maybe it's "castable" to it: - try - { - arg = Convert.ChangeType(arg, Type.GetTypeCode(paramType)); - } - catch (InvalidCastException) - { - throw new KOSCastException(argType, paramType); - } - catch (FormatException) - { - castError = true; - } - if (castError) - { - throw new Exception(string.Format("Argument {0}({1}) to method {2} should be {3} instead of {4}.", (delInfo.Parameters.Length - i), arg, delInfo.Name, paramType.Name, argType)); - } - } - - if (isParamArrayArg) - { - paramArrayArgs.Add(Structure.FromPrimitiveWithAssert(arg)); - --i; // keep hitting the last item in the param list again and again until a forced break because of arg bottom marker. - } - else - { - args.Add(Structure.FromPrimitiveWithAssert(arg)); - } - } - if (isParamArrayArg) - { - // collect the param array args that were at the end into the one single - // array item that will be sent to the method when invoked: - args.Add(paramArrayArgs.ToArray()); - } - // Consume the bottom marker under the args, which had better be - // immediately under the args we just popped, or the count was off. - if (!isParamArrayArg) // A param array arg will have already consumed the arg bottom mark. - { - bool foundArgMarker = false; - int numExtraArgs = 0; - //while (cpu.GetArgumentStackSize() > 0 && !foundArgMarker) - while (state.GetTop()-popIndex >= 0 && !foundArgMarker) - { - //object marker = cpu.PopValueArgument(); - object marker = popIndex <= state.GetTop()? ToCSharpObject(state, popIndex++, binding) : new KOSArgMarkerType(); - if (marker != null && marker.GetType() == CpuUtility.ArgMarkerType) - foundArgMarker = true; - else - ++numExtraArgs; - } - if (numExtraArgs > 0) - throw new KOSArgumentMismatchException(delInfo.Parameters.Length, delInfo.Parameters.Length + numExtraArgs); - } - - // Delegate.DynamicInvoke expects a null, rather than an array of zero length, when - // there are no arguments to pass: - object[] argArray = (args.Count > 0) ? args.ToArray() : null; - - //object val = call(argArray); - object val = delegateResult.RawCall(argArray); - if (delInfo.ReturnType == typeof(void)) - { - //value = ScalarValue.Create(0); - delegateResult.RawSetValue(ScalarValue.Create(0)); - } - else - { - delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(val)); - } + try { delegateResult.Invoke(binding.Shared.Cpu); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } return PushLuaType(state, Structure.ToPrimitive(delegateResult.Value), binding); - } catch (Exception e) - { - Debug.Log(e); - return state.Error(e.Message); } + return state.Error(string.Format("attempt to call a non function {0} value", ksFunction.GetType().Name)); } private static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding) diff --git a/src/kOS/Lua/LuaCPU.cs b/src/kOS/Lua/LuaCPU.cs index 60ff6c1aee..83993a8871 100644 --- a/src/kOS/Lua/LuaCPU.cs +++ b/src/kOS/Lua/LuaCPU.cs @@ -18,6 +18,8 @@ namespace kOS.Lua { public class LuaCPU : CPU { + public IStack Stack => stack; + public new bool IsYielding() => base.IsYielding(); public LuaCPU(SafeSharedObjects shared) : base(shared) { } From 03689db2e3156893bb8b9f19490cb8675656600b Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 23 Sep 2024 00:55:44 +0300 Subject: [PATCH 018/108] Some typos --- src/kOS.Safe/Execution/CPU.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/kOS.Safe/Execution/CPU.cs b/src/kOS.Safe/Execution/CPU.cs index ec67f49d7e..06972b4770 100644 --- a/src/kOS.Safe/Execution/CPU.cs +++ b/src/kOS.Safe/Execution/CPU.cs @@ -1178,7 +1178,7 @@ public int GetArgumentStackSize() /// more than one instance of a trigger to exist for this same triggerFunctionPointer. Pass /// a zero to indicate you want to prevent multiple instances of triggers from this same /// entry point to be invokable. - /// Trigger should happen immediately on next opcode instead of waiting till next fixeupdate + /// Trigger should happen immediately on next opcode instead of waiting till next fixedupdate /// The closure the trigger should be called with. If this is /// null, then the trigger will only be able to see global variables reliably. /// A TriggerInfo structure describing this new trigger, which probably isn't very useful @@ -1218,7 +1218,7 @@ public TriggerInfo AddTrigger(int triggerFunctionPointer, InterruptPriority prio /// more than one instance of a trigger to exist for this same triggerFunctionPointer. Pass /// a zero to indicate you want to prevent multiple instances of triggers from this same /// entry point to be invokable. - /// Trigger should happen immediately on next opcode instead of waiting till next fixeupdate + /// Trigger should happen immediately on next opcode instead of waiting till next fixedupdate /// The list of arguments to pass to the UserDelegate when it gets called. /// A TriggerInfo structure describing this new trigger. It can be used to monitor /// the progress of the function call: To see if it has had a chance to finish executing yet, @@ -1263,7 +1263,7 @@ public TriggerInfo AddTrigger(UserDelegate del, InterruptPriority priority, int /// more than one instance of a trigger to exist for this same UserDelegate. Pass /// a zero to indicate you want to prevent multiple instances of triggers from this same /// Delegate to be invokable. - /// Trigger should happen immediately on next opcode instead of waiting till next fixeupdate + /// Trigger should happen immediately on next opcode instead of waiting till next fixedupdate /// A parms list of arguments to pass to the UserDelegate when it gets called. /// A TriggerInfo structure describing this new trigger. It can be used to monitor /// the progress of the function call: To see if it has had a chance to finish executing yet, @@ -1293,7 +1293,7 @@ public TriggerInfo AddTrigger(UserDelegate del, InterruptPriority priority, int /// If the TriggerInfo you pass in was built for a different ProgramContext than the one that /// is currently running, then this will return null and refuse to do anything. /// - /// Trigger should happen immediately on next opcode instead of waiting till next fixeupdate + /// Trigger should happen immediately on next opcode instead of waiting till next fixedupdate /// To be in agreement with how the other AddTrigger() methods work, this returns /// a TriggerInfo which is just the same one you passed in. It will return a null, however, /// in cases where the TriggerInfo you passed in is for a different ProgramContext. From bd31c04fd9ce9ad166d46edf048d2ea91e9ae270 Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 27 Sep 2024 00:00:40 +0300 Subject: [PATCH 019/108] Callback(trigger) system. Written in lua --- src/kOS.Safe/Screen/IInterpreter.cs | 2 +- src/kOS/Lua/LuaInterpreter.cs | 84 +++++++++++++---- src/kOS/Lua/init.lua | 141 ++++++++++++++++++++++++++++ src/kOS/Module/kOSProcessor.cs | 2 +- src/kOS/Screen/KSInterpreter.cs | 2 +- src/kOS/Screen/Terminal.cs | 2 +- 6 files changed, 210 insertions(+), 23 deletions(-) diff --git a/src/kOS.Safe/Screen/IInterpreter.cs b/src/kOS.Safe/Screen/IInterpreter.cs index 3aa03f9f47..c5db7a8bb3 100644 --- a/src/kOS.Safe/Screen/IInterpreter.cs +++ b/src/kOS.Safe/Screen/IInterpreter.cs @@ -13,7 +13,7 @@ public interface IInterpreter : IDisposable void ProcessCommand(string commandText); bool IsCommandComplete(string commandText); bool IsWaitingForCommand(); - void StopExecution(); + void BreakExecution(); int InstructionsThisUpdate(); } } diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index be74ca7bff..f6cc4cf03d 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -24,6 +24,7 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver { private NLua.Lua state; private KeraLua.Lua commandCoroutine; + private KeraLua.Lua callbacksCoroutine; private bool commandPending = false; private static readonly Dictionary stateInfo = new Dictionary(); private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; @@ -35,11 +36,16 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver private class ExecInfo { public int InstructionsThisUpdate = 0; - public bool StopExecution = false; - public SharedObjects Shared; - public ExecInfo(SharedObjects shared) + public int InstructionsDebt = 0; + public bool BreakExecution = false; + public readonly KeraLua.Lua CommandCoroutine; + public readonly KeraLua.Lua CallbacksCoroutine; + public readonly SharedObjects Shared; + public ExecInfo(SharedObjects shared, KeraLua.Lua commandCoroutine, KeraLua.Lua callbacksCoroutine) { Shared = shared; + CommandCoroutine = commandCoroutine; + CallbacksCoroutine = callbacksCoroutine; } } @@ -59,8 +65,10 @@ public void Boot() } state = new NLua.Lua(); commandCoroutine = state.State.NewThread(); + callbacksCoroutine = state.State.NewThread(); commandCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); - stateInfo.Add(commandCoroutine.MainThread.Handle, new ExecInfo(Shared)); + callbacksCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); + stateInfo.Add(state.State.MainThread.Handle, new ExecInfo(Shared, commandCoroutine, callbacksCoroutine)); using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { try { state.DoString(streamReader.ReadToEnd()); } @@ -97,7 +105,7 @@ public void Boot() DisplayError(string.Format("File '{0}' not found", path)); return; } - ProcessCommand(content.String); + ProcessCommand(content.String, "boot"); } } } @@ -106,15 +114,21 @@ private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) { var state = KeraLua.Lua.FromIntPtr(L); var execInfo = stateInfo[state.MainThread.Handle]; - if (++execInfo.InstructionsThisUpdate >= instructionsPerUpdate || execInfo.StopExecution || (execInfo.Shared.Cpu as LuaCPU).IsYielding()) + if (++execInfo.InstructionsThisUpdate >= instructionsPerUpdate || execInfo.BreakExecution + || (execInfo.CommandCoroutine.Handle == L && (execInfo.Shared.Cpu as LuaCPU).IsYielding())) { - state.Yield(0); + // it's possible for a C/CSharp function to call lua making a coroutine unable to yield because + // of the "C-call boundary". If that is the case we increase InstructionsDebt and its paid up on next fixed updates + if (state.IsYieldable) state.Yield(0); + else execInfo.InstructionsDebt++; } } - public void ProcessCommand(string commandText) + public void ProcessCommand(string commandText) => ProcessCommand(commandText, "command"); + + private void ProcessCommand(string commandText, string commandName) { - if ((LuaStatus)commandCoroutine.ResetThread() != LuaStatus.OK || commandCoroutine.LoadString(commandText, "command") != LuaStatus.OK) + if ((LuaStatus)commandCoroutine.ResetThread() != LuaStatus.OK || commandCoroutine.LoadString(commandText, commandName) != LuaStatus.OK) { var err = commandCoroutine.ToString(-1); commandCoroutine.Pop(1); @@ -140,12 +154,12 @@ public bool IsCommandComplete(string commandText) public bool IsWaitingForCommand() { - return !(Shared.Cpu as LuaCPU).IsYielding() && commandCoroutine.Status != LuaStatus.Yield; + return !(Shared.Cpu as LuaCPU).IsYielding() && callbacksCoroutine.Status != LuaStatus.Yield && commandCoroutine.Status != LuaStatus.Yield; } - public void StopExecution() + public void BreakExecution() { - stateInfo[commandCoroutine.MainThread.Handle].StopExecution = true; + stateInfo[commandCoroutine.MainThread.Handle].BreakExecution = true; } public int InstructionsThisUpdate() @@ -160,25 +174,57 @@ public void KOSFixedUpdate(double dt) (Shared.Cpu as LuaCPU).FixedUpdate(); var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; - if (execInfo.StopExecution) - { // true after StopExecution was called, reset thread to prevent execution of the same program - execInfo.StopExecution = false; + instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; + execInfo.InstructionsThisUpdate = Math.Min(instructionsPerUpdate, execInfo.InstructionsDebt); + execInfo.InstructionsDebt -= execInfo.InstructionsThisUpdate; + if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate) return; + + if (execInfo.BreakExecution) + { // true after BreakExecution was called, reset thread to prevent execution of the same program + execInfo.BreakExecution = false; // sometimes Terminal sends an empty string to ProcessCommand() after you ctrl+c during execution. // This ignores commands that are sent in the same tick that StopExecution() was called commandPending = false; commandCoroutine.ResetThread(); + callbacksCoroutine.ResetThread(); + if (callbacksCoroutine.GetGlobal("onBreakExecution") == LuaType.Function) + { + if (callbacksCoroutine.LoadString("onBreakExecution()", "callback") == LuaStatus.OK) + { + var status = callbacksCoroutine.Resume(state.State, 0); + if (status != LuaStatus.OK && status != LuaStatus.Yield) + DisplayError(callbacksCoroutine.ToString(-1)); + } + } } - instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; - execInfo.InstructionsThisUpdate = 0; Shared.BindingMgr?.PreUpdate(); + // if onFixedUpdate failed to execute due to running out of instructions we reset and start over. + // it's up to lua side to figure out how to handle the reset in case it didn't finish the callback + callbacksCoroutine.ResetThread(); + if (callbacksCoroutine.GetGlobal("onFixedUpdate") == LuaType.Function) + { + if (callbacksCoroutine.LoadString("onFixedUpdate()", "callback") == LuaStatus.OK) + { + var status = callbacksCoroutine.Resume(state.State, 0); + if (status != LuaStatus.OK && status != LuaStatus.Yield) + { + DisplayError(callbacksCoroutine.ToString(-1)); + callbacksCoroutine.PushNil(); + callbacksCoroutine.SetGlobal("onFixedUpdate"); + } + } + } + + if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate) return; + // resumes the coroutine after it yielded due to running out of instructions or after ProcessCommand loaded a new command if (!(Shared.Cpu as LuaCPU).IsYielding() && (commandCoroutine.Status == LuaStatus.Yield || commandPending)) { commandPending = false; LuaStatus status = commandCoroutine.Resume(state.State, 0); - if (status != LuaStatus.OK & status != LuaStatus.Yield) + if (status != LuaStatus.OK && status != LuaStatus.Yield) { commandCoroutine.ResetThread(); DisplayError(commandCoroutine.ToString(-1)); @@ -188,7 +234,7 @@ public void KOSFixedUpdate(double dt) public void Dispose() { - StopExecution(); + BreakExecution(); state.Dispose(); Shared.UpdateHandler.RemoveFixedObserver(this); } diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua index e69de29bb2..32c35d782c 100644 --- a/src/kOS/Lua/init.lua +++ b/src/kOS/Lua/init.lua @@ -0,0 +1,141 @@ +function onFixedUpdate(dt) + runCallbacks() +end + +function onBreakExecution() + breakCallbacks() +end + +function breakCallbacks() + callbacksList = {} + callbacksAddQueueLock = nil + callbacksAddQueueRoot = nil + callbacksAddQueueTail = nil + callbacksContinuation = nil + callbacksUnsorted = nil +end +breakCallbacks() + +function runCallbacks() + if callbacksContinuation then + coroutine.resume(callbacksContinuation) + end + if callbacksAddQueueRoot and not callbacksAddQueueLock then + callbacksContinuation = coroutine.create(function() + callbacksList.next, callbacksAddQueueTail.next = + callbacksAddQueueRoot, callbacksList.next + callbacksAddQueueRoot = nil + sortCallbacks() + end) + coroutine.resume(callbacksContinuation) + end + if callbacksUnsorted then + callbacksContinuation = coroutine.create(sortCallbacks) + coroutine.resume(callbacksContinuation) + end + local callback = callbacksList.next + local previousCallback = callbacksList + while callback do + if callback.coroutine then + coroutine.resume(callback.coroutine, callback) + previousCallback = callback + else + if callback.body then + callback.coroutine = coroutine.create(callback.body) + coroutine.resume(callback.coroutine, callback) + previousCallback = callback + else + previousCallback.next = callback.next + end + end + callback = callback.next + end +end + +function callbacksSplit(head) + local fast, slow = head, head + while fast and fast.next do + fast = fast.next.next + if fast then slow = slow.next end + end + local second = slow.next + slow.next = nil + return second +end +function callbacksMerge(first, second) + if not first then return second end + if not second then return first end + if first.priority > second.priority then + first.next = callbacksMerge(first.next, second) + return first + else + second.next = callbacksMerge(first, second.next) + return second + end +end +function callbacksMergeSort(head) + if not head or not head.next then return head end + local second = callbacksSplit(head) + head = callbacksMergeSort(head) + second = callbacksMergeSort(second) + return callbacksMerge(head, second) +end +function sortCallbacks() + callbacksList.next = callbacksMergeSort(callbacksList.next) + callbacksUnsorted = false + callbacksContinuation = nil +end + +function addCallback(body, priority) + local function callbackBody(callback) + local success, newPriority = pcall(body, callback) + if not(newPriority == true or newPriority == callback.priority) then + if success then + callback.priority = tonumber(newPriority) + if callback.priority then + callbacksUnsorted = true + else + callback.body = nil + end + else + warn(newPriority) + callback.body = nil + end + end + callback.coroutine = nil + end + callbacksAddQueueLock = true + callbacksAddQueueRoot = { + next = callbacksAddQueueRoot, + body = callbackBody, + priority = priority or 0 + } + if not callbacksAddQueueRoot.next then + callbacksAddQueueTail = callbacksAddQueueRoot + end + callbacksAddQueueLock = false +end + +function when(condition, body, priority) + addCallback(function (callback) + if condition() then + return body() + else + return callback.priority + end + end, priority) +end + +function on(state, body, priority) + local previousState = state() + addCallback(function (callback) + local currentState = state() + if currentState ~= previousState then + local newPriority = body() + previousState = currentState + return newPriority + else + return callback.priority + end + end, priority) +end \ No newline at end of file diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 40272ee552..937ebc52a3 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -1236,7 +1236,7 @@ private void ProcessorModeChanged() case ProcessorModes.OFF: case ProcessorModes.STARVED: - if (shared.Interpreter != null) shared.Interpreter.StopExecution(); + if (shared.Interpreter != null) shared.Interpreter.BreakExecution(); if (shared.Cpu != null) shared.Cpu.BreakExecution(true); if (shared.Terminal != null) shared.Terminal.SetInputLock(true); if (shared.Window != null) shared.Window.IsPowered = false; diff --git a/src/kOS/Screen/KSInterpreter.cs b/src/kOS/Screen/KSInterpreter.cs index 9416840a75..c042f6c656 100644 --- a/src/kOS/Screen/KSInterpreter.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -68,7 +68,7 @@ public bool IsWaitingForCommand() return context.Program[context.InstructionPointer] is OpcodeEOF; } - public void StopExecution() + public void BreakExecution() { Shared.Cpu.GetCurrentOpcode().AbortProgram = true; } diff --git a/src/kOS/Screen/Terminal.cs b/src/kOS/Screen/Terminal.cs index 8d84d3607f..8a71120c29 100644 --- a/src/kOS/Screen/Terminal.cs +++ b/src/kOS/Screen/Terminal.cs @@ -67,7 +67,7 @@ public override bool SpecialKey(char key) { if (key == (char)UnicodeCommand.BREAK) { - Shared.Interpreter.StopExecution(); + Shared.Interpreter.BreakExecution(); Shared.Cpu.BreakExecution(true); LineBuilder.Remove(0, LineBuilder.Length); // why isn't there a StringBuilder.Clear()? From 12d3915dd52393761b17459b63e6f4692cef85b3 Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 27 Sep 2024 20:22:24 +0300 Subject: [PATCH 020/108] Separate types and functions from binding logic Put all types in Types folder Put function definitions in LuaFunctions.cs file Support Structure operators --- src/kOS/Lua/Binding.cs | 376 ++++++++----------------------- src/kOS/Lua/LuaFunctions.cs | 45 ++++ src/kOS/Lua/Types/KSFunction.cs | 60 +++++ src/kOS/Lua/Types/KSStructure.cs | 229 +++++++++++++++++++ src/kOS/Lua/Types/LuaTypeBase.cs | 10 + src/kOS/kOS.csproj | 4 + 6 files changed, 442 insertions(+), 282 deletions(-) create mode 100644 src/kOS/Lua/LuaFunctions.cs create mode 100644 src/kOS/Lua/Types/KSFunction.cs create mode 100644 src/kOS/Lua/Types/KSStructure.cs create mode 100644 src/kOS/Lua/Types/LuaTypeBase.cs diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index fdcd64a96f..17b163787d 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -13,32 +13,37 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; +using kOS.Lua.Types; using Smooth.Collections; using Debug = UnityEngine.Debug; namespace kOS.Lua { - internal static class Binding + public static class Binding { - private static readonly Dictionary bindings = new Dictionary(); + public static readonly Dictionary bindings = new Dictionary(); // the CSharp object to userdata binding model was adapted from NLua model // with some simplifications and changes to make it work on Structures - private class BindingData - { - public readonly Dictionary variables; - public readonly Dictionary objects; - public readonly Dictionary userdataPtrs; - public readonly Dictionary functions; - public readonly SafeSharedObjects Shared; + public class BindingData + { + public readonly Dictionary Variables; + public readonly Dictionary Functions; + public readonly Dictionary Objects = new Dictionary(); + public readonly Dictionary UserdataPtrs = new Dictionary(); + public readonly LuaTypeBase[] Types; + public readonly SharedObjects Shared; - public BindingData(SafeSharedObjects shared, Dictionary boundVariables, Dictionary functions) + public BindingData(KeraLua.Lua state, SharedObjects shared, Dictionary boundVariables, Dictionary functions) { Shared = shared; - variables = boundVariables; - objects = new Dictionary(); - userdataPtrs = new Dictionary(); - this.functions = functions; + Variables = boundVariables; + Functions = functions; + Types = new LuaTypeBase[] + { + new KSStructure(state), + new KSFunction(state), + }; } } @@ -48,65 +53,25 @@ public static void BindToState(KeraLua.Lua state, SharedObjects shared) { state = state.MainThread; bindings[state.Handle] = new BindingData( + state, shared, (shared.BindingMgr as BindingManager).RawVariables, (shared.FunctionManager as FunctionManager).RawFunctions ); + + LuaFunctions.Add(state); + state.PushCFunction(EnvIndex); state.SetGlobal("envIndex"); state.PushCFunction(EnvNewIndex); state.SetGlobal("envNewIndex"); state.GetGlobal("type"); state.SetGlobal("_type"); - state.PushCFunction(UserdataType); + state.PushCFunction(TypeFunction); state.SetGlobal("type"); - state.GetGlobal("print"); - state.SetGlobal("_print"); - state.PushCFunction(KosPrint); - state.SetGlobal("print"); int oldTop = state.GetTop(); state.DoString(@"local mt = { __index = envIndex, __newindex = envNewIndex }; setmetatable(_ENV, mt)"); - CreateUserdataMapTable(state); - if (state.NewMetaTable("Structure")) - { - state.PushString("__type"); - state.PushString("Structure"); - state.RawSet(-3); - state.PushString("__index"); - state.PushCFunction(StructureIndex); - state.RawSet(-3); - state.PushString("__newindex"); - state.PushCFunction(StructureNewIndex); - state.RawSet(-3); - state.PushString("__pairs"); - state.PushCFunction(StructurePairs); - state.RawSet(-3); - state.PushString("__gc"); - state.PushCFunction(CollectObject); - state.RawSet(-3); - state.PushString("__tostring"); - state.PushCFunction(StructureToString); - state.RawSet(-3); - } - if (state.NewMetaTable("KerboscriptFunction")) - { - state.PushString("__type"); - state.PushString("KerboscriptFunction"); - state.RawSet(-3); - state.PushString("__call"); - state.PushCFunction(KSFunctionCall); - state.RawSet(-3); - state.PushString("__gc"); - state.PushCFunction(CollectObject); - state.RawSet(-3); - state.PushString("__tostring"); - state.PushCFunction(KSFunctionToString); - state.RawSet(-3); - } - state.SetTop(oldTop); - } - private static void CreateUserdataMapTable(KeraLua.Lua state) - { + state.PushString("userdataAddressToUserdata"); state.NewTable(); state.NewTable(); @@ -115,62 +80,46 @@ private static void CreateUserdataMapTable(KeraLua.Lua state) state.SetTable(-3); state.SetMetaTable(-2); state.SetTable((int)LuaRegistry.Index); + + state.SetTop(oldTop); } - private static int KosPrint(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - var argCount = state.GetTop(); - var prints = new string[argCount]; - for (int i = 0; i < argCount; i++) - prints[i] = state.ToString(i + 1); - bindings[state.MainThread.Handle].Shared.Screen.Print(string.Join(" ", prints)); - return 0; - } - - private static int UserdataType(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - if (state.GetMetaField(1, "__type") == LuaType.String) - return 1; - state.PushString(state.TypeName(1)); - return 1; - } - - private static int CollectObject(IntPtr L) + public static int CollectObject(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); bindings.TryGetValue(state.MainThread.Handle, out var binding); if (binding == null) return 0; // happens after DisposeStateBinding() was called var userdataAddress = state.ToUserData(1); - binding.objects.TryGetValue(userdataAddress, out var obj); + binding.Objects.TryGetValue(userdataAddress, out var obj); if (obj == null) return 0; // read the note in PushObject() to know when this happens - binding.userdataPtrs.Remove(obj); - binding.objects.Remove(userdataAddress); + binding.UserdataPtrs.Remove(obj); + binding.Objects.Remove(userdataAddress); return 0; } - private static int StructureToString(IntPtr L) + public static int ObjectToString(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var structure = bindings[state.MainThread.Handle].objects[state.ToUserData(1)]; - if (structure is IEnumerable) - { // make enum structures ToString() method show 1 base indexed values in lua - // replaces "\n [*number*]" with "\n [*number+1*]" - state.PushString(Regex.Replace(structure.ToString(), @"\n\s*\[([0-9]+)\]", (match) => - Regex.Replace(match.Groups[0].Value, match.Groups[1].Value, (int.Parse(match.Groups[1].Value) + 1).ToString()) - )); - } - else - state.PushString(structure.ToString()); + var obj = Binding.bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; + state.PushString(obj.ToString()); return 1; } - private static int KSFunctionToString(IntPtr L) + private static int TypeFunction(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var function = bindings[state.MainThread.Handle].objects[state.ToUserData(1)]; - state.PushString(function.GetType().Name); + if (state.Type(1) == LuaType.UserData) + { + var obj = bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; + if (obj is Structure structure) + { + state.PushString(structure.KOSName); + return 1; + } + } + if (state.GetMetaField(1, "__type") == LuaType.String) + return 1; + state.PushString(state.TypeName(1)); return 1; } @@ -179,12 +128,12 @@ private static int EnvIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var index = state.ToString(2); var binding = bindings[state.MainThread.Handle]; - if (binding.variables.TryGetValue(index, out var boundVar)) + if (binding.Variables.TryGetValue(index, out var boundVar)) { try { return PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding); } catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } } - if (binding.functions.TryGetValue(index, out var function)) + if (binding.Functions.TryGetValue(index, out var function)) { return PushLuaType(state, function, binding); } @@ -196,7 +145,7 @@ private static int EnvNewIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; var index = state.ToString(2); - if (binding.variables.TryGetValue(index, out var boundVar) && boundVar.Set != null) + if (binding.Variables.TryGetValue(index, out var boundVar) && boundVar.Set != null) { try { boundVar.Value = ToCSharpObject(state, 3, binding); } catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } @@ -208,195 +157,58 @@ private static int EnvNewIndex(IntPtr L) return 0; } - private static int StructureIndex(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - var binding = bindings[state.MainThread.Handle]; - object obj = binding.objects[state.ToUserData(1)]; - var structure = obj as Structure; - if (structure == null) - return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); - - try { return PushSuffixResult(state, binding, structure, 2); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - } - - private static int PushSuffixResult(KeraLua.Lua state, BindingData binding, Structure structure, int index) - { - object pushValue = null; - if (state.TypeName(index) == "number" && structure is IIndexable indexable) - { - pushValue = Structure.ToPrimitive(indexable.GetIndex((int)state.ToInteger(index)-(structure is Lexicon? 0 : 1), true)); - return PushLuaType(state, pushValue, binding); - } - - var result = structure.GetSuffix(state.ToString(index), true); - if (result == null) - return PushLuaType(state, null, binding); - - if (result.HasValue) - { - pushValue = Structure.ToPrimitive(result.Value); - } - else if (result is DelegateSuffixResult delegateResult && delegateResult.RawDelInfo.Parameters.Length == 0) - { - var callResult = delegateResult.RawCall(null); - if (delegateResult.RawDelInfo.ReturnType == typeof(void)) - delegateResult.RawSetValue(ScalarValue.Create(0)); // this is what kerboscript does - else - delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(callResult)); - pushValue = Structure.ToPrimitive(delegateResult.Value); - } else - { - pushValue = result as DelegateSuffixResult; // if its somehow not DelegateSuffixResult push null - } - return PushLuaType(state, pushValue, binding); - } - - private static int StructureNewIndex(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - var binding = bindings[state.MainThread.Handle]; - object obj = binding.objects[state.ToUserData(1)]; - var structure = obj as Structure; - if (structure == null) - return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); - object value = ToCSharpObject(state, 3, binding); - if (value != null) - { - if (structure is IIndexable && state.TypeName(2) == "number") - { - int intIndex = (int)state.ToInteger(2); - try { (structure as IIndexable).SetIndex(intIndex, Structure.FromPrimitive(value) as Structure); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - return 0; - } - var index = state.ToString(2); - try { structure.SetSuffix(index, Structure.FromPrimitive(value)); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - } - return 0; - } - - private static int StructurePairs(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - var binding = bindings[state.MainThread.Handle]; - var structure = binding.objects[state.ToUserData(1)] as Structure; - if (structure == null) - return state.Error("pairs metamethod can only be called with a Structure type"); - - state.PushInteger(1); - var enumCount = (structure is IIndexable && structure is IEnumerable enumerable) - ? enumerable.Count() - : 0; - state.NewTable(); - var index = 1; - for (; index <= enumCount; index++) - { - state.PushInteger(index); - state.PushInteger(index); - state.SetTable(-3); - } - foreach (var name in structure.GetSuffixNames()) - { - state.PushInteger(index++); - state.PushString(name); - state.SetTable(-3); - } - - state.PushCClosure(StructureNext, 2); // pass the starting index and table with index-suffix pairs - state.PushCopy(1); - return 2; - } - - private static int StructureNext(IntPtr L) + public static object ToCSharpObject(KeraLua.Lua state, int index, BindingData binding = null) { - var state = KeraLua.Lua.FromIntPtr(L); - var binding = bindings[state.MainThread.Handle]; - var structure = binding.objects[state.ToUserData(1)] as Structure; - if (structure == null) - return state.Error("iterator can only be called with a Structure type"); - // ignore the second argument - var currentIndex = state.ToInteger(KeraLua.Lua.UpValueIndex(1)); - state.PushCopy(KeraLua.Lua.UpValueIndex(2)); - state.PushInteger(currentIndex); - state.GetTable(-2); - - try { PushSuffixResult(state, binding, structure, -1); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - - state.PushInteger(currentIndex+1); - state.Copy(-1, KeraLua.Lua.UpValueIndex(1)); - state.Remove(-1); - return 2; - } - - private static int KSFunctionCall(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - var binding = bindings[state.MainThread.Handle]; - var ksFunction = binding.objects[state.ToUserData(1)]; - - var stack = (binding.Shared.Cpu as LuaCPU).Stack; - stack.Clear(); - stack.PushArgument(new KOSArgMarkerType()); - for (int i = 2; i <= state.GetTop(); i++) - stack.PushArgument(ToCSharpObject(state, i, binding)); - - if (ksFunction is SafeFunctionBase function) - { - try { function.Execute(binding.Shared); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - return PushLuaType(state, Structure.ToPrimitive(function.ReturnValue), binding); - } - if (ksFunction is DelegateSuffixResult delegateResult) + switch (state.Type(index)) { - try { delegateResult.Invoke(binding.Shared.Cpu); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - return PushLuaType(state, Structure.ToPrimitive(delegateResult.Value), binding); - } - return state.Error(string.Format("attempt to call a non function {0} value", ksFunction.GetType().Name)); - } - - private static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding) - { - if (obj == null) - state.PushNil(); - else if (obj is double db) - state.PushNumber(db); - else if (obj is int i) - state.PushInteger(i); - else if (obj is string str) - state.PushString(str); - else if (obj is bool b) - state.PushBoolean(b); - else - return PushObject(state, obj, binding, obj is Structure? "Structure" : "KerboscriptFunction"); - return 1; - } - - private static object ToCSharpObject(KeraLua.Lua state, int index, BindingData binding = null) - { - switch (state.TypeName(index)) - { - case "number": + case LuaType.Number: return state.ToNumber(index); - case "string": + case LuaType.String: return state.ToString(index); - case "boolean": + case LuaType.Boolean: return state.ToBoolean(index); - case "userdata": - return binding?.objects.GetValueOrDefault(state.ToUserData(index), null); + case LuaType.UserData: + return binding?.Objects.GetValueOrDefault(state.ToUserData(index), null); default: return null; } } + + public static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding) + { + switch (obj) + { + case null: + state.PushNil(); + break; + case double db: + state.PushNumber(db); + break; + case int i: + state.PushInteger(i); + break; + case string str: + state.PushString(str); + break; + case bool b: + state.PushBoolean(b); + break; + default: + { + foreach (var type in binding.Types) + if (type.BindingTypes.Any(t => t.IsInstanceOfType(obj))) + return PushObject(state, obj, binding, type.MetatableName); + state.PushNil(); + break; + } + } + return 1; + } private static int PushObject(KeraLua.Lua state, object obj, BindingData binding, string metatable) { state.GetMetaTable("userdataAddressToUserdata"); - if (binding.userdataPtrs.TryGetValue(obj, out IntPtr userdataAddress)) // Object already in the list of object userdata? Push the userdata + if (binding.UserdataPtrs.TryGetValue(obj, out IntPtr userdataAddress)) // Object already in the list of object userdata? Push the userdata { // Note: starting with lua5.1 the garbage collector may remove weak reference items (such as our userdataAddressToUserdata values) when the initial GC sweep // occurs, but the actual call of the __gc finalizer for that object may not happen until a little while later. During that window we might call @@ -409,8 +221,8 @@ private static int PushObject(KeraLua.Lua state, object obj, BindingData binding return 1; } state.Remove(-1); // remove the nil value - binding.objects.Remove(userdataAddress); // Remove from both our maps and fall out to create a new userdata - binding.userdataPtrs.Remove(obj); + binding.Objects.Remove(userdataAddress); // Remove from both our maps and fall out to create a new userdata + binding.UserdataPtrs.Remove(obj); } userdataAddress = state.NewUserData(0); @@ -421,13 +233,13 @@ private static int PushObject(KeraLua.Lua state, object obj, BindingData binding state.RawSet(-4); // add userdata on top of the stack to the userdataAddressToUserdata metatable at userdataAddress key state.Remove(-2); - binding.objects[userdataAddress] = obj; - binding.userdataPtrs[obj] = userdataAddress; + binding.Objects[userdataAddress] = obj; + binding.UserdataPtrs[obj] = userdataAddress; return 1; } - private static void DumpStack(KeraLua.Lua state, string debugName = "", BindingData binding = null) + public static void DumpStack(KeraLua.Lua state, string debugName = "", BindingData binding = null) { binding = binding ?? bindings[state.MainThread.Handle]; Debug.Log(debugName+"_________"); diff --git a/src/kOS/Lua/LuaFunctions.cs b/src/kOS/Lua/LuaFunctions.cs new file mode 100644 index 0000000000..307c47a490 --- /dev/null +++ b/src/kOS/Lua/LuaFunctions.cs @@ -0,0 +1,45 @@ +using KeraLua; +using kOS.Module; +using System; +using System.Runtime.InteropServices; +using Debug = UnityEngine.Debug; + +namespace kOS.Lua +{ + public static class LuaFunctions + { + public static void Add(KeraLua.Lua state) + { + state.GetGlobal("print"); + state.SetGlobal("_print"); + state.PushCFunction(KosPrint); + state.SetGlobal("print"); + state.SetWarningFunction(Warning, state.MainThread.Handle); + } + + private static int KosPrint(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var argCount = state.GetTop(); + var prints = new string[argCount]; + for (int i = 0; i < argCount; i++) + prints[i] = state.ToString(i + 1); + Binding.bindings[state.MainThread.Handle].Shared.Screen.Print(string.Join(" ", prints)); + return 0; + } + + private static void Warning(IntPtr ud, IntPtr msg, int tocont) + { + var shared = Binding.bindings[ud].Shared; + (shared.Interpreter as LuaInterpreter).DisplayError(Marshal.PtrToStringAnsi(msg)); + } + + // private static int SetSteering(IntPtr L) + // { + // var state = KeraLua.Lua.FromIntPtr(L); + // var binding = Binding.bindings[state.MainThread.Handle]; + // var steeringManager = kOSVesselModule.GetInstance(binding.Shared.Vessel).GetFlightControlParameter("steering"); + // return 0; + // } + } +} \ No newline at end of file diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs new file mode 100644 index 0000000000..19bf11e279 --- /dev/null +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -0,0 +1,60 @@ +using System; +using kOS.Safe.Encapsulation; +using kOS.Safe.Encapsulation.Suffixes; +using kOS.Safe.Execution; +using kOS.Safe.Function; +using Debug = UnityEngine.Debug; + +namespace kOS.Lua.Types +{ + public class KSFunction : LuaTypeBase + { + private static readonly Type[] bindingTypes = { typeof(SafeFunctionBase), typeof(DelegateSuffixResult) }; + public override string MetatableName => "KerboscriptFunction"; + public override Type[] BindingTypes => bindingTypes; + + public KSFunction(KeraLua.Lua state) + { + state.NewMetaTable(MetatableName); + state.PushString("__type"); + state.PushString(MetatableName); + state.RawSet(-3); + state.PushString("__call"); + state.PushCFunction(KSFunctionCall); + state.RawSet(-3); + state.PushString("__gc"); + state.PushCFunction(Binding.CollectObject); + state.RawSet(-3); + state.PushString("__tostring"); + state.PushCFunction(Binding.ObjectToString); + state.RawSet(-3); + } + + private static int KSFunctionCall(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = Binding.bindings[state.MainThread.Handle]; + var ksFunction = binding.Objects[state.ToUserData(1)]; + + var stack = (binding.Shared.Cpu as LuaCPU).Stack; + stack.Clear(); + stack.PushArgument(new KOSArgMarkerType()); + for (int i = 2; i <= state.GetTop(); i++) + stack.PushArgument(Binding.ToCSharpObject(state, i, binding)); + + if (ksFunction is SafeFunctionBase function) + { + try { function.Execute(binding.Shared); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + return Binding.PushLuaType(state, Structure.ToPrimitive(function.ReturnValue), binding); + } + if (ksFunction is DelegateSuffixResult delegateResult) + { + try { delegateResult.Invoke(binding.Shared.Cpu); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + return Binding.PushLuaType(state, Structure.ToPrimitive(delegateResult.Value), binding); + } + return state.Error(string.Format("attempt to call a non function {0} value", ksFunction.GetType().Name)); + } + } +} diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs new file mode 100644 index 0000000000..3cf14ef5f8 --- /dev/null +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -0,0 +1,229 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using KeraLua; +using kOS.Safe.Compilation; +using kOS.Safe.Encapsulation; +using kOS.Safe.Encapsulation.Suffixes; +using kOS.Safe.Execution; +using kOS.Safe.Function; +using Debug = UnityEngine.Debug; + +namespace kOS.Lua.Types +{ + public class KSStructure : LuaTypeBase + { + private static readonly CalculatorStructure structureCalculator = new CalculatorStructure(); + private static readonly Type[] bindingTypes = { typeof(Structure) }; + public override string MetatableName => "Structure"; + public override Type[] BindingTypes => bindingTypes; + + public KSStructure(KeraLua.Lua state) + { + state.NewMetaTable(MetatableName); + state.PushString("__type"); + state.PushString(MetatableName); + state.RawSet(-3); + state.PushString("__index"); + state.PushCFunction(StructureIndex); + state.RawSet(-3); + state.PushString("__newindex"); + state.PushCFunction(StructureNewIndex); + state.RawSet(-3); + state.PushString("__pairs"); + state.PushCFunction(StructurePairs); + state.RawSet(-3); + state.PushString("__gc"); + state.PushCFunction(Binding.CollectObject); + state.RawSet(-3); + state.PushString("__tostring"); + state.PushCFunction(StructureToString); + state.RawSet(-3); + state.PushString("__add"); + state.PushCFunction(StructureAdd); + state.RawSet(-3); + state.PushString("__sub"); + state.PushCFunction(StructureSubtract); + state.RawSet(-3); + state.PushString("__mul"); + state.PushCFunction(StructureMultiply); + state.RawSet(-3); + state.PushString("__div"); + state.PushCFunction(StructureDivide); + state.RawSet(-3); + state.PushString("__pow"); + state.PushCFunction(StructurePower); + state.RawSet(-3); + // there is no "not equal", "greater than", "greater or equal than" because lua switches the order for these operators + // and uses the operators below. In theory there shouldn't be any differences with how kerboscript does it, but watch out + state.PushString("__eq"); + state.PushCFunction(StructureEqual); + state.RawSet(-3); + state.PushString("__lt"); + state.PushCFunction(StructureLessThan); + state.RawSet(-3); + state.PushString("__le"); + state.PushCFunction(StructureLessEqualThan); + state.RawSet(-3); + } + + private static int StructureAdd(IntPtr L) => StructureOperator(L, structureCalculator.Add); + private static int StructureSubtract(IntPtr L) => StructureOperator(L, structureCalculator.Subtract); + private static int StructureMultiply(IntPtr L) => StructureOperator(L, structureCalculator.Multiply); + private static int StructureDivide(IntPtr L) => StructureOperator(L, structureCalculator.Divide); + private static int StructurePower(IntPtr L) => StructureOperator(L, structureCalculator.Power); + private static int StructureEqual(IntPtr L) => StructureOperator(L, structureCalculator.Equal); + private static int StructureLessThan(IntPtr L) => StructureOperator(L, structureCalculator.LessThan); + private static int StructureLessEqualThan(IntPtr L) => StructureOperator(L, structureCalculator.LessThanEqual); + + private static int StructureOperator(IntPtr L, Func operatorMethod) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = Binding.bindings[state.MainThread.Handle]; + var pair = new OperandPair(Binding.ToCSharpObject(state, 1, binding), Binding.ToCSharpObject(state, 2, binding)); + try { return Binding.PushLuaType(state, operatorMethod(pair), binding); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + } + + private static int StructureToString(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var structure = Binding.bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; + if (structure is IEnumerable) + { // make enum structures ToString() method show 1 base indexed values in lua + // replaces "\n [*number*]" with "\n [*number+1*]" + state.PushString(Regex.Replace(structure.ToString(), @"\n\s*\[([0-9]+)\]", (match) => + Regex.Replace(match.Groups[0].Value, match.Groups[1].Value, (int.Parse(match.Groups[1].Value) + 1).ToString()) + )); + } + else + state.PushString(structure.ToString()); + return 1; + } + + private static int StructureIndex(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = Binding.bindings[state.MainThread.Handle]; + object obj = binding.Objects[state.ToUserData(1)]; + var structure = obj as Structure; + if (structure == null) + return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); + + try { return PushSuffixResult(state, binding, structure, 2); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + } + + private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData binding, Structure structure, int index) + { + object pushValue = null; + if (state.Type(index) == LuaType.Number && structure is IIndexable indexable) + { + pushValue = Structure.ToPrimitive(indexable.GetIndex((int)state.ToInteger(index)-(structure is Lexicon? 0 : 1), true)); + return Binding.PushLuaType(state, pushValue, binding); + } + + var result = structure.GetSuffix(state.ToString(index), true); + if (result == null) + return Binding.PushLuaType(state, null, binding); + + if (result.HasValue) + { + pushValue = Structure.ToPrimitive(result.Value); + } + else if (result is DelegateSuffixResult delegateResult && delegateResult.RawDelInfo.Parameters.Length == 0) + { + var callResult = delegateResult.RawCall(null); + if (delegateResult.RawDelInfo.ReturnType == typeof(void)) + delegateResult.RawSetValue(ScalarValue.Create(0)); // this is what kerboscript does + else + delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(callResult)); + pushValue = Structure.ToPrimitive(delegateResult.Value); + } else + { + pushValue = result as DelegateSuffixResult; // if its somehow not DelegateSuffixResult push null + } + return Binding.PushLuaType(state, pushValue, binding); + } + + private static int StructureNewIndex(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = Binding.bindings[state.MainThread.Handle]; + object obj = binding.Objects[state.ToUserData(1)]; + var structure = obj as Structure; + if (structure == null) + return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); + object value = Binding.ToCSharpObject(state, 3, binding); + if (value != null) + { + if (structure is IIndexable && state.Type(2) == LuaType.Number) + { + int intIndex = (int)state.ToInteger(2); + try { (structure as IIndexable).SetIndex(intIndex, Structure.FromPrimitive(value) as Structure); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + return 0; + } + var index = state.ToString(2); + try { structure.SetSuffix(index, Structure.FromPrimitive(value)); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + } + return 0; + } + + private static int StructurePairs(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = Binding.bindings[state.MainThread.Handle]; + var structure = binding.Objects[state.ToUserData(1)] as Structure; + if (structure == null) + return state.Error("pairs metamethod can only be called with a Structure type"); + + state.PushInteger(1); + var enumCount = (structure is IIndexable && structure is IEnumerable enumerable) + ? enumerable.Count() + : 0; + state.NewTable(); + var index = 1; + for (; index <= enumCount; index++) + { + state.PushInteger(index); + state.PushInteger(index); + state.SetTable(-3); + } + foreach (var name in structure.GetSuffixNames()) + { + state.PushInteger(index++); + state.PushString(name); + state.SetTable(-3); + } + + state.PushCClosure(StructureNext, 2); // pass the starting index and table with index-suffix pairs + state.PushCopy(1); + return 2; + } + + private static int StructureNext(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = Binding.bindings[state.MainThread.Handle]; + var structure = binding.Objects[state.ToUserData(1)] as Structure; + if (structure == null) + return state.Error("iterator can only be called with a Structure type"); + // ignore the second argument + var currentIndex = state.ToInteger(KeraLua.Lua.UpValueIndex(1)); + state.PushCopy(KeraLua.Lua.UpValueIndex(2)); + state.PushInteger(currentIndex); + state.GetTable(-2); + + try { PushSuffixResult(state, binding, structure, -1); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + + state.PushInteger(currentIndex+1); + state.Copy(-1, KeraLua.Lua.UpValueIndex(1)); + state.Remove(-1); + return 2; + } + } +} diff --git a/src/kOS/Lua/Types/LuaTypeBase.cs b/src/kOS/Lua/Types/LuaTypeBase.cs new file mode 100644 index 0000000000..0257faa0b1 --- /dev/null +++ b/src/kOS/Lua/Types/LuaTypeBase.cs @@ -0,0 +1,10 @@ +using System; + +namespace kOS.Lua.Types +{ + public abstract class LuaTypeBase + { + public abstract Type[] BindingTypes { get; } + public abstract string MetatableName { get; } + } +} \ No newline at end of file diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index 0741cd4e1c..b50eabe60e 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -82,6 +82,10 @@ + + + + From 85c84ae64becb6f599099e0790fee83c941f80d8 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 28 Sep 2024 19:30:00 +0300 Subject: [PATCH 021/108] Fix NREs from LuaInterpreter.Dispose on scene unloads. Dispose (lua/ks)Cpu, (lua/ks)Interpreter in OnDestroy --- src/kOS/Lua/Binding.cs | 2 -- src/kOS/Lua/LuaInterpreter.cs | 16 +++++++--------- src/kOS/Module/kOSProcessor.cs | 4 ++++ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 17b163787d..ff756fa249 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -47,8 +47,6 @@ public BindingData(KeraLua.Lua state, SharedObjects shared, Dictionary bindings.Remove(state.MainThread.Handle); - public static void BindToState(KeraLua.Lua state, SharedObjects shared) { state = state.MainThread; diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index f6cc4cf03d..d5de519ec8 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -56,13 +56,8 @@ public LuaInterpreter(SharedObjects shared) public void Boot() { + Dispose(); Shared.UpdateHandler.AddFixedObserver(this); - if (state != null) - { - stateInfo.Remove(state.State.MainThread.Handle); - Binding.DisposeStateBinding(state.State); - state.Dispose(); - } state = new NLua.Lua(); commandCoroutine = state.State.NewThread(); callbacksCoroutine = state.State.NewThread(); @@ -159,7 +154,7 @@ public bool IsWaitingForCommand() public void BreakExecution() { - stateInfo[commandCoroutine.MainThread.Handle].BreakExecution = true; + stateInfo[state.State.MainThread.Handle].BreakExecution = true; } public int InstructionsThisUpdate() @@ -234,9 +229,12 @@ public void KOSFixedUpdate(double dt) public void Dispose() { - BreakExecution(); - state.Dispose(); + if (state == null) return; Shared.UpdateHandler.RemoveFixedObserver(this); + stateInfo.Remove(state.State.MainThread.Handle); + Binding.bindings.Remove(state.State.MainThread.Handle); + state.Dispose(); + state = null; } public void DisplayError(string errorMessage) diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 937ebc52a3..711e7ee36d 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -823,6 +823,10 @@ public void OnDestroy() shared.Cpu.BreakExecution(false); shared.Cpu.Dispose(); shared.Interpreter.Dispose(); + luaCpu?.Dispose(); + ksCpu?.Dispose(); + luaInterpreter?.Dispose(); + ksInterpreter?.Dispose(); shared.DestroyObjects(); shared = null; } From 5ccb8f200c10d9f9715cf027cd1efaa601f6d6b5 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 28 Sep 2024 19:51:31 +0300 Subject: [PATCH 022/108] Remove project references added in 611787190d6d2f5710393f9d660705b7df81bc3e. They are not needed with KSPBuildTools --- src/kOS.Safe.Test/kOS.Safe.Test.csproj | 6 ------ src/kOS.Safe/kOS.Safe.csproj | 11 ----------- 2 files changed, 17 deletions(-) diff --git a/src/kOS.Safe.Test/kOS.Safe.Test.csproj b/src/kOS.Safe.Test/kOS.Safe.Test.csproj index ef2b727006..99453011a3 100644 --- a/src/kOS.Safe.Test/kOS.Safe.Test.csproj +++ b/src/kOS.Safe.Test/kOS.Safe.Test.csproj @@ -32,12 +32,6 @@ false - - - - - - $(SolutionDir)packages\NSubstitute.1.8.1.0\lib\net35\NSubstitute.dll false diff --git a/src/kOS.Safe/kOS.Safe.csproj b/src/kOS.Safe/kOS.Safe.csproj index 6d4e5b2892..65b74e3cde 100644 --- a/src/kOS.Safe/kOS.Safe.csproj +++ b/src/kOS.Safe/kOS.Safe.csproj @@ -44,17 +44,6 @@ false false - - - ..\..\Resources\GameData\kOS\Plugins\ICSharpCode.SharpZipLib.dll - - - - - - - - From 5466e4e36cf222661fcb43b7fa965a34a27a0cdd Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 28 Sep 2024 22:15:05 +0300 Subject: [PATCH 023/108] Add unary operator for Structures --- src/kOS/Lua/Types/KSStructure.cs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index 3cf14ef5f8..e65bd02acb 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text.RegularExpressions; using KeraLua; using kOS.Safe.Compilation; using kOS.Safe.Encapsulation; using kOS.Safe.Encapsulation.Suffixes; +using kOS.Safe.Exceptions; using kOS.Safe.Execution; using kOS.Safe.Function; using Debug = UnityEngine.Debug; @@ -55,6 +57,9 @@ public KSStructure(KeraLua.Lua state) state.PushString("__pow"); state.PushCFunction(StructurePower); state.RawSet(-3); + state.PushString("__unm"); + state.PushCFunction(StructureUnary); + state.RawSet(-3); // there is no "not equal", "greater than", "greater or equal than" because lua switches the order for these operators // and uses the operators below. In theory there shouldn't be any differences with how kerboscript does it, but watch out state.PushString("__eq"); @@ -85,6 +90,22 @@ private static int StructureOperator(IntPtr L, Func operato try { return Binding.PushLuaType(state, operatorMethod(pair), binding); } catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } } + + private static int StructureUnary(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = Binding.bindings[state.MainThread.Handle]; + var obj = Binding.ToCSharpObject(state, 1, binding); + + MethodInfo unaryMethod = obj.GetType().GetMethod("op_UnaryNegation", BindingFlags.FlattenHierarchy |BindingFlags.Static | BindingFlags.Public); + if (unaryMethod != null) + { + try { return Binding.PushLuaType(state, unaryMethod.Invoke(null, new[]{obj}), binding); } + catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + } + var ex = new KOSUnaryOperandTypeException("negate", obj); + Debug.Log(ex); return state.Error(ex.Message); + } private static int StructureToString(IntPtr L) { From eb01c2a260811548cd4db05b79698592b671c531 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 29 Sep 2024 14:11:34 +0300 Subject: [PATCH 024/108] Define "uniqueTypes" --- src/kOS/Lua/Binding.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index ff756fa249..9f67db91f8 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -14,14 +14,23 @@ using System.Text; using System.Text.RegularExpressions; using kOS.Lua.Types; +using kOS.Suffixed; using Smooth.Collections; using Debug = UnityEngine.Debug; +using TimeSpan = kOS.Suffixed.TimeSpan; namespace kOS.Lua { public static class Binding { public static readonly Dictionary bindings = new Dictionary(); + private static readonly HashSet uniqueTypes = new HashSet() + { // Types of objects that you want to create new lua instances of when pushing onto the stack, + // but that have overridden Equals and GetHashCode methods so BindingData.Objects dictionary + // picks "equal" already created object. For example "v1 = v(0,0,0); v2 = v(0,0,0); v1.x = 1; print(v2.x);" + // would print 1 because both v1 and v2 would be the same lua object, which is what we are avoiding here. + typeof(Vector), typeof(Direction), typeof(TimeSpan), typeof(TimeStamp) + }; // the CSharp object to userdata binding model was adapted from NLua model // with some simplifications and changes to make it work on Structures @@ -205,8 +214,9 @@ public static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding private static int PushObject(KeraLua.Lua state, object obj, BindingData binding, string metatable) { + var isUnique = uniqueTypes.Contains(obj.GetType()); state.GetMetaTable("userdataAddressToUserdata"); - if (binding.UserdataPtrs.TryGetValue(obj, out IntPtr userdataAddress)) // Object already in the list of object userdata? Push the userdata + if (!isUnique && binding.UserdataPtrs.TryGetValue(obj, out IntPtr userdataAddress)) // Object already in the list of object userdata? Push the userdata { // Note: starting with lua5.1 the garbage collector may remove weak reference items (such as our userdataAddressToUserdata values) when the initial GC sweep // occurs, but the actual call of the __gc finalizer for that object may not happen until a little while later. During that window we might call @@ -232,7 +242,8 @@ private static int PushObject(KeraLua.Lua state, object obj, BindingData binding state.Remove(-2); binding.Objects[userdataAddress] = obj; - binding.UserdataPtrs[obj] = userdataAddress; + if (!isUnique) + binding.UserdataPtrs[obj] = userdataAddress; return 1; } From b1517776b4e4432506265ac68821f82f21699d45 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 1 Oct 2024 23:04:35 +0300 Subject: [PATCH 025/108] Vessel control --- src/kOS/Lua/Binding.cs | 26 ++++++++++++--- src/kOS/Lua/LuaFunctions.cs | 27 ++++++++-------- src/kOS/Lua/Types/KSFunction.cs | 6 +++- src/kOS/Lua/Types/KSStructure.cs | 45 +++++++++++--------------- src/kOS/Lua/init.lua | 55 ++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 46 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 9f67db91f8..069144b145 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -31,6 +31,7 @@ public static class Binding // would print 1 because both v1 and v2 would be the same lua object, which is what we are avoiding here. typeof(Vector), typeof(Direction), typeof(TimeSpan), typeof(TimeStamp) }; + private static readonly string[] controlVariables = { "STEERING", "THROTTLE", "WHEELSTEERING", "WHEELTHROTTLE" }; // the CSharp object to userdata binding model was adapted from NLua model // with some simplifications and changes to make it work on Structures @@ -137,8 +138,8 @@ private static int EnvIndex(IntPtr L) var binding = bindings[state.MainThread.Handle]; if (binding.Variables.TryGetValue(index, out var boundVar)) { - try { return PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + return (int)LuaExceptionCatch(() => + PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding), state); } if (binding.Functions.TryGetValue(index, out var function)) { @@ -152,10 +153,12 @@ private static int EnvNewIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; var index = state.ToString(2); - if (binding.Variables.TryGetValue(index, out var boundVar) && boundVar.Set != null) + var isControlVariable = controlVariables.Contains(index.ToUpper()) && !controlVariables.Contains(index); + if (!isControlVariable && binding.Variables.TryGetValue(index, out var boundVar) && boundVar.Set != null) { - try { boundVar.Value = ToCSharpObject(state, 3, binding); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + var newValue = ToCSharpObject(state, 3, binding); + if (newValue == null) return 0; + LuaExceptionCatch(() => boundVar.Value = newValue, state); } else { @@ -247,6 +250,19 @@ private static int PushObject(KeraLua.Lua state, object obj, BindingData binding return 1; } + + public static void LuaExceptionCatch(Action tryBody, KeraLua.Lua state) => + LuaExceptionCatch(() => { tryBody(); return null; }, state); + + public static object LuaExceptionCatch(Func tryBody, KeraLua.Lua state) + { + try { return tryBody(); } + catch (Exception e) + { + Debug.Log(e); + return state.Error(e.Message); + } + } public static void DumpStack(KeraLua.Lua state, string debugName = "", BindingData binding = null) { diff --git a/src/kOS/Lua/LuaFunctions.cs b/src/kOS/Lua/LuaFunctions.cs index 307c47a490..0192e0e302 100644 --- a/src/kOS/Lua/LuaFunctions.cs +++ b/src/kOS/Lua/LuaFunctions.cs @@ -14,9 +14,12 @@ public static void Add(KeraLua.Lua state) state.SetGlobal("_print"); state.PushCFunction(KosPrint); state.SetGlobal("print"); - state.SetWarningFunction(Warning, state.MainThread.Handle); + state.GetGlobal("warn"); + state.SetGlobal("_warn"); + state.PushCFunction(Warning); + state.SetGlobal("warn"); } - + private static int KosPrint(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); @@ -27,19 +30,15 @@ private static int KosPrint(IntPtr L) Binding.bindings[state.MainThread.Handle].Shared.Screen.Print(string.Join(" ", prints)); return 0; } - - private static void Warning(IntPtr ud, IntPtr msg, int tocont) + + private static int Warning(IntPtr L) { - var shared = Binding.bindings[ud].Shared; - (shared.Interpreter as LuaInterpreter).DisplayError(Marshal.PtrToStringAnsi(msg)); + var state = KeraLua.Lua.FromIntPtr(L); + state.CheckString(1); + var shared = Binding.bindings[state.MainThread.Handle].Shared; + shared.SoundMaker.BeginFileSound("error"); + shared.Screen.Print(state.ToString(1)); + return 0; } - - // private static int SetSteering(IntPtr L) - // { - // var state = KeraLua.Lua.FromIntPtr(L); - // var binding = Binding.bindings[state.MainThread.Handle]; - // var steeringManager = kOSVesselModule.GetInstance(binding.Shared.Vessel).GetFlightControlParameter("steering"); - // return 0; - // } } } \ No newline at end of file diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index 19bf11e279..724c8b73da 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -40,7 +40,11 @@ private static int KSFunctionCall(IntPtr L) stack.Clear(); stack.PushArgument(new KOSArgMarkerType()); for (int i = 2; i <= state.GetTop(); i++) - stack.PushArgument(Binding.ToCSharpObject(state, i, binding)); + { + var arg = Binding.ToCSharpObject(state, i, binding); + if (arg == null) break; + stack.PushArgument(arg); + } if (ksFunction is SafeFunctionBase function) { diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index e65bd02acb..2b4ebe7dde 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -87,8 +87,7 @@ private static int StructureOperator(IntPtr L, Func operato var state = KeraLua.Lua.FromIntPtr(L); var binding = Binding.bindings[state.MainThread.Handle]; var pair = new OperandPair(Binding.ToCSharpObject(state, 1, binding), Binding.ToCSharpObject(state, 2, binding)); - try { return Binding.PushLuaType(state, operatorMethod(pair), binding); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + return (int)Binding.LuaExceptionCatch(() => Binding.PushLuaType(state, operatorMethod(pair), binding), state); } private static int StructureUnary(IntPtr L) @@ -96,15 +95,12 @@ private static int StructureUnary(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var binding = Binding.bindings[state.MainThread.Handle]; var obj = Binding.ToCSharpObject(state, 1, binding); - + if (obj == null) return 0; MethodInfo unaryMethod = obj.GetType().GetMethod("op_UnaryNegation", BindingFlags.FlattenHierarchy |BindingFlags.Static | BindingFlags.Public); if (unaryMethod != null) - { - try { return Binding.PushLuaType(state, unaryMethod.Invoke(null, new[]{obj}), binding); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - } - var ex = new KOSUnaryOperandTypeException("negate", obj); - Debug.Log(ex); return state.Error(ex.Message); + return (int)Binding.LuaExceptionCatch(() => Binding.PushLuaType(state, unaryMethod.Invoke(null, new[]{obj}), binding), state); + Binding.LuaExceptionCatch(() => throw new KOSUnaryOperandTypeException("negate", obj), state); + return 0; } private static int StructureToString(IntPtr L) @@ -132,8 +128,7 @@ private static int StructureIndex(IntPtr L) if (structure == null) return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); - try { return PushSuffixResult(state, binding, structure, 2); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + return (int)Binding.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, 2), state); } private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData binding, Structure structure, int index) @@ -172,23 +167,22 @@ private static int StructureNewIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var binding = Binding.bindings[state.MainThread.Handle]; - object obj = binding.Objects[state.ToUserData(1)]; + var obj = binding.Objects[state.ToUserData(1)]; var structure = obj as Structure; if (structure == null) return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); - object value = Binding.ToCSharpObject(state, 3, binding); - if (value != null) + var newValue = Binding.ToCSharpObject(state, 3, binding); + if (newValue == null) return 0; + if (structure is IIndexable && state.Type(2) == LuaType.Number) + { + var index = (int)state.ToInteger(2) - (structure is Lexicon? 0 : 1); + Binding.LuaExceptionCatch(() => + (structure as IIndexable).SetIndex(index, Structure.FromPrimitive(newValue) as Structure), state); + } + else { - if (structure is IIndexable && state.Type(2) == LuaType.Number) - { - int intIndex = (int)state.ToInteger(2); - try { (structure as IIndexable).SetIndex(intIndex, Structure.FromPrimitive(value) as Structure); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } - return 0; - } var index = state.ToString(2); - try { structure.SetSuffix(index, Structure.FromPrimitive(value)); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + Binding.LuaExceptionCatch(() => structure.SetSuffix(index, Structure.FromPrimitive(newValue)), state); } return 0; } @@ -237,9 +231,8 @@ private static int StructureNext(IntPtr L) state.PushCopy(KeraLua.Lua.UpValueIndex(2)); state.PushInteger(currentIndex); state.GetTable(-2); - - try { PushSuffixResult(state, binding, structure, -1); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + + Binding.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, -1), state); state.PushInteger(currentIndex+1); state.Copy(-1, KeraLua.Lua.UpValueIndex(1)); diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua index 32c35d782c..1d09b3778f 100644 --- a/src/kOS/Lua/init.lua +++ b/src/kOS/Lua/init.lua @@ -1,7 +1,62 @@ function onFixedUpdate(dt) + runProcessControl() runCallbacks() end +function runProcessControl() + if controlCoroutine then coroutine.resume(controlCoroutine) end + controlCoroutine = coroutine.create(processControl) + coroutine.resume(controlCoroutine) +end + +function processControl() + if rawget(_ENV, "steering") then + steeringControlled = true + local success, error = pcall(function() STEERING = type(steering) == "function" and steering() or steering end) + if not success then + warn(error) + steering = nil + end + elseif steeringControlled then + steeringControlled = false + toggleflybywire("steering", false) + end + if rawget(_ENV, "throttle") then + throttleControlled = true + local success, error = pcall(function() THROTTLE = type(throttle) == "function" and throttle() or throttle end) + if not success then + warn(error) + throttle = nil + end + elseif throttleControlled then + throttleControlled = false + toggleflybywire("throttle", false) + end + if rawget(_ENV, "wheelSteering") then + wheelSteeringControlled = true + local success, error = pcall(function() WHEELSTEERING = type(wheelSteering) == "function" and wheelSteering() or wheelSteering end) + if not success then + warn(error) + wheelSteering = nil + end + elseif wheelSteeringControlled then + wheelSteeringControlled = false + toggleflybywire("wheelSteering", false) + end + if rawget(_ENV, "wheelThrottle") then + wheelThrottleControlled = true + local success, error = pcall(function() WHEELTHROTTLE = type(wheelThrottle) == "function" and wheelThrottle() or wheelThrottle end) + if not success then + warn(error) + wheelThrottle = nil + end + elseif wheelThrottleControlled then + wheelThrottleControlled = false + toggleflybywire("wheelThrottle", false) + end + controlCoroutine = nil +end + function onBreakExecution() breakCallbacks() end From c12e195a09c04eea2925af70b54b04c546514f20 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 2 Oct 2024 00:18:14 +0300 Subject: [PATCH 026/108] Treat Structure suffixes with void return type as functions --- src/kOS/Lua/Types/KSFunction.cs | 10 +++++----- src/kOS/Lua/Types/KSStructure.cs | 8 +++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index 724c8b73da..2bd49dd042 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -10,7 +10,8 @@ namespace kOS.Lua.Types public class KSFunction : LuaTypeBase { private static readonly Type[] bindingTypes = { typeof(SafeFunctionBase), typeof(DelegateSuffixResult) }; - public override string MetatableName => "KerboscriptFunction"; + private static readonly string metatableName = "KerboscriptFunction"; + public override string MetatableName => metatableName; public override Type[] BindingTypes => bindingTypes; public KSFunction(KeraLua.Lua state) @@ -34,6 +35,7 @@ private static int KSFunctionCall(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var binding = Binding.bindings[state.MainThread.Handle]; + state.CheckUserData(1, metatableName); var ksFunction = binding.Objects[state.ToUserData(1)]; var stack = (binding.Shared.Cpu as LuaCPU).Stack; @@ -48,14 +50,12 @@ private static int KSFunctionCall(IntPtr L) if (ksFunction is SafeFunctionBase function) { - try { function.Execute(binding.Shared); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + Binding.LuaExceptionCatch(() => function.Execute(binding.Shared), state); return Binding.PushLuaType(state, Structure.ToPrimitive(function.ReturnValue), binding); } if (ksFunction is DelegateSuffixResult delegateResult) { - try { delegateResult.Invoke(binding.Shared.Cpu); } - catch (Exception e) { Debug.Log(e); return state.Error(e.Message); } + Binding.LuaExceptionCatch(() => delegateResult.Invoke(binding.Shared.Cpu), state); return Binding.PushLuaType(state, Structure.ToPrimitive(delegateResult.Value), binding); } return state.Error(string.Format("attempt to call a non function {0} value", ksFunction.GetType().Name)); diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index 2b4ebe7dde..6f62434f97 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -148,13 +148,11 @@ private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData bindi { pushValue = Structure.ToPrimitive(result.Value); } - else if (result is DelegateSuffixResult delegateResult && delegateResult.RawDelInfo.Parameters.Length == 0) + else if (result is DelegateSuffixResult delegateResult && delegateResult.RawDelInfo.ReturnType != typeof(void) + && delegateResult.RawDelInfo.Parameters.Length == 0) { var callResult = delegateResult.RawCall(null); - if (delegateResult.RawDelInfo.ReturnType == typeof(void)) - delegateResult.RawSetValue(ScalarValue.Create(0)); // this is what kerboscript does - else - delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(callResult)); + delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(callResult)); pushValue = Structure.ToPrimitive(delegateResult.Value); } else { From 19bb07a6735a565f6a5d2945d573451b1f5da4e4 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 3 Oct 2024 00:13:35 +0300 Subject: [PATCH 027/108] Add stage, wait, loadfile, dofile, getchar functions. Rename the stage structure getter from "stage" to "stageInfo" to avoid having the same name for the structure and the function. Make loadfile and dofile use the kOS file system. Replace terminal.input.getchar with a function that works for lua. It's a special case because the previous function modified the kerboscript stack after it returned. --- src/kOS/Lua/Binding.cs | 24 +++++++ src/kOS/Lua/LuaFunctions.cs | 103 ++++++++++++++++++++++++++++--- src/kOS/Lua/Types/KSStructure.cs | 66 +++++++------------- 3 files changed, 141 insertions(+), 52 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 069144b145..809e7217e4 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -57,9 +57,28 @@ public BindingData(KeraLua.Lua state, SharedObjects shared, Dictionary> variableRenames = new List>() + { + new KeyValuePair("stage", "stageInfo") + }; + + public static void Apply(BindingManager bindingManager, FunctionManager functionManager) + { + foreach (var rename in variableRenames) + { + if (!bindingManager.RawVariables.TryGetValue(rename.Key, out var variable)) continue; + bindingManager.RawVariables.Add(rename.Value, variable); + bindingManager.RawVariables.Remove(rename.Key); + } + } + } + public static void BindToState(KeraLua.Lua state, SharedObjects shared) { state = state.MainThread; + BindingChanges.Apply(shared.BindingMgr as BindingManager, shared.FunctionManager as FunctionManager); bindings[state.Handle] = new BindingData( state, shared, @@ -214,6 +233,11 @@ public static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding } return 1; } + public static int PushLuaType(KeraLua.Lua state, LuaFunction function, BindingData binding) + { + state.PushCFunction(function); + return 1; + } private static int PushObject(KeraLua.Lua state, object obj, BindingData binding, string metatable) { diff --git a/src/kOS/Lua/LuaFunctions.cs b/src/kOS/Lua/LuaFunctions.cs index 0192e0e302..243811200b 100644 --- a/src/kOS/Lua/LuaFunctions.cs +++ b/src/kOS/Lua/LuaFunctions.cs @@ -2,6 +2,8 @@ using kOS.Module; using System; using System.Runtime.InteropServices; +using kOS.Safe.Execution; +using kOS.Safe.Persistence; using Debug = UnityEngine.Debug; namespace kOS.Lua @@ -10,14 +12,25 @@ public static class LuaFunctions { public static void Add(KeraLua.Lua state) { - state.GetGlobal("print"); - state.SetGlobal("_print"); - state.PushCFunction(KosPrint); - state.SetGlobal("print"); - state.GetGlobal("warn"); - state.SetGlobal("_warn"); - state.PushCFunction(Warning); - state.SetGlobal("warn"); + AddFunction(state, "print", KosPrint); + AddFunction(state, "warn", Warn); + AddFunction(state, "wait", Wait); + AddFunction(state, "loadfile", LoadFile); + AddFunction(state, "dofile", DoFile); + AddFunction(state, "getchar", GetChar); + } + + private static void AddFunction(KeraLua.Lua state, string name, LuaFunction function, bool saveOverwrittenValue = true) + { + if (saveOverwrittenValue) + { + if (state.GetGlobal(name) != LuaType.Nil) + state.SetGlobal("_" + name); + else + state.Pop(1); + } + state.PushCFunction(function); + state.SetGlobal(name); } private static int KosPrint(IntPtr L) @@ -31,7 +44,7 @@ private static int KosPrint(IntPtr L) return 0; } - private static int Warning(IntPtr L) + private static int Warn(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); state.CheckString(1); @@ -40,5 +53,77 @@ private static int Warning(IntPtr L) shared.Screen.Print(state.ToString(1)); return 0; } + + private static int Wait(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.CheckNumber(1); + var shared = Binding.bindings[state.MainThread.Handle].Shared; + shared.Cpu.YieldProgram(new YieldFinishedGameTimer(state.ToNumber(1))); + return 0; + } + + private static int LoadFile(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.CheckString(1); + var filePath = state.ToString(1); + var mode = state.OptString(2, "bt"); + var shared = Binding.bindings[state.MainThread.Handle].Shared; + var file = shared.VolumeMgr.CurrentVolume.Open(filePath) as VolumeFile; + if (file == null) + { + state.PushNil(); + state.PushString($"File '{filePath}' not found"); + return 2; + } + if (state.LoadBuffer(state.Encoding.GetBytes(file.ReadAll().String), file.Path.ToString(), mode) != LuaStatus.OK) + { + state.PushNil(); + state.PushCopy(-2); + return 2; + } + if (state.GetTop() >= 4) + { // if there was a third argument set it as the _ENV value for the loaded function + state.PushCopy(3); + if (state.SetUpValue(-2, 1) == null) + state.Pop(1); + } + return 1; + } + + private static int DoFile(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var argCount = state.GetTop(); + LoadFile(L); + if (state.IsString(-1)) + return state.Error(state.ToString(-1)); + state.CallK(0, -1, argCount, DoFileContinuation); + return DoFileContinuation(L, (int)LuaStatus.OK, (IntPtr)argCount); + } + + private static int DoFileContinuation(IntPtr L, int status, IntPtr ctx) + { + var state = KeraLua.Lua.FromIntPtr(L); + var argCount = (int)ctx; + return state.GetTop()-argCount; + } + + public static int GetChar(IntPtr L) + { + return GetCharContinuation(L, 0, IntPtr.Zero); + } + + private static int GetCharContinuation(IntPtr L, int status, IntPtr ctx) + { + var state = KeraLua.Lua.FromIntPtr(L); + var shared = Binding.bindings[state.MainThread.Handle].Shared; + var q = shared.Screen.CharInputQueue; + if (q.Count == 0) + state.YieldK(0, 0, GetCharContinuation); + state.PushString(q.Dequeue().ToString()); + return 1; + } } } \ No newline at end of file diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index 6f62434f97..1db10225b5 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -27,49 +27,26 @@ public KSStructure(KeraLua.Lua state) state.PushString("__type"); state.PushString(MetatableName); state.RawSet(-3); - state.PushString("__index"); - state.PushCFunction(StructureIndex); - state.RawSet(-3); - state.PushString("__newindex"); - state.PushCFunction(StructureNewIndex); - state.RawSet(-3); - state.PushString("__pairs"); - state.PushCFunction(StructurePairs); - state.RawSet(-3); - state.PushString("__gc"); - state.PushCFunction(Binding.CollectObject); - state.RawSet(-3); - state.PushString("__tostring"); - state.PushCFunction(StructureToString); - state.RawSet(-3); - state.PushString("__add"); - state.PushCFunction(StructureAdd); - state.RawSet(-3); - state.PushString("__sub"); - state.PushCFunction(StructureSubtract); - state.RawSet(-3); - state.PushString("__mul"); - state.PushCFunction(StructureMultiply); - state.RawSet(-3); - state.PushString("__div"); - state.PushCFunction(StructureDivide); - state.RawSet(-3); - state.PushString("__pow"); - state.PushCFunction(StructurePower); - state.RawSet(-3); - state.PushString("__unm"); - state.PushCFunction(StructureUnary); - state.RawSet(-3); - // there is no "not equal", "greater than", "greater or equal than" because lua switches the order for these operators - // and uses the operators below. In theory there shouldn't be any differences with how kerboscript does it, but watch out - state.PushString("__eq"); - state.PushCFunction(StructureEqual); - state.RawSet(-3); - state.PushString("__lt"); - state.PushCFunction(StructureLessThan); - state.RawSet(-3); - state.PushString("__le"); - state.PushCFunction(StructureLessEqualThan); + AddMetaMethod(state, "__index", StructureIndex); + AddMetaMethod(state, "__newindex", StructureNewIndex); + AddMetaMethod(state, "__pairs", StructurePairs); + AddMetaMethod(state, "__gc", Binding.CollectObject); + AddMetaMethod(state, "__tostring", StructureToString); + AddMetaMethod(state, "__add", StructureAdd); + AddMetaMethod(state, "__sub", StructureSubtract); + AddMetaMethod(state, "__mul", StructureMultiply); + AddMetaMethod(state, "__div", StructureDivide); + AddMetaMethod(state, "__pow", StructurePower); + AddMetaMethod(state, "__unm", StructureUnary); + AddMetaMethod(state, "__eq", StructureEqual); + AddMetaMethod(state, "__lt", StructureLessThan); + AddMetaMethod(state, "__le", StructureLessEqualThan); + } + + private static void AddMetaMethod(KeraLua.Lua state, string name, LuaFunction metaMethod) + { + state.PushString(name); + state.PushCFunction(metaMethod); state.RawSet(-3); } @@ -140,6 +117,9 @@ private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData bindi return Binding.PushLuaType(state, pushValue, binding); } + if (structure is TerminalInput && state.ToString(index)?.ToLower() == "getchar") + return Binding.PushLuaType(state, LuaFunctions.GetChar, binding); + var result = structure.GetSuffix(state.ToString(index), true); if (result == null) return Binding.PushLuaType(state, null, binding); From efdbd6e8f874d02be64d6101701785eb9ba50024 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 3 Oct 2024 00:23:09 +0300 Subject: [PATCH 028/108] Remove unused InterpreterLanguage property on IProcessor --- src/kOS.Safe.Test/Execution/Noop.cs | 8 -------- src/kOS.Safe/Module/IProcessor.cs | 2 -- src/kOS/Module/kOSProcessor.cs | 2 -- 3 files changed, 12 deletions(-) diff --git a/src/kOS.Safe.Test/Execution/Noop.cs b/src/kOS.Safe.Test/Execution/Noop.cs index c75b859392..b2ff6e8291 100644 --- a/src/kOS.Safe.Test/Execution/Noop.cs +++ b/src/kOS.Safe.Test/Execution/Noop.cs @@ -73,14 +73,6 @@ public int KOSCoreId } } - public string InterpreterLanguage - { - get - { - return String.Empty; - } - } - public string Tag { get diff --git a/src/kOS.Safe/Module/IProcessor.cs b/src/kOS.Safe/Module/IProcessor.cs index 88be5bb455..58c9cff157 100644 --- a/src/kOS.Safe/Module/IProcessor.cs +++ b/src/kOS.Safe/Module/IProcessor.cs @@ -13,8 +13,6 @@ public interface IProcessor bool CheckCanBoot(); string Tag { get; } - - string InterpreterLanguage { get; } /// Can be used as a unique ID of which processor this is, but unlike Guid, /// it doesn't remain unique across runs so you shouldn't use it for serialization. diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 711e7ee36d..ee2b32508b 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -87,8 +87,6 @@ public string Tag private const string BootDirectoryName = "boot"; - public string InterpreterLanguage => interpreterLanguage; - [KSPField(isPersistant = true, guiActive = true, guiActiveEditor = true, guiName = "Interpreter", groupName = PAWGroup, groupDisplayName = PAWGroup), UI_ChooseOption(scene = UI_Scene.All)] public string interpreterLanguage = "kerboscript"; From bee435067ed597bed6ae66e914f36e29ba77e52f Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 7 Oct 2024 20:33:46 +0300 Subject: [PATCH 029/108] Rename HEADING to SHIPHEADING for lua so it doesn't hide the heading() function --- src/kOS/Lua/Binding.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 809e7217e4..9fd96cdd8e 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -61,7 +61,8 @@ private static class BindingChanges { private static readonly List> variableRenames = new List>() { - new KeyValuePair("stage", "stageInfo") + new KeyValuePair("STAGE", "STAGEINFO"), + new KeyValuePair("HEADING", "SHIPHEADING") }; public static void Apply(BindingManager bindingManager, FunctionManager functionManager) From ba0296fd72478985217603a760231bb96299fc17 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 8 Oct 2024 08:49:07 +0300 Subject: [PATCH 030/108] Add runfileon, runcommandon functions "runfileon" function. Takes two arguments 1) path (works like path in "run") 2) processorId (works like processorId in "processor" function) Reboots the selected processor with the selected file as bootfile, resets the bootfile after booting. Automatically selects interpreter based on file extension "runcommandon" function. Takes two arguments 1) command string 2) processorId (works like processorId in "processor" function) Calls ProcessCommand(command) on the current interpreter of the selected processor --- src/kOS.Safe/Function/FunctionManager.cs | 2 +- src/kOS.Safe/Function/SafeFunctionBase.cs | 10 +-- src/kOS/Function/Misc.cs | 86 +++++++++++++++++++++++ src/kOS/Lua/Binding.cs | 5 -- src/kOS/Lua/Types/KSStructure.cs | 7 +- src/kOS/Module/kOSProcessor.cs | 46 +++++++++++- 6 files changed, 142 insertions(+), 14 deletions(-) diff --git a/src/kOS.Safe/Function/FunctionManager.cs b/src/kOS.Safe/Function/FunctionManager.cs index a7a88c46a2..9c178acb3a 100644 --- a/src/kOS.Safe/Function/FunctionManager.cs +++ b/src/kOS.Safe/Function/FunctionManager.cs @@ -35,7 +35,7 @@ public void Load() if (functionName != string.Empty) { var function = (SafeFunctionBase)functionObject; - function.functionName = longestName; + function.FunctionName = longestName; functions.Add(functionName, function); } } diff --git a/src/kOS.Safe/Function/SafeFunctionBase.cs b/src/kOS.Safe/Function/SafeFunctionBase.cs index 287e80ed75..39a407cddd 100644 --- a/src/kOS.Safe/Function/SafeFunctionBase.cs +++ b/src/kOS.Safe/Function/SafeFunctionBase.cs @@ -8,7 +8,7 @@ namespace kOS.Safe.Function { public abstract class SafeFunctionBase { - public string functionName; + public string FunctionName; /// /// ALL FUNCTIONS in kOS will always have exactly one return value. We have no @@ -109,7 +109,7 @@ protected void AssertArgBottomAndConsume(SafeSharedObjects shared) if (shouldBeBottom != null && shouldBeBottom.GetType() == OpcodeCall.ArgMarkerType) return; // Assert passed. - throw new KOSArgumentMismatchException("Too many arguments were passed to " + functionName); + throw new KOSArgumentMismatchException("Too many arguments were passed to " + FunctionName); } /// @@ -147,7 +147,7 @@ protected object PopValueAssert(SafeSharedObjects shared, bool barewordOkay = fa { object returnValue = shared.Cpu.PopValueArgument(barewordOkay); if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) - throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); + throw new KOSArgumentMismatchException("Too few arguments were passed to " + FunctionName); return returnValue; } @@ -161,7 +161,7 @@ protected object PopStackAssert(SafeSharedObjects shared) { object returnValue = shared.Cpu.PopArgumentStack(); if (returnValue != null && returnValue.GetType() == OpcodeCall.ArgMarkerType) - throw new KOSArgumentMismatchException("Too few arguments were passed to " + functionName); + throw new KOSArgumentMismatchException("Too few arguments were passed to " + FunctionName); return returnValue; } @@ -176,6 +176,6 @@ protected Structure PopStructureAssertEncapsulated(SafeSharedObjects shared, boo return Structure.FromPrimitiveWithAssert(returnValue); } - protected string GetFuncName() => functionName; + protected string GetFuncName() => FunctionName; } } \ No newline at end of file diff --git a/src/kOS/Function/Misc.cs b/src/kOS/Function/Misc.cs index eb32c6619f..392ca1a5e1 100644 --- a/src/kOS/Function/Misc.cs +++ b/src/kOS/Function/Misc.cs @@ -168,4 +168,90 @@ public override void Execute(SharedObjects shared) ReturnValue = PartModuleFieldsFactory.Construct(processor, shared); } } + + [Function("runfileon")] + public class RunFileOn : FunctionBase + { + public override void Execute(SharedObjects shared) + { + var processorTagOrVolume = PopValueAssert(shared); + var pathObject = PopValueAssert(shared); + + AssertArgBottomAndConsume(shared); + + GlobalPath path = shared.VolumeMgr.GlobalPathFromObject(pathObject); + Volume volume = shared.VolumeMgr.GetVolumeFromPath(path); + VolumeFile volumeFile = volume.Open(path) as VolumeFile; + FileContent content = volumeFile != null ? volumeFile.ReadAll() : null; + + if (content == null) throw new Exception(string.Format("File '{0}' not found", path)); + + kOSProcessor processor; + + if (processorTagOrVolume is Volume) + { + processor = shared.ProcessorMgr.GetProcessor(processorTagOrVolume as Volume); + } + else if (processorTagOrVolume is string || processorTagOrVolume is StringValue) + { + processor = shared.ProcessorMgr.GetProcessor(processorTagOrVolume.ToString()); + } + else + { + throw new KOSInvalidArgumentException(FunctionName, "processorId", "String or Volume expected"); + } + + if (processor == null) + { + throw new KOSInvalidArgumentException(FunctionName, "processorId", "Processor with that volume or name was not found"); + } + + processor.RunBootFile(volumeFile); + } + } + + [Function("runcommandon")] + public class RunCommandOn : FunctionBase + { + public override void Execute(SharedObjects shared) + { + var processorTagOrVolume = PopValueAssert(shared); + var command = Structure.ToPrimitive(PopValueAssert(shared)) as string; + + AssertArgBottomAndConsume(shared); + + if (command == null) + { + throw new KOSInvalidArgumentException(FunctionName, "command", "String expected"); + } + + kOSProcessor processor; + + if (processorTagOrVolume is Volume) + { + processor = shared.ProcessorMgr.GetProcessor(processorTagOrVolume as Volume); + } + else if (processorTagOrVolume is string || processorTagOrVolume is StringValue) + { + processor = shared.ProcessorMgr.GetProcessor(processorTagOrVolume.ToString()); + } + else + { + throw new KOSInvalidArgumentException(FunctionName, "processorId", "String or Volume expected"); + } + + if (processor == null) + { + throw new KOSInvalidArgumentException(FunctionName, "processorId", + "Processor with that volume or name was not found"); + } + if (processor.KOSCoreId == shared.Processor.KOSCoreId) + { + throw new KOSInvalidArgumentException(FunctionName, "processorId", + "Processor cannot be the current processor"); + } + + processor.RunCommand(command); + } + } } diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 9fd96cdd8e..25d572df5d 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -234,11 +234,6 @@ public static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding } return 1; } - public static int PushLuaType(KeraLua.Lua state, LuaFunction function, BindingData binding) - { - state.PushCFunction(function); - return 1; - } private static int PushObject(KeraLua.Lua state, object obj, BindingData binding, string metatable) { diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index 1db10225b5..f19092325d 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -116,9 +116,12 @@ private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData bindi pushValue = Structure.ToPrimitive(indexable.GetIndex((int)state.ToInteger(index)-(structure is Lexicon? 0 : 1), true)); return Binding.PushLuaType(state, pushValue, binding); } - + if (structure is TerminalInput && state.ToString(index)?.ToLower() == "getchar") - return Binding.PushLuaType(state, LuaFunctions.GetChar, binding); + { + state.PushCFunction(LuaFunctions.GetChar); + return 1; + } var result = structure.GetSuffix(state.ToString(index), true); if (result == null) diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index ee2b32508b..014fc9b005 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -950,6 +950,18 @@ public void FixedUpdate() // run boot methods shared.Cpu.Boot(); shared.Interpreter.Boot(); + + // if booted by calling RunBootFile reset bootFile to its previous value + if (beforeRunLuaBootFile != null) + { + luaBootFile = beforeRunLuaBootFile; + beforeRunLuaBootFile = null; + } + if (beforeRunBootFile != null) + { + bootFile = beforeRunBootFile; + beforeRunBootFile = null; + } HasBooted = true; } @@ -1251,7 +1263,39 @@ private void ProcessorModeChanged() } - // TODO: this never gets called? We can use it to run programs on other kosprocessors. Perhaps even ones that are using different interpreters + private string beforeRunLuaBootFile; + private string beforeRunBootFile; + + public void RunBootFile(VolumeFile file) + { + if (KSInterpreter.FilenameExtensions.Contains(file.Extension)) + { + interpreterLanguage = "kerboscript"; + } + else if (LuaInterpreter.FilenameExtensions.Contains(file.Extension)) + { + interpreterLanguage = "lua"; + } + + if (interpreterLanguage == "kerboscript") + { + beforeRunBootFile = bootFile; + bootFile = file.Path.ToString(); + } + else if (interpreterLanguage == "lua") + { + beforeRunLuaBootFile = luaBootFile; + luaBootFile = file.Path.ToString(); + } + SetMode(ProcessorModes.OFF); + SetMode(ProcessorModes.READY); + } + + public void RunCommand(string command) + { + shared.Interpreter.ProcessCommand(command); + } + public void ExecuteInterProcCommand(InterProcCommand command) { if (command != null) From 9408ac44f3bb9715a1aa200264217cc12530de90 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 8 Oct 2024 16:42:12 +0300 Subject: [PATCH 031/108] Simpler callback system, break ship control on ctrl+C --- src/kOS/Lua/LuaInterpreter.cs | 4 +- src/kOS/Lua/init.lua | 117 +++++++++++----------------------- 2 files changed, 40 insertions(+), 81 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index d5de519ec8..182c108212 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -205,7 +205,9 @@ public void KOSFixedUpdate(double dt) var status = callbacksCoroutine.Resume(state.State, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) { - DisplayError(callbacksCoroutine.ToString(-1)); + DisplayError(callbacksCoroutine.ToString(-1) + +"\nonFixedUpdate function errored and was set to nil." + +"\nTo reset onFixedUpdate do 'onFixedUpdate = _onFixedUpdate'."); callbacksCoroutine.PushNil(); callbacksCoroutine.SetGlobal("onFixedUpdate"); } diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua index 1d09b3778f..5c7ae78232 100644 --- a/src/kOS/Lua/init.lua +++ b/src/kOS/Lua/init.lua @@ -1,7 +1,19 @@ -function onFixedUpdate(dt) +function _onFixedUpdate() runProcessControl() runCallbacks() end +onFixedUpdate = _onFixedUpdate + +function _onBreakExecution() + breakControl() + breakCallbacks() +end +onBreakExecution = _onBreakExecution + +function breakControl() + steering, throttle, wheelSteering, wheelThrottle = nil, nil, nil, nil + steeringControlled, throttleControlled, wheelSteeringControlled, wheelThrottleControlled = nil, nil, nil, nil +end function runProcessControl() if controlCoroutine then coroutine.resume(controlCoroutine) end @@ -57,15 +69,8 @@ function processControl() controlCoroutine = nil end -function onBreakExecution() - breakCallbacks() -end - function breakCallbacks() - callbacksList = {} - callbacksAddQueueLock = nil - callbacksAddQueueRoot = nil - callbacksAddQueueTail = nil + callbacks = {} callbacksContinuation = nil callbacksUnsorted = nil end @@ -75,100 +80,52 @@ function runCallbacks() if callbacksContinuation then coroutine.resume(callbacksContinuation) end - if callbacksAddQueueRoot and not callbacksAddQueueLock then + if callbacksUnsorted then callbacksContinuation = coroutine.create(function() - callbacksList.next, callbacksAddQueueTail.next = - callbacksAddQueueRoot, callbacksList.next - callbacksAddQueueRoot = nil - sortCallbacks() + table.sort(callbacks, function(a, b) return a.priority < b.priority end) + callbacksUnsorted = false + callbacksContinuation = nil end) coroutine.resume(callbacksContinuation) end - if callbacksUnsorted then - callbacksContinuation = coroutine.create(sortCallbacks) - coroutine.resume(callbacksContinuation) - end - local callback = callbacksList.next - local previousCallback = callbacksList - while callback do + for i=#callbacks,1,-1 do + local callback = callbacks[i] if callback.coroutine then coroutine.resume(callback.coroutine, callback) - previousCallback = callback else if callback.body then callback.coroutine = coroutine.create(callback.body) coroutine.resume(callback.coroutine, callback) - previousCallback = callback else - previousCallback.next = callback.next + table.remove(callbacks, i) end end - callback = callback.next end end -function callbacksSplit(head) - local fast, slow = head, head - while fast and fast.next do - fast = fast.next.next - if fast then slow = slow.next end - end - local second = slow.next - slow.next = nil - return second -end -function callbacksMerge(first, second) - if not first then return second end - if not second then return first end - if first.priority > second.priority then - first.next = callbacksMerge(first.next, second) - return first - else - second.next = callbacksMerge(first, second.next) - return second - end -end -function callbacksMergeSort(head) - if not head or not head.next then return head end - local second = callbacksSplit(head) - head = callbacksMergeSort(head) - second = callbacksMergeSort(second) - return callbacksMerge(head, second) -end -function sortCallbacks() - callbacksList.next = callbacksMergeSort(callbacksList.next) - callbacksUnsorted = false - callbacksContinuation = nil -end - function addCallback(body, priority) - local function callbackBody(callback) - local success, newPriority = pcall(body, callback) - if not(newPriority == true or newPriority == callback.priority) then - if success then - callback.priority = tonumber(newPriority) - if callback.priority then - callbacksUnsorted = true + local callback = { + body = function(callback) + local success, newPriority = pcall(body, callback) + if not(newPriority == true or newPriority == callback.priority) then + if success then + callback.priority = tonumber(newPriority) + if callback.priority then + callbacksUnsorted = true + else + callback.body = nil + end else + warn(newPriority) callback.body = nil end - else - warn(newPriority) - callback.body = nil end - end - callback.coroutine = nil - end - callbacksAddQueueLock = true - callbacksAddQueueRoot = { - next = callbacksAddQueueRoot, - body = callbackBody, + callback.coroutine = nil + end, priority = priority or 0 } - if not callbacksAddQueueRoot.next then - callbacksAddQueueTail = callbacksAddQueueRoot - end - callbacksAddQueueLock = false + table.insert(callbacks, callback) + callbacksUnsorted = true end function when(condition, body, priority) From e9dfb5e1a3946cbfdc9bf63e3409e88bd4e9af18 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 9 Oct 2024 10:04:08 +0300 Subject: [PATCH 032/108] Add length metamethod for Structures --- src/kOS/Lua/Types/KSStructure.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index f19092325d..64f042f0a4 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -31,6 +31,7 @@ public KSStructure(KeraLua.Lua state) AddMetaMethod(state, "__newindex", StructureNewIndex); AddMetaMethod(state, "__pairs", StructurePairs); AddMetaMethod(state, "__gc", Binding.CollectObject); + AddMetaMethod(state, "__len", StructureLength); AddMetaMethod(state, "__tostring", StructureToString); AddMetaMethod(state, "__add", StructureAdd); AddMetaMethod(state, "__sub", StructureSubtract); @@ -80,6 +81,17 @@ private static int StructureUnary(IntPtr L) return 0; } + private static int StructureLength(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var binding = Binding.bindings[state.MainThread.Handle]; + var structure = binding.Objects[state.ToUserData(1)] as Structure; + if (!structure.HasSuffix("LENGTH")) + return state.Error("attempt to get length of a Structure with no length suffix"); + state.PushString("LENGTH"); + return (int)Binding.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, -1), state); + } + private static int StructureToString(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); From 2022bb39dcdeb626345682d3bd5190bda420722a Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 9 Oct 2024 10:40:56 +0300 Subject: [PATCH 033/108] Support queuing multiple lua commands without overwriting the previous one Normally terminal wouldn't let you send a new command until the previous one is executed. This is used with RemoteTech connectivity manager and when calling runcommandon multiple times --- src/kOS/Function/Misc.cs | 5 ---- src/kOS/Lua/LuaInterpreter.cs | 53 +++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/src/kOS/Function/Misc.cs b/src/kOS/Function/Misc.cs index 392ca1a5e1..422e697544 100644 --- a/src/kOS/Function/Misc.cs +++ b/src/kOS/Function/Misc.cs @@ -245,11 +245,6 @@ public override void Execute(SharedObjects shared) throw new KOSInvalidArgumentException(FunctionName, "processorId", "Processor with that volume or name was not found"); } - if (processor.KOSCoreId == shared.Processor.KOSCoreId) - { - throw new KOSInvalidArgumentException(FunctionName, "processorId", - "Processor cannot be the current processor"); - } processor.RunCommand(command); } diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 182c108212..d1ea190d2b 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -25,13 +25,24 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver private NLua.Lua state; private KeraLua.Lua commandCoroutine; private KeraLua.Lua callbacksCoroutine; - private bool commandPending = false; + private readonly Queue commandsQueue = new Queue(); private static readonly Dictionary stateInfo = new Dictionary(); private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; public const string LuaVersion = "5.4"; public static readonly string[] FilenameExtensions = new string[] { "lua" }; public string Name => "lua"; private SharedObjects Shared { get; } + + private class CommandInfo + { + public string Command; + public string ChunkName; + public CommandInfo(string command, string chunkName) + { + Command = command; + ChunkName = chunkName; + } + } private class ExecInfo { @@ -123,15 +134,19 @@ private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) private void ProcessCommand(string commandText, string commandName) { - if ((LuaStatus)commandCoroutine.ResetThread() != LuaStatus.OK || commandCoroutine.LoadString(commandText, commandName) != LuaStatus.OK) + commandsQueue.Enqueue(new CommandInfo(commandText, commandName)); + } + + private bool LoadCommand(CommandInfo commandInfo) + { + if ((LuaStatus)commandCoroutine.ResetThread() != LuaStatus.OK || commandCoroutine.LoadString(commandInfo.Command, commandInfo.ChunkName) != LuaStatus.OK) { var err = commandCoroutine.ToString(-1); commandCoroutine.Pop(1); DisplayError(err); - } else - { - commandPending = true; + return false; } + return true; } public bool IsCommandComplete(string commandText) @@ -177,9 +192,7 @@ public void KOSFixedUpdate(double dt) if (execInfo.BreakExecution) { // true after BreakExecution was called, reset thread to prevent execution of the same program execInfo.BreakExecution = false; - // sometimes Terminal sends an empty string to ProcessCommand() after you ctrl+c during execution. - // This ignores commands that are sent in the same tick that StopExecution() was called - commandPending = false; + commandsQueue.Clear(); commandCoroutine.ResetThread(); callbacksCoroutine.ResetThread(); if (callbacksCoroutine.GetGlobal("onBreakExecution") == LuaType.Function) @@ -215,16 +228,25 @@ public void KOSFixedUpdate(double dt) } if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate) return; + if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate || (Shared.Cpu as LuaCPU).IsYielding()) return; + - // resumes the coroutine after it yielded due to running out of instructions or after ProcessCommand loaded a new command - if (!(Shared.Cpu as LuaCPU).IsYielding() && (commandCoroutine.Status == LuaStatus.Yield || commandPending)) + // resumes the coroutine after it yielded due to running out of instructions + // and/or executes queued commands until they run out or the coroutine yields + while (commandCoroutine.Status == LuaStatus.Yield || commandsQueue.Count > 0) { - commandPending = false; - LuaStatus status = commandCoroutine.Resume(state.State, 0); - if (status != LuaStatus.OK && status != LuaStatus.Yield) + if (commandCoroutine.Status == LuaStatus.Yield || LoadCommand(commandsQueue.Dequeue())) { - commandCoroutine.ResetThread(); - DisplayError(commandCoroutine.ToString(-1)); + var status = commandCoroutine.Resume(state.State, 0); + if (status == LuaStatus.Yield) + { + return; + } + if (status != LuaStatus.OK) + { + DisplayError(commandCoroutine.ToString(-1)); + commandCoroutine.ResetThread(); + } } } } @@ -234,6 +256,7 @@ public void Dispose() if (state == null) return; Shared.UpdateHandler.RemoveFixedObserver(this); stateInfo.Remove(state.State.MainThread.Handle); + commandsQueue.Clear(); Binding.bindings.Remove(state.State.MainThread.Handle); state.Dispose(); state = null; From e4503bab6bd564f32cf838773c851422d23a6122 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 9 Oct 2024 11:13:01 +0300 Subject: [PATCH 034/108] Set onFixedUpdate to nil if it's locking up the core and Ctrl+C was pressed 3 times Possible case where the user sets onFixedUpdate to a function that uses all the instructions --- src/kOS/Lua/LuaInterpreter.cs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index d1ea190d2b..6ab024fb9e 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -49,6 +49,7 @@ private class ExecInfo public int InstructionsThisUpdate = 0; public int InstructionsDebt = 0; public bool BreakExecution = false; + public int BreakExecutionCount = 0; public readonly KeraLua.Lua CommandCoroutine; public readonly KeraLua.Lua CallbacksCoroutine; public readonly SharedObjects Shared; @@ -169,7 +170,9 @@ public bool IsWaitingForCommand() public void BreakExecution() { - stateInfo[state.State.MainThread.Handle].BreakExecution = true; + var execInfo = stateInfo[state.State.MainThread.Handle]; + execInfo.BreakExecution = true; + execInfo.BreakExecutionCount++; } public int InstructionsThisUpdate() @@ -213,7 +216,16 @@ public void KOSFixedUpdate(double dt) callbacksCoroutine.ResetThread(); if (callbacksCoroutine.GetGlobal("onFixedUpdate") == LuaType.Function) { - if (callbacksCoroutine.LoadString("onFixedUpdate()", "callback") == LuaStatus.OK) + if (execInfo.BreakExecutionCount >= 3) + { + Shared.SoundMaker.BeginFileSound("beep"); + Shared.Screen.Print("Ctrl+C was pressed 3 times while onFixedUpdate was executing and "+ + "onFixedUpdate was set to nil. To reset onFixedUpdate do 'onFixedUpdate = _onFixedUpdate'."); + callbacksCoroutine.PushNil(); + callbacksCoroutine.SetGlobal("onFixedUpdate"); + execInfo.BreakExecutionCount = 0; + } + else if (callbacksCoroutine.LoadString("onFixedUpdate()", "callback") == LuaStatus.OK) { var status = callbacksCoroutine.Resume(state.State, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) @@ -227,7 +239,9 @@ public void KOSFixedUpdate(double dt) } } - if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate) return; + if (execInfo.InstructionsThisUpdate < instructionsPerUpdate) + execInfo.BreakExecutionCount = 0; + if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate || (Shared.Cpu as LuaCPU).IsYielding()) return; From a4199910ba70f65899dd6dad60f2a1f75ea1ed77 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 9 Oct 2024 16:29:23 +0300 Subject: [PATCH 035/108] Error traceback --- src/kOS/Lua/LuaInterpreter.cs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 6ab024fb9e..ae5846cc1f 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -98,7 +98,6 @@ public void Boot() // the volume cannot yet have been changed from that set based on // Config.StartOnArchive, and Processor.CheckCanBoot() has already // handled the range check for the archive. - Volume sourceVolume = Shared.VolumeMgr.CurrentVolume; var file = Shared.VolumeMgr.CurrentVolume.Open(path) as VolumeFile; if (file == null) { @@ -106,13 +105,7 @@ public void Boot() } else { - var content = file.ReadAll(); - if (content == null) - { - DisplayError(string.Format("File '{0}' not found", path)); - return; - } - ProcessCommand(content.String, "boot"); + ProcessCommand($"dofile(\"{file.Path}\")", "boot"); } } } @@ -204,7 +197,7 @@ public void KOSFixedUpdate(double dt) { var status = callbacksCoroutine.Resume(state.State, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) - DisplayError(callbacksCoroutine.ToString(-1)); + DisplayError(callbacksCoroutine.ToString(-1), callbacksCoroutine); } } } @@ -232,7 +225,7 @@ public void KOSFixedUpdate(double dt) { DisplayError(callbacksCoroutine.ToString(-1) +"\nonFixedUpdate function errored and was set to nil." - +"\nTo reset onFixedUpdate do 'onFixedUpdate = _onFixedUpdate'."); + +"\nTo reset onFixedUpdate do 'onFixedUpdate = _onFixedUpdate'.", callbacksCoroutine); callbacksCoroutine.PushNil(); callbacksCoroutine.SetGlobal("onFixedUpdate"); } @@ -258,7 +251,7 @@ public void KOSFixedUpdate(double dt) } if (status != LuaStatus.OK) { - DisplayError(commandCoroutine.ToString(-1)); + DisplayError(commandCoroutine.ToString(-1), commandCoroutine); commandCoroutine.ResetThread(); } } @@ -276,8 +269,13 @@ public void Dispose() state = null; } - public void DisplayError(string errorMessage) + private void DisplayError(string errorMessage, KeraLua.Lua state = null) { + if (state != null) + { + state.Traceback(state); + errorMessage += "\n" + state.ToString(-1); + } Shared.Logger.Log("lua error: "+errorMessage); Shared.SoundMaker.BeginFileSound("error"); Shared.Screen.Print(errorMessage); From 2120da7da07be8a498414540df72873ee27d92a5 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 9 Oct 2024 17:07:23 +0300 Subject: [PATCH 036/108] Set index, newindex metamethods on _ENV table without creating global variables --- src/kOS/Lua/Binding.cs | 38 ++++++++++--------------------------- src/kOS/Lua/LuaFunctions.cs | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 25d572df5d..e761714180 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -89,17 +89,19 @@ public static void BindToState(KeraLua.Lua state, SharedObjects shared) LuaFunctions.Add(state); + // set index and newindex metamethods on the environment table + state.PushGlobalTable(); + state.NewTable(); + state.PushString("__index"); state.PushCFunction(EnvIndex); - state.SetGlobal("envIndex"); + state.SetTable(-3); + state.PushString("__newindex"); state.PushCFunction(EnvNewIndex); - state.SetGlobal("envNewIndex"); - state.GetGlobal("type"); - state.SetGlobal("_type"); - state.PushCFunction(TypeFunction); - state.SetGlobal("type"); - int oldTop = state.GetTop(); - state.DoString(@"local mt = { __index = envIndex, __newindex = envNewIndex }; setmetatable(_ENV, mt)"); + state.SetTable(-3); + state.SetMetaTable(-2); + state.Pop(1); + // add userdataAddressToUserdata table to the registry state.PushString("userdataAddressToUserdata"); state.NewTable(); state.NewTable(); @@ -108,8 +110,6 @@ public static void BindToState(KeraLua.Lua state, SharedObjects shared) state.SetTable(-3); state.SetMetaTable(-2); state.SetTable((int)LuaRegistry.Index); - - state.SetTop(oldTop); } public static int CollectObject(IntPtr L) @@ -132,24 +132,6 @@ public static int ObjectToString(IntPtr L) state.PushString(obj.ToString()); return 1; } - - private static int TypeFunction(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - if (state.Type(1) == LuaType.UserData) - { - var obj = bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; - if (obj is Structure structure) - { - state.PushString(structure.KOSName); - return 1; - } - } - if (state.GetMetaField(1, "__type") == LuaType.String) - return 1; - state.PushString(state.TypeName(1)); - return 1; - } private static int EnvIndex(IntPtr L) { diff --git a/src/kOS/Lua/LuaFunctions.cs b/src/kOS/Lua/LuaFunctions.cs index 243811200b..fa581d576c 100644 --- a/src/kOS/Lua/LuaFunctions.cs +++ b/src/kOS/Lua/LuaFunctions.cs @@ -2,6 +2,7 @@ using kOS.Module; using System; using System.Runtime.InteropServices; +using kOS.Safe.Encapsulation; using kOS.Safe.Execution; using kOS.Safe.Persistence; using Debug = UnityEngine.Debug; @@ -12,6 +13,7 @@ public static class LuaFunctions { public static void Add(KeraLua.Lua state) { + AddFunction(state, "type", Type); AddFunction(state, "print", KosPrint); AddFunction(state, "warn", Warn); AddFunction(state, "wait", Wait); @@ -32,6 +34,24 @@ private static void AddFunction(KeraLua.Lua state, string name, LuaFunction func state.PushCFunction(function); state.SetGlobal(name); } + + private static int Type(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + if (state.Type(1) == LuaType.UserData) + { + var obj = Binding.bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; + if (obj is Structure structure) + { + state.PushString(structure.KOSName); + return 1; + } + } + if (state.GetMetaField(1, "__type") == LuaType.String) + return 1; + state.PushString(state.TypeName(1)); + return 1; + } private static int KosPrint(IntPtr L) { From d817d2c1af22309e83014eb89b4da8a286540528 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 9 Oct 2024 20:24:11 +0300 Subject: [PATCH 037/108] Make lua processors use 0 instructions at idle --- src/kOS/Lua/LuaInterpreter.cs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index ae5846cc1f..4130469c3f 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -46,6 +46,7 @@ public CommandInfo(string command, string chunkName) private class ExecInfo { + public int? IdleInstructions; public int InstructionsThisUpdate = 0; public int InstructionsDebt = 0; public bool BreakExecution = false; @@ -78,8 +79,8 @@ public void Boot() stateInfo.Add(state.State.MainThread.Handle, new ExecInfo(Shared, commandCoroutine, callbacksCoroutine)); using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { - try { state.DoString(streamReader.ReadToEnd()); } - catch (Exception e) { Debug.Log(e); DisplayError(e.Message); } + try { state.DoString(streamReader.ReadToEnd(), "init"); } + catch (Exception e) { DisplayError(e.Message); } } Binding.BindToState(commandCoroutine, Shared); @@ -181,9 +182,7 @@ public void KOSFixedUpdate(double dt) var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; - execInfo.InstructionsThisUpdate = Math.Min(instructionsPerUpdate, execInfo.InstructionsDebt); - execInfo.InstructionsDebt -= execInfo.InstructionsThisUpdate; - if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate) return; + execInfo.InstructionsThisUpdate = -execInfo.IdleInstructions ?? 0; if (execInfo.BreakExecution) { // true after BreakExecution was called, reset thread to prevent execution of the same program @@ -231,13 +230,27 @@ public void KOSFixedUpdate(double dt) } } } + + // record how many instructions were used on the first fixed update by the default onFixedUpdate callback + // before any user code was executed. On next updates InstructionsThisUpdate will be set to -IdleInstructions + // to make the processor use 0 opcodes at idle. If onFixedUpdate is set to nil by the user + // (which means no default trigger system, no default vessel control) they would have higher IPU count. + // With *current* ./init.lua file IdleInstructions is 60 + if (execInfo.IdleInstructions == null) + { + execInfo.IdleInstructions = execInfo.InstructionsThisUpdate; + execInfo.InstructionsThisUpdate = 0; + } + + var instructionsDebtPayment = Math.Min(instructionsPerUpdate - execInfo.InstructionsThisUpdate, execInfo.InstructionsDebt); + execInfo.InstructionsDebt -= instructionsDebtPayment; + execInfo.InstructionsThisUpdate += instructionsDebtPayment; if (execInfo.InstructionsThisUpdate < instructionsPerUpdate) execInfo.BreakExecutionCount = 0; if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate || (Shared.Cpu as LuaCPU).IsYielding()) return; - // resumes the coroutine after it yielded due to running out of instructions // and/or executes queued commands until they run out or the coroutine yields while (commandCoroutine.Status == LuaStatus.Yield || commandsQueue.Count > 0) From 40d2ca04bd852b81b4f53582218bf64ca47d693d Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 10 Oct 2024 12:00:05 +0300 Subject: [PATCH 038/108] Use UTF8 encoding for lua. Used to be ASCII --- src/kOS/Lua/LuaInterpreter.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 4130469c3f..6ef1ef3d88 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -72,6 +72,7 @@ public void Boot() Dispose(); Shared.UpdateHandler.AddFixedObserver(this); state = new NLua.Lua(); + state.State.Encoding = Encoding.UTF8; commandCoroutine = state.State.NewThread(); callbacksCoroutine = state.State.NewThread(); commandCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); From efd11f7a1c5c426e2fc792df668d644d39ecf7b9 Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 11 Oct 2024 15:36:32 +0300 Subject: [PATCH 039/108] Add onUpdate callback for lua. On lua side make it use the same callback system onFixedUpdate uses --- src/kOS/Lua/LuaInterpreter.cs | 186 +++++++++++++++++++++------------ src/kOS/Lua/init.lua | 63 ++++++----- src/kOS/Module/kOSProcessor.cs | 3 +- 3 files changed, 156 insertions(+), 96 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 6ef1ef3d88..8462cde5da 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -20,14 +20,13 @@ namespace kOS.Lua { - public class LuaInterpreter : IInterpreter, IFixedUpdateObserver + public class LuaInterpreter : IInterpreter, IFixedUpdateObserver, IUpdateObserver { private NLua.Lua state; private KeraLua.Lua commandCoroutine; - private KeraLua.Lua callbacksCoroutine; - private readonly Queue commandsQueue = new Queue(); + private KeraLua.Lua fixedUpdateCoroutine; + private KeraLua.Lua updateCoroutine; private static readonly Dictionary stateInfo = new Dictionary(); - private static int instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; public const string LuaVersion = "5.4"; public static readonly string[] FilenameExtensions = new string[] { "lua" }; public string Name => "lua"; @@ -46,19 +45,20 @@ public CommandInfo(string command, string chunkName) private class ExecInfo { - public int? IdleInstructions; + public readonly Queue CommandsQueue = new Queue(); + public int InstructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; + public int? FixedUpdateIdleInstructions; + public int? UpdateIdleInstructions; public int InstructionsThisUpdate = 0; public int InstructionsDebt = 0; public bool BreakExecution = false; public int BreakExecutionCount = 0; public readonly KeraLua.Lua CommandCoroutine; - public readonly KeraLua.Lua CallbacksCoroutine; public readonly SharedObjects Shared; - public ExecInfo(SharedObjects shared, KeraLua.Lua commandCoroutine, KeraLua.Lua callbacksCoroutine) + public ExecInfo(SharedObjects shared, KeraLua.Lua commandCoroutine) { Shared = shared; CommandCoroutine = commandCoroutine; - CallbacksCoroutine = callbacksCoroutine; } } @@ -71,13 +71,16 @@ public void Boot() { Dispose(); Shared.UpdateHandler.AddFixedObserver(this); + Shared.UpdateHandler.AddObserver(this); state = new NLua.Lua(); state.State.Encoding = Encoding.UTF8; commandCoroutine = state.State.NewThread(); - callbacksCoroutine = state.State.NewThread(); + fixedUpdateCoroutine = state.State.NewThread(); + updateCoroutine = state.State.NewThread(); commandCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); - callbacksCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); - stateInfo.Add(state.State.MainThread.Handle, new ExecInfo(Shared, commandCoroutine, callbacksCoroutine)); + fixedUpdateCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); + updateCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); + stateInfo.Add(state.State.MainThread.Handle, new ExecInfo(Shared, commandCoroutine)); using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { try { state.DoString(streamReader.ReadToEnd(), "init"); } @@ -116,7 +119,7 @@ private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) { var state = KeraLua.Lua.FromIntPtr(L); var execInfo = stateInfo[state.MainThread.Handle]; - if (++execInfo.InstructionsThisUpdate >= instructionsPerUpdate || execInfo.BreakExecution + if (++execInfo.InstructionsThisUpdate >= execInfo.InstructionsPerUpdate || execInfo.BreakExecution || (execInfo.CommandCoroutine.Handle == L && (execInfo.Shared.Cpu as LuaCPU).IsYielding())) { // it's possible for a C/CSharp function to call lua making a coroutine unable to yield because @@ -130,7 +133,8 @@ private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) private void ProcessCommand(string commandText, string commandName) { - commandsQueue.Enqueue(new CommandInfo(commandText, commandName)); + var execInfo = stateInfo[state.State.MainThread.Handle]; + execInfo.CommandsQueue.Enqueue(new CommandInfo(commandText, commandName)); } private bool LoadCommand(CommandInfo commandInfo) @@ -160,7 +164,9 @@ public bool IsCommandComplete(string commandText) public bool IsWaitingForCommand() { - return !(Shared.Cpu as LuaCPU).IsYielding() && callbacksCoroutine.Status != LuaStatus.Yield && commandCoroutine.Status != LuaStatus.Yield; + return !(Shared.Cpu as LuaCPU).IsYielding() && fixedUpdateCoroutine.Status != LuaStatus.Yield + && updateCoroutine.Status != LuaStatus.Yield + && commandCoroutine.Status != LuaStatus.Yield; } public void BreakExecution() @@ -180,104 +186,150 @@ public int InstructionsThisUpdate() public void KOSFixedUpdate(double dt) { (Shared.Cpu as LuaCPU).FixedUpdate(); + Shared.BindingMgr?.PreUpdate(); + // run commands with remaining instructions from previous onFixedUpdate, onUpdate callbacks + // reset InstructionsThisUpdate + // run onFixedUpdate callback + // if KOSUpdate got called run onUpdate callback + var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; - instructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; - execInfo.InstructionsThisUpdate = -execInfo.IdleInstructions ?? 0; + var idleInstructionsRecorded = execInfo.FixedUpdateIdleInstructions != null && execInfo.UpdateIdleInstructions != null; + + if (fixedUpdateCoroutine.Status != LuaStatus.Yield && updateCoroutine.Status != LuaStatus.Yield) + execInfo.BreakExecutionCount = 0; + + if (execInfo.BreakExecutionCount >= 3) + { + Shared.SoundMaker.BeginFileSound("beep"); + Shared.Screen.Print("Ctrl+C was pressed 3 times while the processor was using all of the available instructions so "+ + "update callbacks were set to nil. To reset callbacks do:\n\"setUpdateCallbacks()\"."); + state.State.PushNil(); + state.State.SetGlobal("onFixedUpdate"); + state.State.PushNil(); + state.State.SetGlobal("onUpdate"); + execInfo.BreakExecutionCount = 0; + } + + var instructionsDebtPayment = Math.Min(execInfo.InstructionsPerUpdate - execInfo.InstructionsThisUpdate, execInfo.InstructionsDebt); + execInfo.InstructionsDebt -= instructionsDebtPayment; + execInfo.InstructionsThisUpdate += instructionsDebtPayment; + + // running commands here but resetting InstructionsThisUpdate after, so commands have the lowest priority + // here InstructionsThisUpdate is more like InstructionsThatUpdate + if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate && !(Shared.Cpu as LuaCPU).IsYielding() && idleInstructionsRecorded) + { + // resumes the coroutine after it yielded due to running out of instructions + // and/or executes queued commands until they run out or the coroutine yields + while (commandCoroutine.Status == LuaStatus.Yield || execInfo.CommandsQueue.Count > 0) + { + if (commandCoroutine.Status == LuaStatus.Yield || LoadCommand(execInfo.CommandsQueue.Dequeue())) + { + var status = commandCoroutine.Resume(state.State, 0); + if (status == LuaStatus.Yield) break; + if (status != LuaStatus.OK) + { + DisplayError(commandCoroutine.ToString(-1), commandCoroutine); + commandCoroutine.ResetThread(); + } + } + } + } + + execInfo.InstructionsPerUpdate = idleInstructionsRecorded? SafeHouse.Config.InstructionsPerUpdate : int.MaxValue; + execInfo.InstructionsThisUpdate = 0; if (execInfo.BreakExecution) { // true after BreakExecution was called, reset thread to prevent execution of the same program execInfo.BreakExecution = false; - commandsQueue.Clear(); + execInfo.CommandsQueue.Clear(); commandCoroutine.ResetThread(); - callbacksCoroutine.ResetThread(); - if (callbacksCoroutine.GetGlobal("onBreakExecution") == LuaType.Function) + fixedUpdateCoroutine.ResetThread(); + updateCoroutine.ResetThread(); + if (fixedUpdateCoroutine.GetGlobal("onBreakExecution") == LuaType.Function) { - if (callbacksCoroutine.LoadString("onBreakExecution()", "callback") == LuaStatus.OK) + if (fixedUpdateCoroutine.LoadString("onBreakExecution()", "breakExecution") == LuaStatus.OK) { - var status = callbacksCoroutine.Resume(state.State, 0); + var status = fixedUpdateCoroutine.Resume(state.State, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) - DisplayError(callbacksCoroutine.ToString(-1), callbacksCoroutine); + DisplayError(fixedUpdateCoroutine.ToString(-1), fixedUpdateCoroutine); } } } - Shared.BindingMgr?.PreUpdate(); + if (execInfo.FixedUpdateIdleInstructions != null) + execInfo.InstructionsThisUpdate -= (int)execInfo.FixedUpdateIdleInstructions; // if onFixedUpdate failed to execute due to running out of instructions we reset and start over. // it's up to lua side to figure out how to handle the reset in case it didn't finish the callback - callbacksCoroutine.ResetThread(); - if (callbacksCoroutine.GetGlobal("onFixedUpdate") == LuaType.Function) + fixedUpdateCoroutine.ResetThread(); + if (fixedUpdateCoroutine.GetGlobal("onFixedUpdate") == LuaType.Function) { - if (execInfo.BreakExecutionCount >= 3) - { - Shared.SoundMaker.BeginFileSound("beep"); - Shared.Screen.Print("Ctrl+C was pressed 3 times while onFixedUpdate was executing and "+ - "onFixedUpdate was set to nil. To reset onFixedUpdate do 'onFixedUpdate = _onFixedUpdate'."); - callbacksCoroutine.PushNil(); - callbacksCoroutine.SetGlobal("onFixedUpdate"); - execInfo.BreakExecutionCount = 0; - } - else if (callbacksCoroutine.LoadString("onFixedUpdate()", "callback") == LuaStatus.OK) + if (fixedUpdateCoroutine.LoadString($"onFixedUpdate({dt})", "fixedUpdate") == LuaStatus.OK) { - var status = callbacksCoroutine.Resume(state.State, 0); + var status = fixedUpdateCoroutine.Resume(state.State, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) { - DisplayError(callbacksCoroutine.ToString(-1) + DisplayError(fixedUpdateCoroutine.ToString(-1) +"\nonFixedUpdate function errored and was set to nil." - +"\nTo reset onFixedUpdate do 'onFixedUpdate = _onFixedUpdate'.", callbacksCoroutine); - callbacksCoroutine.PushNil(); - callbacksCoroutine.SetGlobal("onFixedUpdate"); + +"\nTo reset onFixedUpdate do 'onFixedUpdate = _onFixedUpdate'.", fixedUpdateCoroutine); + fixedUpdateCoroutine.PushNil(); + fixedUpdateCoroutine.SetGlobal("onFixedUpdate"); } } } // record how many instructions were used on the first fixed update by the default onFixedUpdate callback - // before any user code was executed. On next updates InstructionsThisUpdate will be set to -IdleInstructions - // to make the processor use 0 opcodes at idle. If onFixedUpdate is set to nil by the user - // (which means no default trigger system, no default vessel control) they would have higher IPU count. - // With *current* ./init.lua file IdleInstructions is 60 - if (execInfo.IdleInstructions == null) + // before any user code was executed. This number of instructions will be subtracted from InstructionThisUpdate + // right before onFixedUpdate gets called to make the processor use 0 opcodes at idle. + // If onFixedUpdate is set to nil by the user (which means no default trigger system, no default vessel control) + // they would have higher IPU count. The same goes for the onUpdate callback + if (execInfo.FixedUpdateIdleInstructions == null) { - execInfo.IdleInstructions = execInfo.InstructionsThisUpdate; + execInfo.FixedUpdateIdleInstructions = execInfo.InstructionsThisUpdate; execInfo.InstructionsThisUpdate = 0; } + } + + public void KOSUpdate(double dt) + { + var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; - var instructionsDebtPayment = Math.Min(instructionsPerUpdate - execInfo.InstructionsThisUpdate, execInfo.InstructionsDebt); - execInfo.InstructionsDebt -= instructionsDebtPayment; - execInfo.InstructionsThisUpdate += instructionsDebtPayment; - - if (execInfo.InstructionsThisUpdate < instructionsPerUpdate) - execInfo.BreakExecutionCount = 0; - - if (execInfo.InstructionsThisUpdate >= instructionsPerUpdate || (Shared.Cpu as LuaCPU).IsYielding()) return; + if (execInfo.UpdateIdleInstructions != null) + execInfo.InstructionsThisUpdate -= (int)execInfo.UpdateIdleInstructions; - // resumes the coroutine after it yielded due to running out of instructions - // and/or executes queued commands until they run out or the coroutine yields - while (commandCoroutine.Status == LuaStatus.Yield || commandsQueue.Count > 0) + if (execInfo.InstructionsThisUpdate >= execInfo.InstructionsPerUpdate) return; + + updateCoroutine.ResetThread(); + if (updateCoroutine.GetGlobal("onUpdate") == LuaType.Function) { - if (commandCoroutine.Status == LuaStatus.Yield || LoadCommand(commandsQueue.Dequeue())) + if (updateCoroutine.LoadString($"onUpdate({dt})", "update") == LuaStatus.OK) { - var status = commandCoroutine.Resume(state.State, 0); - if (status == LuaStatus.Yield) - { - return; - } - if (status != LuaStatus.OK) + var status = updateCoroutine.Resume(state.State, 0); + if (status != LuaStatus.OK && status != LuaStatus.Yield) { - DisplayError(commandCoroutine.ToString(-1), commandCoroutine); - commandCoroutine.ResetThread(); + DisplayError(updateCoroutine.ToString(-1) + +"\nonUpdate function errored and was set to nil." + +"\nTo reset onUpdate do 'onUpdate = _onUpdate'.", updateCoroutine); + updateCoroutine.PushNil(); + updateCoroutine.SetGlobal("onUpdate"); } } } + + if (execInfo.UpdateIdleInstructions == null) + { + execInfo.UpdateIdleInstructions = execInfo.InstructionsThisUpdate; + execInfo.InstructionsThisUpdate = 0; + } } public void Dispose() { if (state == null) return; Shared.UpdateHandler.RemoveFixedObserver(this); + Shared.UpdateHandler.RemoveObserver(this); stateInfo.Remove(state.State.MainThread.Handle); - commandsQueue.Clear(); Binding.bindings.Remove(state.State.MainThread.Handle); state.Dispose(); state = null; diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua index 5c7ae78232..eadcd30c3f 100644 --- a/src/kOS/Lua/init.lua +++ b/src/kOS/Lua/init.lua @@ -1,12 +1,23 @@ function _onFixedUpdate() runProcessControl() - runCallbacks() + runCallbacks(fixedUpdateCallbacks) end -onFixedUpdate = _onFixedUpdate + +function _onUpdate() + runCallbacks(updateCallbacks) +end + +function setUpdateCallbacks() + onFixedUpdate = _onFixedUpdate + onUpdate = _onUpdate +end +setUpdateCallbacks() function _onBreakExecution() breakControl() - breakCallbacks() + fixedUpdateCallbacks = {} + callbacks = fixedUpdateCallbacks + updateCallbacks = {} end onBreakExecution = _onBreakExecution @@ -69,24 +80,20 @@ function processControl() controlCoroutine = nil end -function breakCallbacks() - callbacks = {} - callbacksContinuation = nil - callbacksUnsorted = nil -end -breakCallbacks() +fixedUpdateCallbacks = {} +updateCallbacks = {} -function runCallbacks() - if callbacksContinuation then - coroutine.resume(callbacksContinuation) +function runCallbacks(callbacks) + if callbacks.continuation then + coroutine.resume(callbacks.continuation) end - if callbacksUnsorted then - callbacksContinuation = coroutine.create(function() + if callbacks.unsorted then + callbacks.continuation = coroutine.create(function() table.sort(callbacks, function(a, b) return a.priority < b.priority end) - callbacksUnsorted = false - callbacksContinuation = nil + callbacks.unsorted = false + callbacks.continuation = nil end) - coroutine.resume(callbacksContinuation) + coroutine.resume(callbacks.continuation) end for i=#callbacks,1,-1 do local callback = callbacks[i] @@ -103,7 +110,8 @@ function runCallbacks() end end -function addCallback(body, priority) +function addCallback(body, priority, callbacks) + callbacks = callbacks or fixedUpdateCallbacks local callback = { body = function(callback) local success, newPriority = pcall(body, callback) @@ -111,7 +119,7 @@ function addCallback(body, priority) if success then callback.priority = tonumber(newPriority) if callback.priority then - callbacksUnsorted = true + callbacks.unsorted = true else callback.body = nil end @@ -125,22 +133,23 @@ function addCallback(body, priority) priority = priority or 0 } table.insert(callbacks, callback) - callbacksUnsorted = true + callbacks.unsorted = true + return callback end -function when(condition, body, priority) - addCallback(function (callback) +function when(condition, body, priority, callbacks) + return addCallback(function (callback) if condition() then return body() else return callback.priority end - end, priority) + end, priority, callbacks) end -function on(state, body, priority) +function on(state, body, priority, callbacks) local previousState = state() - addCallback(function (callback) + return addCallback(function (callback) local currentState = state() if currentState ~= previousState then local newPriority = body() @@ -149,5 +158,5 @@ function on(state, body, priority) else return callback.priority end - end, priority) -end \ No newline at end of file + end, priority, callbacks) +end diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index 014fc9b005..d2746fa8ab 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -929,9 +929,8 @@ public void FixedUpdate() // interpreter swap // stop the fixed observers shared.UpdateHandler.RemoveFixedObserver(shared.Cpu); - if (shared.Interpreter is IFixedUpdateObserver interpreterObserver) - shared.UpdateHandler.RemoveFixedObserver(interpreterObserver); // save cpu and interpreter references + shared.Interpreter.Dispose(); if (shared.Cpu is LuaCPU) luaCpu = shared.Cpu; else ksCpu = shared.Cpu; if (shared.Interpreter is LuaInterpreter) luaInterpreter = shared.Interpreter; From e92ab3d19237c03dabfbf74846e3ea71167c57e8 Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 11 Oct 2024 16:24:08 +0300 Subject: [PATCH 040/108] Create new CPU and Interpreter instances and dispose the old ones on each boot Instead of keeping references to previous instances and reusing them --- src/kOS/Module/kOSProcessor.cs | 28 +++++++--------------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index d2746fa8ab..f27ff7294f 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -610,11 +610,6 @@ private IEnumerable BootDirectoryFiles() private static Regex VolumeNameRemoveChars = new Regex("[/\\\\<>:\"|?*]*", RegexOptions.Compiled); - private ICpu luaCpu; - private ICpu ksCpu; - private IInterpreter luaInterpreter; - private IInterpreter ksInterpreter; - public void InitObjects() { if (objectsInitialized) @@ -821,10 +816,6 @@ public void OnDestroy() shared.Cpu.BreakExecution(false); shared.Cpu.Dispose(); shared.Interpreter.Dispose(); - luaCpu?.Dispose(); - ksCpu?.Dispose(); - luaInterpreter?.Dispose(); - ksInterpreter?.Dispose(); shared.DestroyObjects(); shared = null; } @@ -927,24 +918,19 @@ public void FixedUpdate() { SafeHouse.Logger.LogWarning("First Update()"); // interpreter swap - // stop the fixed observers - shared.UpdateHandler.RemoveFixedObserver(shared.Cpu); - // save cpu and interpreter references + // dispose current cpu and interpreter + shared.Cpu.Dispose(); shared.Interpreter.Dispose(); - if (shared.Cpu is LuaCPU) luaCpu = shared.Cpu; - else ksCpu = shared.Cpu; - if (shared.Interpreter is LuaInterpreter) luaInterpreter = shared.Interpreter; - else ksInterpreter = shared.Interpreter; - // update shared cpu and interpreter from references or create new ones if they are null + // update shared cpu and interpreter if (interpreterLanguage == "lua") { - shared.Cpu = luaCpu ?? new LuaCPU(shared); - shared.Interpreter = luaInterpreter ?? new LuaInterpreter(shared); + shared.Cpu = new LuaCPU(shared); + shared.Interpreter = new LuaInterpreter(shared); } else { - shared.Cpu = ksCpu ?? new CPU(shared); - shared.Interpreter = ksInterpreter ?? new KSInterpreter(shared); + shared.Cpu = new CPU(shared); + shared.Interpreter = new KSInterpreter(shared); } // run boot methods shared.Cpu.Boot(); From ae5b4c27e77e3d2336da4427381f9748aff84d44 Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 14 Oct 2024 14:10:18 +0300 Subject: [PATCH 041/108] Print exception type on lua error if exception has no message --- src/kOS/Lua/Binding.cs | 2 +- src/kOS/Lua/Types/KSStructure.cs | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index e761714180..7450446e3d 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -262,7 +262,7 @@ public static object LuaExceptionCatch(Func tryBody, KeraLua.Lua state) catch (Exception e) { Debug.Log(e); - return state.Error(e.Message); + return state.Error(e.Message == ""? e.GetType().FullName : e.Message); } } diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index 64f042f0a4..ac7028e76e 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -96,15 +96,16 @@ private static int StructureToString(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var structure = Binding.bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; + var structureString = (string)Binding.LuaExceptionCatch(() => structure.ToString(), state); if (structure is IEnumerable) { // make enum structures ToString() method show 1 base indexed values in lua // replaces "\n [*number*]" with "\n [*number+1*]" - state.PushString(Regex.Replace(structure.ToString(), @"\n\s*\[([0-9]+)\]", (match) => + state.PushString(Regex.Replace(structureString, @"\n\s*\[([0-9]+)\]", (match) => Regex.Replace(match.Groups[0].Value, match.Groups[1].Value, (int.Parse(match.Groups[1].Value) + 1).ToString()) )); } else - state.PushString(structure.ToString()); + state.PushString(structureString); return 1; } From 7c7f75cba708fa81170df9a48496f42a472a1de1 Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 14 Oct 2024 14:11:32 +0300 Subject: [PATCH 042/108] Don't call onUpdate lua callback when the game is paused --- src/kOS/Lua/LuaInterpreter.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 8462cde5da..2195365a59 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -293,6 +293,7 @@ public void KOSFixedUpdate(double dt) public void KOSUpdate(double dt) { + if (dt == 0) return; // don't run when the game is paused var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; if (execInfo.UpdateIdleInstructions != null) From 5390722284ae30ef6d4b61b0339a9badb9317a3b Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 14 Oct 2024 14:14:17 +0300 Subject: [PATCH 043/108] Dispose lua state before removing its binding info It might need it when calling finalizers --- src/kOS/Lua/LuaInterpreter.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 2195365a59..3720c32e2d 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -330,9 +330,10 @@ public void Dispose() if (state == null) return; Shared.UpdateHandler.RemoveFixedObserver(this); Shared.UpdateHandler.RemoveObserver(this); - stateInfo.Remove(state.State.MainThread.Handle); - Binding.bindings.Remove(state.State.MainThread.Handle); + var stateHandle = state.State.MainThread.Handle; state.Dispose(); + stateInfo.Remove(stateHandle); + Binding.bindings.Remove(stateHandle); state = null; } From 7989188240152c13659e99296891eb55b0648c0b Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 14 Oct 2024 17:09:39 +0300 Subject: [PATCH 044/108] Separate IPU config value for lua Higher minimal IPU(50 -> 150). Mainly needed to have enough instructions to run the default callback system and control, that run in lua and use instructions --- src/kOS.Safe.Test/Execution/Config.cs | 12 ++++++++ src/kOS.Safe/Encapsulation/IConfig.cs | 1 + src/kOS/Binding/CPUBinding.cs | 10 ++++++- src/kOS/Module/kOSCustomParameters.cs | 12 ++++++++ src/kOS/Suffixed/Config.cs | 41 ++++++++++++++------------- 5 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/kOS.Safe.Test/Execution/Config.cs b/src/kOS.Safe.Test/Execution/Config.cs index 980b9adbe2..c25f8b72fe 100644 --- a/src/kOS.Safe.Test/Execution/Config.cs +++ b/src/kOS.Safe.Test/Execution/Config.cs @@ -66,6 +66,18 @@ public int InstructionsPerUpdate { } } + + public int LuaInstructionsPerUpdate + { + get + { + return 10000; // high enough to run everything in one pass (unless it waits) + } + + set + { + } + } public bool ObeyHideUI { diff --git a/src/kOS.Safe/Encapsulation/IConfig.cs b/src/kOS.Safe/Encapsulation/IConfig.cs index 22bca80619..e9088ca38f 100644 --- a/src/kOS.Safe/Encapsulation/IConfig.cs +++ b/src/kOS.Safe/Encapsulation/IConfig.cs @@ -7,6 +7,7 @@ namespace kOS.Safe.Encapsulation public interface IConfig: ISuffixed { int InstructionsPerUpdate { get; set; } + int LuaInstructionsPerUpdate { get; set; } bool UseCompressedPersistence { get; set; } bool ShowStatistics { get; set; } bool StartOnArchive { get; set; } diff --git a/src/kOS/Binding/CPUBinding.cs b/src/kOS/Binding/CPUBinding.cs index b38afe32b0..9b0e72617d 100644 --- a/src/kOS/Binding/CPUBinding.cs +++ b/src/kOS/Binding/CPUBinding.cs @@ -1,3 +1,4 @@ +using kOS.Lua; using kOS.Safe.Binding; using kOS.Module; @@ -8,7 +9,14 @@ public class CPUBinding : Binding { public override void AddTo(SharedObjects shared) { - shared.BindingMgr.AddGetter("OPCODESLEFT", delegate { return kOSCustomParameters.Instance.InstructionsPerUpdate - shared.Interpreter.InstructionsThisUpdate(); }); + shared.BindingMgr.AddGetter("OPCODESLEFT", () => + { + if (shared.Interpreter is LuaInterpreter) + { + return kOSCustomParameters.Instance.LuaInstructionsPerUpdate - shared.Interpreter.InstructionsThisUpdate(); + } + return kOSCustomParameters.Instance.InstructionsPerUpdate - shared.Interpreter.InstructionsThisUpdate(); + }); shared.BindingMgr.MarkVolatile("OPCODESLEFT"); } } diff --git a/src/kOS/Module/kOSCustomParameters.cs b/src/kOS/Module/kOSCustomParameters.cs index d06f9c2eec..e8f89c0e6d 100644 --- a/src/kOS/Module/kOSCustomParameters.cs +++ b/src/kOS/Module/kOSCustomParameters.cs @@ -66,6 +66,18 @@ public int InstructionsPerUpdate instructionsPerUpdate = Math.Max(ipuMin, Math.Min(ipuMax, value)); } } + + private const int luaIpuMin = 150; + private const int luaIpuMax = 2000; + private int luaInstructionsPerUpdate = 200; + + [GameParameters.CustomIntParameterUI("Lua instructions per update", minValue = luaIpuMin, maxValue = luaIpuMax, + toolTip = "Maximum number of instructions used per physics tick by CPUs using lua")] + public int LuaInstructionsPerUpdate + { + get => luaInstructionsPerUpdate; + set => luaInstructionsPerUpdate = Math.Max(luaIpuMin, Math.Min(luaIpuMax, value)); + } [GameParameters.CustomParameterUI("Enable compressed storage", toolTip = "When storing local volumes' data in the saved game,\n"+ diff --git a/src/kOS/Suffixed/Config.cs b/src/kOS/Suffixed/Config.cs index cae46522f6..739c474182 100644 --- a/src/kOS/Suffixed/Config.cs +++ b/src/kOS/Suffixed/Config.cs @@ -17,6 +17,7 @@ public class Config : Structure, IConfig private readonly Dictionary properties; public int InstructionsPerUpdate { get { return kOSCustomParameters.Instance.InstructionsPerUpdate; } set { kOSCustomParameters.Instance.InstructionsPerUpdate = value; } } + public int LuaInstructionsPerUpdate { get { return kOSCustomParameters.Instance.LuaInstructionsPerUpdate; } set { kOSCustomParameters.Instance.LuaInstructionsPerUpdate = value; } } public bool UseCompressedPersistence { get { return kOSCustomParameters.Instance.useCompressedPersistence; } set { kOSCustomParameters.Instance.useCompressedPersistence = value; } } public bool ShowStatistics { get { return kOSCustomParameters.Instance.showStatistics; } set { kOSCustomParameters.Instance.showStatistics = value; } } public bool StartOnArchive { get { return kOSCustomParameters.Instance.startOnArchive; } set { kOSCustomParameters.Instance.startOnArchive = value; } } @@ -54,6 +55,7 @@ private Config() private void InitializeSuffixes() { AddSuffix("IPU", new SetSuffix(() => InstructionsPerUpdate, value => InstructionsPerUpdate = value)); + AddSuffix("LUAIPU", new SetSuffix(() => LuaInstructionsPerUpdate, value => LuaInstructionsPerUpdate = value)); AddSuffix("UCP", new SetSuffix(() => UseCompressedPersistence, value => UseCompressedPersistence = value)); AddSuffix("STAT", new SetSuffix(() => ShowStatistics, value => ShowStatistics = value)); AddSuffix("ARCH", new SetSuffix(() => StartOnArchive, value => StartOnArchive = value)); @@ -238,25 +240,26 @@ public override string ToString() private enum PropId { InstructionsPerUpdate = 1, - UseCompressedPersistence = 2, - ShowStatistics = 3, - EnableRTIntegration = 4, - StartOnArchive = 5, - ObeyHideUI = 6, - EnableSafeMode = 7, - AudibleExceptions = 8, - VerboseExceptions = 9, - EnableTelnet = 10, - TelnetPort = 11, - TelnetIPAddrString = 12, - UseBlizzyToolbarOnly = 13, - DebugEachOpcode = 14, - TerminalFontDefaultSize = 15, - TerminalFontName = 16, - TerminalBrightness = 17, - TerminalDefaultWidth = 18, - TerminalDefaultHeight = 19, - SuppressAutopilot = 20 + LuaInstructionsPerUpdate = 2, + UseCompressedPersistence = 3, + ShowStatistics = 4, + EnableRTIntegration = 5, + StartOnArchive = 6, + ObeyHideUI = 7, + EnableSafeMode = 8, + AudibleExceptions = 9, + VerboseExceptions = 10, + EnableTelnet = 11, + TelnetPort = 12, + TelnetIPAddrString = 13, + UseBlizzyToolbarOnly = 14, + DebugEachOpcode = 15, + TerminalFontDefaultSize = 16, + TerminalFontName = 17, + TerminalBrightness = 18, + TerminalDefaultWidth = 19, + TerminalDefaultHeight = 20, + SuppressAutopilot = 21 } } } From 31f4152220002216e3f2a6afb4900f0ed6f650e5 Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 14 Oct 2024 17:13:32 +0300 Subject: [PATCH 045/108] Remove IdleInstructions for onFixedUpdate, onUpdate callbacks Needed in the first place to allow lua CPUs to run when IPU is set to 50. Not that lua has a separate IPU count for lua with minimal 150 IPU it's not needed --- src/kOS/Lua/LuaInterpreter.cs | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 3720c32e2d..2f0aa1982e 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -47,8 +47,6 @@ private class ExecInfo { public readonly Queue CommandsQueue = new Queue(); public int InstructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; - public int? FixedUpdateIdleInstructions; - public int? UpdateIdleInstructions; public int InstructionsThisUpdate = 0; public int InstructionsDebt = 0; public bool BreakExecution = false; @@ -194,7 +192,7 @@ public void KOSFixedUpdate(double dt) // if KOSUpdate got called run onUpdate callback var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; - var idleInstructionsRecorded = execInfo.FixedUpdateIdleInstructions != null && execInfo.UpdateIdleInstructions != null; + execInfo.InstructionsPerUpdate = SafeHouse.Config.LuaInstructionsPerUpdate; if (fixedUpdateCoroutine.Status != LuaStatus.Yield && updateCoroutine.Status != LuaStatus.Yield) execInfo.BreakExecutionCount = 0; @@ -217,7 +215,7 @@ public void KOSFixedUpdate(double dt) // running commands here but resetting InstructionsThisUpdate after, so commands have the lowest priority // here InstructionsThisUpdate is more like InstructionsThatUpdate - if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate && !(Shared.Cpu as LuaCPU).IsYielding() && idleInstructionsRecorded) + if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate && !(Shared.Cpu as LuaCPU).IsYielding()) { // resumes the coroutine after it yielded due to running out of instructions // and/or executes queued commands until they run out or the coroutine yields @@ -236,7 +234,6 @@ public void KOSFixedUpdate(double dt) } } - execInfo.InstructionsPerUpdate = idleInstructionsRecorded? SafeHouse.Config.InstructionsPerUpdate : int.MaxValue; execInfo.InstructionsThisUpdate = 0; if (execInfo.BreakExecution) @@ -257,9 +254,6 @@ public void KOSFixedUpdate(double dt) } } - if (execInfo.FixedUpdateIdleInstructions != null) - execInfo.InstructionsThisUpdate -= (int)execInfo.FixedUpdateIdleInstructions; - // if onFixedUpdate failed to execute due to running out of instructions we reset and start over. // it's up to lua side to figure out how to handle the reset in case it didn't finish the callback fixedUpdateCoroutine.ResetThread(); @@ -278,17 +272,6 @@ public void KOSFixedUpdate(double dt) } } } - - // record how many instructions were used on the first fixed update by the default onFixedUpdate callback - // before any user code was executed. This number of instructions will be subtracted from InstructionThisUpdate - // right before onFixedUpdate gets called to make the processor use 0 opcodes at idle. - // If onFixedUpdate is set to nil by the user (which means no default trigger system, no default vessel control) - // they would have higher IPU count. The same goes for the onUpdate callback - if (execInfo.FixedUpdateIdleInstructions == null) - { - execInfo.FixedUpdateIdleInstructions = execInfo.InstructionsThisUpdate; - execInfo.InstructionsThisUpdate = 0; - } } public void KOSUpdate(double dt) @@ -296,9 +279,6 @@ public void KOSUpdate(double dt) if (dt == 0) return; // don't run when the game is paused var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; - if (execInfo.UpdateIdleInstructions != null) - execInfo.InstructionsThisUpdate -= (int)execInfo.UpdateIdleInstructions; - if (execInfo.InstructionsThisUpdate >= execInfo.InstructionsPerUpdate) return; updateCoroutine.ResetThread(); @@ -317,12 +297,6 @@ public void KOSUpdate(double dt) } } } - - if (execInfo.UpdateIdleInstructions == null) - { - execInfo.UpdateIdleInstructions = execInfo.InstructionsThisUpdate; - execInfo.InstructionsThisUpdate = 0; - } } public void Dispose() From a6a192283beea2de5eb9772986d61ce11a867e7b Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 15 Oct 2024 11:09:22 +0300 Subject: [PATCH 046/108] Lua error on invalid argument in a kerboscript function --- src/kOS/Lua/Types/KSFunction.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index 2bd49dd042..6fc705cd46 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -45,7 +45,7 @@ private static int KSFunctionCall(IntPtr L) { var arg = Binding.ToCSharpObject(state, i, binding); if (arg == null) break; - stack.PushArgument(arg); + Binding.LuaExceptionCatch(() => stack.PushArgument(arg), state); } if (ksFunction is SafeFunctionBase function) From f5948f300b267d78e8a69beafe3c690c787ff60d Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 15 Oct 2024 11:12:00 +0300 Subject: [PATCH 047/108] Fix NRE in Interpreter.BreakExecution on a turned off processor --- src/kOS/Lua/LuaInterpreter.cs | 1 + src/kOS/Screen/KSInterpreter.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 2f0aa1982e..4575440054 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -169,6 +169,7 @@ public bool IsWaitingForCommand() public void BreakExecution() { + if (state == null) return; var execInfo = stateInfo[state.State.MainThread.Handle]; execInfo.BreakExecution = true; execInfo.BreakExecutionCount++; diff --git a/src/kOS/Screen/KSInterpreter.cs b/src/kOS/Screen/KSInterpreter.cs index c042f6c656..f7624153e4 100644 --- a/src/kOS/Screen/KSInterpreter.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -70,6 +70,7 @@ public bool IsWaitingForCommand() public void BreakExecution() { + if (Shared.Cpu.GetCurrentContext() == null) return; Shared.Cpu.GetCurrentOpcode().AbortProgram = true; } From 81c4d46be380a19177aa1c4d90a27b0e4e1a408d Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 15 Oct 2024 16:21:55 +0300 Subject: [PATCH 048/108] Add optional stack traceback to lua warn function --- src/kOS/Lua/LuaFunctions.cs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/kOS/Lua/LuaFunctions.cs b/src/kOS/Lua/LuaFunctions.cs index fa581d576c..9463eeade3 100644 --- a/src/kOS/Lua/LuaFunctions.cs +++ b/src/kOS/Lua/LuaFunctions.cs @@ -67,10 +67,16 @@ private static int KosPrint(IntPtr L) private static int Warn(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - state.CheckString(1); + var errorMessage = state.CheckString(1); + var tracebackLevel = state.OptInteger(2, 0); + if (tracebackLevel > 0) + { + state.Traceback(state, (int)tracebackLevel); + errorMessage += "\n" + state.ToString(-1); + } var shared = Binding.bindings[state.MainThread.Handle].Shared; shared.SoundMaker.BeginFileSound("error"); - shared.Screen.Print(state.ToString(1)); + shared.Screen.Print(errorMessage); return 0; } From 4984bd616bc2e49db70ff37b4eb3bb48f87458a5 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 17 Oct 2024 13:52:57 +0300 Subject: [PATCH 049/108] Dispose Interpreter on processor shutdown instead of on processor boot Mainly to trigger GC metamethods in lua at the right time --- src/kOS/Module/kOSProcessor.cs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index f27ff7294f..b6ba7a6435 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -63,6 +63,7 @@ public string Tag private int vesselPartCount; private SharedObjects shared; private static readonly List allMyInstances = new List(); + private bool hasShutdown = true; public bool HasBooted { get; set; } private bool objectsInitialized = false; private int numUpdatesAfterStartHappened = 0; @@ -814,8 +815,8 @@ public void OnDestroy() if (shared != null) { shared.Cpu.BreakExecution(false); - shared.Cpu.Dispose(); shared.Interpreter.Dispose(); + shared.Cpu.Dispose(); shared.DestroyObjects(); shared = null; } @@ -914,13 +915,18 @@ public void FixedUpdate() if (!vessel.HoldPhysics) { + if (!hasShutdown) + { + shared.Interpreter.Dispose(); + hasShutdown = true; + } if (!HasBooted) { SafeHouse.Logger.LogWarning("First Update()"); // interpreter swap // dispose current cpu and interpreter - shared.Cpu.Dispose(); shared.Interpreter.Dispose(); + shared.Cpu.Dispose(); // update shared cpu and interpreter if (interpreterLanguage == "lua") { @@ -1235,6 +1241,7 @@ private void ProcessorModeChanged() case ProcessorModes.OFF: case ProcessorModes.STARVED: + hasShutdown = false; if (shared.Interpreter != null) shared.Interpreter.BreakExecution(); if (shared.Cpu != null) shared.Cpu.BreakExecution(true); if (shared.Terminal != null) shared.Terminal.SetInputLock(true); From 33058c7cc35c0444c12f53a5ca2a9e2455ab2b24 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 17 Oct 2024 13:57:56 +0300 Subject: [PATCH 050/108] Clearer error traceback in processControl and callbacks --- src/kOS/Lua/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua index eadcd30c3f..e94fdab8fa 100644 --- a/src/kOS/Lua/init.lua +++ b/src/kOS/Lua/init.lua @@ -37,7 +37,7 @@ function processControl() steeringControlled = true local success, error = pcall(function() STEERING = type(steering) == "function" and steering() or steering end) if not success then - warn(error) + warn(error, 1) steering = nil end elseif steeringControlled then @@ -48,7 +48,7 @@ function processControl() throttleControlled = true local success, error = pcall(function() THROTTLE = type(throttle) == "function" and throttle() or throttle end) if not success then - warn(error) + warn(error, 1) throttle = nil end elseif throttleControlled then @@ -59,7 +59,7 @@ function processControl() wheelSteeringControlled = true local success, error = pcall(function() WHEELSTEERING = type(wheelSteering) == "function" and wheelSteering() or wheelSteering end) if not success then - warn(error) + warn(error, 1) wheelSteering = nil end elseif wheelSteeringControlled then @@ -70,7 +70,7 @@ function processControl() wheelThrottleControlled = true local success, error = pcall(function() WHEELTHROTTLE = type(wheelThrottle) == "function" and wheelThrottle() or wheelThrottle end) if not success then - warn(error) + warn(error, 1) wheelThrottle = nil end elseif wheelThrottleControlled then @@ -124,7 +124,7 @@ function addCallback(body, priority, callbacks) callback.body = nil end else - warn(newPriority) + warn("error in callback:\n" .. newPriority) callback.body = nil end end From cca6dedb06fcc42ddf452d592d4c1a79f145bd12 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 17 Oct 2024 14:00:58 +0300 Subject: [PATCH 051/108] Let go of vessel controls on lua processor shutdown --- src/kOS/Lua/init.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua index e94fdab8fa..d6d829fd8c 100644 --- a/src/kOS/Lua/init.lua +++ b/src/kOS/Lua/init.lua @@ -1,3 +1,10 @@ +stateFinalizer = setmetatable({}, { __gc = function() -- Called when the state is disposed(on shutdown, reboot) + toggleflybywire("steering", false) + toggleflybywire("throttle", false) + toggleflybywire("wheelSteering", false) + toggleflybywire("wheelThrottle", false) +end}) + function _onFixedUpdate() runProcessControl() runCallbacks(fixedUpdateCallbacks) From 0cf331a7d43b3567b0473b8fc445033bba544c87 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 17 Oct 2024 14:37:42 +0300 Subject: [PATCH 052/108] Remove lua instruction debt It is near impossible to prevent instruction "cheating"(without limiting functionality), so any attempts are just adding unnecessary complexity. Especially the instruction debt system as its only ever used with one default library function as far as I know --- src/kOS/Lua/LuaInterpreter.cs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 4575440054..86e5c55a51 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -48,7 +48,6 @@ private class ExecInfo public readonly Queue CommandsQueue = new Queue(); public int InstructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; public int InstructionsThisUpdate = 0; - public int InstructionsDebt = 0; public bool BreakExecution = false; public int BreakExecutionCount = 0; public readonly KeraLua.Lua CommandCoroutine; @@ -121,9 +120,9 @@ private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) || (execInfo.CommandCoroutine.Handle == L && (execInfo.Shared.Cpu as LuaCPU).IsYielding())) { // it's possible for a C/CSharp function to call lua making a coroutine unable to yield because - // of the "C-call boundary". If that is the case we increase InstructionsDebt and its paid up on next fixed updates - if (state.IsYieldable) state.Yield(0); - else execInfo.InstructionsDebt++; + // of the "C-call boundary". + if (state.IsYieldable) + state.Yield(0); } } @@ -210,10 +209,6 @@ public void KOSFixedUpdate(double dt) execInfo.BreakExecutionCount = 0; } - var instructionsDebtPayment = Math.Min(execInfo.InstructionsPerUpdate - execInfo.InstructionsThisUpdate, execInfo.InstructionsDebt); - execInfo.InstructionsDebt -= instructionsDebtPayment; - execInfo.InstructionsThisUpdate += instructionsDebtPayment; - // running commands here but resetting InstructionsThisUpdate after, so commands have the lowest priority // here InstructionsThisUpdate is more like InstructionsThatUpdate if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate && !(Shared.Cpu as LuaCPU).IsYielding()) From e71a0e1585df1a270e38ba5b89770ed559e8f2a7 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 17 Oct 2024 15:39:47 +0300 Subject: [PATCH 053/108] Add helper functions to make vecDraws update automatically Make kos VECDRAW, CLEARVECDRAWS functions accessible only with all capital name Create vecDraw, clearVecDraws functions that add/remove vecDraws updater callback when needed The difference from VECDRAW is vecDraw will disappear when garbage collected --- src/kOS/Lua/Binding.cs | 8 ++++- src/kOS/Lua/init.lua | 82 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 7450446e3d..c0a25ae2e1 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -32,6 +32,7 @@ public static class Binding typeof(Vector), typeof(Direction), typeof(TimeSpan), typeof(TimeStamp) }; private static readonly string[] controlVariables = { "STEERING", "THROTTLE", "WHEELSTEERING", "WHEELTHROTTLE" }; + private static readonly string[] capitalNameOnlyVariables = { "VECDRAW", "CLEARVECDRAWS" }; // the CSharp object to userdata binding model was adapted from NLua model // with some simplifications and changes to make it work on Structures @@ -138,6 +139,9 @@ private static int EnvIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var index = state.ToString(2); var binding = bindings[state.MainThread.Handle]; + var isCapitalOnlyNameVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); + if (isCapitalOnlyNameVariableNotCapital) + return 0; if (binding.Variables.TryGetValue(index, out var boundVar)) { return (int)LuaExceptionCatch(() => @@ -155,8 +159,10 @@ private static int EnvNewIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; var index = state.ToString(2); + var isCapitalOnlyNameVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); var isControlVariable = controlVariables.Contains(index.ToUpper()) && !controlVariables.Contains(index); - if (!isControlVariable && binding.Variables.TryGetValue(index, out var boundVar) && boundVar.Set != null) + if (!isControlVariable && binding.Variables.TryGetValue(index, out var boundVar) && boundVar.Set != null + && !isCapitalOnlyNameVariableNotCapital) { var newValue = ToCSharpObject(state, 3, binding); if (newValue == null) return 0; diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua index d6d829fd8c..4de37278e0 100644 --- a/src/kOS/Lua/init.lua +++ b/src/kOS/Lua/init.lua @@ -167,3 +167,85 @@ function on(state, body, priority, callbacks) end end, priority, callbacks) end + +vecDraws = setmetatable({}, { __mode = "v" }) +updatingVecDraws = setmetatable({}, { __mode = "v" }) + +function clearVecDraws() + CLEARVECDRAWS() + for _,vd in pairs(vecDraws) do + vd.parameters.show = false + end + updatingVecDraws.keepCallback = false + updatingVecDraws = setmetatable({}, { __mode = "v" }) +end + +local vecDrawMetatable = { + __index = function(vd, index) + return vd.parameters[index] == nil and vd.structure[index] or vd.parameters[index] + end, + __newindex = function(vd, index, value) + local parameters = vd.parameters + if type(value) ~= "function" then vd.structure[index] = value end + if parameters[index] == nil then return end + parameters[index] = value + + if index == "start" then vd.isStartFunction = type(value) == "function" + elseif index == "vector" then vd.isVectorFunction = type(value) == "function" + elseif index == "color" then vd.isColorFunction = type(value) == "function" end + + local vdShouldBeUpdating = parameters.show and (vd.isStartFunction or vd.isVectorFunction or vd.isColorFunction) + local vdUpdating = false + + for i,v in ipairs(updatingVecDraws) do + if v == vd then + vdUpdating = true + if not vdShouldBeUpdating then + table.remove(updatingVecDraws, i) + if #updatingVecDraws == 0 then + updatingVecDraws.keepCallback = false + end + end + break + end + end + + if vdShouldBeUpdating and not vdUpdating then + if #updatingVecDraws == 0 then + updatingVecDraws.keepCallback = true + addCallback(function() + for _, vd in ipairs(updatingVecDraws) do + if vd.isStartFunction then vd.structure.start = vd.parameters.start() end + if vd.isVectorFunction then vd.structure.vector = vd.parameters.vector() end + if vd.isColorFunction then vd.structure.color = vd.parameters.color() end + end + return updatingVecDraws.keepCallback + end, 0, updateCallbacks) + end + table.insert(updatingVecDraws, vd) + end + end, + __gc = function(vd) vd.show = false end, +} + +function vecDraw(start, vector, color, label, scale, show, width, pointy, wiping) + local vd = { + structure = VECDRAW(v(0,0,0), v(0,0,0), white, label or "", scale or 1, show ~= nil and show, width or 0.2, pointy == nil or pointy, wiping == nil or wiping), + isStartFunction = false, + isVectorFunction = false, + isColorFunction = false, + parameters = { + start = v(0,0,0), + vector = v(0,0,0), + color = white, + show = false, + } + } + setmetatable(vd, vecDrawMetatable) + table.insert(vecDraws, vd) + if start then vd.start = start end + if vector then vd.vector = vector end + if color then vd.color = color end + if show then vd.show = show end + return vd +end \ No newline at end of file From 684d9ef762c0ef23254d08449a7d3ebb147eb70c Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 17 Oct 2024 15:57:07 +0300 Subject: [PATCH 054/108] Drop NLua --- src/kOS/Lua/LuaInterpreter.cs | 49 ++++++++++++++--------------------- src/kOS/kOS.csproj | 3 --- src/kOS/packages.config | 1 - 3 files changed, 20 insertions(+), 33 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 86e5c55a51..153d26d1d4 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -1,20 +1,11 @@ -using JetBrains.Annotations; using System; using System.Collections.Generic; -using System.Linq; using System.Text; -using System.Threading.Tasks; -using UnityEngine; -using Unity; -using System.Net; using System.IO; using System.Reflection; -using System.CodeDom; -using NLua; using KeraLua; using kOS.Safe; using kOS.Safe.Utilities; -using Debug = UnityEngine.Debug; using kOS.Safe.Screen; using kOS.Safe.Persistence; @@ -22,7 +13,7 @@ namespace kOS.Lua { public class LuaInterpreter : IInterpreter, IFixedUpdateObserver, IUpdateObserver { - private NLua.Lua state; + private KeraLua.Lua state; private KeraLua.Lua commandCoroutine; private KeraLua.Lua fixedUpdateCoroutine; private KeraLua.Lua updateCoroutine; @@ -69,19 +60,18 @@ public void Boot() Dispose(); Shared.UpdateHandler.AddFixedObserver(this); Shared.UpdateHandler.AddObserver(this); - state = new NLua.Lua(); - state.State.Encoding = Encoding.UTF8; - commandCoroutine = state.State.NewThread(); - fixedUpdateCoroutine = state.State.NewThread(); - updateCoroutine = state.State.NewThread(); + state = new KeraLua.Lua(); + state.Encoding = Encoding.UTF8; + commandCoroutine = state.NewThread(); + fixedUpdateCoroutine = state.NewThread(); + updateCoroutine = state.NewThread(); commandCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); fixedUpdateCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); updateCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); - stateInfo.Add(state.State.MainThread.Handle, new ExecInfo(Shared, commandCoroutine)); + stateInfo.Add(state.MainThread.Handle, new ExecInfo(Shared, commandCoroutine)); using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { - try { state.DoString(streamReader.ReadToEnd(), "init"); } - catch (Exception e) { DisplayError(e.Message); } + ProcessCommand(streamReader.ReadToEnd(), "init"); } Binding.BindToState(commandCoroutine, Shared); @@ -130,7 +120,8 @@ private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) private void ProcessCommand(string commandText, string commandName) { - var execInfo = stateInfo[state.State.MainThread.Handle]; + if (state == null) return; + var execInfo = stateInfo[state.MainThread.Handle]; execInfo.CommandsQueue.Enqueue(new CommandInfo(commandText, commandName)); } @@ -169,7 +160,7 @@ public bool IsWaitingForCommand() public void BreakExecution() { if (state == null) return; - var execInfo = stateInfo[state.State.MainThread.Handle]; + var execInfo = stateInfo[state.MainThread.Handle]; execInfo.BreakExecution = true; execInfo.BreakExecutionCount++; } @@ -202,10 +193,10 @@ public void KOSFixedUpdate(double dt) Shared.SoundMaker.BeginFileSound("beep"); Shared.Screen.Print("Ctrl+C was pressed 3 times while the processor was using all of the available instructions so "+ "update callbacks were set to nil. To reset callbacks do:\n\"setUpdateCallbacks()\"."); - state.State.PushNil(); - state.State.SetGlobal("onFixedUpdate"); - state.State.PushNil(); - state.State.SetGlobal("onUpdate"); + state.PushNil(); + state.SetGlobal("onFixedUpdate"); + state.PushNil(); + state.SetGlobal("onUpdate"); execInfo.BreakExecutionCount = 0; } @@ -219,7 +210,7 @@ public void KOSFixedUpdate(double dt) { if (commandCoroutine.Status == LuaStatus.Yield || LoadCommand(execInfo.CommandsQueue.Dequeue())) { - var status = commandCoroutine.Resume(state.State, 0); + var status = commandCoroutine.Resume(state, 0); if (status == LuaStatus.Yield) break; if (status != LuaStatus.OK) { @@ -243,7 +234,7 @@ public void KOSFixedUpdate(double dt) { if (fixedUpdateCoroutine.LoadString("onBreakExecution()", "breakExecution") == LuaStatus.OK) { - var status = fixedUpdateCoroutine.Resume(state.State, 0); + var status = fixedUpdateCoroutine.Resume(state, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) DisplayError(fixedUpdateCoroutine.ToString(-1), fixedUpdateCoroutine); } @@ -257,7 +248,7 @@ public void KOSFixedUpdate(double dt) { if (fixedUpdateCoroutine.LoadString($"onFixedUpdate({dt})", "fixedUpdate") == LuaStatus.OK) { - var status = fixedUpdateCoroutine.Resume(state.State, 0); + var status = fixedUpdateCoroutine.Resume(state, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) { DisplayError(fixedUpdateCoroutine.ToString(-1) @@ -282,7 +273,7 @@ public void KOSUpdate(double dt) { if (updateCoroutine.LoadString($"onUpdate({dt})", "update") == LuaStatus.OK) { - var status = updateCoroutine.Resume(state.State, 0); + var status = updateCoroutine.Resume(state, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) { DisplayError(updateCoroutine.ToString(-1) @@ -300,7 +291,7 @@ public void Dispose() if (state == null) return; Shared.UpdateHandler.RemoveFixedObserver(this); Shared.UpdateHandler.RemoveObserver(this); - var stateHandle = state.State.MainThread.Handle; + var stateHandle = state.MainThread.Handle; state.Dispose(); stateInfo.Remove(stateHandle); Binding.bindings.Remove(stateHandle); diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index b50eabe60e..ae78168c97 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -273,9 +273,6 @@ ..\..\packages\KeraLua.1.4.1\lib\net46\KeraLua.dll - - ..\..\packages\NLua.1.7.3\lib\net46\NLua.dll - diff --git a/src/kOS/packages.config b/src/kOS/packages.config index ca8ed3ac9c..56a5e0769c 100644 --- a/src/kOS/packages.config +++ b/src/kOS/packages.config @@ -1,6 +1,5 @@  - \ No newline at end of file From 17169d07403c13e49062d2108e2fdc424aa5b688 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 17 Oct 2024 17:07:01 +0300 Subject: [PATCH 055/108] Higher max lua IPU and default lua IPU --- src/kOS/Module/kOSCustomParameters.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/kOS/Module/kOSCustomParameters.cs b/src/kOS/Module/kOSCustomParameters.cs index e8f89c0e6d..b7bec24f33 100644 --- a/src/kOS/Module/kOSCustomParameters.cs +++ b/src/kOS/Module/kOSCustomParameters.cs @@ -68,8 +68,8 @@ public int InstructionsPerUpdate } private const int luaIpuMin = 150; - private const int luaIpuMax = 2000; - private int luaInstructionsPerUpdate = 200; + private const int luaIpuMax = 3000; + private int luaInstructionsPerUpdate = 300; [GameParameters.CustomIntParameterUI("Lua instructions per update", minValue = luaIpuMin, maxValue = luaIpuMax, toolTip = "Maximum number of instructions used per physics tick by CPUs using lua")] From 0e3b419a22a546dfee7703197432d857bfd6a5f0 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 17 Oct 2024 19:49:19 +0300 Subject: [PATCH 056/108] Remove libraries and basic library functions that access the "real world" --- src/kOS/Lua/LibraryOpenMethods.cs | 50 +++++++++++++++++++++++++++++++ src/kOS/Lua/LuaFunctions.cs | 32 ++++++++++++++++---- src/kOS/Lua/LuaInterpreter.cs | 10 ++++++- src/kOS/kOS.csproj | 1 + 4 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 src/kOS/Lua/LibraryOpenMethods.cs diff --git a/src/kOS/Lua/LibraryOpenMethods.cs b/src/kOS/Lua/LibraryOpenMethods.cs new file mode 100644 index 0000000000..00d1cbb7ca --- /dev/null +++ b/src/kOS/Lua/LibraryOpenMethods.cs @@ -0,0 +1,50 @@ +using System.Runtime.InteropServices; +using lua_State = System.IntPtr; + +namespace kOS.Lua +{ + internal static class LibraryOpenMethods + { + #if __IOS__ || __TVOS__ || __WATCHOS__ || __MACCATALYST__ + private const string LuaLibraryName = "@rpath/liblua54.framework/liblua54"; + #elif __ANDROID__ + private const string LuaLibraryName = "liblua54.so"; + #elif __MACOS__ + private const string LuaLibraryName = "liblua54.dylib"; + #elif WINDOWS_UWP + private const string LuaLibraryName = "lua54.dll"; + #else + private const string LuaLibraryName = "lua54"; + #endif + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_base(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_package(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_coroutine(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_table(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_io(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_os(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_string(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_math(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_utf8(lua_State luaState); + + [DllImport(LuaLibraryName, CallingConvention = CallingConvention.Cdecl)] + internal static extern int luaopen_debug(lua_State luaState); + } +} \ No newline at end of file diff --git a/src/kOS/Lua/LuaFunctions.cs b/src/kOS/Lua/LuaFunctions.cs index 9463eeade3..6e9b5b5b8a 100644 --- a/src/kOS/Lua/LuaFunctions.cs +++ b/src/kOS/Lua/LuaFunctions.cs @@ -14,11 +14,12 @@ public static class LuaFunctions public static void Add(KeraLua.Lua state) { AddFunction(state, "type", Type); - AddFunction(state, "print", KosPrint); - AddFunction(state, "warn", Warn); + AddFunction(state, "print", KosPrint, false); + AddFunction(state, "warn", Warn, false); AddFunction(state, "wait", Wait); - AddFunction(state, "loadfile", LoadFile); - AddFunction(state, "dofile", DoFile); + AddFunction(state, "load", Load, false); + AddFunction(state, "loadfile", LoadFile, false); + AddFunction(state, "dofile", DoFile, false); AddFunction(state, "getchar", GetChar); } @@ -89,12 +90,31 @@ private static int Wait(IntPtr L) return 0; } + private static int Load(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var chunk = state.CheckString(1); + var chunkName = state.OptString(2, "chunk"); + if (state.LoadString(chunk, chunkName) != LuaStatus.OK) + { + state.PushNil(); + state.PushCopy(-2); + return 2; + } + if (!state.IsNoneOrNil(4)) + { + state.PushCopy(4); + if (state.SetUpValue(-2, 1) == null) + state.Pop(1); + } + return 1; + } + private static int LoadFile(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); state.CheckString(1); var filePath = state.ToString(1); - var mode = state.OptString(2, "bt"); var shared = Binding.bindings[state.MainThread.Handle].Shared; var file = shared.VolumeMgr.CurrentVolume.Open(filePath) as VolumeFile; if (file == null) @@ -103,7 +123,7 @@ private static int LoadFile(IntPtr L) state.PushString($"File '{filePath}' not found"); return 2; } - if (state.LoadBuffer(state.Encoding.GetBytes(file.ReadAll().String), file.Path.ToString(), mode) != LuaStatus.OK) + if (state.LoadString(file.ReadAll().String, file.Path.ToString()) != LuaStatus.OK) { state.PushNil(); state.PushCopy(-2); diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 153d26d1d4..344ec6197a 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -60,8 +60,16 @@ public void Boot() Dispose(); Shared.UpdateHandler.AddFixedObserver(this); Shared.UpdateHandler.AddObserver(this); - state = new KeraLua.Lua(); + state = new KeraLua.Lua(false); state.Encoding = Encoding.UTF8; + + state.RequireF("_G", LibraryOpenMethods.luaopen_base, true); + state.RequireF("coroutine", LibraryOpenMethods.luaopen_coroutine, true); + state.RequireF("string", LibraryOpenMethods.luaopen_string, true); + state.RequireF("utf8", LibraryOpenMethods.luaopen_utf8, true); + state.RequireF("table", LibraryOpenMethods.luaopen_table, true); + state.RequireF("math", LibraryOpenMethods.luaopen_math, true); + commandCoroutine = state.NewThread(); fixedUpdateCoroutine = state.NewThread(); updateCoroutine = state.NewThread(); diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index ae78168c97..437f01042d 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -81,6 +81,7 @@ + From afe52115c9336c8747312aa99f904b393165bf7d Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 18 Oct 2024 19:07:30 +0300 Subject: [PATCH 057/108] Run commands after onFixedUpdate, make commands take priority over onUpdate callback --- src/kOS/Lua/LuaInterpreter.cs | 79 ++++++++++++++++------------------- 1 file changed, 35 insertions(+), 44 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 344ec6197a..5016a2ed5c 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -161,7 +161,6 @@ public bool IsCommandComplete(string commandText) public bool IsWaitingForCommand() { return !(Shared.Cpu as LuaCPU).IsYielding() && fixedUpdateCoroutine.Status != LuaStatus.Yield - && updateCoroutine.Status != LuaStatus.Yield && commandCoroutine.Status != LuaStatus.Yield; } @@ -175,7 +174,7 @@ public void BreakExecution() public int InstructionsThisUpdate() { // ProcessElectricity() calls this after changing interpreter when stuff is not initialized yet - if (commandCoroutine != null && stateInfo.TryGetValue(commandCoroutine.MainThread.Handle, out var info)) + if (state != null && stateInfo.TryGetValue(state.MainThread.Handle, out var info)) return info.InstructionsThisUpdate; return 0; } @@ -185,50 +184,8 @@ public void KOSFixedUpdate(double dt) (Shared.Cpu as LuaCPU).FixedUpdate(); Shared.BindingMgr?.PreUpdate(); - // run commands with remaining instructions from previous onFixedUpdate, onUpdate callbacks - // reset InstructionsThisUpdate - // run onFixedUpdate callback - // if KOSUpdate got called run onUpdate callback - var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; execInfo.InstructionsPerUpdate = SafeHouse.Config.LuaInstructionsPerUpdate; - - if (fixedUpdateCoroutine.Status != LuaStatus.Yield && updateCoroutine.Status != LuaStatus.Yield) - execInfo.BreakExecutionCount = 0; - - if (execInfo.BreakExecutionCount >= 3) - { - Shared.SoundMaker.BeginFileSound("beep"); - Shared.Screen.Print("Ctrl+C was pressed 3 times while the processor was using all of the available instructions so "+ - "update callbacks were set to nil. To reset callbacks do:\n\"setUpdateCallbacks()\"."); - state.PushNil(); - state.SetGlobal("onFixedUpdate"); - state.PushNil(); - state.SetGlobal("onUpdate"); - execInfo.BreakExecutionCount = 0; - } - - // running commands here but resetting InstructionsThisUpdate after, so commands have the lowest priority - // here InstructionsThisUpdate is more like InstructionsThatUpdate - if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate && !(Shared.Cpu as LuaCPU).IsYielding()) - { - // resumes the coroutine after it yielded due to running out of instructions - // and/or executes queued commands until they run out or the coroutine yields - while (commandCoroutine.Status == LuaStatus.Yield || execInfo.CommandsQueue.Count > 0) - { - if (commandCoroutine.Status == LuaStatus.Yield || LoadCommand(execInfo.CommandsQueue.Dequeue())) - { - var status = commandCoroutine.Resume(state, 0); - if (status == LuaStatus.Yield) break; - if (status != LuaStatus.OK) - { - DisplayError(commandCoroutine.ToString(-1), commandCoroutine); - commandCoroutine.ResetThread(); - } - } - } - } - execInfo.InstructionsThisUpdate = 0; if (execInfo.BreakExecution) @@ -267,6 +224,40 @@ public void KOSFixedUpdate(double dt) } } } + + if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate) + execInfo.BreakExecutionCount = 0; + + if (execInfo.BreakExecutionCount >= 3) + { + Shared.SoundMaker.BeginFileSound("beep"); + Shared.Screen.Print("Ctrl+C was pressed 3 times while the processor was using all of the available instructions so "+ + "update callbacks were set to nil. To reset callbacks do:\n\"setUpdateCallbacks()\"."); + state.PushNil(); + state.SetGlobal("onFixedUpdate"); + state.PushNil(); + state.SetGlobal("onUpdate"); + execInfo.BreakExecutionCount = 0; + } + + if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate && !(Shared.Cpu as LuaCPU).IsYielding()) + { + // resumes the coroutine after it yielded due to running out of instructions + // and/or executes queued commands until they run out or the coroutine yields + while (commandCoroutine.Status == LuaStatus.Yield || execInfo.CommandsQueue.Count > 0) + { + if (commandCoroutine.Status == LuaStatus.Yield || LoadCommand(execInfo.CommandsQueue.Dequeue())) + { + var status = commandCoroutine.Resume(state, 0); + if (status == LuaStatus.Yield) break; + if (status != LuaStatus.OK) + { + DisplayError(commandCoroutine.ToString(-1), commandCoroutine); + commandCoroutine.ResetThread(); + } + } + } + } } public void KOSUpdate(double dt) From 1c99d709ab7c2a9042dfde07c35bf2ec98086897 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 19 Oct 2024 11:47:26 +0300 Subject: [PATCH 058/108] Error on attempt to hide a built-in variable when config.clobberBuiltIns is false --- src/kOS/Lua/Binding.cs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index c0a25ae2e1..a924e7871a 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -139,8 +139,8 @@ private static int EnvIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var index = state.ToString(2); var binding = bindings[state.MainThread.Handle]; - var isCapitalOnlyNameVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); - if (isCapitalOnlyNameVariableNotCapital) + var isCapitalNameOnlyVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); + if (isCapitalNameOnlyVariableNotCapital) return 0; if (binding.Variables.TryGetValue(index, out var boundVar)) { @@ -159,11 +159,23 @@ private static int EnvNewIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var binding = bindings[state.MainThread.Handle]; var index = state.ToString(2); - var isCapitalOnlyNameVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); + var isCapitalNameOnlyVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); var isControlVariable = controlVariables.Contains(index.ToUpper()) && !controlVariables.Contains(index); - if (!isControlVariable && binding.Variables.TryGetValue(index, out var boundVar) && boundVar.Set != null - && !isCapitalOnlyNameVariableNotCapital) + if (!isControlVariable && !isCapitalNameOnlyVariableNotCapital + && binding.Variables.TryGetValue(index, out var boundVar)) { + if (boundVar.Set == null) + { + if (SafeHouse.Config.AllowClobberBuiltIns) + { + state.RawSet(1); + return 0; + } + return state.Error($"Attempt to assign to a built-in variable({index}) that doesn't have a setter.\n"+ + "If you really want to be able to \"hide\" a built-in variable behind a user "+ + "variable you can \"rawset(_ENV, *variableName*, *value*)\" or allow it globally " + +"with \"config.clobberBuiltIns = true\""); + } var newValue = ToCSharpObject(state, 3, binding); if (newValue == null) return 0; LuaExceptionCatch(() => boundVar.Value = newValue, state); From 7e6ee20b1e05c250e12bf22ba8802403d6df6d12 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 19 Oct 2024 13:44:11 +0300 Subject: [PATCH 059/108] Lua error when trying to set structure suffix that doesn't exist --- src/kOS.Safe/Encapsulation/Structure.cs | 7 +++---- src/kOS/Lua/Types/KSStructure.cs | 6 +++++- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/kOS.Safe/Encapsulation/Structure.cs b/src/kOS.Safe/Encapsulation/Structure.cs index 3027491585..d3e84755c9 100644 --- a/src/kOS.Safe/Encapsulation/Structure.cs +++ b/src/kOS.Safe/Encapsulation/Structure.cs @@ -132,13 +132,12 @@ private static IDictionary GetStaticSuffixesForType(Type curren /// /// Set a suffix of this structure that has suffixName to the given value. - /// If failOkay is false then it will throw exception if it fails to find the suffix. - /// If failOkay is true then it will continue happily if it fails to find the suffix. + /// Throws an exception if the structure suffix doesn't have a setter, unless failOkay /// /// /// - /// - /// false if failOkay was true and it failed to find the suffix + /// If true and structure suffix doesn't have a setter return false instead of throwing an exception + /// false if failed to find the suffix, true otherwise public virtual bool SetSuffix(string suffixName, object value, bool failOkay = false) { callInitializeSuffixes(); diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index ac7028e76e..a217452dc9 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -176,7 +176,11 @@ private static int StructureNewIndex(IntPtr L) else { var index = state.ToString(2); - Binding.LuaExceptionCatch(() => structure.SetSuffix(index, Structure.FromPrimitive(newValue)), state); + Binding.LuaExceptionCatch(() => + { + if (!structure.SetSuffix(index, Structure.FromPrimitive(newValue))) + throw new Exception($"Suffix \"{index}\" not found on Structure {structure.KOSName}"); + }, state); } return 0; } From 4788d7a3224ec956ce108ecae77d1e0c00faacc0 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 31 Oct 2024 15:23:28 +0300 Subject: [PATCH 060/108] Whitelist libraries and globals, do initialization from LuaFunctions.cs and init.lua in form of libraries --- src/kOS/Lua/Binding.cs | 14 +- src/kOS/Lua/Libraries.cs | 119 +++++++++ src/kOS/Lua/{LuaFunctions.cs => Libs/Base.cs} | 154 ++++++++--- src/kOS/Lua/Libs/Callbacks.cs | 24 ++ src/kOS/Lua/Libs/Dev.cs | 67 +++++ src/kOS/Lua/Libs/Misc.cs | 24 ++ src/kOS/Lua/Libs/callbacks.lua | 182 +++++++++++++ src/kOS/Lua/Libs/misc.lua | 90 +++++++ src/kOS/Lua/LuaInterpreter.cs | 49 ++-- ...LibraryOpenMethods.cs => NativeMethods.cs} | 2 +- src/kOS/Lua/Types/KSFunction.cs | 16 +- src/kOS/Lua/Types/KSStructure.cs | 59 ++-- src/kOS/Lua/Types/LuaTypeBase.cs | 7 + src/kOS/Lua/init.lua | 251 ------------------ src/kOS/Lua/whitelist.lua | 129 +++++++++ src/kOS/kOS.csproj | 14 +- 16 files changed, 826 insertions(+), 375 deletions(-) create mode 100644 src/kOS/Lua/Libraries.cs rename src/kOS/Lua/{LuaFunctions.cs => Libs/Base.cs} (52%) create mode 100644 src/kOS/Lua/Libs/Callbacks.cs create mode 100644 src/kOS/Lua/Libs/Dev.cs create mode 100644 src/kOS/Lua/Libs/Misc.cs create mode 100644 src/kOS/Lua/Libs/callbacks.lua create mode 100644 src/kOS/Lua/Libs/misc.lua rename src/kOS/Lua/{LibraryOpenMethods.cs => NativeMethods.cs} (97%) delete mode 100644 src/kOS/Lua/init.lua create mode 100644 src/kOS/Lua/whitelist.lua diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index a924e7871a..3beb3b7f0e 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -88,29 +88,23 @@ public static void BindToState(KeraLua.Lua state, SharedObjects shared) (shared.FunctionManager as FunctionManager).RawFunctions ); - LuaFunctions.Add(state); - // set index and newindex metamethods on the environment table state.PushGlobalTable(); state.NewTable(); - state.PushString("__index"); state.PushCFunction(EnvIndex); - state.SetTable(-3); - state.PushString("__newindex"); + state.SetField(-2, "__index"); state.PushCFunction(EnvNewIndex); - state.SetTable(-3); + state.SetField(-2, "__newindex"); state.SetMetaTable(-2); state.Pop(1); // add userdataAddressToUserdata table to the registry - state.PushString("userdataAddressToUserdata"); state.NewTable(); state.NewTable(); - state.PushString("__mode"); state.PushString("v"); - state.SetTable(-3); + state.SetField(-2, "__mode"); state.SetMetaTable(-2); - state.SetTable((int)LuaRegistry.Index); + state.SetField((int)LuaRegistry.Index, "userdataAddressToUserdata"); } public static int CollectObject(IntPtr L) diff --git a/src/kOS/Lua/Libraries.cs b/src/kOS/Lua/Libraries.cs new file mode 100644 index 0000000000..0cc9f2d82c --- /dev/null +++ b/src/kOS/Lua/Libraries.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using KeraLua; +using Debug = UnityEngine.Debug; + +namespace kOS.Lua +{ + public static class Libraries + { + private static readonly RegList whitelistedLibraries = new RegList + { + {"_G", Libs.Base.Open}, + {"coroutine", NativeMethods.luaopen_coroutine}, + {"string", NativeMethods.luaopen_string}, + {"utf8", NativeMethods.luaopen_utf8}, + {"table", NativeMethods.luaopen_table}, + {"math", NativeMethods.luaopen_math}, + }; + + private static readonly RegList luaLibraries = new RegList + { + {"callbacks", Libs.Callbacks.Open}, + {"misc", Libs.Misc.Open}, + }; + + private static readonly RegList devLibraries = new RegList + { + {"debug", NativeMethods.luaopen_debug}, + {"dev", Libs.Dev.Open}, + }; + + public static void Open(KeraLua.Lua state) + { + /* + the goal here is to remove the ability of lua scripts to be malicious and make it simpler to keep it that way + it is achieved by: + 1. Opening only whitelisted libraries + 2. Overwriting the registry global environment table and loaded libraries table with tables that + include only whitelisted fields + 3. Recursively removing every field in the previous global environment table and the loaded libraries table + for an extra layer of protection in case the table or its inner tables are saved anywhere else + + this means that even if some potentially dangerous lua library/function gets added it would need + to be explicitly added in the whitelist to be accessible by lua scripts + */ + + // require dummy library to check if "_LOADED" registry key is used for loaded libraries(LUA_LOADED_TABLE definition) + state.RequireF("_dummy", DummyOpen, false); + state.Pop(1); + if (state.GetField((int)LuaRegistry.Index, "_LOADED") != LuaType.Table) + throw new Exception("Loaded libraries table was not found at *registry*._LOADED"); + state.Pop(1); + + // open whitelisted libraries + foreach (var library in whitelistedLibraries) + { + state.PushCFunction(library.function); + state.PushString(library.name); + state.Call(1, 1); + state.SetGlobal(library.name); + } + + // push 3 values onto the stack: new env table, new loaded table, deepCleanTable function + using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.whitelist.lua"))) + { + state.LoadString(streamReader.ReadToEnd()); + } + state.Call(0, 3); + + // call the deepCleanTable function on the global table + state.PushCopy(-1); + if (state.RawGetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals) != LuaType.Table) + throw new Exception("Global table was not found at *registry*[LuaRegistryIndex.Globals]"); + state.Call(1, 0); + + // call the deepCleanTable function on the loaded table + state.GetField((int)LuaRegistry.Index, "_LOADED"); + state.Call(1, 0); + + // assign the loaded table to *registry*._LOADED + state.SetField((int)LuaRegistry.Index, "_LOADED"); + + // assign the env table to *registry*[LuaRegistryIndex.Globals] + state.RawSetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals); + state.GarbageCollector(LuaGC.Collect, 0); + + // open lua libraries + foreach (var library in luaLibraries) + { + state.RequireF(library.name, library.function,true); + state.Pop(1); + } + + // open dev libraries past the whitelist if built in debug configuration + #if DEBUG + Debug.LogWarning("LUA DEV LIBRARIES OPENED"); + foreach (var library in devLibraries) + { + state.RequireF(library.name, library.function,true); + state.Pop(1); + } + #endif + } + + private static int DummyOpen(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.NewTable(); + return 1; + } + } + + public class RegList : List + { + public void Add(string key, LuaFunction value) => Add(new LuaRegister { name = key, function = value }); + } +} \ No newline at end of file diff --git a/src/kOS/Lua/LuaFunctions.cs b/src/kOS/Lua/Libs/Base.cs similarity index 52% rename from src/kOS/Lua/LuaFunctions.cs rename to src/kOS/Lua/Libs/Base.cs index 6e9b5b5b8a..62a50d9911 100644 --- a/src/kOS/Lua/LuaFunctions.cs +++ b/src/kOS/Lua/Libs/Base.cs @@ -1,39 +1,121 @@ using KeraLua; -using kOS.Module; using System; -using System.Runtime.InteropServices; using kOS.Safe.Encapsulation; using kOS.Safe.Execution; using kOS.Safe.Persistence; -using Debug = UnityEngine.Debug; -namespace kOS.Lua +namespace kOS.Lua.Libs { - public static class LuaFunctions + public static class Base { - public static void Add(KeraLua.Lua state) + private static readonly RegList baseLib = new RegList { - AddFunction(state, "type", Type); - AddFunction(state, "print", KosPrint, false); - AddFunction(state, "warn", Warn, false); - AddFunction(state, "wait", Wait); - AddFunction(state, "load", Load, false); - AddFunction(state, "loadfile", LoadFile, false); - AddFunction(state, "dofile", DoFile, false); - AddFunction(state, "getchar", GetChar); - } + {"dofile", DoFile}, + {"load", Load}, + {"loadfile", LoadFile}, + {"print", Print}, + {"type", Type}, + {"warn", Warn}, + {"wait", Wait}, + {null, null} + }; - private static void AddFunction(KeraLua.Lua state, string name, LuaFunction function, bool saveOverwrittenValue = true) + public static int Open(IntPtr L) { - if (saveOverwrittenValue) + var state = KeraLua.Lua.FromIntPtr(L); + + // temporarily store the global table on the call stack + state.PushGlobalTable(); + + // temporarily replace global table for the native open method to dump its values there + state.NewTable(); + state.RawSetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals); + + state.PushCFunction(NativeMethods.luaopen_base); + /* + LUAMOD_API int luaopen_base (lua_State *L) { + /* open lib into global table * / + lua_pushglobaltable(L); + luaL_setfuncs(L, base_funcs, 0); + /* set global _G * / + lua_pushvalue(L, -1); + lua_setfield(L, -2, LUA_GNAME); + /* set global _VERSION * / + lua_pushliteral(L, LUA_VERSION); + lua_setfield(L, -2, "_VERSION"); + return 1; + } + */ + state.Call(0, 1); + + // restore the global table + state.Rotate(-2, 1); // global table <-> luaopen_base table + state.RawSetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals); + + // create LuaRegister list with whitelisted fields from luaopen_base table + var nativeFuncs = new RegList { - if (state.GetGlobal(name) != LuaType.Nil) - state.SetGlobal("_" + name); - else - state.Pop(1); + {"assert", null}, + {"collectgarbage", null}, + // {"dofile", luaB_dofile}, access to file system + {"error", null}, + {"getmetatable", null}, + {"ipairs", null}, + // {"loadfile", luaB_loadfile}, access to file system, loading binary chunks + // {"load", luaB_load}, access to file system, loading binary chunks + {"next", null}, + {"pairs", null}, + {"pcall", null}, + // {"print", luaB_print}, not used + // {"warn", luaB_warn}, not used + {"rawequal", null}, + {"rawlen", null}, + {"rawget", null}, + {"rawset", null}, + {"select", null}, + {"setmetatable", null}, + {"tonumber", null}, + {"tostring", null}, + {"type", null}, + {"xpcall", null}, + /* placeholders */ + {"_G", null}, + {"_VERSION", null}, + {null, null} + }; + for (int i = 0; i < nativeFuncs.Count - 1; i++) + { + var func = nativeFuncs[i]; + if (state.GetField(-1, func.name) == LuaType.Function) + { + nativeFuncs[i] = new LuaRegister { name = func.name, function = state.ToCFunction(-1) }; + } + state.Pop(1); } - state.PushCFunction(function); - state.SetGlobal(name); + + // add whitelisted fields to the global table + state.PushGlobalTable(); + state.SetFuncs(nativeFuncs.ToArray(), 0); + + // add _G table + state.PushGlobalTable(); + state.SetField(-2, "_G"); + + // add _VERSION from the luaopen_base table + state.GetField(-2, "_VERSION"); + state.SetField(-2, "_VERSION"); + + // remove the luaopen_base table from the stack + state.Remove(-2); + + // save the default type function at "_type" index + state.GetField(-1, "type"); + state.SetField(-2, "_type"); + + // add new functions + state.SetFuncs(baseLib.ToArray(), 0); + + return 1; } private static int Type(IntPtr L) @@ -54,7 +136,7 @@ private static int Type(IntPtr L) return 1; } - private static int KosPrint(IntPtr L) + private static int Print(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var argCount = state.GetTop(); @@ -81,15 +163,6 @@ private static int Warn(IntPtr L) return 0; } - private static int Wait(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - state.CheckNumber(1); - var shared = Binding.bindings[state.MainThread.Handle].Shared; - shared.Cpu.YieldProgram(new YieldFinishedGameTimer(state.ToNumber(1))); - return 0; - } - private static int Load(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); @@ -156,20 +229,13 @@ private static int DoFileContinuation(IntPtr L, int status, IntPtr ctx) return state.GetTop()-argCount; } - public static int GetChar(IntPtr L) - { - return GetCharContinuation(L, 0, IntPtr.Zero); - } - - private static int GetCharContinuation(IntPtr L, int status, IntPtr ctx) + private static int Wait(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); + state.CheckNumber(1); var shared = Binding.bindings[state.MainThread.Handle].Shared; - var q = shared.Screen.CharInputQueue; - if (q.Count == 0) - state.YieldK(0, 0, GetCharContinuation); - state.PushString(q.Dequeue().ToString()); - return 1; + shared.Cpu.YieldProgram(new YieldFinishedGameTimer(state.ToNumber(1))); + return 0; } } } \ No newline at end of file diff --git a/src/kOS/Lua/Libs/Callbacks.cs b/src/kOS/Lua/Libs/Callbacks.cs new file mode 100644 index 0000000000..b3b43b31c2 --- /dev/null +++ b/src/kOS/Lua/Libs/Callbacks.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using System.Reflection; + +namespace kOS.Lua.Libs +{ + public static class Callbacks + { + public static int Open(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.Libs.callbacks.lua"))) + { + state.LoadString(streamReader.ReadToEnd()); + } + state.Call(0, 1); + + state.GetField(-1, "init"); + state.Call(0, 0); + + return 1; + } + } +} \ No newline at end of file diff --git a/src/kOS/Lua/Libs/Dev.cs b/src/kOS/Lua/Libs/Dev.cs new file mode 100644 index 0000000000..bf40b35b18 --- /dev/null +++ b/src/kOS/Lua/Libs/Dev.cs @@ -0,0 +1,67 @@ +using KeraLua; +using System; + +namespace kOS.Lua.Libs +{ + public static class Dev + { + private static readonly RegList devLib = new RegList + { + {"getregistry", GetRegistry}, + {"getupvalues", GetUpvalues}, + {null, null} + }; + + public static int Open(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.PushGlobalTable(); + state.SetFuncs(devLib.ToArray(), 0); + return 1; + } + + private static int GetRegistry(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.PushCopy((int)LuaRegistry.Index); + return 1; + } + + // gets a table with all upvalues on the first function argument + // that are not a key in the second optional table argument + // returns sequence table of tables with name, upvalue, index fields + private static int GetUpvalues(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.CheckType(1, LuaType.Function); + if (state.Type(2) == LuaType.None) + state.NewTable(); + else + state.CheckType(2, LuaType.Table); + state.NewTable(); + for (int i = 1; ; i++) + { + var uvName = state.GetUpValue(1, i); + if (uvName == null) break; + state.PushCopy(-1); + if (state.RawGet(2) == LuaType.Nil) + { + state.Pop(1); + state.NewTable(); + state.Rotate(-2, 1); + state.SetField(-2, "upvalue"); + state.PushString(uvName); + state.SetField(-2, "name"); + state.PushInteger(i); + state.SetField(-2, "index"); + state.SetInteger(3, state.Length(3)+1); + } + else + { + state.Pop(2); + } + } + return 1; + } + } +} diff --git a/src/kOS/Lua/Libs/Misc.cs b/src/kOS/Lua/Libs/Misc.cs new file mode 100644 index 0000000000..24291b3606 --- /dev/null +++ b/src/kOS/Lua/Libs/Misc.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using System.Reflection; + +namespace kOS.Lua.Libs +{ + public static class Misc + { + public static int Open(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.Libs.misc.lua"))) + { + state.LoadString(streamReader.ReadToEnd()); + } + state.Call(0, 1); + + state.GetField(-1, "init"); + state.Call(0, 0); + + return 1; + } + } +} diff --git a/src/kOS/Lua/Libs/callbacks.lua b/src/kOS/Lua/Libs/callbacks.lua new file mode 100644 index 0000000000..e8ff906321 --- /dev/null +++ b/src/kOS/Lua/Libs/callbacks.lua @@ -0,0 +1,182 @@ +local M = {} + +function M.init() + M.breakcontrol() + M.fixedupdatecallbacks = {} + M.updatecallbacks = {} + fixedupdate = M.fixedupdate + update = M.update + breakexecution = M.breakexecution + addcallback = M.addcallback + when = M.when + on = M.on +end + +function M.kill() + fixedupdate = nil + update = nil + M.breakcontrol() + M.fixedupdatecallbacks = {} + M.updatecallbacks = {} +end + +function M.fixedupdate() + M.runcontrol() + M.runcallbacks(M.fixedupdatecallbacks) +end + +function M.update() + M.runcallbacks(M.updatecallbacks) +end + +function M.breakexecution() + M.breakcontrol() + M.fixedupdatecallbacks = {} + M.updatecallbacks = {} +end + +M.finalizer = setmetatable({}, { __gc = function() -- Called when the state is disposed(on shutdown, reboot) + toggleflybywire("steering", false) + toggleflybywire("throttle", false) + toggleflybywire("wheelsteering", false) + toggleflybywire("wheelthrottle", false) +end}) + +function M.breakcontrol() + steering, throttle, wheelsteering, wheelthrottle = nil, nil, nil, nil + M.controlled = {} +end + +function M.runcontrol() + if M.controlcoroutine then coroutine.resume(M.controlcoroutine) end + M.controlcoroutine = coroutine.create(M.processcontrol) + coroutine.resume(M.controlcoroutine) +end + +function M.processcontrol() + if rawget(_ENV, "steering") then + M.controlled.steering = true + local success, error = pcall(function() STEERING = type(steering) == "function" and steering() or steering end) + if not success then + warn(error, 1) + steering = nil + end + elseif M.controlled.steering then + M.controlled.steering = false + toggleflybywire("steering", false) + end + if rawget(_ENV, "throttle") then + M.controlled.throttle = true + local success, error = pcall(function() THROTTLE = type(throttle) == "function" and throttle() or throttle end) + if not success then + warn(error, 1) + throttle = nil + end + elseif M.controlled.throttle then + M.controlled.throttle = false + toggleflybywire("throttle", false) + end + if rawget(_ENV, "wheelsteering") then + M.controlled.wheelthrottle = true + local success, error = pcall(function() WHEELSTEERING = type(wheelsteering) == "function" and wheelsteering() or wheelsteering end) + if not success then + warn(error, 1) + wheelsteering = nil + end + elseif M.controlled.wheelthrottle then + M.controlled.wheelthrottle = false + toggleflybywire("wheelsteering", false) + end + if rawget(_ENV, "wheelthrottle") then + M.controlled.wheelthrottle = true + local success, error = pcall(function() WHEELTHROTTLE = type(wheelthrottle) == "function" and wheelthrottle() or wheelthrottle end) + if not success then + warn(error, 1) + wheelthrottle = nil + end + elseif M.controlled.wheelthrottle then + M.controlled.wheelthrottle = false + toggleflybywire("wheelthrottle", false) + end + M.controlcoroutine = nil +end + +function M.runcallbacks(callbacks) + if callbacks.continuation then + coroutine.resume(callbacks.continuation) + end + if callbacks.unsorted then + callbacks.continuation = coroutine.create(function() + table.sort(callbacks, function(a, b) return a.priority < b.priority end) + callbacks.unsorted = false + callbacks.continuation = nil + end) + coroutine.resume(callbacks.continuation) + end + for i=#callbacks,1,-1 do + local callback = callbacks[i] + if callback.coroutine then + coroutine.resume(callback.coroutine, callback) + else + if callback.body then + callback.coroutine = coroutine.create(callback.body) + coroutine.resume(callback.coroutine, callback) + else + table.remove(callbacks, i) + end + end + end +end + +function M.addcallback(body, priority, callbacks) + callbacks = callbacks or M.fixedupdatecallbacks + local callback = { + body = function(callback) + local success, newPriority = pcall(body, callback) + if not(newPriority == true or newPriority == callback.priority) then + if success then + callback.priority = tonumber(newPriority) + if callback.priority then + callbacks.unsorted = true + else + callback.body = nil + end + else + warn("error in callback:\n" .. newPriority) + callback.body = nil + end + end + callback.coroutine = nil + end, + priority = priority or 0 + } + table.insert(callbacks, callback) + callbacks.unsorted = true + return callback +end + +function M.when(condition, body, priority, callbacks) + return M.addcallback(function (callback) + if condition() then + return body() + else + return callback.priority + end + end, priority, callbacks) +end + +function M.on(state, body, priority, callbacks) + local previousState = state() + return M.addcallback(function (callback) + local currentState = state() + if currentState ~= previousState then + local newPriority = body() + previousState = currentState + return newPriority + else + return callback.priority + end + end, priority, callbacks) +end + +return M \ No newline at end of file diff --git a/src/kOS/Lua/Libs/misc.lua b/src/kOS/Lua/Libs/misc.lua new file mode 100644 index 0000000000..fc9a31d942 --- /dev/null +++ b/src/kOS/Lua/Libs/misc.lua @@ -0,0 +1,90 @@ +local M = {} + +function M.init() + vecdraw = M.vecdraw + clearvecdraws = M.clearvecdraws +end + +M.vecdraws = setmetatable({}, { __mode = "v" }) +M.updatingvecdraws = setmetatable({}, { __mode = "v" }) + +function M.clearvecdraws() + CLEARVECDRAWS() + for _,vd in pairs(M.vecdraws) do + vd.parameters.show = false + end + M.updatingvecdraws.keepCallback = false + M.updatingvecdraws = setmetatable({}, { __mode = "v" }) +end + +local vecdrawmt = { + __index = function(vd, index) + return vd.parameters[index] == nil and vd.structure[index] or vd.parameters[index] + end, + __newindex = function(vd, index, value) + local parameters = vd.parameters + if type(value) ~= "function" then vd.structure[index] = value end + if parameters[index] == nil then return end + parameters[index] = value + + if index == "start" then vd.isStartFunction = type(value) == "function" + elseif index == "vector" then vd.isVectorFunction = type(value) == "function" + elseif index == "color" then vd.isColorFunction = type(value) == "function" end + + local vdShouldBeUpdating = parameters.show and (vd.isStartFunction or vd.isVectorFunction or vd.isColorFunction) + local vdUpdating = false + + for i,v in ipairs(M.updatingvecdraws) do + if v == vd then + vdUpdating = true + if not vdShouldBeUpdating then + table.remove(M.updatingvecdraws, i) + if #M.updatingvecdraws == 0 then + M.updatingvecdraws.keepCallback = false + end + end + break + end + end + + if vdShouldBeUpdating and not vdUpdating then + if #M.updatingvecdraws == 0 then + M.updatingvecdraws.keepCallback = true + addcallback(function() + for _, vd in ipairs(M.updatingvecdraws) do + if vd.isStartFunction then vd.structure.start = vd.parameters.start() end + if vd.isVectorFunction then vd.structure.vector = vd.parameters.vector() end + if vd.isColorFunction then vd.structure.color = vd.parameters.color() end + end + return M.updatingvecdraws.keepCallback + end, 0, M.updatecallbacks) + end + table.insert(M.updatingvecdraws, vd) + end + end, + __gc = function(vd) vd.show = false end, +} + +function M.vecdraw(start, vector, color, label, scale, show, width, pointy, wiping) + local vd = { + structure = VECDRAW(v(0,0,0), v(0,0,0), white, label or "", scale or 1, show ~= nil and show, width or 0.2, pointy == nil or pointy, wiping == nil or wiping), + isStartFunction = false, + isVectorFunction = false, + isColorFunction = false, + parameters = { + start = v(0,0,0), + vector = v(0,0,0), + color = white, + show = false, + } + } + setmetatable(vd, vecdrawmt) + table.insert(M.vecdraws, vd) + if start then vd.start = start end + if vector then vd.vector = vector end + if color then vd.color = color end + if show then vd.show = show end + return vd +end + +return M \ No newline at end of file diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 5016a2ed5c..92a4a2b8a7 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -63,13 +63,6 @@ public void Boot() state = new KeraLua.Lua(false); state.Encoding = Encoding.UTF8; - state.RequireF("_G", LibraryOpenMethods.luaopen_base, true); - state.RequireF("coroutine", LibraryOpenMethods.luaopen_coroutine, true); - state.RequireF("string", LibraryOpenMethods.luaopen_string, true); - state.RequireF("utf8", LibraryOpenMethods.luaopen_utf8, true); - state.RequireF("table", LibraryOpenMethods.luaopen_table, true); - state.RequireF("math", LibraryOpenMethods.luaopen_math, true); - commandCoroutine = state.NewThread(); fixedUpdateCoroutine = state.NewThread(); updateCoroutine = state.NewThread(); @@ -78,12 +71,10 @@ public void Boot() updateCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); stateInfo.Add(state.MainThread.Handle, new ExecInfo(Shared, commandCoroutine)); - using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.init.lua"))) { - ProcessCommand(streamReader.ReadToEnd(), "init"); - } - - Binding.BindToState(commandCoroutine, Shared); - + Libraries.Open(state); + + Binding.BindToState(state, Shared); + if (!Shared.Processor.CheckCanBoot()) return; VolumePath path = Shared.Processor.BootFilePath; @@ -195,9 +186,9 @@ public void KOSFixedUpdate(double dt) commandCoroutine.ResetThread(); fixedUpdateCoroutine.ResetThread(); updateCoroutine.ResetThread(); - if (fixedUpdateCoroutine.GetGlobal("onBreakExecution") == LuaType.Function) + if (fixedUpdateCoroutine.GetGlobal("breakexecution") == LuaType.Function) { - if (fixedUpdateCoroutine.LoadString("onBreakExecution()", "breakExecution") == LuaStatus.OK) + if (fixedUpdateCoroutine.LoadString("breakexecution()", "breakexecution") == LuaStatus.OK) { var status = fixedUpdateCoroutine.Resume(state, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) @@ -206,21 +197,19 @@ public void KOSFixedUpdate(double dt) } } - // if onFixedUpdate failed to execute due to running out of instructions we reset and start over. - // it's up to lua side to figure out how to handle the reset in case it didn't finish the callback fixedUpdateCoroutine.ResetThread(); - if (fixedUpdateCoroutine.GetGlobal("onFixedUpdate") == LuaType.Function) + if (fixedUpdateCoroutine.GetGlobal("fixedupdate") == LuaType.Function) { - if (fixedUpdateCoroutine.LoadString($"onFixedUpdate({dt})", "fixedUpdate") == LuaStatus.OK) + if (fixedUpdateCoroutine.LoadString($"fixedupdate({dt})", "fixedupdate") == LuaStatus.OK) { var status = fixedUpdateCoroutine.Resume(state, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) { DisplayError(fixedUpdateCoroutine.ToString(-1) - +"\nonFixedUpdate function errored and was set to nil." - +"\nTo reset onFixedUpdate do 'onFixedUpdate = _onFixedUpdate'.", fixedUpdateCoroutine); + +"\nfixedupdate function errored and was set to nil." + +"\nTo reset fixedupdate do 'fixedupdate = callbacks.fixedupdate'.", fixedUpdateCoroutine); fixedUpdateCoroutine.PushNil(); - fixedUpdateCoroutine.SetGlobal("onFixedUpdate"); + fixedUpdateCoroutine.SetGlobal("fixedupdate"); } } } @@ -232,11 +221,11 @@ public void KOSFixedUpdate(double dt) { Shared.SoundMaker.BeginFileSound("beep"); Shared.Screen.Print("Ctrl+C was pressed 3 times while the processor was using all of the available instructions so "+ - "update callbacks were set to nil. To reset callbacks do:\n\"setUpdateCallbacks()\"."); + "update callbacks were set to nil. To reset callbacks do:\n\"callbacks.init()\"."); state.PushNil(); - state.SetGlobal("onFixedUpdate"); + state.SetGlobal("fixedupdate"); state.PushNil(); - state.SetGlobal("onUpdate"); + state.SetGlobal("update"); execInfo.BreakExecutionCount = 0; } @@ -268,18 +257,18 @@ public void KOSUpdate(double dt) if (execInfo.InstructionsThisUpdate >= execInfo.InstructionsPerUpdate) return; updateCoroutine.ResetThread(); - if (updateCoroutine.GetGlobal("onUpdate") == LuaType.Function) + if (updateCoroutine.GetGlobal("update") == LuaType.Function) { - if (updateCoroutine.LoadString($"onUpdate({dt})", "update") == LuaStatus.OK) + if (updateCoroutine.LoadString($"update({dt})", "update") == LuaStatus.OK) { var status = updateCoroutine.Resume(state, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) { DisplayError(updateCoroutine.ToString(-1) - +"\nonUpdate function errored and was set to nil." - +"\nTo reset onUpdate do 'onUpdate = _onUpdate'.", updateCoroutine); + +"\nupdate function errored and was set to nil." + +"\nTo reset update do 'update = callbacks.update'.", updateCoroutine); updateCoroutine.PushNil(); - updateCoroutine.SetGlobal("onUpdate"); + updateCoroutine.SetGlobal("update"); } } } diff --git a/src/kOS/Lua/LibraryOpenMethods.cs b/src/kOS/Lua/NativeMethods.cs similarity index 97% rename from src/kOS/Lua/LibraryOpenMethods.cs rename to src/kOS/Lua/NativeMethods.cs index 00d1cbb7ca..ed25312f43 100644 --- a/src/kOS/Lua/LibraryOpenMethods.cs +++ b/src/kOS/Lua/NativeMethods.cs @@ -3,7 +3,7 @@ namespace kOS.Lua { - internal static class LibraryOpenMethods + internal static class NativeMethods { #if __IOS__ || __TVOS__ || __WATCHOS__ || __MACCATALYST__ private const string LuaLibraryName = "@rpath/liblua54.framework/liblua54"; diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index 6fc705cd46..8b0a8ea249 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -17,18 +17,12 @@ public class KSFunction : LuaTypeBase public KSFunction(KeraLua.Lua state) { state.NewMetaTable(MetatableName); - state.PushString("__type"); state.PushString(MetatableName); - state.RawSet(-3); - state.PushString("__call"); - state.PushCFunction(KSFunctionCall); - state.RawSet(-3); - state.PushString("__gc"); - state.PushCFunction(Binding.CollectObject); - state.RawSet(-3); - state.PushString("__tostring"); - state.PushCFunction(Binding.ObjectToString); - state.RawSet(-3); + state.SetField(-2, "__type"); + AddMethod(state, "__call", KSFunctionCall); + AddMethod(state, "__gc", Binding.CollectObject); + AddMethod(state, "__tostring", Binding.ObjectToString); + state.Pop(1); } private static int KSFunctionCall(IntPtr L) diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index a217452dc9..267fb783d7 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -24,31 +24,24 @@ public class KSStructure : LuaTypeBase public KSStructure(KeraLua.Lua state) { state.NewMetaTable(MetatableName); - state.PushString("__type"); state.PushString(MetatableName); - state.RawSet(-3); - AddMetaMethod(state, "__index", StructureIndex); - AddMetaMethod(state, "__newindex", StructureNewIndex); - AddMetaMethod(state, "__pairs", StructurePairs); - AddMetaMethod(state, "__gc", Binding.CollectObject); - AddMetaMethod(state, "__len", StructureLength); - AddMetaMethod(state, "__tostring", StructureToString); - AddMetaMethod(state, "__add", StructureAdd); - AddMetaMethod(state, "__sub", StructureSubtract); - AddMetaMethod(state, "__mul", StructureMultiply); - AddMetaMethod(state, "__div", StructureDivide); - AddMetaMethod(state, "__pow", StructurePower); - AddMetaMethod(state, "__unm", StructureUnary); - AddMetaMethod(state, "__eq", StructureEqual); - AddMetaMethod(state, "__lt", StructureLessThan); - AddMetaMethod(state, "__le", StructureLessEqualThan); - } - - private static void AddMetaMethod(KeraLua.Lua state, string name, LuaFunction metaMethod) - { - state.PushString(name); - state.PushCFunction(metaMethod); - state.RawSet(-3); + state.SetField(-2, "__type"); + AddMethod(state, "__index", StructureIndex); + AddMethod(state, "__newindex", StructureNewIndex); + AddMethod(state, "__pairs", StructurePairs); + AddMethod(state, "__gc", Binding.CollectObject); + AddMethod(state, "__len", StructureLength); + AddMethod(state, "__tostring", StructureToString); + AddMethod(state, "__add", StructureAdd); + AddMethod(state, "__sub", StructureSubtract); + AddMethod(state, "__mul", StructureMultiply); + AddMethod(state, "__div", StructureDivide); + AddMethod(state, "__pow", StructurePower); + AddMethod(state, "__unm", StructureUnary); + AddMethod(state, "__eq", StructureEqual); + AddMethod(state, "__lt", StructureLessThan); + AddMethod(state, "__le", StructureLessEqualThan); + state.Pop(1); } private static int StructureAdd(IntPtr L) => StructureOperator(L, structureCalculator.Add); @@ -132,7 +125,7 @@ private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData bindi if (structure is TerminalInput && state.ToString(index)?.ToLower() == "getchar") { - state.PushCFunction(LuaFunctions.GetChar); + state.PushCFunction(GetChar); return 1; } @@ -237,5 +230,21 @@ private static int StructureNext(IntPtr L) state.Remove(-1); return 2; } + + private static int GetChar(IntPtr L) + { + return GetCharContinuation(L, 0, IntPtr.Zero); + } + + private static int GetCharContinuation(IntPtr L, int status, IntPtr ctx) + { + var state = KeraLua.Lua.FromIntPtr(L); + var shared = Binding.bindings[state.MainThread.Handle].Shared; + var q = shared.Screen.CharInputQueue; + if (q.Count == 0) + state.YieldK(0, 0, GetCharContinuation); + state.PushString(q.Dequeue().ToString()); + return 1; + } } } diff --git a/src/kOS/Lua/Types/LuaTypeBase.cs b/src/kOS/Lua/Types/LuaTypeBase.cs index 0257faa0b1..d9c6a52bbf 100644 --- a/src/kOS/Lua/Types/LuaTypeBase.cs +++ b/src/kOS/Lua/Types/LuaTypeBase.cs @@ -6,5 +6,12 @@ public abstract class LuaTypeBase { public abstract Type[] BindingTypes { get; } public abstract string MetatableName { get; } + + private protected static void AddMethod(KeraLua.Lua state, string name, KeraLua.LuaFunction metaMethod) + { + state.PushString(name); + state.PushCFunction(metaMethod); + state.RawSet(-3); + } } } \ No newline at end of file diff --git a/src/kOS/Lua/init.lua b/src/kOS/Lua/init.lua deleted file mode 100644 index 4de37278e0..0000000000 --- a/src/kOS/Lua/init.lua +++ /dev/null @@ -1,251 +0,0 @@ -stateFinalizer = setmetatable({}, { __gc = function() -- Called when the state is disposed(on shutdown, reboot) - toggleflybywire("steering", false) - toggleflybywire("throttle", false) - toggleflybywire("wheelSteering", false) - toggleflybywire("wheelThrottle", false) -end}) - -function _onFixedUpdate() - runProcessControl() - runCallbacks(fixedUpdateCallbacks) -end - -function _onUpdate() - runCallbacks(updateCallbacks) -end - -function setUpdateCallbacks() - onFixedUpdate = _onFixedUpdate - onUpdate = _onUpdate -end -setUpdateCallbacks() - -function _onBreakExecution() - breakControl() - fixedUpdateCallbacks = {} - callbacks = fixedUpdateCallbacks - updateCallbacks = {} -end -onBreakExecution = _onBreakExecution - -function breakControl() - steering, throttle, wheelSteering, wheelThrottle = nil, nil, nil, nil - steeringControlled, throttleControlled, wheelSteeringControlled, wheelThrottleControlled = nil, nil, nil, nil -end - -function runProcessControl() - if controlCoroutine then coroutine.resume(controlCoroutine) end - controlCoroutine = coroutine.create(processControl) - coroutine.resume(controlCoroutine) -end - -function processControl() - if rawget(_ENV, "steering") then - steeringControlled = true - local success, error = pcall(function() STEERING = type(steering) == "function" and steering() or steering end) - if not success then - warn(error, 1) - steering = nil - end - elseif steeringControlled then - steeringControlled = false - toggleflybywire("steering", false) - end - if rawget(_ENV, "throttle") then - throttleControlled = true - local success, error = pcall(function() THROTTLE = type(throttle) == "function" and throttle() or throttle end) - if not success then - warn(error, 1) - throttle = nil - end - elseif throttleControlled then - throttleControlled = false - toggleflybywire("throttle", false) - end - if rawget(_ENV, "wheelSteering") then - wheelSteeringControlled = true - local success, error = pcall(function() WHEELSTEERING = type(wheelSteering) == "function" and wheelSteering() or wheelSteering end) - if not success then - warn(error, 1) - wheelSteering = nil - end - elseif wheelSteeringControlled then - wheelSteeringControlled = false - toggleflybywire("wheelSteering", false) - end - if rawget(_ENV, "wheelThrottle") then - wheelThrottleControlled = true - local success, error = pcall(function() WHEELTHROTTLE = type(wheelThrottle) == "function" and wheelThrottle() or wheelThrottle end) - if not success then - warn(error, 1) - wheelThrottle = nil - end - elseif wheelThrottleControlled then - wheelThrottleControlled = false - toggleflybywire("wheelThrottle", false) - end - controlCoroutine = nil -end - -fixedUpdateCallbacks = {} -updateCallbacks = {} - -function runCallbacks(callbacks) - if callbacks.continuation then - coroutine.resume(callbacks.continuation) - end - if callbacks.unsorted then - callbacks.continuation = coroutine.create(function() - table.sort(callbacks, function(a, b) return a.priority < b.priority end) - callbacks.unsorted = false - callbacks.continuation = nil - end) - coroutine.resume(callbacks.continuation) - end - for i=#callbacks,1,-1 do - local callback = callbacks[i] - if callback.coroutine then - coroutine.resume(callback.coroutine, callback) - else - if callback.body then - callback.coroutine = coroutine.create(callback.body) - coroutine.resume(callback.coroutine, callback) - else - table.remove(callbacks, i) - end - end - end -end - -function addCallback(body, priority, callbacks) - callbacks = callbacks or fixedUpdateCallbacks - local callback = { - body = function(callback) - local success, newPriority = pcall(body, callback) - if not(newPriority == true or newPriority == callback.priority) then - if success then - callback.priority = tonumber(newPriority) - if callback.priority then - callbacks.unsorted = true - else - callback.body = nil - end - else - warn("error in callback:\n" .. newPriority) - callback.body = nil - end - end - callback.coroutine = nil - end, - priority = priority or 0 - } - table.insert(callbacks, callback) - callbacks.unsorted = true - return callback -end - -function when(condition, body, priority, callbacks) - return addCallback(function (callback) - if condition() then - return body() - else - return callback.priority - end - end, priority, callbacks) -end - -function on(state, body, priority, callbacks) - local previousState = state() - return addCallback(function (callback) - local currentState = state() - if currentState ~= previousState then - local newPriority = body() - previousState = currentState - return newPriority - else - return callback.priority - end - end, priority, callbacks) -end - -vecDraws = setmetatable({}, { __mode = "v" }) -updatingVecDraws = setmetatable({}, { __mode = "v" }) - -function clearVecDraws() - CLEARVECDRAWS() - for _,vd in pairs(vecDraws) do - vd.parameters.show = false - end - updatingVecDraws.keepCallback = false - updatingVecDraws = setmetatable({}, { __mode = "v" }) -end - -local vecDrawMetatable = { - __index = function(vd, index) - return vd.parameters[index] == nil and vd.structure[index] or vd.parameters[index] - end, - __newindex = function(vd, index, value) - local parameters = vd.parameters - if type(value) ~= "function" then vd.structure[index] = value end - if parameters[index] == nil then return end - parameters[index] = value - - if index == "start" then vd.isStartFunction = type(value) == "function" - elseif index == "vector" then vd.isVectorFunction = type(value) == "function" - elseif index == "color" then vd.isColorFunction = type(value) == "function" end - - local vdShouldBeUpdating = parameters.show and (vd.isStartFunction or vd.isVectorFunction or vd.isColorFunction) - local vdUpdating = false - - for i,v in ipairs(updatingVecDraws) do - if v == vd then - vdUpdating = true - if not vdShouldBeUpdating then - table.remove(updatingVecDraws, i) - if #updatingVecDraws == 0 then - updatingVecDraws.keepCallback = false - end - end - break - end - end - - if vdShouldBeUpdating and not vdUpdating then - if #updatingVecDraws == 0 then - updatingVecDraws.keepCallback = true - addCallback(function() - for _, vd in ipairs(updatingVecDraws) do - if vd.isStartFunction then vd.structure.start = vd.parameters.start() end - if vd.isVectorFunction then vd.structure.vector = vd.parameters.vector() end - if vd.isColorFunction then vd.structure.color = vd.parameters.color() end - end - return updatingVecDraws.keepCallback - end, 0, updateCallbacks) - end - table.insert(updatingVecDraws, vd) - end - end, - __gc = function(vd) vd.show = false end, -} - -function vecDraw(start, vector, color, label, scale, show, width, pointy, wiping) - local vd = { - structure = VECDRAW(v(0,0,0), v(0,0,0), white, label or "", scale or 1, show ~= nil and show, width or 0.2, pointy == nil or pointy, wiping == nil or wiping), - isStartFunction = false, - isVectorFunction = false, - isColorFunction = false, - parameters = { - start = v(0,0,0), - vector = v(0,0,0), - color = white, - show = false, - } - } - setmetatable(vd, vecDrawMetatable) - table.insert(vecDraws, vd) - if start then vd.start = start end - if vector then vd.vector = vector end - if color then vd.color = color end - if show then vd.show = show end - return vd -end \ No newline at end of file diff --git a/src/kOS/Lua/whitelist.lua b/src/kOS/Lua/whitelist.lua new file mode 100644 index 0000000000..31f5332f39 --- /dev/null +++ b/src/kOS/Lua/whitelist.lua @@ -0,0 +1,129 @@ +local env = { +-- _G = _G, holds the old environment + _VERSION = _VERSION, + assert = assert, + collectgarbage = collectgarbage, + dofile = dofile, + error = error, + getmetatable = getmetatable, + ipairs = ipairs, + load = load, + loadfile = loadfile, + next = next, + pairs = pairs, + pcall = pcall, + print = print, + rawequal = rawequal, + rawget = rawget, + rawlen = rawlen, + rawset = rawset, + select = select, + setmetatable = setmetatable, + tonumber = tonumber, + tostring = tostring, + type = type, + warn = warn, + xpcall = xpcall, + _type = _type, + wait = wait, + coroutine = { + close = coroutine.close, + create = coroutine.create, + isyieldable = coroutine.isyieldable, + resume = coroutine.resume, + running = coroutine.running, + status = coroutine.status, + wrap = coroutine.wrap, + yield = coroutine.yield, + }, + math = { + abs = math.abs, + acos = math.acos, + asin = math.asin, + atan = math.atan, + ceil = math.ceil, + cos = math.cos, + deg = math.deg, + exp = math.exp, + floor = math.floor, + fmod = math.fmod, + huge = math.huge, + log = math.log, + max = math.max, + maxinteger = math.maxinteger, + min = math.min, + mininteger = math.mininteger, + modf = math.modf, + pi = math.pi, + rad = math.rad, + random = math.random, + randomseed = math.randomseed, + sin = math.sin, + sqrt = math.sqrt, + tan = math.tan, + tointeger = math.tointeger, + type = math.type, + ult = math.ult, + }, + string = { + byte = string.byte, + char = string.char, + dump = string.dump, + find = string.find, + format = string.format, + gmatch = string.gmatch, + gsub = string.gsub, + len = string.len, + lower = string.lower, + match = string.match, + pack = string.pack, + packsize = string.packsize, + rep = string.rep, + reverse = string.reverse, + sub = string.sub, + unpack = string.unpack, + upper = string.upper, + }, + table = { + concat = table.concat, + insert = table.insert, + move = table.move, + pack = table.pack, + remove = table.remove, + sort = table.sort, + unpack = table.unpack, + }, + utf8 = { + char = utf8.char, + charpattern = utf8.charpattern, + codepoint = utf8.codepoint, + codes = utf8.codes, + len = utf8.len, + offset = utf8.offset, + }, +} +env._G = env + +local loaded = { + _G = env._G, + coroutine = env.coroutine, + math = env.math, + string = env.string, + table = env.table, + utf8 = env.utf8, +} + +local visitedTables = {} +local function deepCleanTable(tab) + visitedTables[tab] = true + for k,v in env.pairs(tab) do + if env._type(v) == "table" and not visitedTables[v] then + deepCleanTable(v) + end + tab[k] = nil + end +end + +-- what.what() + +return env, loaded, deepCleanTable \ No newline at end of file diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index 437f01042d..2ffcd65ee8 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -81,12 +81,16 @@ - + + + + + - + @@ -276,10 +280,14 @@ - + + + + + From 184356e75a5b5e5ca993713be314e06dc0ed34b1 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 5 Nov 2024 00:37:05 +0300 Subject: [PATCH 061/108] Lua build workflow --- .github/workflows/lua-build.yml | 98 +++++++++++++++++++++++++++++++++ .gitmodules | 3 + src/kOS/Lua/lua | 1 + src/kOS/kOS.csproj | 6 ++ 4 files changed, 108 insertions(+) create mode 100644 .github/workflows/lua-build.yml create mode 160000 src/kOS/Lua/lua diff --git a/.github/workflows/lua-build.yml b/.github/workflows/lua-build.yml new file mode 100644 index 0000000000..296b7ca3a9 --- /dev/null +++ b/.github/workflows/lua-build.yml @@ -0,0 +1,98 @@ +name: lua-build + +on: + workflow_dispatch: + inputs: + push: + default: true + type: boolean + description: "Push built dynamic libraries" + workflow_call: + inputs: + push: + default: true + type: boolean + description: "Push built dynamic libraries" +permissions: + contents: write + +env: + LUA_SOURCE_DIR: ${{ github.workspace }}/src/kOS/Lua/lua + LUA_BUILD_DIR: ${{ github.workspace }}/src/kOS/Lua/lua/_build + LUA_OUTPUT_DIR: ${{ github.workspace }}/src/kOS/Lua/include + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + steps: + - uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Set vars + id: vars + shell: bash + run: | + if [ "$RUNNER_OS" == "Linux" ]; then + echo "LUA_LIB_NAME=liblua54.so" >> "$GITHUB_OUTPUT" + echo "LUA_LIB_PATH=$LUA_BUILD_DIR/lib64/liblua54.so" >> "$GITHUB_OUTPUT" + elif [ "$RUNNER_OS" == "Windows" ]; then + echo "LUA_LIB_NAME=lua54.dll" >> "$GITHUB_OUTPUT" + echo "LUA_LIB_PATH=$LUA_BUILD_DIR/bin64/lua54.dll" >> "$GITHUB_OUTPUT" + elif [ "$RUNNER_OS" == "macOS" ]; then + echo "LUA_LIB_NAME=liblua54.dylib" >> "$GITHUB_OUTPUT" + echo "LUA_LIB_PATH=$LUA_BUILD_DIR/lib64/liblua54.dylib" >> "$GITHUB_OUTPUT" + fi + + - name: Configure CMake + shell: bash + run: cmake -S $LUA_SOURCE_DIR -B $LUA_BUILD_DIR + + - name: Build + shell: bash + run: cmake --build $LUA_BUILD_DIR --config Release + + - name: Test + shell: bash + if: matrix.os != 'windows-latest' # TODO: fix test + working-directory: ${{ env.LUA_BUILD_DIR }} + run: ctest --build-config Release + + - uses: actions/upload-artifact@v4 + with: + name: ${{ steps.vars.outputs.LUA_LIB_NAME }} + if-no-files-found: error + retention-days: 7 + path: ${{ steps.vars.outputs.LUA_LIB_PATH }} + + push: + runs-on: ubuntu-latest + needs: build + if: inputs.push + steps: + - uses: actions/checkout@v4 + with: + submodules: 'true' + + - name: Clear output directory + run: rm -rf $LUA_OUTPUT_DIR + + - uses: actions/download-artifact@v4 + with: + merge-multiple: 'true' + path: ${{ env.LUA_OUTPUT_DIR }} + + - name: Push + env: + GIT_COMMITTER_NAME: lua-build automation + GIT_AUTHOR_NAME: lua-build automation + GIT_COMMITTER_EMAIL: noreply@github.com + GIT_AUTHOR_EMAIL: noreply@github.com + run: | + git add $LUA_OUTPUT_DIR + git commit -am "Build lua" + git push \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 3c92910681..6c8703e558 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "KSPBuildTools"] path = KSPBuildTools url = https://github.com/KSPModdingLibs/KSPBuildTools.git +[submodule "src/kOS/Lua/lua"] + path = src/kOS/Lua/lua + url = git@github.com:NLua/lua.git diff --git a/src/kOS/Lua/lua b/src/kOS/Lua/lua new file mode 160000 index 0000000000..def5fd2429 --- /dev/null +++ b/src/kOS/Lua/lua @@ -0,0 +1 @@ +Subproject commit def5fd2429f6dedf0dfb2afead93cd440735c533 diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index 2ffcd65ee8..c045f2e853 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -288,6 +288,12 @@ + + + %(RecursiveDir)%(Filename)%(Extension) + Always + + From 5e8966f3b26b5d963d861770ef70cfe98debea2b Mon Sep 17 00:00:00 2001 From: lua-build automation Date: Thu, 7 Nov 2024 03:54:59 +0000 Subject: [PATCH 062/108] Build lua --- src/kOS/Lua/include/liblua54.dylib | Bin 0 -> 374592 bytes src/kOS/Lua/include/liblua54.so | Bin 0 -> 413408 bytes src/kOS/Lua/include/lua54.dll | Bin 0 -> 605696 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/kOS/Lua/include/liblua54.dylib create mode 100644 src/kOS/Lua/include/liblua54.so create mode 100644 src/kOS/Lua/include/lua54.dll diff --git a/src/kOS/Lua/include/liblua54.dylib b/src/kOS/Lua/include/liblua54.dylib new file mode 100644 index 0000000000000000000000000000000000000000..bb56076a8080c4c3b8866c2342aaf5ace38fee6b GIT binary patch literal 374592 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꺬Wp^3#iK8INK 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�dv_vi8fD#xc=Tl8giR%MBAZ$?_D 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≻t}# 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 literal 0 HcmV?d00001 diff --git a/src/kOS/Lua/include/liblua54.so b/src/kOS/Lua/include/liblua54.so new file mode 100644 index 0000000000000000000000000000000000000000..dabe1f817369c39fef70a0a3ef8cfd857d256677 GIT binary patch literal 413408 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 He;)ont17>U literal 0 HcmV?d00001 diff --git a/src/kOS/Lua/include/lua54.dll b/src/kOS/Lua/include/lua54.dll new file mode 100644 index 0000000000000000000000000000000000000000..08c12949fcabe35a6a440b9a9f6adff05eb0a56f GIT binary patch literal 605696 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

m8BNYVPzMT+UFWWyYAYGV}%eI-hQ9Ce0B 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 wcv%I0)?L2u(ta??T(ZBNXUkPSEE&u=k literal 605696 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

b)C_ZbGv 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%0Am?$K>^8z# zT<07%k^lQPWF(OGd9TinobUpv&NG3*1qZB zl(lohx;b6_oU8+!sza>*7}=?rGLe_8X*=ufX083~%>mYUi1i&~ZJTKm=dG2q*2y{R z<%|t-zNR@_M>tpOoT(dOAaEcCbf{tbD*=E+1>&RI-L7kkRUe3-S z=VqESbAVth91YIyob~oR7i$0O#WnXX6-WV>55!RJ0aYTr)ps0vGDUvpvW>7GK_=M^}VyT+{!04&Q?Vpv5-R?+Ew;^ja}bp?R)cwo^a%e#>8HCvd@F;@M`PHx`WwtuzUArS|87H Ll_HJ)nU8-5>>%9@ From 33fd3510df982029bec0586bf9c48b0944e54e93 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 14 Nov 2024 09:18:20 +0300 Subject: [PATCH 068/108] Load the cjson library to the global environment as 'json' Binding.BindToState before loading lua libraries and right after whitelisting the registry. Slight Lua.Binding cleanup --- src/kOS/Lua/Binding.cs | 34 +++++++++++++------------------- src/kOS/Lua/Libraries.cs | 4 +++- src/kOS/Lua/Libs/Base.cs | 10 +++++----- src/kOS/Lua/Libs/Package.cs | 2 +- src/kOS/Lua/Libs/misc.lua | 1 + src/kOS/Lua/LuaInterpreter.cs | 6 ++---- src/kOS/Lua/Types/KSFunction.cs | 2 +- src/kOS/Lua/Types/KSStructure.cs | 18 ++++++++--------- 8 files changed, 36 insertions(+), 41 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 3beb3b7f0e..d52e5c3fe5 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -23,7 +23,7 @@ namespace kOS.Lua { public static class Binding { - public static readonly Dictionary bindings = new Dictionary(); + public static readonly Dictionary Bindings = new Dictionary(); private static readonly HashSet uniqueTypes = new HashSet() { // Types of objects that you want to create new lua instances of when pushing onto the stack, // but that have overridden Equals and GetHashCode methods so BindingData.Objects dictionary @@ -38,18 +38,14 @@ public static class Binding // with some simplifications and changes to make it work on Structures public class BindingData { - public readonly Dictionary Variables; - public readonly Dictionary Functions; public readonly Dictionary Objects = new Dictionary(); public readonly Dictionary UserdataPtrs = new Dictionary(); public readonly LuaTypeBase[] Types; public readonly SharedObjects Shared; - public BindingData(KeraLua.Lua state, SharedObjects shared, Dictionary boundVariables, Dictionary functions) + public BindingData(KeraLua.Lua state, SharedObjects shared) { Shared = shared; - Variables = boundVariables; - Functions = functions; Types = new LuaTypeBase[] { new KSStructure(state), @@ -81,12 +77,7 @@ public static void BindToState(KeraLua.Lua state, SharedObjects shared) { state = state.MainThread; BindingChanges.Apply(shared.BindingMgr as BindingManager, shared.FunctionManager as FunctionManager); - bindings[state.Handle] = new BindingData( - state, - shared, - (shared.BindingMgr as BindingManager).RawVariables, - (shared.FunctionManager as FunctionManager).RawFunctions - ); + Bindings[state.Handle] = new BindingData(state, shared); // set index and newindex metamethods on the environment table state.PushGlobalTable(); @@ -110,7 +101,7 @@ public static void BindToState(KeraLua.Lua state, SharedObjects shared) public static int CollectObject(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - bindings.TryGetValue(state.MainThread.Handle, out var binding); + Bindings.TryGetValue(state.MainThread.Handle, out var binding); if (binding == null) return 0; // happens after DisposeStateBinding() was called var userdataAddress = state.ToUserData(1); binding.Objects.TryGetValue(userdataAddress, out var obj); @@ -123,7 +114,7 @@ public static int CollectObject(IntPtr L) public static int ObjectToString(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var obj = Binding.bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; + var obj = Binding.Bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; state.PushString(obj.ToString()); return 1; } @@ -132,16 +123,18 @@ private static int EnvIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var index = state.ToString(2); - var binding = bindings[state.MainThread.Handle]; + var binding = Bindings[state.MainThread.Handle]; var isCapitalNameOnlyVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); if (isCapitalNameOnlyVariableNotCapital) return 0; - if (binding.Variables.TryGetValue(index, out var boundVar)) + var variables = (binding.Shared.BindingMgr as BindingManager).RawVariables; + var functions = (binding.Shared.FunctionManager as FunctionManager).RawFunctions; + if (variables.TryGetValue(index, out var boundVar)) { return (int)LuaExceptionCatch(() => PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding), state); } - if (binding.Functions.TryGetValue(index, out var function)) + if (functions.TryGetValue(index, out var function)) { return PushLuaType(state, function, binding); } @@ -151,12 +144,13 @@ private static int EnvIndex(IntPtr L) private static int EnvNewIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = bindings[state.MainThread.Handle]; + var binding = Bindings[state.MainThread.Handle]; + var variables = (binding.Shared.BindingMgr as BindingManager).RawVariables; var index = state.ToString(2); var isCapitalNameOnlyVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); var isControlVariable = controlVariables.Contains(index.ToUpper()) && !controlVariables.Contains(index); if (!isControlVariable && !isCapitalNameOnlyVariableNotCapital - && binding.Variables.TryGetValue(index, out var boundVar)) + && variables.TryGetValue(index, out var boundVar)) { if (boundVar.Set == null) { @@ -280,7 +274,7 @@ public static object LuaExceptionCatch(Func tryBody, KeraLua.Lua state) public static void DumpStack(KeraLua.Lua state, string debugName = "", BindingData binding = null) { - binding = binding ?? bindings[state.MainThread.Handle]; + binding = binding ?? Bindings[state.MainThread.Handle]; Debug.Log(debugName+"_________"); for (int i = 0; i <= state.GetTop(); i++) Debug.Log(i+" "+state.TypeName(i)+" "+ToCSharpObject(state, i, binding)); diff --git a/src/kOS/Lua/Libraries.cs b/src/kOS/Lua/Libraries.cs index ec6f609854..6c3ad0e366 100644 --- a/src/kOS/Lua/Libraries.cs +++ b/src/kOS/Lua/Libraries.cs @@ -32,7 +32,7 @@ public static class Libraries {"dev", Libs.Dev.Open}, }; - public static void Open(KeraLua.Lua state) + public static void Open(KeraLua.Lua state, SharedObjects shared) { /* the goal here is to remove the ability of lua scripts to be malicious and make it simpler to keep it that way @@ -65,6 +65,8 @@ to be explicitly added in the whitelist to be accessible by lua scripts state.GarbageCollector(LuaGC.Collect, 0); + Binding.BindToState(state, shared); + // open lua libraries foreach (var library in luaLibraries) { diff --git a/src/kOS/Lua/Libs/Base.cs b/src/kOS/Lua/Libs/Base.cs index 62a50d9911..6aa2e033ea 100644 --- a/src/kOS/Lua/Libs/Base.cs +++ b/src/kOS/Lua/Libs/Base.cs @@ -123,7 +123,7 @@ private static int Type(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); if (state.Type(1) == LuaType.UserData) { - var obj = Binding.bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; + var obj = Binding.Bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; if (obj is Structure structure) { state.PushString(structure.KOSName); @@ -143,7 +143,7 @@ private static int Print(IntPtr L) var prints = new string[argCount]; for (int i = 0; i < argCount; i++) prints[i] = state.ToString(i + 1); - Binding.bindings[state.MainThread.Handle].Shared.Screen.Print(string.Join(" ", prints)); + Binding.Bindings[state.MainThread.Handle].Shared.Screen.Print(string.Join(" ", prints)); return 0; } @@ -157,7 +157,7 @@ private static int Warn(IntPtr L) state.Traceback(state, (int)tracebackLevel); errorMessage += "\n" + state.ToString(-1); } - var shared = Binding.bindings[state.MainThread.Handle].Shared; + var shared = Binding.Bindings[state.MainThread.Handle].Shared; shared.SoundMaker.BeginFileSound("error"); shared.Screen.Print(errorMessage); return 0; @@ -188,7 +188,7 @@ private static int LoadFile(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); state.CheckString(1); var filePath = state.ToString(1); - var shared = Binding.bindings[state.MainThread.Handle].Shared; + var shared = Binding.Bindings[state.MainThread.Handle].Shared; var file = shared.VolumeMgr.CurrentVolume.Open(filePath) as VolumeFile; if (file == null) { @@ -233,7 +233,7 @@ private static int Wait(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); state.CheckNumber(1); - var shared = Binding.bindings[state.MainThread.Handle].Shared; + var shared = Binding.Bindings[state.MainThread.Handle].Shared; shared.Cpu.YieldProgram(new YieldFinishedGameTimer(state.ToNumber(1))); return 0; } diff --git a/src/kOS/Lua/Libs/Package.cs b/src/kOS/Lua/Libs/Package.cs index cd56a20717..fa537d4992 100644 --- a/src/kOS/Lua/Libs/Package.cs +++ b/src/kOS/Lua/Libs/Package.cs @@ -159,7 +159,7 @@ private static int LuaSearcher(IntPtr L) if (state.GetField((int)LuaRegistry.Index-1, "path") != LuaType.String) return state.Error("'package.path' must be a string"); var paths = state.ToString(-1); - var volumeManager = Binding.bindings[state.MainThread.Handle].Shared.VolumeMgr; + var volumeManager = Binding.Bindings[state.MainThread.Handle].Shared.VolumeMgr; var errorMessage = ""; foreach(var pathTemplate in paths.Split(config.PATHSEP)) { diff --git a/src/kOS/Lua/Libs/misc.lua b/src/kOS/Lua/Libs/misc.lua index fc9a31d942..76d1599385 100644 --- a/src/kOS/Lua/Libs/misc.lua +++ b/src/kOS/Lua/Libs/misc.lua @@ -3,6 +3,7 @@ local M = {} function M.init() vecdraw = M.vecdraw clearvecdraws = M.clearvecdraws + json = select(2, pcall(require, "cjson")) end M.vecdraws = setmetatable({}, { __mode = "v" }) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 92a4a2b8a7..042d930295 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -71,9 +71,7 @@ public void Boot() updateCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); stateInfo.Add(state.MainThread.Handle, new ExecInfo(Shared, commandCoroutine)); - Libraries.Open(state); - - Binding.BindToState(state, Shared); + Libraries.Open(state, Shared); if (!Shared.Processor.CheckCanBoot()) return; @@ -282,7 +280,7 @@ public void Dispose() var stateHandle = state.MainThread.Handle; state.Dispose(); stateInfo.Remove(stateHandle); - Binding.bindings.Remove(stateHandle); + Binding.Bindings.Remove(stateHandle); state = null; } diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index 8b0a8ea249..615921a94a 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -28,7 +28,7 @@ public KSFunction(KeraLua.Lua state) private static int KSFunctionCall(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Binding.bindings[state.MainThread.Handle]; + var binding = Binding.Bindings[state.MainThread.Handle]; state.CheckUserData(1, metatableName); var ksFunction = binding.Objects[state.ToUserData(1)]; diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index 267fb783d7..b872cf508b 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -56,7 +56,7 @@ public KSStructure(KeraLua.Lua state) private static int StructureOperator(IntPtr L, Func operatorMethod) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Binding.bindings[state.MainThread.Handle]; + var binding = Binding.Bindings[state.MainThread.Handle]; var pair = new OperandPair(Binding.ToCSharpObject(state, 1, binding), Binding.ToCSharpObject(state, 2, binding)); return (int)Binding.LuaExceptionCatch(() => Binding.PushLuaType(state, operatorMethod(pair), binding), state); } @@ -64,7 +64,7 @@ private static int StructureOperator(IntPtr L, Func operato private static int StructureUnary(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Binding.bindings[state.MainThread.Handle]; + var binding = Binding.Bindings[state.MainThread.Handle]; var obj = Binding.ToCSharpObject(state, 1, binding); if (obj == null) return 0; MethodInfo unaryMethod = obj.GetType().GetMethod("op_UnaryNegation", BindingFlags.FlattenHierarchy |BindingFlags.Static | BindingFlags.Public); @@ -77,7 +77,7 @@ private static int StructureUnary(IntPtr L) private static int StructureLength(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Binding.bindings[state.MainThread.Handle]; + var binding = Binding.Bindings[state.MainThread.Handle]; var structure = binding.Objects[state.ToUserData(1)] as Structure; if (!structure.HasSuffix("LENGTH")) return state.Error("attempt to get length of a Structure with no length suffix"); @@ -88,7 +88,7 @@ private static int StructureLength(IntPtr L) private static int StructureToString(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var structure = Binding.bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; + var structure = Binding.Bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; var structureString = (string)Binding.LuaExceptionCatch(() => structure.ToString(), state); if (structure is IEnumerable) { // make enum structures ToString() method show 1 base indexed values in lua @@ -105,7 +105,7 @@ private static int StructureToString(IntPtr L) private static int StructureIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Binding.bindings[state.MainThread.Handle]; + var binding = Binding.Bindings[state.MainThread.Handle]; object obj = binding.Objects[state.ToUserData(1)]; var structure = obj as Structure; if (structure == null) @@ -153,7 +153,7 @@ private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData bindi private static int StructureNewIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Binding.bindings[state.MainThread.Handle]; + var binding = Binding.Bindings[state.MainThread.Handle]; var obj = binding.Objects[state.ToUserData(1)]; var structure = obj as Structure; if (structure == null) @@ -181,7 +181,7 @@ private static int StructureNewIndex(IntPtr L) private static int StructurePairs(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Binding.bindings[state.MainThread.Handle]; + var binding = Binding.Bindings[state.MainThread.Handle]; var structure = binding.Objects[state.ToUserData(1)] as Structure; if (structure == null) return state.Error("pairs metamethod can only be called with a Structure type"); @@ -213,7 +213,7 @@ private static int StructurePairs(IntPtr L) private static int StructureNext(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Binding.bindings[state.MainThread.Handle]; + var binding = Binding.Bindings[state.MainThread.Handle]; var structure = binding.Objects[state.ToUserData(1)] as Structure; if (structure == null) return state.Error("iterator can only be called with a Structure type"); @@ -239,7 +239,7 @@ private static int GetChar(IntPtr L) private static int GetCharContinuation(IntPtr L, int status, IntPtr ctx) { var state = KeraLua.Lua.FromIntPtr(L); - var shared = Binding.bindings[state.MainThread.Handle].Shared; + var shared = Binding.Bindings[state.MainThread.Handle].Shared; var q = shared.Screen.CharInputQueue; if (q.Count == 0) state.YieldK(0, 0, GetCharContinuation); From 4d62454a60542972971eb4a8f0b2cb9373600cbc Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 14 Nov 2024 11:41:40 +0300 Subject: [PATCH 069/108] Move lua modules from being embedded to PluginData/LuaModules/ directory This allows users to edit them and add their own automatically required modules --- src/kOS/Lua/Libraries.cs | 54 +++++++++++++++++++++++++++++------ src/kOS/Lua/Libs/Callbacks.cs | 24 ---------------- src/kOS/Lua/Libs/Misc.cs | 24 ---------------- src/kOS/kOS.csproj | 12 ++++---- 4 files changed, 50 insertions(+), 64 deletions(-) delete mode 100644 src/kOS/Lua/Libs/Callbacks.cs delete mode 100644 src/kOS/Lua/Libs/Misc.cs diff --git a/src/kOS/Lua/Libraries.cs b/src/kOS/Lua/Libraries.cs index 6c3ad0e366..11f9597bdf 100644 --- a/src/kOS/Lua/Libraries.cs +++ b/src/kOS/Lua/Libraries.cs @@ -20,12 +20,6 @@ public static class Libraries {"math", NativeMethods.luaopen_math}, }; - private static readonly RegList luaLibraries = new RegList - { - {"callbacks", Libs.Callbacks.Open}, - {"misc", Libs.Misc.Open}, - }; - private static readonly RegList devLibraries = new RegList { {"debug", NativeMethods.luaopen_debug}, @@ -68,10 +62,52 @@ to be explicitly added in the whitelist to be accessible by lua scripts Binding.BindToState(state, shared); // open lua libraries - foreach (var library in luaLibraries) + var modulesDir = + Path.Combine(new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent.Parent.FullName, + "PluginData", "LuaModules"); + var luaModules = Directory.GetFiles(modulesDir, "*.lua", SearchOption.AllDirectories); + foreach (var luaModule in luaModules) { - state.RequireF(library.name, library.function,true); - state.Pop(1); + using (var streamReader = new StreamReader(luaModule)) + { + var moduleName = Path.GetFileNameWithoutExtension(luaModule); + + // call the module file + if (state.LoadString(streamReader.ReadToEnd()) != LuaStatus.OK || + state.PCall(0, 1, 0) != LuaStatus.OK) + { + shared.SoundMaker.BeginFileSound("error"); + shared.Screen.Print($"error loading module '{moduleName}':\n" + state.ToString(-1)); + state.Pop(1); + continue; + } + + // call "init" field on the module if it exists + if (state.Type(-1) == LuaType.Table) + { + if (state.GetField(-1, "init") == LuaType.Function) + { + if (state.PCall(0, 0, 0) != LuaStatus.OK) + { + shared.SoundMaker.BeginFileSound("error"); + shared.Screen.Print($"error in 'init' function of module '{moduleName}':\n" + state.ToString(-1)); + state.Pop(1); + } + } + else + { + state.Pop(1); + } + } + + // add the module to the global table and the loaded table + state.PushCopy(-1); + state.SetGlobal(moduleName); + state.GetField(LuaRegistry.Index, "_LOADED"); + state.Rotate(-2, 1); + state.SetField(-2, moduleName); + state.Pop(1); + } } // open dev libraries past the whitelist if built in debug configuration diff --git a/src/kOS/Lua/Libs/Callbacks.cs b/src/kOS/Lua/Libs/Callbacks.cs deleted file mode 100644 index b3b43b31c2..0000000000 --- a/src/kOS/Lua/Libs/Callbacks.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.IO; -using System.Reflection; - -namespace kOS.Lua.Libs -{ - public static class Callbacks - { - public static int Open(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.Libs.callbacks.lua"))) - { - state.LoadString(streamReader.ReadToEnd()); - } - state.Call(0, 1); - - state.GetField(-1, "init"); - state.Call(0, 0); - - return 1; - } - } -} \ No newline at end of file diff --git a/src/kOS/Lua/Libs/Misc.cs b/src/kOS/Lua/Libs/Misc.cs deleted file mode 100644 index 24291b3606..0000000000 --- a/src/kOS/Lua/Libs/Misc.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using System.IO; -using System.Reflection; - -namespace kOS.Lua.Libs -{ - public static class Misc - { - public static int Open(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.Libs.misc.lua"))) - { - state.LoadString(streamReader.ReadToEnd()); - } - state.Call(0, 1); - - state.GetField(-1, "init"); - state.Call(0, 0); - - return 1; - } - } -} diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index 742276f5a0..63529e6d9c 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -83,8 +83,6 @@ - - @@ -285,17 +283,17 @@ - - - + - + + - + From 5d4e53b3ae1feb1bfa256833cb8cd7ab545cdfa3 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 4 Dec 2024 15:07:31 +0300 Subject: [PATCH 070/108] Rename "body" function to "getbody" for lua to resolve a name conflict with the "body" bound variable --- src/kOS/Lua/Binding.cs | 53 +++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index d52e5c3fe5..08e0e8b3d3 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -54,25 +54,6 @@ public BindingData(KeraLua.Lua state, SharedObjects shared) } } - private static class BindingChanges - { - private static readonly List> variableRenames = new List>() - { - new KeyValuePair("STAGE", "STAGEINFO"), - new KeyValuePair("HEADING", "SHIPHEADING") - }; - - public static void Apply(BindingManager bindingManager, FunctionManager functionManager) - { - foreach (var rename in variableRenames) - { - if (!bindingManager.RawVariables.TryGetValue(rename.Key, out var variable)) continue; - bindingManager.RawVariables.Add(rename.Value, variable); - bindingManager.RawVariables.Remove(rename.Key); - } - } - } - public static void BindToState(KeraLua.Lua state, SharedObjects shared) { state = state.MainThread; @@ -280,5 +261,39 @@ public static void DumpStack(KeraLua.Lua state, string debugName = "", BindingDa Debug.Log(i+" "+state.TypeName(i)+" "+ToCSharpObject(state, i, binding)); Debug.Log("____________________"); } + + private static class BindingChanges + { + private static readonly Renames variableRenames = new Renames() + { + {"STAGE", "STAGEINFO"}, + {"HEADING", "SHIPHEADING"} + }; + private static readonly Renames functionRenames = new Renames() + { + {"BODY", "GETBODY"} + }; + + public static void Apply(BindingManager bindingManager, FunctionManager functionManager) + { + foreach (var rename in variableRenames) + { + if (!bindingManager.RawVariables.TryGetValue(rename.Key, out var variable)) continue; + bindingManager.RawVariables.Add(rename.Value, variable); + bindingManager.RawVariables.Remove(rename.Key); + } + foreach (var rename in functionRenames) + { + if (!functionManager.RawFunctions.TryGetValue(rename.Key, out var variable)) continue; + functionManager.RawFunctions.Add(rename.Value, variable); + functionManager.RawFunctions.Remove(rename.Key); + } + } + + private class Renames : List> + { + public void Add(string originalName, string newName) => Add(new KeyValuePair(originalName, newName)); + } + } } } From e8b9e25e21e7812c64574a1ab16b986f9742c954 Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 6 Dec 2024 15:35:58 +0300 Subject: [PATCH 071/108] Treat all "pop" and "peek" suffixes as functions. There is no generic way to find what suffixes of "NoArgsSuffix" type are functions, so exceptions like these are necessary. Other NoArgsSuffixes that are described in the docs as functions but will stay as values: KOSProcessor.connection Vessel.alltaggedparts Vessel.crew Part.alltaggedparts RTAddon.groundstations --- src/kOS/Lua/Types/KSStructure.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index b872cf508b..f0192a97b4 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -123,13 +123,15 @@ private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData bindi return Binding.PushLuaType(state, pushValue, binding); } - if (structure is TerminalInput && state.ToString(index)?.ToLower() == "getchar") + var suffixName = state.ToString(index).ToLower(); + + if (structure is TerminalInput && suffixName == "getchar") { state.PushCFunction(GetChar); return 1; } - var result = structure.GetSuffix(state.ToString(index), true); + var result = structure.GetSuffix(suffixName, true); if (result == null) return Binding.PushLuaType(state, null, binding); @@ -138,7 +140,8 @@ private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData bindi pushValue = Structure.ToPrimitive(result.Value); } else if (result is DelegateSuffixResult delegateResult && delegateResult.RawDelInfo.ReturnType != typeof(void) - && delegateResult.RawDelInfo.Parameters.Length == 0) + && delegateResult.RawDelInfo.Parameters.Length == 0 + && suffixName != "pop" && suffixName != "peek") { var callResult = delegateResult.RawCall(null); delegateResult.RawSetValue(Structure.FromPrimitiveWithAssert(callResult)); From fb4b3a8a7e1b15bdf7d7990fa643d7e86ebd7511 Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 6 Dec 2024 17:21:27 +0300 Subject: [PATCH 072/108] Add expression-body function syntactic sugar --- src/kOS/Lua/lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kOS/Lua/lua b/src/kOS/Lua/lua index 34fb3cd463..89c872c836 160000 --- a/src/kOS/Lua/lua +++ b/src/kOS/Lua/lua @@ -1 +1 @@ -Subproject commit 34fb3cd4637283e44e7ab7a38364bac94468d713 +Subproject commit 89c872c836bb36a6f4e21ce35d8692ec2e869085 From 04bfff0f537dcda93cf4869df0abcd37e7491bc5 Mon Sep 17 00:00:00 2001 From: lua-build automation Date: Fri, 6 Dec 2024 14:27:14 +0000 Subject: [PATCH 073/108] Build lua --- .../Lua/include/LuaModules/Windows/cjson.dll | Bin 78966 -> 78966 bytes src/kOS/Lua/include/liblua54.dylib | Bin 374592 -> 374624 bytes src/kOS/Lua/include/liblua54.so | Bin 413408 -> 417536 bytes src/kOS/Lua/include/lua54.dll | Bin 518144 -> 518656 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/kOS/Lua/include/LuaModules/Windows/cjson.dll b/src/kOS/Lua/include/LuaModules/Windows/cjson.dll index b01b9862ad0dfc8110d177c9773ebbc1d6f8a941..50eafc23bb9ca47839cf3fe1a2071cbb365c3377 100644 GIT binary patch delta 1332 zcmaKsO=uHA6vy9YlQxlR(u87>h-sQuL<&*blLr&^V2fx|OW(nFAd7m>DW0|k|e3Ze(&siI(mQV4i36xxFbI+OR`!tTKw_V<1>Z{E(l?Cx6K zy;gS@Ce<0=h;e(nYu;}>i>a9&*UZcZhtWE7VuI$P3Hh zN$gM@viY;kiv_vINPG&;fzQF$;Ct{B_!(RRzk|zQ9sC8ZfUDpiW{%WLyyFdEJJ<disx!GOb-85 zjkvp*7!8W2rt;P8mUO>Ml~CO=_js~!r<-ieoX<3f_F z79`E&@Eg@sZnnExd33jIb$s%NBENDSx3>B_dAwzD6VW~2PjU6B4Y^VAKU8KP?sdt; Isd|vI&=#~tSpT9>NDz^t zf>|OW(nFAd7m?bvIjK}s5Ir=WDhf6zg+LDt#r7bA&gA{JuzN6v{oXh8=IzYO?ylF} z>veZwQt6&Z8h3WP;!)#8Od0>hpMSg8FU-siRCq2PRTyK9B(b6sOWnj*aDSBiE4&sV zUxVjkm310{H(L*yG>!QRqkT380p zV29$6&7W;vEXX}U;xlj-d&qfYoK?W^4mav9|A7! znAaJL!NZ_>D8tm_8K$9NN>Uu_6Q4O1X*oyL?lxP&*aPq}_!OK4UxOdOd2j(-1ed^7 z@VBJVwaqLKf9HybMYBVp8r|Fro-UCms+15lYuXL#1-1IAWhlvV#_S%R_`m0`+2^O; z+g-yZHtOdzd&1~hyQdrr4m+I5(`-~@%ps*$c>8sp)&Jmze^^j Ir;-o<0YiJy`v3p{ diff --git a/src/kOS/Lua/include/liblua54.dylib b/src/kOS/Lua/include/liblua54.dylib index bb56076a8080c4c3b8866c2342aaf5ace38fee6b..0682b7a1f8de5ccccd37980a81c2694fcb40f532 100644 GIT binary patch delta 38139 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 delta 37907 zcmZ_130#iZ`}lvB`>CiXN~KaMDqD8hvuEG;wMl41mMmj?ijciLaV#N(keN)lYiwC3 z1{1@KC8KCeMoh+5gx__ZbM=|e_xt_-@7JsQdEVD`o&7q?eeUy+|FTB*%Np@<)r!4| z`5FRqYKWg^ zAU~Ko(dwprZe>?^@WRUI3mvZ~_xGOFx!$yYOr<=BPRKZ?eRR*r*BaA|Q?&az7OKueNUg%F42W#dZ=tb@uPTLzWIm>xE9qMGS#ljp4L zscC<+)+X0xt7yEbplO?oN6qRncC(hry5&&HGeTN=YcBJSn&T<6#CUe|@uho~jVm2% z+R^40+Ad>e+u<6mYr4|0Ez7!QYSgoa$t@_8jyBy1TE;T3nMQS5LThH+>ts!78`B@1 zx6^b}Oqa>jA>&z>W|XFx+`G-DhfE3GTG5`SE8P}ah3Ak&s1XNK<941I5#3`M%R6Ga z+OeL=t*0H0%xKuNH>E30-}G8W`);J zE*XXarwlCGGvmV0OO!6mST(#46tBJMw~_wr`5qG+^*uYY$8=&;JqTYgs;x%HWw?*$ zlqQZ7+QV!|T!yddMR2^N%2HoXdIW+*%$bw}EG3(pNq%NX$0qDt&{ ztBe~{Yf>sq&msh5FJ{_d+TPS~`Uje8@{0_B`-sT?j=5ezjS>Q0e-Rc~p_Gx_j8l<) zC=JP|G}D*TZW&ExIZ>8xnbB)@ZBAR7rp@)Go~BK6N3$0erhn$1vASoViB=>i%aohs zka2BZF=xjOrXLpmWmo}9f2To&uhu>7hT>$ zD2cu`-83|@aSczGgt8}40C0cV1t3_wSF)>VdtzV5SD#7Z*<~K3vNiG{ngY;+XC-d8 zKMR^7=rn`|l^ucaL?pOV50Si;+hyF{l&*oZt=i_{viTE9v?^vZi!685jH9HL%u_xD zi#MIy=0sPU?rmGC{RB3q++_}?^zD^glU);HUwsjF(oSXu%I4+PG~x7r*{}i4O((an zv#k!YiY!pm(4@&#-j#y{Ldi@OmYc37d9&n}roWT?Yd`ug&2{)L^Y9q{%!M7$Ji+Oe z_`DRnAa|=l?C8ZTGp6h?QZ2sMIUCdSozt`;N=h=u>L%a)|1eU^p(vI zo6}#*p!!JkAk&2YZla_GbQr&bCoO1hM&Wl?C;JDctupUqCZGxa-BmmPm+ zntP%V^)>A~F_kVi+3Oyx_?@Y#{+@;SXVlMZQJDs3gq#nwU^5$;zT`V*r02LZcC=~6 z&sSSouuisSncK}y)~uj)#`wHhl5o+Cj@EQI?N+$}>c>g7 zWNAKprzGCWJ*W)kjk5fYB%zZ>^q{vOw<6?Kk<+f4!4~GBS)fO+RQ${iy4}4hdGY(sLP45m7!W`whgCE{dyASDG%Ys?ysc z(1E(?rB&$`O52G9d%BA{h$ht_2}==HjgDp|kHqa;rjUVb0Xe)?Un=|F#{bg*9LNGEVMu!BC@g@!QpI8Q(0N~zfo;B z_@18TK}$HxdLVXs(|YV%^QW_bv8Ni_t3a>fLs@0&ChQy0P|C%eMsyoE@XX43^#Hn< zQzwzol>P}B|E3vae5vlzoDSynh(4_q4PdNzpV--&PWLiwgT7Inl*u`9H_T&Ha#d26 zUmZF>3;@o0!#1=(W&hmPm$ao}oTlrA9q2hr=H;Uw=uUSscCMk`qbF_8*!i3KirzGw z(|En4A8idzQ%SEsfZk!WtDuAF1D1b7{63i0pf$wX!SpaYenadTLi^F3`l}(-(o#$R ziX@8sPRv<%7y}+6mW41E>xVy)#7_(R9{jS5i?cs4cfE8xZD&oF=q;v#4SO(FzdxOV zKi?cH`pux7X)`@x1}&zn#6dUCqTQ&$HxvqF^6J%0l+UKQ)JMM_MK#Lon(4pHp=T(I z_t8!BXiEkjDt`Kgexi%Tl?BkY&)15&3+b=65lJM`ykLM~W~g3i5k1M+-xtN@CA1;U z6>pYM9lRyYNbA#F{jQPr)tHwPbS)P>D3%5rw8(QX*5xLZ=oto*@x6@ZlI~WbsG2tF z{`&9xsRh^m=?4}wc7dm*-=lWA^C75f)~TcHsk`lG&mf6GFf5rH7My#Q*nNbWSpHzW z<+pSRr?vFsM=7ix4(l|7{>Et={oVH`uF)D6w3mML7M;x~)9c)kwH)s)>icomt#f`_brbsWQSuDMcKJ^7%OTke}U(zHCONi;w z0kQ3G+Dq#!dwJ2{vY!;#3h!6+AWhb-Oqy& ztdPpAXi)2-2c&h5A$m~JBhorQAgFAbIQx;wePTr!9Y#lqhh_9fc5Pcf`i14Ch^rszHo8)TmDBOIEB8SZ z(1g+h7mAzZbU0g>B9;`x2+%@w`UIm&h)DPZKCnZ0eTJkrh>@SEi7pi{KGQ?s7+b#3 zbXsHf-v8?mXZMP6lwF3gtqx-zbg$^fSZ`_)35+eIOxSYf&2H=!O*tDc9m~X7Uuq)? zIO{^I>UA_WoH>TIhs-&VGU;c;AI3VEB5H^P3$}p@;bqAlQB9{-EReD$)kND$ESz0V z7W*r)NidYJF2>25a{A;)*p`8^l2yCfK80qO&bKL%$QW3Oh@U;#?Ib=twcL zDtt5(ud1>iDb=&=7!0XLc8V%~tcLDcjcJrl((6=b@a!-^EOuhwQ6JIJnLS`Hl0?7S ztfolvVpgJo3yWY^lJspZtO}*e^@BB;i9+vh@5X*&FSd)y?vTA-M2r`66>HsD5#1=} z)PlGsi8>x^vtzv16t@KC6Fq2t*%u)jr4!7tBG-dWp& z&^tB%jY)L-BSo3L|-ZPLH zIrN_^ZK0LZ^?~i!cuGg>N82+`TQ;DB{!1@5lF~rYun!cavFO`}4F=cS-G>Fxh5F4t z%qV?gU_U5+TX^hY=PRZA7t~AegSytQ^=J8v4iiTPL1wy%KL&y0R5ug*vR-^1%oe~r z{ml?InS#p{3}w405i!HqY#Jus4r9KwyKo=QPO=B<^!vkEKSpcl{-f9zh*9?+%Vulz zYkfxu+e_&((J2%vPe@tfC zET+CVFokV`KGi;)^=79hh}GfjjP_p6F(pTtn?B`h=BB|gv3xq)z#hbj8j-9PdmJZP zMzVT_@|7epL4-xJ)grVlbzwiR)GN$y+^?B;U)_j&9orNhOgZL6W|F9C;&7Y&S1Yq=uW$QrX}v0{Od4TJgNrV&apQ@k=l z57?}?hz8%FL&ew_aMiEG=@>Se&Jr$5Sr^+z%hc#8AFX^v_)>U|Wn$nm2wh*yT*f*= z{TyA!y41*7`hQ2+4a?+IRzrBkvH|pJ8QAlg;2Fz5^r?#p2aixAV6ga7@xR7_vN zPE@vrNMu6CmWoCzSuJ=v?7NbgtnS5_#aUv)8R`a)-8Q;i9P?xBWsGREn$@OF^s%ei zc8z^%B|fZYhiHJlZv&fZpw)EyO>B)ux9B^zvi=+fs#Nn#~j z;uOI0+&Pu^RIGkaNG&pVJcsomXWZ027U%I(a{my739Y55U(Sq9bwjVxA^7=GqN{C|8NAlnYi*DJ8XnaJM%`vZis@xp9Lj} z=84oc=u;|qJTZ_@z0u|z+I%9)#>zIR>>$|4!f5g2mJ-YW+)6n!#_aQNZ1|)7pX3~9cA7j_m+MUkFm5NEPButu&5?OL2`26?kTW6 za@HL+CrY`@4mSj4$>cjimSDyBpD+u6VSCcdY5I$!Y!|O~FXoFV@CeFE=C!~D#+9;V zV&`$zh8`35jzjMqDc&Au0q$oYHMyN4Q~wjb%RK}6JqFfdIik}E=B=Im@I{!CiyXwF z6U^EFSMxMIuC!noNq7eVWYoL)xJ+5YtWr?clO91?gzjR^ZyEK@EM;?a-X?`Y4rG;Wu7UW~j$}hqNi&!d-gUEgHiht{vaFS@A zf6av&Us@_&Wr3d-h`v9-m^MHp`~XY2d|`W%{bEIzeGyM!c`JfWF=zTl&{NRHlSJ!N zFzn@tkW;Ysdnk^af|>WdXn2~nr9X)9)2x2&1(;qz7m`o_3(;L4Wj&}(FIk!P%f*S) ztW6aQsP>9pK|YJmr&(S9yjyC6OxiDkaOPbm7g#3(=f*1CZtLhlF{1Aoww-=0o}Gc& z$?Lf2e3ngOmM6ravup_qd?)HM&`OThd<>P54>N;w-IF3AhxKPI zKkAQjm<83|$j;Wdp0luP&mDyGRhVF%{t>;dvO)AmeaBT8T3PLXM2%~}8$|duSk#RdH0e#@VJF(YW@#}R~%l5tT-+GM`^aeQca((d)_A_Oj7m0qkY#Uu6 zp5-!E)_S2Bx0|_{mOQW)4R5lAjv;@`Mk86WI?V0cDX8@rar!1W%X6{g7VF`B?-^LY z`lKRZxkoeS8z{+y<_@OZ7FP6$?(&PAf?wHS zR_&T-`5UXvDqRz!Y{wT91QEjkO>9dE3W^> z0&Kro2toKb^T;$wRJse#3qOcWcVY2%RAkAIRPj)L>=N`Ibo@TT{~q&TjbDpi_gG!X z;>>$6e%ut-@39^Z%b=ggv9`i}pD%*KCY!jM$gaf0c zw#@HElLwI3v0~^0$m=e#_yN;lgl>@sUXUpa51B9XUnCkmgs#0^jFf1#KwtV0h6orx z9Urj_hvcU+Hnk9yjof}NG;(||7vbKYSsG$2qX%skG@m)uSOmN0Ruf1^)_ktT9gz-dBH>T=93H_J7eOa}Bi4(sCgyNH9D2re&VQkM#BPoI!nATl26!Rt7F9t#P`aS2?v6EtOQ*uHxs`daV}tnO&>y9IAV z{}i^CybCQ811at-VV_Fd39)jx0bvk z9W7c|@m5eT)2#U9I@NlEt=up}-zl&rS?3{P0U3d5&Mc1*WmepkwHjiYzNePS^IIDc zREb+Tt{J70mM?#cV4NV}>o3IEN_-b{?;$={;x(DYSW&YwuSGwJ)|L5iW;aq;So20A zyE5-eUyFpwJU}$J<_`3+=xNQ{!dBUGYc5!?v7(j@pTruE6)SA`PI^n!u?6iI5n>C) zI3woR^2yAixA@(bf6Lm86zi+-dh{=mRfT)7$|J=6Djc@ag@0A>g?tfH6$*PwWK{)U z_(K#_<@H&o5qcFn-iwZGIT}iUvw*B^*`#|y$<4-6j-yQownE)8Frh-Ld@G-rV1%^N z;MEKE{?6T052wM=x8yQ;f;ei=S3(I}SL0nAU&wmuLCf+7cPf*qJnm9Cp-3cD3IU!YFSDgpIW|uhaz-PlUsEH%@ zsJUO}7M%9wu>Z0S=u|elr&#aGYm2pxJkZt^G9gEAxpWyRZaVTVH7sSmpo^JZ2gX$C zIy*;;My|Z67*m5cVDm<+2-0fs8TOY(g0(AH`v#dyu|hO-;;wYH=;_3LS-YNMmJ?qJ z_5Id~w`FdlMN?<~J>VbCe5GR(8TNmrlp|tXcqHt0zH;Hi?LRjO4R;<-vP^MQcyq4E8godGdKIV2F6?3BCTfaP;Edtiy28#*24% zwyFs44dJ0hWcW>xvPgF0o~-*|@q-s12K#Xkm4|3to4diXp>J)zjNTPDYxD2m2{^`^ zkA_4ZdUJ1jT~Hq=XtZeJ17qYu@S|kzUMk(C!uw~6kv@DdYd=_g>%%uQr@^9o9bOj} zztigQh49qFD0HB|H%-Oz^nTF_g1!ytZvX;+;ZF`ERJ^2sJ#{5}ZTUl z2ySRrys(BB4PG#rn#9-v+^NPxsHC$OJTmJ*L&MS=*7ecVjHzN9xx5OwHP*#cZVJ7 z9RqoP*1CsyIgpQ|lSSV_e0&W@7$5$#O$m|8m07Po;`|_9oB0Hbr-OKR7SKm;G?+6A zvr&^F{5#gThj=^$oO+x-awyNxV28P>|_*M!2$){)KkxC=>0g#Bw?AF6*^C?9Q`+1UJG zXWm^47k5HoT8kB*Liuppo)Cw*ZeS@8E1z(BEc7E^!|(;;$Fr%t2dgt%G>zbO zSqEJo6~TKkt2!rC_Y{r)W-g|O!Pa{2bUuZ`(A#mu?1|m zC(PrAS?w8mhxy=dOpDV$EZ{fnXuf`B4Y-nHbZ0rtn?1oiJwJxLP8Cho@#>xrnfJycw$+B(|;NHQW5%R!t}Qu0drLJ>RiC$mF05vd2&#F%Z;F%HX}1lodQ7 z33h?v6lZ@DQB}FEqHT*s>m$Eoa2T_1uX*5^vYTVk%a&*Z`e$ zl~}xiceH=m09pX{3}oxcv1z8bzJdF?|9bO!6QK20K00z?Vv2U zbd+Uw^%YeTc+DF1JF0S5c(&BBcA`T9ciDz2 z%CQuga}DdvC1R_I2ecRu4O9`g%+P4b@LpZU5Cc5itXI4nxBzyY$BR!U7)b+LiSvp4 zE9TKk)ZN5Kv0A=j=_cOYWomtu+U^TuVN-Bi=`%=`(MoHIMZqRM*k!=~kNT$QyP5l1 z?XQE*B)8>7x;wlfP1(%tXpT6(8P+HJS}OOJ`RfGv5yD+?4}0F`e~Nz-eFcog^TZAT zqiwl3C-|R^(cb?qVs^uUwLK7iuQ`Z+mymMx2cXA=X|zu&nmW%9dloXLNu%+ z25sfFZKEslz{i(P5HVZ9b<)JqtuRyNh)Y}fWXC}eTSYU#lVs*&Zgr@y=(LS@WR<LJktTNaM9b~Gv*Weessby5dO|k)#Ec!>hI!NxOLp)Y{=Y*_$i9&ZBbz_O{tQ}` zLb$sqFLDjaqLs+Z+v4;N?&Nb7dW1BW$^8r!A~z)@L&mB#g3QWY2a($eUVeJ+co&R`uf@S#e6)RD^Z%*cCmfTZ zDBJb+$$TEA&-CNF`Ew2<=^jG_# zZ@KKAi0%mmkR4(fJW__bc_yq7?Nhmv77gmn9k`z!oeIxGnggII`=ghhbr2?htt=Fl zc8w2H7k%hqU^-sElg1xW#~w@m&9U@*nc!pn%D3E-!31+NowusgeyU3Mh_F8juDMkY zIm-X!4naq8I}=Wng+QqLlVySf^`58)g!Ok~K1#iVG9cH`+ zDPm71pU&)3^lDkW4Wlu7-;+>@tmR&@;1pj0^+Qj?jImivJ8fQYzB&!*UKE|q!0Kqb z{>K^U!~SETA^v+g1+&Gu)Pcu`E4=q zGORF~*BARQ!+QO#xO17WWESlZAVU3_U@KpM}Xq^KO76J9d zupBwgHay_x& z3Ov=m7niQ^&}wzvWQpL|5KL{*#}Ycai8fbxORWjWO%V?oz{4E1a@1%a>}JeQTz|lwgqy2oB|LL^G0oI%Z*tD9o4}J#BUm-TI3)fq;J$k2 z+k6()E`nI(hfx=?_!khC-r?;iG)#-%z&rcuyMKee4eyk%+=ZrirPF&n(i$fInT6cM zdhOLM{@@EJeXhqmHm``8)cj?*D?nHo()F`)hFWU&OT6 z&@H!%zHi_oR5X0cpTO&N5Dpd--|<9n1N(RIz0Z4|0$|PBRt&b3 z0jrB*TP+DDLy!&D^Qvgc6ap=_1G}lZt-baeWo^U6POf!kg}p=-du@=us5+b%W#dp9X9>!GB69@-4Xf?-i!2jVIA(n={i-d$0kk9Lf* zX5DqrondsDe#B2(M&Yp9i#m|8*n04T2YOC4sRv-yK*9tCYa43KDgCUUYox&to-E+A zyKZc(4P>xEd9x`b5Bp;9Iaoi{LgwjPod#+b80=Wtw+EqfTgU_)9RYx2iA5b{X1eL) zJ8IuB7Kr5084jt^Gy1tM+Mg6ocf#jjy}X;2Na=3#Rk?LwUi40J@7W!!=tydY}eB1NbNk27{^R zU@e=Tkl&xf)}|5-)zVnZ5OZUI)0t%xhe4QY;^;7~BmGCb8m0;DBy3@dpx3+s%@+2< zAS#;?+C;ihpE*K<)qYE}Om994az*#+USqV5aIi)cj0D4D;~;yNM94VEUg>x(LLRaJ z=(2f|W~XO{Xm`!!4b|#1+EFBgf|cDQDLf`lhXJ&kBEet5l&>{A%5s~FGhx~w{n}K> zCYz#2L`>7->3#8Onik2bH`k|6*G5rRKUiFi)M~+2#j{AQ2c4`pnW0ss%r981AEMP0 zcEhNZh?)tm`nRy3r5WkZdcrI)plkHqv$a1NvuP@-EYJptyt!H`yWT{>-FaFt-6Xu` zYX{h$?f;EQFP|^7SHFo4Vc=xZVKH`*HW;44k1mpN!luz;tqW}^00)Z^OSEKG5};!2 zW7K9qwVXC;!`ZxCv|1NpxPJZH7hVy%m};IClLanD`XJobKaajnT$;87aNbc+vw#wme~4_8*KC{lT;u#f%Mj!N`P{Ov`)) zHgG)m?mvu>*Gvm~$Bd->9n+FNGx)UyBMmgpMrfSBffs9ma7wp9B~Co8xgp+~(^P9t zvh6r)Y|qJUch1_?;$%Por)vW^DR0Tylt4}#+Hg9d4JTSB&hK`DusyjUttTgO{W$N_ zpBows;AF-i&a&YNHf|KBg`wrWyiXYvp+O4rE9Bt)O8*Wy z`hen($mPg%hbll?s?u8`2OU&wi`?~);%a6#+L0lLmB1AZGLdT|N2MvfKXNW|W8}ai zO5X}O?pwuOkyF1@+!s0isN!Lg9ib|7Q7{?}CVVe8Ueq=lPie5F2zs_lmCPB=+(@p3 zOyDe!WP9X5WM|}fWOw9TWN&0UOBFr(p;1W{#aYN(swzH* zOzah3K_26%_!e?IC&d;15P|$V>MtTcQ*0!~D0qto`OYeWFUY|zifxirE#)CQATM%N z`ikZu?uy+}e+=0Vxd^$bnKfvhTH^j?t-Em%tZij=yQHXuf_uTJ0_=r60h_Bna`{?r z);B?(U!W3hj+|mt;aefw8I*m8ittU8zKdcbi94qZ_G8J5ZDfT1X)pM$u8Q`Y@?|Ij^aa#b|e}DG%r%T8ujy$ z&7KZ+Z;&^lKKYrLm7_H>rV&-riZQ5y_hG!A@JqA*uYy*jn`+kEk&1W=kt+%Y2N=!y ztf+`F$gB353+hee&-7$LDr&CqnJUP7Wk8C#-ua5Qf*OOHDZ@txR298JE<_G&uJq54 z7a_ky&PRTYJfMZLe~+Aq{IS9w`HNyB@oA|7R7zDDNJg%TY}ZQZ9gxQaDt1Obh3tlW zthLg6A}6&`?1LQJR&G`M*t9+s2?FGJwIN#0X8%lpLx^8O}CSXvnZSaPxmv@&$AlKx%; zX<@PX{#wLY8EUo4E|YZa7kMu(0l#43(;j^cZzpdv-gijA6Zy~_#rBa!CMBejLg`2g(w@Nvz z4>fY?v{|-B474^lH_eQebn(56zT6xpKUPK<5k5PLytavooDw!GjFj0x3tW(v@yEq> zYlC~GZJtsll3pdF7-G}0xwIPVX39>*N!$^k|SoTAu ztd#e-hZOG7zl(h~20xbkMEq=HaO|DDO6t<`;K)z-f-v&9Dx|ediejP1LVlOZdwRJH zT5Oi&z*a1j_mjNme3tjz_wt_ftq8C+OtyLhvlTSfE3wno;4&!fZ%J#5{AtdsYWt)fyDLnEuT zZ)A+cheXFJhMJCW!V4$~h6u3uU`{KBiRo1gO{(OYOI--P9jf%PI8w#nJ22l|=Ggr* zy-DO&^_g?RXN657cdJ9b_ejH>w=glWNpq%$&L%Ia%N(n0z6Oi9cjow$q+RSC`90|` zQKzb*sa48abJ!PRd{x5)&&>6eWRk1oJ$IwLCvA}Tk~L=eI`OEg!JBPaFEl$t+bW5_ zN@>nzd0+ch^tCg%v|sz1S@uTWOa6po{cO_gs9E9DCzHQw%&quZQUfymqckZto2M1Z z@41ily>^D`j9-kl(6g!;0%((xRaP?YBl2FpUfvT;@Ftec!#MwOpC3g^-NF45q%v)t zaB(oWvn^}jH@{Hf(K{=HG;^1j?qKL@Q{0ZQi6D_;LP#Lr%{qhMAbcf6v=Q!n#S3aPyDf^muzdx9^2fJovGR)Z=?8w0nb zv2e?mx4YxumOCEukn++%h()OMwy5yP=_Idq`1Gi-$ziidLG9^trhNrpj8AK0D?P6* z3o{Y?k(AUn&mHCrzpYK!#4xCfUu(}MA8W&Ka6uL?KVAB9*mQEmJ2GS<`Pmx=rQfYV z5&w(4r(Xs&hZ00V$M=q!GAj&>io7dQm@}8Wgb<0@)F}OgyzvGPN%VoxX|heDjc|)y z1h*{<;dX2;-14QYd@h)WPo5H05fM4-gW13615f*Nz@~VPw22^3d{haGK#@Nm@{}4a z<6b)oZpRjYjk(#3E9+GF``S9B(pQm@5n&rhl-jnLihVMt}LagR`PcDSE zhA|HF@mt+F)56F@h&g2-v_!}}a1j-LGM`MWTm4@G}qn?;w1>AM}&2!MHRM za+iD#a%VJ;#pd1-=MOC&M%MX57n%Y_@l$2lCd2K`Y`CqJx44;vSXDU5GXGFw@<*ST zPY(D;pf9HRtF-5nqy94@rNJz6!XI1ar2l`MH`|~0BC)dfmX4y+L!iMn)*~#ET=M^B zMi>$Gz*l~j^_cUE>}=r^$#?a>hUm!gda$F_8x-YG!BF&`@b%hDF}kL~-S|`OaB|8! zg52?jRm3)*8RSKsS>$8g*`(AjitMddQGqAx%?+D1TMi0W>dC5GPz$rJd)(spB54|g*>evIhz#Mp8;cD z$mB5cPkpS*()wzG{9J!d)TBTXD~7uoCb>SU7d}2T3TkOQ$*CVXBW(J3vRbaJVVcnI zyBeNrm5yoIhOR+zyj;)qgw-jGGfkZck$WG_{iGow9g(B_6$e*veZ@nOv*8y}@(Mw| z8)QZjfgIdT@m%C+mKbCB0Y zD*hEYcedickdHy)GJW#4LJ*@2z92_0Rc!05YAAD+;u^?ls}*}AN32ooj~u&JaR74R zCdGls!JAe3q$3K7HY^9 zoltF(!t*h*+9V~!6gjgZIXf$BdbkPLOLL;O;SR7A*)SNLWUw6)g~z+6H%Zx zN#VR4vf3miWC^m`Bqd}Gvf3miWDBy|Bqii9vf3mipkf&rTeXL|7w0Y(^CD@1t11=~|t_W~haVqjL|qV(KVRe9GtiXD*CkUf!u z?kT-5ax8LyEA)T!(0gAQv_gaV4-|Jp&dgIh7&-8v;<3m>kS8Ix%UAm8$VtcxkhMRQ zeuXQvzs!KuQzZ~+kcXU#>|CVu8OYhl*~p2{l>Q3x8{}V*gW<=r@_LAT3c1*bg89#t z!5ifCV#QyOo4-_C-A!dUwM4NOa>_r78zFant+*ZXfH#W!AmNOA{2a(llAVQ8KtJgq; zTtZf_fe5*YJl~3{`S&gg@?>9TFiC$m$gmA&ZdJDvLw4?>xF&K=SH-@_LERKLK|Y1t(ac6z40cxr!D!&qL-7#g#_$hi$!k1v zBJvF6Exna~9RiATLLr-&g6^NtXWi1_fKu;Mf3Vuot-;`8cxO2&F%Z>^4&I zb>zUYitiz>{Yvp;Wao*B{{}YC|IS}4K^Yn(!I?vOX!No<2hanGGtT+_8-4ew!k-K6yUW9xKc_s42 zXk~9go*1KehZnTJ^y(xO97cnbrOMz0vd=Qb7m!CF|BM`m`~VsL-8pj&79vL=zeLVN z{$xaf-3k@Jy0*$tF0vEyn3YOj8@Y6q;s(fZ>lC*{9!46#Sf4Je^6Y6JpZKP_sES;_>*2r7VD-N!(zod8s za&V5~smKkkDqe!T_Bzi0CKN3CSsCm=K8Bo%JS11?k0KW%pF{S!sr1*7=igGChkO_L zC33_sI8b~*f%9z@z`BmAk*;?X*FZjo?1}saxo!pjrtDiH7v5Fe3EAzQ;vvX6Mifjy zfx~@eFcmo$c?t5A2TH#Nc|e}xO~{@P74JvB`@7=rkk>v^oP})c`dA4rp&%FeHnKWv zLdfsP>Z}PNMab%`2_gR=tFtDAlq0LNCWIL3sv1>CO<;pVG3+xxRT-#>2I{N{EEypkl>K zkl!G$L=JqR^d{t3{vtmEwwa877)v+EJNs-mD z9zwbxt7AOSB*^L*4QgFM1jaW1l-hvJ9G`N)4E$N4IK zDRNRh#Rem6I?F0AML`wh)cVT689BOvVjtwZhKd^^r!-RB2HDPh#*C02$i+>Seh9KU z?*#2X4h8DK6CvTq>cA5rQON4R69hn32cFs{>Dj?5waiA9x}p6N8*cVu>FtS}or5}iVOfsZT zMx!7$NEw76tCLjV^~lkkmEMT#)Dwdw4OiR`*=mI15y%n9Q<2q~GC~$3UmIyu0oI^E9Wo>Ejtz5cK5PaX z2FQtHl>JfU;IWENAv=syd>Ogjc*WO|)nPXRZ_rfyjg2A7;13j(PFDOk@|JMLWylvJ z6l?G@N{$=Rk&11Rb7v`bMLsoOu^;k~ZxpvcHm0JW0}5;wD1)BJV-_nOfLw??2Dx~N z(uX0dV|au_BCBI~@c)eKq;+322~>;SsV8SslY8WFN9Rh6g{?L!M|p zc1OrbWOWP=UN9i5V|awzLRQD{z=_Qa{^tW{bL90L4U&+{kWZ~vdW#0C%01UAwnL6U zu7#X~?1vn;UfH)qZm>adkYqXkrza>uFEmKmsCYDTKJp~w0f|aK6FCXlSizf=eigFS zX2tOp;gOSo&CmbMw=U$F<~j134A>9&+OyN?(9nh+K@Ev{UI{ zH^BM75Cx>6s^Z*T%AgYRv1G-L$hUVZ_COv1XQ<@mUty2j965Ne(sx7-+NZczLuh~5 zjjZI!EVxEi1VH`@x$uC}PeYynr`+T<4>{_f;uz#UhZJu__DoZ}1$hASULy)(QE(Lb z8uDr6xNlVimyvza73U&fM1Fu=`n}RWMb12~xCFTz*;tN(b|;iUrADeoF6xS_B4=kR zc0+dfL2-i$d*o)wGfpafXXJP|DIl-D$k!Ab$#4|po>m4S$Tnvbha- z&dFB189DBp;$6t(g5oq}_#F~t2ipHkMFba>!BynwONwtJ=Oh1)T>7KZKSNH*QT!g6 zTvf~hRE?G*+aizo3G{OQbE`0r0=WE;1FtJ?ikytx7TM>9()X&c|5@=co5pvNZoc}wa;C8+; z=#SjBK=HVW0LbCUNspC&4svv%;^oMv{!+XNdE#@$yOE2H#Y&Kd0>6J0pF|$=TJdG% zY~){%%ik*f1LU>u6#s?X?t|j@$P+#*HZ)N+W{mry1l3V6MB`>3@Ia0-|9Az?ts}cx zD195`SWCrSkyEV{_d`yrq<94KZRClHjiep?3{PGWXwavc;<1&iLH-K)ZcC+)1UAqA(XEtVaYX?51*E)IA}6;|ybZZeJH-c)ZQ3h7QNbM)pGPi6 zzJa`@qtfR$#rZ!tNC{q`fnR6E<;c!m6x%jaRTzitj_lA)>HUzeA-6!j*j?#^kf-!e z+@~4N|86~%U<4W@B8OH)*hlFjkq7isybyUpf5j`1JqIdYhum(k;;qQ@k@p!<(0Hga z_!ik`xZ*R&dB|6ghm2ABUycq{kyAre1mlqNCo2v|9xzq$H^_;| zamY5)lztoXkm-t3kTcB;?f)$bqGl-r9XUNp@de~|^AzV+*e_9BfSik5j6Bh(^kvAW zq7@rjs2V0Qz;ga~M1e!BGVnllTcNl?MSzux1Cf)EgOCg3lztd;&??2D$ny6p@`^-` zgWq|`^vO3U(9AzI5pq6q5pv)TrGJfVw^MN$@&sgymZ}M|cVZjaqhNlr z3gC@AF;#IROAGm-OD9=`@)Tc1E-F%d2e~9# zGuuCrEa(4gF-lO324sceGUTL{iVcCPiif~)YkAot+pJRTihOsqVqfI=HHw=d2d`D! z9@tm~GUvQW2?k07U_a#P$ODj&19JS&W_?q#2L+9DRe&SNcJMzIJbZiY^(@?=MhqnbK!R~ z^7;;W;ta(TyAFYTe}b?u!av=1Lb2CJ0nlQQ#L-x z*U-Kx^2BM%J_y-uvf@D%`UQ%oAm1LUc!}f|aEltI1n}E8a|U7uE0za2WQLr_C_avy zJw((TV%TZSmjU3Cd+E|HDqit4$e+8$43) zhkChN0c<1}@$id$ST|>2y$T?ooh5r>hOA&@keuFD>1!ZQY^k^|a$#%5fymkI6!$>B z=C4?;;j79c4-x;braJ+LstW@EJY+)Fq=hK^Qg(_ciR`k(j}*o(JC&s{M95yLQBgvc zsK`#1v{)h&lWd8SC1OO9qW_Nbb)IJ)-tTZ_Y z3%~~pa0~nb+82TgAiow&J%rlRPMx&&)#}K!GZzOQ`<!ISmKw1WYyzV!w209da9c>Mf0BrHRhr-4P%P<=LdG77m29Or}l9E|ft z?gnT1BaecmAfLJs+ZET>I2t8vz)rk0Ya}6aff*u@1;Ixnk+H7~ThEsZN7e;EDQKWQZq637>jGr@c$R{wI;Nl?Uk6>2XNdzn3 z!35el11k(fCbR%Apo=-c6zBmSuv8*yuoqksgRBOoLcI}~^*pM#2YX#d_5m-CU~7#P zVi*MYE}{hNF75Rm@e4z~3m%C;ehenV7&e1BVT^mg&M>5t|JsAUgBh-^PmhShp1Zm} zLzOFN2AtqlSOZ}&6AXzWn2?O}wZPFH$mU?abI49$5$G{raO?VzVB>xP0xG)L!5=HJ z;MAkYH^8R)$hqJQ$S(s^wNX8GKmGa&rRpFLfOkMX?XG&-HplIW)zh}S1qkRlp$7Du zP(tE)WX^x4HNc7hSP$wIz|=FSUK?Bu)3X52Kzm29Q~*7Woi;$=d;?Xkr-(9s`_ zsQPM$m!Tt48PFsTvB4s3Lp}x$Wkj|Gr!gbDgR_{BgTTcbkuQVO@yIv9IQY+KAu{$f zv=q`U0$yEnMwGUoINTRVww=yKPFC6#eNc( zp}i^83pk+sQ()TX2WZ6=Jfwph1g4%qjs)l0BPW7WZIIKzDvroG$V8l!77CR9YoLML z1P+By;dg?I!5_hCU@G`5Om79OCxdoyMh?^gFZ9s#dDo5gPP!CIkbr~|U6i2uuK~Mg;3V#tnQ5ogi^N33UQ{|=;;WQb>gGr=R^BCxeA%C7;F!EIoXAhetV;4v7f z&tQTzYX1$Hr0awiB+5CVAU`Ksdu{@{)WLox$Ohm=Q)DY}hAFAt8NW+NAOH2S z7DXoF3SfJchlFxhlyKzV1Yi#}0SCh#d=jjui1K~Ge6;IItb~J?m621xSp?*abz{eQ zYb6vYh6LK*RB5FSTmUm@2QOk5^0d+qP6SVY<5W=nPjE17B6M3|8-^W?gJ#;5+oT(6 zunQ7ePb15MX&?Bdm4o0v&?EZ)@9Ra}TVRkrN zCKx>}54&p({70UCeZo~>^z=L&?m1Y`pz6FEUTou5Lk8@Vso3in_A8E+r8BJC{33lO_9 zjh8Y+WTsSxG@kiQCkpV-soXy>?IGM@UvDI@ypqxTkk2cb@%8S6V=<=Z$u;q8_l?iy zG0ZNg<^C*hU>198pErz)dD){O#F~+DXeM`jUw@pWpR+>G4xZH;TKNufZLP1e+T+YZ zw#V|`6QU;h82xtGvWw>+FPs}YQ^%J;@SmHSP6d6 z*?UlHdQh1XLCEmZJ~u(vYWU>%Rcb*_PTr4RTeiX44M()3=GmTkGI{>2nKjt0rhasE zhTU<8*n^H)v%W|sr}ppkdlU;LEIlt>f77>nnrXZK@mG=irwpqe?8gsqA99%!;|``0 z(~ktu@pfJanb%dYNa4BvG5f&rp_mZ^x`2eKs}DDQKlWX4$*Dnfh3crnP2MQo-T5<4 z+B(LStt|YJN{eOmBLBuW`j^gjdpRl&$3M-vPT^KNE>so zr2WmLWl~|(h+Fa_)2D`|xW|j1wNGv+?NTMizK{28?%@#cVftOW{i8+kggL!X`ITp+ z7B0ba)|(f8gp#g4sGre#_o&&7CQvl~7jqhfZ!=vM`Fin7B#YJRhjM`^`Ynzd(ufwi3lzL$ z+d=N?bmN?ppG%b|h#zisD;Jfn*7ll}OV^SYUIKMY0ZY#PHe(;#)CSrU(i=c0U$K%H}jkYPa z)|Zqx!v0e?!c8lBF;q_cXZpubQl0SORbbvtW^NaMGmgRh*0aj*!Vd(^Dw>}e=o)FS z4Q)75S@bQlUiMS*`T3~{alw!QC0(7elwWNvr%p46n5!MnVN#;#D~cF?($ADiKNhXV zUv`(skZftTR2+JZx}oyD-HR2@Owy}%SC2Ne#l$s_Kc{2)?h9;M82mLFddkBT@7nGf ztB^;{^&uqizux3nD$Y#0-RT`x*a#h&G+C`IJESb)jVg^wY7)E->MzD3)6 z(E9ub$!%9DXR3yI$8QIEjAZP#2yp&P-*R8J+XBakw|KSYN??0gFQ$wdHPjQPq zePQJy-bb8!^Iy}apUwsd+lDB+3LygB~zu{kMwtL=v_43R#g$L z%5UUQ5?T;L&foF#PTAlX_0IFZ6k}(J*fV6Y6T`ya9fsan)iaUrTN)O!yHyRB-g+l4 z>zSiY)i;$+3)9qJe5TA$ezLo}i?2wBvdj0@v!Y#OV#GDs&OO9u$#fNS4NoPP4;xDJ z#ER@#ZDdNi?rrWXUKBQ2(l~XHckfx3zBEdhlJQ^v0U2&3<#~^Bfq+IoXy8H@0fqzx(1?qW)IZ-^;8K zdVIxVx=w7`A>Z{zSpT{FN=#AM|{Ut_Ztz(zodt|Fb9J)5#d{*0E!KX1p>xpo$ zWXX!Fa_|nLrxkA$+zxh8b2i0|aR^n;HC!)? zh4pL~w>)pIseOAXr`C%jYc#l9*gfwO3WJ;?I*KyUFHQz`GM z(ZkEJ;d4)mJ9efi+MLXB``K?4zVnC2xJ-LHWtV7OlK8h-fuA|D&fmNQUqm06a6ho} zt)=bzl|R2_Sk4pKx5kWG*&7~NY*uB7j0m_^D|fYb#E81NyvW$OY1EhETXJ<=i8AUP z$eEDbJZ(jOm~gSPZ76YP*u*pU+?+F?l6xlBHa9mcMMR9}e|r?>|Khk-Wtx$KXI?|! z;eiv??_ah>xm@(I_6iDB`{R^Q=59~lr|0P0eL1IG!%#=@3Gr(1uzQ-X{w}}5DobK~ zQB_OeFngG7pq*^K-=WxZ+HLx_+075`5pK%SM?Pn*)i(RaWlWwgve;@S(n$KnGnQ%7 zdwto1y*&PYtY}Y1423TJj_Tq!yqwXoHd0JCj^S6It};`U0RQ0r(8*nox4bI7Qfn9U zVMyw*?AdeL%J^j>-;BLP^<2&_v5ooywxbdjGXwr_lJdQ+rk9wKQ>8a6%NEwR{7Am% z_1PlXxyEJcx1v4$y~JBlKgKVl6?YXnTe&WJ%Kvdm+av$!tES9fp-H#NvfqAt={xM$ zja}}_YcoabK5^RAP060>zW-mVVCT@6*6)_;JrRa4nK>B^zK9W539a*C{x#04oaOmi zYVrGfhF3)^4~de_364}nrH%JI+Lm^a-CRlL?Y*75<6Arz6zY9LqN=N+!}`Khb$Z8+ z3`NFkK;WQUTqn>?8iw z5Kpa$0*e_r6=OSfl4J#5LBsfKa{$@Z(kU_jd($^9Cg;_lnh<&h7iwC+)^*f?w; zMwJwkUo~iIey*$D?zH=?kR{!`M#L3?3gzNoYF)QTw=3`jqM;aJ)sczijye(2ZD?a<8jiRje)@C?89^{bU+0flk>vTAG)J|fe zI8(j3-if7f&Eb%I-^)(|2P^;Fq?de~dRvQ1w#j6s{$dWl<>l5KZu&a-g`D^W!<+>9 zQk&wQk0(F1il4mIbn1@n@9zrH_I3wIxpsdS>)fY>Iu87o(0-J$%~;(;KRH-8G;dEP qX-cT3_B~mGMPDSz(rm3VB-^4`r!&gH$$C0XvsQPME6`{Cef9q^5)W1Y diff --git a/src/kOS/Lua/include/liblua54.so b/src/kOS/Lua/include/liblua54.so index dabe1f817369c39fef70a0a3ef8cfd857d256677..892b39cf85e525e6df32af755bf668ab324603ca 100644 GIT binary patch delta 89330 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� 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 M)Q;x0#y?~JA4))-FaQ7m From d9b6856a619643623a59149104510b002e82b862 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 7 Dec 2024 17:00:19 +0300 Subject: [PATCH 074/108] Lua development environment improvements Lua language server patcher plugin that adds support for the new syntax Annotations for KOS structures, functions and bound variables --- .gitignore | 2 + .../kOS/PluginData/LuaLSAddon/.luarc.json | 9 + .../kOS/PluginData/LuaLSAddon/README.md | 14 + .../LuaLSAddon/library/functions.lua | 1745 +++++ .../LuaLSAddon/library/structures.lua | 5906 +++++++++++++++++ .../LuaLSAddon/library/variables.lua | 1004 +++ .../PluginData/LuaLSAddon/plugin/patcher.lua | 147 + .../LuaLSAddon/plugin/unpatcher.lua | 28 + src/kOS/kOS.csproj | 3 + 9 files changed, 8858 insertions(+) create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/.luarc.json create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/README.md create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/library/structures.lua create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/plugin/patcher.lua create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/plugin/unpatcher.lua diff --git a/.gitignore b/.gitignore index 01a2f935e3..8dc821bb42 100644 --- a/.gitignore +++ b/.gitignore @@ -59,3 +59,5 @@ netkan.exe # .swp files from vim (temporary files that vim creates when editing a file) *.swp + +!Resources/GameData/kOS/PluginData/LuaLSAddon/library/ \ No newline at end of file diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/.luarc.json b/Resources/GameData/kOS/PluginData/LuaLSAddon/.luarc.json new file mode 100644 index 0000000000..1d91d5c51f --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/.luarc.json @@ -0,0 +1,9 @@ +{ + "diagnostics.disable": ["lowercase-global"], + "workspace.library": [ + "../../GameData/kOS/PluginData/LuaLSAddon/library", + "../../GameData/kOS/PluginData/LuaModules" + ], + "runtime.plugin": "../../GameData/kOS/PluginData/LuaLSAddon/plugin/patcher.lua", + "runtime.special": { "_G": "_G" } +} diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/README.md b/Resources/GameData/kOS/PluginData/LuaLSAddon/README.md new file mode 100644 index 0000000000..fb2668da30 --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/README.md @@ -0,0 +1,14 @@ +This is an addon for [lua language server](https://github.com/luals/lua-language-server). +It includes: +- Patcher plugin that adds support for the arrow function syntax +- Annotations for kOS structures, functions and bound variables + +### Setup for VSCode +1. Install the lua language server extension made by sumneko. +2. Copy the `.luarc.json` file to your workspace folder where you want the addon enabled. +It's usually the archive at `*KSP_Folder*/Ships/Script/.luarc.json`. +3. Open the folder with VSCode and you will be asked by the patcher plugin to patch lua language server. +4. Read the message and press "Ok". +5. Restart VSCode. + +After setup you should have the syntax support and annotations available. diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua new file mode 100644 index 0000000000..2775def62f --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua @@ -0,0 +1,1745 @@ +---@param AlarmType string +---@param UT number +---@param Name string +---@param Notes string +---@return KACAlarm +---Creates alarm of type `KACAlarm:ALARMTYPE` at `UT` with `Name` and `Notes` attributes set. Attaches alarm to current :ref:`CPU Vessel `. Returns `KACAlarm` object if creation was successful and empty string otherwise:: +--- +--- set na to addAlarm("Raw",time:seconds+300, "Test", "Notes"). +--- print na:NAME. //prints 'Test' +--- set na:NOTES to "New Description". +--- print na:NOTES. //prints 'New Description' +function addalarm(AlarmType, UT, Name, Notes) end + +---@param alarmType string +---@return List +---If `alarmType` equals "All", returns `List` of *all* `KACAlarm` objects attached to current vessel or have no vessel attached. +---Otherwise returns `List` of all `KACAlarm` objects with `KACAlarm:TYPE` equeal to `alarmType` and attached to current vessel or have no vessel attached.:: +--- +--- set al to listAlarms("All"). +--- for i in al +--- { +--- print i:ID + " - " + i:name. +--- } +function listalarms(alarmType) end + +---@param alarmID string +---@return boolean +---Deletes alarm with ID equal to alarmID. Returns True if successful, false otherwise:: +--- +--- set na to addAlarm("Raw",time:seconds+300, "Test", "Notes"). +--- if (DELETEALARM(na:ID)) +--- { +--- print "Alarm Deleted". +--- } +function deletealarm(alarmID) end + +---@param path string +---Path of the file for editing. +--- +---Edits or creates a program file described by filename :code:`PATH`. +---If the file referred to by :code:`PATH` already exists, then it will +---open that file in the built-in editor. If the file referred to by +---:code:`PATH` does not already exist, then this command will create it +---from scratch and let you start editing it. +--- +---It is important to type the command using the filename's :code:`.ks` +---extension when using this command to create a new file. (Don't omit +---it like you sometimes can in other places in kOS). The logic to +---automatically assume the :code:`.ks` extension when the filename has +---no extension only works when kOS can find an existing file by doing so. +---If you are creating a brand new file from scratch with the :code:`EDIT` +---command, and leave off the :code:`.ks` extension, you will get a file +---created just like you described it (without the extension). +function edit(path) end + +---@param listType string | "bodies" | "targets" | "resources" | "parts" | "engines" | "rcs" | "sensors" | "elements" | "dockingports" | "files" | "volumes" | "processors" | "fonts" +---@return List +---Build a list with elements of the specified "listType" argument +function buildlist(listType) end + +---@param time TimeSpan | TimeStamp | number `TimeSpan` (ETA), `TimeStamp` (UT), or `number` (UT) +---@param radial number (m/s) Delta-V in radial-out direction +---@param normal number (m/s) Delta-V normal to orbital plane +---@param prograde number (m/s) Delta-V in prograde direction +---@return Node +---You can make a maneuver node in a variable using the :func:`NODE` function. +---The radial, normal, and prograde parameters represent the 3 axes you can +---adjust on the manuever node. The time parameter represents when the node +---is along a vessel's path. The time parameter has two different possible +---meanings depending on what kind of value you pass in for it. It's either +---an absolute time since the game started, or it's a relative time (ETA) +---from now, according to the following rule: +--- +---Using a TimeSpan for time means it's an ETA time offset +---relative to right now at the moment you called this function:: +--- +--- // Example: This makes a node 2 minutes and 30 seconds from now: +--- SET myNode to NODE( TimeSpan(0, 0, 0, 2, 30), 0, 50, 10 ). +--- // Example: This also makes a node 2 minutes and 30 seconds from now, +--- // but does it by total seconds (2*60 + 30 = 150): +--- SET myNode to NODE( TimeSpan(150), 0, 50, 10 ). +--- +--- Using a TimeStamp, or a Scalar number of seconds for time means +--- it's a time expressed in absolute universal time since game +--- start:: +--- +--- // Example: A node at: year 5, day 23, hour 1, minute 30, second zero: +--- SET myNode to NODE( TimeStamp(5,23,1,30,0), 0, 50, 10 ). +--- +--- // Using a Scalar number of seconds for time also means it's +--- // a time expressed in absolute universal time (seconds since +--- // epoch): +--- // Example: A node exactly one hour (3600 seconds) after the +--- // campaign started: +--- SET myNode to NODE( 3600, 0, 50, 10 ). +--- +--- Either way, once you have a maneuver node in a variable, you use the :global:`ADD` and :global:`REMOVE` commands to attach it to your vessel's flight plan. A kOS CPU can only manipulate the flight plan of its :ref:`CPU vessel `. +--- +---Once you have created a node, it's just a hypothetical node that hasn't +---been attached to anything yet. To attach a node to the flight path, you must use the command :global:`ADD` to attach it to the ship. +function node(time, radial, normal, prograde) end + +---@param x number (scalar) :math:`x` coordinate +---@param y number (scalar) :math:`y` coordinate +---@param z number (scalar) :math:`z` coordinate +---@return Vector +---This creates a new vector from 3 components in :math:`(x,y,z)`:: +--- +--- SET vec TO V(x,y,z). +--- +---Here, a new `Vector` called ``vec`` is created . The object `Vector` represents a `three-dimensional euclidean vector `__ To deeply understand most vectors in kOS, you have to understand a bit about the :ref:`underlying coordinate system of KSP `. If you are having trouble making sense of the direction the axes point in, go read that page. +function v(x, y, z) end + +---@param pitch number +---@param yaw number +---@param roll number +---@return Direction +---A `Direction` can be created out of a Euler Rotation, indicated with the :func:`R()` function, as shown below where the ``pitch``, ``yaw`` and ``roll`` values are in degrees:: +--- +--- SET myDir TO R( a, b, c ). +function r(pitch, yaw, roll) end + +---@param x number +---@param y number +---@param z number +---@param rot number +---@return Direction +---A `Direction` can also be created out of a *Quaternion* tuple, +---indicated with the :func:`Q()` function, passing it the x, y, z, w +---values of the Quaternion. +---`The concept of a Quaternion `__ +---uses complex numbers and is beyond the scope of the kOS +---documentation, which is meant to be simple to understand. It is +---best to not use the Q() function unless Quaternions are something +---you already understand. +--- +---:: +--- +--- SET myDir TO Q( x, y, z, w ). +function q(x, y, z, rot) end + +---@param inc number (`number`) inclination, in degrees. +---@param e number (`number`) eccentricity +---@param sma number (`number`) semi-major axis +---@param lan number (`number`) longitude of ascending node, in degrees. +---@param argPe number (`number`) argument of periapsis +---@param mEp number (`number`) mean anomaly at epoch, in degrees. +---@param t number (`number`) epoch +---@param body Body (`Body`) body to orbit around +---@return Orbit +---This creates a new orbit around the Mun:: +--- +--- SET myOrbit TO CREATEORBIT(0, 0, 270000, 0, 0, 0, 0, Mun). +function createorbit(inc, e, sma, lan, argPe, mEp, t, body) end + +---@param pos Vector (`Vector`) position (relative to center of body, NOT the usual relative to current ship most positions in kOS use. Remember to offset a kOS position from the body's position when calculating what to pass in here.) +---@param vel Vector (`Vector`) velocity +---@param body Body (`Body`) body to orbit around +---@param ut number (`number`) time (universal) +---@return Orbit +---This creates a new orbit around Kerbin:: +--- +--- SET myOrbit TO CREATEORBIT(V(2295.5, 0, 0), V(0, 0, 70000 + Kerbin:RADIUS), Kerbin, 0). +function createorbit(pos, vel, body, ut) end + +---@param fromVec Vector +---@param toVec Vector +---@return Direction +---A `Direction` can be created with the ``ROTATEFROMTO`` function. It is *one of the infinite number of* rotations that could rotate vector *fromVec* to become vector *toVec* (or at least pointing in the same direction as toVec, since fromVec and toVec need not be the same magnitude). Note the use of the phrase "**infinite number of**". Because there's no guarantee about the roll information, there are an infinite number of rotations that could qualify as getting you from one vector to another, because there's an infinite number of roll angles that could result and all still fit the requirement:: +--- +--- SET myDir to ROTATEFROMTO( v1, v2 ). +function rotatefromto(fromVec, toVec) end + +---@param lookAt Vector +---@param lookUp Vector +---@return Direction +---A `Direction` can be created with the LOOKDIRUP function by using two vectors. This is like converting a vector to a direction directly, except that it also provides roll information, which a single vector lacks. *lookAt* is a vector describing the Direction's FORE orientation (its local Z axis), and *lookUp* is a vector describing the direction's TOP orientation (its local Y axis). Note that *lookAt* and *lookUp* need not actually be perpendicualr to each other - they just need to be non-parallel in some way. When they are not perpendicular, then a vector resulting from projecting *lookUp* into the plane that is normal to *lookAt* will be used as the effective *lookUp* instead:: +--- +--- // Aim up the SOI's north axis (V(0,1,0)), rolling the roof to point to the sun. +--- LOCK STEERING TO LOOKDIRUP( V(0,1,0), SUN:POSITION ). +--- // +--- // A direction that aims normal to orbit, with the roof pointed down toward the planet: +--- LOCK normVec to VCRS(SHIP:BODY:POSITION,SHIP:VELOCITY:ORBIT). // Cross-product these for a normal vector +--- LOCK STEERING TO LOOKDIRUP( normVec, SHIP:BODY:POSITION). +function lookdirup(lookAt, lookUp) end + +---@param degrees number +---@param axisVector Vector +---@return Direction +---A `Direction` can be created with the ANGLEAXIS function. It represents a rotation of *degrees* around an axis of *axisVector*. To know which way a positive or negative number of degrees rotates, remember this is a left-handed coordinate system:: +--- +--- // Pick a new rotation that is pitched 30 degrees from the current one, taking into account +--- // the ship's current orientation to decide which direction is the 'pitch' rotation: +--- // +--- SET pitchUp30 to ANGLEAXIS(-30,SHIP:STARFACING). +--- SET newDir to pitchUp30*SHIP:FACING. +--- LOCK STEERING TO newDir. +function angleaxis(degrees, axisVector) end + +---@param lat number (deg) Latitude +---@param lng number (deg) Longitude +---@return GeoCoordinates +---This function creates a `GeoCoordinates` object with the given +---latitude and longitude, assuming the current SHIP's Body is the body +---to make it for. +--- +---Once created it can't be changed. The :attr:`GeoCoordinates:LAT` and +---:attr:`GeoCoordinates:LNG` suffixes are get-only (they cannot be +---set.) To switch to a new location, make a new call to :func:`LATLNG()`. +--- +---If you wish to create a `GeoCoordinates` object for a latitude +---and longitude around a *different* body than the ship's current sphere +---of influence body, see :meth:`Body:GEOPOSITIONLATLNG` for a means to do that. +--- +---It is also possible to obtain a `GeoCoordinates` from some suffixes of some other structures. For example:: +--- +--- SET spot to SHIP:GEOPOSITION. +function latlng(lat, lng) end + +---@param name string +---@return Vessel +---Get vessel with the specified name +function vessel(name) end + +---@param name string +---@return Body +---Get body with the specified name +function getbody(name) end + +---@param name string +---@return boolean +function bodyexists(name) end + +---@param name string +---@return Atmosphere +---:attr:`ATM ` of the body that has that name. It's identical +---to calling ``BODY(name):ATM``, but accomplishes the goal in fewer steps. +--- +---It will crash with an error if no such body is found in the game. +function bodyatmosphere(name) end + +---@param absOrigin Vector +---@param facing Direction +---@param relMin Vector +---@param relMax Vector +---@return Bounds +function bounds(absOrigin, facing, relMin, relMax) end + +---@param dir number +---@param pitch number +---@param roll? number +---@return Direction +---A `Direction` can be created out of a :func:`HEADING()` function. The first parameter is the compass heading, and the second parameter is the pitch above the horizon:: +--- +--- SET myDir TO HEADING(degreesFromNorth, pitchAboveHorizon). +--- +---The third parameter, *roll*, is optional. Roll indicates rotation about the longitudinal axis. +function heading(dir, pitch, roll) end + +---@param frequency number | string +---@param endFrequency number | string +---@param duration number +---@param keyDownLength? number +---@param volume? number +---@return Note +---This global function creates a note object that makes a sliding note +---that changes linearly from the start frequency to the end frequency +---across the duration of the note. +--- +---where: +--- +---``frequency`` +--- **Mandatory**: This is the frequency the sliding note begins at. +--- If it is a number, then it is the frequency in hertz (Hz). +--- If it is a string, then it's using the letter notation +--- :ref:`described here `. +---``endFrequency`` +--- **Mandatory**: This is the frequency the sliding note ends at. +--- If it is a number, then it is the frequency in hertz (Hz). +--- If it is a string, then it's using the letter notation +--- :ref:`described here `. +---``duration`` +--- **Mandatory**: Same as the duration for the :func:`NOTE()` +--- built-in function. If it is missing it will be the same thing +--- as the keyDownLength. +---``keyDownLength`` +--- **Optional**: Same as the keyDownLength for the :func:`NOTE()` +--- built-in function. +---``volume`` +--- **Optional**: Same as the volume for the :func:`NOTE()` +--- built-in function. +--- +---The note's frequency will change linearly from the starting to +---the ending frequency over the note's duration. (For example, If the +---duration is shorter, but all the other values are the kept the same, +---that makes the frequency change go faster so it can all fit within the +---given duration.) +--- +---You can make the note pitch up over time or pitch down over time +---depending on whether the endFrequency is higher or lower than +---the initial frequency. +--- +---This is an example of it being used in conjunction with the Voice's +---PLAY() suffix method:: +--- +--- SET V1 TO GETVOICE(0). +--- // A fast "whoop" sound that pitches up from 300 Hz to 600 Hz quickly: +--- V1:PLAY( SLIDENOTE(300, 600, 0.2, 0.25, 1) ). +function slidenote(frequency, endFrequency, duration, keyDownLength, volume) end + +---@param frequency number | string +---@param duration number +---@param keyDownLength? number +---@param volume? number +---@return Note +---This global function creates a note object from the given values. +--- +---where: +--- +---``frequency`` +--- **Mandatory**: The frequency can be given as either a number or a +--- string. If it is a number, then it is the frequency in hertz (Hz). +--- If it is a string, then it's using the letter notation +--- :ref:`described here `. +---``duration`` +--- **Mandatory**: The total amount of time the note takes up before +--- the next note can begin, *including* the small gap between the end +--- of its keyDownLength and the start of the next note. +--- Note that the value here gets multiplied by the voice's +--- :meth:`TEMPO` to decide the actual duration in seconds when +--- it gets played. +---``keyDownLength`` +--- **Optional**: The amount of time the note takes up before the +--- "synthesizer key" is released. In terms of the +--- :ref:`ADSR Envelope `, this is the portion of +--- the note's time taken up by the Attack, Decay, and Sustain part +--- of the note, but not including the Release part of the note. In +--- order to hear the note fade away during its Release portion, the +--- keyDownLength must be shorter than the Duration, or else there's +--- no gap of time to fit the release in before the next note starts. +--- By default, if you leave the KeyDownLength off, you get a default +--- KeyDownLength of 90% of the Duration, leaving 10% of the Duration +--- left to hear the "Release" time before the next note starts. +--- If you wish to force the notes to immediately blend from one to the +--- next with no audible gaps between them, then for each note you +--- need to specify a keyDownLength that is equal to the Duration. +--- Note that the value here gets +--- multiplied by the voice's :meth:`TEMPO` to decide the actual +--- duration in seconds when it gets played. +---``volume`` +--- **Optional**: If present, then the note can be given a different +--- volume than the default for the voice it's being played on, to +--- make it louder or quieter than the other notes this voice is +--- playing. This setting is a relative multiplier applied to the +--- voice's volume. (i.e. 1.0 means play at the same volume as the +--- voice's setting, 1.1 means play a bit louder than the voice's +--- setting, and 0.9 means play a bit quieter than the voice's +--- setting). +--- +---This is an example of it being used in conjunction with the Voice's +---:meth:`PLAY()` suffix method:: +--- +--- SET V1 TO GETVOICE(0). +--- V1:PLAY( NOTE(440, 0.2, 0.25, 1) ). +function note(frequency, duration, keyDownLength, volume) end + +---@param num number +---@return Voice +---To access one of the :ref:`voices ` of the +---:ref:`SKID ` chip, you use the ``GetVoice(num)`` built-in +---function. +--- +---Where ``num`` is the number of the hardware voice you're interested +---in accessing. (The numbering starts with the first voice being +---called 0). +function getvoice(num) end + +---This will stop all voices. If the voice is scheduled to play additional +---notes, they will not be played. If the voice in the middle of playing a note, +---that note will be stopped. +function stopallvoices() end + +---@param universal_time? number (`number`) +---@return TimeStamp +---:return: A :struct`TimeStamp` of the time represented by the seconds passed in. +---This creates a `TimeStamp` given a "universal time", +---which is a number of seconds since the current game began, +---IN GAMETIME. example: ``TIME(3600)`` will give you a +---`TimeSpan` representing the moment exactly 1 hour +---(3600 seconds) since the current game first began. +--- +---The parameter is OPTIONAL. If you leave it off, +---and just call ``TIMESTAMP()``, then you end up getting +---the current time, which is the same thing that :global:`TIME` +---gives you (without the parentheses). +function timestamp(universal_time) end + +---@param year number (`number`) +---@param day number (`number`) +---@param hour? number (`number`) [optional] +---@param min? number (`number`) [optional] +---@param sec? number (`number`) [optional] +---@return TimeStamp +---:return: A :struct`TimeStamp` of the time represented by the values passed in. +---This creates a `TimeStamp` given a year, day, hour-hand, +---minute-hand, and second-hand. +--- +---Because a `TimeStamp` is a calendar reckoning, the values +---you use for the year and the day should start counting at 1, not +---at 0. (The hour, minute, and second still start at zero). +--- +---In other words:: +--- +--- // Notice these are equal because year and day start at 1 not 0: +--- set t1 to TIMESTAMP(0). +--- set t2 to TIMESTAMP(1,1,0,0,0). +--- print t1:full. +--- print t2:full. // Prints same as above. +--- +---Note that the year and day are mandatory, but the remaining +---parameters are optional and if you leave them off it assumes you +---meant them to be zero (meaning it will give you a timestamp at +---the very start of that date, right at midnight 0:00:00 O'clock). +function timestamp(year, day, hour, min, sec) end + +---@param universal_time? number (`number`) +---@return TimeSpan +---:return: A :struct`TimeSpan` of the time represented by the seconds passed in. +---This creates a `TimeSpan` equal to the number of seconds +---passed in. Fractional seconds are allowed for more precise spans. +--- +---The parameter is OPTIONAL. If you leave it off, and just call +---``TIMESPAN()``, then you end up getting a timespan of zero duration. +function timespan(universal_time) end + +---@param year number (`number`) +---@param day number (`number`) +---@param hour? number (`number`) [optional] +---@param min? number (`number`) [optional] +---@param sec? number (`number`) [optional] +---@return TimeSpan +---:return: A :struct`TimeSpan` of the time represented by the values passed in. +---This creates a `TimeSpan` that lasts this number of years +---plus this number of days plus this number of hours plus this number +---of minutes plus this number of seconds. +--- +---Because a `TimeSpan` is NOT a calendar reckoning, but +---an actual duration, the values you use for the year and the day +---should start counting at 0, not at 1. +--- +---In other words:: +--- +--- // Notice these are equal because year and day start at 0 not 1: +--- set span1 to TIMESPAN(0). +--- set span2 to TIMESPAN(0,0,0,0,0). +--- print span1:full. +--- print span2:full. // Prints same as above. +--- +---Note that the year and day are mandatory in this function, but the +---remaining parameters are optional and if you leave them off it +---assumes you meant them to be zero (meaning it will give you a +---timespan exactly equal to that many years and days, with no leftover +---hours or minutes or seconds.) +function timespan(year, day, hour, min, sec) end + +---@param h number +---@param s number +---@param v number +---@return HSVA +---This global function creates a color from hue, saturation and value:: +--- +--- SET myColor TO HSV(h,s,v). +--- +--- `More Information about HSV `_, +--- +---where: +--- +---``h`` +--- A floating point number from 0.0 to 1.0 for the hue component. +---``s`` +--- A floating point number from 0.0 to 1.0 for the saturation component. +---``v`` +--- A floating point number from 0.0 to 1.0 for the value component. +function hsv(h, s, v) end + +---@param h number +---@param s number +---@param v number +---@param a number +---@return HSVA +---Same as :func:`HSV()` but with an alpha (transparency) channel:: +--- +--- SET myColor TO HSVA(h,s,v,a). +--- +---``h, s, v`` are the same as above. +--- +---``a`` +--- A floating point number from 0.0 to 1.0 for the alpha component. (1.0 means opaque, 0.0 means invisibly transparent). +function hsva(h, s, v, a) end + +---@param r number +---@param g number +---@param b number +---@return RGBA +---This global function creates a color from red green and blue values:: +--- +--- SET myColor TO RGB(r,g,b). +--- +---where: +--- +---``r`` +--- A floating point number from 0.0 to 1.0 for the red component. +---``g`` +--- A floating point number from 0.0 to 1.0 for the green component. +---``b`` +--- A floating point number from 0.0 to 1.0 for the blue component. +function rgb(r, g, b) end + +---@param r number +---@param g number +---@param b number +---@param a number +---@return RGBA +---Same as :func:`RGB()` but with an alpha (transparency) channel:: +--- +--- SET myColor TO RGBA(r,g,b,a). +--- +---``r, g, b`` are the same as above. +--- +---``a`` +--- A floating point number from 0.0 to 1.0 for the alpha component. (1.0 means opaque, 0.0 means invisibly transparent). +function rgba(r, g, b, a) end + +---@param start? Vector | Delegate +---@param vec? Vector | Delegate +---@param color? RGBA | Delegate +---@param label? string +---@param scale? number +---@param show? boolean +---@param width? number +---@param pointy? boolean +---@param wiping? boolean +---@return Vecdraw +---Both these two function names do the same thing. For historical +---reasons both names exist, but now they both do the same thing. +---They create a new ``vecdraw`` object that you can then manipulate +---to show things on the screen. +--- +---For an explanation what the parameters start, vec, color, label, scale, show, +---width, pointy, and wiping mean, they correspond to the same suffix names +---below in the table. +--- +---Here are some examples:: +--- +--- SET anArrow TO VECDRAW( +--- V(0,0,0), +--- V(a,b,c), +--- RGB(1,0,0), +--- "See the arrow?", +--- 1.0, +--- TRUE, +--- 0.2, +--- TRUE, +--- TRUE +--- ). +--- +--- SET anArrow TO VECDRAWARGS( +--- V(0,0,0), +--- V(a,b,c), +--- RGB(1,0,0), +--- "See the arrow?", +--- 1.0, +--- TRUE, +--- 0.2, +--- TRUE, +--- TRUE +--- ). +--- +---Vector arrows can also be created with dynamic positioning and color. To do +---this, instead of passing static values for the first three arguments of +---``VECDRAW()`` or ``VECDRAWARGS()``, you can pass a +---:ref:`Delegate ` for any of them, which returns a value of the +---correct type. Here's an example where the Start, Vec, and Color are all +---dynamically adjusted by anonymous delegates that kOS will frequently call +---for you as it draws the arrow:: +--- +--- // Small dynamically moving vecdraw example: +--- SET anArrow TO VECDRAW( +--- { return (6-4*cos(100*time:seconds)) * up:vector. }, +--- { return (4*sin(100*time:seconds)) * up:vector. }, +--- { return RGBA(1, 1, RANDOM(), 1). }, +--- "Jumping arrow!", +--- 1.0, +--- TRUE, +--- 0.2, +--- TRUE, +--- TRUE +--- ). +--- wait 20. // Give user time to see it in motion. +--- set anArrow:show to false. // Make it stop drawing. +--- +---In the above example, ``VECDRAW()`` detects that the first argument +---is a delegate, and it uses this information to decide to assign +---it into :attr:`VecDraw:STARTUPDATER`, instead of into :attr:`VecDraw:START`. +---Similarly it detects that the second argument is a delegate, so it +---assigns it into :attr:`VecDraw:VECUPDATER` instead of into :attr:`VecDraw:VEC`. +---And it does the same thing with the third argument, assigning it into +---:attr:`VecDraw:COLORUPDATER`, instead of :attr:`VecDraw:COLOR`. +--- +---All the parameters of the ``VECDRAW()`` and ``VECDRAWARGS()`` are +---optional. You can leave any of the lastmost parameters off and they +---will be given a default:: +--- +--- Set anArrow TO VECDRAW(). +--- +---Causes it to have these defaults: +--- +---.. list-table:: Defaults +--- :header-rows: 1 +--- :widths: 1 3 +--- +--- * - Suffix +--- - Default +--- +--- * - :attr:`START` +--- - V(0,0,0) (center of the ship is the origin) +--- * - :attr:`VEC` +--- - V(0,0,0) (no length, so nothing appears) +--- * - :attr:`COLO[U]R` +--- - White +--- * - :attr:`LABEL` +--- - Empty string "" +--- * - :attr:`SCALE` +--- - 1.0 +--- * - :attr:`SHOW` +--- - false +--- * - :attr:`WIDTH` +--- - 0.2 +--- * - :attr:`POINTY` +--- - true +--- * - :attr:`WIPING` +--- - true +--- +---Examples:: +--- +--- // Makes a red vecdraw at the origin, pointing 5 meters north, +--- // with defaults for the un-mentioned +--- // paramters LABEL, SCALE, SHOW, and WIDTH. +--- SET vd TO VECDRAW(V(0,0,0), 5*north:vector, red). +--- +---To make a `VecDraw` disappear, you can either set its :attr:`VecDraw:SHOW` to false or just :ref:`UNSET ` the variable, or re-assign it. An example using `VecDraw` can be seen in the documentation for :func:`POSITIONAT()`. +function VECDRAW(start, vec, color, label, scale, show, width, pointy, wiping) end + +---@param start? Vector | Delegate +---@param vec? Vector | Delegate +---@param color? RGBA | Delegate +---@param label? string +---@param scale? number +---@param show? boolean +---@param width? number +---@param pointy? boolean +---@param wiping? boolean +---@return Vecdraw +---Both these two function names do the same thing. For historical +---reasons both names exist, but now they both do the same thing. +---They create a new ``vecdraw`` object that you can then manipulate +---to show things on the screen. +--- +---For an explanation what the parameters start, vec, color, label, scale, show, +---width, pointy, and wiping mean, they correspond to the same suffix names +---below in the table. +--- +---Here are some examples:: +--- +--- SET anArrow TO VECDRAW( +--- V(0,0,0), +--- V(a,b,c), +--- RGB(1,0,0), +--- "See the arrow?", +--- 1.0, +--- TRUE, +--- 0.2, +--- TRUE, +--- TRUE +--- ). +--- +--- SET anArrow TO VECDRAWARGS( +--- V(0,0,0), +--- V(a,b,c), +--- RGB(1,0,0), +--- "See the arrow?", +--- 1.0, +--- TRUE, +--- 0.2, +--- TRUE, +--- TRUE +--- ). +--- +---Vector arrows can also be created with dynamic positioning and color. To do +---this, instead of passing static values for the first three arguments of +---``VECDRAW()`` or ``VECDRAWARGS()``, you can pass a +---:ref:`Delegate ` for any of them, which returns a value of the +---correct type. Here's an example where the Start, Vec, and Color are all +---dynamically adjusted by anonymous delegates that kOS will frequently call +---for you as it draws the arrow:: +--- +--- // Small dynamically moving vecdraw example: +--- SET anArrow TO VECDRAW( +--- { return (6-4*cos(100*time:seconds)) * up:vector. }, +--- { return (4*sin(100*time:seconds)) * up:vector. }, +--- { return RGBA(1, 1, RANDOM(), 1). }, +--- "Jumping arrow!", +--- 1.0, +--- TRUE, +--- 0.2, +--- TRUE, +--- TRUE +--- ). +--- wait 20. // Give user time to see it in motion. +--- set anArrow:show to false. // Make it stop drawing. +--- +---In the above example, ``VECDRAW()`` detects that the first argument +---is a delegate, and it uses this information to decide to assign +---it into :attr:`VecDraw:STARTUPDATER`, instead of into :attr:`VecDraw:START`. +---Similarly it detects that the second argument is a delegate, so it +---assigns it into :attr:`VecDraw:VECUPDATER` instead of into :attr:`VecDraw:VEC`. +---And it does the same thing with the third argument, assigning it into +---:attr:`VecDraw:COLORUPDATER`, instead of :attr:`VecDraw:COLOR`. +--- +---All the parameters of the ``VECDRAW()`` and ``VECDRAWARGS()`` are +---optional. You can leave any of the lastmost parameters off and they +---will be given a default:: +--- +--- Set anArrow TO VECDRAW(). +--- +---Causes it to have these defaults: +--- +---.. list-table:: Defaults +--- :header-rows: 1 +--- :widths: 1 3 +--- +--- * - Suffix +--- - Default +--- +--- * - :attr:`START` +--- - V(0,0,0) (center of the ship is the origin) +--- * - :attr:`VEC` +--- - V(0,0,0) (no length, so nothing appears) +--- * - :attr:`COLO[U]R` +--- - White +--- * - :attr:`LABEL` +--- - Empty string "" +--- * - :attr:`SCALE` +--- - 1.0 +--- * - :attr:`SHOW` +--- - false +--- * - :attr:`WIDTH` +--- - 0.2 +--- * - :attr:`POINTY` +--- - true +--- * - :attr:`WIPING` +--- - true +--- +---Examples:: +--- +--- // Makes a red vecdraw at the origin, pointing 5 meters north, +--- // with defaults for the un-mentioned +--- // paramters LABEL, SCALE, SHOW, and WIDTH. +--- SET vd TO VECDRAW(V(0,0,0), 5*north:vector, red). +--- +---To make a `VecDraw` disappear, you can either set its :attr:`VecDraw:SHOW` to false or just :ref:`UNSET ` the variable, or re-assign it. An example using `VecDraw` can be seen in the documentation for :func:`POSITIONAT()`. +function vecdrawargs(start, vec, color, label, scale, show, width, pointy, wiping) end + +---Sets all visible vecdraws to invisible, everywhere in this kOS CPU. +---This is useful if you have lost track of the handles to them and can't +---turn them off one by one, or if you don't have the variable scopes +---present anymore to access the variables that hold them. The system +---does attempt to clear any vecdraws that go "out of scope", however +---the "closures" that keep local variables alive for LOCK statements +---and for other reasons can keep them from every truely going away +---in some circumstances. To make the arrow drawings all go away, just call +---CLEARVECDRAWS() and it will have the same effect as if you had +---done ``SET varname:show to FALSE`` for all vecdraw varnames in the +---entire system. +function CLEARVECDRAWS() end + +---If you want to conveniently clear away all GUI windows that you +---created from this CPU, you can do so with the ``CLEARGUIS()`` +---built-in function. It will call :meth:`GUI:HIDE` and :meth:`GUI:DISPOSE` +---for all the gui windows that were made using this particular CPU part. +---(If you have multiple kOS CPUs, and some GUIs are showing that were made +---by other kOS CPUs, those will not be cleared by this.) +--- +---.. note:: +--- +--- This built-in function was added mainly so you have a way +--- to easily clean up after a program has crashed which left +--- behind some GUI windows that are now unresponsive because +--- the program isn't running anymore. +function clearguis() end + +---@param width number +---@param height? number +---@return GUI +---This is the first place any GUI control panel starts. +--- +---The GUI built-in function creates a new `GUI` object that you can then +---manipulate to build up a GUI. If no height is specified, it will resize +---automatically to fit the contents you put inside it. The width can be set +---to 0 to force automatic width resizing too:: +--- +--- SET my_gui TO GUI(200). +--- SET button TO my_gui:ADDBUTTON("OK"). +--- my_gui:SHOW(). +--- UNTIL button:TAKEPRESS WAIT(0.1). +--- my_gui:HIDE(). +--- +---See the "ADD" functions in the `BOX` structure for +---the other widgets you can add. +--- +---Warning: Setting BOTH width and height to 0 to let it choose automatic +---resizing in both dimensions will often lead to a look you won't like. +---You may find that to have some control over the layout you will need to +---specify one of the two dimensions and only let it resize the other. +function gui(width, height) end + +---@param orbitable Orbitable A `Vessel`, `Body` or other `Orbitable` object +---@param time TimeStamp | number Time of prediction +---@return Vector +---:type orbitable: `Orbitable` +---:type time: `TimeStamp` or `number` universal seconds +---:return: A position `Vector` expressed as the coordinates in the :ref:`ship-center-raw-rotation ` frame +--- +---Returns a prediction of where the `Orbitable` will be at some :ref:`universal Time `. If the `Orbitable` is a `Vessel`, and the `Vessel` has planned :ref:`maneuver nodes `, the prediction assumes they will be executed exactly as planned. +--- +---*Refrence Frame:* The reference frame that the future position +---gets returned in is the same reference frame as the current position +---vectors use. In other words it's in ship:raw coords where the origin +---is the current ``SHIP``'s center of mass. +--- +---*Prerequisite:* If you are in a career mode game rather than a +---sandbox mode game, This function requires that you have your space +---center's buildings advanced to the point where you can make maneuver +---nodes on the map view, as described in :struct:`Career:CANMAKENODES`. +function positionat(orbitable, time) end + +---@param orbitable Orbitable A `Vessel`, `Body` or other `Orbitable` object +---@param time TimeStamp | number Time of prediction +---@return OrbitableVelocity +---:type orbitable: `Orbitable` +---:type time: `TimeStamp` or `number` universal seconds +---:return: An :ref:`ObitalVelocity ` structure. +--- +---Returns a prediction of what the :ref:`Orbitable's ` velocity will be at some :ref:`universal Time `. If the `Orbitable` is a `Vessel`, and the `Vessel` has planned :struct:`maneuver nodes `, the prediction assumes they will be executed exactly as planned. +--- +---*Prerequisite:* If you are in a career mode game rather than a +---sandbox mode game, This function requires that you have your space +---center's buildings advanced to the point where you can make manuever +---nodes on the map view, as described in :struct:`Career:CANMAKENODES`. +--- +---*Refrence Frame:* The reference frame that the future velocity gets +---returned in is the same reference frame as the current velocity +---vectors use. In other words it's relative to the ship's CURRENT +---body it's orbiting just like ``ship:velocity`` is. For example, +---if the ship is currently in orbit of Kerbin, but will be in the Mun's +---SOI in the future, then the ``VELOCITYAT`` that future time will return +---is still returned relative to Kerbin, not the Mun, because that's the +---current reference for current velocities. Here is an example +---illustrating that:: +--- +--- // This example imagines you are on an orbit that is leaving +--- // the current body and on the way to transfer to another orbit: +--- +--- // Later_time is 1 minute into the Mun orbit patch: +--- local later_time is time:seconds + ship:obt:NEXTPATCHETA + 60. +--- local later_ship_vel is VELOCITYAT(ship, later_time):ORBIT. +--- local later_body_vel is VELOCITYAT(ship:obt:NEXTPATCH:body, later_time):ORBIT. +--- +--- local later_ship_vel_rel_to_later_body is later_ship_vel - later_body_vel. +--- +--- print "My later velocity relative to this body is: " + later_ship_vel. +--- print "My later velocity relative to the body I will be around then is: " + +--- later_ship_vel_rel_to_later_body. +function velocityat(orbitable, time) end + +---@param p Part | List | Element +---@param c RGBA +---@return HIGHLIGHT +---This global function creates a part highlight:: +--- +--- SET foo TO HIGHLIGHT(p,c). +--- +---where: +--- +---``p`` +--- A single :ref:`part `, a list of parts or an :ref:`element ` +---``c`` +--- A :ref:`color ` +function highlight(p, c) end + +---@param orbitable Orbitable A :Ref:`Vessel `, `Body` or other `Orbitable` object +---@param time TimeStamp | number Time of prediction +---@return Orbit +---:type orbitable: `Orbitable` +---:type time: `TimeStamp` or `number` universal seconds +---:return: An `Orbit` structure. +--- +---Returns the :ref:`Orbit patch ` where the `Orbitable` object is predicted to be at some :ref:`universal Time `. If the `Orbitable` is a `Vessel`, and the `Vessel` has planned :ref:`maneuver nodes `, the prediction assumes they will be executed exactly as planned. +--- +---*Prerequisite:* If you are in a career mode game rather than a +---sandbox mode game, This function requires that you have your space +---center's buildings advanced to the point where you can make maneuver +---nodes on the map view, as described in :struct:`Career:CANMAKENODES`. +function orbitat(orbitable, time) end + +---@return Career +function career() end + +---@return List +---:return: `List` of `Waypoint` +--- +---This creates a `List` of `Waypoint` structures for all accepted contracts. Waypoints for proposed contracts you haven't accepted yet do not appear in the list. +function allwaypoints() end + +---@param name string (`string`) Name of the waypoint as it appears on the map or in the contract description +---@return Waypoint +---This creates a new Waypoint from a name of a waypoint you read from the contract paramters. Note that this only works on contracts you've accpted. Waypoints for proposed contracts haven't accepted yet do not actually work in kOS. +--- +---SET spot TO WAYPOINT("herman's folly beta"). +--- +---The name match is case-insensitive. +function waypoint(name) end + +---@param resourceName string +---@param from Part | Element | List +---@param to Part | Element | List +---@return Transfer +function transferall(resourceName, from, to) end + +---@param resourceName string +---@param from Part | Element | List +---@param to Part | Element | List +---@param amount number +---@return Transfer +function transfer(resourceName, from, to, amount) end + +---Clears the screen and places the cursor at the top left +function clearscreen() end + +---@param text string The message to show to the user on screen +---@param delay number How long to make the message remain onscreen before it goes away +---@param style number Where to show the message on the screen:; - 1 = upper left; - 2 = upper center; - 3 = upper right; - 4 = lower center +---@param size number +---@param colour RGBA +---@param doEcho boolean +---same way that the in-game stock messages appear, by calling the +---HUDTEXT function, as follows:: +--- +---HUDTEXT( string Message, +--- integer delaySeconds, +--- integer style, +--- integer size, +--- RGBA colour, +--- boolean doEcho). +--- +---Message +--- The message to show to the user on screen +---delaySeconds +--- How long to make the message remain onscreen before it goes away. +--- If another message is drawn while an old message is still displaying, +--- both messages remain, the new message scrolls up the old message. +---style +--- Where to show the message on the screen: +--- - 1 = upper left +--- - 2 = upper center +--- - 3 = upper right +--- - 4 = lower center +--- Note that all these locations have their own defined slightly +--- different fonts and default sizes, enforced by the stock KSP game. +---size +--- A number describing the font point size: NOTE that the actual size +--- varies depending on which of the above styles you're using. Some +--- of the locations have a magnifying factor attached to their fonts. +---colour +--- The colour to show the text in, using `one of the built-in colour names +--- or the RGB constructor to make one up <../structures/misc/colors.html>`__ +---doEcho +--- If true, then the message is also echoed to the terminal as "HUD: message". +--- +---Examples:: +--- +--- HUDTEXT("Warning: Vertical Speed too High", 5, 2, 15, red, false). +--- HUDTEXT("docking mode begun", 8, 1, 12, rgb(1,1,0.5), false). +function hudtext(text, delay, style, size, colour, doEcho) end + +---Activates the next stage if the cpu vessel is the active vessel. This will +---trigger engines, decouplers, and any other parts that would normally be +---triggered by manually staging. The default equivalent key binding is the +---space bar. As with other parameter-less functions, both ``STAGE.`` and +---``STAGE().`` are acceptable ways to call the function. +--- +---.. note:: +--- .. versionchanged:: 1.0.1 +--- +--- The stage function will automatically pause execution until the next +--- tick. This is because some of the results of the staging event take +--- effect immediately, while others do not update until the next time +--- that physics are calculated. Calling ``STAGE.`` is essentially +--- equivalent to:: +--- +--- STAGE. +--- WAIT 0. +--- +---.. warning:: +--- Calling the :global:`Stage` function on a vessel other than the active +--- vessel will throw an exception. +function stage() end + +---@param node Node +---To put a maneuver node into the flight plan of the current :ref:`CPU vessel ` (i.e. ``SHIP``), just :global:`ADD` it like so:: +--- +--- SET myNode to NODE( TIME:SECONDS+200, 0, 50, 10 ). +--- ADD myNode. +--- +---You should immediately see it appear on the map view when you do this. The :global:`ADD` command can add nodes anywhere within the flight plan. To insert a node earlier in the flight than an existing node, simply give it a smaller :attr:`ETA ` time and then :global:`ADD` it. +--- +---.. warning:: +--- As per the warning above at the top of the section, ADD won't work on vessels that are not the active vessel. +function add(node) end + +---@param node Node +---To remove a maneuver node from the flight path of the current :ref:`CPU vessel ` (i.e. ``SHIP``), just :global:`REMOVE` it like so:: +--- +--- REMOVE myNode. +--- +---.. warning:: +--- As per the warning above at the top of the section, REMOVE won't work on vessels that are not the active vessel. +function remove(node) end + +---@param timestamp number +---This is identical to :meth:`WARPTO` above. +---:: +--- +--- // These two do the same thing: +--- WARPTO(time:seconds + 60*60). // warp 1 hour into the future. +--- KUNIVERSE:TIMEWARP:WARPTO(time:seconds + 60*60). +function warpto(timestamp) end + +---@param volumeOrNameTag Volume | string (`Volume` | `String`) can be either an instance of `Volume` or a string +---@return KOSProcessor +---Depending on the type of the parameter value will either return the processor associated with the given +---`Volume` or the processor with the given name tag. +function processor(volumeOrNameTag) end + +---@param file VolumeItem | string +---@param volumeOrNameTag Volume | string +function runfileon(file, volumeOrNameTag) end + +---@param command string +---@param volumeOrNameTag Volume | string +function runcommandon(command, volumeOrNameTag) end + +---@param listType string | "bodies" | "targets" | "resources" | "parts" | "engines" | "rcs" | "sensors" | "elements" | "dockingports" | "files" | "volumes" | "processors" | "fonts" +---Display elements of the specified "listType" argument +function printlist(listType) end + +---@param v1 Vector (`Vector`) +---@param v2 Vector (`Vector`) +---@return Vector +---:return: The `vector cross-product `__ +---The vector `cross product `__ of two vectors in the order ``(v1,v2)`` returning a new `Vector`:: +--- +--- SET vec1 TO V(1,2,3). +--- SET vec2 TO V(2,3,4). +--- +--- // These will both print: V(-1,2,-1) +--- PRINT VCRS(vec1, vec2). +--- PRINT VECTORCROSSPRODUCT(vec1, vec2). +--- +---When visualizing the direction that a vector cross product will +---point, remember that KSP is using a :ref:`left-handed ` +---coordinate system, and this means a cross-product of two vectors +---will point in the opposite direction of what it would had KSP been +---using a right-handed coordinate system. +function vcrs(v1, v2) end + +---@param v1 Vector (`Vector`) +---@param v2 Vector (`Vector`) +---@return Vector +---:return: The `vector cross-product `__ +---The vector `cross product `__ of two vectors in the order ``(v1,v2)`` returning a new `Vector`:: +--- +--- SET vec1 TO V(1,2,3). +--- SET vec2 TO V(2,3,4). +--- +--- // These will both print: V(-1,2,-1) +--- PRINT VCRS(vec1, vec2). +--- PRINT VECTORCROSSPRODUCT(vec1, vec2). +--- +---When visualizing the direction that a vector cross product will +---point, remember that KSP is using a :ref:`left-handed ` +---coordinate system, and this means a cross-product of two vectors +---will point in the opposite direction of what it would had KSP been +---using a right-handed coordinate system. +function vectorcrossproduct(v1, v2) end + +---@param v1 Vector (`Vector`) +---@param v2 Vector (`Vector`) +---@return Vector +---:return: The `vector dot-product `__ +---This is the `dot product `__ of two vectors returning a scalar number. This is the same as :ref:`v1 * v2 `:: +--- +--- SET vec1 TO V(1,2,3). +--- SET vec2 TO V(2,3,4). +--- +--- // These are different ways to perform the same operation. +--- // All of them will print the value: 20 +--- // ------------------------------------------------------- +--- PRINT VDOT(vec1, vec2). +--- PRINT VECTORDOTPRODUCT(vec1, vec2). +--- PRINT vec1 * vec2. // multiplication of two vectors with asterisk "*" performs a VDOT(). +function vdot(v1, v2) end + +---@param v1 Vector (`Vector`) +---@param v2 Vector (`Vector`) +---@return Vector +---:return: The `vector dot-product `__ +---This is the `dot product `__ of two vectors returning a scalar number. This is the same as :ref:`v1 * v2 `:: +--- +--- SET vec1 TO V(1,2,3). +--- SET vec2 TO V(2,3,4). +--- +--- // These are different ways to perform the same operation. +--- // All of them will print the value: 20 +--- // ------------------------------------------------------- +--- PRINT VDOT(vec1, vec2). +--- PRINT VECTORDOTPRODUCT(vec1, vec2). +--- PRINT vec1 * vec2. // multiplication of two vectors with asterisk "*" performs a VDOT(). +function vectordotproduct(v1, v2) end + +---@param v1 Vector +---@param v2 Vector +---@return Vector +---This is a vector, ``v2`` with all of ``v1`` excluded from it. In other words, the projection of ``v2`` onto the plane that is normal to ``v1``. +function vxcl(v1, v2) end + +---@param v1 Vector +---@param v2 Vector +---@return Vector +---This is a vector, ``v2`` with all of ``v1`` excluded from it. In other words, the projection of ``v2`` onto the plane that is normal to ``v1``. +function vectorexclude(v1, v2) end + +---@param v1 Vector (`Vector`) +---@param v2 Vector (`Vector`) +---@return number +---:return: Angle between two vectors +---This returns the angle between v1 and v2. It is the same result as: +--- +---.. math:: +--- +--- \arccos\left( +--- \frac{ +--- \vec{v_1}\cdot\vec{v_2} +--- }{ +--- \left|\vec{v_1}\right|\cdot\left|\vec{v_2}\right| +--- } +--- \right) +--- +---or in **KerboScript**:: +--- +--- arccos( (VDOT(v1,v2) / (v1:MAG * v2:MAG) ) ) +function vang(v1, v2) end + +---@param v1 Vector (`Vector`) +---@param v2 Vector (`Vector`) +---@return number +---:return: Angle between two vectors +---This returns the angle between v1 and v2. It is the same result as: +--- +---.. math:: +--- +--- \arccos\left( +--- \frac{ +--- \vec{v_1}\cdot\vec{v_2} +--- }{ +--- \left|\vec{v_1}\right|\cdot\left|\vec{v_2}\right| +--- } +--- \right) +--- +---or in **KerboScript**:: +--- +--- arccos( (VDOT(v1,v2) / (v1:MAG * v2:MAG) ) ) +function vectorangle(v1, v2) end + +---@param volumeIdOrName? number | string +---@return Volume +---id or name. You can omit the argument to create a `Volume` +---for the current volume. +function volume(volumeIdOrName) end + +---@param path string | VolumeItem | Volume +---@return Path +---can omit the argument to create a `Path` for the current directory. +function path(path) end + +---@param ... +---@return List +---Creates a List structure with arguments as elements +function list(...) end + +---@param ... +---@return Lexicon +---Creates a Lexicon structure with odd arguments as keys and even arguments as values +function lex(...) end + +---@param ... +---@return Lexicon +---Creates a Lexicon structure with odd arguments as keys and even arguments as values +function lexicon(...) end + +---@param ... +---@return Queue +---Creates a Queue structure with arguments as elements +function queue(...) end + +---@param ... +---@return UniqueSet +---Creates a UniqueSet structure with arguments as elements +function uniqueset(...) end + +---@param kp number +---@param ki number +---@param kd number +---@param minOutput number +---@param maxOutput number +---@param epsilon number +---@return PIDLoop +---Creates a new PIDLoop +function pidloop(kp, ki, kd, minOutput, maxOutput, epsilon) end + +---@param kp number +---@param ki number +---@param kd number +---@param minOutput number +---@param maxOutput number +---@return PIDLoop +---Creates a new PIDLoop +function pidloop(kp, ki, kd, minOutput, maxOutput) end + +---@param kp number +---@param ki number +---@param kd number +---@return PIDLoop +---Creates a new PIDLoop +function pidloop(kp, ki, kd) end + +---@param kp number +---@return PIDLoop +---Creates a new PIDLoop +function pidloop(kp) end + +---@return PIDLoop +---Creates a new PIDLoop +function pidloop() end + +---@param ... +---@return Stack +---Creates a Stack structure with arguments as elements +function stack(...) end + +---@return Path +---can omit the argument to create a `Path` for the current directory. +function scriptpath() end + +---@param volume Volume | number | string +---Volumes can be referenced by instances of `Volume`, their ID numbers +---or their names if they've been given one. Understanding how +---:ref:`volumes work ` is important to understanding this command. +function switch(volume) end + +---@param path string | VolumeItem | Volume +---argument. This command will fail if the path is invalid or does not point +---to an existing directory. +function cd(path) end + +---@param path string | VolumeItem | Volume +---argument. This command will fail if the path is invalid or does not point +---to an existing directory. +function chdir(path) end + +---@param fromPath string | VolumeItem | Volume +---@param toPath string | VolumeItem | Volume +---@return boolean +---pointed to :code:`TOPATH`. Depending on what kind of items both paths point +---to the exact behaviour of this command will differ: +--- +---1. :code:`FROMPATH` points to a file +--- +--- - :code:`TOPATH` points to a directory +--- +--- The file from :code:`FROMPATH` will be copied to the directory. +--- +--- - :code:`TOPATH` points to a file +--- +--- Contents of the file pointed to by :code:`FROMPATH` will overwrite +--- the contents of the file pointed to by :code:`TOPATH`. +--- +--- - :code:`TOPATH` points to a non-existing path +--- +--- New file will be created at :code:`TOPATH`, along with any parent +--- directories if necessary. Its contents will be set to the contents of +--- the file pointed to by :code:`FROMPATH`. +--- +---2. :code:`FROMPATH` points to a directory +--- +--- If :code:`FROMPATH` points to a directory kOS will copy recursively all +--- contents of that directory to the target location. +--- +--- - :code:`TOPATH` points to a directory +--- +--- The directory from :code:`FROMPATH` will be copied inside the +--- directory pointed to by :code:`TOPATH`. +--- +--- - :code:`TOPATH` points to a file +--- +--- The command will fail. +--- +--- - :code:`TOPATH` points to a non-existing path +--- +--- New directory will be created at :code:`TOPATH`, along with any +--- parent directories if necessary. Its contents will be set to the +--- contents of the directory pointed to by :code:`FROMPATH`. +--- +---3. :code:`FROMPATH` points to a non-existing path +--- +--- The command will fail. +function copypath(fromPath, toPath) end + +---@param fromPath string | VolumeItem | Volume +---@param toPath string | VolumeItem | Volume +---@return boolean +---pointed to :code:`TOPATH`. Depending on what kind of items both paths point +---to the exact behaviour of this command will differ, see :code:`COPYPATH` above. +function movepath(fromPath, toPath) end + +---@param path string | VolumeItem +---@return boolean +---removed along with all the items they contain. +function deletepath(path) end + +---@param object +---@param path string | VolumeItem | Volume +---@return VolumeFile +---Go to :ref:`Serialization page ` to read more about serialization. +function writejson(object, path) end + +---@param path string | VolumeItem +---Go to :ref:`Serialization page ` to read more about serialization. +function readjson(path) end + +---@param path string | VolumeItem | Volume +---@return boolean +---otherwise returns false. Also see :meth:`Volume:EXISTS`. +function exists(path) end + +---@param path string | VolumeItem | Volume +---pointed to by :code:`PATH`. It will return a `boolean` false if there's +---nothing present under the given path. Also see :meth:`Volume:OPEN`. +function open(path) end + +---@param path string | VolumeItem +---@return VolumeFile +---It will fail if a file or a directory already exists under the given path. +---Also see :meth:`Volume:CREATE`. +function create(path) end + +---@param path string | VolumeItem +---@return VolumeDirectory +---if needed. It will fail if a file or a directory already exists under the +---given path. Also see :meth:`Volume:CREATEDIR`. +function createdir(path) end + +---@param a number (deg) angle +---@return number +---:return: sine of the angle +--- +---:: +--- +--- PRINT SIN(6). // prints 0.10452846326 +function sin(a) end + +---@param a number (deg) angle +---@return number +---:return: cosine of the angle +--- +---:: +--- +--- PRINT COS(6). // prints 0.99452189536 +function cos(a) end + +---@param a number (deg) angle +---@return number +---:return: tangent of the angle +--- +---:: +--- +--- PRINT TAN(6). // prints 0.10510423526 +function tan(a) end + +---@param x number (`number`) +---@return number +---:return: (deg) angle whose sine is x +--- +---:: +--- +--- PRINT ARCSIN(0.67). // prints 42.0670648 +function arcsin(x) end + +---@param x number (`number`) +---@return number +---:return: (deg) angle whose cosine is x +--- +---:: +--- +--- PRINT ARCCOS(0.67). // prints 47.9329352 +function arccos(x) end + +---@param x number (`number`) +---@return number +---:return: (deg) angle whose tangent is x +--- +---:: +--- +--- PRINT ARCTAN(0.67). // prints 33.8220852 +function arctan(x) end + +---@param y number (`number`) +---@param x number (`number`) +---@return number +---:return: (deg) angle whose tangent is :math:`\frac{y}{x}` +--- +---:: +--- +--- PRINT ARCTAN2(0.67, 0.89). // prints 36.9727625 +--- +---The two parameters resolve ambiguities when taking the arctangent. See the `wikipedia page about atan2 `_ for more details. +function arctan2(y, x) end + +---@param a1 number +---@param a2 number +---@return number +---Gets the minimal angle between two angles +function anglediff(a1, a2) end + +---@param from number +---@param to number +---@param step number +---@return Range +function range(from, to, step) end + +---@param from number +---@param to number +---@return Range +function range(from, to) end + +---@param to number +---@return Range +function range(to) end + +---@param item +---@param column number +---@param row number +function printat(item, column, row) end + +---@param paramName string | "steering" | "throttle" | "wheelsteering" | "wheelthrottle" | "flightcontrol" +---@param enabled boolean +function toggleflybywire(paramName, enabled) end + +---@param mode string | "maneuver" | "prograde" | "retrograde" | "normal" | "antinormal" | "radialin" | "radialout" | "target" | "antitarget" | "stability" | "stabilityassist" +function selectautopilotmode(mode) end + +---@param value +---@param path VolumeFile | string +function logfile(value, path) end + +---Reboots the core +function reboot() end + +---Shutsdown the core +function shutdown() end + +---@param milliseconds number +---Deliberately cause physics lag by making the main game thread sleep. +function debugfreezegame(milliseconds) end + +---@param a number +---@return number +---Returns absolute value of input:: +--- +--- PRINT ABS(-1). // prints 1 +function abs(a) end + +---@param a number +---@param b number +---@return number +---Returns remainder from integer division. +---Keep in mind that it's not a traditional mathematical Euclidean division where the result is always positive. The result has the same absolute value as mathematical modulo operation but the sign is the same as the sign of dividend:: +--- +--- PRINT MOD(21,6). // prints 3 +--- PRINT MOD(-21,6). // prints -3 +function mod(a, b) end + +---@param a number +---@return number +---Rounds down to the nearest whole number:: +--- +--- PRINT FLOOR(1.887). // prints 1 +function floor(a) end + +---@param a number +---@param b number +---@return number +---Rounds down to the nearest place value:: +--- +--- PRINT CEILING(1.887,2). // prints 1.88 +function floor(a, b) end + +---@param a number +---@return number +---Rounds up to the nearest whole number:: +--- +--- PRINT CEILING(1.887). // prints 2 +function ceiling(a) end + +---@param a number +---@param b number +---@return number +---Rounds up to the nearest place value:: +--- +--- PRINT CEILING(1.887,2). // prints 1.89 +function ceiling(a, b) end + +---@param a number +---@return number +---Rounds to the nearest whole number:: +--- +--- PRINT ROUND(1.887). // prints 2 +function round(a) end + +---@param a number +---@param b number +---@return number +---Rounds to the nearest place value:: +--- +--- PRINT ROUND(1.887,2). // prints 1.89 +function round(a, b) end + +---@param a number +---@return number +---Returns square root:: +--- +--- PRINT SQRT(7.89). // prints 2.80891438103763 +function sqrt(a) end + +---@param a number +---@return number +---Gives the natural log of the provided number:: +--- +--- PRINT LN(2). // prints 0.6931471805599453 +function ln(a) end + +---@param a number +---@return number +---Gives the log base 10 of the provided number:: +--- +--- PRINT LOG10(2). // prints 0.30102999566398114 +function log10(a) end + +---@param a number +---@param b number +---@return number +---Returns The lower of the two values:: +--- +--- PRINT MIN(0,100). // prints 0 +function min(a, b) end + +---@param a number +---@param b number +---@return number +---Returns The higher of the two values:: +--- +--- PRINT MAX(0,100). // prints 100 +function max(a, b) end + +---@param key? +---@return number +---Returns the next random floating point number from a random +---number sequence. The result is always in the range [0..1] +--- +---This uses what is called a `pseudo-random number generator +---`_. +--- +---For basic usage you can leave the ``key`` parameter off and it +---works fine, like so: +--- +---Example, basic usage:: +--- +--- PRINT RANDOM(). //prints a random number +--- PRINT "Let's roll a 6-sided die 10 times:". +--- FOR n in range(0,10) { +--- +--- // To make RANDOM give you an integer in the range [0..n-1], you do this: +--- // floor(n*RANDOM()). +--- +--- // So for example : a die giving values from 1 to 6 is like this: +--- print (1 + floor(6*RANDOM())). +--- } +--- +---The parameter ``key`` is a string, and it's used when you want +---to track separate psuedo-random number sequences by name and +---have them be deterministically repeatable. *Like other +---string keys in kOS, this key is case-insensitive.* +--- +---* If you leave the parameter ``key`` off, you get the next number +--- from a default unnamed random number sequencer. +---* If you supply the parameter ``key``, you get the next number +--- from a named random number sequencer. You can invent however +--- many keys you like and each one is a new random number sequencer. +--- Supplying a key probably only means something if you have +--- previously used :func:`RANDOMSEED(key, seed)`. +--- +---The following example is more complex and shows the repeatability +---of the "random" sequence using seeds. For most simple uses you +---probably don't need to bother with this. If words like "random +---number seed" are confusing, you can probably skip this part and +---get by just fine with the basic usage shown above. (Explaining +---how pseudorandom number generators work is a bit beyond this +---page - check the wikipedia link above to learn more.) +--- +---Example, deterministic usage:: +--- +--- // create two different random number sequencers, both starting +--- // with seed 12345 so they should have the same exact values. +--- RANDOMSEED("sequence1",12345). +--- RANDOMSEED("sequence2",12345). +--- +--- PRINT "5 coin flips from SEQUENCE 1:". +--- FOR n in range(0,5) { +--- print choose "heads" if RANDOM("sequence1") < 0.5 else "tails". +--- } +--- +--- PRINT "5 coin flips from SEQUENCE 2, which should be the same:". +--- FOR n in range(0,5) { +--- print choose "heads" if RANDOM("sequence2") < 0.5 else "tails". +--- } +--- +--- PRINT "5 more coin flips from SEQUENCE 1:". +--- FOR n in range(0,5) { +--- print choose "heads" if RANDOM("sequence1") < 0.5 else "tails". +--- } +--- +--- PRINT "5 more coin flips from SEQUENCE 2, which should be the same:". +--- FOR n in range(0,5) { +--- print choose "heads" if RANDOM("sequence2") < 0.5 else "tails". +--- } +function random(key) end + +---@param key +---@param seed number +---No Return Value. +--- +---Initializes a new random number sequence from a seed, giving it a +---key name you can use to refer to it in future calls to :func:`RANDOM(key)` +--- +---Using this you can make psuedo-random number sequences that can be +---re-run using the same seed to get the same result a second time. +--- +---Parameter ``key`` is a string - a name you can use to refer to this +---random series later. Calls to ``RANDOMSEED`` that use different +---keys actually cause different new random number sequences to be +---created that are tracked separately from each other. *Like other +---string keys in kOS, this key is case-insensitive.* +--- +---Parameter ``seed`` is an integer - an initial value to cause a +---deterministic series of random numbers to come out of the random +---function. +--- +---Whenever you call ``RANDOMSEED(key, seed)``, it starts a new +---random number sequence using the integer seed you give it, and names +---that sequence with a string key you can use later to retrive +---values from that random number sequence. +--- +---Example:: +--- +--- RANDOMSEED("generator A",1000). +--- RANDOMSEED("generator B",1000). +--- PRINT "Generators A and B should emit identical ". +--- PRINT "sequences because they both started at seed 1000.". +--- PRINT "3 numbers from Generator A:". +--- PRINT floor(RANDOM("generator A")*100). +--- PRINT floor(RANDOM("generator A")*100). +--- PRINT floor(RANDOM("generator A")*100). +--- PRINT "3 numbers from Generator B - they should ". +--- PRINT "be the same as above:". +--- PRINT floor(RANDOM("generator B")*100). +--- PRINT floor(RANDOM("generator B")*100). +--- PRINT floor(RANDOM("generator B")*100). +--- +--- PRINT "Resetting generator A but not Generator B:". +--- RANDOMSEED("generator A",1000). +--- +--- PRINT "3 more numbers from Generator A which got reset". +--- PRINT "so they should match the first ones again:". +--- PRINT floor(RANDOM("generator A")*100). +--- PRINT floor(RANDOM("generator A")*100). +--- PRINT floor(RANDOM("generator A")*100). +--- PRINT "3 numbers from Generator B, which didn't get reset:". +--- PRINT floor(RANDOM("generator B")*100). +--- PRINT floor(RANDOM("generator B")*100). +--- PRINT floor(RANDOM("generator B")*100). +--- +--- +---If you call ``RANDOMSEED`` using the same key as a key you already used +---before, it just forgets the previous random number sequence and starts +---a new one using the new seed. You can use this to reset the sequence. +function randomseed(key, seed) end + +---@param a number (number) +---@return string +---:return: (string) single-character string containing the unicode character specified +--- +---:: +--- +--- PRINT CHAR(34) + "Apples" + CHAR(34). // prints "Apples" +function char(a) end + +---@param a string (string) +---@return number +---:return: (number) unicode number representing the character specified +--- +---:: +--- +--- PRINT UNCHAR("A"). // prints 65 +function unchar(a) end + diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/structures.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/structures.lua new file mode 100644 index 0000000000..679576540a --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/structures.lua @@ -0,0 +1,5906 @@ +---@class MessageQueue : Structure +---True if there are no messages in this queue. +---@field empty boolean +---Number of messages in this queue. +---@field length number +---Returns the first (oldest) message in the queue and removes it. Messages in the queue are always ordered by their arrival date. +---@field pop fun(): Message +---:return: `Message` +--- +---Returns the oldest message in the queue without removing it from the queue. +---@field peek fun(): Message +---Removes all messages from the queue. +---@field clear fun() +---:parameter message: `Message` message to be added +--- +---You can use this message to explicitly add a message to this queue. This will insert this exact message to the queue, all attributes that are normally +---added automatically by kOS (:attr:`Message:SENTAT`, :attr:`Message:RECEIVEDAT` and :attr:`Message:SENDER`) will not be changed. +---@field push fun(message: any) + +---@class Message : Structure +---Date this message was sent at. +---@field sentat TimeStamp +---Date this message was received at. +---@field receivedat TimeStamp +---:type: `Vessel` or `boolean` +--- +---Vessel which has sent this message, or a boolean false value if +---the sender vessel no longer exists. +--- +---If the sender of the message doesn't exist anymore (see the explanation +---for :attr:`HASSENDER`), this suffix will return a different type +---altogether. It will be a `boolean` (which is false). +--- +---You can check for this condition either by using the :attr:`HASSENDER` +---suffix, or by checking the ``:ISTYPE`` suffix of the sender to +---detect if it's really a vessel or not. +---@field sender any +---Because there can be a delay between when the message was sent and +---when it was processed by the receiving script, it's possibile that +---the vessel that sent the message might not exist anymore. It could +---have either exploded, or been recovered, or been merged into another +---vessel via docking. You can check the value of the ``:HASSENDER`` +---suffix to find out if the sender of the message is still a valid vessel. +---If :attr:`HASSENDER` is false, then :attr:`SENDER` won't give you an +---object of type `Vessel` and instead will give you just a +---`boolean` false. +---@field hassender boolean +---Content of this message. +---@field content any + +---@class Note : Structure +---@field frequency number +---@field endfrequency number +---@field volume number +---@field keydownlength number +---@field duration number + +---@class Voice : Structure +---Settable. +---:type: `number` (seconds) +--- +---The *Attack* setting of the SKID voice's +---:ref:`ADSR Envelope `. This value is +---in seconds (usually a fractional portion of a second). +---@field attack number +---Settable. +---:type: `number` (seconds) +--- +---The *Decay* setting of the SKID voice's +---:ref:`ADSR Envelope `. This value is +---in seconds (usually a fractional portion of a second). +---@field decay number +---Settable. +---:type: `number` in the range [0..1] +--- +---The *Sustain* setting of the SKID voice's +---:ref:`ADSR Envelope `. Unlike the other +---values in the ASDR Envelope, this setting is NOT a measure +---of time. This is a coefficient to multiply the volume by +---during the sustain portion of the notes that are being played +---on this voice. (i.e. 0.5 would mean "sustain at half volume"). +---@field sustain number +---Settable. +---:type: `number` (seconds) +--- +---The *Release* setting of the SKID voice's +---:ref:`ADSR Envelope `. This value is +---in seconds (usually a fractional portion of a second). +---Note, that in order for this setting to have any real +---effect, the notes that are being played have to +---have their :attr:`KeyDownLength` set to be shorter than +---their :attr:`Duration`. While conceptually the +---max value is 1.0, in practice it can often go higher because +---the KSP game setting for User Interface volume is usually only +---at 50%, and in that scenario putting a 1.0 here would put the +---max at 50%, *really*. Setting this value to 0 will silence the voice. +---@field volume number +---Settable. +---To select which of the SKID chip's +---:ref:`waveform generators ` you want this voice +---to use, set this to the string name of that waveform. If you +---use a string that isn't one of the ones listed there (i.e. +---"triangle", "noise", "square", etc) then the attempt to set this +---value will be ignored and it will remain at its previous value. +---@field wave string +---:parameter note_or_list: Either one `Note` or a `List` of `Note`'s +---:returns: None +--- +---To cause the SKID chip to actually emit a sound, you need to +---use this suffix method. There are two ways it can be called: +--- +---**Play just one note** : To play a single note, you can call +---PLAY(), passing it one note object. Usually you construct +---the note object on the fly as you call Play, like so:: +--- +--- SET V0 to GetVoice(0). +--- V0:PLAY(NOTE(440,0.5)). +--- +---**Play a list of notes** : To play a full list of notes (which +---could even encode an entire song), you can call PLAY, passing it +---a `List` of `Note`'s. It will recognize that it +---is receiving a list of notes, and begin playing through them +---one at a time, only playing the next note when the previous +---note's :attr:`DURATION` is finished:: +--- +--- SET V0 to GetVoice(0). +--- V0:PLAY( +--- LIST( +--- NOTE(440, 0.5), +--- NOTE(400, 0.2), +--- SLIDENOTE(410, 350, 0.3) +--- ) +--- ). +--- +---**Notes play in the background**: In *either case*, whether +---playing a single note or a list of notes, the ``PLAY()`` +---method will return immediately, *before even the first note +---has begun playing*. It queues the note(s) to play, rather +---than waiting for them to finish. This lets your main program +---continue doing its work without waiting for the sound to finish. +--- +---**Calling PLAY() again on the same voice aborts the previous +---PLAY()**: Because the notes play in the background, it's possible +---to execute another PLAY() call while a previous one hasn't +---finished its work yet. If you do this, then the previous thing +---that was playing will quit, to be replaced by the new thing. +--- +---**But PLAY() can be called simultaneously on different voices**: +---(In fact that's the whole point of having different voices.). +---Calling PLAY() again on a *different* voice number will not +---abort the previous call to PLAY(). It only aborts the previous +---PLAY() when it's being done on the *same* voice. +---@field play fun(note_or_list: any) +---:returns: None +--- +---Calling this method will tell the voice to stop playing notes. If there are +---any notes queued to be played, they will not be played. If a note is +---currently being played, that note will be stopped. +---@field stop fun() +---Settable. +---If this is set to true, then the PLAY() method of this voice will +---keep on playing the same list of notes continually (starting over +---with the first note after the last note has finished). Note that +---for the purpose of this, a play command that was only given a single +---note to play still counts as a 'song' that is one note long (i.e. +---it will keep repeating the same note continually). +---@field loop boolean +---Settable. +---**Get**: If this voice is currently playing a note or list of notes +---that was previously passed in to the ``PLAY()`` method, then this +---returns true. Note that if :attr:`LOOP` is true, then this +---will never become false unless you set it to become false. +--- +---**Set**: If you set this value to FALSE, that will force the voice +---to stop playing whatever it was playing, and shut it up. (Setting +---it to true doesn't really mean anything. It becomes true because +---the PLAY() method was called. You can't restart a song just by +---setting this to true because when it becomes false, the voice +---"throws away" its memory of the song it was playing.) +---@field isplaying boolean +---Settable. +---When the voice is playing a `Note` or (more usefully) a +---`List` of `Note`'s, it will stretch or shrink the +---durations of those notes by multiplying them by this scaling +---factor. At 1.0 (the default), that means that when a note +---*says* it lasts for 1 second, then it really does. But if +---this tempo was set to, say 1.5, then that would mean that each +---time a note claims it wants to play for 1 second, it would really +---end up playing for 1.5 seconds on this voice. (or if you set +---the tempo to 0.5, then all songs will play their notes at double +---speed (each note only lasting half as long as it "should").) +--- +---In other words, setting this to a value less than 1.0 will +---speed up the song, and setting it to a value greater than 1.0 +---will slow it down (which might be the opposite of what you'd +---expect with it being called "tempo", but what else should +---we have called it? "slowpo"?) +--- +---Changes to this value take effect as soon as the next note in +---the song starts. (You do not need to re-run the PLAY() method. +---It will change the speed in mid-song.) +--- +---Be aware that this *only* scales the timings of the `Note`'s +---:attr:`KEYDOWNLENGTH` and :attr:`DURATION` +---timings. It does not +---affect the timings in the :ref:`ADSR Envelope `, as +---those represent what are meant to be physical properties of the +---"instrument" the voice is playing on. This means if you set the +---tempo too fast, it will start cutting off the full duration of the +---"envelope" of the notes, if you are playing the notes with settings +---that have a slow attack or decay. +---@field tempo number + +---@class Core : KOSProcessor +---The kOS version currently running. +---@field version Version +---The vessel containing the current processor. +---@field vessel Vessel +---The element object containing the current processor. +---@field element Element +---The currently selected volume for the current processor. This may be useful to prevent deleting files on the Archive, or for interacting with multiple local hard disks. +---@field currentvolume Volume +---Returns this processsor's message queue. +---@field messages MessageQueue + +---@class Bounds : Structure +---Settable. +---The position of the origin point of the bounding box, expressed +---in absolute coordinates (what kOS calls the ship-raw reference +---frame, that the rest of the position vectors in kOS use.) +--- +---If this bounding box came from a Part, this will be the same as +---that part's ``Part:POSITION``, and will keep being "magically" +---updated to stay with that part's position if it moves or rotates +---(but see note below). +--- +---If this bounding box came from a vessel, this will be the same as +---that vessel's ``Vessel:PARTS[0]:POSITION`` (the position of its +---root part) and be "magically" updated to stay with that part's +---position if it moves or rotates (but see note below). It is +---NOT ``Vessel:position``, which is important. ``Vessel:position`` +---is the *center of mass* of a vessel. While kOS prefers to use +---CoM as the official position of a vessel most of the time, the fact +---that using fuel shifts the position of the CoM within the vessel made +---it impractical to use CoM for the vessel's bounding box origin. +--- +---**WARNING about using SET with this suffix:** *If this bounds box +---was obtained using :attr:`Part:BOUNDS` or :attr:`Vessel:BOUNDS`, +---then this suffix keeps changing its value to remain correct as the +---vessel rotates or moves. But ONLY if you restrict your use of this +---suffix to GET-only. If you ever SET this suffix, kOS stops that +---auto-updating so it won't override the value you gave. Generally, +---using SET on this suffix was only ever intended for Bounds you +---created manually with the BOUNDS() function.* +---@field absorigin Vector +---Settable. +---This defines the orientation of this bounding box's local +---reference frame, by providing a rotation that will get you +---from the bounding-box relative orientation (in which the +---X, Y, and Z axes are parallel to the bounding box's edges) +---to the absolute orientation (the ship-raw orientation the +---rest of kOS uses). +--- +---If this bounding box came from a Part, this will be the same as +---that part's ``Part:FACING``, and will keep being "magically" +---updated to stay aligned with that part's facing if it moves or +---rotates (but see note below). +--- +---If this bounding box came from a Vessel, this will be the same as +---that Vessel's ``Vessel:FACING``, and will keep being "magically" +---updated to stay aligned with that part's facing if it moves or +---rotates (but see note below). +--- +---**WARNING about using SET with this suffix:** *If this bounds box +---was obtained using :attr:`Part:BOUNDS` or :attr:`Vessel:BOUNDS`, +---then this suffix keeps changing its value to remain correct as the +---vessel rotates or moves. But ONLY if you restrict your use of this +---suffix to GET-only. If you ever SET this suffix, kOS stops that +---auto-updating so it won't override the value you gave. Generally, +---using SET on this suffix was only ever intended for Bounds you +---created manually with the BOUNDS() function.* +---@field facing Direction +---Settable. +---:type: `Vector` **in bounding-box relative reference frame** +--- +---A vector expressed in the bounding-box-relative reference frame +---(where the XYZ axes are parallel to the bounding box's edges). +--- +---This defines one corner of the bounding box. It is the +---"negative-most" corner of the box. If you drew a vector from +---the box's origin point to its "negative-most" corner, that would +---be this vector. By "negative-most" that simply means the corner +---where the X, Y, and Z coordinates have their smallest values. +---(again, in the bounding box's own reference frame, not the absolute +---world (ship-raw) frame.) +--- +---This corner will always be the diagonally opposite corner from +---:attr:`Bounds:RELMAX`. +--- +---If you SET this value, you are changing the size of the +---bounding box, making it larger (or smaller), as well as +---stretching or shrinking it, depending on the new value +---you pick. Doing so doesn't *actually* change the size of +---a part or vessel, and is really only useful if you are +---working with your own ``Bounds`` you created manually with +---the ``Bounds()`` built-in function. +--- +---Be careful when trying to "add" the RELMIN vector to other +---vectors in the game. It's not oriented in ship-raw coords. +---To rotate it into ship-raw coords you can multiply it by +---the bounds facing like so: ``MyBounds:FACING * MyBounds:RELMIN``. +---@field relmin Vector +---Settable. +---:type: `Vector` **in bounding-box relative reference frame** +--- +---A vector expressed in the bounding-box-relative reference frame +---(where the XYZ axes are parallel to the bounding box's edges). +--- +---This defines one corner of the bounding box. It is the +---"positive-most" corner of the box. If you drew a vector from +---the box's origin point to its "positive-most" corner, that would +---be this vector. By "positive-most" that simply means the corner +---where the X, Y, and Z coordinates have their greatest values. +---(again, in the bounding box's own reference frame, not the absolute +---world (ship-raw) frame.) +--- +---This corner will always be the diagonally opposite corner from +---:attr:`Bounds:RELMIN`. +--- +---If you SET this value, you are changing the size of the +---bounding box, making it larger (or smaller), as well as +---stretching or shrinking it, depending on the new value +---you pick. Doing so doesn't *actually* change the size of +---a part or vessel, and is really only useful if you are +---working with your own ``Bounds`` you created manually with +---the ``Bounds()`` built-in function. +--- +---Be careful when trying to "add" the RELMAX vector to other +---vectors in the game. It's not oriented in ship-raw coords. +---To rotate it into ship-raw coords you can multiply it by +---the bounds facing like so: ``MyBounds:FACING * MyBounds:RELMAX``. +---@field relmax Vector +---This is the same point as :attr:`Bounds:RELMIN`, except it has +---been rotated and translated into absolute coordinates (what +---kOS calls the ship-raw reference frame, that the rest of the +---position vectors in kOS use.) +--- +---You cannot SET this value, because it is generated +---from the ABSORIGIN, the FACING, and the RELMIN. +--- +---Calculating the ABSMIN could be done in kerboscript from the +---other Bounds suffixes (see example below), but this is provided +---for convenience:: +--- +--- // The following two print lines should print +--- // the same vector, within reason. (There may be a +--- // small floating point precision variance between them): +--- set B to ship:bounds. +--- print B:ABSMIN. +--- print B:ABSORIGIN + (B:FACING * B:RELMIN). +---@field absmin Vector +---This is the same point as :attr:`Bounds:RELMAX`, except it has +---been rotated and translated into absolute coordinates (what +---kOS calls the ship-raw reference frame, that the rest of the +---position vectors in kOS use.) +--- +---You cannot SET this value, because it is generated +---from the ABSORIGIN, the FACING, and the RELMAX. +--- +---Calculating the ABSMAX could be done in kerboscript from the +---other Bounds suffixes (see example below), but this is provided +---for convenience:: +--- +--- // The following two print lines should print +--- // the same vector, within reason. (There may be a +--- // small floating point precision variance between them): +--- set B to ship:bounds. +--- print B:ABSMAX. +--- print B:ABSORIGIN + (B:FACING * B:RELMAX). +---@field absmax Vector +---:type: `Vector` **in bounding-box relative reference frame** +--- +---The center of the bounding box, in its own relative reference frame. +---(Not the absolute ship-raw reference frame the rest of kOS uses.) +--- +---This is the offset between the bounding box's origin and its center. +--- +---The origin of a bounding box is often not at its center because a +---bounding box can extend further in one direction than the other. +---For example a vessel's root part is often up at the top of the rocket, +---such a vessel's bounding box will extend much further in the "aft" +---direction than it does in the "fore" direction. The wing parts in the +---game are often defined with their origin point at the base where they +---glue to the fuselage, not out in the middle of the wing. +--- +---Instead of being provided directly, this value could be calculated +---from the RELMIN and RELMAX. It's simply the point exactly halfway +---between those two opposite corners. +---@field relcenter Vector +---This is just the same thing as :attr:`Bounds:RELCENTER`, but +---in the absolute (ship-raw) reference frame which scripts might find +---more useful. +--- +---It's exactly equivalent to doing this:: +--- +--- MyBounds:ABSORIGIN + (MyBounds:FACING * MyBounds:RELCENTER). +--- +---Instead of being provided directly, this value could be calculated +---from the ABSMIN and ABSMAX. It's simply the point exactly halfway +---between those two opposite corners. +---@field abscenter Vector +---Settable. +---:type: `Vector` **in bounding-box relative reference frame** +--- +---A vector (in bounding-box relative reference frame, NOT the +---absolute (ship-raw) reference frame the rest of kOS uses) +---that describes where :attr:`Bounds:RELMAX` is, relative to +---to the box's center (rather than to its origin). +--- +---Note that the vector in the inverse direction of this one (that you'd +---get by multiplying it by -1), points from the center to +---the oppposite corner, the :attr:`Bounds:RELMIN`. +---@field extents Vector +---Settable. +---:type: `Vector` **in bounding-box relative reference frame** +--- +---A vector (in bounding-box relative reference frame, NOT the +---absolute (ship-raw) reference frame the rest of kOS uses) +---that describes the ray from RELMIN to RELMAX that goes diagonally +---across the whole box. It's always just the same thing you'd +---get if you took the :attr:`Bounds:EXTENTS` vector and multiplied +---it by the scalar 2. +---@field size Vector +---:parameter ray: The "that-a-way" `Vector` in absolute (ship-raw) reference frame. +---:return: `Vector` in absolute (ship-raw) referece frame. +--- +---Returns the position (in absolute (ship-raw) reference frame) of +---whichever of the 8 corners of this bounding box is "furthest" in +---the direction the ray vector is pointing. Useful when you want +---to know the furthest a bounding box extends in some gameworld +---direction. +--- +---Examples:: +--- +--- // Assume other_vessel has been set to some vessel nearby +--- // other than the current SHIP: +--- // +--- local ves_box is other_vessel:bounds. +--- local top is ves_box:furthestcorner(up:vector). +--- local bottom is ves_box:furthestcorner(-up:vector). +--- +--- local from_other_to_me is ship:position - other_vessel:position. +--- local nearest is ves_box:furthestcorner(from_other_to_me). +--- print "The closest point on the other vessel's bounds box is this far away:". +--- print nearest:mag. +--- +--- // A more complex example showing how you might use bounds boxes +--- // when trying to figure out how big a target vessel is so you +--- // know how to go around it: +--- // +--- local my_left is -ship:facing:starvector. +--- local leftmost is ves_box:furthestcorner(my_left). +--- print "In order to go around the other vessel, to the left, ". +--- pritn "I would need to shift myself this far to my left:". +--- print vdot(-ship:facing:starvector, leftmost). +---@field furthestcorner fun(ray: Vector): Vector +---The above-sea-level altitude reading from the bottom-most corner of +---this bounding box, toward whichever Body the current CPU vessel is +---orbiting. +--- +---Note that it's always using the CPU vessel's *current* +---body to decide which body is the one that defines the bounding +---box's "downward" direction for picking its bottom-most corner, +---and it uses that same body to decide what counts as "altitude", +---regardless of wether the bounds box is a bounds box of the current +---CPU vessel or something else. +--- +---To put it another way: You can't "read" what the altitude of a +---bounding box above the Mun is if your ship is currently +---in Kerbin's sphere of influence. If you are currently orbiting +---Kerbin, it will assume that the "bottom" of any Bounds box you +---refer to means "corner closest to Kerbin" and "altitude" means +---"distance from Kerbin's Sea level". Once your CPU vessel moves +---into the Mun's sphere of influence this will change it it will +---now assume that the "bottom" of a Bounds is the corner closest +---to the Mun and the altitude you care about is the altitude above +---the Mun. +--- +---This may seem like a limitation, but it really isn't, since you +---wouldn't be able to query a vessel or a part for its bounding +---box if that vessel was far enough away to be outside the loading +---distance and thus its full set of parts isn't "there". +---It would only be a limitation for cases where you are inventing +---your own bounds boxes from scratch. +---@field bottomalt number +---The radar-altitude reading from the bottom-most corner of +---this bounding box, toward whichever Body the current CPU vessel is +---orbiting. Same as :attr:`Bounds:BOTTOMALT` except for the +---difference between above-sea-level altitude versus radar altitude. +---@field bottomaltradar number + +---@class ScienceExperimentModule : PartModule +---Call this method to deploy and run this science experiment. This method will fail if the experiment already contains scientific +---data or is inoperable. +---@field deploy fun() +---Call this method to reset this experiment. This method will fail if the experiment is inoperable. +---@field reset fun() +---Call this method to transmit the results of the experiment back to Kerbin. This will render the experiment +---inoperable if it is not rerunnable. This method will fail if there is no data to send. +---@field transmit fun() +---Call this method to discard the data obtained as a result of running this experiment. +---@field dump fun() +---True if this experiment is no longer operable. +---@field inoperable boolean +---True if this experiment is deployed. +---@field deployed boolean +---True if this experiment can be run multiple times. +---@field rerunnable boolean +---True if this experiment has scientific data stored. +---@field hasdata boolean +---:type: `List` of `ScienceData` +--- +---List of scientific data obtained by this experiment +---@field data List + +---@class PartModule : Structure +---:test: string +--- +---Get the name of the module. Note that it's the same as the name given in the MODULE section of the Part.cfg file for the part. +---@field name string +---:test: `Part` +--- +---Get the `Part` that this PartModule is attached to. +---@field part Part +---:test: `List` of strings +--- +---Get a list of all the names of KSPFields on this PartModule that the kos script is CURRENTLY allowed to get or set with :GETFIELD or :SETFIELD. Note the Security access comments below. This list can become obsolete as the game continues running depending on what the PartModule chooses to do. +---@field allfields List +---:test: `List` of strings +--- +--- Similar to :ALLFIELDS except that it returns the string without the formatting to make it easier to use in a script. This list can become obsolete as the game continues running depending on what the PartModule chooses to do. +---@field allfieldnames List +---:parameter name: (`string`) Name of the field +---:return: `boolean` +--- +---Return true if the given field name is currently available for use with :GETFIELD or :SETFIELD on this PartModule, false otherwise. +---@field hasfield fun(name: string): boolean +---:test: `List` of strings +--- +---Get a list of all the names of KSPEvents on this PartModule that the kos script is CURRENTLY allowed to trigger with :DOEVENT. Note the Security access comments below. This list can become obsolete as the game continues running depending on what the PartModule chooses to do. +---@field allevents List +---:test: `List` of strings +--- +--- Similar to :ALLEVENTS except that it returns the string without the formatting to make it easier to use in a script. This list can become obsolete as the game continues running depending on what the PartModule chooses to do. +---@field alleventnames List +---:parameter name: (`string`) Name of the event +---:return: `boolean` +--- +---Return true if the given event name is currently available for use with :DOEVENT on this PartModule, false otherwise. +---@field hasevent fun(name: string): boolean +---:test: `List` of strings +--- +---Get a list of all the names of KSPActions on this PartModule that the kos script is CURRENTLY allowed to trigger with :DOACTION. Note the Security access comments below. +---@field allactions List +---:test: `List` of strings +--- +--- Similar to :ALLACTIONS except that it returns the string without the formatting to make it easier to use in a script. This list can become obsolete as the game continues running depending on what the PartModule chooses to do. +---@field allactionnames List +---:parameter name: (`string`) Name of the action +---:return: `boolean` +--- +---Return true if the given action name is currently available for use with :DOACTION on this PartModule, false otherwise. +---@field hasaction fun(name: string): boolean +---:parameter name: (`string`) Name of the field +---:return: varies +--- +---Get the value of one of the fields that this PartModule has placed onto the rightclick menu for the part. Note the Security comments below. +---@field getfield fun(name: string): any +---:parameter name: (`string`) Name of the field +--- +---Set the value of one of the fields that this PartModule has placed onto the rightclick menu for the part. Note the Security comments below. +--- +---WARNING: This suffix is only settable for parts attached to the :ref:`CPU Vessel ` +--- +---SYMMETRY NOTE: There is one important difference between using +---SETFIELD to set a field versus what happens when you use the mouse +---to do it in the game's GUI. In the GUI, often if the part is +---in a 2x, 3x, 4x, 6x, or 8x symmetry group, setting a field on +---one part will cause the other parts' fields to also change along +---with it. Generally that does NOT happen when you use kOS to set +---the field. If you want to set the same value to all the parts in +---a symmetry group, you need to iterate over all the parts yourself +---using the part's :attr:`Part::SYMMETRYCOUNT` suffix to see how +---many symmetrical parts there are, and iterate over them with +---:attr:`Part:SYMMETRYPARTNER(index)`, calling ``SETFIELD`` on +---them one at a time. +---@field setfield fun(name: string, value: any) +---:parameter name: (`string`) Name of the event +--- +---Trigger an "event button" that is on the rightclick part menu at the moment. Note the Security comments below. +--- +---WARNING: This suffix is only callable for parts attached to the :ref:`CPU Vessel ` +---@field doevent fun(name: string) +---:parameter name: (`string`) Name of the action +---:parameter bool: (`boolean`) Value to set: True or False +--- +---Activate one of this PartModule's action-group-able actions, bypassing the action group system entirely by just activating it for this one part directly. The `boolean` value decides whether you are toggling the action ON or toggling it OFF. Note the Security comments below. +--- +---WARNING: This suffix is only callable for parts attached to the :ref:`CPU Vessel ` +---@field doaction fun(name: string, bool: boolean) + +---@class KOSProcessor : PartModule +---Indicates the current state of this processor. `OFF` - deactivated, `READY` - active, or `STARVED` - no power. +---@field mode string +---:returns: None +--- +---Activate this processor +---@field activate fun() +---:returns: None +--- +---Deactivate this processor +---@field deactivate fun() +---This processor's hard disk. +---@field volume Volume +---Settable. +---This processor's name tag +---@field tag string +---Settable. +---The filename for the boot file on this processor. This may be set to an empty :ref:`string ` “” or to “None” to disable the use of a boot file. +---@field bootfilename string +---:return: `Connection` +--- +---Returns your connection to this processor. +---@field connection Connection + +---@class ScienceContainerModule : PartModule +---:type: :ref:`Boolean ` +--- +---True if this container has scientific data stored. +---@field hasdata boolean +---:type: `List` of `ScienceData` +--- +---List of scientific data contained by this part +---@field data List +---Call this method to dump the particular experiment provided +---@field dumpdata fun(DATA: number) +---Call this method to run the unit's "collect all" action +---@field collectall fun() + +---@class Gimbal : PartModule +---Settable. +---Is this gimbal locked to neutral position and not responding to steering controls right now? When you set it to true it will snap the engine back to 0s for pitch, yaw and roll +---@field lock boolean +---Settable. +---Is the gimbal responding to pitch controls? Relevant only if the gimbal is not locked. +---@field pitch boolean +---Settable. +---Is the gimbal responding to yaw controls? Relevant only if the gimbal is not locked. +---@field yaw boolean +---Settable. +---Is the gimbal responding to roll controls? Relevant only if the gimbal is not locked. +---@field roll boolean +---Settable. +---:type: `number` (%) +--- +---Percentage of maximum range this gimbal is allowed to travel +---@field limit number +---:type: `number` (deg) +--- +---The maximum extent of travel possible for the gimbal along all 3 axis (Pitch, Yaw, Roll) +---@field range number +---A Measure of the rate of travel for the gimbal +---@field responsespeed number +---The gimbals current pitch, has a range of -1 to 1. Will always be 0 when LOCK is true +---@field pitchangle number +---The gimbals current yaw, has a range of -1 to 1. Will always be 0 when LOCK is true +---@field yawangle number +---The gimbals current roll, has a range of -1 to 1. Will always be 0 when LOCK is true +---@field rollangle number + +---@class Addons : Structure +---@field id RTAddon +---@field available fun(param1: string): boolean +---@field hasaddon fun(param1: string): boolean + +---@class Skin : Structure +---Settable. +---@field name Style +---Settable. +---@field name Style +---Settable. +---@field font string +---Settable. +---@field selectioncolor RGBA +---@field add fun(param1: string, param2: Style): Style +---@field get fun(param1: string): Style +---@field has fun(param1: string): boolean + +---@class TipDisplay : Label + +---@class Button : Label +---Settable. +---@field pressed boolean +---@field takepress boolean +---Settable. +---@field toggle boolean +---Settable. +---@field exclusive boolean +---Settable. +---@field ontoggle UserDelegate +---Settable. +---@field onclick UserDelegate + +---@class Slider : Widget +---Settable. +---@field value number +---Settable. +---@field min number +---Settable. +---@field max number +---Settable. +---@field onchange UserDelegate + +---@class Label : Widget +---Settable. +---@field text string +---Settable. +---@field image string +---Settable. +---@field textupdater UserDelegate +---Settable. +---@field tooltip string + +---@class PopupMenu : Button +---Settable. +---@field options List +---@field addoption fun(param1: any) +---Settable. +---@field value any +---Settable. +---@field index number +---@field clear fun() +---Settable. +---@field changed boolean +---Settable. +---@field maxvisible number +---Settable. +---@field onchange UserDelegate +---Settable. +---@field optionsuffix string + +---@class StyleState : Structure +---Settable. +---@field bg string +---Settable. +---@field textcolor RGBA + +---@class GUI : Box +---Settable. +---@field x number +---Settable. +---@field y number +---Settable. +---@field draggable boolean +---Settable. +---@field extradelay number +---Settable. +---@field skin Skin +---@field tooltip string + +---@class StyleRectOffset : Structure +---Settable. +---@field h number +---Settable. +---@field v number +---Settable. +---@field left number +---Settable. +---@field right number +---Settable. +---@field top number +---Settable. +---@field bottom number + +---@class ScrollBox : Box +---Settable. +---@field halways boolean +---Settable. +---@field valways boolean +---Settable. +---@field position Vector + +---@class Style : Structure +---@field margin StyleRectOffset +---@field padding StyleRectOffset +---@field border StyleRectOffset +---@field overflow StyleRectOffset +---Settable. +---@field width number +---Settable. +---@field height number +---Settable. +---@field hstretch boolean +---Settable. +---@field vstretch boolean +---Settable. +---@field bg string +---Settable. +---@field textcolor RGBA +---@field normal StyleState +---@field focused StyleState +---@field active StyleState +---@field hover StyleState +---@field on StyleState +---@field normal StyleState +---@field on StyleState +---@field focused StyleState +---@field on StyleState +---@field active StyleState +---@field on StyleState +---@field hover StyleState +---@field on StyleState +---Settable. +---@field font string +---Settable. +---@field fontsize number +---Settable. +---@field richtext boolean +---Settable. +---@field align string +---Settable. +---@field wordwrap boolean + +---@class Spacing : Widget +---Settable. +---@field amount number + +---@class Box : Widget +---@field addlabel fun(...): Label +---@field addtextfield fun(...): TextField +---@field addbutton fun(...): Button +---@field addradiobutton fun(...): Button +---@field addcheckbox fun(...): Button +---@field addpopupmenu PopupMenu +---@field addhslider fun(...): Slider +---@field addvslider fun(...): Slider +---@field addhbox Box +---@field addvbox Box +---@field addhlayout Box +---@field addvlayout Box +---@field addscrollbox ScrollBox +---@field addstack Box +---@field addspacing fun(...): Spacing +---@field addtipdisplay fun(...): Label +---@field widgets List +---@field radiovalue string +---Settable. +---@field onradiochange UserDelegate +---@field showonly fun(param1: Widget) +---@field clear fun() + +---@class TextField : Label +---Settable. +---@field changed boolean +---Settable. +---@field confirmed boolean +---Settable. +---@field onchange UserDelegate +---Settable. +---@field onconfirm UserDelegate + +---@class Widget : Structure +---Settable. +---@field enabled boolean +---Settable. +---@field visible boolean +---@field show fun() +---@field hide fun() +---@field dispose fun() +---Settable. +---@field style Style +---@field gui GUI +---@field parent Widget +---@field hasparent boolean + +---@class Vessel : Orbitable +---:parameter name: (`string`) Name of the parts +---:return: `List` of `Part` objects +--- +---Returns a list of all the parts that have this as their +---``Part:NAME``. The matching is done case-insensitively. For more information, see :ref:`ship parts and modules `. +---@field partsnamed fun(name: string): List +---:parameter namePattern: (`string`) Pattern of the name of the parts +---:return: `List` of `Part` objects +--- +---Returns a list of all the parts that have this Regex pattern in their +---``Part:NAME``. The matching is done identically as in :meth:`String:MATCHESPATTERN`\ . For more information, see :ref:`ship parts and modules `. +---@field partsnamedpattern fun(namePattern: string): List +---:parameter title: (`string`) Title of the parts +---:return: `List` of `Part` objects +--- +---Returns a list of all the parts that have this as their +---``Part:TITLE``. The matching is done case-insensitively. For more information, see :ref:`ship parts and modules `. +---@field partstitled fun(title: string): List +---:parameter titlePattern: (`string`) Patern of the title of the parts +---:return: `List` of `Part` objects +--- +---Returns a list of all the parts that have this Regex pattern in their +---``Part:TITLE``. The matching is done identically as in :meth:`String:MATCHESPATTERN`\ . For more information, see :ref:`ship parts and modules `. +---@field partstitledpattern fun(titlePattern: string): List +---:parameter name: (`string`) name, title or tag of the parts +---:return: `List` of `Part` objects +--- +---Return a list of all the parts that match this +---name regardless of whether that name is the Part:Name, the Part:Tag, or the Part:Title. It is effectively the distinct union of :PARTSNAMED(val), :PARTSTITLED(val), :PARTSTAGGED(val). The matching is done case-insensitively. For more information, see :ref:`ship parts and modules `. +---@field partsdubbed fun(name: string): List +---:parameter namePattern: (`string`) Pattern of the name, title or tag of the parts +---:return: `List` of `Part` objects +--- +---Return a list of parts that match this Regex pattern +---regardless of whether that name is the Part:Name, the Part:Tag, or the Part:Title. It is effectively the distinct union of :PARTSNAMEDPATTERN(val), :PARTSTITLEDPATTERN(val), :PARTSTAGGEDPATTERN(val). The matching is done identically as in :meth:`String:MATCHESPATTERN`\ . For more information, see :ref:`ship parts and modules `. +---@field partsdubbedpattern fun(namePattern: string): List +---:parameter name: (`string`) Name of the part modules +---:return: `List` of `PartModule` objects +--- +---Return a list of all the `PartModule` objects that +---match the given name. The matching is done case-insensitively. For more information, see :ref:`ship parts and modules `. +---@field modulesnamed fun(name: string): List +---:parameter group: (integer) the action group number +---:return: `List` of `Part` objects +--- +---one action triggered by the given action group. For more information, see :ref:`ship parts and modules `. +---@field partsingroup fun(group: string): List +---:parameter group: (integer) the action group number +---:return: `List` of `PartModule` objects +--- +---have at least one action triggered by the given action group. For more information, see :ref:`ship parts and modules `. +---@field modulesingroup fun(group: string): List +---:parameter tag: (`string`) Tag of the parts +---:return: `List` of `Part` objects +--- +---Returns a list of all the parts that have this name as their +---``Part:TAG`` value. The matching is done case-insensitively. For more information, see :ref:`ship parts and modules `. +---@field partstagged fun(tag: string): List +---:parameter tagPattern: (`string`) Pattern of the tag of the parts +---:return: `List` of `Part` objects +--- +---Returns a list of all the parts that match this Regex pattern in their +---``part:TAG`` value. The matching is done identically as in :meth:`String:MATCHESPATTERN`\ . For more information, see :ref:`ship parts and modules `. +---@field partstaggedpattern fun(tagPattern: string): List +---:return: `List` of `Part` objects +--- +---Return all parts who's nametag isn't blank. +---For more information, see :ref:`ship parts and modules `. +---@field alltaggedparts List +---:type: `List` of `Part` objects +--- +---A List of all the :ref:`parts ` on the vessel. ``SET FOO TO SHIP:PARTS.`` has exactly the same effect as ``LIST PARTS IN FOO.``. For more information, see :ref:`ship parts and modules `. +---@field parts List +---:type: `List` of `DockingPort` objects +--- +---A List of all the :ref:`docking ports ` on the Vessel. +---@field dockingports List +---@field decouplers List +---@field separators List +---:type: `List` of `Element` objects +--- +---A List of all the :ref:`elements ` on the Vessel. +---@field elements List +---:type: `List` of `Engine` objects +--- +---A List of all the :ref:`engines ` on the Vessel. +---@field engines List +---:type: `List` of `RCS` objects +--- +---A List of all the :ref:`RCS thrusters ` on the Vessel. +---@field rcs List +---The structure representing the raw flight controls for the vessel. +--- +---WARNING: This suffix is only gettable for :ref:`CPU Vessel ` +---@field control Control +---*relative* compass heading (degrees) to this vessel from the :ref:`CPU Vessel `, taking into account the CPU Vessel's own heading. +---@field bearing number +---*absolute* compass heading (degrees) to this vessel from the :ref:`CPU Vessel ` +---@field heading number +---Sum of all the :ref:`engines' THRUSTs ` of all the currently active engines In Kilonewtons. +---@field thrust number +---Sum of all the :ref:`engines' AVAILABLETHRUSTs ` of all the currently active engines taking into account their throttlelimits. Result is in Kilonewtons. +---@field availablethrust number +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---:type: `number` (kN) +--- +---Sum of all the :ref:`engines' AVAILABLETHRUSTATs ` of all the currently active engines taking into account their throttlelimits at the given atmospheric pressure. Result is in Kilonewtons. Use a pressure of 0 for vacuum, and 1 for sea level (on Kerbin). +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field availablethrustat fun(pressure: number): number +---Sum of all the :ref:`engines' MAXTHRUSTs ` of all the currently active engines In Kilonewtons. +---@field maxthrust number +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---:type: `number` (kN) +--- +---Sum of all the :ref:`engines' MAXTHRUSTATs ` of all the currently active engines In Kilonewtons at the given atmospheric pressure. Use a pressure of 0 for vacuum, and 1 for sea level (on Kerbin). +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field maxthrustat fun(pressure: number): number +---The way the vessel is pointed, which is also the rotation +---that would transform a vector from a coordinate space where the +---axes were oriented to match the vessel's orientation, to one +---where they're oriented to match the world's ship-raw coordinates. +--- +---i.e. ``SHIP:FACING * V(0,0,1)`` gives the direction the +---ship is pointed (it's Z-axis) in absolute ship-raw coordinates +---@field facing Direction +---Constructs a "bounding box" structure that can be used to +---give your script some idea of the extents of the vessel's shape - how +---wide, long, and tall it is. +--- +---It is rather expensive in terms of CPU time to call this suffix. +---(Calling :attr:`Part:BOUNDS` on ONE part on the ship is itself a +---*little* expensive, and this has to perform that same work on +---every part on the ship, finding the bounding box that would +---surround all the parts.) Because of that expense, kOS **forces** +---your script to give up its remaining instructions this update when +---you call this (It forces the equivalent of doing a ``WAIT 0.`` +---right after you call it). This is to discourage you from +---calling this suffix again and again in a fast loop. The proper +---way to use this suffix is to call it once, storing the result in +---a variable, and then use that variable repeatedly, rather than +---using the suffix itself repeatedly. Only call the suffix again +---when you have reason to expect the bounding box to change or +---become invalid, such as docking, staging, changing facing to a +---new control-from part, and so on. +--- +---More detailed information about how to read the bounds box, and +---what circumstances call for getting a re-generated copy of the +---bounds box, is found on the documentation page for `Bounds`. +---@field bounds Bounds +---Given in :ref:`SHIP_RAW ` reference frame. The vector +---represents the axis of the rotation (in left-handed convention, +---not right handed as most physics textbooks show it), and its +---magnitude is the angular momentum of the rotation, which varies +---not only with the speed of the rotation, but also with the angular +---inertia of the vessel. +--- +---Units are expressed in: (Megagrams * meters^2) / (seconds * radians) +--- +---(Normal SI units would use kilograms, but in KSP all masses use a +---1000x scaling factor.) +--- +---**Justification for radians here:** +---Unlike the trigonometry functions in kOS, this value uses radians +---rather than degrees. The convention of always expressing angular +---momentum using a formula that assumes you're using radians is a very +---strongly adhered to universal convention, for... reasons. +---It's so common that it's often not even explicitly +---mentioned in information you may find when doing a web search on +---helpful formulae about angular momentum. This is why kOS doesn't +---use degrees here. (That an backward compatibility for old scripts. +---It's been like this for quite a while.). +---@field angularmomentum Vector +---Angular velocity of the body's rotation about its axis (its +---day) expressed as a vector. +--- +---The direction the angular velocity points is in Ship-Raw orientation, +---and represents the axis of rotation. Remember that everything in +---Kerbal Space Program uses a *left-handed coordinate system*, which +---affects which way the angular velocity vector will point. If you +---curl the fingers of your **left** hand in the direction of the rotation, +---and stick out your thumb, the thumb's direction is the way the +---angular velocity vector will point. +--- +---The magnitude of the vector is the speed of the rotation. +--- +---Note, unlike many of the other parts of kOS, the rotation speed is +---expressed in radians rather than degrees. This is to make it +---congruent with how VESSEL:ANGULARMOMENTUM is expressed, and for +---backward compatibility with older kOS scripts. +---@field angularvel Vector +---:type: `number` (metric tons) +--- +---The mass of the ship +---@field mass number +---:type: `number` (m/s) +--- +---How fast the ship is moving. in the "up" direction relative to the SOI Body's sea level surface. +---@field verticalspeed number +---:type: `number` (m/s) +--- +---How fast the ship is moving in the two dimensional plane horizontal +---to the SOI body's sea level surface. The vertical component of the +---ship's velocity is ignored when calculating this. +--- +---.. note:: +--- +--- .. versionadded:: 0.18 +--- The old name for this value was SURFACESPEED. The name was changed +--- because it was confusing before. "surface speed" implied it's the +--- `number` magnitude of "surface velocity", but it wasn't, because of how +--- it ignores the vertical component. +---@field groundspeed number +---@field surfacespeed number +---:type: `number` (m/s) +--- +---How fast the ship is moving relative to the air. KSP models atmosphere as simply a solid block of air "glued" to the planet surface (the weather on Kerbin is boring and there's no wind). Therefore airspeed is generally the same thing as as the magnitude of the surface velocity. +---@field airspeed number +---Settable. +---The name of the vessel as it appears in the tracking station. When you set this, it cannot be empty. +---@field shipname string +---Settable. +---The name of the vessel as it appears in the tracking station. When you set this, it cannot be empty. +---@field name string +---Settable. +---The ship's type as described `on the KSP wiki `_. +---@field type string +---Structure holding summary information of sensor data for the vessel +---@field sensors VesselSensors +---:type: `number` (m/s) +--- +---(Deprecated with KSP 1.0 atmospheric model) +--- +---Terminal velocity of the vessel in freefall through atmosphere, based on the vessel's current altitude above sea level, and its drag properties. Warning, can cause values of Infinity if used in a vacuum, and kOS sometimes does not let you store Infinity in a variable. +--- +---.. note:: +--- +--- .. deprecated:: 0.17.2 +--- +--- Removed to account for significant changes to planetary atmosphere mechanics introduced in KSP 1.0 +---@field termvelocity number +---:type: `number` (ATM's) +--- +---Returns what the air pressure is in the atmosphere surrounding the vessel. +---The value is returned in units of sea-level Kerbin atmospheres. Many +---formulae expect you to plug in a value expressed in kiloPascals, or +---kPA. You can convert this value into kPa by multiplying it by +---`constant:ATMtokPa`. +---@field dynamicpressure number +---:type: `number` (ATM's) +--- +---Returns what the air pressure is in the atmosphere surrounding the vessel. +---The value is returned in units of sea-level Kerbin atmospheres. Many +---formulae expect you to plug in a value expressed in kiloPascals, or +---kPA. You can convert this value into kPa by multiplying it by +---`constant:ATMtokPa`. +---@field q number +---:type: :ref:`Boolean ` +--- +---True if the vessel is fully loaded into the complete KSP physics engine (false if it's "on rails"). +---See `LoadDistance` for details. +---@field loaded boolean +---:type: :ref:`Boolean ` +--- +---True if the vessel is fully unpacked. That is to say that all of the individual parts are loaded +---and can be interacted with. This allows docking ports to be targeted, and controls if some +---actions/events on parts will actually trigger. See `LoadDistance` for details. +---@field unpacked boolean +---The ROOTPART is usually the first `Part` that was used to begin the ship design - the command core. Vessels in KSP are built in a tree-structure, and the first part that was placed is the root of that tree. It is possible to change the root part in VAB/SPH by using Root tool, so ROOTPART does not always point to command core or command pod. Vessel:ROOTPART may change in flight as a result of docking/undocking or decoupling of some part of a Vessel. +---@field rootpart Part +---Returns the `Part` serving as the control reference, relative to +---which the directions (as displayed on the navball and returned in +---:attr:`FACING`) are determined. A part may be set as the control reference +---part by "Control From Here" action or :meth:`PART:CONTROLFROM` command +---(available for parts of specific types). **NOTE:** It is possible for this +---to return unexpected values if the root part of the vessel cannot serve as a +---control reference, and the control has not been directly selected. +---@field controlpart Part +---:type: `number` (metric tons) +--- +---The mass of the ship if all resources were empty +---@field drymass number +---:type: `number` (metric tons) +--- +---The mass of the ship if all resources were full +---@field wetmass number +---:type: `List` of `AggregateResource` objects +--- +---A List of all the :ref:`AggregateResources ` on the vessel. ``SET FOO TO SHIP:RESOURCES.`` has exactly the same effect as ``LIST RESOURCES IN FOO.``. +---@field resources List +---Returns the load distance object for this vessel. The suffixes of this object may be adjusted to change the loading behavior of this vessel. Note: these settings are not persistent across flight instances, and will reset the next time you launch a craft from an editor or the tracking station. +---@field loaddistance LoadDistances +---:type: :ref:`Boolean ` +--- +---It is possible to have a variable that refers to a vessel that +---doesn't exist in the Kerbal Space Program universe anymore, but +---did back when you first got it. For example: you could do: +---SET VES TO VESSEL("OTHER"). WAIT 10. And in that intervening +---waiting time, the vessel might have crashed into the ground. +---Checking :ISDEAD lets you see if the vessel that was previously +---valid isn't valid anymore. +---@field isdead boolean +---The current status of the vessel possible results are: `LANDED`, `SPLASHED`, `PRELAUNCH`, `FLYING`, `SUB_ORBITAL`, `ORBITING`, `ESCAPING` and `DOCKED`. +---@field status string +---:return: `number` +--- +---The total delta-v of this vessel in its current situation, using the stock +---calulations the KSP game shows in the staging list. Note that this is only +---as accurate as the stock KSP game's numbers are. +---@field deltav DeltaV +---:parameter num: `number` the stage number to query for +---:return: `DeltaV` +--- +---One stage's Delta-V info. Pass in the stage number for which stage. The +---curent stage can be found with ``:STAGENUM``, and they count down from +---there to stage 0 at the "top" of the staging list. +--- +---If you pass in a number that is less than zero, it will return the info about +---stage 0. If you pass in a number that is greater than the current stage, it +---will return the info about the current stage. In other words, if there are +---currently stages 5, 4, 3, 2, 1, and 0, then passing in -99 gives you stage 0, +---and passing in stage 9999 gets you stage 5. +---@field stagedeltav fun(num: number): DeltaV +---Tells you which stage number is current. Stage numbers always count down, which +---is backward from how you might usually refer to stages in most space lingo, but +---in KSP, it's how it's done. (Stage 5 on bottom, Stage 0 on top, for example). +--- +---e.g. if STAGENUM is 4, that tells you the vessel has 5 total stages remaining, +---numbered 4, 3, 2, 1, and 0. +---@field stagenum number +---@field latitude number +---@field longitude number +---@field altitude number +---:return: `List` of `CrewMember` objects +--- +---list of all :struct:`kerbonauts ` aboard this vessel +---@field crew List +---crew capacity of this vessel +---@field crewcapacity number +---:return: `Connection` +--- +---Returns your connection to this vessel. +---@field connection Connection +---:return: `MessageQueue` +--- +---Returns this vessel's message queue. You can only access this attribute for your current vessel (using for example `SHIP:MESSAGES`). +---@field messages MessageQueue +---:return: None +--- +---Call this method to start tracking the object. This is functionally the +---same as clicking on the "Start Tracking" button in the Tracking Station +---interface. The primary purpose is to change asteroids from being displayed +---in the tracking station or on the map as ``"Unknown"`` to being displayed as +---``"SpaceObject"``. By doing so, the asteroid will not be de-spawned by +---KSP's asteroid management system. +--- +---.. note:: +--- This does not change the value returned by :attr:`Vessel:TYPE`. KSP +--- internally manages the "discovery information" for vessels, including +--- assteroids, in a different system. As a result, the value kOS reads for +--- ``TYPE`` may be different from that displayed on the map. +---@field starttracking fun() +---:return: None +--- +---Call this method to stop tracking an asteroid or asteroid-like object. +---This is functionally the same as using the Tracking Station interface +---to tell KSP to forget the asteroid. Doing so also tells the Tracking +---Station that it's okay to de-spawn the object if it feels the need +---to clean it up to avoid clutter. +---@field stoptracking fun() +---Returns the size class for an asteroid or asteroid-like object (which +---is modeled in the game as a vessel). (i.e. class A, B, C, D, or E +---for varying size ranges of asteroid.) For objects that the tracking +---station is tracking but you have not yet rendezvous'ed with, sometimes +---all the game lets you know is the general class and not the specific +---dimensions or mass. +--- +---If you are not tracking the object yet, the returned string can come +---back as "UNKNOWN" rather than one of the known class sizes. +---@field sizeclass string +---@field soichangewatchers UniqueSet +---@field positionerror Vector + +---@class Addon : Structure +---@field available boolean + +---@class TimeStamp : TimeBase +---@operator add(TimeStamp):TimeStamp +---@operator add(TimeSpan):TimeStamp +---@operator add(number):TimeStamp +---@operator sub(TimeStamp):TimeSpan +---@operator sub(TimeSpan):TimeStamp +---@operator sub(number):TimeStamp +---@operator mul(TimeStamp):TimeStamp +---@operator mul(TimeSpan):TimeStamp +---@operator mul(number):TimeStamp +---@operator div(TimeStamp):TimeStamp +---@operator div(TimeSpan):TimeStamp +---@operator div(number):TimeStamp +---Settable. +---Year-hand number. Note that the first year of the game, at "epoch" +---time is actullay year 1, not year 0. +---@field year number +---Settable. +---:type: `number` (range varies by universe) +--- +---Day-hand number. Kerbin has 426 days in its year if using Kerbin's +---6 hour day (one fourth of that if :attr:`Kuniverse:HOURSPERDAY` is +---24 meaning the game is configured to show Earthlike days not Kerbin +---days.) +--- +---Also note that with mods installed you might not be looking at +---the stock universe, which could change the range this field could +---be if it changes how long a year is in your solar system. +--- +---Note that the first day of the year is actually day 1, not day 0. +---@field day number +---Settable. +---:type: `number` (0-5) or (0-23) +--- +---Hour-hand number. Note the setting :attr:`Kuniverse:HOURSPERDAY` affects +---whether this will be a number from 0 to 5 (6 hour day) or a number +---from 0 to 23 (24 hour day). +---@field hour number +---Settable. +---:type: `number` (0-59) +--- +---Minute-hand number +---@field minute number +---Settable. +---:type: `number` (0-59) +--- +---Second-hand number. +---@field second number +---:type: `number` (float) +--- +---Total Seconds since Epoch. Epoch is defined as the moment your +---current saved game's universe began (the point where you started +---your campaign). Can be very precise to the current "physics tick" +---and store values less than one second. (i.e. a typical value +---might be something like 50402.103019 seconds). Please note +---that if you print this in a loop again and again it will appear +---to be "frozen" for a bit before moving in discrete jumps. This +---reflects the fact that Kerbal Space Program is a computer simulated +---world where time advances in discrete chunks, not smoothly. +---@field seconds number +---The full string for the timestamp. (Down to the second anyway. Fractions of +---seconds not shown), including year, day, hour, minute, and second. +---The format is: +--- +---``Year XX Day XX HH:MM:SS`` +---@field full string +---Time in (HH:MM:SS) format. Does not show which year or day. +---@field clock string +---Date in ``Year XX Day XX`` format. +---@field calendar string + +---@class ScienceData : Structure +---Amount of data +---@field dataamount number +---Amount of science that would be gained by returning this data to KSC +---@field sciencevalue number +---Amount of science that would be gained by transmitting this data to KSC +---@field transmitvalue number +---Experiment title +---@field title string + +---@class Vecdraw : Structure +---Settable. +---Mandatory - The vector to draw, SHIP-RAW Coords. +---@field vec Vector +---Settable. +---Mandatory - The vector to draw, SHIP-RAW Coords. +---@field vector Vector +---Settable. +---:type: `KosDelegate` with no parameters, returning a `Vector` +--- +---This allows you to tell the VecDraw that you'd like it to update the ``VEC`` suffix +---of the vector regularly every update, according to your own scripted code. +--- +---You create a `KosDelegate` that takes no parameters, and returns a vector, +---which the system will automatically assign to the :attr:`VEC` suffix every update. +---Be aware that this system does eat into the instructions available per update, so if +---you make this delegate do too much work, it will slow down your script's performance. +--- +---To make the system stop calling your delegate, set this suffix to the magic +---keyword :global:`DONOTHING`. +--- +---Example:: +--- +--- // This example will spin the arrow around in a circle by leaving the start +--- // where it is but moving the tip by trig functions: +--- set vd to vecdraw(v(0,0,0), v(5,0,0), green, "spinning arrow", 1.0, true, 0.2). +--- print "Moving the arrow in a circle for a few seconds.". +--- set vd:vecupdater to { +--- return ship:up:vector*5*sin(time:seconds*180) + ship:north:vector*5*cos(time:seconds*180). }. +--- wait 5. +--- print "Stopping the arrow movement.". +--- set vd:vecupdater to DONOTHING. +--- wait 3. +--- print "Removing the arrow.". +--- set vd to 0. +--- +--- +---.. versionadded:: 1.1.0 +--- +--- scripted Delegate callbacks such as this did not exist prior to kOS version 1.1.0 +---@field vecupdater UserDelegate +---Settable. +---:type: `KosDelegate` with no parameters, returning a `Vector` +--- +---This allows you to tell the VecDraw that you'd like it to update the ``VEC`` suffix +---of the vector regularly every update, according to your own scripted code. +--- +---You create a `KosDelegate` that takes no parameters, and returns a vector, +---which the system will automatically assign to the :attr:`VEC` suffix every update. +---Be aware that this system does eat into the instructions available per update, so if +---you make this delegate do too much work, it will slow down your script's performance. +--- +---To make the system stop calling your delegate, set this suffix to the magic +---keyword :global:`DONOTHING`. +--- +---Example:: +--- +--- // This example will spin the arrow around in a circle by leaving the start +--- // where it is but moving the tip by trig functions: +--- set vd to vecdraw(v(0,0,0), v(5,0,0), green, "spinning arrow", 1.0, true, 0.2). +--- print "Moving the arrow in a circle for a few seconds.". +--- set vd:vecupdater to { +--- return ship:up:vector*5*sin(time:seconds*180) + ship:north:vector*5*cos(time:seconds*180). }. +--- wait 5. +--- print "Stopping the arrow movement.". +--- set vd:vecupdater to DONOTHING. +--- wait 3. +--- print "Removing the arrow.". +--- set vd to 0. +--- +--- +---.. versionadded:: 1.1.0 +--- +--- scripted Delegate callbacks such as this did not exist prior to kOS version 1.1.0 +---@field vectorupdater UserDelegate +---Settable. +---:type: :ref:`Color ` +--- +---Optional, defaults to white. This is the color to draw the vector. +---If you leave the :attr:`VecDraw:WIPING` suffix at its default value +---of True, then there will be a wipe effect such that the line will +---fade-in as it goes, only becoming this color at the endpoint tip. +--- +---(You can pass in an RGBA with an alpha value less than 1.0 if you +---would like the line to never be fully opaque even at the tip.) +---@field color RGBA +---Settable. +---:type: :ref:`Color ` +--- +---Optional, defaults to white. This is the color to draw the vector. +---If you leave the :attr:`VecDraw:WIPING` suffix at its default value +---of True, then there will be a wipe effect such that the line will +---fade-in as it goes, only becoming this color at the endpoint tip. +--- +---(You can pass in an RGBA with an alpha value less than 1.0 if you +---would like the line to never be fully opaque even at the tip.) +---@field colour RGBA +---Settable. +---:type: `KosDelegate` with no parameters, returning a `Color` +--- +---This allows you to tell the VecDraw that you'd like it to update the ``COLOR``/``COLOUR`` +---suffix of the vector regularly every update, according to your own scripted code. +--- +---You create a `KosDelegate` that takes no parameters, and returns a Color, +---which the system will automatically assign to the :attr:`COLOR` suffix every update. +---Be aware that this system does eat into the instructions available per update, so if +---you make this delegate do too much work, it will slow down your script's performance. +--- +---To make the system stop calling your delegate, set this suffix to the magic +---keyword :global:`DONOTHING`. +--- +---Example:: +--- +--- // This example will change how opaque the arrow is over time by changing +--- // the 'alpha' of its color: +--- set vd to vecdraw(v(0,0,0), ship:north:vector*5, green, "fading arrow", 1.0, true, 0.2). +--- print "Fading the arrow in and out for a few seconds.". +--- set vd:colorupdater to { return RGBA(0,1,0,sin(time:seconds*180)). }. +--- wait 5. +--- print "Stopping the color change.". +--- set vd:colorupdater to DONOTHING. +--- wait 3. +--- print "Removing the arrow.". +--- set vd to 0. +--- +--- +---.. versionadded:: 1.1.0 +--- +--- scripted Delegate callbacks such as this did not exist prior to kOS version 1.1.0 +---@field colorupdater UserDelegate +---Settable. +---:type: `KosDelegate` with no parameters, returning a `Color` +--- +---This allows you to tell the VecDraw that you'd like it to update the ``COLOR``/``COLOUR`` +---suffix of the vector regularly every update, according to your own scripted code. +--- +---You create a `KosDelegate` that takes no parameters, and returns a Color, +---which the system will automatically assign to the :attr:`COLOR` suffix every update. +---Be aware that this system does eat into the instructions available per update, so if +---you make this delegate do too much work, it will slow down your script's performance. +--- +---To make the system stop calling your delegate, set this suffix to the magic +---keyword :global:`DONOTHING`. +--- +---Example:: +--- +--- // This example will change how opaque the arrow is over time by changing +--- // the 'alpha' of its color: +--- set vd to vecdraw(v(0,0,0), ship:north:vector*5, green, "fading arrow", 1.0, true, 0.2). +--- print "Fading the arrow in and out for a few seconds.". +--- set vd:colorupdater to { return RGBA(0,1,0,sin(time:seconds*180)). }. +--- wait 5. +--- print "Stopping the color change.". +--- set vd:colorupdater to DONOTHING. +--- wait 3. +--- print "Removing the arrow.". +--- set vd to 0. +--- +--- +---.. versionadded:: 1.1.0 +--- +--- scripted Delegate callbacks such as this did not exist prior to kOS version 1.1.0 +---@field colourupdater UserDelegate +---Settable. +---Set to true to make the arrow appear, false to hide it. Defaults to false until you're ready to set it to true. +---@field show boolean +---Settable. +---Optional, defaults to V(0,0,0) - position of the tail of the vector to draw in SHIP-RAW coords. V(0,0,0) means the ship Center of Mass. +---@field start Vector +---Settable. +---:type: `KosDelegate` with no parameters, returning a `Vector` +--- +---This allows you to tell the VecDraw that you'd like it to update the START position +---of the vector regularly every update, according to your own scripted code. +--- +---You create a `KosDelegate` that takes no parameters, and returns a vector, +---which the system will automatically assign to the :attr:`START` suffix every update. +---Be aware that this system does eat into the instructions available per update, so if +---you make this delegate do too much work, it will slow down your script's performance. +--- +---To make the system stop calling your delegate, set this suffix to the magic +---keyword :global:`DONOTHING`. +--- +---Example:: +--- +--- // This example will bounce the arrow up and down over time for a few seconds, +--- // moving the location of the vector's start according to a sine wave over time: +--- set vd to vecdraw(v(0,0,0), ship:north:vector*5, green, "bouncing arrow", 1.0, true, 0.2). +--- print "Moving the arrow up and down for a few seconds.". +--- set vd:startupdater to { return ship:up:vector*3*sin(time:seconds*180). }. +--- wait 5. +--- print "Stopping the arrow movement.". +--- set vd:startupdater to DONOTHING. +--- wait 3. +--- print "Removing the arrow.". +--- set vd to 0. +--- +---.. versionadded:: 1.1.0 +--- +--- scripted Delegate callbacks such as this did not exist prior to kOS version 1.1.0 +---@field startupdater UserDelegate +---Settable. +---Optional, defaults to 1.0. Scalar to multiply the VEC by, and the WIDTH, +---but not the START. +---@field scale number +---Settable. +---Optional, defaults to "". Text to show on-screen at the midpoint of the vector. +---Note the font size the label is displayed in gets stretched when you +---change the :attr:`SCALE` or the :attr:`WIDTH` values. +---@field label string +---Settable. +---Define the width of the drawn line, in meters. The deafult is 0.2 if +---left off. Note, this also causes the font of the label to be enlarged +---to match if set to a value larger than 0.2. +---@field width number +---Settable. +---(Defaults to True if left off.) Will this line be drawn with +---a pointy arrowhead "hat" on the tip to show which end is the +---start point and which is the end point? If this is false, +---then Vecdraw draws just a thick line, instead of an arrow. +---@field pointy boolean +---Settable. +---(Defaults to True if left off.) If true, this line will be drawn +---with a "wipe" effect that varies how transparent it is. At the +---start point it will be a more transparent version of the color +---you specified in :attr:`VecDraw:COLOR`. It will only become the +---full opacity you requested when it reaches the endpoint of the line. +---This effect is to help show the direction the arrow is going as it +---"fades in" to full opacity as it goes along. +--- +---If false, then the opacity of the line will not vary. It will draw +---the whole line at the exact color you specified in the in the +---:attr:`VecDraw:COLOR` SUFFIX. (Which can still be transparent if +---you use an RGBA() and provide the alpha value.) +---@field wiping boolean + +---@class ConsumedResource : Structure +---The name of the resource, i.e. "LIQUIDFUEL", "ELECTRICCHARGE", "MONOPROP". +---@field name string +---The density value of this resource, expressed in Megagrams f mass +---per Unit of resource. (i.e. a value of 0.005 would mean that each +---unit of this resource is 5 kilograms. Megagrams [metric tonnes] is +---the usual unit that most mass in the game is represented in.) +---@field density number +---How much volume of this fuel is this engine consuming at this very moment. +---@field fuelflow number +---How much volume of this fuel would this engine consume at standard pressure and velocity if the throttle was max at 1.0, and the thrust limiter was max at 100%. +---@field maxfuelflow number +---How much volume of this fuel does this require at this very moment for the current throttle setting. +---This will usually equal FUELFLOW but may be higher for INTAKEAIR for instance. +---@field requiredflow number +---How much mass of this fuel is this engine consuming at this very moment. +---@field massflow number +---How much mass of this fuel would this engine consume at standard pressure and velocity if the throttle was max at 1.0, and the thrust limiter was max at 100%. +---@field maxmassflow number +---What is the volumetric ratio of this fuel as a proportion of the overall fuel mixture, e.g. if this is 0.5 then this fuel is half the required fuel for the engine. +---@field ratio number +---The value of how much resource is left and accessible to this engine. Only valid while the engine is running. +---@field amount number +---What AMOUNT would be if the resource was filled to the top. Only valid while the engine is running. +---@field capacity number + +---@class OrbitableVelocity : Structure +---@field obt Vector +---@field orbit Vector +---Returns the surface-frame velocity. Note that this is the surface velocity relative to the surface of the SOI body, not the orbiting object itself. (i.e. Mun:VELOCITY:SURFACE returns the Mun's velocity relative to the surface of its SOI body, Kerbin). +--- +---.. note:: +--- **Special case instance, the Sun:** Because the Sun has no parent +--- SoI body that it orbits around (Kerbal Space Program does not +--- simulate the existence of anything outside the one solar system), +--- that means that the Sun's surface velocity is just hardcoded to +--- be the same thing as its orbital velocity. This may or may not be +--- entirely correct, but the "correct" answer to the question, "What is +--- sun:velocity:surface?" would technically be "I refuse to answer. +--- That's an invalid question." Rather than crash or throw an exception, +--- kOS just returns the same as the orbital velocity in this case. +---@field surface Vector + +---@class DeltaV : Structure +---:type: `number` in m/s +--- +---Returns stock KSP's notion of how much deltaV there is. The stock deltaV +---calculation assumes all engine burns take place at the current atmospheric +---pressure the ship is in. This should match the value seen in the staging +---list during flight, (Including the sometimes incorrect values that stock +---KSP gives in its DeltaV calculations, unfortunately.) +--- +---Heed the warning above: Stock delta-V values might not be getting +---calculated if this vessel is not the currently active vessel. +---@field current number +---:type: `number` in m/s +--- +---Returns stock KSP's notion of how much deltaV there *would be* if all the +---burns took place at 1 ATM (sea level atmosphere). This should match +---the value seen in the staging list during construction if you had the +---delta-V readouts in sea level mode., (Including the sometimes +---incorrect values that stock KSP gives in its DeltaV calculations, +---unfortunately.) +--- +---Heed the warning above: Stock delta-V values might not be getting +---calculated if this vessel is not the currently active vessel. +---@field asl number +---:type: `number` in m/s +--- +---Returns stock KSP's notion of how much deltaV there *would be* if all the +---burns took place in a vacuum. This should match +---the value seen in the staging list during construction if you had the +---delta-V readouts in vacuum mode., (Including the sometimes +---incorrect values that stock KSP gives in its DeltaV calculations, +---unfortunately.) +--- +---Heed the warning above: Stock delta-V values might not be getting +---calculated if this vessel is not the currently active vessel. +---@field vacuum number +---:type: `number` in seconds +--- +---Returns stock KSP's notion of how long it will take to cause this deltaV. +---(How much time it takes for the engine(s) to burn up the fuel if they +---are at MAXTHRUST). This should match the value seen in the staging list. +---(Including the sometimes incorrect values that stock KSP gives in its +---DeltaV calculations, unfortunately.) +--- +---Heed the warning above: Stock delta-V values might not be getting +---calculated if this vessel is not the currently active vessel. +---@field duration number +---:type: none (void) +--- +---The stock delta-V calculations are made by constantly running a small +---simulation in its head during flight that takes a few update ticks +---to arrive at the answer. Calling this method will force the stock game +---to mark its current delta-V values "dirty" and make it want to re-run +---the calculation. **DO NOT CALL THIS REPEATEDLY IN A LOOP OR A +---TRIGGER**. Calling this causes the game to lag if you keep doing it +---all the time (it generates "garbage" for the game to "collect".) +--- +---After calling FORCECALC(), the deltaV values you see will be quite +---wrong for a few update ticks, while the game calculates the new values. +---Unfortunately, there isn't a good way for a kerobscript to find out +---when the answer is final and the recalculation is over. (Sorry, we +---tried, but couldn't find the API call in KSP that would tell us this.) +--- +---The only real way to decide the recalculation is over is to examine +---the output of the :ASL or :VACUUM suffixes and see when they seem +---to have settled on a number and stayed there a while. (don't use +---:CURRENT for this, as it will naturally change if you are ascending +---or descending in atmosphere.) Be aware that a *small* fluctuation +---in the value is in fact expected, as the simulation KSP runs in its +---head is subject to floating point errors (i.e. while you see a value +---like "2345 m/s" in the User display, under the hood that value could +---actually be varying between 2345.11112 to 2345.11135 to 2345.11102, +---etc.) +---@field forcecalc fun() + +---@class Career : Structure +---:type: :ref:`Boolean ` +--- +---If your tracking center allows the tracking of unnamed objects (asteroids, mainly) then this will return true. +---@field cantrackobjects boolean +---:type: :ref:`scalar ` +--- +---If your tracking center allows some patched conics predictions, then this number will be greater than zero. +---The number represents how many patches beyond the current one that you are allowed to see. It influences +---attempts to call SHIP:PATCHES and SHIP:OBT:NEXTPATCH. +---@field patchlimit number +---:type: :ref:`Boolean ` +--- +---If your tracking center and mission control buildings are both upgraded enough, then the game allows +---you to make manuever nodes (which the game calls "flight planning"). This will return true if you +---can make maneuver nodes. +---@field canmakenodes boolean +---:type: :ref:`Boolean ` +--- +---If your VAB or SPH are upgraded enough to allow custom action groups, then you will also be allowed +---to execute the :DOACTION method of PartModules. Otherwise you can't. This will return a boolean +---letting you know if the condition has been met. +---@field candoactions boolean + +---@class HSVA : RGBA +---Settable. +---@field h number +---Settable. +---@field hue number +---Settable. +---@field s number +---Settable. +---@field saturation number +---Settable. +---@field v number +---Settable. +---@field value number + +---@class Body : Orbitable +---The name of the body. Example: "Mun". +---@field name string +---Longer description of the body, often just a duplicate of the name. +---@field description string +---The mass of the body in kilograms. +---@field mass number +---True if this body has an ocean. Example: In the stock solar system, +---this is True for Kerbin and False for Mun. +---@field hasocean boolean +---True if this body has a solid surface. Example: In the stock solar system, +---this is True for Kerbin and False for Jool. +---@field hassolidsurface boolean +---A list of the bodies orbiting this body. Example: In the stock solar system, +---Kerbin:orbitingchildren is a list two things: Mun and Minmus. +---@field orbitingchildren List +---The altitude of this body above the sea level surface of its parent body. I.e. the altitude of Mun above Kerbin. +---@field altitude number +---The radius from the body's center to its sea level. +---@field radius number +---The `Gravitational Parameter`_ of the body. +---@field mu number +---The number of seconds it takes the body to rotate around its own axis. +---This is the sidereal rotation period which can differ from the length +---of a day due to the fact that the body moves a bit further around the +---Sun while it's rotating around its own axis. +---@field rotationperiod number +---A variable that describes the atmosphere of this body. +---@field atm Atmosphere +---Angular velocity of the body's rotation about its axis (its +---sidereal day) expressed as a vector. +--- +---The direction the angular velocity points is in Ship-Raw orientation, +---and represents the axis of rotation. Remember that everything in +---Kerbal Space Program uses a *left-handed coordinate system*, which +---affects which way the angular velocity vector will point. If you +---curl the fingers of your **left** hand in the direction of the rotation, +---and stick out your thumb, the thumb's direction is the way the +---angular velocity vector will point. +--- +---The magnitude of the vector is the speed of the rotation, *in radians*. +--- +---Note, unlike many of the other parts of kOS, the rotation speed is +---expressed in radians rather than degrees. This is to make it +---congruent with how VESSEL:ANGULARMOMENTUM is expressed, and for +---backward compatibility with older kOS scripts. +---@field angularvel Vector +---The radius of the body's sphere of influence. Measured from the body's center. +---@field soiradius number +---The rotation angle is the number of degrees between the +---:ref:`Solar Prime Vector ` and the +---current position of the body's prime meridian (body longitude +---of zero). +--- +---The value is in constant motion, and once per body's rotation +---period ("sidereal day"), its ``:rotationangle`` will wrap +---around through a full 360 degrees. +---@field rotationangle number +---:parameter vectorPos: `Vector` input position in XYZ space. +---The geoposition underneath the given vector position. SHIP:BODY:GEOPOSITIONOF(SHIP:POSITION) should, in principle, give the same thing as SHIP:GEOPOSITION, while SHIP:BODY:GEOPOSITIONOF(SHIP:POSITION + 1000*SHIP:NORTH) would give you the lat/lng of the position 1 kilometer north of you. Be careful not to confuse this with :GEOPOSITION (no "OF" in the name), which is also a suffix of Body by virtue of the fact that Body is an Orbitable, but it doesn't mean the same thing. +--- +---(Not to be confused with the :attr:`Orbitable:GEOPOSITION` suffix, which ``Body`` inherits +---from `Orbitable`, and which gives the position that this body is directly above +---on the surface *of its parent body*.) +---@field geopositionof fun(vectorPos: Vector): GeoCoordinates +---The altitude of the given vector position, above this body's 'sea level'. SHIP:BODY:ALTITUDEOF(SHIP:POSITION) should, in principle, give the same thing as SHIP:ALTITUDE. Example: Eve:ALTITUDEOF(GILLY:POSITION) gives the altitude of gilly's current position above Eve, even if you're not actually anywhere near the SOI of Eve at the time. Be careful not to confuse this with :ALTITUDE (no "OF" in the name), which is also a suffix of Body by virtue of the fact that Body is an Orbitable, but it doesn't mean the same thing. +---@field altitudeof fun(param1: Vector): number +---:parameter latitude: `number` input latitude +---:parameter longitude: `number` input longitude +---Given a latitude and longitude, this returns a `GeoCoordinates` structure +---for that position on this body. +--- +---(Not to be confused with the :attr:`Orbitable:GEOPOSITION` suffix, which ``Body`` inherits +---from `Orbitable`, and which gives the position that this body is directly above +---on the surface *of its parent body*.) +---@field geopositionlatlng fun(latitude: number, longitude: number): GeoCoordinates + +---@class GeoCoordinates : Structure +---The latitude of this position on the surface. +---@field lat number +---The longitude of this position on the surface. +---@field lng number +---The :ref:`Celestial Body ` this position is attached to. +---@field body Body +---Distance of the terrain above "sea level" at this geographical position. Negative numbers are below "sea level." +---@field terrainheight number +---Distance from the :ref:`CPU_Vessel ` to this point on the surface. +---@field distance number +---The *absolute* compass direction from the :ref:`CPU_Vessel ` to this point on the surface. +---@field heading number +---The *relative* compass direction from the :ref:`CPU_Vessel ` to this point on the surface. For example, if the vessel is heading at compass heading 45, and the geo-coordinates location is at heading 30, then :attr:`GeoCoordinates:BEARING` will return -15. +---@field bearing number +---The ship-raw 3D position on the surface of the body, relative to the current ship's Center of mass. +---@field position Vector +---The (linear) velocity of this spot on the surface of the planet/moon, due to the rotation of the +---body causing that spot to move though space. +---(For example, on Kerbin at a sea level location, it would be 174.95 m/s eastward, and slightly +---more at higher terrain spots above sea level.) +---Note that this is returned as an `OrbitableVelocity`, meaning it isn't a vector but a +---pair of vectors, one called ``:orbit`` and one called ``:surface``. Note that the +---surface-relative velocity you get from the ``:surface`` suffix isn't always zero like you might +---intuit because ``:surface`` gives you the velocity relative to the surface reference frame +---where ``SHIP`` is, which might not be the same latitude/longitude/altitude as where this +---Geocoordinates is. +---@field velocity OrbitableVelocity +---The ship-raw 3D position above or below the surface of the body, relative to the current ship's Center of mass. You pass in an altitude number for the altitude above "sea" level of the desired location. +---@field altitudeposition fun(altitude: number): Vector +---This is the same as :attr:`GeoCoordinates:VELOCITY`, except that it lets you specify some +---altitude other than the surface terrain height. You specify a (sea-level) altitude, +---and it will calculate based on a point at that altitude which may be above or below +---the actual surface at this latitude and longitude. It will calculate as if you had some +---point fixed to the ground, like an imaginary tower bolted to the surface, but not at the +---ground's altitude. (The body's rotation will impart a larger magnitude linear velocity +---on a locaton affixed to the body the farther that location is from the body's center). +---@field altitudevelocity fun(altitude: number): OrbitableVelocity + +---@class ConsumedResourceRCS : Structure +---The name of the resource, i.e. "LIQUIDFUEL", "ELECTRICCHARGE", "MONOPROP". +---@field name string +---The density value of this resource, expressed in Megagrams f mass +---per Unit of resource. (i.e. a value of 0.005 would mean that each +---unit of this resource is 5 kilograms. Megagrams [metric tonnes] is +---the usual unit that most mass in the game is represented in.) +---@field density number +---What is the volumetric ratio of this fuel as a proportion of the overall fuel mixture, e.g. if this is 0.5 then this fuel is half the required fuel for the thruster. +---@field ratio number +---The value of how much resource is left and accessible to this thruster. Only valid while the thruster is running. +---@field amount number +---What AMOUNT would be if the resource was filled to the top. Only valid while the thruster is running. +---@field capacity number + +---@class AggregateResource : Structure +---The name of the resource, i.e. "LIQUIDFUEL", "ELECTRICCHARGE", "MONOPROP". +---@field name string +---The density value of this resource, expressed in Megagrams f mass +---per Unit of resource. (i.e. a value of 0.005 would mean that each +---unit of this resource is 5 kilograms. Megagrams [metric tonnes] is +---the usual unit that most mass in the game is represented in.) +---@field density number +---The value of how much resource is left. +---@field amount number +---What AMOUNT would be if the resource was filled to the top. +---@field capacity number +---Because this is a summation of the resources from many parts. kOS gives you the list of all parts that do or could contain the resource. +---@field parts List + +---@class TimeBase : Structure +---@field year number +---@field day number +---@field hour number +---@field minute number +---@field second number +---@field seconds number +---@field clock string +---@field calendar string + +---@class Node : Structure +---@field deltav Vector +---@field burnvector Vector +---Settable. +---@field eta number +---Settable. +---@field time number +---Settable. +---@field prograde number +---Settable. +---@field radialout number +---Settable. +---@field normal number +---@field obt Orbit +---@field orbit Orbit + +---@class Transfer : Structure +---@field goal number +---@field transferred number +---@field status string +---@field message string +---@field resource string +---Settable. +---@field active boolean + +---@class Orbit : Structure +---a name for this orbit. +---@field name string +---:type: `number` (m) +--- +---The max altitude expected to be reached. +---@field apoapsis number +---:type: `number` (m) +--- +---The min altitude expected to be reached. +---@field periapsis number +---The celestial body this orbit is orbiting. +---@field body Body +---:type: `number` (seconds) +--- +---`orbital period`_ +---@field period number +---:type: `number` (degree) +--- +---`orbital inclination`_ +---@field inclination number +---`orbital eccentricity`_ +---@field eccentricity number +---:type: `number` (m) +--- +---`semi-major axis`_ +---@field semimajoraxis number +---:type: `number` (m) +--- +---`semi-minor axis`_ +---@field semiminoraxis number +---Same as :attr:`Orbit:LONGITUDEOFASCENDINGNODE`. +---@field lan number +---Same as :attr:`Orbit:LONGITUDEOFASCENDINGNODE`. +---@field longitudeofascendingnode number +---`argument of periapsis`_ +---@field argumentofperiapsis number +---`true anomaly`_ in degrees. Even though orbital parameters are +---traditionally done in radians, in keeping with the kOS standard +---of making everything into degrees, they are given as degrees by +---kOS. +--- +---**Closed versus Open orbits clamp this differently:** The range of +---possible values this can have differs depending on if the orbit +---is "closed" (elliptical, eccentricity < 1.0) versus "open" (parabolic +---or hyperbolic, eccentricity >= 1.0). If the orbit is closed, then +---this value will be in the range [0..360), where values larger than +---180 represent positions in the orbit where it is "coming down" +---from apoapsis to periapsis. But if the orbit is open, then this +---value will be in the range (-180..180), where negative values are +---used to represent the positions in the orbit where it is "coming down" +---to the periapsis. The difference is because it does not make sense +---to speak of the orbit looping all the way around 360 degrees in +---the case of an open orbit where it does not come back down. +--- +---Note that the above switch between 0..360 versus -180..180 happens +---when the orbit is *mathematically* shown to be an escaping orbit, +---NOT when it's still an ellipse but the apoapsis happens to be higher +---than the body's sphere of influence so the game will let it escape +---anyway. Both conditions look similar on the game map so it may +---be hard to tell them apart without actually querying the eccentricity +---to find out which it is. +---@field trueanomaly number +---:type: `number` degrees +--- +---`mean anomaly`_ in degrees. Even though orbital parameters are +---traditionally done in radians, in keeping with the kOS standard +---of making everything into degrees, they are given as degrees by +---kOS. +--- +---Internally, KSP tracks orbit position using :attr:`MEANANOMALYATEPOCH` +---and :attr:`EPOCH`. "Epoch" is an arbitrary timestamp expressed in +---universal time (gameworld seconds from game start, same as ``TIME:SECONDS`` +---uses) at which the mean anomaly of the orbit would be :attr:`MEANANOMALYATEPOCH`. +--- +---Given the mean anomaly at epoch, and the epoch time, and the current time, +---and the orbital period, it's possible to find out the current mean anomaly. +---Kerbal Space Program uses this internally to track orbit positions while under +---time warp without using the full physics system. +--- +---**Closed versus Open orbits clamp this differently:** The range of +---possible values this can have differs depending on if the orbit +---is "closed" (elliptical, eccentricity < 1.0) versus "open" (parabolic +---or hyperbolic, eccentricity >= 1.0). If the orbit is closed, then +---this value will be in the range [0..360), where values larger than +---180 represent positions in the orbit where it is "coming back down" +---from apoapsis to periapsis. But if the orbit is open, then this value +---doesn't have any limits, and furthermore negative values are +---used to represent the portion of the orbit that is "coming down" +---to the periapsis, rather than using values > 180 for this. +--- +---Note that the above switch between MEANANOMALY behaving in the "closed" +---versus "open" way depends on the orbit being *mathematically* shown +---to be an escaping orbit, NOT merely "escaping" because it has an +---apoapsis higher than the body's sphere of influence. If the orbit's +---mathematical parameters show it to be an ellipse, but its apoapsis is +---higher than the body's sphere of influence, then the game will let it +---escape anyway despite it still being an elliptical orbit. (It's just +---an elliptical orbit with the top "cut off".) The MEANANOMALY +---measurement will treat such elliptical-but-escaping-anyway scenarios +---as "closed" even though they don't look like it on the map. +---@field meananomalyatepoch number +---:type: `number` universal timestamp (seconds) +--- +---Internally, KSP tracks orbit position using :attr:`MEANANOMALYATEPOCH` +---and :attr:`EPOCH`. "Epoch" is an arbitrary timestamp expressed in +---universal time (gameworld seconds from game start, same as ``TIME:SECONDS`` +---uses) at which the mean anomaly of the orbit would be :attr:`MEANANOMALYATEPOCH`. +--- +---Beware, if you are an experienced programmer, you may be aware of the +---word "Epoch" being used to mean a fixed point in time that never +---ever changes throughout an entire system. For example, the Unix +---timestamp system refers to Jan 1, 1970 as the "epoch". This is *NOT* +---how the word is used in KSP's orbit system. In Kerbal Space Program, +---the "epoch" is not a true "epoch", in that it often moves and you have to +---re-check what it is. It's not a hardcoded constant. +--- +---(The epoch timestamp seems to change when you go on or off from time warp.) +---@field epoch number +---Describes the way in which this orbit will end and become a different orbit, with a value taken :ref:`from this list `. +---@field transition string +---The current position of whatever the object is that is in this orbit. +---@field position Vector +---The current velocity of whatever the object is that is in this orbit. Be aware +---that this is not just a velocity vector, but a structure containing both the +---orbital and surface velocity vectors as a pair. (See `OrbitableVelocity`). +---@field velocity OrbitableVelocity +---*In career this requires a building upgrade* - In career mode where +---buildings are not upgraded at the start, this suffix won't be allowed +---until your tracking station is upgraded a level. +--- +---When this orbit has a transition to another orbit coming up, this suffix returns the next Orbit patch after this one. For example, when escaping from a Mun orbit into a Kerbin orbit from which you will escape and hit a Solar orbit, then the current orbit's :attr:`:NEXTPATCH ` will show the Kerbin orbit, and ``:NEXTPATCH:NEXTPATCH`` will show the solar orbit. The number of patches into the future that you can peek depends on your conic patches setting in your **Kerbal Space Program** Settings.cfg file. +---@field nextpatch Orbit +---*In career this requires a building upgrade* - In career mode where +---buildings are not upgraded at the start, this suffix won't be allowed +---until your tracking station is upgraded a level. +--- +---If :attr:`:NEXTPATCH ` will return a valid patch, this is true. If :attr:`:NEXTPATCH ` will not return a valid patch because there are no transitions occurring in the future, then :attr:`HASNEXTPATCH ` (see +--- :ref:`note in the Directions documentation ` +--- about information loss when doing this). +--- +---SET: +--- Tells the vector to keep its magnitude as it is but point in a new direction, adjusting its :math:`(x,y,z)` numbers accordingly. +---@field direction Direction + +---@class Timewarp : Structure +---Settable. +---The current multiplier timescale rate (i.e. 1000 if current rate +---is 1000x as much as normal, etc). +--- +---If you have just changed the time warp, it takes a few moments for +---the game to "catch up" and achieve the desired warp rate. You can +---query this value to find out what the current rate is the game is +---operating under during this physics tick. It often takes almost +---a whole second of game time to finally arrive at the destination rate. +--- +---When you ``set`` the ``:RATE`` equal to a new value, then +---instead of directly setting the rate to that value, kOS will +---set the :attr:`WARP` to whatever value it would need to have +---to end up with that rate. The rate itself won't change right +---away. For example, the following two commands are equivalent:: +--- +--- // This will eventually give you a rate of 100, after several +--- // update ticks have passed, but not right away: +--- set kuniverse:timewarp:warp to 4. +--- +--- // This will *also* do the same thing, and not set the rate +--- // to 100 right away, but instead tells kOS indirectly +--- // to set the WARP to 4, so as to target a destination +--- // rate of 100. +--- set kuniverse:timewarp:rate to 100. +--- +---If you set the rate to a value that isn't on the allowed list +---that the KSP game interface normally lets you pick, then kOS +---will pick whichever :attr:`WARP` value will get you closest +---to the requested rate. For example:: +--- +--- // If you do any of these, then the effect is the same: +--- set kuniverse:timewarp:rate to 89. +--- set kuniverse:timewarp:rate to 145. +--- set kuniverse:timewarp:rate to 100. +--- // Because the game only allows permanent rates of 1,5,10,50,100,1000, etc. +--- // A rate of 100 was the closest match it could allow. +--- +---Note, the game is actually capable of warping at arbitrary rates +---in between these values, and it does so temporarily when transitioning +---to a new warp rate, but it doesn't allow you to hold the rate at those +---in-between values indefintiely. +---@field rate number +---If :attr:`MODE` is "PHYSICS", this will return :attr:`PHYSICSRATELIST`. +---If :attr:`MODE` is "RAILS", this will return :attr:`RAILSRATELIST`. +--- +---It's always the list that goes with the current warping mode. +---@field ratelist List +---:type: `List` of `number` values +--- +---The list of the legal values that the game lets you set the warp rate +---to when in "on rails" warping mode ("normal" time warp). +--- +---(As of this writing of the documents, the values come out like the table +---below, but the base KSP game could change these at any time. The +---following table is not a guarantee.) +--- +---.. table:: RAILS WARP RATE LIST +--- +--- ==== ==== +--- WARP RATE +--- ==== ==== +--- 0 1x +--- 1 5x +--- 2 10x +--- 3 50x +--- 4 100x +--- 5 1000x +--- 6 10000x +--- 7 100000x +--- ==== ==== +---@field railsratelist List +---:type: `List` of `number` values +--- +---The list of the legal values that the game lets you set the warp rate +---to when in "physics warp" warping mode. +--- +---(As of this writing of the documents, the values come out like the table +---below, but the base KSP game could change these at any time. The +---following table is not a guarantee.) +--- +---.. table:: PHYSICS WARP RATE LIST +--- +--- ==== ==== +--- WARP RATE +--- ==== ==== +--- 0 1x +--- 1 2x +--- 2 3x +--- 3 4x +--- ==== ==== +---@field physicsratelist List +---Settable. +---The string value indicating whether we are in "PHYSICS" or "RAILS" +---warping mode right now. You can set this value to change which +---warp mode the game will perform. +--- +---(Any experienced player of KSP should be aware of what the difference +---between physics warp and "time warp" (rails) is. In "physics" warp, +---all the normal things work, and the game simulates the entire physics +---engine with longer coarser delta-T time steps to achieve a faster +---simulation rate. In "rails" warp, many of the calculations are not +---working, the vessel is not controllable, and the game calculates +---positions of objects based on the Keplerian elliptical parameters only.) +---@field mode string +---Settable. +---Time warp as an integer index. In the tables listed above for +---:attr:`RAILSRATELIST` and :attr:`PHYSICSRATELIST`, this is the number +---on the lefthand side of those tables. (i.e. if +---:attr:`MODE` is "RAILS" and :attr:`RATE` is 50, then that means +---:attr:`WARP` is 3.) +--- +---If you set either :attr:`WARP` or :attr:`RATE`, the other will change +---along with it to agree with it. (See the full explanation in +---:attr:`RATE` below). +---@field warp number +---:parameter timestamp: `number` +---:return: None +--- +---Call this method to warp time forward to a universal time stamp. +---The argument you pass in should be a universal timestamp in seconds. +---Example: To warp 120 seconds into the future: +---``kuniverse:timewarp:warpto(time:seconds + 120)``. +--- +---Obviously this alters the values of :attr:`WARP` and :attr:`RATE` while +---the warping is happening. +---@field warpto fun(timestamp: number) +---:return: None +--- +---Call this method to cancel any active warp. This will both interupt any +---current automated warp (such as one using :meth:`WARPTO` +---or the "Warp Here" user interface) and a manual warp setting (as if you had +---used the ``SET WARP TO 0.`` command). +---@field cancelwarp fun() +---Physics Delta-T. How much time *should* pass between ticks. Note this is +---not the *actual* time that has passed. For that you should query +---:attr:`time:seconds ` regularly and store the timestamps it +---returns, and compare those timestamps. This value is just the "expected" +---physics delta-T that you *should* get if everything is running smoothly +---and your computer can keep up with everything the game is doing. +--- +---This value changes depending on your physics warp. Note, if you query it +---during on-rails warping, it can return some very strange values you +---shouldn't trust. +---@field physicsdeltat number +---When you have just changed the warp speed, the game takes time to +---"catch up" and achieve the new desired speed. (i.e. if you change your +---rate from 100x up to 1000x, and you look at the screen, you will see +---the numbers in the display saying things like "Warp 123x" then "Warp 344x" +---then "Warp 432x", etc. There are several "ticks" during which the warp +---hasn't yet achieved the desired 1000x level.) This can take a "long" +---time in computer terms to happen. +--- +---You can query this value to find out whether or not the actual warp +---rate has finally settled on the desired amount yet. +--- +---For example:: +--- +--- set kuniverse:timewarp:mode to "RAILS". +--- set kuniverse:timewarp:rate to 1000. +--- print "starting to change warp". +--- until kuniverse:timewarp:issettled { +--- print "rate = " + round(rate,1). +--- wait 0. +--- } +--- print "warp is now 1000x". +--- +--- // The above would output something like this to the screen: +--- starting to change warp. +--- rate = 113.5 +--- rate = 143.2 +--- rate = 213.1 +--- rate = 233.2 +--- rate = 250.0 +--- rate = 264.1 +--- rate = 301.5 +--- rate = 320.5 +--- rate = 361.5 +--- rate = 391.3 +--- rate = 421.5 +--- rate = 430.0 +--- rate = 450.5 +--- rate = 471.5 +--- rate = 490.1 +--- rate = 501.5 +--- rate = 613.5 +--- rate = 643.2 +--- rate = 713.1 +--- rate = 733.2 +--- rate = 750.0 +--- rate = 764.1 +--- rate = 801.5 +--- rate = 820.5 +--- rate = 861.5 +--- rate = 891.3 +--- rate = 921.5 +--- rate = 930.0 +--- rate = 950.5 +--- rate = 971.5 +--- rate = 990.1 +--- rate = 1000 +--- warp is now 1000x. +---@field issettled boolean + +---@class VesselSensors : Structure +---Accelleration the vessel is undergoing. A combination of both the gravitational pull and the engine thrust. +---@field acc Vector +---The current pressure of this ship. +---@field pres number +---The current temperature. +---@field temp number +---Magnitude and direction of gravity acceleration where the vessel currently is. Magnitude is expressed in "G"'s (multiples of 9.802 m/s^2). +---@field grav Vector +---The total amount of sun exposure that exists here - only readable if there are solar panels on the vessel. +---@field light number + +---@class CrewMember : Structure +---crew member's name +---@field name string +---true if this crew member is a tourist +---@field tourist boolean +---"Male" or "Female" +---@field gender string +---crew member's trait (specialization), for example "Pilot" +---@field trait string +---experience level (number of stars) +---@field experience number +---`Part` this crew member is located in +---@field part Part +---@field status string +---@field experiencevalue number +---@field kerbaltype string + +---@class Resource : Structure +---The name of the resource, i.e. "LIQUIDFUEL", "ELECTRICCHARGE", "MONOPROP". +---@field name string +---The value of how much resource is left. +---@field amount number +---The density value of this resource, expressed in Megagrams f mass +---per Unit of resource. (i.e. a value of 0.005 would mean that each +---unit of this resource is 5 kilograms. Megagrams [metric tonnes] is +---the usual unit that most mass in the game is represented in.) +---@field density number +---What AMOUNT would be if the resource was filled to the top. +---@field capacity number +---Many, but not all, resources can be turned on and off, this removes them from the fuel flow. +---@field toggleable boolean +---Settable. +---If the resource is TOGGLEABLE, setting this to false will prevent the resource from being taken out normally. +---@field enabled boolean + +---@class Control : Structure +---@field pilotyaw number +---Settable. +---@field pilotyawtrim number +---@field pilotroll number +---Settable. +---@field pilotrolltrim number +---@field pilotpitch number +---Settable. +---@field pilotpitchtrim number +---@field pilotfore number +---@field pilotstarboard number +---@field pilottop number +---Settable. +---@field pilotwheelthrottle number +---Settable. +---@field pilotwheelthrottletrim number +---@field pilotwheelsteer number +---Settable. +---@field pilotwheelsteertrim number +---@field pilotneutral boolean +---@field pilotrotation Vector +---@field pilottranslation Vector +---Settable. +---@field pilotmainthrottle number +---Settable. +---@field yaw number +---Settable. +---@field yawtrim number +---Settable. +---@field roll number +---Settable. +---@field rolltrim number +---Settable. +---@field pitch number +---Settable. +---@field pitchtrim number +---Settable. +---@field rotation Vector +---Settable. +---@field fore number +---Settable. +---@field starboard number +---Settable. +---@field top number +---Settable. +---@field translation Vector +---Settable. +---@field wheelsteer number +---Settable. +---@field wheelsteertrim number +---Settable. +---@field mainthrottle number +---Settable. +---@field wheelthrottle number +---Settable. +---@field wheelthrottletrim number +---Settable. +---@field bound boolean +---Settable. +---@field neutral boolean +---Settable. +---@field neutralize boolean + +---@class LoadDistances : Structure +---@field escaping LoadDistance +---@field flying LoadDistance +---@field landed LoadDistance +---@field orbit LoadDistance +---@field prelaunch LoadDistance +---@field splashed LoadDistance +---@field suborbital LoadDistance + +---@class LoadDistance : Structure +---Settable. +---@field load number +---Settable. +---@field unload number +---Settable. +---@field pack number +---Settable. +---@field unpack number + +---@class Direction : Structure +---@operator add(Direction):Direction +---@operator sub(Direction):Direction +---@operator mul(Direction):Direction +---@operator unm:Direction +---:type: `number` (deg) +--- +--- +---Rotation around the :math:`x` axis. +---@field pitch number +---:type: `number` (deg) +--- +---Rotation around the :math:`y` axis. +---@field yaw number +---:type: `number` (deg) +--- +--- +---Rotation around the :math:`z` axis. +---@field roll number +---`Vector` of length 1 that is in the same direction as the "look-at" of this Direction. Note that it is the same meaning as "what the Z axis of the universe would be rotated to if this rotation was applied to the basis axes of the universe". When you LOCK STEERING to a direction, that direction's FOREVECTOR is the vector the nose of the ship will orient to. SHIP:FACING:FOREVECTOR is the way the ship's nose is aimed right now. +---@field forevector Vector +---`Vector` of length 1 that is in the same direction as the "look-at" of this Direction. Note that it is the same meaning as "what the Z axis of the universe would be rotated to if this rotation was applied to the basis axes of the universe". When you LOCK STEERING to a direction, that direction's FOREVECTOR is the vector the nose of the ship will orient to. SHIP:FACING:FOREVECTOR is the way the ship's nose is aimed right now. +---@field vector Vector +---`Vector` of length 1 that is in the same direction as the "look-up" of this Direction. Note that it is the same meaning as "what the Y axis of the universe would be rotated to if this rotation was applied to the basis axes of the universe". When you LOCK STEERING to a direction, that direction's TOPVECTOR is the vector the roof of the ship will orient to. SHIP:FACING:TOPVECTOR is the way the ship's roof is aimed right now. +---@field topvector Vector +---`Vector` of length 1 that is in the same direction as the "look-up" of this Direction. Note that it is the same meaning as "what the Y axis of the universe would be rotated to if this rotation was applied to the basis axes of the universe". When you LOCK STEERING to a direction, that direction's TOPVECTOR is the vector the roof of the ship will orient to. SHIP:FACING:TOPVECTOR is the way the ship's roof is aimed right now. +---@field upvector Vector +---`Vector` of length 1 that is in the same direction as the "starboard side" of this Direction. Note that it is the same meaning as "what the X axis of the universe would be rotated to if this rotation was applied to the basis axes of the universe". When you LOCK STEERING to a direction, that direction's STARVECTOR is the vector the right wing of the ship will orient to. SHIP:FACING:STARVECTOR is the way the ship's right wing is aimed right now. +---@field starvector Vector +---`Vector` of length 1 that is in the same direction as the "starboard side" of this Direction. Note that it is the same meaning as "what the X axis of the universe would be rotated to if this rotation was applied to the basis axes of the universe". When you LOCK STEERING to a direction, that direction's STARVECTOR is the vector the right wing of the ship will orient to. SHIP:FACING:STARVECTOR is the way the ship's right wing is aimed right now. +---@field rightvector Vector +---:struct: Gives a `Direction` with the opposite rotation around its axes. +---@field inverse Direction + +---@class TimeSpan : TimeBase +---@operator add(TimeSpan):TimeSpan +---@operator add(number):TimeSpan +---@operator sub(TimeSpan):TimeSpan +---@operator sub(number):TimeSpan +---@operator mul(TimeSpan):TimeSpan +---@operator mul(number):TimeSpan +---@operator div(TimeSpan):TimeSpan +---@operator div(number):TimeSpan +---Settable. +---Whole number of Years in the span. Note that TimeSpan starts +---counting years at 0 not at 1. This is a difference from how it +---works for `TimeStamp` +---@field year number +---Settable. +---*TOTAL* time in the span, expressed in units of years. This is not +---the same as :attr:`TimeSpan:YEAR` because it includes a fractional +---part and is the *entire* span, not just the whole number of years. +---Example: If there are 426 days in a Year, and the Timespan is +---1 year and 213 days long, then this will return ``1.5`` rather than ``1``, +---as the *entire* span is one and a half years. You can think of this +---as being :attr:`TimeSpan:SECONDS` divided by seconds per year. +---@field years number +---Settable. +---:type: `number` (range varies by universe) +--- +---Whole number of days remaining after the lst full year within the span. +---Kerbin has 426 days in a year if using Kerbin's +---6 hour day (one fourth as much if if :attr:`Kuniverse:HOURSPERDAY` +---is 24 meaning the game is configured to show Earthlike days not +---Kerbin days. +--- +---The range of possible values could be different if you have mods +---installed that replace the stock solar system with a different +---solar system and thus alter how long your homeworld's year is. +--- +---Note that for spans the first day of the year is the zero-th +---day, not the 1-th day. This is a difference from how it +---works for `TimeStamp` +---@field day number +---Settable. +---*TOTAL* time in the span, expressed in units of days. This is not +---the same as :attr:`TimeSpan:DAY` because it includes a fractional +---part and is the *entire* span, not just the whole number of days leftover +---in the last partial year. +---Example: If there are 426 days in a Year, and the Timespan is +---1 year and 213 days and 12 hours long, then this will return ``639.5`` +---rather than ``213``, as the *entire* span is 639 and a half days. +---@field days number +---Settable. +---:type: `number` (0-5) or (0-23) +--- +---Whole number of hours remaining after the last full day in the span. +---Note the setting :attr:`Kuniverse:HOURSPERDAY` affects +---whether this will be a number from 0 to 5 (6 hour day) or a number +---from 0 to 23 (24 hour day). +---@field hour number +---Settable. +---*TOTAL* time in the span, expressed in units of hours. This is not +---the same as :attr:`TimeSpan:HOUR` because it includes a fractional +---part and is the *entire* span, not just the whole number of hours +---leftover in the last partial day. +---Example: If the Timespan is 0 years, 2 days, 3 hours, and 20 minutes, +---and days are 6 hours long, then this will return 15.3333333 since +---the *entire* span is 2 days of 6 hours each, plus 3 more hours, plus +---20 minutes which is one third of an hour. +---@field hours number +---Settable. +---:type: `number` (0-59) +--- +---Whole number of minutes remaining after the last full hour in the span. +---@field minute number +---Settable. +---*TOTAL* time in the span, expressed in units of minutes. This is not +---the same as :attr:`TimeSpan:MINUTE` because it includes a fractional +---part and is the *entire* span, not just the whole number of minutes +---leftover in the last partial hour. +---Example: If the Timespan is 0 years, 0 days, 3 hours, 20 minutes, and +---30 seconds, then this will return ``200.5`` as that is the *entire* +---span: 3 60-minute hours is 180, plus 20 more minutes is 200, plus 30 +---seconds which is half a minute gives 200.5. +---@field minutes number +---Settable. +---:type: `number` (0-59) +--- +---Whole number of seconds remaining after the last full minute in the span. +---Please note the difference between this and :attr:`TimeSpan:SECONDS`. +---@field second number +---Settable. +---:type: `number` (float) +--- +---*TOTAL* Seconds in the TimeSpan, including fractonal part. Note +---this is NOT the same as :attr:`TimeSpan:SECOND` (singular), +---because this is the total span of time expressed in seconds, +---and not just the leftover seconds in the last minute of the span. +---@field seconds number +---The full string for the TimeSpan. (Down to the second anyway. Fractions of +---seconds not shown), including year, day, hour, minute, and second. +---The format is: +--- +---``_y_d_h_m_s`` (where the underscores are numbers). +---@field full string + +---@class Stage : Structure +---Every craft has a current stage, and that stage is represented by a number, this is it! +---@field number number +---Kerbal Space Program enforces a small delay between staging commands, this is to allow the last staging command to complete. This bool value will let you know if kOS can activate the next stage. +---@field ready boolean +---This is a collection of the available `AggregateResource` for the current stage. +---@field resources List +---This is a dictionary style collection of the available `Resource` +---for the current stage. The `string` key in the lexicon will match +---the name suffix on the `AggregateResource`. This suffix walks the parts +---list entirely on every call, so it is recommended that you cache the value +---if it will be reference repeatedly. +---@field resourceslex Lexicon +---One of the nearest `Decoupler` parts that is going to be activated by staging +---(not necessarily in next stage, if that stage does not contain any decoupler, separator, +---launch clamp or docking port with staging enabled). `None` if there is no decoupler. +--- +---This is particularly helpful for advanced staging logic, e.g.: +---:: +--- +--- STAGE. +--- IF stage:nextDecoupler:isType("LaunchClamp") +--- STAGE. +--- IF stage:nextDecoupler <> "None" { +--- WHEN availableThrust = 0 or ( +--- stage:resourcesLex["LiquidFuel"]:amount = 0 and +--- stage:resourcesLex["SolidFuel"]:amount = 0) +--- THEN { +--- STAGE. +--- return stage:nextDecoupler <> "None". +--- } +--- } +---@field nextdecoupler any +---One of the nearest `Decoupler` parts that is going to be activated by staging +---(not necessarily in next stage, if that stage does not contain any decoupler, separator, +---launch clamp or docking port with staging enabled). `None` if there is no decoupler. +--- +---This is particularly helpful for advanced staging logic, e.g.: +---:: +--- +--- STAGE. +--- IF stage:nextDecoupler:isType("LaunchClamp") +--- STAGE. +--- IF stage:nextDecoupler <> "None" { +--- WHEN availableThrust = 0 or ( +--- stage:resourcesLex["LiquidFuel"]:amount = 0 and +--- stage:resourcesLex["SolidFuel"]:amount = 0) +--- THEN { +--- STAGE. +--- return stage:nextDecoupler <> "None". +--- } +--- } +---@field nextseparator any +---Returns delta-V information (see `DeltaV`) about the current stage.:: +--- +--- // These two lines would do the same thing: +--- SET DV TO STAGE:DELTAV. +--- SET DV TO SHIP:STAGEDELTAV(SHIP:STAGRENUM). +---@field deltav DeltaV + +---@class Kuniverse : Structure +---Returns true if either revert to launch or revert to editor is available. Note: either option may still be unavailable, use the specific methods below to check the exact option you are looking for. +---@field canrevert boolean +---Returns true if either revert to launch is available. +---@field canreverttolaunch boolean +---Returns true if either revert to the editor is available. This tends +---to be false after reloading from a saved game where the vessel was +---already in existence in the saved file when you loaded the game. +---@field canreverttoeditor boolean +---Initiate the KSP game's revert to launch function. All progress so far will be lost, and the vessel will be returned to the launch pad or runway at the time it was initially launched. +---@field reverttolaunch fun() +---Initiate the KSP game's revert to editor function. The game will revert to the editor, as selected based on the vessel type. +---@field reverttoeditor fun() +---:parameter editor: The editor identifier +---:return: None +--- +---Revert to the provided editor. Valid inputs are `"VAB"` and `"SPH"`. +---@field revertto fun(editor: string) +---Returns true if KSP's quicksave feature is enabled and available. +---@field canquicksave boolean +---Pauses Kerbal Space Program, bringing up the same pause menu that would +---normally appear when you hit the "Escape" key. +--- +---**Warning:** *NO lines of Kerboscript code can run while the game is +---paused!!! If you call this, you will be stopping your script there +---until a human being clicks "resume" on the pause menu.* +--- +---kOS is designed to thematically act like a computer that lives *inside* +---the game universe. That means it stops when the game clock stops, for +---the same reason a bouncing ball stops when the game clock stops. +--- +---Until a human being resumes the game by clicking the Resume button +---in the menu, your script will be stuck. This makes it impossible +---to have the program run code that decides when to un-pause the game. +---Once the Resume button is clicked, then the program will +---continue where it left off, just after the point where it called +---``KUniverse:PAUSE().``. +--- +---Note, if you use Control-C in the terminal to kill the program, +---that *will* work while the game is paused like this. If you make +---the mistake of having your script keep re-pausing the game every +---time the game resumes (i.e. you call ``Kuniverse:PAUSE()`` +---again and again in a loop), then using Control-C in the terminal +---can be a way to break out of this problem. +---@field pause fun() +---Initiate the KSP game's quicksave function. The game will save the current +---state to the default quicksave file. +---@field quicksave fun() +---Initiate the KSP game's quickload function. The game will load the game +---state from the default quickload file. +---@field quickload fun() +---:parameter name: The name of the save file +---:return: None +--- +---Initiate the KSP game's quicksave function. The game will save the current +---state to a quicksave file matching the name parameter. +---@field quicksaveto fun(name: string) +---:parameter name: The name of the save file +---:return: None +--- +---Initiate the KSP game's quickload function. The game will load the game +---state from the quicksave file matching the name parameter. +---@field quickloadfrom fun(name: string) +---:type: `List` of `string` +--- +---Returns a list of names of all quicksave file in this KSP game. +---@field quicksavelist List +---Returns the name of the originating editor based on the vessel type. +---The value is one of: +--- +---- "SPH" for things built in the space plane hangar, +---- "VAB" for things built in the vehicle assembly building. +---- "" (empty `string`) for cases where the vehicle cannot remember its editor (when KUniverse:CANREVERTTOEDITOR is false.) +---@field origineditor string +---Get or set the default loading distances for vessels loaded in the future. +---Note: this setting will not affect any vessel currently in the universe for +---the current flight session. It will take effect the next time you enter a +---flight scene from the editor or tracking station, even on vessels that have +---already existed beforehand. The act of loading a new scene causes all the +---vessels in that scene to inherit these new default values, forgetting the +---values they may have had before. +--- +---(To affect the value on a vessel already existing in the current scene +---you have to use the :LOADDISTANCE suffix of the Vessel structure.) +---@field defaultloaddistance LoadDistances +---Settable. +---Returns the active vessel object and allows you to set the active vessel. Note: KSP will not allow you to change vessels by default when the current active vessel is in the atmosphere or under acceleration. Use :meth:`FORCEACTIVE` under those circumstances. +---@field activevessel Vessel +---:parameter vessel: `Vessel` to switch to. +---:return: None +--- +---Force KSP to change the active vessel to the one specified. Note: Switching the active vessel under conditions that KSP normally disallows may cause unexpected results on the initial vessel. It is possible that the vessel will be treated as if it is re-entering the atmosphere and deleted. +---@field forcesetactivevessel fun(vessel: Vessel) +---:parameter vessel: `Vessel` to switch to. +---:return: None +--- +---Force KSP to change the active vessel to the one specified. Note: Switching the active vessel under conditions that KSP normally disallows may cause unexpected results on the initial vessel. It is possible that the vessel will be treated as if it is re-entering the atmosphere and deleted. +---@field forceactive fun(vessel: Vessel) +---:type: `number` (integer) +--- +---Has the value of either 6 or 24, depending on what setting you used +---on Kerbal Space Program's main settings screen for whether you wanted +---to think in terms of Kerbal days (6 hours) or Kerbin days (24 hours). +---This only affects what the clock format looks like and doesn't +---change the actual time in game, which is stored purely as a number of +---seconds since epoch anyway and is unaffected by how the time is presented +---to the human being watching the game. (i.e. if you allow +---25 hours to pass in the game, the game merely tracks that 39000 seconds +---have passed (25 x 60 x 60). It doesn't care how that translates into +---minutes, hours, days, and years until showing it on screen to the player.) +--- +---This setting also affects how values from `TimeSpan` and +---`TimeStamp` calculate the ``:hours``, ``:days``, and ``:years`` +---suffixes. +--- +---Note that this setting is not settable. This decision was made because +---the main stock KSP game only ever changes the setting on the main +---settings menu, which isn't accessible during play. It's entirely +---possible for kOS to support changing the value mid-game, but we've +---decided to deliberately avoid doing so because there may be other mods +---with code that only reads the setting once up front and then assumes +---it never changes after that. Because in the stock game, that +---assumption would be true. +---@field hoursperday number +---:parameter message: `string` message to append to the log. +---:return: None +--- +---All Unity games (Kerbal Space Program included) have a standard +---"log" file where they can store a lot of verbose messages that +---help developers trying to debug their games. Sometimes it may +---be useful to make your script log a message to *THAT* debug file, +---instead of using kOS's normal ``Log`` function to append a +---message to some file of your own making. +--- +---This is useful for cases where you are trying to work with a kOS +---developer to trace the cause of a problem and you want your script +---to mark the moments when it hit different parts of the program, and +---have those messages get embedded in the log interleaved with the +---game's own diagnostic messages. +--- +---Here is an example. Say you suspected the game was throwing an error +---every time you tried to lock steering to up. So you experiment with +---this bit of code:: +--- +--- kuniverse:debuglog("=== Now starting test ==="). +--- kuniverse:debuglog("--- Locking steering to up----"). +--- lock steering to up. +--- kuniverse:debuglog("--- Now forcing a physics tick ----"). +--- wait 0.001. +--- kuniverse:debuglog("--- Now unlocking steering again ----"). +--- unlock steering. +--- wait 0.001. +--- kuniverse:debuglog("=== Now done with test ==="). +--- +---This would cause the messages you wrote to appear in the debug log, +---interleaved with any error messages kOS, and any other parts of the +---entire Kerbal Space Program game, dump into the same log. +--- +---The location of this log varies depending on your platform. For +---some reason, Unity chooses a different filename convention for +---each OS. Consult the list below to see where it is on your platform. +--- +---- Windows 32-bit: [install_dir]\KSP_Data\output_log.txt +---- Windows 64-bit: [install_dir]\KSP_x64_Data\output_log.txt (not officially supported) +---- Mac OS X: ~/Library/Logs/Unity/Player.log +---- Linux: ~/.config/unity3d/Squad/"Kerbal Space Program"/Player.log +--- +---For an example of what it looks like in the log, this:: +--- +--- kuniverse:debuglog("this is my message"). +--- +---ends up resulting in this in the KSP output log:: +--- +--- kOS: (KUNIVERSE:DEBUGLOG) this is my message +---@field debuglog fun(message: string) +---:parameter name: `string` craft name. +---:parameter facility: `string` editor name. +---:return: `CraftTemplate` +--- +---Returns the `CraftTemplate` matching the given craft name saved from +---the given editor. Valid values for editor include ``"VAB"`` and ``"SPH"``. +---@field getcraft fun(name: string, editor: string): CraftTemplate +---:parameter template: `CraftTemplate` craft template object. +--- +---Launch a new instance of the given `CraftTemplate` from the +---template's default launch site. +--- +---**NOTE:** The craft will be launched with the KSP default crew assignment, +---as if you had clicked launch from the editor without manually adjusting the +---crew. +--- +---**NOTE:** Due to how KSP handles launching a new craft, this will end the +---current program even if the currently active vessel is located within +---physics range of the launch site. +---@field launchcraft fun(template: CraftTemplate) +---:parameter template: `CraftTemplate` craft template object. +---:parameter site: `string` launch site name. +--- +---Launch a new instance of the given `CraftTemplate` from the given +---launch site. Valid values for site include ``"RUNWAY"`` and ``"LAUNCHPAD"``. +--- +---**NOTE:** The craft will be launched with the KSP default crew assignment, +---as if you had clicked launch from the editor without manually adjusting the +---crew. To pick which crew are on the craft use +---:meth:`Kuniverse:LAUNCHCRAFTWITHCREWFROM()` instead. +--- +---**NOTE:** Due to how KSP handles launching a new craft, this will end the +---current program even if the currently active vessel is located within +---physics range of the launch site. +---@field launchcraftfrom fun(template: CraftTemplate, site: string) +---:parameter template: `CraftTemplate` craft template object. +---:parameter crewlist: `List` of `string` kerbal names. +---:parameter site: `string` launch site name. +--- +---Launch a new instance of the given `CraftTemplate` with the given crew +---manifest from the given launch site. +---Valid values for site include ``"RUNWAY"`` and ``"LAUNCHPAD"``. +--- +---If any of the kerbal names you use in the ``crewlist`` parameter don't +---exist in the game, there will be no error. Instead that name just +---gets ignored in the list. +--- +---**NOTE:** Due to how KSP handles launching a new craft, this will end the +---current program even if the currently active vessel is located within +---physics range of the launch site. +---@field launchcraftwithcrewfrom fun(template: CraftTemplate, crewlist: List, site: string) +---:return: `List` of `CraftTemplate` +--- +---Returns a list of all `CraftTemplate` templates stored in the VAB +---and SPH folders of the stock Ships folder and the save specific Ships folder. +---@field craftlist List +---@field switchvesselwatchers UniqueSet +---Returns the `TimeWarp` structure that you can use to manipulate +---Kerbal Space Program's time warping features. See the documentation +---on `TimeWarp` for more details. +--- +---example: ``set kuniverse:timewarp:rate to 50.`` +---@field timewarp Timewarp +---An alias for :struct:`KUniverse:REALTIME`. +---@field realworldtime number +---An alias for :struct:`KUniverse:REALTIME`. +---@field realtime number + +---@class Config : Structure +---Settable. +---:type: `number` integer. range = [50,2000] +--- +---Configures the ``InstructionsPerUpdate`` setting. +--- +---This is the number of kRISC psuedo-machine-language instructions that each kOS CPU will attempt to execute from the main program per :ref:`physics update tick `. +--- +---This value is constrained to stay within the range [50..2000]. If you set it to a value outside that range, it will reset itself to remain in that range. +---@field ipu number +---Settable. +---@field luaipu number +---Settable. +---Configures the ``useCompressedPersistence`` setting. +--- +---If true, then the contents of the kOS local volume 'files' stored inside the campaign save's persistence file will be stored using a compression algorithm that has the advantage of making them take less space, but at the cost of making the data impossible to decipher with the naked human eye when looking at the persistence file. +---@field ucp boolean +---Settable. +---Configures the ``showStatistics`` setting. +--- +---If true, then executing a program will log numbers to the screen showing execution speed statistics. +--- +---When this is set to true, it also makes the use of the +---:ref:`ProfileResult() ` function available, for +---deep analysis of your program run, if you are so inclined. +---@field stat boolean +---Settable. +---Configures the ``startOnArchive`` setting. +--- +---If true, then when a vessel is first loaded onto the launchpad or runway, the initial default volume will be set to volume 0, the archive, instead of volume 1, the local drive. +---@field arch boolean +---Settable. +---Configures the ``obeyHideUI`` setting. +--- +---If true, then the kOS terminals will all hide when you toggle the user +---interface widgets with Kerbal Space Program's Hide UI key (it is +---set to F2 by default key bindings). +---@field obeyhideui boolean +---Settable. +---Configures the ``enableSafeMode`` setting. +---If true, then it enables the following error messages:: +--- +--- Tried to push NaN into the stack. +--- Tried to push Infinity into the stack. +--- +---They will be triggered any time any mathematical operation would result in something that is not a real number, such as dividing by zero, or trying to take the square root of a negative number, or the arccos of a number larger than 1. Performing such an operation will immediately terminate the program with one of the error messages shown above. +--- +---If false, then these operations are permitted, but the result may lead to code that does not function correctly if you are not careful about how you use it. Using a value that is not a real number may result in freezing Kerbal Space Program itself if that value is used in a variable that is passed into Kerbal Space Program's API routines. KSP's own API interface does not seem to have any protective checks in place and will faithfully try to use whatever values its given. +---@field safe boolean +---Settable. +---Configures the ``audibleExceptions`` setting. +--- +---If true, then it enables a mode in which errors coming from kOS will +---generte a sound effect of a short little warning bleep to remind you that +---an exception occurred. This can be useful when you are flying +---hands-off and need to realize your autopilot script just died so +---@field audioerr boolean +---Settable. +---Configures the ``verboseExceptions`` setting. +--- +---If true, then it enables a mode in which errors coming from kOS are very long and verbose, trying to explain every detail of the problem. +---@field verbose boolean +---Settable. +---Setting this config option to TRUE will allow scripts to clobber +---built-in idenifier names, re-enabling older behavior for backward +---compatibility and disabling the compiler enforcement that was +---introduced in kOS v 1.4.0.0 to stop this practice. +--- +---In kOS v1.4.0.0, the compiler started enforcing the rule that kerboscript +---programs must never create a user variable, lock, or function with a +---name that clashes with one of kOS's own built-in variable, lock, or +---function names. This rule was introduced to prevent common bugs where +---a program masked over some vital kOS variable, rendering it inaccessible, +---like for example ``SHIP``, or ``VELOCITY``. +--- +---Older scripts written before kOS 1.4.0.0 might need this config option +---enabled to make the compiler accept them and not throw errors. +--- +---Before enabling this to make the error messages go away, first consider +---going through the offeding script and editing it to rename the variable, +---lock, or function that is causing the message. That would be the better +---solution. This config option is only being presented as a dirty way +---to make old scripts that are no longer being edited keep working on +---newer versions of kOS. In the long run, it's better to edit the scripts. +--- +---**Note: This can be over-ridden by @CLOBBERBUILTINS directive:** +--- +---Note that this config option can be over-ridden on a per-file basis by +---using the compiler directive called :ref:`@CLOBBERBUILTINS `. +---The Config value here is merely the default you get for files that lack a +---:ref:`@CLOBBERBUILTINS ` compiler directive. +---@field clobberbuiltins boolean +---Settable. +---Configures the ``debugEachOpcode`` setting. +--- +---NOTE: This makes the game VERY slow, use with caution. +--- +---If true, each opcode that is executed by the CPU will be accompanied by +---an entry in the KSP log. This is a debugging tool for those who are very +---familiar with the inner workings of kOS and should rarely be used outside +---the kOS dev team. +--- +---This change takes effect immediately. +---@field debugeachopcode boolean +---Settable. +---@field blizzy boolean +---Settable. +---:type: `number`. range = [0,1] +--- +---Configures the ``Brightness`` setting. +--- +---This is the default starting brightness setting a new +---kOS in-game terminal will have when it is invoked. This +---is just the default for new terminals. Individual terminals +---can have different settings, either by setting the value +---:attr:`Terminal:BRIGHTNESS` in a script, or by manually moving the +---brightness slider widget on that terminal. +--- +---The value here must be between 0 (invisible) and 1 (Max brightness). +---@field brightness number +---Settable. +---:type: `number` integer-only. range = [6,20] +--- +---Configures the ``TerminalFontDefaultSize`` setting. +--- +---This is the default starting font height (in pixels. not "points") +---for all newly created kOS in-game terminals. This +---is just the default for new terminals. Individual terminals +---can have different settings, either by setting the value +---:attr:`Terminal:CHARHEIGHT` in a script, or by manually clicking +---the font adjustment buttons on that terminal. +--- +---The value here must be at least 6 (nearly impossible to read) +---and no greater than 30 (very big). It will be rounded to the +---nearest integer when setting the value. +---@field defaultfontsize number +---Settable. +---:type: `number` integer-only. range = [15,255] +--- +---Configures the ``TerminalDefaultWidth`` setting. +--- +---This is the default starting width (in number of character cells, +---not number of pixels) for all newly created kOS in-game terminals. +---This is just the default for new terminals. Individual terminals +---can have different settings, either by setting the value +---:attr:`Terminal:WIDTH` in a script, or by manually dragging the +---resize corner of the terminal with the mouse. +---@field defaultwidth number +---Settable. +---:type: `number` integer-only. range = [3,160] +--- +---Configures the ``TerminalDefaultHeight`` setting. +--- +---This is the default starting height (in number of character cells, +---not number of pixels) for all newly created kOS in-game terminals. +---This is just the default for new terminals. Individual terminals +---can have different settings, either by setting the value +---:attr:`Terminal:HEIGHT` in a script, or by manually dragging the +---resize corner of the terminal with the mouse. +---@field defaultheight number +---Settable. +---*This is settable by use of the "Toggle Autopilot" Action Group too.* +--- +---When this is set to True, it suppresses all of kOS's attempts to +---override the steering, throttle, or translation controls, leaving +---them entirely under manual control. It is intended to be a way +---to let you take manual control in an emergency quickly (through +---the toolbar window where this setting appears) without having to +---quit the running program or figure out which terminal window has +---the program causing the control lock. +--- +---You can also bind this setting to an action group for a kOS core part +---in the VAB or SPH. The action is called "Toggle Suppress". +---(Or "Suppress On" and "Suppress Off" for one-way action groups +---that don't toggle.) +--- +---While it does suppress steering, throttle, and translation, it cannot +---suppress action groups or staging. +---@field suppressautopilot boolean + +---@class CraftTemplate : Structure +---Returns the name of the craft. It may differ from the file name. +---@field name string +---Returns the description field of the craft, which may be edited from the +---drop down window below the craft name in the editor. +---@field description string +---Name of the editor from which the craft file was saved. Valid values are +---``"VAB"`` and ``"SPH"``. +---@field editor string +---Returns the name of the default launch site of the craft. Valid values are +---``"LAUNCHPAD"`` and ``"RUNWAY"``. +---@field launchsite string +---Returns the total default mass of the craft. This includes the dry mass and the +---mass of any resources loaded onto the craft by default. +---@field mass number +---Returns the total default cost of the craft. This includes the cost of the +---vessel itself as well as any resources loaded onto the craft by default. +---@field cost number +---Returns the total number of parts on the craft. +---@field partcount number + +---@class Sensor : Part +---Settable. +---True of the sensor is enabled. Can SET to cause the sensor to activate or de-activate. +---@field active boolean +---:access: Get only +---@field type string +---The value of the sensor's readout, usualy including the units. +---@field display string +---The rate at which this sensor drains ElectricCharge. +---@field powerconsumption number +---Call this method to cause the sensor to switch between active and deactivated or visa versa. +---@field toggle fun() + +---@class Decoupler : Part + +---@class RCS : Part +---Settable. +---Is this rcs thruster enabled. +---@field enabled boolean +---Settable. +---Is yaw control enabled for this rcs thruster. +---@field yawenabled boolean +---Settable. +---Is pitch control enabled for this rcs thruster. +---@field pitchenabled boolean +---Settable. +---Is roll control enabled for this rcs thruster. +---@field rollenabled boolean +---Settable. +---Is port/starboard control enabled for this rcs thruster. +---@field starboardenabled boolean +---Settable. +---Is dorsal/ventral control enabled for this rcs thruster. +---@field topenabled boolean +---Settable. +---Is fore/aft control enabled for this rcs thruster. +---@field foreenabled boolean +---Settable. +---Does this thruster apply fore thrust when the ship throttled up. +---@field forebythrottle boolean +---Settable. +---Does this thruster always apply full thrust. +---@field fullthrust boolean +---Settable. +---:type: `number` (%) +--- +---If this is a thruster with a thrust limiter (tweakable) enabled, what +---percentage is it limited to? Note that this is expressed as a +---percentage, not a simple 0..1 coefficient. e.g. To set thrustlimit +---to half, you use a value of 50.0, not 0.5. +--- +---This value is not allowed to go outside the range [0..100]. If you +---attempt to do so, it will be clamped down into the allowed range. +--- +---Note that although a kerboscript is allowed to set the value to a +---very precise number (for example 10.5123), the stock in-game display +---widget that pops up when you right-click the rcs will automatically +---round it to the nearest 0.5 whenever you open the panel. So if you +---do something like ``set ship:part[20]:thrustlimit to 10.5123.`` in +---your script, then look at the rightclick menu for the rcs, the very +---act of just looking at the menu will cause it to become 10.5 instead +---of 10.5123. There isn't much that kOS can do to change this. It's a +---user interface decision baked into the stock game. +---@field thrustlimit number +---Settable. +---Default: 0.05. +--- +---**Please note the warning below before you try to SET this.** +--- +---The stock game imposes a large dead zone on RCS thrusters. By +---default they will not respond to any inputs less than this value. +---For example, at the default value of 0.05, the RCS thruster +---will ignore this statement:: +--- +--- set ship:control:yaw to 0.049. +--- +---but it will respond to this statement:: +--- +--- set ship:control:yaw to 0.051. +--- +---The reason this limit exists is apparently (this is speculation, +---warning) that it's how the stock game prevents SAS from spending +---a lot of monopropellant when it wiggles the controls small amounts. +---When control inputs are smaller than this value, then the RCS +---thrusters ignore them and only the reaction wheels and engine +---gimbals respond. Despite the fact that this is really only a +---problem with SAS, the game appears to have solved the problem by +---imposing this null zone physically on the RCS parts themselves so +---the limit affects everything that uses them, including kOS +---autopiloting and user manual control. +--- +---The best way to deal with this, if you have a script that wants +---the RCS thrusters to operate at a value less than this, is +---to pulse the input intermittently on and off at 0.05 to achieve +---amounts smaller than 0.05, rather than trying to solve it by +---setting this value. (Remember that in the real world, thrusters +---have a minimum thrust they can't go below so it's not entirely +---unrealistic for this deadband to exist in the game.) +---@field deadband number +---:type: `number` (kN) +--- +---Taking into account the thrust limiter tweakable setting, how much thrust would this rcs thruster give at its current thrust limit setting and atmospheric pressure conditions, if one of the control axes that activated it (yaw, pitch, roll, fore, aft, or top) was maxxed . +---@field availablethrust number +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---:type: `number` (kN) +--- +---Taking into account the thrust limiter tweakable setting, how much thrust at the given atmospheric pressure would this rcs thruster give at its current thrust limit setting if one of the control axes that activated it (yaw, pitch, roll, fore, aft, or top) was maxxed. The pressure is measured in ATMs, meaning 0.0 is a vacuum, 1.0 is sea level at Kerbin. +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field availablethrustat fun(pressure: number): number +---:type: `number` (kN) +--- +---How much thrust would this rcs thruster give at its current atmospheric pressure if one of the control axes that activates it (yaw, pitch, roll, fore, aft, or top) was maxxed, and the thrust limiter was max at 100%. Note this might not be the thruster's actual max thrust it could have under other air pressure conditions. Some thrusters have a very different value for MAXTHRUST in vacuum as opposed to at sea level pressure. +---@field maxthrust number +---:type: `number` (units/s) +--- +---How much fuel volume would this rcs thruster consume at standard pressure and velocity if one of the control axes that activated it (yaw, pitch, roll, fore, aft, or top) was maxxed, and the thrust limiter was max at 100%. Note this might not be the engine's actual max fuel flow it could have under other air pressure conditions. +---@field maxfuelflow number +---:type: `number` (Mg/s) +--- +---How much fuel mass would this rcs thruster consume at standard pressure and velocity if one of the control axes that activated it (yaw, pitch, roll, fore, aft, or top) was maxxed, and the thrust limiter was max at 100%. Note this might not be the engine's actual max fuel flow it could have under other air pressure conditions. +---@field maxmassflow number +---`Specific impulse `_ +---@field isp number +---Synonym for :VACUUMISP +---@field visp number +---Synonym for :VACUUMISP +---@field vacuumisp number +---Synonym for :SEALEVELISP +---@field slisp number +---Synonym for :SEALEVELISP +---@field sealevelisp number +---Is this rcs thruster failed because it is starved of a resource (monopropellant)? +---@field flameout boolean +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---`Specific impulse `_ at the given atmospheric pressure. Use a pressure of 0 for vacuum, and 1 for sea level (on Kerbin). +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field ispat fun(pressure: number): number +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---:type: `number` (kN) +--- +---How much thrust would this rcs thruster give if one of the control axes that activated it (yaw, pitch, roll, fore, aft, or top) was maxxed and thrust limiter was max at the given atmospheric pressure. Use a pressure of 0.0 for vacuum, and 1.0 for sea level (on Kerbin) (or more than 1 for thicker atmospheres like on Eve). +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field maxthrustat fun(pressure: number): number +---:type: `List` of :struct:`Vectors ` +--- +---This gives a list of all the vectors that this RCS module can thrust along. Vectors returned are of unit length. The vectors are returned in Ship-Raw coordinates, rather than relative to the ship. (i.e. if it thrusts along the ship's fore axis, and the ship's current ``ship:facing:forevector`` is ``V(0.7071, 0.7071, 0)``, then the value this returns would be ``V(0.7071, 0.7071, 0)``, not ``V(0,0,1)``). +---@field thrustvectors List +---:type: `Lexicon` of `CONSUMEDRESOURCERCS` +--- +---This gives a lexicon of all the resources this rcs thruster consumes, keyed by resource name. +---@field consumedresources Lexicon + +---@class Separator : Decoupler +---Force of the push that happens when this decoupler is fired. +---@field ejectionforce number +---True if this part has already had its decoupling event triggered. +---@field isdecoupled boolean +---True if this part's decoupling event is in the vessel's staging list. +---@field staged boolean + +---@class DockingPort : Decoupler +---@field aquirerange number +---@field aquireforce number +---@field aquiretorque number +---gets the range at which the port will "notice" another port and pull on it. +---@field acquirerange number +---gets the force with which the port pulls on another port. +---@field acquireforce number +---gets the rotational force with which the port pulls on another port. +---@field acquiretorque number +---@field reengagedistance number +---name of vessel on the other side of the docking port. +---@field dockedshipname string +---One of the following string values: +--- +---``Ready`` +--- Docking port is not yet attached and will attach if it touches another. +---``Docked (docker)`` +--- One port in the joined pair is called the docker, and has this state +---``Docked (dockee)`` +--- One port in the joined pair is called the dockee, and has this state +---``Docked (same vessel)`` +--- Sometimes KSP says this instead. It's unclear what it means. +---``Disabled`` +--- Docking port will refuse to dock if it bumps another docking port. +---``PreAttached`` +--- Temporary state during the "wobbling" while two ports are magnetically touching but not yet docked solidly. During this state the two vessels are still tracked as separate vessels and haven't become one yet. +---@field state string +---True if this part can be picked with ``SET TARGET TO``. +---@field targetable boolean +---Call this to cause the docking port to detach. +---@field undock fun() +---@field target fun() +---Gets the facing of this docking port which may differ from the facing of the part itself if the docking port is aimed out the side of the part, as in the case of the inline shielded docking port. +---@field portfacing Direction +---The coordinates of the point on the docking port part where the +---port attachment spot is located. This is different from the +---part's position itself because that's the position of the center +---of the whole part. This is the position of the face of the +---docking port. Coordinates are in SHIP-RAW xyz coords. +---@field nodeposition Vector +---Each docking port has a node type string that specifies its +---compatibility with other docking ports. In order for two docking +---ports to be able to attach to each other, the values for their +---NODETYPEs must be the same. +--- +---The base KSP stock docking port parts all use one of the following +---three values: +--- +--- - "size0" for all Junior-sized docking ports. +--- - "size1" for all Normal-sized docking ports. +--- - "size2" for all Senior-sized docking ports. +--- +---Mods that provide their own new kinds of docking port might use +---any other value they feel like here, but only if they are trying +---to declare that the new part isn't supposed to be able to connect +---to stock docking ports. Any docking port that is meant to connect +---to stock ports will have to adhere to the above scheme. +---@field nodetype string +---@field dockwatchers UniqueSet +---@field undockwatchers UniqueSet +---:type: `DockingPort`, or the `string` "None" if no such port. +--- +---The docking port this docking port is attached to. +---If this docking port is not actually attached to another port, attempting +---to call this will return a String instead of a DockingPort, and that String +---will have the value "None". (Alternatively, you can test if this +---docking port has a partner port attached by calling +---:meth:`DockingPort:HASPARTER`.) +---@field partner any +---Whether or not this docking port is attached to another docking port. +---@field haspartner boolean + +---@class Engine : Part +---Call to make the engine turn on. +---@field activate fun() +---Call to make the engine turn off. +---@field shutdown fun() +---Settable. +---:type: `number` (%) +--- +---If this an engine with a thrust limiter (tweakable) enabled, what +---percentage is it limited to? Note that this is expressed as a +---percentage, not a simple 0..1 coefficient. e.g. To set thrustlimit +---to half, you use a value of 50.0, not 0.5. +--- +---This value is not allowed to go outside the range [0..100]. If you +---attempt to do so, it will be clamped down into the allowed range. +--- +---Note that although a kerboscript is allowed to set the value to a +---very precise number (for example 10.5123), the stock in-game display +---widget that pops up when you right-click the engine will automatically +---round it to the nearest 0.5 whenever you open the panel. So if you +---do something like ``set ship:part[20]:thrustlimit to 10.5123.`` in +---your script, then look at the rightclick menu for the engine, the very +---act of just looking at the menu will cause it to become 10.5 instead +---of 10.5123. There isn't much that kOS can do to change this. It's a +---user interface decision baked into the stock game. +---@field thrustlimit number +---:type: `number` (kN) +--- +---How much thrust would this engine give at its current atmospheric pressure and velocity if the throttle was max at 1.0, and the thrust limiter was max at 100%. Note this might not be the engine's actual max thrust it could have under other air pressure conditions. Some engines have a very different value for MAXTHRUST in vacuum as opposed to at sea level pressure. Also, some jet engines have a very different value for MAXTHRUST depending on how fast they are currently being rammed through the air. Also note that this will read zero if the engine is currently disabled. +---@field maxthrust number +---:type: `number` (kN) +--- +---How much thrust is this engine giving at this very moment. +---@field thrust number +---:type: `number` (units/s) +--- +---How much fuel volume is this engine consuming at this very moment. +---@field fuelflow number +---:type: `number` (units/s) +--- +---How much fuel volume would this engine consume at standard pressure and velocity if the throttle was max at 1.0, and the thrust limiter was max at 100%. Note this might not be the engine's actual max fuel flow it could have under other air pressure conditions. Some jet engines have a very different fuel consumption depending on how fast they are currently being rammed through the air. +---@field maxfuelflow number +---:type: `number` (Mg/s) +--- +---How much fuel mass is this engine consuming at this very moment. +---@field massflow number +---:type: `number` (Mg/s) +--- +---How much fuel mass would this engine consume at standard pressure and velocity if the throttle was max at 1.0, and the thrust limiter was max at 100%. Note this might not be the engine's actual max fuel flow it could have under other air pressure conditions. Some jet engines have a very different fuel consumption depending on how fast they are currently being rammed through the air. +---@field maxmassflow number +---`Specific impulse `_ +---@field isp number +---Synonym for :VACUUMISP +---@field visp number +---Synonym for :VACUUMISP +---@field vacuumisp number +---Synonym for :SEALEVELISP +---@field slisp number +---Synonym for :SEALEVELISP +---@field sealevelisp number +---Is this engine failed because it is starved of a resource (liquidfuel, oxidizer, oxygen)? +---@field flameout boolean +---Has this engine been ignited? If both :attr:`Engine:IGNITION` and :attr:`Engine:FLAMEOUT` are true, that means the engine could start up again immediately if more resources were made available to it. +---@field ignition boolean +---Is this an engine that can be started again? Usually True, but false for solid boosters. +---@field allowrestart boolean +---Is this an engine that can be shut off once started? Usually True, but false for solid boosters. +---@field allowshutdown boolean +---Is this an engine that is stuck at a fixed throttle? (i.e. solid boosters) +---@field throttlelock boolean +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---`Specific impulse `_ at the given atmospheric pressure. Use a pressure of 0 for vacuum, and 1 for sea level (on Kerbin). +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field ispat fun(pressure: number): number +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---:type: `number` (kN) +--- +---How much thrust would this engine give if both the throttle and thrust limtier was max at the current velocity, and at the given atmospheric pressure. Use a pressure of 0.0 for vacuum, and 1.0 for sea level (on Kerbin) (or more than 1 for thicker atmospheres like on Eve). Note that this will read zero if the engine is currently disabled. +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field maxthrustat fun(pressure: number): number +---:type: `number` (kN) +--- +---Taking into account the thrust limiter tweakable setting, how much thrust would this engine give if the throttle was max at its current thrust limit setting and atmospheric pressure and velocity conditions. Note that this will read zero if the engine is currently disabled. +---@field availablethrust number +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---:type: `number` (kN) +--- +---Taking into account the thrust limiter tweakable setting, how much thrust would this engine give if the throttle was max at its current thrust limit setting and velocity, but at a different atmospheric pressure you pass into it. The pressure is measured in ATM's, meaning 0.0 is a vacuum, 1.0 is sea level at Kerbin. Note that this will read zero if the engine is currently disabled. +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field availablethrustat fun(pressure: number): number +---:type: `number` (kN) +--- +---Taking into account the thrust limiter tweakable setting, how much thrust would this engine give if the throttle was max at its current thrust limit setting and atmospheric pressure and velocity conditions. This will give the correct value even if the engine is currently disabled. +---@field possiblethrust number +---:parameter pressure: atmospheric pressure (in standard Kerbin atmospheres) +---:type: `number` (kN) +--- +---Taking into account the thrust limiter tweakable setting, how much thrust would this engine give if the throttle was max at its current thrust limit setting and velocity, but at a different atmospheric pressure you pass into it. The pressure is measured in ATM's, meaning 0.0 is a vacuum, 1.0 is sea level at Kerbin. This will give the correct value even if the engine is currently disabled. +---(Pressure must be greater than or equal to zero. If you pass in a +---negative value, it will be treated as if you had given a zero instead.) +---@field possiblethrustat fun(pressure: number): number +---@field maxpossiblethrust number +---@field maxpossiblethrustat fun(param1: number): number +---:type: `Lexicon` of `ConsumedResource` +--- +---The fuel resources this engine consumes, and in what ratios. +---@field consumedresources Lexicon +---Does this engine have multiple modes (i.e. RAPIER)? Check this before calling multi-mode specific suffixes. +---@field multimode boolean +---:type: `List` of strings +--- +---Lists names of modes of this engine if multimode, returns a list of 1 string "Single mode" otherwise. +---@field modes List +---Name of the current mode. Only assessible for multi-mode engines. +---@field mode string +---Call to switch to another mode. Only assessible for multi-mode engines. +---@field togglemode fun() +---Settable. +---True for primary mode, false for secondary. Setting to other value equals toggling the mode. Only assessible for multi-mode engines. +---@field primarymode boolean +---Settable. +---Is automatic switching enabled? Can set to switch between manual and automatic switching. Only assessible for multi-mode engines. +---@field autoswitch boolean +---Does this engine have a gimbal enabled? +---@field hasgimbal boolean +---Returns the `Gimbal` attached to this engine. Only accessible if the gimbal is present (Use :attr:`Engine:HASGIMBAL` to check if available). +---@field gimbal Gimbal +---If RealFuels is installed, returns true if this engine is a type of engine that requires ullage, otherwise returns false. +---Note: this is a static property of the engine, for current fuel status, check `FUELSTABILITY`. +---@field ullage boolean +---If RealFuels is installed, returns the fuel stability of this engine as a value between 0 and 1 (where 1 is fullly stable), otherwise returns 1. +---Engines that don't require ullage will always return 1, unless they are pressure fed and the feed pressure is too low. +---@field fuelstability number +---If RealFuels is installed, returns true if this engine is pressure fed, otherwise returns false. +---@field pressurefed boolean +---If RealFuels is installed, returns the number of ignitions remaining, or -1 if it is unlimited, otherwise returns -1. +---@field ignitions number +---If RealFuels is installed, returns the minimum throttle setting as a value between 0 and 1, otherwise returns 0. +---@field minthrottle number +---If RealFuels is installed, returns the configuration name of this engine if applicable, otherwise returns the part title. +---@field config string + +---@class LaunchClamp : Decoupler + +---@class Part : Structure +---Call this function to cause the game to do the same thing as when you right-click a part on a vessel and select "control from here" on the menu. It rotates the control orientation so that fore/aft/left/right/up/down now match the orientation of this part. NOTE that this will not work for every type of part. It only works for those parts that KSP itself allows this for (control cores and docking ports). It accepts no arguments, and returns no value. +---All vessels must have at least one "control from" +---part on them somewhere, which is why there's no mechanism for un-setting +---the "control from" setting other than to pick another part and set it +---to that part instead. +--- +---.. warning:: +--- This suffix is only callable for parts attached to the :ref:`CPU Vessel ` +---@field controlfrom fun() +---Name of part as it is used behind the scenes in the game's API code. +--- +---A part's *name* is the name it is given behind the scenes in KSP. It never appears in the normal GUI for the user to see, but it is used in places like Part.cfg files, the saved game persistence file, the ModuleManager mod, and so on. +---@field name string +---@field fuelcrossfeed boolean +---The title of the part as it appears on-screen in the gui. +--- +---A part's *title* is the name it has inside the GUI interface on the screen that you see as the user. +---@field title string +---the stage this part is part of. +---@field stage number +---Part Craft ID. This is similar to :attr:`Part:UID`, except that this +---ID is only unique per craft design. In other words if you launch two +---copies of the same design without editing the design at all, then the +---same part in both copies of the design will have the same ``Part:CID`` +---as each other. (This value is kept in the *craft file* and repeated +---in each instance of the vessel that you launch). +---@field cid string +---Part Universal ID. All parts have a unique ID number. Part's uid never changes because it is the same value as stored in persistent.sfs. Although you can compare parts by comparing their uid it is recommended to compare parts directly if possible. +---@field uid string +---The rotation of this part's X-axis, which points out of its side and is probably not what you want. You probably want the :attr:`Part:FACING` suffix instead. +---@field rotation Direction +---The location of this part in the universe. It is expressed in the same frame of reference as all the other positions in kOS, and thus can be used to help do things like navigate toward the position of a docking port. +---@field position Vector +---@field com Vector +---Settable. +---The name tag value that may exist on this part if you have given the part a name via the :ref:`name-tag system `. +--- +---A part's *tag* is whatever custom name you have given it using the :ref:`name-tag system described here `. This is probably the best naming convention to use because it lets you make up whatever name you like for the part and use it to pick the parts you want to deal with in your script. +--- +---WARNING: This suffix is only settable for parts attached to the :ref:`CPU Vessel ` +---@field tag string +---The direction that this part is facing, which is also the rotation +---that would transform a vector from a coordinate space where the +---axes were oriented to match the part, to one where they're +---oriented to match the world's ship-raw coordinates. +---@field facing Direction +---Constructs a "bounding box" structure that can be used to +---give your script some idea of the extents of the part's shape - how +---wide, long, and tall it is. +--- +---It can be slightly expensive in terms of CPU time to keep calling +---this suffix over and over, as kOS has to perform some work to build +---this structure. If you need to keep looking at a part's bounds again +---and again in a loop, and you know that part's shape isn't going to be +---changing (i.e. you're not going to extend a solar panel or something +---like that), then it's better for you to call this ``:BOUNDS`` suffix +---just once at the top, storing the result in a variable that you use in +---the loop. +--- +---More detailed information is found on the documentation page for +---`Bounds`. +---@field bounds Bounds +---list of the `Resource` in this part. +---@field resources List +---True if this part can be selected by KSP as a target. +--- +---This example assumes you have a target vessel picked, and that the target vessel is loaded into full-physics range and not "on rails". vessels that are "on rails" do not have their full list of parts entirely populated at the moment:: +--- +--- LIST PARTS FROM TARGET IN tParts. +--- +--- PRINT "The target vessel has a". +--- PRINT "partcount of " + tParts:LENGTH. +--- +--- SET totTargetable to 0. +--- FOR part in tParts { +--- IF part:TARGETABLE { +--- SET totTargetable TO totTargetable + 1. +--- } +--- } +--- +--- PRINT "...and " + totTargetable. +--- PRINT " of them are targetable parts.". +---@field targetable boolean +---the vessel that contains this part. +---@field ship Vessel +---:parameter name: (`string`) The name of the module to check for +---:returns: `boolean` +--- +---Checks to see if this part contains the `PartModule` with the name +---given. If it does, this returns true, else it returns false. (If +---``HASMODULE(name)`` returns false, then this means an attempt to use +---``GETMODULE(name)`` would fail with an error.) +---@field hasmodule fun(name: string): boolean +---:parameter name: (`string`) Name of the part module +---:returns: `PartModule` +--- +---Get one of the :struct:`PartModules ` attached to this part, given the name of the module. (See :attr:`Part:MODULES` for a list of all the names available). +---@field getmodule fun(name: string): PartModule +---:parameter index: (`number`) Index number of the part module +---:returns: `PartModule` +--- +---Get one of the :struct:`PartModules ` attached to this part, +---given the index number of the module. You can use :attr:`Part:MODULES` for a +---list of names of all modules on the part. The indexes are not guaranteed to +---always be in the same order. It is recommended to iterate over the indexes +---with a loop and verify the module name:: +--- +--- local moduleNames is part:modules. +--- for idx in range(0, moduleNames:length) { +--- if moduleNames[idx] = "test module" { +--- local pm is part:getmodulebyindex(idx). +--- DoSomething(pm). +--- } +--- } +---@field getmodulebyindex fun(index: number): PartModule +---:type: `List` of strings +--- +---list of the names of :struct:`PartModules ` enabled for this part. +---@field modules List +---:type: `List` of strings +--- +---list of the names of :struct:`PartModules ` enabled for this part. +---@field allmodules List +---When walking the :ref:`tree of parts `, this is the part that this part is attached to on the way "up" toward the root part. +---@field parent any +---:type: `Decoupler` or `string` +--- +---The decoupler/separator that will decouple this part when activated. `None` if no such exists. +---@field decoupler any +---:type: `Decoupler` or `string` +--- +---The decoupler/separator that will decouple this part when activated. `None` if no such exists. +---@field separator any +---The stage number where this part will get decoupled. -1 if cannot be decoupled. +---@field decoupledin number +---The stage number where this part will get decoupled. -1 if cannot be decoupled. +---@field separatedin number +---When walking the :ref:`tree of parts `, this is true as long as there is a parent part to this part, and is false if this part has no parent (which can only happen on the root part). +---@field hasparent boolean +---:type: `List` of :struct:`Parts ` +--- +---When walking the :ref:`tree of parts `, this is all the parts that are attached as children of this part. It returns a list of zero length when this part is a "leaf" of the parts tree. +---@field children List +---The mass of the part if all of its resources were empty. If the part has no physics this will always be 0. +---@field drymass number +---The current mass or the part and its resources. If the part has no physics this will always be 0. +---@field mass number +---The mass of the part if all of its resources were full. If the part has no physics this will always be 0. +---@field wetmass number +---This comes from a part's configuration and is an artifact of the KSP simulation. +--- +---For a list of stock parts that have this attribute and a fuller explanation see `the KSP wiki page about massless parts `_. +---@field hasphysics boolean +---Returns how many parts are in the same symmetry set as this part. +--- +---Note that all parts should at least return a minimum value of 1, since +---even a part placed without symmetry is technically in a group of 1 part, +---itself. +---@field symmetrycount number +---Tells you the type of symmetry this part has by returning a number +---as follows: +--- +---0 = This part has radial symmetry +--- +---1 = This part has mirror symmetry +--- +---It's unclear if this means anything when the part's symmetry is 1x. +---@field symmetrytype number +---:returns: nothing +--- +---Call this method to remove this part from its symmetry group, reverting +---it back to a symmetry group of 1x (just itself). This has the same +---effect as pressing the "Remove From Symmetry" button in the part's +---action window. +--- +---Note that just like when you press the "Remove from Symmetry" button, +---once a part has been removed from symmetry you don't have a way to +---put it back into the symmetry group again. +---@field removesymmetry fun() +---:parameter name: (`number`) Index of which part in the symmetry group +---:returns: `Part` +--- +---When a set of parts has been placed with symmetry in the Vehicle +---Assembly Building or Space Plane Hangar, this method can be used +---to find all the parts that are in the same symmetrical group. +--- +---The index is numbered from zero to :attr:``SYMMETRYCOUNT`` minus one. +--- +---The zero-th symmetry partner is this part itself. Even parts placed +---without symmetry still are technically in a symmetry group of 1 part. +--- +---The index also wraps around in a cycle, such that if there are 4 parts in +---symmetry, then ``SYMMETRYPARTNER(0)`` and ``SYMMETRYPARTNER(4)`` and +---``SYMMETRYPARTNER(8)`` would all actually be the same part. +--- +---Example:: +--- +--- // Print the symmetry group a part is inside: +--- function print_sym { +--- parameter a_part. +--- +--- print a_part + " is in a " + a_part:SYMMETRYCOUNT + "x symmetry set.". +--- +--- if a_part:SYMMETRAYCOUNT = 1 { +--- return. // no point in printing the list when its not in a group. +--- } +--- +--- if a_part:SYMMETRYTYPE = 0 { +--- print " The symmetry is radial.". +--- } else if a_part:SYMMETRYTYPE = 1 { +--- print " The symmetry is mirror.". +--- } else { +--- print " The symmetry is some other weird kind that". +--- print " didn't exist back when this example was written.". +--- } +--- +--- print " The Symmetry Group is: ". +--- for i in range (0, a_part:SYMMETRYCOUNT) { +--- print " [" + i + "] " + a_part:SYMMETRYPARTNER(i). +--- } +--- } +---@field symmetrypartner fun(index: number): Part +---:parameter name: (`string`) Name of the parts +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:PARTSNAMED(name)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field partsnamed fun(name: string): List +---:parameter namePattern: (`string`) Pattern of the name of the parts +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:PARTSNAMEDPATTERN(namePattern)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field partsnamedpattern fun(namePattern: string): List +---:parameter title: (`string`) Title of the parts +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:PARTSTITLED(title)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field partstitled fun(title: string): List +---:parameter titlePattern: (`string`) Patern of the title of the parts +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:PARTSTITLEDPATTERN(titlePattern)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field partstitledpattern fun(titlePattern: string): List +---:parameter name: (`string`) name, title or tag of the parts +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:PARTSDUBBED(name)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field partsdubbed fun(name: string): List +---:parameter namePattern: (`string`) Pattern of the name, title or tag of the parts +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:PARTSDUBBEDPATERN(namePattern)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field partsdubbedpattern fun(namePattern: string): List +---:parameter name: (`string`) Name of the part modules +---:return: `List` of `PartModule` objects +--- +---Same as :meth:`Vessel:MODULESNAMED(name)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field modulesnamed fun(name: string): List +---:parameter tag: (`string`) Tag of the parts +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:PARTSTAGGED(tag)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field partstagged fun(tag: string): List +---:parameter tagPattern: (`string`) Pattern of the tag of the parts +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:PARTSTAGGEDPATTERN(tagPattern)` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field partstaggedpattern fun(tagPattern: string): List +---:return: `List` of `Part` objects +--- +---Same as :meth:`Vessel:ALLTAGGEDPARTS()` except that this version +---doesn't search the entire vessel tree and instead it only searches the +---branch of the vessel's part tree from the current part down through +---its children and its children's children and so on. +---@field alltaggedparts List + +---@class ActiveResource : AggregateResource + +---@class Element : Structure +---Settable. +---The name of the Element element, is an artifact from the vessel the element belonged to before docking. Cannot be set to an empty `string`. +---@field name string +---A unique id +---@field uid string +---The parent vessel containing the element. +---@field vessel Vessel +---:type: `List` of `Part` objects +--- +---A List of all the :struct:`parts ` on the Element. ``SET FOO TO SHIP:PARTS.`` has exactly the same effect as ``LIST PARTS IN FOO.``. For more information, see :ref:`ship parts and modules `. +---@field parts List +---:type: `List` of `DockingPort` objects +--- +---A List of all the :struct:`docking ports ` on the Element. +---@field dockingports List +---@field decouplers List +---@field separators List +---:type: `List` of `AggregateResource` objects +--- +---A List of all the :struct:`AggregateResources ` on the element. +---@field resources List + +---@class Atmosphere : Structure +---The Body that this atmosphere is around - as a STRING NAME, not a Body object. +---@field body string +---True if this atmosphere is "real" and not just a dummy placeholder. +---@field exists boolean +---True if the air has oxygen and could therefore be used by a jet engine's intake. +---@field oxygen boolean +---:type: `number` (atm) +--- +---Pressure at the body's sea level. +--- +---Result is returned in Atmospheres. 1.0 Atmosphere = same as Kerbin or Earth. +---If you prefer to see the answer in KiloPascals, multiply the answer by +---:global:`Constant:AtmToKPa`. +--- +---.. warning:: +--- .. versionchanged:: 1.1.0 +--- Previous versions returned this value in KiloPascals by mistake, +--- which has now been changed to Atmospheres. +---@field sealevelpressure number +---:type: `number` (m) +--- +---The altitude at which the atmosphere is "officially" advertised as ending. (actual ending value differs, see below). +---@field height number +---:parameter altitude: The altitude above sea level (in meters) you want to know the pressure for. +---:type: `number` (atm) +--- +---Number of Atm's of atmospheric pressure at the given altitude. +---If you pass in zero, you should get the sea level pressure. +---If you pass in 10000, you get the pressure at altitude=10,000m. +---This will return zero if the body has no atmosphere, or if the altitude you +---pass in is above the max atmosphere altitude for the body. +--- +---Result is returned in Atmospheres. 1.0 Atmosphere = same as Kerbin or Earth. +---If you prefer to see the answer in KiloPascals, multiply the answer by +---:global:`Constant:AtmToKPa`. +---@field altitudepressure fun(altitude: number): number +---:acces: Get only +--- +---The Molecular Mass of the gas the atmosphere is composed of. +---Units are in kg/mol. +---`Wikipedia Molar Mass Explanation `_. +---@field molarmass number +---The Adiabatic index of the gas the atmosphere is composed of. +---`Wikipedia Adiabatic Index Explanation `_. +---@field adiabaticindex number +---The Adiabatic index of the gas the atmosphere is composed of. +---`Wikipedia Adiabatic Index Explanation `_. +---@field adbidx number +---:parameter: altitude (`number`) the altitude to query temperature at. +--- +---Returns an approximate atmosphere temperature on this world at the given altitude. +---Note that this is only approximate because the temperature will vary depending +---on the sun position in the sky (i.e. your latitude and what time of day it is). +---@field altitudetemperature fun(altitude: number): number +---:parameter: altitude (`number`) the altitude to query temperature at. +--- +---Returns an approximate atmosphere temperature on this world at the given altitude. +---Note that this is only approximate because the temperature will vary depending +---on the sun position in the sky (i.e. your latitude and what time of day it is). +---@field alttemp fun(altitude: number): number + +---@class RGBA : Structure +---Settable. +---@field r number +---Settable. +---@field red number +---Settable. +---@field g number +---Settable. +---@field green number +---Settable. +---@field b number +---Settable. +---@field blue number +---Settable. +---@field a number +---Settable. +---@field alpha number +---@field html string +---@field hex string + +---@class Orbitable : Structure +---Name of this vessel or body. +---@field name string +---:type: `number` (deg) +--- +---.. deprecated:: 0.15 +--- +--- This is only kept here for backward compatibility. +--- in new scripts you write, use :attr:`OBT:APOAPSIS `. +--- (i.e. use ``SHIP:OBT:APOAPSIS`` instead of ``SHIP:APOAPSIS``, +--- or use ``MUN:OBT:APOAPSIS`` instead of ``MUN:APOAPSIS``, etc). +---@field apoapsis number +---:type: `number` (deg) +--- +---.. deprecated:: 0.15 +--- +--- This is only kept here for backward compatibility. +--- in new scripts you write, use :attr:`OBT:PERIAPSIS `. +--- (i.e. use ``SHIP:OBT:PERIAPSIS`` instead of ``SHIP:PERIAPSIS``). +--- or use ``MUN:OBT:PERIAPSIS`` instead of ``MUN:PERIAPSIS``, etc). +---@field periapsis number +---The `Body` that this object is orbiting. I.e. ``Mun:BODY`` returns ``Kerbin``. +---@field body Body +---True if this object has a body it orbits (false only when this object is the Sun, pretty much). +---@field hasbody boolean +---True if this object has a body it orbits (false only when this object is the Sun, pretty much). +---@field hasobt boolean +---True if this object has a body it orbits (false only when this object is the Sun, pretty much). +---@field hasorbit boolean +---pointing straight up away from the SOI body. +---@field up Direction +---pointing straight north on the SOI body, parallel to the surface of the SOI body. +---@field north Direction +---pointing in the direction of this object's **orbitable-frame** velocity +---@field prograde Direction +---pointing in the opposite of the direction of this object's **orbitable-frame** velocity +---@field retrograde Direction +---pointing in the direction of this object's **surface-frame** velocity. Note that if this Orbitable is itself a body, remember that this is relative to the surface of the SOI body, not this body. +---@field srfprograde Direction +---pointing in the opposite of the direction of this object's **surface-frame** velocity. Note that this is relative to the surface of the SOI body. +---@field srfretrograde Direction +---The current single orbit "patch" that this object is on (not the future orbits it might be expected to achieve after maneuver nodes or encounter transitions, but what the current orbit would be if nothing changed and no encounters perturbed the orbit. +---@field obt Orbit +---The current single orbit "patch" that this object is on (not the future orbits it might be expected to achieve after maneuver nodes or encounter transitions, but what the current orbit would be if nothing changed and no encounters perturbed the orbit. +---@field orbit Orbit +---The position of this object in the :ref:`SHIP-RAW reference frame ` +---@field position Vector +---The :struct:`orbitable velocity ` of this object in the :ref:`SHIP-RAW reference frame ` +---@field velocity OrbitableVelocity +---:type: `number` (m) +--- +---The `number` distance between this object and the center of `SHIP`. +---@field distance number +---pointing in the direction of this object from `SHIP`. +---@field direction Direction +---:type: `number` (deg) +--- +---The latitude in degrees of the spot on the surface of the SOI body directly under this object. +---@field latitude number +---:type: `number` (deg) +--- +---The longitude in degrees of the spot on the surface of the SOI body directly under this object. Longitude returned will always be normalized to be in the range [-180,180]. +---@field longitude number +---:type: `number` (m) +--- +---The altitude in meters above the *sea level* surface of the SOI body (not the center of the SOI body. To get the true radius of the orbit for proper math calculations remember to add altitude to the SOI body's radius.) +---@field altitude number +---A combined structure of the latitude and longitude numbers. +---@field geoposition GeoCoordinates +---:type: `List` of `Orbit` "patches" +--- +---The list of all the orbit patches that this object will transition to, not taking into account maneuver nodes. The zero-th patch of the list is the current orbit. +---@field patches List + +---@class VesselAltitude : Structure +---@field apoapsis number +---@field periapsis number +---@field radar number + +---@class AGXAddon : RTAddon + +---@class TRAddon : RTAddon +---**Only gives the correct answer for Trajectries version >= 2.2.0** +--- +---*For earlier versions, it gives a hardcoded fixed answer, as follows:* +--- +---- For any Trajectories version earlier than 2.0.0, +--- this returns the empty string "". +---- For any Trajectories version at least 2.0.0 but +--- below 2.2.0, this returns the 'rounded off' answer "2.0.0" +--- regardless of the precise version number within that range. +---- If your Trajectories version is at least 2.2.0 or above, +--- this returns the specific version string correctly. +--- +---For cases where you need to check for a known minimum Trajectories +---version, it is probably better to use the specific boolean suffix +---for that version (for example, :attr:`TRAddon:ISVERTWO`, or +---:attr:`TRAddon:ISVERTWOTWO` etc.) +---@field getversion string +---**Only gives the correct answer for Trajectries version >= 2.0.0** +--- +---*For earlier versions, it gives a hardcoded fixed answer, as follows:* +--- +---- For any Trajectories version earlier than 2.0.0, +--- this returns "0". +---- If your Trajectories version is at least 2.0.0 or above, +--- this returns the specific version major value correctly. +--- +---For cases where you need to check for a known minimum Trajectories +---version, it is probably better to use the specific boolean suffix +---for that version (for example, :attr:`TRAddon:ISVERTWO`, or +---:attr:`TRAddon:ISVERTWOTWO` etc.) +---@field getversionmajor number +---**Only gives the correct answer for Trajectries version >= 2.2.0** +--- +---*For earlier versions, it gives a hardcoded fixed answer, as follows:* +--- +---- For any Trajectories version below 2.2.0, this returns +--- "0" regardless of the precise version number within that range. +---- If your Trajectories version is at least 2.2.0 or above, +--- this returns the specific version minor value correctly. +--- +---For cases where you need to check for a known minimum Trajectories +---version, it is probably better to use the specific boolean suffix +---for that version (for example, :attr:`TRAddon:ISVERTWO`, or +---:attr:`TRAddon:ISVERTWOTWO` etc.) +---@field getversionminor number +---**Only gives the correct answer for Trajectries version >= 2.2.0** +--- +---*For earlier versions, it gives a hardcoded fixed answer, as follows:* +--- +---- For any Trajectories version below 2.2.0, this returns +--- "0" regardless of the precise version number within that range. +---- If your Trajectories version is at least 2.2.0 or above, +--- this returns the specific version patch value correctly. +--- +---For cases where you need to check for a known minimum Trajectories +---version, it is probably better to use the specific boolean suffix +---for that version (for example, :attr:`TRAddon:ISVERTWO`, or +---:attr:`TRAddon:ISVERTWOTWO` etc.) +---@field getversionpatch number +---True if the Trajectories mod is at least version 2.0.0 or above. +---@field isvertwo boolean +---True if the Trajectories mod is at least version 2.2.0 or above. +---@field isvertwotwo boolean +---True if the Trajectories mod is at least version 2.4.0 or above. +---@field isvertwofour boolean +---Estimated impact position. +---@field impactpos GeoCoordinates +---True if Trajectories has calculated an impact position for the current `Vessel`. You should always check this before using :attr:`impactPos`, :attr:`plannedVect`, :meth:`setTarget`, or :attr:`correctedVect` to avoid exceptions. +---@field hasimpact boolean +---A vector that applies an offset to :attr:`PLANNEDVEC` +---intended to correct the predicted trajectory to impact at the selected +---target position. This vector does not use any aerodynamic prediction and +---is a very simplistic representation. It is also just a unit vector. It +---contains no magnitude information about how far off the selected target is +---from the predicted impact - just the way the offset points. Accuracy is +---not guaranteed, but it should at least help determine if you need to +---pitch the nose up or down. +---@field correctedvec Vector +---A vector that applies an offset to :attr:`PLANNEDVEC` +---intended to correct the predicted trajectory to impact at the selected +---target position. This vector does not use any aerodynamic prediction and +---is a very simplistic representation. It is also just a unit vector. It +---contains no magnitude information about how far off the selected target is +---from the predicted impact - just the way the offset points. Accuracy is +---not guaranteed, but it should at least help determine if you need to +---pitch the nose up or down. +---@field correctedvector Vector +---Vector pointing the direction your vessel should face to follow the +---predicted trajectory, based on the angle of attack selected in the +---Trajectories descent profile. +---@field plannedvec Vector +---Vector pointing the direction your vessel should face to follow the +---predicted trajectory, based on the angle of attack selected in the +---Trajectories descent profile. +---@field plannedvector Vector +---:parameter position: `GeoCoordinates` +---:return: None +--- +---Sets the Trajectories target landing position to the given position. +---@field settarget fun(position: GeoCoordinates) +---**Did Not Exist in Trajectories before 2.0.0!** +--- +---*If :attr:`TRAddons:ISVERTWO` is false, using this suffix will cause +---a runtime error.* +--- +---The Trajectories Addon can be given a target position. +---This is true if such a position is set, or false if it is not. +---@field hastarget boolean +---**Did Not Exist in Trajectories before 2.2.0!** +--- +---*If :attr:`TRAddons:ISVERTWOTWO` is false, using this suffix will cause +---a runtime error.* +--- +---Gives you Trajectories prediction of how many seconds until impact +---on ground or water. +---@field timetillimpact number +---Settable. +---**Did Not Exist in Trajectories before 2.2.0!** +--- +---*If :attr:`TRAddons:ISVERTWOTWO` is false, using this suffix will cause +---a runtime error.* +--- +---For Trajectories 2.2.0 True if all the descent profile AoA values are 180. +---For Trajectories 2.4.0 True if all the descent profile nodes are 'retrograde' +--- +---You can set this to have the same effect as clicking on retrograde mode +---in the trajectories GUI. Setting this value to true causes +---:attr:`TRAddon:PROGRADE` to become false. (They cannot both be +---true at the same time.) +--- +---Setting this causes all Trajectories descent profile nodes +---to be set to 'retrograde' mode if True or 'prograde' mode if False. +---Also resets all AoA values to 0. +---@field retrograde boolean +---Settable. +---**Did Not Exist in Trajectories before 2.2.0!** +--- +---*If :attr:`TRAddons:ISVERTWOTWO` is false, using this suffix will cause +---a runtime error.* +--- +---For Trajectories 2.2.0 True if all the descent profile AoA values are 0. +---For Trajectories 2.4.0 True if all the descent profile nodes are 'prograde' +--- +---You can set this to have the same effect as clicking on prograde mode +---in the trajectories GUI. Setting this value to true causes +---:attr:`TRAddon:RETROGRADE` to become false. (They cannot both be +---true at the same time.) +--- +---Setting this causes all Trajectories descent profile nodes +---to be set to 'prograde' mode if True or 'retrograde' mode if False. +---Also resets all AoA values to 0. +---@field prograde boolean +---**Did Not Exist in Trajectories before 2.4.0!** +--- +---*If :attr:`TRAddons:ISVERTWOFOUR` is false, using this suffix will cause +---a runtime error.* +--- +---Returns the Trajectories target position if one is set. +---@field gettarget GeoCoordinates +---:parameter None +---:return: None +--- +---**Did Not Exist in Trajectories before 2.4.0!** +--- +---*If :attr:`TRAddons:ISVERTWOFOUR` is false, using this suffix will cause +---a runtime error.* +--- +---Clears the Trajectories target position. +---@field cleartarget fun() +---:parameter AoA: `number` +---:return: None +--- +---**Did Not Exist in Trajectories before 2.4.0!** +--- +---*If :attr:`TRAddons:ISVERTWOFOUR` is false, using this suffix will cause +---a runtime error.* +--- +---Resets all the Trajectories descent profile nodes to the passed AoA value (in Degrees), +---also sets Retrograde if AoA value is greater than 90 degrees (PI/2 radians) +---otherwise sets to Prograde. +---@field resetdescentprofile fun(AoA: number) +---Settable. +---:type: :struct:`List` +--- +---**Did Not Exist in Trajectories before 2.4.0!** +--- +---*If :attr:`TRAddons:ISVERTWOFOUR` is false, using this suffix will cause +---a runtime error.* +--- +---Returns or sets all the Trajectories descent profile AoA values (in Degrees), +---also sets a node to Retrograde if it's passed AoA is greater than 90 degrees +---(PI/2 radians) +---Note. also use with :attr:`TRAddons:DESCENTGRADES` to set a nodes grade +---if needed and passing AoA values as displayed in the gui with max 90 degrees +---(PI/2 radians). +--- +---List(atmospheric entry, high altitude, low altitude, final approach). +---@field descentangles List +---Settable. +---:type: :struct:`List` +--- +---**Did Not Exist in Trajectories before 2.4.0!** +--- +---*If :attr:`TRAddons:ISVERTWOFOUR` is false, using this suffix will cause +---a runtime error.* +--- +---Returns or sets all the Trajectories descent profile modes, +---True = AoA, False = Horizon. +--- +---List(atmospheric entry, high altitude, low altitude, final approach). +---@field descentmodes List +---Settable. +---:type: :struct:`List` +--- +---**Did Not Exist in Trajectories before 2.4.0!** +--- +---*If :attr:`TRAddons:ISVERTWOFOUR` is false, using this suffix will cause +---a runtime error.* +--- +---Returns or sets all the Trajectories descent profile grades, +---True = Retrograde, False = Prograde. +--- +---List(atmospheric entry, high altitude, low altitude, final approach). +---@field descentgrades List + +---@class IRAddon : RTAddon +---:type: `List` of `IRControlGroup` objects +--- +---Lists all Servo Groups for the Vessel on which the script is being executed. +---Example of use:: +--- +--- for g in ADDONS:IR:GROUPS +--- { +--- Print g:NAME + " contains " + g:SERVOS:LENGTH + " servos". +--- } +---@field groups List +---:type: `List` of `IRServo` objects +--- +---Lists all Servos for the Vessel on which the script is being executed. +---Example of use:: +--- +--- for s in ADDONS:IR:ALLSERVOS +--- { +--- print "Name: " + s:NAME + ", position: " + s:POSITION. +--- } +---@field allservos List +---:parameter part: `Part` for which to return servos +---:type: `List` of `IRServo` objects +--- +---Lists all Servos found on the given `Part`. +---@field partservos fun(part: Part): List + +---@class IRControlGroup : Structure +---Settable. +---:type: :ref:`string ` +--- +---Name of the Control Group (cannot be empty). +---@field name string +---Settable. +---:type: :ref:`scalar ` +--- +---Speed multiplier as set in the IR user interface. Avoid setting it to 0. +---@field speed number +---Settable. +---:type: :ref:`Boolean ` +--- +---True if Group is expanded in IR UI +---@field expanded boolean +---Settable. +---:type: :ref:`string ` +--- +---Key assigned to forward movement. Can be empty. +---@field forwardkey string +---Settable. +---:type: :ref:`string ` +--- +---Key assigned to reverse movement. Can be empty. +---@field reversekey string +---:type: List of `IRServo` objects +--- +---Lists Servos in the Group. Example of use:: +--- +--- for g in ADDONS:IR:GROUPS +--- { +--- Print g:NAME + " contains " + g:SERVOS:LENGTH + " servos:". +--- for s in g:servos +--- { +--- print " " + s:NAME + ", position: " + s:POSITION. +--- } +--- } +---@field servos List +---:return: void +--- +---Commands servos in the group to move in positive direction. +---@field moveright fun() +---:return: void +--- +---Commands servos in the group to move in negative direction. +---@field moveleft fun() +---:return: void +--- +---Commands servos in the group to move to default position. +---@field movecenter fun() +---:return: void +--- +---Commands servos in the group to move to next preset +---@field movenextpreset fun() +---:return: void +--- +---Commands servos in the group to move to previous preset +---@field moveprevpreset fun() +---:return: void +--- +---Commands servos in the group to stop +---@field stop fun() +---Returns a Vessel that owns this ServoGroup +---@field vessel Vessel + +---@class IRServo : Structure +---Settable. +---:type: :ref:`string ` +--- +---Name of the Control Group (cannot be empty). +---@field name string +---:type: :ref:`scalar ` +--- +---Unique ID of the servo part (part.flightID). +---@field uid number +---Settable. +---:type: :ref:`Boolean ` +--- +---Set Hightlight status of the part. +---@field highlight boolean +---:type: :ref:`scalar ` +--- +---Current position of the servo. +---@field position number +---:type: :ref:`scalar ` +--- +---Minimum position for servo as defined by part creator in part.cfg +---@field mincfgposition number +---:type: :ref:`scalar ` +--- +---Maximum position for servo as defined by part creator in part.cfg +---@field maxcfgposition number +---Settable. +---:type: :ref:`scalar ` +--- +---Minimum position for servo, from tweakable. +---@field minposition number +---Settable. +---:type: :ref:`scalar ` +--- +---Maximum position for servo, from tweakable. +---@field maxposition number +---:type: :ref:`scalar ` +--- +---Servo movement speed as defined by part creator in part.cfg +---@field configspeed number +---Settable. +---:type: :ref:`scalar ` +--- +---Current Servo speed. +---@field currentspeed number +---Settable. +---:type: :ref:`scalar ` +--- +---Servo speed multiplier, from tweakable. +---@field speed number +---Settable. +---:type: :ref:`scalar ` +--- +---Servo acceleration multiplier, from tweakable. +---@field acceleration number +---:type: :ref:`Boolean ` +--- +---True if Servo is moving +---@field ismoving boolean +---:type: :ref:`Boolean ` +--- +---True if Servo is uncontrollable (ex. docking washer) +---@field isfreemoving boolean +---Settable. +---:type: :ref:`Boolean ` +--- +---Servo's locked status, set true to lock servo. +---@field locked boolean +---Settable. +---:type: :ref:`Boolean ` +--- +---Servo's inverted status, set true to invert servo's axis. +---@field inverted boolean +---:return: void +--- +---Commands servo to move in positive direction +---@field moveright fun() +---:return: void +--- +---Commands servo to move in negative direction +---@field moveleft fun() +---:return: void +--- +---Commands servo to move to default position +---@field movecenter fun() +---:return: void +--- +---Commands servo to move to next preset +---@field movenextpreset fun() +---:return: void +--- +---Commands servo to move to previous preset +---@field moveprevpreset fun() +---:return: void +--- +---Commands servo to stop +---@field stop fun() +---:parameter position: (float) Position to move to +---:parameter speedMult: (float) Speed multiplier +---:return: void +--- +---Commands servo to move to `position` with `speedMult` multiplier. +---@field moveto fun(position: number, speedMult: number) +---Returns reference to the `Part` containing servo module. Please note that Part:UID does not equal IRServo:UID. +---@field part Part + +---@class KACAddon : RTAddon +---:return: List of `KACAlarm` objects +--- +---List **all** the alarms set up in Kerbal Alarm Clock. Example of use:: +--- +--- for i in ADDONS:KAC:ALARMS +--- { +--- print i:NAME + " - " + i:REMAINING + " - " + i:TYPE+ " - " + i:ACTION. +--- } +---@field alarms List + +---@class KACAlarm : Structure +---:type: :ref:`string ` +--- +---Unique identifier of the alarm. +---@field id string +---Settable. +---:type: :ref:`string ` +--- +---Name of the alarm. Displayed in main KAC window. +---@field name string +---Settable. +---:type: :ref:`string ` +--- +---Long description of the alarm. Can be seen when alarm pops or by double-clicking alarm in UI. +--- +---**Warning**: This field may be reserved in the future version of KAC-KOS integration for automated script execution upon triggering of the alarm. +---@field notes string +---Settable. +---:type: :ref:`string ` +--- +---Should be one of the following +--- +--- * `MessageOnly` - Message Only-No Affect on warp +--- * `KillWarpOnly` - Kill Warp Only-No Message +--- * `KillWarp` - Kill Warp and Message +--- * `PauseGame` - Pause Game and Message +--- +---If set incorrectly will log a warning in Debug log and revert to previous or default value. +---@field action string +---:type: :ref:`string ` +--- +---Can only be set at Alarm creation. +---Could be one of the following as per API +--- +--- * Raw (default) +--- * Maneuver +--- * ManeuverAuto +--- * Apoapsis +--- * Periapsis +--- * AscendingNode +--- * DescendingNode +--- * LaunchRendevous +--- * Closest +--- * SOIChange +--- * SOIChangeAuto +--- * Transfer +--- * TransferModelled +--- * Distance +--- * Crew +--- * EarthTime +--- +---**Warning**: Unless you are 100% certain you know what you're doing, create only "Raw" AlarmTypes to avoid unnecessary complications. +---@field type string +---:type: :ref:`scalar ` +--- +---Time remaining until alarm is triggered. +---@field remaining number +---Settable. +---@field time number +---Settable. +---@field margin number +---Settable. +---:type: :ref:`boolean ` +--- +---Should the alarm be repeated once it fires. +---@field repeat boolean +---Settable. +---:type: :ref:`scalar ` +--- +---How long after the alarm fires should the next alarm be set up. +---@field repeatperiod number +---Settable. +---:type: :ref:`string ` +--- +---Name of the body the vessel is departing from. +---@field originbody string +---Settable. +---:type: :ref:`string ` +--- +---Name of the body the vessel is arriving to. +---@field targetbody string + +---@class RTAddon : RTAddon +---:parameter vessel: `Vessel` +---:return: (`number`) seconds +--- +---Returns shortest possible delay for `vessel` (Will be less than KSC delay if you have a local command post). +---@field delay fun(vessel: Vessel): number +---:parameter vessel: `Vessel` +---:return: (`number`) seconds +--- +---Returns delay in seconds from KSC to `vessel`. +---@field kscdelay fun(vessel: Vessel): number +---:parameter vessel: `Vessel` +---:return: `boolean` +--- +---Returns True if `vessel` has any connection (including to local command posts). +---@field hasconnection fun(vessel: Vessel): boolean +---:parameter vessel: `Vessel` +---:return: `boolean` +--- +---Returns True if `vessel` has connection to KSC. +---@field haskscconnection fun(vessel: Vessel): boolean +---:parameter part: `Part` +---:return: `boolean` +--- +---Returns True if `part` has any connection (including to local command posts). +---@field antennahasconnection fun(part: Part): boolean +---:parameter vessel: `Vessel` +---:return: `boolean` +--- +---Returns True if `vessel` has local control (and thus not requiring a RemoteTech connection). +---@field haslocalcontrol fun(vessel: Vessel): boolean +---:return: `List` of `string` +--- +---Returns names of all RT ground stations +---@field groundstations List + +---@class RTAddonAntennaModule : PartModule +---@field allfields List +---@field allfieldnames List +---@field hasfield fun(param1: string): boolean +---@field getfield fun(param1: string): any +---@field setfield fun(param1: string, param2: any) + +---@class HIGHLIGHT : Structure +---Settable. +---@field color RGBA +---Settable. +---@field enabled boolean + +---@class SteeringManager : Structure +---Returns the PIDLoop object responsible for calculating the :ref:`target angular velocity ` in the pitch direction. This allows direct manipulation of the gain parameters, and other components of the `PIDLoop` structure. Changing the loop's `MAXOUTPUT` or `MINOUTPUT` values will have no effect as they are overwritten every physics frame. They are set to limit the maximum turning rate to that which can be stopped in a :attr:`MAXSTOPPINGTIME` seconds (calculated based on available torque, and the ship's moment of inertia). +---@field pitchpid PIDLoop +---Returns the PIDLoop object responsible for calculating the :ref:`target angular velocity ` in the yaw direction. This allows direct manipulation of the gain parameters, and other components of the `PIDLoop` structure. Changing the loop's `MAXOUTPUT` or `MINOUTPUT` values will have no effect as they are overwritten every physics frame. They are set to limit the maximum turning rate to that which can be stopped in a :attr:`MAXSTOPPINGTIME` seconds (calculated based on available torque, and the ship's moment of inertia). +---@field yawpid PIDLoop +---Returns the PIDLoop object responsible for calculating the :ref:`target angular velocity ` in the roll direction. This allows direct manipulation of the gain parameters, and other components of the `PIDLoop` structure. Changing the loop's `MAXOUTPUT` or `MINOUTPUT` values will have no effect as they are overwritten every physics frame. They are set to limit the maximum turning rate to that which can be stopped in a :attr:`MAXSTOPPINGTIME` seconds (calculated based on available torque, and the ship's moment of inertia). +--- +---.. note:: +--- +--- The SteeringManager will ignore the roll component of steering +--- until after both the pitch and yaw components are close to being +--- correct. In other words it will try to point the nose of the +--- craft in the right direction first, before it makes any attempt +--- to roll the craft into the right orientation. As long as the +--- pitch or yaw is still far off from the target aim, this PIDloop +--- won't be getting used at all. +---@field rollpid PIDLoop +---Returns true if the SteeringManager is currently controlling the vessel steering. +---@field enabled boolean +---Returns direction that the is currently being targeted. If steering is locked to a vector, this will return the calculated direction in which kOS chose an arbitrary roll to go with the vector. If steering is locked to "kill", this will return the vessel's last facing direction. +---@field target Direction +---:return: none +--- +---Resets the integral sum to zero for all six steering PID Loops. +---@field resetpids fun() +---:return: none +--- +---Resets the various tuning parameters of the `SteeringManager` to +---their default values as if the ship had just been loaded. This internally +---will also call :meth:`SteeringManager:RESETPIDS`. +---@field resettodefault fun() +---Settable. +---Setting this suffix to true will cause the steering manager to display graphical vectors (see `VecDraw`) representing the forward, top, and starboard of the facing direction, as well as the world x, y, and z axis orientation (centered on the vessel). Setting to false will hide the vectors, as will disabling locked steering. +---@field showfacingvectors boolean +---Settable. +---Setting this suffix to true will cause the steering manager to display graphical vectors (see `VecDraw`) representing the current and target angular velocities in the pitch, yaw, and roll directions. Setting to false will hide the vectors, as will disabling locked steering. +---@field showangularvectors boolean +---Settable. +---Setting this suffix to true will cause the steering manager to clear the terminal screen and print steering data each update. +---@field showsteeringstats boolean +---Settable. +---Setting this suffix to true will cause the steering manager log the data from all 6 PIDLoops calculating target angular velocity and target torque. The files are stored in the `[KSP Root]\GameData\kOS\Plugins\PluginData\kOS` folder, with one file per loop and a new file created for each new manager instance (i.e. every launch, every revert, and every vessel load). These files can grow quite large, and add up quickly, so it is recommended to only set this value to true for testing or debugging and not normal operation. +---@field writecsvfiles boolean +---Settable. +---Represents the settling time for the :ref:`PID calculating pitch torque based on target angular velocity `. The proportional and integral gain is calculated based on the settling time and the moment of inertia in the pitch direction. Ki = (moment of inertia) * (4 / (settling time)) ^ 2. Kp = 2 * sqrt((moment of inertia) * Ki). +---@field pitchts number +---Settable. +---Represents the settling time for the :ref:`PID calculating yaw torque based on target angular velocity `. The proportional and integral gain is calculated based on the settling time and the moment of inertia in the yaw direction. Ki = (moment of inertia) * (4 / (settling time)) ^ 2. Kp = 2 * sqrt((moment of inertia) * Ki). +---@field yawts number +---Settable. +---Represents the settling time for the :ref:`PID calculating roll torque based on target angular velocity `. The proportional and integral gain is calculated based on the settling time and the moment of inertia in the roll direction. Ki = (moment of inertia) * (4 / (settling time)) ^ 2. Kp = 2 * sqrt((moment of inertia) * Ki). +---@field rollts number +---Settable. +---DEFAULT VALUE: 0.0002 +--- +---Tweaking this value can help make the controls stop wiggling so fast. +--- +---You cannot set this value higher than +---:attr:`SteeringManager:TORQUEEPSILONMAX`. +---If you attempt to do so, then +---:attr:`SteeringManager:TORQUEEPSILONMAX` will be increased to match +---the value just set :attr:`SteeringManager:TORQUEEPSILONMIN` to. +--- +---To see how to use this value, look at the description of +---:attr:`SteeringManager:TORQUEEPSILONMAX` below, which +---has the full documentation about how these two values, Min and Max, +---work together. +---@field torqueepsilonmin number +---Settable. +---DEFAULT VALUE: 0.001 +--- +---Tweaking this value can help make the controls stop wiggling so fast. +---If you have problems wasting too much RCS propellant because kOS +---"cares too much" about getting the rotation rate exactly right and is +---wiggling the controls unnecessarily when rotating toward a new direction, +---setting thie value a bit higher can help. +--- +---You cannot set this value lower than +---:attr:`SteeringManager:TORQUEEPSILONMIN`. +---If you attempt to do so, then +---:attr:`SteeringManager:TORQUEEPSILONMIN` will be decreased to match +---the value just set :attr:`SteeringManager:TORQUEEPSILONMAX` to. +--- +---**HOW IT WORKS:** +--- +---If the error in the desired rotation rate is smaller than the current epsilon, +---then the PID that calculates desired torque will ignore that error and not +---bother correcting it until it gets bigger. The actual epsilon value used +---in the steering manager's internal PID controller is always something between +---:attr:`SteeringManager:TORQUEEPSILONMIN`. +---and +---:attr:`SteeringManager:TORQUEEPSILONMAX`. +---It varies between these two values depending on whether the +---vessel is currently rotating at near the maximum rotation rate +---the SteeringManager allows (as determined by +---:attr:`SteeringManager:MAXSTOPPINGTIME`) or whether it's quite far +---from its maximum rotation rate. +---:attr:`SteeringManager:TORQUEEPSILONMAX` is used when the vessel is +---at it's maximum rotation rate (i.e. it's coasting around to a new +---orientation and shouldn't pointlessly spend RCS fuel trying to hold +---that angular velocity precisely). +---:attr:`SteeringManager:TORQUEEPSILONMIN` is used when the vessel is +---not trying to rotate at all and is supposed to be using the steering +---just to hold the aim at a standstill. In between these two states, +---it uses a value partway between the two, linearly interpolated between +---them. +--- +---If you desire a constant epsilon, set both the min and max values to the +---same value. +---@field torqueepsilonmax number +---Settable. +---:type: `number` (s) +--- +---This value is used to limit the turning rate when :ref:`calculating target angular velocity `. The ship will not turn faster than what it can stop in this amount of time. The maximum angular velocity about each axis is calculated as: (max angular velocity) = MAXSTOPPINGTIME * (available torque) / (moment of inertia). +--- +---.. note:: +--- +--- This setting affects all three of the :ref:`rotational velocity PID's ` at once (pitch, yaw, and roll), rather than affecting the three axes individually one at a time. +---@field maxstoppingtime number +---:type: `number` (deg) +--- +---The angle between the ship's facing direction forward vector and the target direction's forward. This is the combined pitch and yaw error. +---@field angleerror number +---:type: `number` (deg) +--- +---The pitch angle between the ship's facing direction and the target direction. +---@field pitcherror number +---:type: `number` (deg) +--- +---The yaw angle between the ship's facing direction and the target direction. +---@field yawerror number +---:type: `number` (deg) +--- +---The roll angle between the ship's facing direction and the target direction. +---@field rollerror number +---Settable. +---:type: `number` (kNm) +--- +---You can set this value to provide an additive bias to the calculated available pitch torque used in the pitch :ref:`torque PID `. (available torque) = ((calculated torque) + PITCHTORQUEADJUST) * PITCHTORQUEFACTOR. +---@field pitchtorqueadjust number +---Settable. +---:type: `number` (kNm) +--- +---You can set this value to provide an additive bias to the calculated available yaw torque used in the yaw :ref:`torque PID `. (available torque) = ((calculated torque) + YAWTORQUEADJUST) * YAWTORQUEFACTOR. +---@field yawtorqueadjust number +---Settable. +---:type: `number` (kNm) +--- +---You can set this value to provide an additive bias to the calculated available roll torque used in the roll :ref:`torque PID `. (available torque) = ((calculated torque) + ROLLTORQUEADJUST) * ROLLTORQUEFACTOR. +---@field rolltorqueadjust number +---Settable. +---:type: `number` (kNm) +--- +---You can set this value to provide an multiplicative factor bias to the calculated available pitch torque used in the :ref:`torque PID `. (available torque) = ((calculated torque) + PITCHTORQUEADJUST) * PITCHTORQUEFACTOR. +---@field pitchtorquefactor number +---Settable. +---:type: `number` (kNm) +--- +---You can set this value to provide an multiplicative factor bias to the calculated available yaw torque used in the :ref:`torque PID `. (available torque) = ((calculated torque) + YAWTORQUEADJUST) * YAWTORQUEFACTOR. +---@field yawtorquefactor number +---Settable. +---:type: `number` (kNm) +--- +---You can set this value to provide an multiplicative factor bias to the calculated available roll torque used in the :ref:`torque PID `. (available torque) = ((calculated torque) + ROLLTORQUEADJUST) * ROLLTORQUEFACTOR. +---@field rolltorquefactor number +---@field averageduration number +---Settable. +---:type: `number` (deg) +--- +---The maximum value of :attr:`ANGLEERROR` for +---which kOS will attempt to respond to error along the roll axis. If this +---is set to 5 (the default value), the facing direction will need to be within +---5 degrees of the target direction before it actually attempts to roll the +---ship. Setting the value to 180 will effectivelly allow roll control at any +---error amount. When :attr:`ANGLEERROR` is +---greater than this value, kOS will only attempt to kill all roll angular +---velocity. The value is clamped between 180 and 1e-16. +---@field rollcontrolanglerange number + +---@class Archive : Volume + +---@class FileContent : Structure +---Length of the file. +---@field length number +---True if the file is empty +---@field empty boolean +---Type of the content as a string. Can be one of the following:\ +--- +---TOOSHORT +--- Content too short to establish a type +--- +---ASCII +--- A file containing ASCII text, like the result of a LOG command. +--- +---KSM +--- A type of file containing KerboMachineLanguage compiled code, that was created from the :ref:`COMPILE command `. +--- +---BINARY +--- Any other type of file. +---@field type string +---Contents of the file decoded using UTF-8 encoding +---@field string string +---Contents of the file as a list of bytes. Each item in the list is a number between 0 and 255 representing a single byte from the file. +---@field binary List +---Iterates over the lines of a file +---@field iterator Iterator + +---@class LocalVolume : Volume + +---@class VolumeDirectory : VolumeItem +---@field iterator Iterator +---An alias for :meth:`LEXICON`. It's slightly wrong that a method called "List" +---returns a Lexicon instead of a List, but it has been that way long enough that +---now for backward compatibility, the name "List" had to remain as an alias +---for this method. +---@field list Lexicon +---An alias for :meth:`LEXICON`. It's slightly wrong that a method called "List" +---returns a Lexicon instead of a List, but it has been that way long enough that +---now for backward compatibility, the name "List" had to remain as an alias +---for this method. +---@field lexicon Lexicon +---An alias for :meth:`LEXICON`. It's slightly wrong that a method called "List" +---returns a Lexicon instead of a List, but it has been that way long enough that +---now for backward compatibility, the name "List" had to remain as an alias +---for this method. +---@field lex Lexicon + +---@class Volume : Structure +---Free space left on the volume +---@field freespace number +---Total space on the volume +---@field capacity number +---Settable. +---Gets or sets volume name. This name can be used instead of the volumeId with some :ref:`file and volume-related commands` +---@field name string +---True if the name of this volume can be changed. Currently only the name of the archive can't be changed. +---@field renameable boolean +---Amount of power consumed when this volume is set as the current volume +---@field powerrequirement number +---Returns volume's root directory +---@field root VolumeDirectory +---:return: `boolean` +--- +---Returns true if the given file or directory exists. This will also return true when the given file does not exist, but there is a file with the same name and `.ks` or `.ksm` extension added. +---Use ``Volume:FILES:HASKEY(name)`` to perform a strict check. +--- +---Paths passed as the argument to this command should not contain a volume id or name and should not be relative. +---@field exists fun(path: string): boolean +---:type: `Lexicon` of `VolumeItem` +--- +---List of files and directories on this volume. Keys are the names of all items on this volume and values are the associated `VolumeItem` structures. +---@field files Lexicon +---:return: `VolumeFile` +--- +---Creates a file under the given path and returns `VolumeFile`. It will fail if the file already exists. +--- +---Paths passed as the argument to this command should not contain a volume id or name and should not be relative. +---@field create fun(path: string): VolumeFile +---:return: `VolumeDirectory` +--- +---Creates a directory under the given path and returns `VolumeDirectory`. It will fail if the directory already exists. +--- +---Paths passed as the argument to this command should not contain a volume id or name and should not be relative. +---@field createdir fun(path: string): VolumeDirectory +---:return: `VolumeItem` or `boolean` false +--- +---Opens the file or directory pointed to by the given path and returns `VolumeItem`. It will return a boolean false if the given file or directory does not exist. +--- +---Paths passed as the argument to this command should not contain a volume id or name and should not be relative. +---@field open fun(path: string): any +---:return: boolean +--- +---Deletes the given file or directory (recursively). It will return true if the given item was successfully deleted and false otherwise. +--- +---Paths passed as the argument to this command should not contain a volume id or name and should not be relative. +---@field delete fun(path: string): boolean + +---@class VolumeItem : Structure +---Name of the item, including the extension. +---@field name string +---Size of the item, in bytes. +---@field size number +---Item extension (part of the name after the last dot). +---@field extension string +---True if this item is a file +---@field isfile boolean + +---@class Path : Structure +---Volume this path belongs to. +---@field volume Volume +---:type: `List` of `string` +--- +---List of segments this path contains. Segments are parts of the path separated by `/`. For example path `0:/directory/subdirectory/script.ks` contains the following segments: +---`directory`, `subdirectory` and `script.ks`. +---@field segments List +---Number of this path's segments. +---@field length number +---Name of file or directory this path points to (same as the last segment). +---@field name string +---True if the last segment of this path has an extension. +---@field hasextension boolean +---Extension of the last segment of this path. +---@field extension string +---Returns a new path that points to the root directory of this path's volume. +---@field root Path +---Returns a new path that points to this path's parent. This method will throw an exception if this path does not have a parent (its length is 0). +---@field parent Path +---:parameter path: `Path` path to check +---:return: `boolean` +--- +---Returns true if `path` is the parent of this path. +---@field isparent fun(path: Path): boolean +---:parameter name: `string` new path name +---:return: `Path` +--- +---Will return a new path with the value of the last segment of this path replaced (or added if there's none). +---@field changename fun(name: string): Path +---:parameter extension: `string` new path extension +---:return: `Path` +--- +---Will return a new path with the extension of the last segment of this path replaced (or added if there's none). +---@field changeextension fun(extension: string): Path +---:parameter name: `string` segments to add +---:return: `Path` +--- +---Returns a new path that represents the file or directory +---that would be reached by starting from this path and then +---appending the path elements given in the list. +--- +---e.g:: +--- +--- set p to path("0:/home"). +--- set p2 to p:combine("d1", "d2", "file.ks"). +--- print p2 +--- 0:/home/d1/d2/file.ks +---@field combine fun(...: any): Path + +---@class VolumeFile : VolumeItem +---:return: `FileContent` +--- +---Reads the content of the file. +---@field readall FileContent +---:return: `boolean` +--- +---Writes the given string or a `FileContent` to the file. Returns true if successful (lack of space on the `Volume` can cause a failure). +---@field write fun(String: any): boolean +---:return: `boolean` +--- +---Writes the given string followed by a newline to the file. Returns true if successful. +---@field writeln fun(string: string): boolean +---:return: None +--- +---Clears this file +---@field clear fun() + +---@class Connection : Structure +---True if the connection is opened and messages can be sent. +--- +---- For CPU connections: +--- - This will be true if the destination CPU belongs to the same vessel +--- as the current CPU, and will be false otherwise. +---- For Vessel connections: +--- - If you are using Stock KSP and chose the PermitAll connectivity +--- manager, then this will aways return true. +--- - If you are using Stock KSP and chose the CommNet connectivity +--- manager, then this will obey the rules of the stock CommNet system +--- for whether a connection path exists between the source and +--- destination vessel. +--- - If you are using the RemoteTech and chose the RemoteTech +--- connectivity manager, then this will obey the rules of the +--- RemoteTech mod for whether a connection path exists between the +--- source and destination vessel. +--- +---The connection has to be opened only in the moment of sending the message in order for it to arrive. If connection is lost after the message was sent, +---but before it arrives at its destination, this will have no effect on whether the message will reach its destination or not. +--- +---.. note:: +--- **Debris Vessels**: If you are using the KSP Stock CommNet system, +--- be aware that it never includes "debris" type vessels in the +--- communications network. ``ISCONNECTED`` will always be false +--- for any vessel of type "debris", no matter what antennas it +--- may have on it. +--- +--- .. note:: +--- **ISCONNECTION fails just after scene load**: If you have just loaded +--- the scene, such as after a vessel switch, then both the Stock CommNet +--- system and the RemoteTech mod often have a slight delay before they +--- "find" all the communication paths that exist. This means that +--- ISCONNECTION will often return ``False`` for the first second or two +--- after a scene load, even when the correct answer should be ``True``. +--- It will be unable to report the correct answer until a second or so +--- later after the communications paths have all been discovered by the +--- game. Because of this, if you have a boot script that depends on an +--- accurate answer for ISCONNECTED, it's a good idea for that boot +--- script to start with a short wait of a second or two at the top of +--- the script. +---@field isconnected boolean +---The number of seconds that it will take for messages sent using this connection to arrive at their destination. This value will be equal to -1 if connection is not opened. +--- +---- For CPU connections: +--- - This will be always equal to 0 if the destination CPU belongs +--- to the same vessel as the current CPU. Otherwise it will be +--- equal to -1 as no such connection is allowed. +---- For vessel connections: +--- - If you are using the PermitAll Connectivity Manager, then this +--- will always be zero, as messages arrive instantly. +--- - If you are using the stock CommNet Connectivirty Manager, then this +--- will always be zero, as stock CommNet does not impose any delay +--- from radio signals. +--- - If you are using the RemoteTech Connectivity Manager, then this +--- will report RemoteTech's signal delay along the path being used +--- to form the connection. RemoteTech calculates the number of +--- seconds of delay due radio signals traveling at the speed of light, +--- which can be quite significant when dealing with interplanetary +--- distances. +---@field delay number +---:parameter message: `any` +---:return: (`boolean`) true if the message was successfully sent. +--- +---Send a message using this connection. Any serializable structure or a primitive (`string`, `number` or `boolean`) can be given as an argument. +---It is always worth checking the return value of this function. A returned false value would indicate that the message was not sent for some reason. +---This method will fail to send the message and return false if :attr:`Connection:ISCONNECTED` is false. +---@field sendmessage fun(message: any): boolean +---:type: `Vessel` or `kOSProcessor` +--- +---Destination of this connection. Will be either a vessel or a processor. +---@field destination any + +---@class BuiltinDelegate : Delegate + +---@class List : Collection +---Returns a new list that contains the same thing as the old list. +---@field copy List +---:parameter item: (any type) item to be added +--- +---Appends the new value given to the end of the list. +---@field add fun(item: any) +---:parameter index: (integer) position in list (starting from zero) +---:parameter item: (any type) item to be added +--- +---Inserts a new value at the position given, pushing all the other values in the list (if any) one spot to the right. +---@field insert fun(index: number, item: any) +---:parameter index: (integer) position in list (starting from zero) +--- +---Remove the item from the list at the numeric index given, with counting starting at the first item being item zero +---@field remove fun(index: number) +---:parameter index: (integer) starting index (from zero) +---:parameter length: (integer) resulting length of returned `List` +---:return: `List` +--- +---Returns a new list that contains a subset of this list starting at the given index number, and running for the given length of items. +---@field sublist fun(index: number, length: number): List +---:parameter separator: (string) separator that will be inserted between the list items +---:return: `string` +--- +---Returns a string created by converting each element of the array to a string, separated by the given separator. +---@field join fun(separator: string): string +---This is just an alias for :meth:`FIND(item)`. +---@field indexof fun(item: any): number +---This is just an alias for :meth:`FIND(item)`. +---@field find fun(item: any): number +---This is just an alias for :meth:`FINDLAST(item)`. +---@field lastindexof fun(item: any): number +---This is just an alias for :meth:`FINDLAST(item)`. +---@field findlast fun(item: any): number + +---@class Boolean : Structure + +---@class NoDelegate : UserDelegate + +---@class Structure +---When issuing the command ``PRINT aaa.``, the variable ``aaa`` gets +---converted to a string and then the string is shown on the screen. +---This suffix universally lets you get that string version of any item, +---rather than showing it on the screen. +---@field tostring string +---:parameter name: `string` name of the suffix being tested for +---Given the name of a suffix, returns true if the object has a suffix +---by that name. For example, if you have a variable that might be a +---:struct:`vessel `, or might be a :struct:`Body `, +---then this example:: +--- +--- print thingy:hassuffix("maxthrust"). +--- +---would print ``True`` if ``thingy`` was a vessel of some sort, but +---``False`` if ``thingy`` was a body, because there exists a maxthrust +---suffix for vessels but not for bodies. +--- +---When searching for suffix names, the search is performed in a +---case-insensitive way. Kerboscript cannot distinguish ":AAA" +---and ":aaa" as being two different suffixes. In kerboscript, +---they'd be the same suffix. +--- +---(Note that because a `Lexicon` can use a special +---:ref:`Lexicon suffix syntax `, it will also +---return true for suffix-usable keys when you call its +---HASSUFFIX method.) +---@field hassuffix fun(name: string): boolean +---:type: :struct:`List ` of :struct:`strings ` +--- +---Returns a list of all the string names of the suffixes that can +---be used by the thing you call it on. As of this release, no +---information is shown about the parameters the suffix expects, or +---about the return value it gives. All you see is the suffix names. +--- +---If this object's type is inherited from other types (for example, a +---:struct:`Body ` is also a kind of :struct:`Orbitable `.) +---then what you see here contains the list of all the suffixes from the base +---type as well. (Therefore the suffixes described here on this very page +---always appear in the list for any type.) +--- +---Note, for some objects, like Vessels, this can be a rather long list. +--- +---The list is returned sorted in alphabetical order. +--- +---Example:: +--- +--- set v1 to V(12,41,0.1). // v1 is a vector +--- print v1:suffixnames. +--- List of 14 items: +--- [0] = DIRECTION +--- [1] = HASSUFFIX +--- [2] = ISSERIALIZABLE +--- [3] = ISTYPE +--- [4] = MAG +--- [5] = NORMALIZED +--- [6] = SQRMAGNITUDE +--- [7] = SUFFIXNAMES +--- [8] = TOSTRING +--- [9] = TYPENAME +--- [10] = VEC +--- [11] = X +--- [12] = Y +--- [13] = Z +--- +---(Note that because a `Lexicon` can use a special +---:ref:`Lexicon suffix syntax `, it will also +---include all of its suffix-usable keys when you call its +---SUFFIXNAMES method.) +---@field suffixnames List +---Not all types can be saved using the built-in serialization function +---:ref:`WRITEJSON `. For those that can, values of that +---type will return ``True`` for this suffix, otherwise it returns ``False``. +---@field isserializable boolean +---Gives the name of the type of the object, in kOS terminology. +--- +---Type names correspond to the types mentioned throughout these +---documentation pages, at the tops of the tables that list +---suffixes. +--- +---Examples:: +--- +--- set x to 1. +--- print x:typename +--- Scalar +--- +--- set x to 1.1. +--- print x:typename +--- Scalar +--- +--- set x to ship:parts[2]. +--- print x:typename +--- Part +--- +--- set x to Mun. +--- print x:typename +--- Body +--- +---The kOS types described in these documentaion pages correspond +---one-to-one with underlying types in the C# code the implements +---them. However they don't have the same name as the underlying +---C# names. This returns an abstraction of the C# name. There +---are a few places in the C# code where an error message will +---mention the C# type name instead of the kOS type name. This is +---an issue that might be resolved in a later release. +---@field typename string +---:Parameter name: string name of the type being checked for +---This is ``True`` if the value is of the type mentioned in the name, or +---if it is a type that is derived from the type mentioned in the name. +---Otherwise it is ``False``. +--- +---Example:: +--- +--- set x to SHIP. +--- print x:istype("Vessel"). +--- True +--- print x:istype("Orbitable"). +--- True +--- print x:istype("Structure"). +--- True. +--- print x:istype("Body"). +--- False +--- print x:istype("Vector"). +--- False +--- print x:istype("Some bogus type name that doesn't exist"). +--- False +--- +---The type name is searched in a case-insensitive way. +---@field istype fun(name: string): boolean +---Gives a string describing the typename of this value, and the +---typename of the type this value is inherited from, and the typename +---of the type that type is inherited from, etc all the way to +---this root type of ``Structure`` that all values share. +--- +---Example:: +--- +--- set x to SHIP. +--- print x:inheritance. +--- Vessel derived from Orbitable derived from Structure +--- +---(The kOS types described in that string are an abstraction of the +---underlying C# names in the mod's implementation, and a few of the +---C# types the mod uses to abstract a few things are skipped along +---the way, as they are types the script code can't see directly.) +---@field inheritance string + +---@class Iterator : Structure +---:returns: `boolean` +--- +---Call this to move the iterator to the next item in the list. Returns true if there is such an item, or false if no such item exists because it's already at the end of the list. +---@field next boolean +---Returns true if the iterator is at the end of the list and therefore cannot be "NEXTed", false otherwise. +---@field atend boolean +---:type: `number` (integer) +--- +---Returns the numerical index of how far you are into the list, starting the counting at 0 for the first item in the list. The last item in the list is numbered N-1, where N is the number of items in the list. +--- +---.. note:: +--- +--- If you have just created the ITERATOR, then the value of :attr:`Iterator:INDEX` is -1. It only becomes 0 after the first call to :meth:`Iterator:NEXT`. +---@field index number +---Returns the thing stored at the current position in the list. +---@field value any + +---@class Version : Structure +---@field major number +---@field minor number +---@field patch number +---@field build number + +---@class ConfigKey : Structure + +---@class Lexicon : Structure +---Removes all of the pairs from the lexicon. Making it empty. +---@field clear fun() +---Returns a List of the keys stored in this lexicon. +---@field keys List +---:parameter key: (any type) +---:return: `boolean` +--- +---Returns true if the lexicon contains the provided key +---@field haskey fun(key: any): boolean +---:parameter key: (any type) +---:return: `boolean` +--- +---Returns true if the lexicon contains the provided value +---@field hasvalue fun(key: any): boolean +---Returns a List of the values stored in this lexicon. +---@field values List +---Returns a new lexicon that contains the same set of pairs as this lexicon. +---Note that this is a "shallow" copy, meaning that if there is a value in +---the list that refers to, for example, another Lexicon, or a Vessel, or +---a Part, the new copy will still be referring to the same object as the +---original copy in that value. +---@field copy Lexicon +---Returns the number of pairs in the lexicon. +---@field length number +---:parameter key: the keyvalue of the pair to be removed +--- +---Remove the pair with the given key from the lexicon. +---@field remove fun(key: any): boolean +---:parameter key: (any type) a unique key +---:parameter value: (any type) a value that is to be associated to the key +--- +---Adds an additional pair to the lexicon. +---@field add fun(key: any, value: any) +---Returns a string containing a verbose dump of the lexicon's contents. +--- +---The difference between a DUMP and just the normal printing of a +---Lexicon is in whether or not it recursively shows you the contents +---of every complex object inside the Lexicon. +--- +---i.e:: +--- +--- // Just gives a shallow list: +--- print mylexicon. +--- +--- // Walks the entire tree of contents, descending down into +--- // any Lists or Lexicons that are stored inside this Lexicon: +--- print mylexicon:dump. +---@field dump string +---Settable. +---The case sensitivity behaviour of the lexicon when the keys are strings. +---By default, all kerboscript lexicons use case-insensitive keys, at +---least for those keys that are string types, meaning that +---mylexicon["AAA"] means the same exact thing as mylexicon["aaa"]. If +---you do not want this behaviour, and instead want the key "AAA" to be +---different from the key "aaa", you can set this value to true. +--- +---Be aware, however, that if you change this, it has the side effect +---of *clearing out* the entire contents of the lexicon. This is done so +---as to avoid any potential clashes when the rules about what constitutes +---a duplicate key changed after the lexicon was already populated. +---Therefore you should probably only set this on a brand new lexicon, +---right after you've created it, and never change it after that. +---@field casesensitive boolean +---Settable. +---The case sensitivity behaviour of the lexicon when the keys are strings. +---By default, all kerboscript lexicons use case-insensitive keys, at +---least for those keys that are string types, meaning that +---mylexicon["AAA"] means the same exact thing as mylexicon["aaa"]. If +---you do not want this behaviour, and instead want the key "AAA" to be +---different from the key "aaa", you can set this value to true. +--- +---Be aware, however, that if you change this, it has the side effect +---of *clearing out* the entire contents of the lexicon. This is done so +---as to avoid any potential clashes when the rules about what constitutes +---a duplicate key changed after the lexicon was already populated. +---Therefore you should probably only set this on a brand new lexicon, +---right after you've created it, and never change it after that. +---@field case boolean + +---@class Terminal : Structure +---Settable. +---If you read the height it will return a number of character cells tall the terminal +---is. If you set this value, it will cause the terminal to resize. +---If there's multiple terminals connected to the same CPU part via telnet clients, +---then kOS will attempt to keep them all the same size, and one terminal being resized +---will resize them all. (caveat: Some terminal types cannot be resized from the +---server side, and therefore this doesn't always work in both directions). +--- +---This setting is different per kOS CPU part. Different terminal +---windows can have different settings for this value. +---@field height number +---Settable. +---If you read the width it will return a number of character cells wide the terminal +---is. If you set this value, it will cause the terminal to resize. +---If there's multiple terminals connected to the same CPU part via telnet clients, +---then kOS will attempt to keep them all the same size, and one terminal being resized +---will resize them all. (caveat: Some terminal types cannot be resized from the +---server side, and therefore this doesn't always work in both directions). +--- +---This setting is different per kOS CPU part. Different terminal +---windows can have different settings for this value. +---@field width number +---Settable. +---If true, then the terminal window is currently set to show +---the whole screen in reversed color - swapping the background +---and foreground colors. Both the telnet terminals and the in-game +---GUI terminal respond to this setting equally. +--- +---Note, this setting can also be toggled with a radio-button on the +---in-game GUI terminal window. +--- +---This setting is different per kOS CPU part. Different terminal +---windows can have different settings for this value. +---@field reverse boolean +---Settable. +---If true, then the terminal window is currently set to show any +---BEEP characters by silently flashing the screen for a moment +---(inverting the background/foreground for a fraction of a second), +---instead of making a sound. +--- +---Note, this setting can also be toggled with a radio-button on the +---in-game GUI terminal window. +--- +---This will only typically affect the in-game GUI terminal window, +---and **not a telnet client's** terminal window. +--- +---To affect the window you are using in a telnet session, you will +---have to use whatever your terminal or terminal emulator's local +---settings panel has for it. Most do have some sort of visual +---beep setting, but it is usually not settable via a control character +---sequence sent across the connection. The terminals are designed to +---assume it's a local user preference that isn't overridable +---by the software you are running. +--- +---This setting is different per kOS CPU part. Different terminal +---windows can have different settings for this value. +---@field visualbeep boolean +---Settable. +---The same thing as the brightness slider on the terminal GUI. +---The values range from 0.0 (minimum) to 1.0 (maximum). At +---zero, the effect is to entirely hide the letters altogether. +---@field brightness number +---Settable. +---Width of a character cell in the display terminal, in pixels. +--- +---Please note that this value is not settable anymore. It +---can only be changed as a side-effect of changing the +---:attr:`CHARHEIGHT`. This is because the font is in +---charge of choosing the ratio between a letter's height and +---its width. You can't force the font to render a letter +---at a different aspect ratio than it wants to. +---@field charwidth number +---Settable. +---Height of a character cell in the display terminal, in pixels. +---The value is forced to remain in the range [4..24] and be +---divisible by 2. If you try to set it to any other value, it +---will snap to the allowed range and increment. +---@field charheight number +---@field resizewatchers UniqueSet +---This gives you a `TerminalInput` structure, which can be +---used to read user's input into the kOS terminal. +---@field input TerminalInput + +---@class Delegate : Structure +---@field call fun(...: any): any +---@field bind fun(...: any): Delegate +---@field isdead boolean + +---@class Constant : Structure +---Newton's Gravitational Constant that the game's planetary +---bodies are implying in their configuration data. +---(6.67384E-11 as of the last update to these documents). +--- +---Note, the stock KSP game never technically records a value +---for G in its data. kOS derives this value by calculating it +---based on the Sun's Mass and its Gravitational Parameter. It +---is possible for a mod (or perhaps a future release of KSP, if +---mistakes were made) to define a universe in which Newton's +---Gravitational Constant, G, isn't actually constant at all +---within that game universe, and instead varies from one sphere +---of influence to the next. Such a universe would be breaking +---some laws of physics by a lot, but it is technically possible +---in the game's data model. Due to this strange feature in +---the game's data model, it is probably safer to always have +---your scripts use the body's Mu in your formulas instead of +---explicitly doing mass*G to derive it. +--- +---Do NOT confuse this with ``Constant:g0`` below. +--- +---Example:: +--- +--- PRINT "Gravitational parameter of Kerbin, calculated:". +--- PRINT constant:G * Kerbin:Mass. +--- PRINT "Gravitational parameter of Kerbin, hardcoded:". +--- PRINT Kerbin:Mu. +--- PRINT "The above two numbers had *better* agree.". +--- PRINT "If they do not, then your solar system is badly configured.". +---@field g number +---Standard value the game uses for acceleration due to +---gravity at sea level on Earth. (9.80655 m/s^2 as +---of the last update to these documents). +--- +---Do NOT confuse this with ``Constant:G`` above. +--- +---The place where this matters the most is in ISP +---calculations. The rocket equation using ISP +---contains an inherent conversion from mass to weight +---that basically means, "what would this mass of fuel +---have weighed at g0?". Some kind of official standard +---value of g0 is needed to use ISP properly to predict +---how much fuel will be burned in a scenario. +--- +---In pretty much any other calculation you do in your kOS +---scripts, other than when using ISP in the Rocketry Equation, +---you should probably not use g0 and instead calculate your +---local gravity more precisely based on your actual radius to +---the body center. Not only because this is more accurate, but +---because the g0 you see here is NOT the g0 you would actually +---have on Kerbin's sea level. It's the g0 on Earth, which is +---what the game's ISP numbers are using. Kerbin's sea level +---g0 is ever so slightly different from Earth's g0 (but not +---by much.) +--- +---:: +--- +--- PRINT "Gravitational parameter of Kerbin is:". +--- PRINT constant:G * Kerbin:Mass. +---@field g0 number +---Natural Log base "e":: +--- +--- PRINT "e^2 is:". +--- PRINT constant:e ^ 2. +---@field e number +---Ratio of circumference of a circle to its diameter, 3.14159265... +--- +---:: +--- +--- SET diameter to 10. +--- PRINT "circumference is:". +--- PRINT constant:pi * diameter. +---@field pi number +---Speed of light in a vacuum, in meters per second. +--- +---:: +--- +--- SET speed to SHIP:VELOCITY:ORBIT:MAG. +--- SET percentOfLight to (speed / constant:c) * 100. +--- PRINT "We're going " + percentOfLight + "% of lightspeed!". +--- +---.. note:: +--- In Kerbal Space Program, all physics motion is purely Newtonian. +--- You can go faster than the speed of light provided you have enough +--- delta-V, and no time dilation effects will occur. The universe +--- will behave entirely linearly even at speeds near *c*. +--- +---This constant is provided mainly for the benefit of people who are +---playing with the mod "RemoteTech" installed, who may want to perform +---calculations about signal delays to hypothetical probes. (Note that +---if the probe already has a connection, you can +---:ref:`ask Remotetech directly ` what the signal delay is. +---@field c number +---A conversion constant. +--- +---If you have a pressure measurement expressed in atmospheres of pressure, +---you can multiply it by this to get the equivalent in kiloPascals +---(kiloNewtons per square meter). +--- +---:: +--- +--- PRINT "1 atm is:". +--- PRINT 1 * constant:AtmToKPa + " kPa.". +---@field atmtokpa number +---A conversion constant. +--- +---If you have a pressure measurement expressed in kiloPascals (kiloNewtons +---per square meter), you can multiply it by this to get the equivalent +---in atmospheres. +--- +---:: +--- +--- PRINT "100 kPa is:". +--- PRINT 100 * constant:KPaToATM + " atmospheres". +---@field kpatoatm number +---A conversion constant. +--- +---If you have an angle measured in degrees, you can multiply it by +---this to get the equivalent measure in radians. It is exactly +---the same thing as saying ``constant:pi / 180``, except the result is +---pre-recorded as a constant number and thus no division is performed +---at runtime. +--- +---:: +--- +--- PRINT "A right angle is:". +--- PRINT 90 * constant:DegToRad + " radians". +---@field degtorad number +---A conversion constant. +--- +---If you have an angle measured in radians, you can multiply it by +---this to get the equivalent measure in degrees. It is exactly +---the same thing as saying ``180 / constant:pi``, except the result is +---pre-recorded as a constant number and thus no division is performed +---at runtime. +--- +---:: +--- +--- PRINT "A radian is:". +--- PRINT 1 * constant:RadToDeg + " degrees". +---@field radtodeg number +---Avogadro's Constant. +--- +---This value can be used in calculating atmospheric properties for drag purposes, +---which can be a rather advanced topic. +---`(Avogadro's constant Wikipedia Page) `_. +---@field avogadro number +---Boltzmann Constant. +--- +---This value can be used in calculating atmospheric properties for drag purposes, +---which can be a rather advanced topic. +---`(Boltzmann constant Wikipedia Page) `_. +---@field boltzmann number +---Ideal Gas Constant. +--- +---This value can be used in calculating atmospheric properties for drag purposes, +---which can be a rather advanced topic. +---`(Ideal Gas Constant Wikipedia Page) `_. +---@field idealgas number + +---@class TerminalInput : Structure +---:return: `string` +--- +---Read the next character of terminal input. If the user hasn't typed +---anything in that is still waiting to be read, then this will "block" +---(meaning it will pause the execution of the program) until there +---is a character that has been typed that can be processed. +--- +---The character will be expressed in a string containing 1 char. +--- +---If you need to check against "unprintable" characters such as +---backspace (control-H) and so on, you can do so with the +---:func:`unchar` function, or by using the aliases described elsewhere +---in this structure. +---@field getchar string +---True if there is at least 1 character of input waiting. If this is +---false then that would mean that an attempt to call :meth:`GETCHAR` +---would block and wait for user input. If this is true then an attempt +---to call :meth:`GETCHAR` would return immediately with an answer. +--- +---You can simulate non-blocking I/O like so:: +--- +--- // Read a char if it exists, else just keep going: +--- if terminal:input:haschar { +--- process_one_char(terminal:input:getchar()). +--- } +---@field haschar boolean +---:return: None +--- +---Call this method to throw away all waiting input characters, flushing +---the input queue. +---@field clear fun() +---@field code string +---@field tostring string +---A string for testing if the character read is a backspace. +---@field backspace string +---A string for testing if the character read is the return key. +---@field return string +---A string for testing if the character read is the return key. +---@field enter string + +---@class Queue : Enumerable +---Returns a new queue that contains the same thing as the old one. +---@field copy Queue +---:parameter item: (any type) item to be added +--- +---Adds the item to the end of the queue. +---@field push fun(item: any) +---Returns the item in the front of the queue and removes it. +---@field pop fun(): any +---Returns the item in the front of the queue without removing it. +---@field peek fun(): any +---Removes all elements from the queue. +---@field clear fun() + +---@class Enumerable : Structure +---An alternate means of iterating over an enumerable. See: `Iterator`. +---@field iterator Iterator +---An alternate means of iterating over an enumerable. Order of items is reversed. See: `Iterator`. +---@field reverseiterator Iterator +---Returns the number of elements in the enumerable. +---@field length number +---:parameter item: element whose presence in the enumerable should be checked +---:return: `boolean` +--- +---Returns true if the enumerable contains an item equal to the one passed as an argument +---@field contains fun(item: any): boolean +---Returns true if the enumerable has zero items in it. +---@field empty boolean +---Returns a string containing a verbose dump of the enumerable's contents. +---@field dump string + +---@class UniqueSet : Collection +---Returns a new set that contains the same thing as the old set. +---@field copy UniqueSet +---:parameter item: (any type) item to be added +--- +---Appends the new value given. +---@field add fun(item: any) +---:parameter item: (any type) item to be removed +--- +---Remove the item from the set. +---@field remove fun(item: any): boolean + +---@class UserDelegate : Delegate + +---@class Scalar : Structure + +---@class Range : Enumerable +---Returns the initial element of the range. Must be a round number. +---@field start number +---Returns the range limit. Must be a round number. +---@field stop number +---Returns the step size. Must be a round number. +---@field step number + +---@class PIDLoop : Structure +---The value representing the time of the last sample. This value is equal to the time parameter of the :meth:`UPDATE` method. +---@field lastsampletime number +---Settable. +---The proportional gain factor. +---@field kp number +---Settable. +---The integral gain factor. +---@field ki number +---Settable. +---The derivative gain factor. +---@field kd number +---The value representing the input of the last sample. This value is equal to the input parameter of the :meth:`UPDATE` method. +---@field input number +---Settable. +---The current setpoint. This is the value to which input is compared when :meth:`UPDATE` is called. It may not be synced with the last sample. +--- +---It is desirable to use :attr:`SETPOINT` for the +---:ref:`reasons described above `. +---@field setpoint number +---The calculated error from the last sample (setpoint - input). +---@field error number +---The calculated output from the last sample. +---@field output number +---Settable. +---The current maximum output value. This value also helps with regulating integral wind up mitigation. +---@field maxoutput number +---Settable. +---The current minimum output value. This value also helps with regulating integral wind up mitigation. +---@field minoutput number +---Settable. +---This is just an alias that is the same thing as :attr:`EPSILON`. +---@field ignoreerror number +---Settable. +---This is just an alias that is the same thing as :attr:`EPSILON`. +---@field epsilon number +---The value representing the time weighted sum of all errrors. It will be equal to :attr:`ITERM` / :attr:`KI`. This value is adjusted by the integral windup mitigation logic. +---@field errorsum number +---The value representing the proportional component of :attr:`OUTPUT`. +---@field pterm number +---The value representing the integral component of :attr:`OUTPUT`. This value is adjusted by the integral windup mitigation logic. +---@field iterm number +---The value representing the derivative component of :attr:`OUTPUT`. +---@field dterm number +---The rate of change of the :attr:`INPUT` during the last sample. It will be equal to (input - last input) / (change in time). +---@field changerate number +---:return: none +--- +---Call this method to clear the :attr:`ERRORSUM`, :attr:`ITERM`, and :attr:`LASTSAMPLETIME` components of the PID calculation. +---@field reset fun() +---:parameter time: (`number`) the decimal time in seconds +---:parameter input: (`number`) the input variable to compare to the setpoint +---:return: `number` representing the calculated output +--- +---Upon calling this method, the PIDLoop will calculate the output based on this this basic framework (see below for detailed derivation): output = error * kp + errorsum * ki + (change in input) / (change in time) * kd. This method is usually called with the current time in seconds (`TIME:SECONDS`), however it may be called using whatever rate measurement you prefer. Windup mitigation is included, based on :attr:`MAXOUTPUT` and :attr:`MINOUTPUT`. Both integral components and derivative components are guarded against a change in time greater than 1s, and will not be calculated on the first iteration. +---@field update fun(time: number, input: number): number + +---@class Stack : Enumerable +---Returns a new stack that contains the same thing as the old one. +---@field copy Stack +---:parameter item: (any type) item to be added +--- +---Adds the item to the top of the stack. +---@field push fun(item: any) +---Returns the item on top of the stack and removes it. +---@field pop fun(): any +---Returns the item on top of the stack without removing it. +---@field peek fun(): any +---Removes all elements from the stack. +---@field clear fun() + +---@class String : Structure +---:type: `number` (integer) +--- +---Number of characters in the string +---@field length number +---:parameter start: `number` (integer) starting index (from zero) +---:parameter count: `number` (integer) resulting length of returned `string` +---:return: `string` +--- +---Returns a new string with the given count of characters from this string starting from the given start position. +---@field substring fun(start: number, count: number): string +---:parameter string: `string` to look for +---True if the given string is contained within this string. +---@field contains fun(string: string): boolean +---:parameter string: `string` to look for +---True if this string ends with the given string. +---@field endswith fun(string: string): boolean +---:parameter string: `string` to look for +---:parameter startAt: `number` (integer) index to start searching at +---Returns the index of the first occurrence of the given string in this string (starting from startAt). +--- +---If the ``string`` passed in is not found, this returns -1. +--- +---If the ``string`` passed in is the empty string ``""``, this always claims to have +---successfully "found" that empty string at the start of the search. +---@field findat fun(string: string, startAt: number): number +---:parameter index: `number` (integer) index to add the string at +---:parameter string: `string` to insert +---Returns a new string with the given string inserted at the given index into this string +---@field insert fun(index: number, string: string): string +---:parameter string: `string` to look for +---:parameter startAt: `number` (integer) index to start searching at +---Returns the index of the last occurrence of the given string in this string (starting from startAt) +--- +---If the ``string`` passed in is not found, this returns -1. +--- +---If the ``string`` passed in is the empty string ``""``, this always claims to have +---successfully "found" that empty string at the beginning of the search. +---@field findlastat fun(string: string, startAt: number): number +---:parameter width: `number` (integer) number of characters the resulting string will contain +---Returns a new right-aligned version of this string padded to the given width by spaces. +---@field padleft fun(width: number): string +---:parameter width: `number` (integer) number of characters the resulting string will contain +---Returns a new left-aligned version of this string padded to the given width by spaces. +---@field padright fun(width: number): string +---:parameter index: `number` (integer) position of the string from which characters will be removed from the resulting string +---:parameter count: `number` (integer) number of characters that will be removing from the resulting string +---Returns a new string out of this string with the given count of characters removed starting at the given index. +---@field remove fun(index: number, count: number): string +---:parameter oldString: `string` to search for +---:parameter newString: `string` that all occurances of oldString will be replaced with +---Returns a new string out of this string with any occurrences of oldString replaced with newString. +---@field replace fun(oldString: string, newString: string): string +---:parameter separator: `string` delimiter on which this string will be split +---:return: `List` +--- +---Breaks this string up into a list of smaller strings on each occurrence of the given separator. This will return a +---list of strings, none of which will contain the separator character(s). +---@field split fun(separator: string): List +---:parameter string: `string` to look for +---True if this string starts with the given string . +---@field startswith fun(string: string): boolean +---Returns a new string with all characters in this string replaced with their lower case versions +---@field tolower string +---Returns a new string with all characters in this string replaced with their upper case versions +---@field toupper string +---returns a new string with no leading or trailing whitespace +---@field trim string +---returns a new string with no trailing whitespace +---@field trimend string +---returns a new string with no leading whitespace +---@field trimstart string +---:parameter pattern: `string` pattern to be matched against the string +---True if the string matches the given pattern (regular expression). The match is not anchored to neither the start nor the end of the string. +---That means that pattern ``"foo"`` will match ``"foobar"``, ``"barfoo"`` and ``"barfoobar"`` too. If you want to match from the start, +---you have to explicitly specify the start of the string in the pattern, i.e. for example to match strings starting with ``"foo"`` you need to +---use the pattern ``"^foo"`` (or equivalently ``"^foo.*"`` or even ``"^foo.*$"``). +--- +---Regular expressions are beyond the scope of this documentation. For reference see `Regular Expression Language - Quick Reference `__\ . +---@field matchespattern fun(pattern: string): boolean +---:parameter defaultIfError: (optional argument) `number` to return as a default value if the string format is in error. +---:return: `number` +--- +---Returns the numeric version of the string, as a number that can be used +---for mathematics or anywhere a `number` is expected. If the +---string is not in a format that kOS is able to convert into a number, then +---the value ``defaultIfError`` is returned instead. You can use this to +---either select a sane default, or to deliberately select a value you +---never expect to get in normal circumstances so you can use it as a +---test to see if the string was formatted well. +--- +---The argument ``defaultIfError`` is optional. If it is left off, then +---when there is a problem in the format of the string, you will get +---an error that stops the script instead of returning a value. +--- +---The valid understood format allows an optional leading sign, +---a decimal point with fractional part, and scientific notation +---using "e" as in "1.23e3" for "1230" or "1.23e-3" for "0.00123". +--- +---You may also include optional underscores in the string to +---help space groups of digits, and they will be ignored. +---(For example you may write "one thousand" as "1_000" instead +---of as "1000" if you like".) +--- +---Example - using with math:: +--- +--- set str to "16.8". +--- print "half of " + str + " is " + str:tonumber() / 2. +--- half of 16.8 is 8.4 +--- +---Example - checking for bad values by using defaultIfError:: +--- +--- set str to "Garbage 123 that is not a proper number". +--- set val to str:tonumber(-9999). +--- if val = -9999 { +--- print "that string isn't a number". +--- } else { +--- print "the string is a number: " + val. +--- } +--- +---Example - not setting a default value can throw an error:: +--- +--- set str to "Garbage". +--- set val to str:tonumber(). // the script dies with error here. +--- print "value is " + val. // the script never gets this far. +---@field tonumber fun(...: any): number +---:parameter defaultIfError: (optional argument) `number` to return as a default value if the string format is in error. +---:return: `number` +--- +---Returns the numeric version of the string, as a number that can be used +---for mathematics or anywhere a `number` is expected. If the +---string is not in a format that kOS is able to convert into a number, then +---the value ``defaultIfError`` is returned instead. You can use this to +---either select a sane default, or to deliberately select a value you +---never expect to get in normal circumstances so you can use it as a +---test to see if the string was formatted well. +--- +---The argument ``defaultIfError`` is optional. If it is left off, then +---when there is a problem in the format of the string, you will get +---an error that stops the script instead of returning a value. +--- +---The valid understood format allows an optional leading sign, +---a decimal point with fractional part, and scientific notation +---using "e" as in "1.23e3" for "1230" or "1.23e-3" for "0.00123". +--- +---You may also include optional underscores in the string to +---help space groups of digits, and they will be ignored. +---(For example you may write "one thousand" as "1_000" instead +---of as "1000" if you like".) +--- +---Example - using with math:: +--- +--- set str to "16.8". +--- print "half of " + str + " is " + str:tonumber() / 2. +--- half of 16.8 is 8.4 +--- +---Example - checking for bad values by using defaultIfError:: +--- +--- set str to "Garbage 123 that is not a proper number". +--- set val to str:tonumber(-9999). +--- if val = -9999 { +--- print "that string isn't a number". +--- } else { +--- print "the string is a number: " + val. +--- } +--- +---Example - not setting a default value can throw an error:: +--- +--- set str to "Garbage". +--- set val to str:tonumber(). // the script dies with error here. +--- print "value is " + val. // the script never gets this far. +---@field toscalar fun(...: any): number +---@field format fun(...: any): string +---Alias for FIND(string) +---@field indexof fun(string: string): number +---Alias for FIND(string) +---@field find fun(string: string): number +---Alias for FINDLAST(string) +---@field lastindexof fun(string: string): number +---Alias for FINDLAST(string) +---@field findlast fun(string: string): number +---An alternate means of iterating over a string's characters +---(See: `Iterator`). +--- +---For most programs you won't have to use this directly. It's just +---what enables you to use a string with a FOR loop to get access +---to its characters one at a time. +---@field iterator Iterator + +---@class Collection : Enumerable +---@field clear fun() + diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua new file mode 100644 index 0000000000..33b535749e --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua @@ -0,0 +1,1004 @@ +---Get/Set. +---:type: Action Group, `boolean` +--- +---Turns the SAS **on** or **off**, like using ``T`` at the keybaord:: +--- +--- SAS ON. // same as SET SAS TO TRUE. +--- SAS OFF. // same as SET SAS TO FALSE. +--- PRINT SAS. // prints either "True" or "False". +--- +---.. warning:: +--- +--- Be aware that having KSP's ``SAS`` turned on *will* conflict +--- with using "cooked control" (the ``lock steering`` command). You +--- should not use these two modes of steering control at the same time. +--- For further information see the +--- :ref:`warning in lock steering documentation`. +---@type boolean +sas = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Deploys or retracts the landing gear, like using the ``G`` key at the keyboard:: +--- +--- GEAR ON. +---@type boolean +gear = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Deploys or retracts all the landing legs (but not wheeled landing gear):: +--- +--- LEGS ON. +--- +---Returns true if all the legs are deployed. +---@type boolean +legs = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Deploys all the parachutes (only `ON` command has effect):: +--- +--- CHUTES ON. +--- +---Returns true if all the chutes are deployed. +---@type boolean +chutes = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Deploys all the parachutes than can be safely deployed in the current conditions (only `ON` command has effect):: +--- +--- CHUTESSAFE ON. +--- +---Returns false only if there are disarmed parachutes chutes which may be safely +---deployed, and true if all safe parachutes are already deployed including +---any time where there are no safe parachutes. +--- +---The following code will gradually deploy all the chutes as the speed drops:: +--- +--- WHEN (NOT CHUTESSAFE) THEN { +--- CHUTESSAFE ON. +--- RETURN (NOT CHUTES). +---} +---@type boolean +chutessafe = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Turns the lights **on** or **off**, like using the ``U`` key at the keyboard:: +--- +--- LIGHTS ON. +---@type boolean +lights = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Extends or retracts all the deployable solar panels:: +--- +--- PANELS ON. +--- +---Returns true if all the panels are extended, including those inside of +---fairings or cargo bays. +--- +---.. note:: +--- Some solar panels can't be retracted once deployed. Consult the part's +--- description for details. +---@type boolean +panels = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Extends or retracts all the deployable radiators and activates or deactivates all the fixed ones:: +--- +--- RADIATORS ON. +--- +---Returns true if all the radiators are extended (if deployable) and active. +---@type boolean +radiators = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Extends or retracts all the extendable ladders:: +--- +--- LADDERS ON. +--- +---Returns true if all the ladders are extended. +---@type boolean +ladders = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Opens or closes all the payload and service bays (including the cargo ramp):: +--- +--- BAYS ON. +--- +---Returns true if at least one bay is open. +---@type boolean +bays = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Deploys or retracts all the mining drills:: +--- +--- DEPLOYDRILLS ON. +--- +---Returns true if all the drills are deployed. +---@type boolean +deploydrills = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Activates (has effect only on drills that are deployed and in contact with minable surface) or stops all the mining drills:: +--- +--- DRILLS ON. +--- +---Returns true if at least one drill is actually mining. +---@type boolean +drills = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Activates or deactivates all the fuel cells (distingushed from other conveters by converter/action names):: +--- +--- FUELCELLS ON. +--- +---Returns true if at least one fuel cell is activated. +---@type boolean +fuelcells = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Activates or deactivates all the ISRU converters (distingushed from other conveters by converter/action names):: +--- +--- ISRU ON. +--- +---Returns true if at least one ISRU converter is activated. +---@type boolean +isru = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Opens or closes all the air intakes:: +--- +--- INTAKES ON. +--- +---Returns true if all the intakes are open. +---@type boolean +intakes = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Turns the brakes **on** or **off**, like clicking the brakes button, though *not* like using the ``B`` key, because they stay on:: +--- +--- BRAKES ON. +---@type boolean +brakes = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Turns the RCS **on** or **off**, like using ``R`` at the keyboard:: +--- +--- RCS ON. // same as SET RCS TO TRUE. +--- RCS OFF. // same as SET RCS TO FALSE. +--- PRINT RCS. // prints either "True" or "False". +---@type boolean +rcs = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---Abort action group (no actions are automatically assigned, configurable in the editor), like using the ``Backspace`` key at the keyboard:: +--- +--- ABORT ON. +---@type boolean +abort = nil + +---Get/Set. +---:type: Action Group, `boolean` +--- +---10 custom action groups (no actions are automatically assigned, configurable in the editor), like using the numeric keys at the keyboard:: +--- +--- AG1 ON. +--- AG4 OFF. +--- SET AG10 to AG3. +---@type boolean +ag1 = nil + +---Get/Set. +---@type boolean +ag2 = nil + +---Get/Set. +---@type boolean +ag3 = nil + +---Get/Set. +---@type boolean +ag4 = nil + +---Get/Set. +---@type boolean +ag5 = nil + +---Get/Set. +---@type boolean +ag6 = nil + +---Get/Set. +---@type boolean +ag7 = nil + +---Get/Set. +---@type boolean +ag8 = nil + +---Get/Set. +---@type boolean +ag9 = nil + +---Get/Set. +---@type boolean +ag10 = nil + +---Get only. +---@type RBGA +white = nil + +---Get only. +---@type RBGA +black = nil + +---Get only. +---@type RBGA +red = nil + +---Get only. +---@type RBGA +green = nil + +---Get only. +---@type RBGA +blue = nil + +---Get only. +---@type RBGA +yellow = nil + +---Get only. +---@type RBGA +cyan = nil + +---Get only. +---@type RBGA +magenta = nil + +---Get only. +---@type RBGA +purple = nil + +---Get only. +---@type RBGA +grey = nil + +---Get only. +---@type RBGA +gray = nil + +---Get only. +---Returns amount of time, in seconds, from vessel load +---@type number +sessiontime = nil + +---Get only. +---@type Terminal +terminal = nil + +---Get only. +---@type Kuniverse +kuniverse = nil + +---Get only. +---Returns a `Connection` representing the :ref:`CPU Vessel's` +---communication line to a network "home" node. This home node may be the KSC +---ground station, or other ground stations added by the CommNet settings or +---RemoteTech. Functionally, this connection may be used to determine if the +---archive volume is accessible. +--- +---.. warning:: +--- +--- Attempting to send a message to the "home" connection will result in an +--- error message. While this connection uses the same structure as when +--- sending inter-vessel and inter-processor messages, message support is +--- not included. +---@type Connection +homeconnection = nil + +---Get only. +---Returns a `Connection` representing the :ref:`CPU Vessel's` +---communication line to a control source. This may be the same as the +---:global:`HOMECONNECTION`, or it may represent a local crewed command pod, +---or it may represent a connection to a control station. When using the +---``CommNetConnectivityManager`` this should show as connected whenever a vessel +---has partial manned control, or full control. Functionally this may be used +---to determine if terminal input is available, and what the potential signal +---delay may be for this input. +--- +---.. warning:: +--- +--- Attempting to send a message to the "control" connection will result in +--- an error message. While this connection uses the same structure as when +--- sending inter-vessel and inter-processor messages, message support is +--- not included. +---@type Connection +controlconnection = nil + +---Get/Set. +---This is identical to :attr:`MODE` above. +---:: +--- +--- // These two do the same thing: +--- SET WARPMODE TO "PHYSICS". +--- SET KUNIVERSE:TIMEWARP:MODE TO "PHYSICS". +--- +--- // These two do the same thing: +--- SET WARPMODE TO "RAILS". +--- SET KUNIVERSE:TIMEWARP:MODE TO "RAILS". +---@type string | "physics" | "rails" +warpmode = nil + +---Get/Set. +---This is identical to :attr:`WARP` above. +---:: +--- +--- // These do the same thing: +--- SET WARP TO 3. +--- SET KUNIVERSE:TIMEWARP:WARP to 3. +---@type number +warp = nil + +---Get/Set. +---A variable that controls or queries whether or not the game is in map view:: +--- +--- IF MAPVIEW { +--- PRINT "You are looking at the map.". +---} ELSE { +--- PRINT "You are looking at the flight view.". +---}. +--- +---You can switch between map and flight views by setting this variable:: +--- +---SET MAPVIEW TO TRUE. // to map view +---SET MAPVIEW TO FALSE. // to flight view +---@type boolean +mapview = nil + +---Get only. +---@type Constant +constant = nil + +---Get only. +---Returns operating system version number. e.g. 0.1.2.3 +---@type string +version = nil + +---Get only. +---Gives the Prime Meridian `Vector` for the Solar System itself, in +---current Ship-Raw XYZ coordinates. +--- +---Both the :attr:`Orbit:LONGITUDEOFASCENDINGNODE` orbit suffix and the +---:attr:`Body:ROTATIONANGLE` body suffix are expressed in terms of +---degree offsets from this *Prime Meridian Reference Vector*. +---@type Vector +solarprimevector = nil + +---Get only. +---Get-only. ``archive`` returns a `Volume` structure referring to the archive. +---You can read more about what archive is on the :ref:`File & volumes ` page. +---@type Volume +archive = nil + +---Get/Set. +---@type number +THROTTLE = nil + +---Get/Set. +---@type Vector | Direction | string +STEERING = nil + +---Get/Set. +---@type GeoCoordinates | Vessel | number +WHEELSTEERING = nil + +---Get/Set. +---@type number +WHEELTHROTTLE = nil + +---Get/Set. +---.. object:: SASMODE +--- +---Getting this variable will return the currently selected SAS mode. Where ``value`` is one of the valid strings listed below, this will set the stock SAS mode for the cpu vessel:: +--- +--- SET SASMODE TO value. +--- +---It is the equivalent to clicking on the buttons next to the nav ball while manually piloting the craft, and will respect the current mode of the nav ball (orbital, surface, or target velocity - use NAVMODE to read or set it). Valid strings for ``value`` are ``"PROGRADE"``, ``"RETROGRADE"``, ``"NORMAL"``, ``"ANTINORMAL"``, ``"RADIALOUT"``, ``"RADIALIN"``, ``"TARGET"``, ``"ANTITARGET"``, ``"MANEUVER"``, ``"STABILITYASSIST"``, and ``"STABILITY"``. A null or empty string will default to stability assist mode, however any other invalid string will throw an exception. This feature will respect career mode limitations, and will throw an exception if the current vessel is not able to use the mode passed to the command. An exception is also thrown if ``"TARGET"`` or ``"ANTITARGET"`` are used when no target is set. +--- +---.. note:: +--- SAS mode is reset to stability assist when toggling SAS on, however it doesn't happen immediately. +--- Therefore, after activating SAS, you'll have to skip a frame before setting the SAS mode. +--- Velocity-related modes also reset back to stability assist when the velocity gets too low. +--- +---.. warning:: SASMODE does not work with RemoteTech +--- +--- Due to the way that RemoteTech disables flight control input, the built in SAS modes do not function properly when there is no connection to the KSC or a Command Center. If you are writing scripts for use with RemoteTech, make sure to take this into account. +--- +---.. warning:: SASMODE should not be used with LOCK STEERING +--- +--- Be aware that having KSP's ``SAS`` turned on *will* conflict +--- with using "cooked control" (the ``lock steering`` command). You +--- should not use these two modes of steering control at the same time. +--- For further information see the +--- :ref:`warning in lock steering documentation`. +---@type string | "maneuver" | "prograde" | "retrograde" | "normal" | "antinormal" | "radialin" | "radialout" | "target" | "antitarget" | "stability" | "stabilityassist" +sasmode = nil + +---Get/Set. +---.. object:: NAVMODE +--- +---Getting this variable will return the currently selected nav ball speed display mode. Where ``value`` is one of the valid strings listed below, this will set the nav ball mode for the cpu vessel:: +--- +--- SET NAVMODE TO value. +--- +---It is the equivalent to changing the nav ball mode by clicking on speed display on the nav ball while manually piloting the craft, and will change the current mode of the nav ball, affecting behavior of most SAS modes. Valid strings for ``value`` are ``"ORBIT"``, ``"SURFACE"`` and ``"TARGET"``. A null or empty string will default to orbit mode, however any other invalid string will throw an exception. This feature is accessible only for the active vessel, and will throw an exception if the current vessel is not active. An exception is also thrown if ``"TARGET"`` is used, but no target is selected. +---@type string | "orbit" | "surface" | "target" +navmode = nil + +---Get only. +---@type VesselAltitude +alt = nil + +---Get only. +---@type Vector +angularvelocity = nil + +---Get only. +---The orbit patch describing the next encounter with a body the current +---vessel will enter. If there is no such encounter coming, it will return +---the special string "None". If there is an encounter coming, it will +---return an object :ref:`of type Orbit `. (i.e. to obtain the name +---of the planet the encounter is with, you can do: +---``print ENCOUNTER:BODY:NAME.``, for example.). +---@type Orbit | string +encounter = nil + +---Get only. +---@type OrbitEta +eta = nil + +---Get only. +---You can obtain the number of seconds it has been since the current +---CPU vessel has been launched with the bound global variable +---``MISSIONTIME``. In real space programs this is referred to usually +---as "MET" - Mission Elapsed Time, and it's what's being measured when +---you hear that familiar voice saying "T minus 10 seconds..." Point "T" +---is the zero point of the mission elapsed time, and everything before that +---is a negative number and everything after it is a positive number. +---kOS is only capable of returning the "T+" times, not the "T-" times, +---because it doesn't read your mind to know ahead of time when you plan +---to launch. +---@type Struct +missiontime = nil + +---Get only. +---The special variable :global:`TIME` is used to get the current time +---in the gameworld (not the real world where you're sitting in a chair +---playing Kerbal Space Program.) It is the same thing as calling +---:func:`TIME` with empty parentheses. +---@type TimeStamp +time = nil + +---Get only. +---@type Vessel +activeship = nil + +---Get only. +---Vessel situation +---@type string +status = nil + +---Get only. +---@type Stage +stageinfo = nil + +---Get/Set. +---.. attribute:: Vessel:SHIPNAME +--- +---The name of the vessel as it appears in the tracking station. When you set this, it cannot be empty. +---@type string +shipname = nil + +---Get only. +---@type SteeringManager +steeringmanager = nil + +---Get only. +---:global:`NEXTNODE` is a built-in variable that always refers to the next upcoming node that has been added to your flight plan:: +--- +--- SET MyNode to NEXTNODE. +--- PRINT NEXTNODE:PROGRADE. +--- REMOVE NEXTNODE. +--- +---Currently, if you attempt to query :global:`NEXTNODE` and there is no node on your flight plan, it produces a run-time error. (This needs to be fixed in a future release so it is possible to query whether or not you have a next node). +--- +---.. warning:: +--- As per the warning above at the top of the section, NEXTNODE won't work on vessels that are not the active vessel. +--- +---The special identifier :global:`NEXTNODE` is a euphemism for "whichever node is coming up soonest on my flight path". Therefore you can remove a node even if you no longer have the maneuver node variable around, by doing this:: +--- +--- REMOVE NEXTNODE. +---@type Node +nextnode = nil + +---Get only. +---Returns true if there is a planned maneuver `ManeuverNode` in the +---:ref:`CPU vessel's ` flight plan. This will always return +---false for the non-active vessel, as access to maneuver nodes is limited to the active vessel. +---@type boolean +hasnode = nil + +---Get only. +---:type: `List` of `ManeuverNode` elements +--- +---Returns a list of all `ManeuverNode` objects currently on the +---:ref:`CPU vessel's ` flight plan. This list will be empty if +---no nodes are planned, or if the :ref:`CPU vessel ` is currently +---unable to use maneuver nodes. +--- +---.. note:: +--- If you store a reference to this list in a variable, the variable's +--- instance will not be automatically updated if you :global:`ADD` or +--- :global:`REMOVE` maneuver nodes to the flight plan. +--- +---.. note:: +--- Adding a `ManeuverNode` to this list, or a reference to this +--- list **will not** add it to the flight plan. Use the :global:`ADD` +--- command instead. +---@type List +allnodes = nil + +---Get only. +---@type Orbit +obt = nil + +---Get only. +---@type Orbit +orbit = nil + +---Get only. +---This returns the amount of IPU (instructions per update) that are +---left in this physics tick. For example, if this gives you the value +---20, you can run 20 more instructions within this physics update +---before the game will let the rest of the game run and advance time. +---After this amount of instructions, other CPUs will run their +---instructions, and the game will do the rest of its work, and then +---`TIME:SECONDS` will increase and you'll get another physics update +---in which to run more of the program. +--- +---Another way to think of this is "For the next ``OPCODESLEFT`` +---instructions, the universe is still physically frozen, giving +---frozen values for time, position, velocity, etc. After that +---it will be the next physics tick and those things will have moved +---ahead to the next physics tick." +--- +---OPCODESLEFT can be used to try to make sure you run a block of code in one +---physics tick. This is useful when working with vectors or when interacting +---with shared message queues. +--- +---To use:: +--- +--- // Will always wait the first time, becomes more accurate the second time. +--- GLOBAL OPCODESNEEDED TO 1000. +--- IF OPCODESLEFT < OPCODESNEEDED +--- WAIT 0. +--- LOCAL STARTIPU TO OPCODESLEFT. +--- LOCAL STARTTIME TO TIME:SECONDS. +--- +--- // your code here, make sure to keep the instruction count lower than your CONFIG:IPU +--- +--- IF STARTTIME = TIME:SECONDS { +--- SET OPCODESNEEDED TO STARTIPU - OPCODESLEFT. +--- } ELSE { +--- PRINT "Code is taking too long to execute. Please make the code shorter or raise the IPU.". +--- } +---@type number +opcodesleft = nil + +---Get only. +---There is a special keyword ``DONOTHING`` that refers to a special +---kind of `KosDelegate` called a `NoDelegate`. +--- +---The type string returned by ``DONOTHING:TYPENAME`` is ``"NoDelegate"``. +---Otherwise an instance of `NoDelegate` has the same suffixes as one +---of `KOSDelegate`, although you're not usually +---expected to ever use them, except maybe ``TYPENAME`` to discover +---that it is a `NoDelegate`. +--- +---``DONOTHING`` is used when you're in a situation where you had +---previously assigned a `KosDelegate` to some callback hook +---the kOS system provides, but now you want the kOS system to stop +---calling it. To do so, you assign that callback hook to the value +---``DONOTHING``. +--- +---``DONOTHING`` is similar to making a `KosDelegate` that +---consists of just ``{return.}``. If you attempt to call it from +---your own code, that's how it will behave. But the one extra +---feature it has is that it allows kOS to understand your intent +---that you wish to disable a callback hook. kOS can detect when +---the ``KosDelegate`` you assign to something happens to be the +---``DONOTHING`` delegate. When it is, kOS knows to not even +---bother calling the delegate at all anymore. +---@type NoDelegate +donothing = nil + +---Get only. +---@type Config +config = nil + +---Get only. +---@type Addons +addons = nil + +---Get only. +---@type Core +core = nil + +---Get only. +---@type Vessel +ship = nil + +---Get/Set. +---:type: `string` (set); `Vessel` or `Body` or `Part` (get/set) +--- +---Where ``name`` is the name of a target vessel or planet, this will set the current target:: +--- +--- SET TARGET TO name. +--- +---For more information see :ref:`bindings`. +--- +---NOTE, the way to de-select the target is to set it to an empty +---string like this:: +--- +--- SET TARGET TO "". // de-selects the target, setting it to nothing. +--- +---(Trying to use :ref:`UNSET TARGET.` will have no effect because +---``UNSET`` means "get rid of the variable itself" which you're not +---allowed to do with built-in bound variables like ``TARGET``.) +---@type string | Vessel | Body | Part +target = nil + +---Get only. +---@type boolean +hastarget = nil + +---Get only. +---.. attribute:: Vessel:HEADING +--- +---*absolute* compass heading (degrees) to this vessel from the :ref:`CPU Vessel ` +---@type number +shipheading = nil + +---Get only. +---.. attribute:: Vessel:AVAILABLETHRUST +--- +---Sum of all the :ref:`engines' AVAILABLETHRUSTs ` of all the currently active engines taking into account their throttlelimits. Result is in Kilonewtons. +---@type number +availablethrust = nil + +---Get only. +---.. attribute:: Vessel:MAXTHRUST +--- +---Sum of all the :ref:`engines' MAXTHRUSTs ` of all the currently active engines In Kilonewtons. +---@type number +maxthrust = nil + +---Get only. +---.. attribute:: Vessel:FACING +--- +---The way the vessel is pointed, which is also the rotation +---that would transform a vector from a coordinate space where the +---axes were oriented to match the vessel's orientation, to one +---where they're oriented to match the world's ship-raw coordinates. +--- +---i.e. ``SHIP:FACING * V(0,0,1)`` gives the direction the +---ship is pointed (it's Z-axis) in absolute ship-raw coordinates +---@type Direction +facing = nil + +---Get only. +---.. attribute:: Vessel:ANGULARMOMENTUM +--- +---Given in :ref:`SHIP_RAW ` reference frame. The vector +---represents the axis of the rotation (in left-handed convention, +---not right handed as most physics textbooks show it), and its +---magnitude is the angular momentum of the rotation, which varies +---not only with the speed of the rotation, but also with the angular +---inertia of the vessel. +--- +---Units are expressed in: (Megagrams * meters^2) / (seconds * radians) +--- +---(Normal SI units would use kilograms, but in KSP all masses use a +---1000x scaling factor.) +--- +---**Justification for radians here:** +---Unlike the trigonometry functions in kOS, this value uses radians +---rather than degrees. The convention of always expressing angular +---momentum using a formula that assumes you're using radians is a very +---strongly adhered to universal convention, for... reasons. +---It's so common that it's often not even explicitly +---mentioned in information you may find when doing a web search on +---helpful formulae about angular momentum. This is why kOS doesn't +---use degrees here. (That an backward compatibility for old scripts. +---It's been like this for quite a while.). +---@type Vector +angularmomentum = nil + +---Get only. +---.. attribute:: Vessel:ANGULARVEL +--- +---Angular velocity of the body's rotation about its axis (its +---day) expressed as a vector. +--- +---The direction the angular velocity points is in Ship-Raw orientation, +---and represents the axis of rotation. Remember that everything in +---Kerbal Space Program uses a *left-handed coordinate system*, which +---affects which way the angular velocity vector will point. If you +---curl the fingers of your **left** hand in the direction of the rotation, +---and stick out your thumb, the thumb's direction is the way the +---angular velocity vector will point. +--- +---The magnitude of the vector is the speed of the rotation. +--- +---Note, unlike many of the other parts of kOS, the rotation speed is +---expressed in radians rather than degrees. This is to make it +---congruent with how VESSEL:ANGULARMOMENTUM is expressed, and for +---backward compatibility with older kOS scripts. +---@type Vector +angularvel = nil + +---Get only. +---.. attribute:: Vessel:MASS +--- +---:type: `number` (metric tons) +--- +---The mass of the ship +---@type number +mass = nil + +---Get only. +---.. attribute:: Vessel:VERTICALSPEED +--- +---:type: `number` (m/s) +--- +---How fast the ship is moving. in the "up" direction relative to the SOI Body's sea level surface. +---@type number +verticalspeed = nil + +---Get only. +---.. attribute:: Vessel:GROUNDSPEED +--- +---:type: `number` (m/s) +--- +---How fast the ship is moving in the two dimensional plane horizontal +---to the SOI body's sea level surface. The vertical component of the +---ship's velocity is ignored when calculating this. +--- +---.. note:: +--- +--- .. versionadded:: 0.18 +--- The old name for this value was SURFACESPEED. The name was changed +--- because it was confusing before. "surface speed" implied it's the +--- `number` magnitude of "surface velocity", but it wasn't, because of how +--- it ignores the vertical component. +---@type number +groundspeed = nil + +---Get only. +---@type number +surfacespeed = nil + +---Get only. +---.. attribute:: Vessel:AIRSPEED +--- +---:type: `number` (m/s) +--- +---How fast the ship is moving relative to the air. KSP models atmosphere as simply a solid block of air "glued" to the planet surface (the weather on Kerbin is boring and there's no wind). Therefore airspeed is generally the same thing as as the magnitude of the surface velocity. +---@type number +airspeed = nil + +---Get only. +---@type number +latitude = nil + +---Get only. +---@type number +longitude = nil + +---Get only. +---@type number +altitude = nil + +---Get only. +---.. attribute:: Orbitable:APOAPSIS +--- +---:type: `number` (deg) +--- +---.. deprecated:: 0.15 +--- +--- This is only kept here for backward compatibility. +--- in new scripts you write, use :attr:`OBT:APOAPSIS `. +--- (i.e. use ``SHIP:OBT:APOAPSIS`` instead of ``SHIP:APOAPSIS``, +--- or use ``MUN:OBT:APOAPSIS`` instead of ``MUN:APOAPSIS``, etc). +---@type number +apoapsis = nil + +---Get only. +---.. attribute:: Orbitable:PERIAPSIS +--- +---:type: `number` (deg) +--- +---.. deprecated:: 0.15 +--- +--- This is only kept here for backward compatibility. +--- in new scripts you write, use :attr:`OBT:PERIAPSIS `. +--- (i.e. use ``SHIP:OBT:PERIAPSIS`` instead of ``SHIP:PERIAPSIS``). +--- or use ``MUN:OBT:PERIAPSIS`` instead of ``MUN:PERIAPSIS``, etc). +---@type number +periapsis = nil + +---Get only. +---.. attribute:: Orbitable:BODY +--- +---The `Body` that this object is orbiting. I.e. ``Mun:BODY`` returns ``Kerbin``. +---@type Body +body = nil + +---Get only. +---.. attribute:: Orbitable:UP +--- +---pointing straight up away from the SOI body. +---@type Direction +up = nil + +---Get only. +---.. attribute:: Orbitable:NORTH +--- +---pointing straight north on the SOI body, parallel to the surface of the SOI body. +---@type Direction +north = nil + +---Get only. +---.. attribute:: Orbitable:PROGRADE +--- +---pointing in the direction of this object's **orbitable-frame** velocity +---@type Direction +prograde = nil + +---Get only. +---.. attribute:: Orbitable:RETROGRADE +--- +---pointing in the opposite of the direction of this object's **orbitable-frame** velocity +---@type Direction +retrograde = nil + +---Get only. +---.. attribute:: Orbitable:SRFPROGRADE +--- +---pointing in the direction of this object's **surface-frame** velocity. Note that if this Orbitable is itself a body, remember that this is relative to the surface of the SOI body, not this body. +---@type Direction +srfprograde = nil + +---Get only. +---.. attribute:: Orbitable:SRFRETROGRADE +--- +---pointing in the opposite of the direction of this object's **surface-frame** velocity. Note that this is relative to the surface of the SOI body. +---@type Direction +srfretrograde = nil + +---Get only. +---.. attribute:: Orbitable:VELOCITY +--- +---The :struct:`orbitable velocity ` of this object in the :ref:`SHIP-RAW reference frame ` +---@type OrbitableVelocity +velocity = nil + +---Get only. +---.. attribute:: Orbitable:GEOPOSITION +--- +---A combined structure of the latitude and longitude numbers. +---@type GeoCoordinates +geoposition = nil + +---Get only. +---@type Body +sun = nil + +---Get only. +---@type Body +kerbin = nil + +---Get only. +---@type Body +mun = nil + +---Get only. +---@type Body +minmus = nil + +---Get only. +---@type Body +moho = nil + +---Get only. +---@type Body +eve = nil + +---Get only. +---@type Body +duna = nil + +---Get only. +---@type Body +ike = nil + +---Get only. +---@type Body +jool = nil + +---Get only. +---@type Body +laythe = nil + +---Get only. +---@type Body +vall = nil + +---Get only. +---@type Body +bop = nil + +---Get only. +---@type Body +tylo = nil + +---Get only. +---@type Body +gilly = nil + +---Get only. +---@type Body +pol = nil + +---Get only. +---@type Body +dres = nil + +---Get only. +---@type Body +eeloo = nil + diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/plugin/patcher.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/plugin/patcher.lua new file mode 100644 index 0000000000..853b94d799 --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/plugin/patcher.lua @@ -0,0 +1,147 @@ +local patchMessage = [[ +Patcher plugin will patch lua language server to add the arrow syntax support. +You may may also see this message after lua language server was updated and needs to get patched again. +If you do not wish to see this message remove the plugin from your lua language server settings. +To uninstall the patch replace the "patcher.lua" plugin with the "unpatcher.lua" plugin or reinstall lua language server. +The arrow syntax won't be enabled unless you have '"Lua.runtime.special": { "_G": "_G" }' in your settings("runtime.special" in case you use .luarc.json file). +For the syntax support to apply lua language server needs a restart. +If the patch fails, the added syntax doesn't work or there are errors popping up after the patch then most likely the installed version of lua language server is not supported. +The latest version of lua language server that is guaranteed to work is 3.13.2. +]] + +local parseArrowFn = [[ + +--patch_id:0 +local function parseArrow() + local funcLeft = getPosition(Tokens[Index], 'left') + local funcRight = getPosition(Tokens[Index], 'right') + local func = { + type = 'function', + start = funcLeft, + finish = funcRight, + bstart = funcRight, + keyword = { + [1] = funcLeft, + [2] = funcRight, + }, + } + Index = Index + 2 + skipSpace(true) + local LastLocalCount = LocalCount + LocalCount = 0 + pushChunk(func) + func.args = { + type = 'funcargs', + start = funcLeft, + finish = funcRight, + parent = func, + } + local returnExp = parseExp() + popChunk() + func.bfinish = getPosition(Tokens[Index], 'left') + if returnExp then + returnExp.parent = func + func[1] = { + returnExp, + type = 'return', + parent = func, + finish = returnExp.finish, + start = func.finish + } + func.bfinish = func[1].finish + func.hasReturn = true + func.returns = { func[1] } + func.keyword[3] = returnExp.finish-1 + func.keyword[4] = returnExp.finish + func.finish = returnExp.finish + else + func.finish = lastRightPosition() + missExp() + end + LocalCount = LastLocalCount + return func +end +]] + +local parseTokenCheck = [[ + + if State.options.special._G == "_G" and token == '>' then + return parseArrow() + end +]] + +local client = require 'client' + +local function insert(str1, str2, index) return str1:sub(1, index-1)..str2..str1:sub(index, -1) end + +local function patcherError(err) client.showMessage("Error", "Patcher plugin: "..err) end +local function openFileFailedError(path, err) patcherError("Failed to open the file at \""..path.."\": \n"..err) end +local function readFileFailedError(path, err) patcherError("Failed to read the file at \""..path.."\": \n"..err) end +local function writeFileFailedError(path, err) patcherError("Failed to write to the file at \""..path.."\": \n"..err) end +local function patchFailedError() patcherError("Failed to apply the patch. See the patch confirmation message") end + +local patchFilePath = package.path:match("([^?]+)").."parser/compile.lua" +local originalFilePath = package.path:match("([^?]+)").."parser/original.compile.lua" + +-- get contents of the patch file +local patchFile, patchFileOpenErr = io.open(patchFilePath, "r") +if not patchFile then + openFileFailedError(patchFilePath, patchFileOpenErr) + return +end +local patchFileText, patchFileReadErr = patchFile:read("a") +if patchFileReadErr then + readFileFailedError(patchFilePath, patchFileReadErr) + patchFile:close() + return +end +patchFile:close() + +-- check if the file is already patched +local filePatched = patchFileText:match("--patch_id:(%d+)") +if filePatched then return end + +-- ask the user if they want to patch +local result = client.awaitRequestMessage("Warning", patchMessage, { "Ok", "Don't patch" }) +if result ~= "Ok" then return end + +-- save original file before patching +local originalFile, originalFileOpenErr = io.open(originalFilePath, "w") +if not originalFile then + openFileFailedError(originalFilePath, (originalFileOpenErr or "")) + return +end +local _, originalFileWriteErr = originalFile:write(patchFileText) +if originalFileWriteErr then + writeFileFailedError(originalFilePath, originalFileWriteErr) + return +end +originalFile:close() + +-- patch the text +local parseArrowFnInsertPos = patchFileText:match("()\nlocal function parseFunction") +if not parseArrowFnInsertPos then + patchFailedError() + return +end +patchFileText = insert(patchFileText, parseArrowFn, parseArrowFnInsertPos) +local tokenCheckInsertPos = patchFileText:match("return parseFunction%(%)\n end\n()") +if not tokenCheckInsertPos then + patchFailedError() + return +end +patchFileText = insert(patchFileText, parseTokenCheck, tokenCheckInsertPos) + +-- save patched text to the patch file +local patchFile, patchFileOpenErr = io.open(patchFilePath, "w") +if not patchFile then + openFileFailedError(patchFilePath, patchFileOpenErr) + return +end +local _, patchFileWriteErr = patchFile:write(patchFileText) +if patchFileWriteErr then + writeFileFailedError(patchFilePath, patchFileWriteErr) + patchFile:close() + return +end +patchFile:close() diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/plugin/unpatcher.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/plugin/unpatcher.lua new file mode 100644 index 0000000000..2adafe7320 --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/plugin/unpatcher.lua @@ -0,0 +1,28 @@ +local client = require 'client' + +local patchFilePath = package.path:match("([^?]+)").."parser/compile.lua" +local originalFilePath = package.path:match("([^?]+)").."parser/original.compile.lua" + +local originalFile, originalErr = io.open(originalFilePath, "r") +if not originalFile then + client.showMessage("Error", "Unpatcher plugin: Failed to open original file at \""..originalFilePath.."\". \n"..originalErr) + return +end +local originalFileText, originalFileReadErr = originalFile:read("a") +if not originalFileText then + client.showMessage("Error", "Unpatcher plugin: Failed to read original file at \""..originalFilePath.."\". \n"..originalFileReadErr) +end +originalFile:close() + +local patchFile, patchErr = io.open(patchFilePath, "w") +if not patchFile then + client.showMessage("Error", "Unpatcher plugin: Failed to open patch file at \""..patchFilePath.."\". \n"..patchErr) + return +end +local _, patchFileWriteErr = patchFile:write(originalFileText) +if patchFileWriteErr then + client.showMessage("Error", "Unpatcher plugin: Failed to write to patch file at \""..patchFilePath.."\". \n"..patchFileWriteErr) +end +patchFile:close() + +client.showMessage("Info", "Unpatcher plugin: Successfully unpatched lua language server. It is highly recommended to remove this plugin after use") diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index 7f5638028a..fd537a5284 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -291,10 +291,13 @@ + + From 45b6a49a51481afae4f89a27c537daf91b13cbba Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 8 Dec 2024 17:08:04 +0300 Subject: [PATCH 075/108] Fix LuaLSAddon README --- Resources/GameData/kOS/PluginData/LuaLSAddon/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/README.md b/Resources/GameData/kOS/PluginData/LuaLSAddon/README.md index fb2668da30..736caa36a5 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/README.md +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/README.md @@ -5,8 +5,7 @@ It includes: ### Setup for VSCode 1. Install the lua language server extension made by sumneko. -2. Copy the `.luarc.json` file to your workspace folder where you want the addon enabled. -It's usually the archive at `*KSP_Folder*/Ships/Script/.luarc.json`. +2. Copy the `.luarc.json` file to the archive at `*KSP_Folder*/Ships/Script/.luarc.json`. 3. Open the folder with VSCode and you will be asked by the patcher plugin to patch lua language server. 4. Read the message and press "Ok". 5. Restart VSCode. From 5b28ac5312b3cef23165a16b40e0629360f4383a Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 8 Dec 2024 17:10:27 +0300 Subject: [PATCH 076/108] Fix annotations typo --- .../LuaLSAddon/library/variables.lua | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua index 33b535749e..e428dc2124 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua @@ -258,47 +258,47 @@ ag9 = nil ag10 = nil ---Get only. ----@type RBGA +---@type RGBA white = nil ---Get only. ----@type RBGA +---@type RGBA black = nil ---Get only. ----@type RBGA +---@type RGBA red = nil ---Get only. ----@type RBGA +---@type RGBA green = nil ---Get only. ----@type RBGA +---@type RGBA blue = nil ---Get only. ----@type RBGA +---@type RGBA yellow = nil ---Get only. ----@type RBGA +---@type RGBA cyan = nil ---Get only. ----@type RBGA +---@type RGBA magenta = nil ---Get only. ----@type RBGA +---@type RGBA purple = nil ---Get only. ----@type RBGA +---@type RGBA grey = nil ---Get only. ----@type RBGA +---@type RGBA gray = nil ---Get only. @@ -419,7 +419,7 @@ archive = nil THROTTLE = nil ---Get/Set. ----@type Vector | Direction | string +---@type Vector | Direction | string | "kill" STEERING = nil ---Get/Set. From cb64382cb61268cc2f8d14f0e908071c4db98e9b Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 8 Dec 2024 17:19:39 +0300 Subject: [PATCH 077/108] Add annotations for default modules --- .../PluginData/LuaLSAddon/library/base.lua | 19 +++++++ .../PluginData/LuaLSAddon/library/modules.lua | 2 + src/kOS/Lua/Libs/callbacks.lua | 56 +++++++++++++++++-- src/kOS/Lua/Libs/misc.lua | 23 +++++++- 4 files changed, 95 insertions(+), 5 deletions(-) create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua create mode 100644 Resources/GameData/kOS/PluginData/LuaLSAddon/library/modules.lua diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua new file mode 100644 index 0000000000..20abdaad1a --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua @@ -0,0 +1,19 @@ +-- Stops execution of command code for the specified amount of time. +-- Note that `fixedupdate` and `update` functions will continue to be called. +---@param seconds number +function wait(seconds) end + +-- Function that gets called by kOS each physics tick. +---@type function | nil +fixedupdate = nil + +-- Function that gets called by kOS each frame. +---@type function | nil +update = nil + +-- Function that gets called by kOS when `Ctrl+C` is pressed. +-- If `Ctrl+C` was pressed 3 times while the command code was deprived of instructions by the `fixedupdate` function, +-- both `fixedupdate` and `update` function get set to `nil` as a way to prevent the core from geting stuck. +-- To prevent it from happening this function must ensure the terminal is not deprived of instructions. +---@type function | nil +breakexecution = nil diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/modules.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/modules.lua new file mode 100644 index 0000000000..ece8899b68 --- /dev/null +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/modules.lua @@ -0,0 +1,2 @@ +callbacks = require("callbacks") +misc = require("misc") diff --git a/src/kOS/Lua/Libs/callbacks.lua b/src/kOS/Lua/Libs/callbacks.lua index e8ff906321..424ba90c89 100644 --- a/src/kOS/Lua/Libs/callbacks.lua +++ b/src/kOS/Lua/Libs/callbacks.lua @@ -1,9 +1,34 @@ local M = {} function M.init() + -- Controls how kOS should steer the ship. + -- Options: + -- - `function` that returns one of the options listed below. + -- - `Direction` the ship should point towards. + -- - `Vector` the ship should point towards. Like `Direction`, but without the roll component + -- - `string` "kill". The ship will try to kill all its angular velocity + ---@type function | Direction | Vector | "kill" + steering = nil + -- Controls the throttle value of the ship. Can be a number or a function returning a number. + -- The number is expected to be between 0 and 1. + ---@type function | number + throttle = nil + -- Options: + -- - `function` that returns one of the options listed below. + -- - `number`. Compass heading the ship should steer towards. + -- - `GeoCoordinates` the ship should steer towards. + -- - `Vessel` the ship should steer towards. + ---@type function | number | GeoCoordinates | Vessel + wheelsteering = nil + -- Controls the wheel throttle value of the ship. Can be a number or a function returning a number. + -- The number is expected to be between 0 and 1. + ---@type function | number + wheelthrottle = nil + M.breakcontrol() M.fixedupdatecallbacks = {} M.updatecallbacks = {} + fixedupdate = M.fixedupdate update = M.update breakexecution = M.breakexecution @@ -35,7 +60,9 @@ function M.breakexecution() M.updatecallbacks = {} end -M.finalizer = setmetatable({}, { __gc = function() -- Called when the state is disposed(on shutdown, reboot) +-- A table with a finalizer that gets called when the lua state is disposed(on shutdown, reboot). +-- Makes the core automatically "let go" of the controls. +M.finalizer = setmetatable({}, { __gc = function() toggleflybywire("steering", false) toggleflybywire("throttle", false) toggleflybywire("wheelsteering", false) @@ -77,14 +104,14 @@ function M.processcontrol() toggleflybywire("throttle", false) end if rawget(_ENV, "wheelsteering") then - M.controlled.wheelthrottle = true + M.controlled.wheelsteering = true local success, error = pcall(function() WHEELSTEERING = type(wheelsteering) == "function" and wheelsteering() or wheelsteering end) if not success then warn(error, 1) wheelsteering = nil end - elseif M.controlled.wheelthrottle then - M.controlled.wheelthrottle = false + elseif M.controlled.wheelsteering then + M.controlled.wheelsteering = false toggleflybywire("wheelsteering", false) end if rawget(_ENV, "wheelthrottle") then @@ -128,6 +155,17 @@ function M.runcallbacks(callbacks) end end +---@param body function : +-- Callback function body to get executed on the next physics tick(or the next frame, see the third parameter). +-- If returns a number or `true` the callback doesn't get cleared. +-- If returns a number this number will be used as the callback priority, see the second parameter. +---@param priority? number : +-- Callback priority. Callbacks with highest priorities get executed first. Default is 0. +---@param callbacks? table : +-- Callbacks table where to add the callback to. +-- Options: +-- - `callbacks.fixedupdatecallbacks`: gets executed each physics tick. Default. +-- - `callbacks.updatecallbacks`: gets executed each frame. function M.addcallback(body, priority, callbacks) callbacks = callbacks or M.fixedupdatecallbacks local callback = { @@ -155,6 +193,11 @@ function M.addcallback(body, priority, callbacks) return callback end +-- "When" trigger implemented as a wrapper around the `addcallback` function. +---@param condition function The callback executes only if this function returns a true value +---@param body function The same as in `addcallback` function +---@param priority? number The same as in `addcallback` function +---@param callbacks? table The same as in `addcallback` function function M.when(condition, body, priority, callbacks) return M.addcallback(function (callback) if condition() then @@ -165,6 +208,11 @@ function M.when(condition, body, priority, callbacks) end, priority, callbacks) end +-- "On" trigger implemented as a wrapper around the `addcallback` function. +---@param state function The callback executes only if this function returns a value that is not equal to the value it returned previously +---@param body function The same as in `addcallback` function +---@param priority? number The same as in `addcallback` function +---@param callbacks? table The same as in `addcallback` function function M.on(state, body, priority, callbacks) local previousState = state() return M.addcallback(function (callback) diff --git a/src/kOS/Lua/Libs/misc.lua b/src/kOS/Lua/Libs/misc.lua index 76d1599385..b1298fa96c 100644 --- a/src/kOS/Lua/Libs/misc.lua +++ b/src/kOS/Lua/Libs/misc.lua @@ -3,12 +3,21 @@ local M = {} function M.init() vecdraw = M.vecdraw clearvecdraws = M.clearvecdraws + + ---@class CJson + ---@field encode fun(table): string encodes a `table` into a json `string` + ---@field decode fun(string): table decodes a json `string` into a `table` + + -- [openrestry/lua-cjson module](https://github.com/openresty/lua-cjson/tree/2.1.0.10rc1). + -- Not all keys are annotated. Complete documentation is available at the link. + ---@type CJson json = select(2, pcall(require, "cjson")) end M.vecdraws = setmetatable({}, { __mode = "v" }) M.updatingvecdraws = setmetatable({}, { __mode = "v" }) +-- A wrapper around kOS `CLEARVECDRAWS` function that also clears vecdraws created with the `vecdraw` function function M.clearvecdraws() CLEARVECDRAWS() for _,vd in pairs(M.vecdraws) do @@ -58,7 +67,7 @@ local vecdrawmt = { if vd.isColorFunction then vd.structure.color = vd.parameters.color() end end return M.updatingvecdraws.keepCallback - end, 0, M.updatecallbacks) + end, 0, callbacks.updatecallbacks) end table.insert(M.updatingvecdraws, vd) end @@ -66,6 +75,18 @@ local vecdrawmt = { __gc = function(vd) vd.show = false end, } +-- Wrapper around kOS `VECDRAW` function that uses the callbacks library to automatically update the "start", "vector" and "color" values. +-- Those 3 parameters can also accept functions, in which case their values will be changed each frame with the return value of the functions. +---@param start? Vector | function `Vector` in ship-raw reference frame where the `Vecdraw` will be drawn from. +---@param vector? Vector | function absolute `Vector` position where the `Vecdraw` should end. +---@param color? RGBA | function +---@param label? string +---@param scale? number +---@param show? boolean +---@param width? number +---@param pointy? boolean +---@param wiping? boolean +---@return Vecdraw function M.vecdraw(start, vector, color, label, scale, show, width, pointy, wiping) local vd = { structure = VECDRAW(v(0,0,0), v(0,0,0), white, label or "", scale or 1, show ~= nil and show, width or 0.2, pointy == nil or pointy, wiping == nil or wiping), From 6a221bb12e4ebc71db8de3cc65ffca60050941d0 Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 9 Dec 2024 13:27:31 +0300 Subject: [PATCH 078/108] Fix NRE in GetHashCode for unloaded vessels --- src/kOS/Suffixed/VesselTarget.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kOS/Suffixed/VesselTarget.cs b/src/kOS/Suffixed/VesselTarget.cs index 943c9ebdbc..6db49e4ed9 100644 --- a/src/kOS/Suffixed/VesselTarget.cs +++ b/src/kOS/Suffixed/VesselTarget.cs @@ -550,7 +550,7 @@ public override bool Equals(object obj) public override int GetHashCode() { - return Vessel.rootPart.flightID.GetHashCode(); + return Vessel.id.GetHashCode(); } public static bool operator ==(VesselTarget left, VesselTarget right) From cd60b8305f7121bdb4a15a78e5dd890175b2d5a9 Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 9 Dec 2024 13:45:38 +0300 Subject: [PATCH 079/108] Look for a file in `dofile`, `loadfile` lua functions the same way ks function `run` does --- src/kOS/Lua/Libs/Base.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/kOS/Lua/Libs/Base.cs b/src/kOS/Lua/Libs/Base.cs index 6aa2e033ea..73b4d8b327 100644 --- a/src/kOS/Lua/Libs/Base.cs +++ b/src/kOS/Lua/Libs/Base.cs @@ -189,7 +189,9 @@ private static int LoadFile(IntPtr L) state.CheckString(1); var filePath = state.ToString(1); var shared = Binding.Bindings[state.MainThread.Handle].Shared; - var file = shared.VolumeMgr.CurrentVolume.Open(filePath) as VolumeFile; + GlobalPath path = shared.VolumeMgr.GlobalPathFromObject(filePath); + Volume volume = shared.VolumeMgr.GetVolumeFromPath(path); + VolumeFile file = volume.Open(path) as VolumeFile; if (file == null) { state.PushNil(); From 126043015b5ec31d0be2e4541626758e04419d74 Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 9 Dec 2024 20:41:14 +0300 Subject: [PATCH 080/108] Convert objects to Structures when pushing onto the kerboscript argument stack --- src/kOS/Lua/Types/KSFunction.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index 615921a94a..b01ff245e0 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -37,7 +37,7 @@ private static int KSFunctionCall(IntPtr L) stack.PushArgument(new KOSArgMarkerType()); for (int i = 2; i <= state.GetTop(); i++) { - var arg = Binding.ToCSharpObject(state, i, binding); + var arg = Structure.FromPrimitiveWithAssert(Binding.ToCSharpObject(state, i, binding)); if (arg == null) break; Binding.LuaExceptionCatch(() => stack.PushArgument(arg), state); } From 8ff708a176671ce218b0d5ee2606a199fbff1ac4 Mon Sep 17 00:00:00 2001 From: sug44 Date: Mon, 9 Dec 2024 20:58:01 +0300 Subject: [PATCH 081/108] Set whitelisted string table as an __index field for strings metatable. Refactor whitelist.lua to make it harder to accidentally expose non whitelisted values --- src/kOS/Lua/whitelist.lua | 47 ++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/kOS/Lua/whitelist.lua b/src/kOS/Lua/whitelist.lua index d192f59d0a..d04c60ecb6 100644 --- a/src/kOS/Lua/whitelist.lua +++ b/src/kOS/Lua/whitelist.lua @@ -1,6 +1,6 @@ local registry, setUpvalue = ... -local env = { +local _ENV = { _VERSION = _VERSION, assert = assert, collectgarbage = collectgarbage, @@ -114,45 +114,46 @@ local env = { offset = utf8.offset, }, } -env._G = env local whitelistedRegistry = { registry[1], -- main thread - env, + _ENV, _LOADED = { - _G = env._G, - package = env.package, - coroutine = env.coroutine, - math = env.math, - string = env.string, - table = env.table, - utf8 = env.utf8, + _G = _ENV, + package = package, + coroutine = coroutine, + math = math, + string = string, + table = table, + utf8 = utf8, }, _PRELOAD = {}, _CLIBS = setmetatable({}, getmetatable(registry._CLIBS)), } -env.package.loaded = whitelistedRegistry._LOADED -env.package.preload = whitelistedRegistry._PRELOAD - -setUpvalue(env.require, 1, env.package) -for _,searcher in ipairs(env.package.searchers) do - setUpvalue(searcher, 1, env.package) -end - local visitedTables = {} local function deepCleanTable(tab) visitedTables[tab] = true - for k,v in env.pairs(tab) do - if env._type(v) == "table" and not visitedTables[v] then + for k,v in pairs(tab) do + if _type(v) == "table" and not visitedTables[v] then deepCleanTable(v) end tab[k] = nil end end - deepCleanTable(registry) -for k,v in env.pairs(whitelistedRegistry) do +for k,v in pairs(whitelistedRegistry) do registry[k] = v -end \ No newline at end of file +end + +_G = _ENV +package.loaded = whitelistedRegistry._LOADED +package.preload = whitelistedRegistry._PRELOAD + +setUpvalue(require, 1, package) +for _,searcher in ipairs(package.searchers) do + setUpvalue(searcher, 1, package) +end + +getmetatable("").__index = string \ No newline at end of file From 5fdeb27b83fb26c3e359d6c236b369ba0afef263 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 10 Dec 2024 15:25:34 +0300 Subject: [PATCH 082/108] Add "Node" structure as a possible type for steering in annotations --- .../GameData/kOS/PluginData/LuaLSAddon/library/variables.lua | 2 +- src/kOS/Lua/Libs/callbacks.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua index e428dc2124..831fada851 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua @@ -419,7 +419,7 @@ archive = nil THROTTLE = nil ---Get/Set. ----@type Vector | Direction | string | "kill" +---@type Vector | Direction | Node | string | "kill" STEERING = nil ---Get/Set. diff --git a/src/kOS/Lua/Libs/callbacks.lua b/src/kOS/Lua/Libs/callbacks.lua index 424ba90c89..884a341275 100644 --- a/src/kOS/Lua/Libs/callbacks.lua +++ b/src/kOS/Lua/Libs/callbacks.lua @@ -7,7 +7,7 @@ function M.init() -- - `Direction` the ship should point towards. -- - `Vector` the ship should point towards. Like `Direction`, but without the roll component -- - `string` "kill". The ship will try to kill all its angular velocity - ---@type function | Direction | Vector | "kill" + ---@type function | Direction | Vector | Node | "kill" steering = nil -- Controls the throttle value of the ship. Can be a number or a function returning a number. -- The number is expected to be between 0 and 1. From 50c5441aa89323666ddc514073e88ace92b8f154 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 10 Dec 2024 15:49:16 +0300 Subject: [PATCH 083/108] Wait functions and kerboscript yields in lua rework Make kerboscript yields yield all coroutines, not just commandCoroutine. Remove base `wait` function that uses kerboscript yields. Replace the `wait` function with a kerboscript-like abstraction using lua `coroutine.yield()`. Add the `waituntil` function, similar to `wait`. This fixes update coroutines not being affected by kerboscript yields(`bounds` ship suffix, `stage` function). --- .../PluginData/LuaLSAddon/library/base.lua | 5 ----- src/kOS/Lua/Libs/Base.cs | 10 ---------- src/kOS/Lua/Libs/misc.lua | 20 +++++++++++++++++++ src/kOS/Lua/LuaInterpreter.cs | 6 +++--- src/kOS/Lua/whitelist.lua | 1 - 5 files changed, 23 insertions(+), 19 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua index 20abdaad1a..1d440ee67b 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua @@ -1,8 +1,3 @@ --- Stops execution of command code for the specified amount of time. --- Note that `fixedupdate` and `update` functions will continue to be called. ----@param seconds number -function wait(seconds) end - -- Function that gets called by kOS each physics tick. ---@type function | nil fixedupdate = nil diff --git a/src/kOS/Lua/Libs/Base.cs b/src/kOS/Lua/Libs/Base.cs index 73b4d8b327..8d4436529c 100644 --- a/src/kOS/Lua/Libs/Base.cs +++ b/src/kOS/Lua/Libs/Base.cs @@ -16,7 +16,6 @@ public static class Base {"print", Print}, {"type", Type}, {"warn", Warn}, - {"wait", Wait}, {null, null} }; @@ -230,14 +229,5 @@ private static int DoFileContinuation(IntPtr L, int status, IntPtr ctx) var argCount = (int)ctx; return state.GetTop()-argCount; } - - private static int Wait(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - state.CheckNumber(1); - var shared = Binding.Bindings[state.MainThread.Handle].Shared; - shared.Cpu.YieldProgram(new YieldFinishedGameTimer(state.ToNumber(1))); - return 0; - } } } \ No newline at end of file diff --git a/src/kOS/Lua/Libs/misc.lua b/src/kOS/Lua/Libs/misc.lua index b1298fa96c..432c9f83c8 100644 --- a/src/kOS/Lua/Libs/misc.lua +++ b/src/kOS/Lua/Libs/misc.lua @@ -1,6 +1,8 @@ local M = {} function M.init() + wait = M.wait + waituntil = M.waituntil vecdraw = M.vecdraw clearvecdraws = M.clearvecdraws @@ -14,6 +16,24 @@ function M.init() json = select(2, pcall(require, "cjson")) end +-- Suspends the execution for the specified amount of time. +-- Any call to this function will suspend execution for at least one physics tick. +-- This function is a simple abstraction made to achieve the same effect as the kerboscript `wait *number*.` command. +-- One difference is it only suspends the execution of the coroutine it was called from, making it totally fine to use inside callbacks. +function M.wait(seconds) + local waitEnd = time.seconds + seconds + coroutine.yield() + while time.seconds < waitEnd do coroutine.yield() end +end + +-- Suspends the execution until the `condition` function returns a true value. +-- This function is a simple abstraction made to achieve the same effect as the kerboscript `wait until *condition*.` command. +-- One difference is it only suspends the execution of the coroutine it was called from, making it totally fine to use inside callbacks. +---@param condition function +function M.waituntil(condition) + while not condition() do coroutine.yield() end +end + M.vecdraws = setmetatable({}, { __mode = "v" }) M.updatingvecdraws = setmetatable({}, { __mode = "v" }) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 042d930295..833723f211 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -104,7 +104,7 @@ private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) var state = KeraLua.Lua.FromIntPtr(L); var execInfo = stateInfo[state.MainThread.Handle]; if (++execInfo.InstructionsThisUpdate >= execInfo.InstructionsPerUpdate || execInfo.BreakExecution - || (execInfo.CommandCoroutine.Handle == L && (execInfo.Shared.Cpu as LuaCPU).IsYielding())) + || (execInfo.Shared.Cpu as LuaCPU).IsYielding()) { // it's possible for a C/CSharp function to call lua making a coroutine unable to yield because // of the "C-call boundary". @@ -196,7 +196,7 @@ public void KOSFixedUpdate(double dt) } fixedUpdateCoroutine.ResetThread(); - if (fixedUpdateCoroutine.GetGlobal("fixedupdate") == LuaType.Function) + if (fixedUpdateCoroutine.GetGlobal("fixedupdate") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) { if (fixedUpdateCoroutine.LoadString($"fixedupdate({dt})", "fixedupdate") == LuaStatus.OK) { @@ -255,7 +255,7 @@ public void KOSUpdate(double dt) if (execInfo.InstructionsThisUpdate >= execInfo.InstructionsPerUpdate) return; updateCoroutine.ResetThread(); - if (updateCoroutine.GetGlobal("update") == LuaType.Function) + if (updateCoroutine.GetGlobal("update") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) { if (updateCoroutine.LoadString($"update({dt})", "update") == LuaStatus.OK) { diff --git a/src/kOS/Lua/whitelist.lua b/src/kOS/Lua/whitelist.lua index d04c60ecb6..8acba10ce5 100644 --- a/src/kOS/Lua/whitelist.lua +++ b/src/kOS/Lua/whitelist.lua @@ -26,7 +26,6 @@ local _ENV = { warn = warn, xpcall = xpcall, _type = _type, - wait = wait, require = require, package = { config = package.config, From 8fa991b8877433c63e0f965247a61ea16f022801 Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 10 Dec 2024 17:28:30 +0300 Subject: [PATCH 084/108] Fix not handling nil error value from callbacks --- src/kOS/Lua/Libs/callbacks.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kOS/Lua/Libs/callbacks.lua b/src/kOS/Lua/Libs/callbacks.lua index 884a341275..990839336b 100644 --- a/src/kOS/Lua/Libs/callbacks.lua +++ b/src/kOS/Lua/Libs/callbacks.lua @@ -180,7 +180,7 @@ function M.addcallback(body, priority, callbacks) callback.body = nil end else - warn("error in callback:\n" .. newPriority) + warn("error in callback:\n" .. (newPriority == nil and "" or tostring(newPriority))) callback.body = nil end end From 312a49cc0b16a31474d3687fe10fdd9e3bcd300d Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 10 Dec 2024 23:02:13 +0300 Subject: [PATCH 085/108] Remove kerboscript specific functions in lua Fix some function annotations --- .../LuaLSAddon/library/functions.lua | 25 +++++++++++++++---- src/kOS/Lua/Binding.cs | 15 +++++++++++ 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua index 2775def62f..06273227c5 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua @@ -35,7 +35,8 @@ function listalarms(alarmType) end function deletealarm(alarmID) end ---@param path string ----Path of the file for editing. +---argument 1 +--- Path of the file for editing. --- ---Edits or creates a program file described by filename :code:`PATH`. ---If the file referred to by :code:`PATH` already exists, then it will @@ -233,6 +234,7 @@ function bodyexists(name) end ---@param name string ---@return Atmosphere +---Passing in a string (``name``) parameter, this function returns the ---:attr:`ATM ` of the body that has that name. It's identical ---to calling ``BODY(name):ATM``, but accomplishes the goal in fewer steps. --- @@ -953,6 +955,7 @@ function clearscreen() end ---@param size number ---@param colour RGBA ---@param doEcho boolean +---You can make text messages appear on the heads-up display, in the ---same way that the in-game stock messages appear, by calling the ---HUDTEXT function, as follows:: --- @@ -1194,12 +1197,14 @@ function vectorangle(v1, v2) end ---@param volumeIdOrName? number | string ---@return Volume +---Will return a `Volume` structure representing the volume with a given ---id or name. You can omit the argument to create a `Volume` ---for the current volume. function volume(volumeIdOrName) end ---@param path string | VolumeItem | Volume ---@return Path +---Will create a `Path` structure representing the given path string. You ---can omit the argument to create a `Path` for the current directory. function path(path) end @@ -1268,22 +1273,21 @@ function pidloop() end ---Creates a Stack structure with arguments as elements function stack(...) end ----@return Path ----can omit the argument to create a `Path` for the current directory. -function scriptpath() end - ---@param volume Volume | number | string +---Changes the current directory to the root directory of the specified volume. ---Volumes can be referenced by instances of `Volume`, their ID numbers ---or their names if they've been given one. Understanding how ---:ref:`volumes work ` is important to understanding this command. function switch(volume) end ---@param path string | VolumeItem | Volume +---Changes the current directory to the one pointed to by the :code:`PATH` ---argument. This command will fail if the path is invalid or does not point ---to an existing directory. function cd(path) end ---@param path string | VolumeItem | Volume +---Changes the current directory to the one pointed to by the :code:`PATH` ---argument. This command will fail if the path is invalid or does not point ---to an existing directory. function chdir(path) end @@ -1291,6 +1295,7 @@ function chdir(path) end ---@param fromPath string | VolumeItem | Volume ---@param toPath string | VolumeItem | Volume ---@return boolean +---Copies the file or directory pointed to by :code:`FROMPATH` to the location ---pointed to :code:`TOPATH`. Depending on what kind of items both paths point ---to the exact behaviour of this command will differ: --- @@ -1339,43 +1344,53 @@ function copypath(fromPath, toPath) end ---@param fromPath string | VolumeItem | Volume ---@param toPath string | VolumeItem | Volume ---@return boolean +---Moves the file or directory pointed to by :code:`FROMPATH` to the location ---pointed to :code:`TOPATH`. Depending on what kind of items both paths point ---to the exact behaviour of this command will differ, see :code:`COPYPATH` above. function movepath(fromPath, toPath) end ---@param path string | VolumeItem ---@return boolean +---Deleted the file or directory pointed to by :code:`FROMPATH`. Directories are ---removed along with all the items they contain. function deletepath(path) end ---@param object ---@param path string | VolumeItem | Volume ---@return VolumeFile +---Serializes the given object to JSON format and saves it under the given path. +--- ---Go to :ref:`Serialization page ` to read more about serialization. function writejson(object, path) end ---@param path string | VolumeItem +---Reads the contents of a file previously created using ``WRITEJSON`` and deserializes them. +--- ---Go to :ref:`Serialization page ` to read more about serialization. function readjson(path) end ---@param path string | VolumeItem | Volume ---@return boolean +---Returns true if there exists a file or a directory under the given path, ---otherwise returns false. Also see :meth:`Volume:EXISTS`. function exists(path) end ---@param path string | VolumeItem | Volume +---Will return a `VolumeFile` or `VolumeDirectory` representing the item ---pointed to by :code:`PATH`. It will return a `boolean` false if there's ---nothing present under the given path. Also see :meth:`Volume:OPEN`. function open(path) end ---@param path string | VolumeItem ---@return VolumeFile +---Creates a file under the given path. Will create parent directories if needed. ---It will fail if a file or a directory already exists under the given path. ---Also see :meth:`Volume:CREATE`. function create(path) end ---@param path string | VolumeItem ---@return VolumeDirectory +---Creates a directory under the given path. Will create parent directories ---if needed. It will fail if a file or a directory already exists under the ---given path. Also see :meth:`Volume:CREATEDIR`. function createdir(path) end diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 08e0e8b3d3..4486f4e6f2 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -273,6 +273,16 @@ private static class BindingChanges { {"BODY", "GETBODY"} }; + private static readonly List removeFunctions = new List() + { + "run", + "load", + "debugdump", + "profileresult", + "makebuiltindelegate", + "droppriority", + "scriptpath" + }; public static void Apply(BindingManager bindingManager, FunctionManager functionManager) { @@ -288,6 +298,11 @@ public static void Apply(BindingManager bindingManager, FunctionManager function functionManager.RawFunctions.Add(rename.Value, variable); functionManager.RawFunctions.Remove(rename.Key); } + + foreach (var functionName in removeFunctions) + { + functionManager.RawFunctions.Remove(functionName); + } } private class Renames : List> From 478085d6c3164c7f97ee855d923e14b16d4a46b0 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 11 Dec 2024 20:27:43 +0300 Subject: [PATCH 086/108] Fix EC drain at "idle" running default modules --- src/kOS.Safe/Screen/IInterpreter.cs | 1 + src/kOS/Lua/LuaInterpreter.cs | 10 ++++++++++ src/kOS/Module/kOSProcessor.cs | 2 +- src/kOS/Screen/KSInterpreter.cs | 2 ++ 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/kOS.Safe/Screen/IInterpreter.cs b/src/kOS.Safe/Screen/IInterpreter.cs index c5db7a8bb3..d5700d4269 100644 --- a/src/kOS.Safe/Screen/IInterpreter.cs +++ b/src/kOS.Safe/Screen/IInterpreter.cs @@ -15,5 +15,6 @@ public interface IInterpreter : IDisposable bool IsWaitingForCommand(); void BreakExecution(); int InstructionsThisUpdate(); + int ECInstructionsThisUpdate(); } } diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 833723f211..f85e728b7a 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -41,6 +41,7 @@ private class ExecInfo public int InstructionsThisUpdate = 0; public bool BreakExecution = false; public int BreakExecutionCount = 0; + public int? IdleInstructions; public readonly KeraLua.Lua CommandCoroutine; public readonly SharedObjects Shared; public ExecInfo(SharedObjects shared, KeraLua.Lua commandCoroutine) @@ -168,6 +169,12 @@ public int InstructionsThisUpdate() return 0; } + public int ECInstructionsThisUpdate() + { + var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; + return Math.Max(InstructionsThisUpdate() - execInfo.IdleInstructions ?? 0, 0); + } + public void KOSFixedUpdate(double dt) { (Shared.Cpu as LuaCPU).FixedUpdate(); @@ -211,6 +218,9 @@ public void KOSFixedUpdate(double dt) } } } + + if (execInfo.IdleInstructions == null) + execInfo.IdleInstructions = execInfo.InstructionsThisUpdate; if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate) execInfo.BreakExecutionCount = 0; diff --git a/src/kOS/Module/kOSProcessor.cs b/src/kOS/Module/kOSProcessor.cs index b6ba7a6435..2126d9a293 100644 --- a/src/kOS/Module/kOSProcessor.cs +++ b/src/kOS/Module/kOSProcessor.cs @@ -1185,7 +1185,7 @@ private void ProcessElectricity(Part partObj, float time) { // Because the processor is not STARVED, evaluate the power requirement based on actual operation. // For EC drain purposes, always pretend atleast 1 instruction happened, so idle drain isn't quite zero: - int instructions = System.Math.Max(shared.Interpreter.InstructionsThisUpdate(), 1); + int instructions = System.Math.Max(shared.Interpreter.ECInstructionsThisUpdate(), 1); var request = volumePower * time + instructions * ECPerInstruction; if (request > 0) { diff --git a/src/kOS/Screen/KSInterpreter.cs b/src/kOS/Screen/KSInterpreter.cs index f7624153e4..6c1feaf333 100644 --- a/src/kOS/Screen/KSInterpreter.cs +++ b/src/kOS/Screen/KSInterpreter.cs @@ -79,6 +79,8 @@ public int InstructionsThisUpdate() return Shared.Cpu.InstructionsThisUpdate; } + public int ECInstructionsThisUpdate() => InstructionsThisUpdate(); + public void Dispose() { } // Everything is disposed in CPU private class InterpreterPath : InternalPath From 07c0b73b96e9010c3e8c6f78804f66cd4a2df4b3 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 12 Dec 2024 16:05:49 +0300 Subject: [PATCH 087/108] Sort callbacks by unique creationTime if priorities are equal Fixes equal priority callbacks changing order after sorting because of the sorting algorithm being unstable --- src/kOS/Lua/Libs/callbacks.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/kOS/Lua/Libs/callbacks.lua b/src/kOS/Lua/Libs/callbacks.lua index 990839336b..373fabff1e 100644 --- a/src/kOS/Lua/Libs/callbacks.lua +++ b/src/kOS/Lua/Libs/callbacks.lua @@ -134,7 +134,9 @@ function M.runcallbacks(callbacks) end if callbacks.unsorted then callbacks.continuation = coroutine.create(function() - table.sort(callbacks, function(a, b) return a.priority < b.priority end) + table.sort(callbacks, function(a, b) + return a.priority == b.priority and a.creationTime > b.creationTime or a.priority < b.priority + end) callbacks.unsorted = false callbacks.continuation = nil end) @@ -186,7 +188,8 @@ function M.addcallback(body, priority, callbacks) end callback.coroutine = nil end, - priority = priority or 0 + priority = priority or 0, + creationTime = time.seconds + kuniverse.timewarp.physicsdeltat * (config.luaipu - opcodesleft) / config.luaipu } table.insert(callbacks, callback) callbacks.unsorted = true From b85ef49486c327ce0b44bb484d23f305fb0e47ea Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 13 Dec 2024 14:32:42 +0300 Subject: [PATCH 088/108] Fix wrong callbacks time sorting order --- src/kOS/Lua/Libs/callbacks.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kOS/Lua/Libs/callbacks.lua b/src/kOS/Lua/Libs/callbacks.lua index 373fabff1e..ce1571c441 100644 --- a/src/kOS/Lua/Libs/callbacks.lua +++ b/src/kOS/Lua/Libs/callbacks.lua @@ -135,7 +135,7 @@ function M.runcallbacks(callbacks) if callbacks.unsorted then callbacks.continuation = coroutine.create(function() table.sort(callbacks, function(a, b) - return a.priority == b.priority and a.creationTime > b.creationTime or a.priority < b.priority + return a.priority == b.priority and a.creationTime < b.creationTime or a.priority < b.priority end) callbacks.unsorted = false callbacks.continuation = nil From e7786b719aa88367c10bf9deeb366a5941824df7 Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 13 Dec 2024 17:11:27 +0300 Subject: [PATCH 089/108] Fix annotations formatting, add annotations to `misc.vecdraw` function --- .../PluginData/LuaLSAddon/library/base.lua | 12 ++--- src/kOS/Lua/Libs/callbacks.lua | 54 +++++++++---------- src/kOS/Lua/Libs/misc.lua | 37 ++++++++----- 3 files changed, 57 insertions(+), 46 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua index 1d440ee67b..e897e760cd 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua @@ -1,14 +1,14 @@ --- Function that gets called by kOS each physics tick. +---Function that gets called by kOS each physics tick. ---@type function | nil fixedupdate = nil --- Function that gets called by kOS each frame. +---Function that gets called by kOS each frame. ---@type function | nil update = nil --- Function that gets called by kOS when `Ctrl+C` is pressed. --- If `Ctrl+C` was pressed 3 times while the command code was deprived of instructions by the `fixedupdate` function, --- both `fixedupdate` and `update` function get set to `nil` as a way to prevent the core from geting stuck. --- To prevent it from happening this function must ensure the terminal is not deprived of instructions. +---Function that gets called by kOS when `Ctrl+C` is pressed. +---If `Ctrl+C` was pressed 3 times while the command code was deprived of instructions by the `fixedupdate` function, +---both `fixedupdate` and `update` function get set to `nil` as a way to prevent the core from geting stuck. +---To prevent it from happening this function must ensure the terminal is not deprived of instructions. ---@type function | nil breakexecution = nil diff --git a/src/kOS/Lua/Libs/callbacks.lua b/src/kOS/Lua/Libs/callbacks.lua index ce1571c441..e632ad16a1 100644 --- a/src/kOS/Lua/Libs/callbacks.lua +++ b/src/kOS/Lua/Libs/callbacks.lua @@ -1,27 +1,27 @@ local M = {} function M.init() - -- Controls how kOS should steer the ship. - -- Options: - -- - `function` that returns one of the options listed below. - -- - `Direction` the ship should point towards. - -- - `Vector` the ship should point towards. Like `Direction`, but without the roll component - -- - `string` "kill". The ship will try to kill all its angular velocity + ---Controls how kOS should steer the ship. + ---Options: + ---- `function` that returns one of the options listed below. + ---- `Direction` the ship should point towards. + ---- `Vector` the ship should point towards. Like `Direction`, but without the roll component + ---- `string` "kill". The ship will try to kill all its angular velocity ---@type function | Direction | Vector | Node | "kill" steering = nil - -- Controls the throttle value of the ship. Can be a number or a function returning a number. - -- The number is expected to be between 0 and 1. + ---Controls the throttle value of the ship. Can be a number or a function returning a number. + ---The number is expected to be between 0 and 1. ---@type function | number throttle = nil - -- Options: - -- - `function` that returns one of the options listed below. - -- - `number`. Compass heading the ship should steer towards. - -- - `GeoCoordinates` the ship should steer towards. - -- - `Vessel` the ship should steer towards. + ---Options: + ---- `function` that returns one of the options listed below. + ---- `number`. Compass heading the ship should steer towards. + ---- `GeoCoordinates` the ship should steer towards. + ---- `Vessel` the ship should steer towards. ---@type function | number | GeoCoordinates | Vessel wheelsteering = nil - -- Controls the wheel throttle value of the ship. Can be a number or a function returning a number. - -- The number is expected to be between 0 and 1. + ---Controls the wheel throttle value of the ship. Can be a number or a function returning a number. + ---The number is expected to be between 0 and 1. ---@type function | number wheelthrottle = nil @@ -60,8 +60,8 @@ function M.breakexecution() M.updatecallbacks = {} end --- A table with a finalizer that gets called when the lua state is disposed(on shutdown, reboot). --- Makes the core automatically "let go" of the controls. +---A table with a finalizer that gets called when the lua state is disposed(on shutdown, reboot). +---Makes the core automatically "let go" of the controls. M.finalizer = setmetatable({}, { __gc = function() toggleflybywire("steering", false) toggleflybywire("throttle", false) @@ -158,16 +158,16 @@ function M.runcallbacks(callbacks) end ---@param body function : --- Callback function body to get executed on the next physics tick(or the next frame, see the third parameter). --- If returns a number or `true` the callback doesn't get cleared. --- If returns a number this number will be used as the callback priority, see the second parameter. +---Callback function body to get executed on the next physics tick(or the next frame, see the third parameter). +---If returns a number or `true` the callback doesn't get cleared. +---If returns a number this number will be used as the callback priority, see the second parameter. ---@param priority? number : --- Callback priority. Callbacks with highest priorities get executed first. Default is 0. +---Callback priority. Callbacks with highest priorities get executed first. Default is 0. ---@param callbacks? table : --- Callbacks table where to add the callback to. --- Options: --- - `callbacks.fixedupdatecallbacks`: gets executed each physics tick. Default. --- - `callbacks.updatecallbacks`: gets executed each frame. +---Callbacks table where to add the callback to. +---Options: +---- `callbacks.fixedupdatecallbacks`: gets executed each physics tick. Default. +---- `callbacks.updatecallbacks`: gets executed each frame. function M.addcallback(body, priority, callbacks) callbacks = callbacks or M.fixedupdatecallbacks local callback = { @@ -196,7 +196,7 @@ function M.addcallback(body, priority, callbacks) return callback end --- "When" trigger implemented as a wrapper around the `addcallback` function. +---"When" trigger implemented as a wrapper around the `addcallback` function. ---@param condition function The callback executes only if this function returns a true value ---@param body function The same as in `addcallback` function ---@param priority? number The same as in `addcallback` function @@ -211,7 +211,7 @@ function M.when(condition, body, priority, callbacks) end, priority, callbacks) end --- "On" trigger implemented as a wrapper around the `addcallback` function. +---"On" trigger implemented as a wrapper around the `addcallback` function. ---@param state function The callback executes only if this function returns a value that is not equal to the value it returned previously ---@param body function The same as in `addcallback` function ---@param priority? number The same as in `addcallback` function diff --git a/src/kOS/Lua/Libs/misc.lua b/src/kOS/Lua/Libs/misc.lua index 432c9f83c8..582c3fe911 100644 --- a/src/kOS/Lua/Libs/misc.lua +++ b/src/kOS/Lua/Libs/misc.lua @@ -10,25 +10,25 @@ function M.init() ---@field encode fun(table): string encodes a `table` into a json `string` ---@field decode fun(string): table decodes a json `string` into a `table` - -- [openrestry/lua-cjson module](https://github.com/openresty/lua-cjson/tree/2.1.0.10rc1). - -- Not all keys are annotated. Complete documentation is available at the link. + ---[openrestry/lua-cjson module](https://github.com/openresty/lua-cjson/tree/2.1.0.10rc1). + ---Not all keys are annotated. Complete documentation is available at the link. ---@type CJson json = select(2, pcall(require, "cjson")) end --- Suspends the execution for the specified amount of time. --- Any call to this function will suspend execution for at least one physics tick. --- This function is a simple abstraction made to achieve the same effect as the kerboscript `wait *number*.` command. --- One difference is it only suspends the execution of the coroutine it was called from, making it totally fine to use inside callbacks. +---Suspends the execution for the specified amount of time. +---Any call to this function will suspend execution for at least one physics tick. +---This function is a simple abstraction made to achieve the same effect as the kerboscript `wait *number*.` command. +---One difference is it only suspends the execution of the coroutine it was called from, making it totally fine to use inside callbacks. function M.wait(seconds) local waitEnd = time.seconds + seconds coroutine.yield() while time.seconds < waitEnd do coroutine.yield() end end --- Suspends the execution until the `condition` function returns a true value. --- This function is a simple abstraction made to achieve the same effect as the kerboscript `wait until *condition*.` command. --- One difference is it only suspends the execution of the coroutine it was called from, making it totally fine to use inside callbacks. +---Suspends the execution until the `condition` function returns a true value. +---This function is a simple abstraction made to achieve the same effect as the kerboscript `wait until *condition*.` command. +---One difference is it only suspends the execution of the coroutine it was called from, making it totally fine to use inside callbacks. ---@param condition function function M.waituntil(condition) while not condition() do coroutine.yield() end @@ -37,7 +37,7 @@ end M.vecdraws = setmetatable({}, { __mode = "v" }) M.updatingvecdraws = setmetatable({}, { __mode = "v" }) --- A wrapper around kOS `CLEARVECDRAWS` function that also clears vecdraws created with the `vecdraw` function +---A wrapper around kOS `CLEARVECDRAWS` function that also clears vecdraws created with the `vecdraw` function function M.clearvecdraws() CLEARVECDRAWS() for _,vd in pairs(M.vecdraws) do @@ -95,8 +95,18 @@ local vecdrawmt = { __gc = function(vd) vd.show = false end, } --- Wrapper around kOS `VECDRAW` function that uses the callbacks library to automatically update the "start", "vector" and "color" values. --- Those 3 parameters can also accept functions, in which case their values will be changed each frame with the return value of the functions. +---@class VecdrawTable : Vecdraw +---@field structure Vecdraw +---@field parameters table + +---Wrapper around kOS `VECDRAW` function that uses the callbacks library to automatically update the "start", "vector" and "color" values. +---Those 3 parameters can also accept functions, in which case their values will be changed each frame with the return value of the functions. +---This function returns a table representing a Vecdraw structure, and when this table gets garbage collected the vecdraw is removed. +---``` +---vd = vecdraw(nil, mun.position) -- assign the return value to a variable to keep it from being collected +---vd.show = true +---vd = nil -- this will remove the vecdraw by garbage collection +---``` ---@param start? Vector | function `Vector` in ship-raw reference frame where the `Vecdraw` will be drawn from. ---@param vector? Vector | function absolute `Vector` position where the `Vecdraw` should end. ---@param color? RGBA | function @@ -106,7 +116,8 @@ local vecdrawmt = { ---@param width? number ---@param pointy? boolean ---@param wiping? boolean ----@return Vecdraw +---@return VecdrawTable +---@nodiscard function M.vecdraw(start, vector, color, label, scale, show, width, pointy, wiping) local vd = { structure = VECDRAW(v(0,0,0), v(0,0,0), white, label or "", scale or 1, show ~= nil and show, width or 0.2, pointy == nil or pointy, wiping == nil or wiping), From 14f542818384873f572047da92d1861ddb644ddc Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 14 Dec 2024 17:32:18 +0300 Subject: [PATCH 090/108] Make control bound variables only accessible with a capital name --- src/kOS/Lua/Binding.cs | 21 ++++++++++++++------- src/kOS/Lua/Libs/callbacks.lua | 8 ++++---- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 4486f4e6f2..3a7728bbee 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -31,8 +31,6 @@ public static class Binding // would print 1 because both v1 and v2 would be the same lua object, which is what we are avoiding here. typeof(Vector), typeof(Direction), typeof(TimeSpan), typeof(TimeStamp) }; - private static readonly string[] controlVariables = { "STEERING", "THROTTLE", "WHEELSTEERING", "WHEELTHROTTLE" }; - private static readonly string[] capitalNameOnlyVariables = { "VECDRAW", "CLEARVECDRAWS" }; // the CSharp object to userdata binding model was adapted from NLua model // with some simplifications and changes to make it work on Structures @@ -105,7 +103,8 @@ private static int EnvIndex(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var index = state.ToString(2); var binding = Bindings[state.MainThread.Handle]; - var isCapitalNameOnlyVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); + var isCapitalNameOnlyVariableNotCapital = BindingChanges.CapitalNameOnlyVariables.Contains(index.ToUpper()) + && index.Any(char.IsLower); if (isCapitalNameOnlyVariableNotCapital) return 0; var variables = (binding.Shared.BindingMgr as BindingManager).RawVariables; @@ -128,10 +127,9 @@ private static int EnvNewIndex(IntPtr L) var binding = Bindings[state.MainThread.Handle]; var variables = (binding.Shared.BindingMgr as BindingManager).RawVariables; var index = state.ToString(2); - var isCapitalNameOnlyVariableNotCapital = capitalNameOnlyVariables.Contains(index.ToUpper()) && !capitalNameOnlyVariables.Contains(index); - var isControlVariable = controlVariables.Contains(index.ToUpper()) && !controlVariables.Contains(index); - if (!isControlVariable && !isCapitalNameOnlyVariableNotCapital - && variables.TryGetValue(index, out var boundVar)) + var isCapitalNameOnlyVariableNotCapital = BindingChanges.CapitalNameOnlyVariables.Contains(index.ToUpper()) + && index.Any(char.IsLower); + if (!isCapitalNameOnlyVariableNotCapital && variables.TryGetValue(index, out var boundVar)) { if (boundVar.Set == null) { @@ -264,6 +262,15 @@ public static void DumpStack(KeraLua.Lua state, string debugName = "", BindingDa private static class BindingChanges { + public static readonly HashSet CapitalNameOnlyVariables = new HashSet + { + "STEERING", + "THROTTLE", + "WHEELSTEERING", + "WHEELTHROTTLE", + "VECDRAW", + "CLEARVECDRAWS" + }; private static readonly Renames variableRenames = new Renames() { {"STAGE", "STAGEINFO"}, diff --git a/src/kOS/Lua/Libs/callbacks.lua b/src/kOS/Lua/Libs/callbacks.lua index e632ad16a1..d0a2dc6450 100644 --- a/src/kOS/Lua/Libs/callbacks.lua +++ b/src/kOS/Lua/Libs/callbacks.lua @@ -81,7 +81,7 @@ function M.runcontrol() end function M.processcontrol() - if rawget(_ENV, "steering") then + if steering then M.controlled.steering = true local success, error = pcall(function() STEERING = type(steering) == "function" and steering() or steering end) if not success then @@ -92,7 +92,7 @@ function M.processcontrol() M.controlled.steering = false toggleflybywire("steering", false) end - if rawget(_ENV, "throttle") then + if throttle then M.controlled.throttle = true local success, error = pcall(function() THROTTLE = type(throttle) == "function" and throttle() or throttle end) if not success then @@ -103,7 +103,7 @@ function M.processcontrol() M.controlled.throttle = false toggleflybywire("throttle", false) end - if rawget(_ENV, "wheelsteering") then + if wheelsteering then M.controlled.wheelsteering = true local success, error = pcall(function() WHEELSTEERING = type(wheelsteering) == "function" and wheelsteering() or wheelsteering end) if not success then @@ -114,7 +114,7 @@ function M.processcontrol() M.controlled.wheelsteering = false toggleflybywire("wheelsteering", false) end - if rawget(_ENV, "wheelthrottle") then + if wheelthrottle then M.controlled.wheelthrottle = true local success, error = pcall(function() WHEELTHROTTLE = type(wheelthrottle) == "function" and wheelthrottle() or wheelthrottle end) if not success then From 082c5d1ad823c3ba4e8331e5fb553e658aec4e06 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 19 Dec 2024 14:57:21 +0300 Subject: [PATCH 091/108] Check for clobbering kOS functions --- src/kOS/Lua/Binding.cs | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 3a7728bbee..64c05dbfd1 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -120,16 +120,27 @@ private static int EnvIndex(IntPtr L) } return 0; } + + private const string ClobberBuiltInsMessage = + "If you really want to be able to \"hide\" a built-in variable/function behind a user variable you can "+ + "\"rawset(_ENV, *variableName*, *value*)\" or allow it globally with \"config.clobberBuiltIns = true\""; private static int EnvNewIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); - var binding = Bindings[state.MainThread.Handle]; - var variables = (binding.Shared.BindingMgr as BindingManager).RawVariables; var index = state.ToString(2); + var isCapitalNameOnlyVariableNotCapital = BindingChanges.CapitalNameOnlyVariables.Contains(index.ToUpper()) && index.Any(char.IsLower); - if (!isCapitalNameOnlyVariableNotCapital && variables.TryGetValue(index, out var boundVar)) + if (isCapitalNameOnlyVariableNotCapital) + { + state.RawSet(1); + return 0; + } + + var binding = Bindings[state.MainThread.Handle]; + var variables = (binding.Shared.BindingMgr as BindingManager).RawVariables; + if (variables.TryGetValue(index, out var boundVar)) { if (boundVar.Set == null) { @@ -138,19 +149,21 @@ private static int EnvNewIndex(IntPtr L) state.RawSet(1); return 0; } - return state.Error($"Attempt to assign to a built-in variable({index}) that doesn't have a setter.\n"+ - "If you really want to be able to \"hide\" a built-in variable behind a user "+ - "variable you can \"rawset(_ENV, *variableName*, *value*)\" or allow it globally " - +"with \"config.clobberBuiltIns = true\""); + return state.Error($"Attempt to clobber a built-in kOS bound variable without a setter: {boundVar.Name}.\n"+ClobberBuiltInsMessage); } var newValue = ToCSharpObject(state, 3, binding); if (newValue == null) return 0; LuaExceptionCatch(() => boundVar.Value = newValue, state); + return 0; } - else + + var functions = (binding.Shared.FunctionManager as FunctionManager).RawFunctions; + if (functions.TryGetValue(index, out var function) && !SafeHouse.Config.AllowClobberBuiltIns) { - state.RawSet(1); + return state.Error($"Attempt to clobber a built-in kOS function: {function.FunctionName}.\n"+ClobberBuiltInsMessage); } + + state.RawSet(1); return 0; } From f942fe84bf70ff8a171e79abfc4593dc57ab2bea Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 19 Dec 2024 14:58:02 +0300 Subject: [PATCH 092/108] Fix annotations for vectorcrossproduct and vdot functions --- .../GameData/kOS/PluginData/LuaLSAddon/library/functions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua index 06273227c5..3484fbd885 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua @@ -1109,7 +1109,7 @@ function vectorcrossproduct(v1, v2) end ---@param v1 Vector (`Vector`) ---@param v2 Vector (`Vector`) ----@return Vector +---@return number ---:return: The `vector dot-product `__ ---This is the `dot product `__ of two vectors returning a scalar number. This is the same as :ref:`v1 * v2 `:: --- @@ -1126,7 +1126,7 @@ function vdot(v1, v2) end ---@param v1 Vector (`Vector`) ---@param v2 Vector (`Vector`) ----@return Vector +---@return number ---:return: The `vector dot-product `__ ---This is the `dot product `__ of two vectors returning a scalar number. This is the same as :ref:`v1 * v2 `:: --- From 25ab5df0c084c251f7e132fc0030d9613928bb9d Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 19 Dec 2024 20:08:22 +0300 Subject: [PATCH 093/108] Add documentation for the lua interpreter --- doc/source/contents.rst | 1 + doc/source/lua_interpreter.rst | 205 +++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 doc/source/lua_interpreter.rst diff --git a/doc/source/contents.rst b/doc/source/contents.rst index 967dafacda..a4cbc12d54 100644 --- a/doc/source/contents.rst +++ b/doc/source/contents.rst @@ -23,6 +23,7 @@ Documentation Table of Contents Getting Help Changes About + Lua Interpreter Indices and tables ================== diff --git a/doc/source/lua_interpreter.rst b/doc/source/lua_interpreter.rst new file mode 100644 index 0000000000..0537dbc8e7 --- /dev/null +++ b/doc/source/lua_interpreter.rst @@ -0,0 +1,205 @@ +.. _lua_interpreter: + +Lua Interpreter +=============== + +Lua interpreter is one of the options for the "interpreter" field on kOSProcessors. +You can enable it with the PAW menu activated by right clicking on the kOSProcessor part or with the ``core:setfield("interpreter", "lua").`` terminal command. +Lua interpreter uses all the same structures, functions and bound variables that are available in kOS. +This documentation will walk you through how to use it if you are already comfortable using kOS with kerboscript, documentation for people new to kOS may come in the future. +Basic knowledge of lua is required. + +- `Main differences from kerboscript`_ +- `Main lua changes`_ +- `Development environment`_ +- `Name changes to bound variables and functions`_ +- `Default modules`_ +- `Callbacks module`_ +- `Misc module`_ +- `Design patterns`_ +- `Example scripts`_ + +Main differences from kerboscript +--------------------------------- +For the most part you can directly apply your kerboscript knowledge when using the lua interpreter. +Just write the lua scripts using its syntax as you would kerboscript, but there are a few differences you need to be aware of. + +- The difference between kerboscript ``RUN`` command and ``dofile`` and ``loadfile`` functions. The main difference being that the context is shared across the whole core. +- Triggers are implemented using the `callback system`_. While you can use them exactly like you would use kerboscript triggers, that is not the most efficient way. +- Some kerboscript commands are functions in lua. Examples being ``wait``, ``waituntil``, ``buildlist``, ``printlist``, ``add``, ``remove`` etc. The first two are a part of the default `Misc module`_. The other functions are available in kerboscript too, but most people use their command equivalents. + +Main lua changes +---------------- +- ``io``, ``os``, ``debug`` libraries are not loaded. +- Basic library functions accessing the file system are made to access the internal kOS file system. +- The environment table has ``__index`` and ``__newindex`` metamethods that act as a binding layer for kOS functions and bound variables. +- `Default modules`_ are loaded. +- There is a small syntactic sugar to define functions that return expressions. ``> *expression*`` gets interpreted as ``function() return *expression* end``. + +Development environment +----------------------- +The best way to use the lua interpreter is with a text editor that assists you. +To get annotations for all structures, functions and bound variables with their descriptions, +as well as support for the added syntactic sugar see the README file at ``*KSP_Folder*/GameData/kOS/PluginData/LuaLSAddon/README.md``. + +Name changes to bound variables and functions +--------------------------------------------- +Some changes were neccessary to resolve name conflicts: + +- "stage" bound variable got renamed to "stageinfo". +- "heading" bound variable got renamed to "shipheading". +- "body" function got renamed to "getbody". + +kOS variables and functions that are accessable only by capital names: + +"STEERING", "THROTTLE", "WHEELSTEERING", "WHEELTHROTTLE", "VECDRAW", "CLEARVECDRAWS". + +This was done so there is no confusion between kOS variables and lua variables used by default modules. + +Default modules +--------------- +You can look at the code for the default modules at the ``*KSP_Folder*/GameData/kOS/PluginData/LuaModules`` folder. +You can also create your own modules, place them in this folder and kOS will automatically require them during core booting. + +Callbacks module +---------------- + +Ship control +------------ +There are 4 variables that are used to access ship control: ``steering``, ``throttle``, ``wheelsteering``, ``wheelthrottle``. +If a function is assigned to those variables the return value of the function will be calculated at the start of each physics tick and used as the value to control the ship. + +:: + + steering = function() return prograde end -- kOS will continuously point the ship prograde + + steering => prograde -- equivalent to the previous command using the added syntactic sugar + + steering = prograde -- value will be updated once and stay, even if prograde changes in the future + + +Callback system +--------------- +Callbacks is a list of lua `coroutines `_ that get called each physics tick(or each frame). +The main interface to the callback system is the ``addcallback`` function. + +``addcallback(body, priority?, callbacks?)`` +```````````````````````````````````````````` + body: + Callback function body to get executed on the next physics tick(or the next frame, see the third parameter). + If returns a number or ``true`` the callback doesn't get cleared. + If returns a number this number will be used as the callback priority, see the second parameter. + priority?: + Callback priority. Callbacks with highest priorities get executed first. Default is 0. + callbacks?: + Callbacks table where to add the callback to. + Options: + + - ``callbacks.fixedupdatecallbacks``: gets executed each physics tick(Default). + - ``callbacks.updatecallbacks``: gets executed each frame. + +``when(condition, body, priority?, callbacks?)`` +```````````````````````````````````````````````` + | **condition:** The callback executes only if this function returns a true value + | **body:** Same as in ``addcallback`` function + | **priority?:** Same as in ``addcallback`` function + | **callbacks?:** Same as in ``addcallback`` function + + "When" trigger implemented as a wrapper around the ``addcallback`` function. + +``on(state, body, priority?, callbacks?)`` +`````````````````````````````````````````` + | **state:** The callback executes only if this function returns a value that is not equal to the value it returned previously + | **body:** Same as in ``addcallback`` function + | **priority?:** Same as in ``addcallback`` function + | **callbacks?:** Same as in ``addcallback`` function + + "On" trigger implemented as a wrapper around the ``addcallback`` function. + +.. note:: + Callbacks are coroutines, and `wait <#wait-seconds>`_/`waituntil <#waituntil-condition>`_ functions are simple abstractions using the ``coroutine.yield`` function. + Because of this using ``wait`` in a callback will not block any other code. + You can think of it as a callback saying "Ok, I am done for now, I will let other code execute until its my turn again". + This unlocks some helpful design patterns: + + Timed actions in callbacks without nesting:: + + when(> alt.radar < 100, function() + gear = true + wait(7) + print("Gear deployed.") + end) + + The ``wait(7)`` being inside the callback body means the following code(or the terminal) is not blocked. + + Running programs without blocking the terminal:: + + addcallback(> dofile("launch.lua")) + + As long as the running program is not using all available instructions the terminal won't be blocked. + This also allows running multiple blocking functions/programs at the same time. + In that case the programs would "pass" the execution between each other using the "wait" functions. + +Misc module +------------ + +``wait(seconds)`` +````````````````` + Suspends the execution for the specified amount of time. + Any call to this function will suspend execution for at least one physics tick. + This function is a simple abstraction made to achieve the same effect as the kerboscript ``wait *number*.`` command. + + implementation:: + + function wait(seconds) + local waitEnd = time.seconds + seconds + coroutine.yield() + while time.seconds < waitEnd do coroutine.yield() end + end + +``waituntil(condition)`` +```````````````````````` + **condition:** function + + Suspends the execution until the ``condition`` function returns a true value. + This function is a simple abstraction made to achieve the same effect as the kerboscript ``wait until *condition*.`` command. + + implementation:: + + function waituntil(condition) + while not condition() do coroutine.yield() end + end + +``vecdraw(start?, vector?, color?, label?, scale?, show?, width?, pointy?, wiping?): VecdrawTable`` +``````````````````````````````````````````````````````````````````````````````````````````````````` + Wrapper around kOS :func:`VECDRAW` function that uses the `Callback system`_ to automatically update the "start", "vector" and "color" values. + Those 3 parameters can also accept functions, in which case their values will be changed each frame with the return value of the functions. + This function returns a table representing a Vecdraw structure, and when this table gets garbage collected the vecdraw is removed. + + :: + + vd = vecdraw(nil, mun.position) -- assign the return value to a variable to keep it from being collected + vd.show = true + vd = nil -- this will remove the vecdraw by garbage collection + +``clearvecdraws()`` +``````````````````` + A wrapper around kOS :func:`CLEARVECDRAWS` function that also clears vecdraws created with the ``vecdraw`` function + +``json`` +```````` + `openrestry/lua-cjson module `_ used for encoding and decoding json. + +Design patterns +--------------- + +Interactive scripts +``````````````````` + You can run programs defining functions/callbacks etc. made to be interacted with from the terminal. + For example you can have a program defining basic utility functions and then using them how you please from the terminal. + Or create an interactive script for a specific craft that runs as its firmware from the bootfile. + It was possible with kerboscript using telnet to paste programs into the terminal, but in lua the context between programs and the terminal is shared, making it much easier to do. + +Example scripts +--------------- + You can take a look at some examples of using lua at `sug44/kOSLuaScripts `_ From 3239c5481053f35d1891bdc92d78464a516322cb Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 22 Dec 2024 18:32:23 +0300 Subject: [PATCH 094/108] Share lua types across all lua states --- src/kOS/Lua/Binding.cs | 24 +++++++----------------- src/kOS/Lua/Types/KSFunction.cs | 6 +++--- src/kOS/Lua/Types/KSStructure.cs | 9 +++++---- src/kOS/Lua/Types/LuaTypeBase.cs | 1 + 4 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 64c05dbfd1..e660f5db66 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -1,21 +1,13 @@ using KeraLua; using kOS.Binding; -using kOS.Safe; -using kOS.Safe.Binding; using kOS.Safe.Encapsulation; -using kOS.Safe.Encapsulation.Suffixes; -using kOS.Safe.Exceptions; -using kOS.Safe.Execution; using kOS.Safe.Function; using kOS.Safe.Utilities; using System; using System.Collections.Generic; using System.Linq; -using System.Text; -using System.Text.RegularExpressions; using kOS.Lua.Types; using kOS.Suffixed; -using Smooth.Collections; using Debug = UnityEngine.Debug; using TimeSpan = kOS.Suffixed.TimeSpan; @@ -24,6 +16,7 @@ namespace kOS.Lua public static class Binding { public static readonly Dictionary Bindings = new Dictionary(); + private static readonly LuaTypeBase[] luaTypes = { new KSStructure(), new KSFunction() }; private static readonly HashSet uniqueTypes = new HashSet() { // Types of objects that you want to create new lua instances of when pushing onto the stack, // but that have overridden Equals and GetHashCode methods so BindingData.Objects dictionary @@ -38,17 +31,11 @@ public class BindingData { public readonly Dictionary Objects = new Dictionary(); public readonly Dictionary UserdataPtrs = new Dictionary(); - public readonly LuaTypeBase[] Types; public readonly SharedObjects Shared; - public BindingData(KeraLua.Lua state, SharedObjects shared) + public BindingData(SharedObjects shared) { Shared = shared; - Types = new LuaTypeBase[] - { - new KSStructure(state), - new KSFunction(state), - }; } } @@ -56,7 +43,10 @@ public static void BindToState(KeraLua.Lua state, SharedObjects shared) { state = state.MainThread; BindingChanges.Apply(shared.BindingMgr as BindingManager, shared.FunctionManager as FunctionManager); - Bindings[state.Handle] = new BindingData(state, shared); + Bindings[state.Handle] = new BindingData(shared); + + foreach (var type in luaTypes) + type.CreateMetatable(state); // set index and newindex metamethods on the environment table state.PushGlobalTable(); @@ -205,7 +195,7 @@ public static int PushLuaType(KeraLua.Lua state, object obj, BindingData binding break; default: { - foreach (var type in binding.Types) + foreach (var type in luaTypes) if (type.BindingTypes.Any(t => t.IsInstanceOfType(obj))) return PushObject(state, obj, binding, type.MetatableName); state.PushNil(); diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index b01ff245e0..ef368846e0 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -14,10 +14,10 @@ public class KSFunction : LuaTypeBase public override string MetatableName => metatableName; public override Type[] BindingTypes => bindingTypes; - public KSFunction(KeraLua.Lua state) + public override void CreateMetatable(KeraLua.Lua state) { - state.NewMetaTable(MetatableName); - state.PushString(MetatableName); + state.NewMetaTable(metatableName); + state.PushString(metatableName); state.SetField(-2, "__type"); AddMethod(state, "__call", KSFunctionCall); AddMethod(state, "__gc", Binding.CollectObject); diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index f0192a97b4..68b0a9ea93 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -17,14 +17,15 @@ namespace kOS.Lua.Types public class KSStructure : LuaTypeBase { private static readonly CalculatorStructure structureCalculator = new CalculatorStructure(); + private static readonly string metatableName = "Structure"; private static readonly Type[] bindingTypes = { typeof(Structure) }; - public override string MetatableName => "Structure"; + public override string MetatableName => metatableName; public override Type[] BindingTypes => bindingTypes; - public KSStructure(KeraLua.Lua state) + public override void CreateMetatable(KeraLua.Lua state) { - state.NewMetaTable(MetatableName); - state.PushString(MetatableName); + state.NewMetaTable(metatableName); + state.PushString(metatableName); state.SetField(-2, "__type"); AddMethod(state, "__index", StructureIndex); AddMethod(state, "__newindex", StructureNewIndex); diff --git a/src/kOS/Lua/Types/LuaTypeBase.cs b/src/kOS/Lua/Types/LuaTypeBase.cs index d9c6a52bbf..36cd1636d8 100644 --- a/src/kOS/Lua/Types/LuaTypeBase.cs +++ b/src/kOS/Lua/Types/LuaTypeBase.cs @@ -6,6 +6,7 @@ public abstract class LuaTypeBase { public abstract Type[] BindingTypes { get; } public abstract string MetatableName { get; } + public abstract void CreateMetatable(KeraLua.Lua state); private protected static void AddMethod(KeraLua.Lua state, string name, KeraLua.LuaFunction metaMethod) { From 535a0816aba1188604fa2f42312addd1e27e9f0f Mon Sep 17 00:00:00 2001 From: sug44 Date: Tue, 24 Dec 2024 21:54:07 +0300 Subject: [PATCH 095/108] Fix potential NRE in `LuaInterpreter.ECInstructionsThisUpdate` --- src/kOS/Lua/LuaInterpreter.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index f85e728b7a..3049fe25e6 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -163,16 +163,17 @@ public void BreakExecution() } public int InstructionsThisUpdate() - { // ProcessElectricity() calls this after changing interpreter when stuff is not initialized yet - if (state != null && stateInfo.TryGetValue(state.MainThread.Handle, out var info)) - return info.InstructionsThisUpdate; + { + if (state != null && stateInfo.TryGetValue(state.MainThread.Handle, out var execInfo)) + return execInfo.InstructionsThisUpdate; return 0; } public int ECInstructionsThisUpdate() { - var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; - return Math.Max(InstructionsThisUpdate() - execInfo.IdleInstructions ?? 0, 0); + if (state != null && stateInfo.TryGetValue(state.MainThread.Handle, out var execInfo)) + return Math.Max(execInfo.InstructionsThisUpdate - execInfo.IdleInstructions ?? 0, 0); + return 0; } public void KOSFixedUpdate(double dt) From acc88a959cc813385b50cd7b6f8983b079293940 Mon Sep 17 00:00:00 2001 From: sug44 Date: Wed, 25 Dec 2024 21:45:35 +0300 Subject: [PATCH 096/108] Add `log` function to the dev library --- src/kOS/Lua/Libs/Dev.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/kOS/Lua/Libs/Dev.cs b/src/kOS/Lua/Libs/Dev.cs index bf40b35b18..f40d71b210 100644 --- a/src/kOS/Lua/Libs/Dev.cs +++ b/src/kOS/Lua/Libs/Dev.cs @@ -7,6 +7,7 @@ public static class Dev { private static readonly RegList devLib = new RegList { + {"log", Log}, {"getregistry", GetRegistry}, {"getupvalues", GetUpvalues}, {null, null} @@ -19,6 +20,14 @@ public static int Open(IntPtr L) state.SetFuncs(devLib.ToArray(), 0); return 1; } + + private static int Log(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var logMessage = state.CheckString(1); + UnityEngine.Debug.Log(logMessage); + return 0; + } private static int GetRegistry(IntPtr L) { From 39d07d4a8d563ee280d01d17a57c905fee7e348f Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 26 Dec 2024 11:14:54 +0300 Subject: [PATCH 097/108] Rename lua `ExecInfo` to `InstructionHookInfo`, move irrelevant to the instructions hook fields to LuaInterpreter --- src/kOS/Lua/LuaInterpreter.cs | 95 +++++++++++++++++------------------ 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 3049fe25e6..6c0efc87e2 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Text; -using System.IO; -using System.Reflection; using KeraLua; using kOS.Safe; using kOS.Safe.Utilities; @@ -13,15 +11,19 @@ namespace kOS.Lua { public class LuaInterpreter : IInterpreter, IFixedUpdateObserver, IUpdateObserver { + public const string LuaVersion = "5.4"; + public static readonly string[] FilenameExtensions = { "lua" }; + public string Name => "lua"; + private SharedObjects Shared { get; } private KeraLua.Lua state; private KeraLua.Lua commandCoroutine; private KeraLua.Lua fixedUpdateCoroutine; private KeraLua.Lua updateCoroutine; - private static readonly Dictionary stateInfo = new Dictionary(); - public const string LuaVersion = "5.4"; - public static readonly string[] FilenameExtensions = new string[] { "lua" }; - public string Name => "lua"; - private SharedObjects Shared { get; } + /// Relevant information for the instruction hook meant to be accessed with the lua state handle in a static context + private static readonly Dictionary stateHookInfo = new Dictionary(); + private readonly Queue commandsQueue = new Queue(); + private int breakExecutionCount; + private int? idleInstructions; private class CommandInfo { @@ -34,20 +36,15 @@ public CommandInfo(string command, string chunkName) } } - private class ExecInfo + private class InstructionHookInfo { - public readonly Queue CommandsQueue = new Queue(); - public int InstructionsPerUpdate = SafeHouse.Config.InstructionsPerUpdate; - public int InstructionsThisUpdate = 0; - public bool BreakExecution = false; - public int BreakExecutionCount = 0; - public int? IdleInstructions; - public readonly KeraLua.Lua CommandCoroutine; + public int InstructionsPerUpdate; + public int InstructionsThisUpdate; + public bool BreakExecution; public readonly SharedObjects Shared; - public ExecInfo(SharedObjects shared, KeraLua.Lua commandCoroutine) + public InstructionHookInfo(SharedObjects shared) { Shared = shared; - CommandCoroutine = commandCoroutine; } } @@ -70,7 +67,7 @@ public void Boot() commandCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); fixedUpdateCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); updateCoroutine.SetHook(AfterEveryInstructionHook, LuaHookMask.Count, 1); - stateInfo.Add(state.MainThread.Handle, new ExecInfo(Shared, commandCoroutine)); + stateHookInfo.Add(state.MainThread.Handle, new InstructionHookInfo(Shared)); Libraries.Open(state, Shared); @@ -103,9 +100,9 @@ public void Boot() private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) { var state = KeraLua.Lua.FromIntPtr(L); - var execInfo = stateInfo[state.MainThread.Handle]; - if (++execInfo.InstructionsThisUpdate >= execInfo.InstructionsPerUpdate || execInfo.BreakExecution - || (execInfo.Shared.Cpu as LuaCPU).IsYielding()) + var hookInfo = stateHookInfo[state.MainThread.Handle]; + if (++hookInfo.InstructionsThisUpdate >= hookInfo.InstructionsPerUpdate || hookInfo.BreakExecution + || (hookInfo.Shared.Cpu as LuaCPU).IsYielding()) { // it's possible for a C/CSharp function to call lua making a coroutine unable to yield because // of the "C-call boundary". @@ -119,8 +116,7 @@ private static void AfterEveryInstructionHook(IntPtr L, IntPtr ar) private void ProcessCommand(string commandText, string commandName) { if (state == null) return; - var execInfo = stateInfo[state.MainThread.Handle]; - execInfo.CommandsQueue.Enqueue(new CommandInfo(commandText, commandName)); + commandsQueue.Enqueue(new CommandInfo(commandText, commandName)); } private bool LoadCommand(CommandInfo commandInfo) @@ -157,22 +153,22 @@ public bool IsWaitingForCommand() public void BreakExecution() { if (state == null) return; - var execInfo = stateInfo[state.MainThread.Handle]; - execInfo.BreakExecution = true; - execInfo.BreakExecutionCount++; + var hookInfo = stateHookInfo[state.MainThread.Handle]; + hookInfo.BreakExecution = true; + breakExecutionCount++; } public int InstructionsThisUpdate() { - if (state != null && stateInfo.TryGetValue(state.MainThread.Handle, out var execInfo)) - return execInfo.InstructionsThisUpdate; + if (state != null && stateHookInfo.TryGetValue(state.MainThread.Handle, out var hookInfo)) + return hookInfo.InstructionsThisUpdate; return 0; } public int ECInstructionsThisUpdate() { - if (state != null && stateInfo.TryGetValue(state.MainThread.Handle, out var execInfo)) - return Math.Max(execInfo.InstructionsThisUpdate - execInfo.IdleInstructions ?? 0, 0); + if (state != null && stateHookInfo.TryGetValue(state.MainThread.Handle, out var hookInfo)) + return Math.Max(hookInfo.InstructionsThisUpdate - idleInstructions ?? 0, 0); return 0; } @@ -181,14 +177,14 @@ public void KOSFixedUpdate(double dt) (Shared.Cpu as LuaCPU).FixedUpdate(); Shared.BindingMgr?.PreUpdate(); - var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; - execInfo.InstructionsPerUpdate = SafeHouse.Config.LuaInstructionsPerUpdate; - execInfo.InstructionsThisUpdate = 0; + var hookInfo = stateHookInfo[commandCoroutine.MainThread.Handle]; + hookInfo.InstructionsPerUpdate = SafeHouse.Config.LuaInstructionsPerUpdate; + hookInfo.InstructionsThisUpdate = 0; - if (execInfo.BreakExecution) + if (hookInfo.BreakExecution) { // true after BreakExecution was called, reset thread to prevent execution of the same program - execInfo.BreakExecution = false; - execInfo.CommandsQueue.Clear(); + hookInfo.BreakExecution = false; + commandsQueue.Clear(); commandCoroutine.ResetThread(); fixedUpdateCoroutine.ResetThread(); updateCoroutine.ResetThread(); @@ -220,13 +216,13 @@ public void KOSFixedUpdate(double dt) } } - if (execInfo.IdleInstructions == null) - execInfo.IdleInstructions = execInfo.InstructionsThisUpdate; + if (idleInstructions == null) + idleInstructions = hookInfo.InstructionsThisUpdate; - if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate) - execInfo.BreakExecutionCount = 0; + if (hookInfo.InstructionsThisUpdate < hookInfo.InstructionsPerUpdate) + breakExecutionCount = 0; - if (execInfo.BreakExecutionCount >= 3) + if (breakExecutionCount >= 3) { Shared.SoundMaker.BeginFileSound("beep"); Shared.Screen.Print("Ctrl+C was pressed 3 times while the processor was using all of the available instructions so "+ @@ -235,16 +231,16 @@ public void KOSFixedUpdate(double dt) state.SetGlobal("fixedupdate"); state.PushNil(); state.SetGlobal("update"); - execInfo.BreakExecutionCount = 0; + breakExecutionCount = 0; } - if (execInfo.InstructionsThisUpdate < execInfo.InstructionsPerUpdate && !(Shared.Cpu as LuaCPU).IsYielding()) + if (hookInfo.InstructionsThisUpdate < hookInfo.InstructionsPerUpdate && !(Shared.Cpu as LuaCPU).IsYielding()) { // resumes the coroutine after it yielded due to running out of instructions // and/or executes queued commands until they run out or the coroutine yields - while (commandCoroutine.Status == LuaStatus.Yield || execInfo.CommandsQueue.Count > 0) + while (commandCoroutine.Status == LuaStatus.Yield || commandsQueue.Count > 0) { - if (commandCoroutine.Status == LuaStatus.Yield || LoadCommand(execInfo.CommandsQueue.Dequeue())) + if (commandCoroutine.Status == LuaStatus.Yield || LoadCommand(commandsQueue.Dequeue())) { var status = commandCoroutine.Resume(state, 0); if (status == LuaStatus.Yield) break; @@ -261,9 +257,9 @@ public void KOSFixedUpdate(double dt) public void KOSUpdate(double dt) { if (dt == 0) return; // don't run when the game is paused - var execInfo = stateInfo[commandCoroutine.MainThread.Handle]; + var hookInfo = stateHookInfo[commandCoroutine.MainThread.Handle]; - if (execInfo.InstructionsThisUpdate >= execInfo.InstructionsPerUpdate) return; + if (hookInfo.InstructionsThisUpdate >= hookInfo.InstructionsPerUpdate) return; updateCoroutine.ResetThread(); if (updateCoroutine.GetGlobal("update") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) @@ -290,9 +286,12 @@ public void Dispose() Shared.UpdateHandler.RemoveObserver(this); var stateHandle = state.MainThread.Handle; state.Dispose(); - stateInfo.Remove(stateHandle); + stateHookInfo.Remove(stateHandle); Binding.Bindings.Remove(stateHandle); state = null; + commandsQueue.Clear(); + breakExecutionCount = 0; + idleInstructions = null; } private void DisplayError(string errorMessage, KeraLua.Lua state = null) From 6bef15ef6cd40dc6f87a1445e0661f7829d47aed Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 26 Dec 2024 15:19:00 +0300 Subject: [PATCH 098/108] Fix annotations --- .../GameData/kOS/PluginData/LuaLSAddon/library/functions.lua | 1 + .../GameData/kOS/PluginData/LuaLSAddon/library/structures.lua | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua index 3484fbd885..e0a081df89 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/functions.lua @@ -1376,6 +1376,7 @@ function readjson(path) end function exists(path) end ---@param path string | VolumeItem | Volume +---@return VolumeFile | VolumeDirectory ---Will return a `VolumeFile` or `VolumeDirectory` representing the item ---pointed to by :code:`PATH`. It will return a `boolean` false if there's ---nothing present under the given path. Also see :meth:`Volume:OPEN`. diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/structures.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/structures.lua index 679576540a..5758f0ecc1 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/structures.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/structures.lua @@ -1272,7 +1272,6 @@ ---back as "UNKNOWN" rather than one of the known class sizes. ---@field sizeclass string ---@field soichangewatchers UniqueSet ----@field positionerror Vector ---@class Addon : Structure ---@field available boolean From cbdb662ff5f536e04b927ac2c5babd2d277156a5 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 26 Dec 2024 15:25:42 +0300 Subject: [PATCH 099/108] Optimize `misc.vecdraw` function, remove Vecdraw.color suffix updater --- doc/source/lua_interpreter.rst | 4 +-- src/kOS/Lua/Libs/misc.lua | 56 +++++++++++++++------------------- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/doc/source/lua_interpreter.rst b/doc/source/lua_interpreter.rst index 0537dbc8e7..d8715bef46 100644 --- a/doc/source/lua_interpreter.rst +++ b/doc/source/lua_interpreter.rst @@ -172,8 +172,8 @@ Misc module ``vecdraw(start?, vector?, color?, label?, scale?, show?, width?, pointy?, wiping?): VecdrawTable`` ``````````````````````````````````````````````````````````````````````````````````````````````````` - Wrapper around kOS :func:`VECDRAW` function that uses the `Callback system`_ to automatically update the "start", "vector" and "color" values. - Those 3 parameters can also accept functions, in which case their values will be changed each frame with the return value of the functions. + Wrapper around kOS :func:`VECDRAW` function that uses the `Callback system`_ to automatically update the "start" and "vector". + Those parameters can accept functions, in which case their values will be changed each frame with the return value of the functions. This function returns a table representing a Vecdraw structure, and when this table gets garbage collected the vecdraw is removed. :: diff --git a/src/kOS/Lua/Libs/misc.lua b/src/kOS/Lua/Libs/misc.lua index 582c3fe911..4fa1cc7d5e 100644 --- a/src/kOS/Lua/Libs/misc.lua +++ b/src/kOS/Lua/Libs/misc.lua @@ -6,6 +6,9 @@ function M.init() vecdraw = M.vecdraw clearvecdraws = M.clearvecdraws + M.vecdraws = setmetatable({}, { __mode = "v" }) + M.updatingvecdraws = setmetatable({}, { __mode = "v" }) + ---@class CJson ---@field encode fun(table): string encodes a `table` into a json `string` ---@field decode fun(string): table decodes a json `string` into a `table` @@ -34,16 +37,12 @@ function M.waituntil(condition) while not condition() do coroutine.yield() end end -M.vecdraws = setmetatable({}, { __mode = "v" }) -M.updatingvecdraws = setmetatable({}, { __mode = "v" }) - ---A wrapper around kOS `CLEARVECDRAWS` function that also clears vecdraws created with the `vecdraw` function function M.clearvecdraws() CLEARVECDRAWS() - for _,vd in pairs(M.vecdraws) do + for _,vd in ipairs(M.vecdraws) do vd.parameters.show = false end - M.updatingvecdraws.keepCallback = false M.updatingvecdraws = setmetatable({}, { __mode = "v" }) end @@ -58,38 +57,33 @@ local vecdrawmt = { parameters[index] = value if index == "start" then vd.isStartFunction = type(value) == "function" - elseif index == "vector" then vd.isVectorFunction = type(value) == "function" - elseif index == "color" then vd.isColorFunction = type(value) == "function" end + elseif index == "vector" then vd.isVectorFunction = type(value) == "function" end - local vdShouldBeUpdating = parameters.show and (vd.isStartFunction or vd.isVectorFunction or vd.isColorFunction) - local vdUpdating = false + local vdShouldBeUpdating = parameters.show and (vd.isStartFunction or vd.isVectorFunction) - for i,v in ipairs(M.updatingvecdraws) do - if v == vd then - vdUpdating = true - if not vdShouldBeUpdating then + if not vdShouldBeUpdating and vd.updating then + vd.updating = false + for i,v in ipairs(M.updatingvecdraws) do + if v == vd then table.remove(M.updatingvecdraws, i) if #M.updatingvecdraws == 0 then - M.updatingvecdraws.keepCallback = false + M.updatingvecdraws.callback.body = nil end + break end - break end - end - - if vdShouldBeUpdating and not vdUpdating then - if #M.updatingvecdraws == 0 then - M.updatingvecdraws.keepCallback = true - addcallback(function() + elseif vdShouldBeUpdating and not vd.updating then + vd.updating = true + table.insert(M.updatingvecdraws, vd) + if #M.updatingvecdraws == 1 then + M.updatingvecdraws.callback = addcallback(function() for _, vd in ipairs(M.updatingvecdraws) do if vd.isStartFunction then vd.structure.start = vd.parameters.start() end if vd.isVectorFunction then vd.structure.vector = vd.parameters.vector() end - if vd.isColorFunction then vd.structure.color = vd.parameters.color() end end - return M.updatingvecdraws.keepCallback + return true end, 0, callbacks.updatecallbacks) end - table.insert(M.updatingvecdraws, vd) end end, __gc = function(vd) vd.show = false end, @@ -99,8 +93,8 @@ local vecdrawmt = { ---@field structure Vecdraw ---@field parameters table ----Wrapper around kOS `VECDRAW` function that uses the callbacks library to automatically update the "start", "vector" and "color" values. ----Those 3 parameters can also accept functions, in which case their values will be changed each frame with the return value of the functions. +---Wrapper around kOS `VECDRAW` function that uses the callbacks library to automatically update the "start" and "vector". +---Those parameters can accept functions, in which case their values will be changed each frame with the return value of the functions. ---This function returns a table representing a Vecdraw structure, and when this table gets garbage collected the vecdraw is removed. ---``` ---vd = vecdraw(nil, mun.position) -- assign the return value to a variable to keep it from being collected @@ -109,7 +103,7 @@ local vecdrawmt = { ---``` ---@param start? Vector | function `Vector` in ship-raw reference frame where the `Vecdraw` will be drawn from. ---@param vector? Vector | function absolute `Vector` position where the `Vecdraw` should end. ----@param color? RGBA | function +---@param color? RGBA ---@param label? string ---@param scale? number ---@param show? boolean @@ -120,14 +114,13 @@ local vecdrawmt = { ---@nodiscard function M.vecdraw(start, vector, color, label, scale, show, width, pointy, wiping) local vd = { - structure = VECDRAW(v(0,0,0), v(0,0,0), white, label or "", scale or 1, show ~= nil and show, width or 0.2, pointy == nil or pointy, wiping == nil or wiping), + structure = VECDRAW(v(0,0,0), v(0,0,0), color or white, label or "", scale or 1, show ~= nil and show, width or 0.2, pointy == nil or pointy, wiping == nil or wiping), isStartFunction = false, isVectorFunction = false, - isColorFunction = false, + updating = false, parameters = { start = v(0,0,0), vector = v(0,0,0), - color = white, show = false, } } @@ -135,9 +128,8 @@ function M.vecdraw(start, vector, color, label, scale, show, width, pointy, wipi table.insert(M.vecdraws, vd) if start then vd.start = start end if vector then vd.vector = vector end - if color then vd.color = color end if show then vd.show = show end return vd end -return M \ No newline at end of file +return M From 61b2589b85557e1eb30f3b5961e7cdb542fa2203 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 26 Dec 2024 21:21:45 +0300 Subject: [PATCH 100/108] Add kerboscript command alternatives section to the lua interpreter docs --- doc/source/lua_interpreter.rst | 44 ++++++++++++++++++++++++++-------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/doc/source/lua_interpreter.rst b/doc/source/lua_interpreter.rst index d8715bef46..16ba15fa62 100644 --- a/doc/source/lua_interpreter.rst +++ b/doc/source/lua_interpreter.rst @@ -26,7 +26,7 @@ Just write the lua scripts using its syntax as you would kerboscript, but there - The difference between kerboscript ``RUN`` command and ``dofile`` and ``loadfile`` functions. The main difference being that the context is shared across the whole core. - Triggers are implemented using the `callback system`_. While you can use them exactly like you would use kerboscript triggers, that is not the most efficient way. -- Some kerboscript commands are functions in lua. Examples being ``wait``, ``waituntil``, ``buildlist``, ``printlist``, ``add``, ``remove`` etc. The first two are a part of the default `Misc module`_. The other functions are available in kerboscript too, but most people use their command equivalents. +- Some `name changes to bound variables and functions`_. Main lua changes ---------------- @@ -44,17 +44,41 @@ as well as support for the added syntactic sugar see the README file at ``*KSP_F Name changes to bound variables and functions --------------------------------------------- -Some changes were neccessary to resolve name conflicts: - -- "stage" bound variable got renamed to "stageinfo". -- "heading" bound variable got renamed to "shipheading". -- "body" function got renamed to "getbody". +Some name changes were neccessary to resolve name conflicts: + | ``STAGE`` bound variable → ``stageinfo``. + | ``HEADING`` bound variable → ``shipheading``. + | ``BODY`` function → ``getbody``. kOS variables and functions that are accessable only by capital names: - -"STEERING", "THROTTLE", "WHEELSTEERING", "WHEELTHROTTLE", "VECDRAW", "CLEARVECDRAWS". - -This was done so there is no confusion between kOS variables and lua variables used by default modules. + | ``STEERING`` + | ``THROTTLE`` + | ``WHEELSTEERING`` + | ``WHEELTHROTTLE`` + | ``VECDRAW`` + | ``CLEARVECDRAWS`` + + This was done so there is no confusion between kOS variables and lua variables used by default modules. + +Kerboscript command alternatives: + | ``WHEN condition THEN *body*.`` → `when(condition, body) <#when-condition-body-priority-callbacks>`_ + | ``ON state *body*.`` → `on(state, body) <#on-state-body-priority-callbacks>`_ + | ``WAIT seconds.`` → `wait(seconds)`_ + | ``WAIT UNTIL condition.`` → `waituntil(condition)`_ + | ``PRINT item AT(column, row).`` → ``printat(item, column, row)`` + | ``STAGE.`` → ``stage()`` + | ``CLEARSCREEN.`` → ``clearscreen()`` + | ``ADD node.`` → ``add(node)`` + | ``REMOVE node.`` → ``remove(node)`` + | ``LOG text TO path.`` → ``logfile(text, path)`` + | ``SWITCH TO volumeId.`` → ``switch(volumeId)`` + | ``EDIT path.`` → ``edit(path)`` + | ``REBOOT.`` → ``reboot()`` + | ``SHUTDOWN.`` → ``shutdown()`` + | ``LIST listType IN variable.`` → ``variable = buildlist(listType)`` + | ``LIST listType.`` → ``printlist(listType)`` + | ``LIST.`` → ``printlist("files")`` + + All these functions, except the first 4, are available in kerboscript but are documented as commands. Default modules --------------- From 541a6360277c405a0ae3c6991b6e8b93f91a8bfe Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 26 Jan 2025 18:48:02 +0300 Subject: [PATCH 101/108] Fix not showing error when calling kerboscript functions with arguments that can't be cast to structures --- src/kOS/Lua/Types/KSFunction.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index ef368846e0..e8d71d87fc 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -37,9 +37,11 @@ private static int KSFunctionCall(IntPtr L) stack.PushArgument(new KOSArgMarkerType()); for (int i = 2; i <= state.GetTop(); i++) { - var arg = Structure.FromPrimitiveWithAssert(Binding.ToCSharpObject(state, i, binding)); - if (arg == null) break; - Binding.LuaExceptionCatch(() => stack.PushArgument(arg), state); + var arg = Binding.ToCSharpObject(state, i, binding); + var structure = Structure.FromPrimitive(arg) as Structure; + if (structure == null) + state.Error($"Cannot cast argument #{i-1} of type {(arg == null? "null" : arg.GetType().ToString())} to Structure."); + Binding.LuaExceptionCatch(() => stack.PushArgument(structure), state); } if (ksFunction is SafeFunctionBase function) From 91aced94eea4bc7d37a7601ccc8c4627ac29f77a Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 26 Jan 2025 19:51:17 +0300 Subject: [PATCH 102/108] Don't reset `update` function if the terminal is blocked. Because the update function has lower priority than terminal commands no need to reset it. --- .../PluginData/LuaLSAddon/library/base.lua | 4 +- src/kOS/Lua/LuaInterpreter.cs | 53 +++++++++---------- 2 files changed, 28 insertions(+), 29 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua index e897e760cd..35206697d0 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/base.lua @@ -7,8 +7,8 @@ fixedupdate = nil update = nil ---Function that gets called by kOS when `Ctrl+C` is pressed. ----If `Ctrl+C` was pressed 3 times while the command code was deprived of instructions by the `fixedupdate` function, ----both `fixedupdate` and `update` function get set to `nil` as a way to prevent the core from geting stuck. +---If `Ctrl+C` was pressed 3 times while the command code was deprived of instructions by the `fixedupdate` function +---it will be set to `nil` to prevent the core from geting stuck. ---To prevent it from happening this function must ensure the terminal is not deprived of instructions. ---@type function | nil breakexecution = nil diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 6c0efc87e2..81684bd134 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -190,31 +190,32 @@ public void KOSFixedUpdate(double dt) updateCoroutine.ResetThread(); if (fixedUpdateCoroutine.GetGlobal("breakexecution") == LuaType.Function) { - if (fixedUpdateCoroutine.LoadString("breakexecution()", "breakexecution") == LuaStatus.OK) + var status = fixedUpdateCoroutine.Resume(state, 0); + if (status != LuaStatus.OK && status != LuaStatus.Yield) { - var status = fixedUpdateCoroutine.Resume(state, 0); - if (status != LuaStatus.OK && status != LuaStatus.Yield) - DisplayError(fixedUpdateCoroutine.ToString(-1), fixedUpdateCoroutine); + DisplayError(fixedUpdateCoroutine.ToString(-1), fixedUpdateCoroutine); + fixedUpdateCoroutine.Pop(1); } } + else fixedUpdateCoroutine.Pop(1); } fixedUpdateCoroutine.ResetThread(); if (fixedUpdateCoroutine.GetGlobal("fixedupdate") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) { - if (fixedUpdateCoroutine.LoadString($"fixedupdate({dt})", "fixedupdate") == LuaStatus.OK) + fixedUpdateCoroutine.PushNumber(dt); + var status = fixedUpdateCoroutine.Resume(state, 1); + if (status != LuaStatus.OK && status != LuaStatus.Yield) { - var status = fixedUpdateCoroutine.Resume(state, 0); - if (status != LuaStatus.OK && status != LuaStatus.Yield) - { - DisplayError(fixedUpdateCoroutine.ToString(-1) - +"\nfixedupdate function errored and was set to nil." - +"\nTo reset fixedupdate do 'fixedupdate = callbacks.fixedupdate'.", fixedUpdateCoroutine); - fixedUpdateCoroutine.PushNil(); - fixedUpdateCoroutine.SetGlobal("fixedupdate"); - } + DisplayError(fixedUpdateCoroutine.ToString(-1) + +"\nfixedupdate function errored and was set to nil." + +"\nTo reset fixedupdate do 'fixedupdate = callbacks.fixedupdate'.", fixedUpdateCoroutine); + fixedUpdateCoroutine.Pop(1); + fixedUpdateCoroutine.PushNil(); + fixedUpdateCoroutine.SetGlobal("fixedupdate"); } } + else fixedUpdateCoroutine.Pop(1); if (idleInstructions == null) idleInstructions = hookInfo.InstructionsThisUpdate; @@ -226,11 +227,9 @@ public void KOSFixedUpdate(double dt) { Shared.SoundMaker.BeginFileSound("beep"); Shared.Screen.Print("Ctrl+C was pressed 3 times while the processor was using all of the available instructions so "+ - "update callbacks were set to nil. To reset callbacks do:\n\"callbacks.init()\"."); + "fixedupdate function was set to nil. To reset the default function do:\n\"callbacks.init()\"."); state.PushNil(); state.SetGlobal("fixedupdate"); - state.PushNil(); - state.SetGlobal("update"); breakExecutionCount = 0; } @@ -264,19 +263,19 @@ public void KOSUpdate(double dt) updateCoroutine.ResetThread(); if (updateCoroutine.GetGlobal("update") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) { - if (updateCoroutine.LoadString($"update({dt})", "update") == LuaStatus.OK) + updateCoroutine.PushNumber(dt); + var status = updateCoroutine.Resume(state, 1); + if (status != LuaStatus.OK && status != LuaStatus.Yield) { - var status = updateCoroutine.Resume(state, 0); - if (status != LuaStatus.OK && status != LuaStatus.Yield) - { - DisplayError(updateCoroutine.ToString(-1) - +"\nupdate function errored and was set to nil." - +"\nTo reset update do 'update = callbacks.update'.", updateCoroutine); - updateCoroutine.PushNil(); - updateCoroutine.SetGlobal("update"); - } + DisplayError(updateCoroutine.ToString(-1) + +"\nupdate function errored and was set to nil." + +"\nTo reset update do 'update = callbacks.update'.", updateCoroutine); + updateCoroutine.Pop(1); + updateCoroutine.PushNil(); + updateCoroutine.SetGlobal("update"); } } + else updateCoroutine.Pop(1); } public void Dispose() From 0e7c4f0170e5caf41ada14574109d3ad379d1303 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 26 Jan 2025 20:01:07 +0300 Subject: [PATCH 103/108] Add "System variables" section to the docs --- doc/source/lua_interpreter.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/doc/source/lua_interpreter.rst b/doc/source/lua_interpreter.rst index 16ba15fa62..7fa02a57a5 100644 --- a/doc/source/lua_interpreter.rst +++ b/doc/source/lua_interpreter.rst @@ -18,6 +18,7 @@ Basic knowledge of lua is required. - `Misc module`_ - `Design patterns`_ - `Example scripts`_ +- `System variables`_ Main differences from kerboscript --------------------------------- @@ -227,3 +228,13 @@ Interactive scripts Example scripts --------------- You can take a look at some examples of using lua at `sug44/kOSLuaScripts `_ + +System variables +---------------- + + There are 3 lua variables that are used by kOS: + - ``fixedupdate``. Function called at the start of each physics tick. + - ``update``. Function called at the start of each frame. + - ``breakexecution``. Function called when the terminal receives the Ctrl+C code. If Ctrl+C was pressed 3 times while the command code was deprived of instructions by the ``fixedupdate`` function it will be set to ``nil`` to prevent the core from geting stuck. To prevent it from happening this function must ensure the terminal is not deprived of instructions. + + Those variables are used by the default `Callbacks module`_. From 99f182d941bedd75baf2f3ff302b07cc1150eeca Mon Sep 17 00:00:00 2001 From: sug44 Date: Sun, 26 Jan 2025 23:51:07 +0300 Subject: [PATCH 104/108] Fix blocking the terminal when fixedUpdateCoroutine yields every tick without running out if instructions --- src/kOS/Lua/LuaInterpreter.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 81684bd134..0f75ae3309 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -24,6 +24,7 @@ public class LuaInterpreter : IInterpreter, IFixedUpdateObserver, IUpdateObserve private readonly Queue commandsQueue = new Queue(); private int breakExecutionCount; private int? idleInstructions; + private int fixedupdateInstructions; private class CommandInfo { @@ -146,8 +147,8 @@ public bool IsCommandComplete(string commandText) public bool IsWaitingForCommand() { - return !(Shared.Cpu as LuaCPU).IsYielding() && fixedUpdateCoroutine.Status != LuaStatus.Yield - && commandCoroutine.Status != LuaStatus.Yield; + return !(Shared.Cpu as LuaCPU).IsYielding() && commandCoroutine.Status != LuaStatus.Yield + && fixedupdateInstructions < stateHookInfo[state.MainThread.Handle].InstructionsPerUpdate; } public void BreakExecution() @@ -217,6 +218,8 @@ public void KOSFixedUpdate(double dt) } else fixedUpdateCoroutine.Pop(1); + fixedupdateInstructions = hookInfo.InstructionsThisUpdate; + if (idleInstructions == null) idleInstructions = hookInfo.InstructionsThisUpdate; From 02a9c7668ef7cdb356fb23d7b71b921409673974 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 6 Feb 2025 13:29:05 +0300 Subject: [PATCH 105/108] Fix merge --- src/kOS/Lua/Types/KSStructure.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index 68b0a9ea93..04807bbb47 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -202,7 +202,7 @@ private static int StructurePairs(IntPtr L) state.PushInteger(index); state.SetTable(-3); } - foreach (var name in structure.GetSuffixNames()) + foreach (StringValue name in structure.GetSuffixNames()) { state.PushInteger(index++); state.PushString(name); From 36d71f5ec3f30fcb1ca3730abc6e5efa625aa209 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 6 Feb 2025 18:34:16 +0300 Subject: [PATCH 106/108] Get system variables without calling __index metamethod Move utility functions to Lua.Util class --- src/kOS/Lua/Binding.cs | 26 ++------------------- src/kOS/Lua/Libs/Package.cs | 4 ++-- src/kOS/Lua/LuaInterpreter.cs | 6 ++--- src/kOS/Lua/Types/KSFunction.cs | 6 ++--- src/kOS/Lua/Types/KSStructure.cs | 18 +++++++------- src/kOS/Lua/Util.cs | 40 ++++++++++++++++++++++++++++++++ src/kOS/kOS.csproj | 1 + 7 files changed, 60 insertions(+), 41 deletions(-) create mode 100644 src/kOS/Lua/Util.cs diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index e660f5db66..06812cae85 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -101,7 +101,7 @@ private static int EnvIndex(IntPtr L) var functions = (binding.Shared.FunctionManager as FunctionManager).RawFunctions; if (variables.TryGetValue(index, out var boundVar)) { - return (int)LuaExceptionCatch(() => + return (int)Util.LuaExceptionCatch(() => PushLuaType(state, Structure.ToPrimitive(boundVar.Value), binding), state); } if (functions.TryGetValue(index, out var function)) @@ -143,7 +143,7 @@ private static int EnvNewIndex(IntPtr L) } var newValue = ToCSharpObject(state, 3, binding); if (newValue == null) return 0; - LuaExceptionCatch(() => boundVar.Value = newValue, state); + Util.LuaExceptionCatch(() => boundVar.Value = newValue, state); return 0; } @@ -240,28 +240,6 @@ private static int PushObject(KeraLua.Lua state, object obj, BindingData binding return 1; } - - public static void LuaExceptionCatch(Action tryBody, KeraLua.Lua state) => - LuaExceptionCatch(() => { tryBody(); return null; }, state); - - public static object LuaExceptionCatch(Func tryBody, KeraLua.Lua state) - { - try { return tryBody(); } - catch (Exception e) - { - Debug.Log(e); - return state.Error(e.Message == ""? e.GetType().FullName : e.Message); - } - } - - public static void DumpStack(KeraLua.Lua state, string debugName = "", BindingData binding = null) - { - binding = binding ?? Bindings[state.MainThread.Handle]; - Debug.Log(debugName+"_________"); - for (int i = 0; i <= state.GetTop(); i++) - Debug.Log(i+" "+state.TypeName(i)+" "+ToCSharpObject(state, i, binding)); - Debug.Log("____________________"); - } private static class BindingChanges { diff --git a/src/kOS/Lua/Libs/Package.cs b/src/kOS/Lua/Libs/Package.cs index fa537d4992..08de489d28 100644 --- a/src/kOS/Lua/Libs/Package.cs +++ b/src/kOS/Lua/Libs/Package.cs @@ -164,8 +164,8 @@ private static int LuaSearcher(IntPtr L) foreach(var pathTemplate in paths.Split(config.PATHSEP)) { var path = pathTemplate.Replace(config.PATHMARK.ToString(), name); - var globalPath = Binding.LuaExceptionCatch(() => volumeManager.GlobalPathFromObject(path), state) as GlobalPath; - var file = Binding.LuaExceptionCatch(() => volumeManager.GetVolumeFromPath(globalPath).Open(globalPath), state) as VolumeFile; + var globalPath = Util.LuaExceptionCatch(() => volumeManager.GlobalPathFromObject(path), state) as GlobalPath; + var file = Util.LuaExceptionCatch(() => volumeManager.GetVolumeFromPath(globalPath).Open(globalPath), state) as VolumeFile; if (file == null) { errorMessage += $"no file '{path}'\n"; diff --git a/src/kOS/Lua/LuaInterpreter.cs b/src/kOS/Lua/LuaInterpreter.cs index 0f75ae3309..6178404cf2 100644 --- a/src/kOS/Lua/LuaInterpreter.cs +++ b/src/kOS/Lua/LuaInterpreter.cs @@ -189,7 +189,7 @@ public void KOSFixedUpdate(double dt) commandCoroutine.ResetThread(); fixedUpdateCoroutine.ResetThread(); updateCoroutine.ResetThread(); - if (fixedUpdateCoroutine.GetGlobal("breakexecution") == LuaType.Function) + if (Util.RawGetGlobal(fixedUpdateCoroutine, "breakexecution") == LuaType.Function) { var status = fixedUpdateCoroutine.Resume(state, 0); if (status != LuaStatus.OK && status != LuaStatus.Yield) @@ -202,7 +202,7 @@ public void KOSFixedUpdate(double dt) } fixedUpdateCoroutine.ResetThread(); - if (fixedUpdateCoroutine.GetGlobal("fixedupdate") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) + if (Util.RawGetGlobal(fixedUpdateCoroutine, "fixedupdate") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) { fixedUpdateCoroutine.PushNumber(dt); var status = fixedUpdateCoroutine.Resume(state, 1); @@ -264,7 +264,7 @@ public void KOSUpdate(double dt) if (hookInfo.InstructionsThisUpdate >= hookInfo.InstructionsPerUpdate) return; updateCoroutine.ResetThread(); - if (updateCoroutine.GetGlobal("update") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) + if (Util.RawGetGlobal(updateCoroutine, "update") == LuaType.Function && !(Shared.Cpu as LuaCPU).IsYielding()) { updateCoroutine.PushNumber(dt); var status = updateCoroutine.Resume(state, 1); diff --git a/src/kOS/Lua/Types/KSFunction.cs b/src/kOS/Lua/Types/KSFunction.cs index e8d71d87fc..7d4ad79f16 100644 --- a/src/kOS/Lua/Types/KSFunction.cs +++ b/src/kOS/Lua/Types/KSFunction.cs @@ -41,17 +41,17 @@ private static int KSFunctionCall(IntPtr L) var structure = Structure.FromPrimitive(arg) as Structure; if (structure == null) state.Error($"Cannot cast argument #{i-1} of type {(arg == null? "null" : arg.GetType().ToString())} to Structure."); - Binding.LuaExceptionCatch(() => stack.PushArgument(structure), state); + Util.LuaExceptionCatch(() => stack.PushArgument(structure), state); } if (ksFunction is SafeFunctionBase function) { - Binding.LuaExceptionCatch(() => function.Execute(binding.Shared), state); + Util.LuaExceptionCatch(() => function.Execute(binding.Shared), state); return Binding.PushLuaType(state, Structure.ToPrimitive(function.ReturnValue), binding); } if (ksFunction is DelegateSuffixResult delegateResult) { - Binding.LuaExceptionCatch(() => delegateResult.Invoke(binding.Shared.Cpu), state); + Util.LuaExceptionCatch(() => delegateResult.Invoke(binding.Shared.Cpu), state); return Binding.PushLuaType(state, Structure.ToPrimitive(delegateResult.Value), binding); } return state.Error(string.Format("attempt to call a non function {0} value", ksFunction.GetType().Name)); diff --git a/src/kOS/Lua/Types/KSStructure.cs b/src/kOS/Lua/Types/KSStructure.cs index 04807bbb47..3c70a47419 100644 --- a/src/kOS/Lua/Types/KSStructure.cs +++ b/src/kOS/Lua/Types/KSStructure.cs @@ -59,7 +59,7 @@ private static int StructureOperator(IntPtr L, Func operato var state = KeraLua.Lua.FromIntPtr(L); var binding = Binding.Bindings[state.MainThread.Handle]; var pair = new OperandPair(Binding.ToCSharpObject(state, 1, binding), Binding.ToCSharpObject(state, 2, binding)); - return (int)Binding.LuaExceptionCatch(() => Binding.PushLuaType(state, operatorMethod(pair), binding), state); + return (int)Util.LuaExceptionCatch(() => Binding.PushLuaType(state, operatorMethod(pair), binding), state); } private static int StructureUnary(IntPtr L) @@ -70,8 +70,8 @@ private static int StructureUnary(IntPtr L) if (obj == null) return 0; MethodInfo unaryMethod = obj.GetType().GetMethod("op_UnaryNegation", BindingFlags.FlattenHierarchy |BindingFlags.Static | BindingFlags.Public); if (unaryMethod != null) - return (int)Binding.LuaExceptionCatch(() => Binding.PushLuaType(state, unaryMethod.Invoke(null, new[]{obj}), binding), state); - Binding.LuaExceptionCatch(() => throw new KOSUnaryOperandTypeException("negate", obj), state); + return (int)Util.LuaExceptionCatch(() => Binding.PushLuaType(state, unaryMethod.Invoke(null, new[]{obj}), binding), state); + Util.LuaExceptionCatch(() => throw new KOSUnaryOperandTypeException("negate", obj), state); return 0; } @@ -83,14 +83,14 @@ private static int StructureLength(IntPtr L) if (!structure.HasSuffix("LENGTH")) return state.Error("attempt to get length of a Structure with no length suffix"); state.PushString("LENGTH"); - return (int)Binding.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, -1), state); + return (int)Util.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, -1), state); } private static int StructureToString(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var structure = Binding.Bindings[state.MainThread.Handle].Objects[state.ToUserData(1)]; - var structureString = (string)Binding.LuaExceptionCatch(() => structure.ToString(), state); + var structureString = (string)Util.LuaExceptionCatch(() => structure.ToString(), state); if (structure is IEnumerable) { // make enum structures ToString() method show 1 base indexed values in lua // replaces "\n [*number*]" with "\n [*number+1*]" @@ -112,7 +112,7 @@ private static int StructureIndex(IntPtr L) if (structure == null) return state.Error(string.Format("attempt to index a {0} value", obj.GetType().Name)); - return (int)Binding.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, 2), state); + return (int)Util.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, 2), state); } private static int PushSuffixResult(KeraLua.Lua state, Binding.BindingData binding, Structure structure, int index) @@ -167,13 +167,13 @@ private static int StructureNewIndex(IntPtr L) if (structure is IIndexable && state.Type(2) == LuaType.Number) { var index = (int)state.ToInteger(2) - (structure is Lexicon? 0 : 1); - Binding.LuaExceptionCatch(() => + Util.LuaExceptionCatch(() => (structure as IIndexable).SetIndex(index, Structure.FromPrimitive(newValue) as Structure), state); } else { var index = state.ToString(2); - Binding.LuaExceptionCatch(() => + Util.LuaExceptionCatch(() => { if (!structure.SetSuffix(index, Structure.FromPrimitive(newValue))) throw new Exception($"Suffix \"{index}\" not found on Structure {structure.KOSName}"); @@ -227,7 +227,7 @@ private static int StructureNext(IntPtr L) state.PushInteger(currentIndex); state.GetTable(-2); - Binding.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, -1), state); + Util.LuaExceptionCatch(() => PushSuffixResult(state, binding, structure, -1), state); state.PushInteger(currentIndex+1); state.Copy(-1, KeraLua.Lua.UpValueIndex(1)); diff --git a/src/kOS/Lua/Util.cs b/src/kOS/Lua/Util.cs new file mode 100644 index 0000000000..092acd4767 --- /dev/null +++ b/src/kOS/Lua/Util.cs @@ -0,0 +1,40 @@ +using System; +using KeraLua; +using UnityEngine; + +namespace kOS.Lua +{ + public static class Util + { + public static LuaType RawGetGlobal(KeraLua.Lua lua, string name) + { + lua.PushGlobalTable(); + lua.PushString(name); + var type = lua.RawGet(-2); + lua.Remove(-2); + return type; + } + + public static void LuaExceptionCatch(Action tryBody, KeraLua.Lua state) => + LuaExceptionCatch(() => { tryBody(); return null; }, state); + + public static object LuaExceptionCatch(Func tryBody, KeraLua.Lua state) + { + try { return tryBody(); } + catch (Exception e) + { + Debug.Log(e); + return state.Error(e.Message == ""? e.GetType().FullName : e.Message); + } + } + + public static void DumpStack(KeraLua.Lua state, string debugName = "", Binding.BindingData binding = null) + { + binding = binding ?? Binding.Bindings[state.MainThread.Handle]; + Debug.Log(debugName+"_________"); + for (int i = 0; i <= state.GetTop(); i++) + Debug.Log(i+" "+state.TypeName(i)+" "+Binding.ToCSharpObject(state, i, binding)); + Debug.Log("____________________"); + } + } +} \ No newline at end of file diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index fd537a5284..f3af90aabd 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -92,6 +92,7 @@ + From 0c824086042c113a0cb4b57d4288cf23ae383947 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 6 Feb 2025 18:36:32 +0300 Subject: [PATCH 107/108] Check arguments of environment metamethods in case they are called manually --- src/kOS/Lua/Binding.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/kOS/Lua/Binding.cs b/src/kOS/Lua/Binding.cs index 06812cae85..4991ec75f2 100644 --- a/src/kOS/Lua/Binding.cs +++ b/src/kOS/Lua/Binding.cs @@ -91,6 +91,11 @@ public static int ObjectToString(IntPtr L) private static int EnvIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); + + state.CheckType(1, LuaType.Table); + if (state.Type(2) != LuaType.String) + return 0; + var index = state.ToString(2); var binding = Bindings[state.MainThread.Handle]; var isCapitalNameOnlyVariableNotCapital = BindingChanges.CapitalNameOnlyVariables.Contains(index.ToUpper()) @@ -118,6 +123,15 @@ private static int EnvIndex(IntPtr L) private static int EnvNewIndex(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); + + state.CheckType(1, LuaType.Table); + state.CheckAny(3); + if (state.Type(2) != LuaType.String) + { + state.RawSet(1); + return 0; + } + var index = state.ToString(2); var isCapitalNameOnlyVariableNotCapital = BindingChanges.CapitalNameOnlyVariables.Contains(index.ToUpper()) From f460e797759ad5cb7a2d082c93fc6a96b6b3f3ae Mon Sep 17 00:00:00 2001 From: sug44 Date: Fri, 7 Feb 2025 19:18:54 +0300 Subject: [PATCH 108/108] Update lua annotations --- .../LuaLSAddon/library/variables.lua | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua index 831fada851..3a35a8e600 100644 --- a/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua +++ b/Resources/GameData/kOS/PluginData/LuaLSAddon/library/variables.lua @@ -64,7 +64,7 @@ chutes = nil --- WHEN (NOT CHUTESSAFE) THEN { --- CHUTESSAFE ON. --- RETURN (NOT CHUTES). ----} +--- } ---@type boolean chutessafe = nil @@ -378,14 +378,14 @@ warp = nil --- --- IF MAPVIEW { --- PRINT "You are looking at the map.". ----} ELSE { ---- PRINT "You are looking at the flight view.". ----}. +--- } ELSE { +--- PRINT "You are looking at the flight view.". +--- }. --- ---You can switch between map and flight views by setting this variable:: --- ----SET MAPVIEW TO TRUE. // to map view ----SET MAPVIEW TO FALSE. // to flight view +--- SET MAPVIEW TO TRUE. // to map view +--- SET MAPVIEW TO FALSE. // to flight view ---@type boolean mapview = nil @@ -469,6 +469,12 @@ sasmode = nil ---@type string | "orbit" | "surface" | "target" navmode = nil +---Get/Set. +---The PIDLoop used to control wheelsteering. Can be used to optimize +--- steering performance and eliminate steering oscillations on some vessels. +---@type PIDLoop +wheelsteeringpid = nil + ---Get only. ---@type VesselAltitude alt = nil

b)C_ZbGv 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%0Am?$K>^8z# zT<07%k^lQPWF(OGd9TinobUpv&NG3*1qZB zl(lohx;b6_oU8+!sza>*7}=?rGLe_8X*=ufX083~%>mYUi1i&~ZJTKm=dG2q*2y{R z<%|t-zNR@_M>tpOoT(dOAaEcCbf{tbD*=E+1>&RI-L7kkRUe3-S z=VqESbAVth91YIyob~oR7i$0O#WnXX6-WV>55!RJ0aYTr)ps0vGDUvpvW>7GK_=M^}VyT+{!04&Q?Vpv5-R?+Ew;^ja}bp?R)cwo^a%e#>8HCvd@F;@M`PHx`WwtuzUArS|87H Ll_HJ)nU8-5>>%9@ literal 0 HcmV?d00001 From a10956c304b1bc51a45ffc9b452c4009af7d978c Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 7 Nov 2024 08:21:54 +0300 Subject: [PATCH 063/108] Add rewritten package library --- src/kOS/Lua/Libraries.cs | 14 +- src/kOS/Lua/Libs/Package.cs | 286 ++++++++++++++++++++++++++++++++++++ src/kOS/Lua/whitelist.lua | 23 ++- src/kOS/kOS.csproj | 1 + 4 files changed, 321 insertions(+), 3 deletions(-) create mode 100644 src/kOS/Lua/Libs/Package.cs diff --git a/src/kOS/Lua/Libraries.cs b/src/kOS/Lua/Libraries.cs index 0cc9f2d82c..1bbdfda527 100644 --- a/src/kOS/Lua/Libraries.cs +++ b/src/kOS/Lua/Libraries.cs @@ -12,6 +12,7 @@ public static class Libraries private static readonly RegList whitelistedLibraries = new RegList { {"_G", Libs.Base.Open}, + {"package", Libs.Package.Open}, {"coroutine", NativeMethods.luaopen_coroutine}, {"string", NativeMethods.luaopen_string}, {"utf8", NativeMethods.luaopen_utf8}, @@ -67,7 +68,8 @@ to be explicitly added in the whitelist to be accessible by lua scripts { state.LoadString(streamReader.ReadToEnd()); } - state.Call(0, 3); + state.PushCFunction(SetUpvalue); + state.Call(1, 3); // call the deepCleanTable function on the global table state.PushCopy(-1); @@ -103,6 +105,16 @@ to be explicitly added in the whitelist to be accessible by lua scripts } #endif } + + private static int SetUpvalue(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + state.CheckType(1, LuaType.Function); + var n = (int)state.CheckInteger(2); + state.CheckAny(3); + state.SetUpValue(1, n); + return 0; + } private static int DummyOpen(IntPtr L) { diff --git a/src/kOS/Lua/Libs/Package.cs b/src/kOS/Lua/Libs/Package.cs new file mode 100644 index 0000000000..e57e51de65 --- /dev/null +++ b/src/kOS/Lua/Libs/Package.cs @@ -0,0 +1,286 @@ +using KeraLua; +using System; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using kOS.Safe.Persistence; +using Debug = UnityEngine.Debug; + +namespace kOS.Lua.Libs +{ + public static class Package + { + private static readonly LuaFunction[] searchers = + { + PreloadSearcher, + LuaSearcher, + CSearcher, + CRootSearcher + }; + + private static readonly string packagesDirectory = Assembly.GetExecutingAssembly().Location.Replace("kOS.dll", + "LuaPackages" + Path.DirectorySeparatorChar); + private static readonly string libraryExtension = + RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "dll" : + RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "dylib" : + "so"; + + private static LuaFunction _loadlib; + private static PackageConfig _packageConfig; + + public static int Open(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + + /* + Rewritten package library with limited functionality to make library safe. + Only 'require' and 'loadlib' functions are taken from the native package library. + The unsafe loadlib function is only used internally to look for C functions in a library. + functionality removed: + changing cpath, C searchers will only look in packagesDirectory + loadlib, searchpath function + */ + + // call luaopen_package with a new fake global table + state.PushGlobalTable(); + state.NewTable(); + state.PushCopy(-1); + state.RawSetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals); + state.PushCFunction(NativeMethods.luaopen_package); + /* + LUAMOD_API int luaopen_package (lua_State *L) { + createclibstable(L); + luaL_newlib(L, pk_funcs); /* create 'package' table * / + createsearcherstable(L); + /* set paths * / + setpath(L, "path", LUA_PATH_VAR, LUA_PATH_DEFAULT); + setpath(L, "cpath", LUA_CPATH_VAR, LUA_CPATH_DEFAULT); + /* store config information * / + lua_pushliteral(L, LUA_DIRSEP "\n" LUA_PATH_SEP "\n" LUA_PATH_MARK "\n" + LUA_EXEC_DIR "\n" LUA_IGMARK "\n"); + lua_setfield(L, -2, "config"); + /* set field 'loaded' * / + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE); + lua_setfield(L, -2, "loaded"); + /* set field 'preload' * / + luaL_getsubtable(L, LUA_REGISTRYINDEX, LUA_PRELOAD_TABLE); + lua_setfield(L, -2, "preload"); + lua_pushglobaltable(L); + lua_pushvalue(L, -2); /* set 'package' as upvalue for next lib * / + luaL_setfuncs(L, ll_funcs, 1); /* open lib into global table * / + lua_pop(L, 1); /* pop global table * / + return 1; /* return 'package' table * / + } + */ + state.Call(0, 1); + // global table, fake global table, package table + state.Insert(-3); + state.Insert(-2); + // package table, fake global table, global table + state.RawSetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals); + + state.GetField(-1, "require"); + var require = state.ToCFunction(-1); + state.Pop(2); // pop require and the fake global table + + state.GetField(-1, "loadlib"); + _loadlib = state.ToCFunction(-1); + state.Pop(1); // pop loadlib + + // get package config + state.GetField(-1, "config"); + var config = state.ToString(-1); + string[] configValues = config.Split('\n'); + _packageConfig = new PackageConfig + { + DIRSEP = configValues[0], // / + PATHSEP = configValues[1], // ; + PATHMARK = configValues[2], // ? + EXECDIR = configValues[3], // ! + IGMARK = configValues[4], // - + }; + state.Pop(2); // pop config string and package table + + // new package table + state.NewTable(); + + // add require to the global table with a nil upvalue that later will be set to the whitelisted package table + state.PushNil(); + state.PushCClosure(require, 1); + state.SetGlobal("require"); + + // add searchers table + state.NewTable(); + var i = 1; + foreach (var searcher in searchers) + { + state.PushNil(); + state.PushCClosure(searcher, 1); + state.RawSetInteger(-2, i++); + } + state.SetField(-2, "searchers"); + + // add config + state.PushString(config); + state.SetField(-2, "config"); + + // add path string + var dirSep = VolumePath.PathSeparator; + // "0:/?.lua;0:/?/init.lua;/?.lua;/?/init.lua;?.lua;?/init.lua" + state.PushString( + $"0:{dirSep}{_packageConfig.PATHMARK}.lua{_packageConfig.PATHSEP}"+ + $"0:{dirSep}{_packageConfig.PATHMARK}{dirSep}init.lua{_packageConfig.PATHSEP}"+ + $"{dirSep}{_packageConfig.PATHMARK}.lua{_packageConfig.PATHSEP}"+ + $"{dirSep}{_packageConfig.PATHMARK}{dirSep}init.lua{_packageConfig.PATHSEP}"+ + $"{_packageConfig.PATHMARK}.lua{_packageConfig.PATHSEP}{_packageConfig.PATHMARK}{dirSep}init.lua"); + state.SetField(-2, "path"); + + // add registry preload table + state.GetField(LuaRegistry.Index, "_PRELOAD"); + state.SetField(-2, "preload"); + + return 1; + } + + private static int PreloadSearcher(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var name = state.CheckString(1); + state.GetField(LuaRegistry.Index, "_PRELOAD"); + if (state.GetField(-1, name) == LuaType.Nil) + { + state.PushString($"no field package.preload['{name}']"); + return 1; + } + state.PushString(":preload:"); + return 2; + } + + private static int LuaSearcher(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var name = state.CheckString(1); + if (state.GetField((int)LuaRegistry.Index-1, "path") != LuaType.String) + return state.Error("'package.path' must be a string"); + var paths = state.ToString(-1); + var volumeManager = Binding.bindings[state.MainThread.Handle].Shared.VolumeMgr; + var errorMessage = ""; + foreach(var pathTemplate in paths.Split(_packageConfig.PATHSEP.ToCharArray())) + { + var path = pathTemplate.Replace(_packageConfig.PATHMARK, name); + var globalPath = Binding.LuaExceptionCatch(() => volumeManager.GlobalPathFromObject(path), state) as GlobalPath; + var file = Binding.LuaExceptionCatch(() => volumeManager.GetVolumeFromPath(globalPath).Open(globalPath), state) as VolumeFile; + if (file == null) + { + errorMessage += $"no file '{path}'\n"; + continue; + } + if (state.LoadString(file.ReadAll().String, file.Path.ToString()) != LuaStatus.OK) + return state.Error($"error loading module '{name}' from file '{globalPath}':\n\t{state.ToString(-1)}"); + state.PushString(globalPath.ToString()); + return 2; + } + state.PushString(errorMessage); + return 1; + } + + private static string FindPackage(KeraLua.Lua state, string[] names) + { + var errorMessage = ""; + foreach (var name in names) + { + foreach (var packagePath in Directory.GetFiles(packagesDirectory)) + { + var packageName = Path.GetFileName(packagePath); + if (name == packageName) + { + return packagePath; + } + } + errorMessage += $"no file '{packagesDirectory + name}'\n"; + } + state.PushString(errorMessage); + return null; + } + + private static int LoadFunc(KeraLua.Lua state, string filename, string name) + { + var modname = name.Replace('.', '_'); + if (modname.Contains(_packageConfig.IGMARK)) + { + var stat = LookForFunc(state, filename, "luaopen_" + modname.Split(_packageConfig.IGMARK.ToCharArray())[0]); + if (stat != 2) return stat; + return LookForFunc(state, filename, "luaopen_" + modname.Split(_packageConfig.IGMARK.ToCharArray())[1]); + } + return LookForFunc(state, filename, "luaopen_" + modname); + } + + private static int LookForFunc(KeraLua.Lua state, string filename, string sym) + { + var precallTop = state.GetTop(); + state.PushCFunction(_loadlib); + state.PushString(filename); + state.PushString(sym); + state.Call(2, -1); + var stat = 0; + if (state.GetTop() - precallTop == 3) // if error + { + stat = state.ToString(-1) == "open" ? 1 : 2; + state.Pop(1); + state.Remove(-2); + } + return stat; + } + + private static int CSearcher(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var name = state.CheckString(1); + string[] names = + { + name + "." + libraryExtension, + "loadall." + libraryExtension, + }; + var filename = FindPackage(state, names); + if (filename == null) return 1; + var success = 0 == LoadFunc(state, filename, name); + if (!success) + return state.Error($"error loading module '{name}' from file '{filename}':\n\t{state.ToString(-1)}"); + state.PushString(filename); + return 2; + } + + private static int CRootSearcher(IntPtr L) + { + var state = KeraLua.Lua.FromIntPtr(L); + var name = state.CheckString(1); + if (!name.Contains(".")) return 0; + string[] names = + { + name.Split('.')[0] + "." + libraryExtension, + "loadall." + libraryExtension, + }; + var filename = FindPackage(state, names); + if (filename == null) return 1; + var status = LoadFunc(state, filename, name); + if (status == 1) + return state.Error($"error loading module '{name}' from file '{filename}':\n\t{state.ToString(-1)}"); + if (status == 2) + { + state.PushString($"no module '{name}' in file '{name.Split('.')[0]}'"); + return 1; + } + state.PushString(filename); + return 2; + } + + private struct PackageConfig + { + public string DIRSEP; + public string PATHSEP; + public string PATHMARK; + public string EXECDIR; + public string IGMARK; + } + } +} \ No newline at end of file diff --git a/src/kOS/Lua/whitelist.lua b/src/kOS/Lua/whitelist.lua index 31f5332f39..d8e229b51f 100644 --- a/src/kOS/Lua/whitelist.lua +++ b/src/kOS/Lua/whitelist.lua @@ -1,3 +1,5 @@ +local setupvalue = ... + local env = { -- _G = _G, holds the old environment _VERSION = _VERSION, @@ -26,6 +28,18 @@ local env = { xpcall = xpcall, _type = _type, wait = wait, + require = require, + package = { + config = package.config, + path = package.path, + preload = package.preload, + searchers = { + package.searchers[1], + package.searchers[2], + package.searchers[3], + package.searchers[4], + }, + }, coroutine = { close = coroutine.close, create = coroutine.create, @@ -106,12 +120,19 @@ env._G = env local loaded = { _G = env._G, + package = env.package, coroutine = env.coroutine, math = env.math, string = env.string, table = env.table, utf8 = env.utf8, } +env.package.loaded = loaded + +setupvalue(env.require, 1, env.package) +for _,searcher in env.ipairs(env.package.searchers) do + setupvalue(searcher, 1, env.package) +end local visitedTables = {} local function deepCleanTable(tab) @@ -124,6 +145,4 @@ local function deepCleanTable(tab) end end --- what.what() - return env, loaded, deepCleanTable \ No newline at end of file diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index c045f2e853..cbe1ce1ad8 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -85,6 +85,7 @@ + From 36f3d9445c15511e46d4fea9b23f8e99a2a7a07b Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 7 Nov 2024 09:04:17 +0300 Subject: [PATCH 064/108] Whitelist the registry table Instead of whitelisting just the globals table and the loaded table --- src/kOS/Lua/Libraries.cs | 40 +++++-------------------------------- src/kOS/Lua/whitelist.lua | 42 ++++++++++++++++++++++++--------------- 2 files changed, 31 insertions(+), 51 deletions(-) diff --git a/src/kOS/Lua/Libraries.cs b/src/kOS/Lua/Libraries.cs index 1bbdfda527..ec6f609854 100644 --- a/src/kOS/Lua/Libraries.cs +++ b/src/kOS/Lua/Libraries.cs @@ -38,22 +38,13 @@ public static void Open(KeraLua.Lua state) the goal here is to remove the ability of lua scripts to be malicious and make it simpler to keep it that way it is achieved by: 1. Opening only whitelisted libraries - 2. Overwriting the registry global environment table and loaded libraries table with tables that - include only whitelisted fields - 3. Recursively removing every field in the previous global environment table and the loaded libraries table - for an extra layer of protection in case the table or its inner tables are saved anywhere else + 2. Recursively removing every field in the registry table + 3. Adding whitelisted fields to the registry table this means that even if some potentially dangerous lua library/function gets added it would need to be explicitly added in the whitelist to be accessible by lua scripts */ - // require dummy library to check if "_LOADED" registry key is used for loaded libraries(LUA_LOADED_TABLE definition) - state.RequireF("_dummy", DummyOpen, false); - state.Pop(1); - if (state.GetField((int)LuaRegistry.Index, "_LOADED") != LuaType.Table) - throw new Exception("Loaded libraries table was not found at *registry*._LOADED"); - state.Pop(1); - // open whitelisted libraries foreach (var library in whitelistedLibraries) { @@ -63,29 +54,15 @@ to be explicitly added in the whitelist to be accessible by lua scripts state.SetGlobal(library.name); } - // push 3 values onto the stack: new env table, new loaded table, deepCleanTable function + // whitelist the registry table using (var streamReader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream("kOS.Lua.whitelist.lua"))) { state.LoadString(streamReader.ReadToEnd()); } + state.PushCopy((int)LuaRegistry.Index); state.PushCFunction(SetUpvalue); - state.Call(1, 3); - - // call the deepCleanTable function on the global table - state.PushCopy(-1); - if (state.RawGetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals) != LuaType.Table) - throw new Exception("Global table was not found at *registry*[LuaRegistryIndex.Globals]"); - state.Call(1, 0); - - // call the deepCleanTable function on the loaded table - state.GetField((int)LuaRegistry.Index, "_LOADED"); - state.Call(1, 0); - - // assign the loaded table to *registry*._LOADED - state.SetField((int)LuaRegistry.Index, "_LOADED"); + state.Call(2, 0); - // assign the env table to *registry*[LuaRegistryIndex.Globals] - state.RawSetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals); state.GarbageCollector(LuaGC.Collect, 0); // open lua libraries @@ -115,13 +92,6 @@ private static int SetUpvalue(IntPtr L) state.SetUpValue(1, n); return 0; } - - private static int DummyOpen(IntPtr L) - { - var state = KeraLua.Lua.FromIntPtr(L); - state.NewTable(); - return 1; - } } public class RegList : List diff --git a/src/kOS/Lua/whitelist.lua b/src/kOS/Lua/whitelist.lua index d8e229b51f..d192f59d0a 100644 --- a/src/kOS/Lua/whitelist.lua +++ b/src/kOS/Lua/whitelist.lua @@ -1,7 +1,6 @@ -local setupvalue = ... +local registry, setUpvalue = ... local env = { --- _G = _G, holds the old environment _VERSION = _VERSION, assert = assert, collectgarbage = collectgarbage, @@ -32,7 +31,6 @@ local env = { package = { config = package.config, path = package.path, - preload = package.preload, searchers = { package.searchers[1], package.searchers[2], @@ -118,20 +116,28 @@ local env = { } env._G = env -local loaded = { - _G = env._G, - package = env.package, - coroutine = env.coroutine, - math = env.math, - string = env.string, - table = env.table, - utf8 = env.utf8, +local whitelistedRegistry = { + registry[1], -- main thread + env, + _LOADED = { + _G = env._G, + package = env.package, + coroutine = env.coroutine, + math = env.math, + string = env.string, + table = env.table, + utf8 = env.utf8, + }, + _PRELOAD = {}, + _CLIBS = setmetatable({}, getmetatable(registry._CLIBS)), } -env.package.loaded = loaded -setupvalue(env.require, 1, env.package) -for _,searcher in env.ipairs(env.package.searchers) do - setupvalue(searcher, 1, env.package) +env.package.loaded = whitelistedRegistry._LOADED +env.package.preload = whitelistedRegistry._PRELOAD + +setUpvalue(env.require, 1, env.package) +for _,searcher in ipairs(env.package.searchers) do + setUpvalue(searcher, 1, env.package) end local visitedTables = {} @@ -145,4 +151,8 @@ local function deepCleanTable(tab) end end -return env, loaded, deepCleanTable \ No newline at end of file +deepCleanTable(registry) + +for k,v in env.pairs(whitelistedRegistry) do + registry[k] = v +end \ No newline at end of file From a3340c079f1b82f1de5a3b070b92168162ebc7d5 Mon Sep 17 00:00:00 2001 From: sug44 Date: Sat, 9 Nov 2024 08:31:55 +0300 Subject: [PATCH 065/108] Define package.config instead of using the native package library config Fix exception in FindPackage when packagesDirectory doesn't exist --- src/kOS/Lua/Libs/Package.cs | 106 ++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 60 deletions(-) diff --git a/src/kOS/Lua/Libs/Package.cs b/src/kOS/Lua/Libs/Package.cs index e57e51de65..18aa69ed6a 100644 --- a/src/kOS/Lua/Libs/Package.cs +++ b/src/kOS/Lua/Libs/Package.cs @@ -1,5 +1,6 @@ using KeraLua; using System; +using System.Collections.Generic; using System.IO; using System.Reflection; using System.Runtime.InteropServices; @@ -24,9 +25,22 @@ public static class Package RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "dll" : RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "dylib" : "so"; - + private static readonly PackageConfig config = new PackageConfig + { + DIRSEP = VolumePath.PathSeparator, + PATHSEP = ';', + PATHMARK = '?', + EXECDIR = '!', + IGMARK = '-', + }; + // "0:/?.lua;0:/?/init.lua;/?.lua;/?/init.lua;?.lua;?/init.lua" + private static readonly string luaSearchPath = + $"0:{config.DIRSEP}{config.PATHMARK}.lua{config.PATHSEP}"+ + $"0:{config.DIRSEP}{config.PATHMARK}{config.DIRSEP}init.lua{config.PATHSEP}"+ + $"{config.DIRSEP}{config.PATHMARK}.lua{config.PATHSEP}"+ + $"{config.DIRSEP}{config.PATHMARK}{config.DIRSEP}init.lua{config.PATHSEP}"+ + $"{config.PATHMARK}.lua{config.PATHSEP}{config.PATHMARK}{config.DIRSEP}init.lua"; private static LuaFunction _loadlib; - private static PackageConfig _packageConfig; public static int Open(IntPtr L) { @@ -41,7 +55,7 @@ Rewritten package library with limited functionality to make library safe. loadlib, searchpath function */ - // call luaopen_package with a new fake global table + // swap the global table and call luaopen_package state.PushGlobalTable(); state.NewTable(); state.PushCopy(-1); @@ -77,7 +91,7 @@ LUAMOD_API int luaopen_package (lua_State *L) { state.Insert(-3); state.Insert(-2); // package table, fake global table, global table - state.RawSetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals); + state.RawSetInteger((int)LuaRegistry.Index, (int)LuaRegistryIndex.Globals); // restore the real global table state.GetField(-1, "require"); var require = state.ToCFunction(-1); @@ -85,21 +99,7 @@ LUAMOD_API int luaopen_package (lua_State *L) { state.GetField(-1, "loadlib"); _loadlib = state.ToCFunction(-1); - state.Pop(1); // pop loadlib - - // get package config - state.GetField(-1, "config"); - var config = state.ToString(-1); - string[] configValues = config.Split('\n'); - _packageConfig = new PackageConfig - { - DIRSEP = configValues[0], // / - PATHSEP = configValues[1], // ; - PATHMARK = configValues[2], // ? - EXECDIR = configValues[3], // ! - IGMARK = configValues[4], // - - }; - state.Pop(2); // pop config string and package table + state.Pop(2); // pop loadlib and package table // new package table state.NewTable(); @@ -121,23 +121,14 @@ LUAMOD_API int luaopen_package (lua_State *L) { state.SetField(-2, "searchers"); // add config - state.PushString(config); + state.PushString(config.DIRSEP+"\n"+config.PATHSEP+"\n"+config.PATHMARK+"\n"+config.EXECDIR+"\n"+config.IGMARK); state.SetField(-2, "config"); // add path string - var dirSep = VolumePath.PathSeparator; - // "0:/?.lua;0:/?/init.lua;/?.lua;/?/init.lua;?.lua;?/init.lua" - state.PushString( - $"0:{dirSep}{_packageConfig.PATHMARK}.lua{_packageConfig.PATHSEP}"+ - $"0:{dirSep}{_packageConfig.PATHMARK}{dirSep}init.lua{_packageConfig.PATHSEP}"+ - $"{dirSep}{_packageConfig.PATHMARK}.lua{_packageConfig.PATHSEP}"+ - $"{dirSep}{_packageConfig.PATHMARK}{dirSep}init.lua{_packageConfig.PATHSEP}"+ - $"{_packageConfig.PATHMARK}.lua{_packageConfig.PATHSEP}{_packageConfig.PATHMARK}{dirSep}init.lua"); + state.PushString(luaSearchPath); state.SetField(-2, "path"); - // add registry preload table - state.GetField(LuaRegistry.Index, "_PRELOAD"); - state.SetField(-2, "preload"); + // loaded and preload tables are getting added in whitelist.lua return 1; } @@ -165,9 +156,9 @@ private static int LuaSearcher(IntPtr L) var paths = state.ToString(-1); var volumeManager = Binding.bindings[state.MainThread.Handle].Shared.VolumeMgr; var errorMessage = ""; - foreach(var pathTemplate in paths.Split(_packageConfig.PATHSEP.ToCharArray())) + foreach(var pathTemplate in paths.Split(config.PATHSEP)) { - var path = pathTemplate.Replace(_packageConfig.PATHMARK, name); + var path = pathTemplate.Replace(config.PATHMARK.ToString(), name); var globalPath = Binding.LuaExceptionCatch(() => volumeManager.GlobalPathFromObject(path), state) as GlobalPath; var file = Binding.LuaExceptionCatch(() => volumeManager.GetVolumeFromPath(globalPath).Open(globalPath), state) as VolumeFile; if (file == null) @@ -186,18 +177,23 @@ private static int LuaSearcher(IntPtr L) private static string FindPackage(KeraLua.Lua state, string[] names) { + var packages = new Dictionary(); + if (Directory.Exists(packagesDirectory)) + { + foreach (var packagePath in Directory.GetFiles(packagesDirectory)) + { + packages.Add(Path.GetFileName(packagePath), packagePath); + } + } var errorMessage = ""; foreach (var name in names) { - foreach (var packagePath in Directory.GetFiles(packagesDirectory)) + var fileName = name + "." + libraryExtension; + if (packages.TryGetValue(fileName, out var packagePath)) { - var packageName = Path.GetFileName(packagePath); - if (name == packageName) - { - return packagePath; - } + return packagePath; } - errorMessage += $"no file '{packagesDirectory + name}'\n"; + errorMessage += $"no file '{packagesDirectory + fileName}'\n"; } state.PushString(errorMessage); return null; @@ -206,11 +202,11 @@ private static string FindPackage(KeraLua.Lua state, string[] names) private static int LoadFunc(KeraLua.Lua state, string filename, string name) { var modname = name.Replace('.', '_'); - if (modname.Contains(_packageConfig.IGMARK)) + if (modname.Contains(config.IGMARK.ToString())) { - var stat = LookForFunc(state, filename, "luaopen_" + modname.Split(_packageConfig.IGMARK.ToCharArray())[0]); + var stat = LookForFunc(state, filename, "luaopen_" + modname.Split(config.IGMARK)[0]); if (stat != 2) return stat; - return LookForFunc(state, filename, "luaopen_" + modname.Split(_packageConfig.IGMARK.ToCharArray())[1]); + return LookForFunc(state, filename, "luaopen_" + modname.Split(config.IGMARK)[1]); } return LookForFunc(state, filename, "luaopen_" + modname); } @@ -236,12 +232,7 @@ private static int CSearcher(IntPtr L) { var state = KeraLua.Lua.FromIntPtr(L); var name = state.CheckString(1); - string[] names = - { - name + "." + libraryExtension, - "loadall." + libraryExtension, - }; - var filename = FindPackage(state, names); + var filename = FindPackage(state, new [] { name, "loadall" }); if (filename == null) return 1; var success = 0 == LoadFunc(state, filename, name); if (!success) @@ -255,12 +246,7 @@ private static int CRootSearcher(IntPtr L) var state = KeraLua.Lua.FromIntPtr(L); var name = state.CheckString(1); if (!name.Contains(".")) return 0; - string[] names = - { - name.Split('.')[0] + "." + libraryExtension, - "loadall." + libraryExtension, - }; - var filename = FindPackage(state, names); + var filename = FindPackage(state, new [] { name.Split('.')[0], "loadall" }); if (filename == null) return 1; var status = LoadFunc(state, filename, name); if (status == 1) @@ -276,11 +262,11 @@ private static int CRootSearcher(IntPtr L) private struct PackageConfig { - public string DIRSEP; - public string PATHSEP; - public string PATHMARK; - public string EXECDIR; - public string IGMARK; + public char DIRSEP; + public char PATHSEP; + public char PATHMARK; + public char EXECDIR; + public char IGMARK; } } } \ No newline at end of file From 212d323aabc9324ac0da87225ac363634dd09d90 Mon Sep 17 00:00:00 2001 From: sug44 Date: Thu, 14 Nov 2024 07:20:53 +0300 Subject: [PATCH 066/108] Add building modules with lua-build workflow Add lua-cjson luarocks module. Fix post build lua test for windows --- .github/workflows/lua-build.yml | 73 ++++++++++++++++++++++++--------- .gitignore | 5 +-- .gitmodules | 2 +- src/kOS/Lua/Libs/Package.cs | 34 +++++++++------ src/kOS/Lua/lua | 2 +- src/kOS/kOS.csproj | 14 ++++--- 6 files changed, 87 insertions(+), 43 deletions(-) diff --git a/.github/workflows/lua-build.yml b/.github/workflows/lua-build.yml index 296b7ca3a9..f517538f1d 100644 --- a/.github/workflows/lua-build.yml +++ b/.github/workflows/lua-build.yml @@ -16,11 +16,15 @@ on: permissions: contents: write +defaults: + run: + shell: bash + env: LUA_SOURCE_DIR: ${{ github.workspace }}/src/kOS/Lua/lua LUA_BUILD_DIR: ${{ github.workspace }}/src/kOS/Lua/lua/_build LUA_OUTPUT_DIR: ${{ github.workspace }}/src/kOS/Lua/include - + jobs: build: runs-on: ${{ matrix.os }} @@ -32,42 +36,73 @@ jobs: - uses: actions/checkout@v4 with: submodules: 'true' - + - name: Set vars id: vars - shell: bash run: | if [ "$RUNNER_OS" == "Linux" ]; then - echo "LUA_LIB_NAME=liblua54.so" >> "$GITHUB_OUTPUT" - echo "LUA_LIB_PATH=$LUA_BUILD_DIR/lib64/liblua54.so" >> "$GITHUB_OUTPUT" + echo 'LUA_LIB_NAME=liblua54.so" >> "$GITHUB_OUTPUT' + echo 'LUA_LIB_PATH=$LUA_BUILD_DIR/lib64/liblua54.so' >> "$GITHUB_OUTPUT" + echo 'LUA_LUAROCKS_LIB_PATH=/usr/local/lib/lua/5.4' >> "$GITHUB_OUTPUT" elif [ "$RUNNER_OS" == "Windows" ]; then - echo "LUA_LIB_NAME=lua54.dll" >> "$GITHUB_OUTPUT" - echo "LUA_LIB_PATH=$LUA_BUILD_DIR/bin64/lua54.dll" >> "$GITHUB_OUTPUT" + echo 'LUA_LIB_NAME=lua54.dll" >> "$GITHUB_OUTPUT' + echo 'LUA_LIB_PATH=$LUA_BUILD_DIR/bin/lua54.dll' >> "$GITHUB_OUTPUT" + echo 'LUA_LUAROCKS_LIB_PATH=~/.luarocks/lib/lua/5.4' >> "$GITHUB_OUTPUT" elif [ "$RUNNER_OS" == "macOS" ]; then - echo "LUA_LIB_NAME=liblua54.dylib" >> "$GITHUB_OUTPUT" - echo "LUA_LIB_PATH=$LUA_BUILD_DIR/lib64/liblua54.dylib" >> "$GITHUB_OUTPUT" + echo 'LUA_LIB_NAME=liblua54.dylib" >> "$GITHUB_OUTPUT' + echo 'LUA_LIB_PATH=$LUA_BUILD_DIR/lib64/liblua54.dylib' >> "$GITHUB_OUTPUT" + echo 'LUA_LUAROCKS_LIB_PATH=/usr/local/lib/lua/5.4' >> "$GITHUB_OUTPUT" fi - + - name: Configure CMake - shell: bash run: cmake -S $LUA_SOURCE_DIR -B $LUA_BUILD_DIR - name: Build - shell: bash run: cmake --build $LUA_BUILD_DIR --config Release - name: Test - shell: bash - if: matrix.os != 'windows-latest' # TODO: fix test working-directory: ${{ env.LUA_BUILD_DIR }} run: ctest --build-config Release + + - name: Install LuaRocks + run: | + mv $LUA_BUILD_DIR/bin64 $LUA_BUILD_DIR/bin # luarocks gets lost if lua binary is not in "bin" directory + if [ "$RUNNER_OS" == "Windows" ]; then + curl http://luarocks.github.io/luarocks/releases/luarocks-3.11.1-windows-64.zip --output luarocks.zip + unzip luarocks.zip -d ~/luarocks + mv ~/luarocks/luarocks-3.11.1-windows-64/* ~/luarocks + rm -rf ~/luarocks/luarocks-3.11.1-windows-64 + else + wget https://luarocks.org/releases/luarocks-3.11.1.tar.gz + tar zxpf luarocks-3.11.1.tar.gz + cd luarocks-3.11.1 + ./configure --with-lua-bin="$LUA_BUILD_DIR/bin" + make && sudo make install + fi + - name: Install modules + run: | + if [ "$RUNNER_OS" == "Windows" ]; then + PATH=~/luarocks:$LUA_BUILD_DIR/bin:$PATH + luarocks install lua-cjson 2.1.0.10-1 + else + sudo luarocks install lua-cjson 2.1.0.10-1 + fi + + - name: Create artifact + run: | + rm -rf artifact + mkdir artifact + cp ${{ steps.vars.outputs.LUA_LIB_PATH }} artifact/${{ steps.vars.outputs.LUA_LIB_NAME }} + mkdir artifact/LuaModules artifact/LuaModules/${{ runner.os }} + cp -r ${{ steps.vars.outputs.LUA_LUAROCKS_LIB_PATH }}/. artifact/LuaModules/${{ runner.os }} + - uses: actions/upload-artifact@v4 with: - name: ${{ steps.vars.outputs.LUA_LIB_NAME }} + name: ${{ runner.os }} if-no-files-found: error retention-days: 7 - path: ${{ steps.vars.outputs.LUA_LIB_PATH }} + path: ${{ github.workspace }}/artifact push: runs-on: ubuntu-latest @@ -77,15 +112,15 @@ jobs: - uses: actions/checkout@v4 with: submodules: 'true' - + - name: Clear output directory run: rm -rf $LUA_OUTPUT_DIR - + - uses: actions/download-artifact@v4 with: merge-multiple: 'true' path: ${{ env.LUA_OUTPUT_DIR }} - + - name: Push env: GIT_COMMITTER_NAME: lua-build automation diff --git a/.gitignore b/.gitignore index a71946878f..01a2f935e3 100644 --- a/.gitignore +++ b/.gitignore @@ -38,15 +38,14 @@ packages/ [Rr]esources/GameData/kOS/Plugins/ [Rr]esources/*.dll [Rr]esources/GameData/*.dll +[Rr]esources/GameData/kOS/Parts/@thumbs/ +[Rr]esources/GameData/kOS/PluginData/LuaModules/ !Resources/GameData/kOS/ICSharpCode.SharpZipLib.dll # Symlink to KSP directory KSPdirlink KSP -# Part thumbnails added through the KSP symlink -Resources/GameData/kOS/Parts/@thumbs/ - # OS Specific .DS_STORE* [Tt]humbs.db diff --git a/.gitmodules b/.gitmodules index 6c8703e558..05188d983f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -3,4 +3,4 @@ url = https://github.com/KSPModdingLibs/KSPBuildTools.git [submodule "src/kOS/Lua/lua"] path = src/kOS/Lua/lua - url = git@github.com:NLua/lua.git + url = git@github.com:sug44/lua.git diff --git a/src/kOS/Lua/Libs/Package.cs b/src/kOS/Lua/Libs/Package.cs index 18aa69ed6a..cd56a20717 100644 --- a/src/kOS/Lua/Libs/Package.cs +++ b/src/kOS/Lua/Libs/Package.cs @@ -19,12 +19,17 @@ public static class Package CRootSearcher }; - private static readonly string packagesDirectory = Assembly.GetExecutingAssembly().Location.Replace("kOS.dll", - "LuaPackages" + Path.DirectorySeparatorChar); - private static readonly string libraryExtension = - RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "dll" : - RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "dylib" : - "so"; + private static readonly string osName = + RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "Windows" : + RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? "macOS" : + "Linux"; + private static readonly string modulesDirectory = + Path.Combine(new DirectoryInfo(Assembly.GetExecutingAssembly().Location).Parent.Parent.FullName, + "PluginData", "LuaModules", osName); + private static readonly string[] libraryExtensions = + RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? new [] { "dll" } : + RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? new [] { "so", "dylib", "framework" } : + new [] { "so" }; private static readonly PackageConfig config = new PackageConfig { DIRSEP = VolumePath.PathSeparator, @@ -51,7 +56,7 @@ Rewritten package library with limited functionality to make library safe. Only 'require' and 'loadlib' functions are taken from the native package library. The unsafe loadlib function is only used internally to look for C functions in a library. functionality removed: - changing cpath, C searchers will only look in packagesDirectory + changing cpath, C searchers will only look in modulesDirectory loadlib, searchpath function */ @@ -178,9 +183,9 @@ private static int LuaSearcher(IntPtr L) private static string FindPackage(KeraLua.Lua state, string[] names) { var packages = new Dictionary(); - if (Directory.Exists(packagesDirectory)) + if (Directory.Exists(modulesDirectory)) { - foreach (var packagePath in Directory.GetFiles(packagesDirectory)) + foreach (var packagePath in Directory.GetFiles(modulesDirectory)) { packages.Add(Path.GetFileName(packagePath), packagePath); } @@ -188,12 +193,15 @@ private static string FindPackage(KeraLua.Lua state, string[] names) var errorMessage = ""; foreach (var name in names) { - var fileName = name + "." + libraryExtension; - if (packages.TryGetValue(fileName, out var packagePath)) + foreach (var extension in libraryExtensions) { - return packagePath; + var fileName = name + "." + extension; + if (packages.TryGetValue(fileName, out var packagePath)) + { + return packagePath; + } + errorMessage += $"no file '{Path.Combine(modulesDirectory, fileName)}'\n"; } - errorMessage += $"no file '{packagesDirectory + fileName}'\n"; } state.PushString(errorMessage); return null; diff --git a/src/kOS/Lua/lua b/src/kOS/Lua/lua index def5fd2429..34fb3cd463 160000 --- a/src/kOS/Lua/lua +++ b/src/kOS/Lua/lua @@ -1 +1 @@ -Subproject commit def5fd2429f6dedf0dfb2afead93cd440735c533 +Subproject commit 34fb3cd4637283e44e7ab7a38364bac94468d713 diff --git a/src/kOS/kOS.csproj b/src/kOS/kOS.csproj index cbe1ce1ad8..742276f5a0 100644 --- a/src/kOS/kOS.csproj +++ b/src/kOS/kOS.csproj @@ -289,12 +289,14 @@ - - - %(RecursiveDir)%(Filename)%(Extension) - Always - - + + + + + + + + From 510e43c1470e7d0fa630c979a8c0ef3456018438 Mon Sep 17 00:00:00 2001 From: lua-build automation Date: Thu, 14 Nov 2024 04:27:35 +0000 Subject: [PATCH 067/108] Build lua --- src/kOS/Lua/include/LuaModules/Linux/cjson.so | Bin 0 -> 43376 bytes .../Lua/include/LuaModules/Windows/cjson.dll | Bin 0 -> 78966 bytes src/kOS/Lua/include/LuaModules/macOS/cjson.so | Bin 0 -> 72136 bytes src/kOS/Lua/include/lua54.dll | Bin 605696 -> 518144 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/kOS/Lua/include/LuaModules/Linux/cjson.so create mode 100644 src/kOS/Lua/include/LuaModules/Windows/cjson.dll create mode 100644 src/kOS/Lua/include/LuaModules/macOS/cjson.so diff --git a/src/kOS/Lua/include/LuaModules/Linux/cjson.so b/src/kOS/Lua/include/LuaModules/Linux/cjson.so new file mode 100644 index 0000000000000000000000000000000000000000..088d648da6b4ee2a588b217e53139a659f30451b GIT binary patch literal 43376 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 literal 0 HcmV?d00001 diff --git a/src/kOS/Lua/include/LuaModules/macOS/cjson.so b/src/kOS/Lua/include/LuaModules/macOS/cjson.so new file mode 100644 index 0000000000000000000000000000000000000000..836cda3c973d7269f6db6fc9578b3366245f92c1 GIT binary patch literal 72136 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 literal 0 HcmV?d00001 diff --git a/src/kOS/Lua/include/lua54.dll b/src/kOS/Lua/include/lua54.dll index 08c12949fcabe35a6a440b9a9f6adff05eb0a56f..deca040f1c42cfe17a8bb45517c6528f139741b1 100644 GIT binary patch literal 518144 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ℜ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⩔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