diff --git a/Awperative/Kernel/Behavior/Core.cs b/Awperative/Kernel/Behavior/Core.cs
index 18846b0..4a1e67e 100644
--- a/Awperative/Kernel/Behavior/Core.cs
+++ b/Awperative/Kernel/Behavior/Core.cs
@@ -14,43 +14,80 @@ namespace Awperative;
///
public abstract partial class Behavior : Docker
{
-
- public Scene Scene;
- public Behavior Parent = null;
-
-
- //todo tags and order
- internal void Initiate(Scene __scene, Docker __parent) {
- Scene = __scene;
- if (__parent is Behavior behavior) Parent = behavior;
-
+ ///
+ /// Current parent of the Behavior. Can be either Scene or another Behavior.
+ ///
+ internal Docker Docker;
+
+
+
+ ///
+ /// Identifiers for Behaviors.
+ ///
+ public List Tags;
+
+
+
+ ///
+ /// Order for when Behaviors are called on. Only applies between Components on the same Docker.
+ ///
+ public int Priority;
+
+
+
+
+
+ ///
+ /// To be called when the Behavior is created.
+ ///
+ /// Docker that this spawned in this Behavior
+ internal void Initiate(Docker __parent) {
+ Docker = __parent;
Create();
}
-
-
-
- internal void End() {
- Destroy();
- }
+ ///
+ /// Called when the Game is Closing; does not always happen depending on if it is Force Closed.
+ ///
protected internal virtual void Unload() {}
+
+ ///
+ /// Called when the Game is Loading.
+ ///
protected internal virtual void Load() {}
- //You know what these do
- protected internal virtual void Update(GameTime __gameTime) {}
- protected internal virtual void Draw(GameTime __gameTime) {}
- //component/body/scene is being created or destroyed
+ ///
+ /// Called every frame before Draw, it is recommended to do any Non-Drawing update logic here.
+ ///
+ protected internal virtual void Update() {}
+
+ ///
+ /// Called after Update when the screen is being drawn. Please only put Drawing related logic here.
+ ///
+ protected internal virtual void Draw() {}
+
+
+
+ ///
+ /// Called when the Component is created.
+ ///
protected internal virtual void Create() {}
+
+ ///
+ /// Called when the Component is destroyed. Not called when the Game is closed.
+ ///
protected internal virtual void Destroy() {}
+
+
}
\ No newline at end of file
diff --git a/Awperative/Kernel/Behavior/Utility.cs b/Awperative/Kernel/Behavior/Utility.cs
new file mode 100644
index 0000000..be1b0f8
--- /dev/null
+++ b/Awperative/Kernel/Behavior/Utility.cs
@@ -0,0 +1,39 @@
+using System.Collections.Generic;
+
+namespace Awperative;
+
+public abstract partial class Behavior : Docker
+{
+ public Scene Scene => __QueryScene();
+ private Scene __QueryScene() {
+ if (Docker is Scene scene) return scene;
+ if (Docker is Behavior behavior) return behavior.__QueryScene();
+
+ return null;
+ }
+
+ public Docker[] Dockers => __QueryDockers();
+
+ private Docker[] __QueryDockers()
+ {
+ List returnValue = [];
+
+ Docker currentDocker = Docker;
+
+ while (!(currentDocker is Scene))
+ {
+ if (currentDocker is Behavior behavior)
+ {
+ returnValue.Add(behavior);
+ currentDocker = behavior.Docker;
+ }
+ }
+
+ returnValue.Add(currentDocker);
+
+ return returnValue.ToArray();
+ }
+
+ public Behavior[] Parents => __QueryParents();
+
+}
\ No newline at end of file
diff --git a/Awperative/Kernel/Docker/Behaviors.cs b/Awperative/Kernel/Docker/Behaviors.cs
index 3de2c7e..d395788 100644
--- a/Awperative/Kernel/Docker/Behaviors.cs
+++ b/Awperative/Kernel/Docker/Behaviors.cs
@@ -19,7 +19,7 @@ public abstract partial class Docker
if(behavior == null) { Debug.LogError("Failed to create component"); return null; }
_behaviors.Add(behavior);
- behavior.Initiate(DockerScene, this);
+ behavior.Initiate(this);
return behavior;
}catch { Debug.LogError("Failed to create component"); return null; }
@@ -49,7 +49,7 @@ public abstract partial class Docker
if(!_behaviors.Contains(behavior)) { Debug.LogError("Body does not have a component of this type"); return; }
- behavior.End();
+ behavior.Destroy();
_behaviors.Remove(behavior);
}
@@ -58,7 +58,7 @@ public abstract partial class Docker
{
Behavior foundBehavior = Get();
- foundBehavior.End();
+ foundBehavior.Destroy();
_behaviors.Remove(foundBehavior);
}catch { Debug.LogError("Removal failed"); }
}
@@ -66,7 +66,7 @@ public abstract partial class Docker
public void DestroyAll() where Generic : Behavior {
try {
foreach (Behavior component in GetAll()) {
- component.End();
+ component.Destroy();
_behaviors.Remove(component);
}
}catch { Debug.LogError("Removal failed"); }
@@ -79,5 +79,20 @@ public abstract partial class Docker
_behaviors.Remove(behavior);
}
- public void Remove<
+ public void Remove() where Generic : Behavior {
+ try
+ {
+ Behavior foundBehavior = Get();
+
+ _behaviors.Remove(foundBehavior);
+ }catch { Debug.LogError("Removal failed"); }
+ }
+
+ public void RemoveAll() where Generic : Behavior {
+ try {
+ foreach (Behavior component in GetAll()) {
+ _behaviors.Remove(component);
+ }
+ }catch { Debug.LogError("Removal failed"); }
+ }
}
\ No newline at end of file
diff --git a/Awperative/Kernel/Docker/Time.cs b/Awperative/Kernel/Docker/Time.cs
index a5e544d..ea0d10c 100644
--- a/Awperative/Kernel/Docker/Time.cs
+++ b/Awperative/Kernel/Docker/Time.cs
@@ -9,8 +9,8 @@ public abstract partial class Docker
- internal virtual void ChainUpdate(GameTime __gameTime) { foreach (Behavior component in _behaviors) { component.Update(__gameTime); } }
- internal virtual void ChainDraw(GameTime __gameTime) { foreach (Behavior component in _behaviors) { component.Draw(__gameTime); } }
+ internal virtual void ChainUpdate() { foreach (Behavior component in _behaviors) { component.Update(); } }
+ internal virtual void ChainDraw() { foreach (Behavior component in _behaviors) { component.Draw(); } }
diff --git a/Awperative/Kernel/Overhead/Base.cs b/Awperative/Kernel/Overhead/Base.cs
index ac2426b..c988bca 100644
--- a/Awperative/Kernel/Overhead/Base.cs
+++ b/Awperative/Kernel/Overhead/Base.cs
@@ -58,7 +58,7 @@ public sealed class Base : Game
///
/// Hooks are unable to receive both Update() and Draw()
protected override void Update(GameTime __gameTime) {
- foreach(Scene scene in Awperative.LoadedScenes.ToList()) scene.ChainUpdate(__gameTime);
+ foreach(Scene scene in Awperative.LoadedScenes.ToList()) scene.ChainUpdate();
base.Update(__gameTime);
}
@@ -71,7 +71,7 @@ public sealed class Base : Game
///
/// Hooks are unable to receive both Update() and Draw()
protected override void Draw(GameTime __gameTime) {
- foreach(Scene scene in Awperative.LoadedScenes.ToList()) scene.ChainDraw(__gameTime);
+ foreach(Scene scene in Awperative.LoadedScenes.ToList()) scene.ChainDraw();
base.Draw(__gameTime);
}