From 8c3803fcdf9411da13e462596847a88f1080bb39 Mon Sep 17 00:00:00 2001 From: Avery Norris Date: Sat, 28 Feb 2026 11:46:56 -0500 Subject: [PATCH] Awperative 1.3C --- .../Kernel/Atrributes/AwperativeAttributes.cs | 26 +++--- .../Kernel/Component/ComponentLambda.cs | 6 +- AwperativeKernel/Kernel/Debug/Debug.cs | 26 +++++- .../Kernel/Overhead/Awperative/Awperative.cs | 77 ++++++------------ AwperativeKernel/VersionHistory.md | 16 +++- .../Debug/net8.0/refint/AwperativeKernel.dll | Bin 9728 -> 16384 bytes 6 files changed, 80 insertions(+), 71 deletions(-) diff --git a/AwperativeKernel/Kernel/Atrributes/AwperativeAttributes.cs b/AwperativeKernel/Kernel/Atrributes/AwperativeAttributes.cs index bf232d3..95be806 100644 --- a/AwperativeKernel/Kernel/Atrributes/AwperativeAttributes.cs +++ b/AwperativeKernel/Kernel/Atrributes/AwperativeAttributes.cs @@ -31,7 +31,7 @@ public class DockerOwns : Attribute __docker.GetHashCode().ToString("N0") ]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -62,7 +62,7 @@ public class DockerDoesntOwn : Attribute __docker.GetHashCode().ToString("N0") ]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -94,7 +94,7 @@ public class OrphanComponent : Attribute __component.ComponentDocker.GetHashCode().ToString("N0") ]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -118,7 +118,7 @@ public class ComponentNotNull : Attribute Debug.LogError("Component is null!"); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -142,7 +142,7 @@ public class DockerNotNull : Attribute Debug.LogError("Docker is null!"); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -165,7 +165,7 @@ public class SceneNotNull : Attribute Debug.LogError("Scene is null!"); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -188,7 +188,7 @@ public class CollectionNotNull : Attribute if (__collection[i] == null) Debug.LogError("A Given Collection has null members!", ["Type"], [__collection.GetType().Name]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -211,7 +211,7 @@ public class EnumeratorNotNull : Attribute if (obj == null) Debug.LogError("A Given Enumerator has null members!", ["Type"], [__enumerator.GetType().Name]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -236,7 +236,7 @@ public class NotNull : Attribute [__object.GetType().Name ]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -263,7 +263,7 @@ public class DifferentDocker : Attribute __docker.GetHashCode().ToString("N0") ]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -287,7 +287,7 @@ public class ValueFitsRange : Attribute Debug.LogError("Value does not fit range!", ["Index"], [__index.ToString("N0")]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -312,7 +312,7 @@ public class CollectionContains : Attribute Debug.LogError("Collection does not contain object!", ["ObjectType"], [__object.GetType().Name]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } @@ -337,7 +337,7 @@ public class CollectionDoesntContain : Attribute Debug.LogError("Collection already contains object!", ["ObjectType"], [__object.GetType().Name]); - return Awperative.IgnoreErrors; + return Debug.IgnoreErrors; } } diff --git a/AwperativeKernel/Kernel/Component/ComponentLambda.cs b/AwperativeKernel/Kernel/Component/ComponentLambda.cs index 0955931..02c0253 100644 --- a/AwperativeKernel/Kernel/Component/ComponentLambda.cs +++ b/AwperativeKernel/Kernel/Component/ComponentLambda.cs @@ -2,8 +2,6 @@ namespace AwperativeKernel; public abstract partial class Component { - #region Scenes - /// public static Scene CreateScene(string __name) => Awperative.CreateScene(__name); @@ -22,11 +20,9 @@ public abstract partial class Component /// public void RemoveScene(string __name) => Awperative.CloseScene(__name); - #endregion - #region Components + /// public void Move(ComponentDocker __newDocker) => ComponentDocker.Move(this, __newDocker); - #endregion } \ No newline at end of file diff --git a/AwperativeKernel/Kernel/Debug/Debug.cs b/AwperativeKernel/Kernel/Debug/Debug.cs index a5885ae..9575a44 100644 --- a/AwperativeKernel/Kernel/Debug/Debug.cs +++ b/AwperativeKernel/Kernel/Debug/Debug.cs @@ -154,7 +154,7 @@ public static class Debug /// Names of values to debug /// Values to debug public static void LogError(string __message, string[] __parameters, string[] __values) { - if(Awperative.DebugErrors) LogGeneric(__message, "ERR", __parameters, __values, Awperative.ThrowExceptions); + if(DebugErrors) LogGeneric(__message, "ERR", __parameters, __values, ThrowExceptions); } /// @@ -209,4 +209,28 @@ public static class Debug File.AppendAllText(LogFilePath, output); } + + + + public static Debug.SafetyLevel safetyLevel { + get => _safetyLevel; + set { + ThrowExceptions = value is Debug.SafetyLevel.Extreme; + IgnoreErrors = value is Debug.SafetyLevel.Low or Debug.SafetyLevel.None; + DebugErrors = value is not Debug.SafetyLevel.None; + _safetyLevel = value; + } + } + + private static Debug.SafetyLevel _safetyLevel; + public static bool ThrowExceptions { get; private set; } = false; + public static bool IgnoreErrors { get; private set; } = false; + public static bool DebugErrors { get; private set; } = true; + + public enum SafetyLevel { + Extreme, //Throw exceptions and stop the whole program + Normal, //Just debug it to the console, and halt current process + Low, //Push through tasks but debug error + None, //Ignore most/all errors and do not debug it, + } } \ No newline at end of file diff --git a/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs b/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs index afd337d..ec87d59 100644 --- a/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs +++ b/AwperativeKernel/Kernel/Overhead/Awperative/Awperative.cs @@ -2,7 +2,6 @@ using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Collections.ObjectModel; -using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Linq.Expressions; using System.Reflection; @@ -14,44 +13,39 @@ namespace AwperativeKernel; /// Initiating class of Awperative. Call Start() to start the kernel. /// /// Avery Norris -public static class Awperative +public static partial class Awperative { /// /// Current Version of Awperative /// - public static string Version = "1.2B"; - - - - /// - /// Bottom class of Awperative. Contains the MonoGame instance. - /// - public static Base Base { get; internal set; } - + public static string Version = "1.2C"; + + + /// + /// Bottom class of Awperative. Contains the OpenTK Instance. + /// + [NotNull, UnsafeInternal] private static Base Base; + + /// /// List of all scenes currently loaded in the kernel. /// - public static ImmutableArray Scenes => [.._scenes]; - internal static HashSet _scenes { get; private set; } = []; + [CalculatedProperty, CalculatedPropertyExpense("Very Low")] + public static IReadOnlyList Scenes => [.._scenes]; + [UnsafeInternal] internal static HashSet _scenes { get; private set; } = []; - - public static bool IsRunning { get; private set; } = false; + + /// Displays if Awperative has Started or not public static bool IsStarted { get; private set; } = false; + /// Displays if the update loop is active + public static bool IsRunning { get; private set; } = false; - - public static bool DebugMode = false; - - - - - - /// /// Creates a new Scene /// @@ -87,7 +81,7 @@ public static class Awperative /// Closes a Scene /// /// Scene to close - public static void CloseScene(Scene __scene) => Scenes.Remove(__scene); + public static void CloseScene(Scene __scene) => _scenes.Remove(__scene); @@ -95,18 +89,20 @@ public static class Awperative /// Closes a Scene /// /// Name of the scene - public static void CloseScene(string __name) => Scenes.Remove(GetScene(__name)); + public static void CloseScene(string __name) => _scenes.Remove(GetScene(__name)); /// - /// Gets Awperative ready to roll! + /// Gets Awperative ready to begin! Compiles Component functions etc. Please call before doing anything Awperative + /// related! /// - /// List of all event hooks you wish to use. - /// You cannot add new hooks later; so make sure to register all of them in the Start() method. public static void Start() { + if(IsStarted) return; + IsStarted = true; + Debug.Initiate(); //Load in all Components nd find the associated types. @@ -156,8 +152,9 @@ public static class Awperative /// /// Starts Awperative up! This method runs forever. /// - [DoesNotReturn] public static void Run() { + if(!IsStarted && IsRunning) return; + IsRunning = true; Base = new Base(); Base.Run(); } @@ -184,27 +181,5 @@ public static class Awperative internal static Dictionary[]> _TypeAssociatedTimeEvents = []; - - public static SafetyLevel safetyLevel { - get => _safetyLevel; - set { - ThrowExceptions = value is SafetyLevel.Extreme; - IgnoreErrors = value is SafetyLevel.Low or SafetyLevel.None; - DebugErrors = value is not SafetyLevel.None; - _safetyLevel = value; - } - } private static SafetyLevel _safetyLevel; - - public static bool ThrowExceptions { get; private set; } = false; - public static bool IgnoreErrors { get; private set; } = false; - public static bool DebugErrors { get; private set; } = true; - - //What to do if there is an error, keep in mind low and none still can have errors, because you are turning off validation checking - public enum SafetyLevel { - Extreme, //Throw exceptions and stop the whole program - Normal, //Just debug it to the console, and halt current process - Low, //Push through tasks but debug error - None, //Ignore most/all errors and do not debug it, - } } \ No newline at end of file diff --git a/AwperativeKernel/VersionHistory.md b/AwperativeKernel/VersionHistory.md index d0247ca..dc998b6 100644 --- a/AwperativeKernel/VersionHistory.md +++ b/AwperativeKernel/VersionHistory.md @@ -29,4 +29,18 @@ A few modules have been given documentation and the website is currently underwa Awperative is officially moved to Open TK! -# Awperative V1.2B \ No newline at end of file +# Awperative V1.2B + +### Feb 21 2026 + +--- + +Beta Reflection And Speed Increasment + +# Awperative V1.2C + +### Feb 28 2026 + +--- + +Finished Reflection, and Awperative is MUCH faster. \ No newline at end of file diff --git a/AwperativeKernel/obj/Debug/net8.0/refint/AwperativeKernel.dll b/AwperativeKernel/obj/Debug/net8.0/refint/AwperativeKernel.dll index 1b1cce7820ee7eb6ab32a3fee20692eee1278c4d..4c3317597ecb37090d012a8dd3dcb3130b8b8cbc 100644 GIT binary patch literal 16384 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 literal 9728 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