diff --git a/Class1.cs b/Class1.cs
deleted file mode 100644
index 5f28270..0000000
--- a/Class1.cs
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/Nocturnis.csproj b/Nocturnis.csproj
index b939019..45dacd6 100644
--- a/Nocturnis.csproj
+++ b/Nocturnis.csproj
@@ -14,4 +14,8 @@
+
+
+
+
diff --git a/src/Communicators/IBaseCommunicator.cs b/src/Communicators/IBaseCommunicator.cs
index 6bc6c45..1a75691 100644
--- a/src/Communicators/IBaseCommunicator.cs
+++ b/src/Communicators/IBaseCommunicator.cs
@@ -7,7 +7,7 @@ namespace Nocturnis.Communicators;
public interface IBaseCommunicator
{
ICommunicateModule PairedModule { get; set; }
- IDataPackage DataBuffer { get; set; }
+ IData DataBuffer { get; set; }
StringName CommunicationDataType { get; }
StringName CommunicationDirection { get; }
Texture2D IconTexture { get; }
diff --git a/src/DataStructures/ConfigurableParameters/IBoolParameter.cs b/src/DataStructures/ConfigurableParameters/IBoolParameter.cs
index 19af677..b36722f 100644
--- a/src/DataStructures/ConfigurableParameters/IBoolParameter.cs
+++ b/src/DataStructures/ConfigurableParameters/IBoolParameter.cs
@@ -4,4 +4,4 @@ public interface IBoolParameter : IConfigurableParameter
{
string TrueDescription { get; set; }
string FalseDescription { get; set; }
-}
\ No newline at end of file
+}
diff --git a/src/DataStructures/ConfigurableParameters/IKeyParameter.cs b/src/DataStructures/ConfigurableParameters/IKeyParameter.cs
index 4a56c4d..d9d4c00 100644
--- a/src/DataStructures/ConfigurableParameters/IKeyParameter.cs
+++ b/src/DataStructures/ConfigurableParameters/IKeyParameter.cs
@@ -5,4 +5,4 @@ namespace Nocturnis.DataStructures.ConfigurableParameters;
public interface IKeyParameter : IConfigurableParameter
{
-}
\ No newline at end of file
+}
diff --git a/src/DataStructures/DataCache.cs b/src/DataStructures/DataCache.cs
new file mode 100644
index 0000000..34606a3
--- /dev/null
+++ b/src/DataStructures/DataCache.cs
@@ -0,0 +1,44 @@
+using Godot;
+using Nocturnis.GlobalManagement.Providers;
+using Skeleton.DataStructure;
+
+namespace Nocturnis.DataStructures;
+
+public class DataCache : CacheItem
+{
+ public new static DataCache Null => new DataCache(x => (0, ""));
+ public DataCache(Func rec) : base(rec) => throw new Exception("CONSTRUCTION NOT ALLOWED");
+
+ public DataCache(Func rec)
+ {
+ Value = GlobalProvider.DataStructureProvider!.NewData(0, "");
+ ProxyCalculator = rec;
+ }
+
+ private new Func ProxyCalculator { get; set; }
+
+ public override IData? Get
+ {
+ get
+ {
+ if (Expired)
+ {
+ (object val, StringName type) = ProxyCalculator(this);
+ Value!.Type = type;
+ Value.Data = val;
+ }
+
+ return Value;
+ }
+ }
+
+ public void UpdateCalculation(Func rec)
+ {
+ Expire();
+ foreach (CacheItem item in Dependencies)
+ item.References.Remove(this);
+ Dependencies = new HashSet();
+ ProxyCalculator = rec;
+ }
+
+}
\ No newline at end of file
diff --git a/src/DataStructures/DataPortGroups/IDataInGroup.cs b/src/DataStructures/DataPortGroups/IDataInGroup.cs
new file mode 100644
index 0000000..c224f8c
--- /dev/null
+++ b/src/DataStructures/DataPortGroups/IDataInGroup.cs
@@ -0,0 +1,6 @@
+namespace Nocturnis.DataStructures.DataPortGroups;
+
+public interface IDataInGroup : IDataPortGroup, IEnumerable
+{
+
+}
\ No newline at end of file
diff --git a/src/DataStructures/DataPortGroups/IDataOutGroup.cs b/src/DataStructures/DataPortGroups/IDataOutGroup.cs
new file mode 100644
index 0000000..e1c2999
--- /dev/null
+++ b/src/DataStructures/DataPortGroups/IDataOutGroup.cs
@@ -0,0 +1,8 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.DataStructures.DataPortGroups;
+
+public interface IDataOutGroup : IDataPortGroup, IEnumerable
+{
+
+}
diff --git a/src/DataStructures/IDataPortGroup.cs b/src/DataStructures/DataPortGroups/IDataPortGroup.cs
similarity index 56%
rename from src/DataStructures/IDataPortGroup.cs
rename to src/DataStructures/DataPortGroups/IDataPortGroup.cs
index fc18de2..9ec6730 100644
--- a/src/DataStructures/IDataPortGroup.cs
+++ b/src/DataStructures/DataPortGroups/IDataPortGroup.cs
@@ -1,9 +1,8 @@
using Godot;
-using Nocturnis.Enigmos.Ports;
-namespace Nocturnis.DataStructures;
+namespace Nocturnis.DataStructures.DataPortGroups;
-public interface IDataPortGroup : IEnumerable
+public interface IDataPortGroup
{
StringName SelectedType { get; set; }
StringName[] TypeOptions { get; set; }
diff --git a/src/DataStructures/IData.cs b/src/DataStructures/IData.cs
new file mode 100644
index 0000000..365eeae
--- /dev/null
+++ b/src/DataStructures/IData.cs
@@ -0,0 +1,25 @@
+using Godot;
+using System.Numerics;
+using Skeleton.Algebra;
+using Skeleton.Algebra.DimensionProviders;
+
+namespace Nocturnis.DataStructures;
+using R2 = CategoryOf.OnField.FVector;
+using C2 = CategoryOf.OnField.FVector;
+
+public interface IData
+{
+ public void Assign(IData oth);
+ public void Assign(object v, StringName t);
+ object? Data { get; set; }
+ StringName? Type { get; set; }
+ int Int { get; set; }
+ double Double { get; set; }
+ Complex Complex { get; set; }
+ IData[] Array { get; set; }
+ R2 R2 { get; set; }
+ C2 C2 { get; set; }
+ bool Bit { get; set; }
+ StringName String { get; set; }
+ IStruct Struct { get; set; }
+}
diff --git a/src/DataStructures/IDataPackage.cs b/src/DataStructures/IDataPackage.cs
deleted file mode 100644
index d9809b0..0000000
--- a/src/DataStructures/IDataPackage.cs
+++ /dev/null
@@ -1,17 +0,0 @@
-using System.Numerics;
-using Godot;
-using Skeleton.Algebra;
-using Skeleton.Algebra.DimensionProviders;
-
-namespace Nocturnis.DataStructures;
-using R2 = CategoryOf.OnField.FVector;
-using C2 = CategoryOf.OnField.FVector;
-public interface IDataPackage
-{
- void Assign(IDataPackage val, StringName key);
- bool Bit { get; set; }
- double Real { get; set; }
- Complex Complex { get; set; }
- R2 R2 { get; set; }
- C2 C2 { get; set; }
-}
\ No newline at end of file
diff --git a/src/DataStructures/IStruct.cs b/src/DataStructures/IStruct.cs
new file mode 100644
index 0000000..067b8e2
--- /dev/null
+++ b/src/DataStructures/IStruct.cs
@@ -0,0 +1,9 @@
+using Godot;
+
+namespace Nocturnis.DataStructures;
+
+public interface IStruct : IData
+{
+ StringName TypeName { get; set; }
+ Dictionary Properties { get; set; }
+}
diff --git a/src/Enigmos/Boards/IBaseBoard.cs b/src/Enigmos/Boards/IBaseBoard.cs
index d7f466c..21df7a6 100644
--- a/src/Enigmos/Boards/IBaseBoard.cs
+++ b/src/Enigmos/Boards/IBaseBoard.cs
@@ -1,5 +1,4 @@
using Nocturnis.Enigmos.Cables;
-using Nocturnis.Enigmos.Modules;
using Nocturnis.Enigmos.Ports;
using Nocturnis.UIElements.Layers;
@@ -13,6 +12,7 @@ public interface IBaseBoard
HashSet FocusedCables { get; set; }
bool ManualOpened { get; set; }
bool CableVisualMode { get; set; }
- IModuleManualLayer ModuleManualLayer { get; set; }
- IModuleMovingLayer ModuleMovingLayer { get; set; }
+ IModuleManualLayer? ModuleManualLayer { get; set; }
+ IModuleMovingLayer? ModuleMovingLayer { get; set; }
+ void Reset();
}
\ No newline at end of file
diff --git a/src/Enigmos/Cables/IBaseCable.cs b/src/Enigmos/Cables/IBaseCable.cs
index 6613008..47d2a33 100644
--- a/src/Enigmos/Cables/IBaseCable.cs
+++ b/src/Enigmos/Cables/IBaseCable.cs
@@ -1,4 +1,5 @@
using Godot;
+using Nocturnis.Enigmos.Ports;
namespace Nocturnis.Enigmos.Cables;
@@ -8,4 +9,6 @@ public interface IBaseCable
void LineUpdate();
Color Modulate { get; set; }
Node AsNode { get; }
+ IBasePort PortFrom { get; set; }
+ IBasePort PortTo { get; set; }
}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/EBinaryComputationalModule.cs b/src/Enigmos/Modules/ComputationalModules/EBinaryComputationalModule.cs
new file mode 100644
index 0000000..19b39d9
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/EBinaryComputationalModule.cs
@@ -0,0 +1,17 @@
+using Nocturnis.DataStructures;
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+using Skeleton.DataStructure;
+
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public static class EBinaryComputationalModule
+{
+ public static IData X(this IBinaryComputationalModule p, CacheItem x) => p.DataInPorts[0].GetData.GetFrom(x)!;
+ public static IData Y(this IBinaryComputationalModule p, CacheItem x) => p.DataInPorts[1].GetData.GetFrom(x)!;
+
+ public static void BinaryInit(this IBinaryComputationalModule p)
+ {
+ p.DataInPorts = new IDataInPort[2];
+ p.DataInInit("Input", 2);
+ }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/EComputationalModule.cs b/src/Enigmos/Modules/ComputationalModules/EComputationalModule.cs
new file mode 100644
index 0000000..dca47c3
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/EComputationalModule.cs
@@ -0,0 +1,13 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public static class EComputationalModule
+{
+ public static void DataOutInit(this IComputationalModule a, string prefix, int dI)
+ {
+ a.DataOutPorts = new IDataOutPort[dI];
+ for (int i = 1; i <= dI; i++)
+ a.DataOutPorts[i - 1] = a.GetPort($"{prefix}{i}");
+ }
+}
diff --git a/src/Enigmos/Modules/ComputationalModules/EDuplicateOutputModule.cs b/src/Enigmos/Modules/ComputationalModules/EDuplicateOutputModule.cs
new file mode 100644
index 0000000..b6c5ddc
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/EDuplicateOutputModule.cs
@@ -0,0 +1,20 @@
+using Godot;
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+using Skeleton.DataStructure;
+
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public static class EDuplicateOutputModule
+{
+ public static void Define(this IDuplicateOutputModule m, Func define)
+ {
+ foreach (IDataOutPort op in m.DataOutPorts)
+ op.OutData.UpdateCalculation(define);
+ }
+
+ public static void SetOutputType(this IDuplicateOutputModule m, StringName type)
+ {
+ foreach (IDataOutPort op in m.DataOutPorts)
+ op.SetDataType(type);
+ }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/ELogicModule.cs b/src/Enigmos/Modules/ComputationalModules/ELogicModule.cs
new file mode 100644
index 0000000..24dc95c
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/ELogicModule.cs
@@ -0,0 +1,15 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+using Nocturnis.GlobalManagement.Constants;
+
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public static class ELogicModule
+{
+ public static void LogicModuleInit(this ILogicModule lm)
+ {
+ foreach (IDataOutPort op in lm.DataOutPorts)
+ op.SetDataType(EnigmosConstant.DataPortTypes.Bit);
+ foreach (IDataInPort ip in lm.DataInPorts)
+ ip.SetDataType(EnigmosConstant.DataPortTypes.Bit);
+ }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/EOperationModule.cs b/src/Enigmos/Modules/ComputationalModules/EOperationModule.cs
new file mode 100644
index 0000000..5012874
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/EOperationModule.cs
@@ -0,0 +1,13 @@
+using Godot;
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public static class EOperationModule
+{
+ public static void SetInputType(this IOperationModule m, StringName type)
+ {
+ foreach (IDataInPort ip in m.DataInPorts)
+ ip.SetDataType(type);
+ }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/ETernaryComputationalModule.cs b/src/Enigmos/Modules/ComputationalModules/ETernaryComputationalModule.cs
new file mode 100644
index 0000000..ad7b698
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/ETernaryComputationalModule.cs
@@ -0,0 +1,14 @@
+using Nocturnis.DataStructures;
+using Skeleton.DataStructure;
+
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public static class ETernaryComputationalModule
+{
+ public static IData X(this ITernaryComputationalModule m, CacheItem cache) =>
+ m.DataOutPorts[0].OutData.GetFrom(cache)!;
+ public static IData Y(this ITernaryComputationalModule m, CacheItem cache) =>
+ m.DataOutPorts[1].OutData.GetFrom(cache)!;
+ public static IData Z(this ITernaryComputationalModule m, CacheItem cache) =>
+ m.DataOutPorts[2].OutData.GetFrom(cache)!;
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/EUnaryComputationalModule.cs b/src/Enigmos/Modules/ComputationalModules/EUnaryComputationalModule.cs
new file mode 100644
index 0000000..26b41b6
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/EUnaryComputationalModule.cs
@@ -0,0 +1,10 @@
+using Nocturnis.DataStructures;
+using Skeleton.DataStructure;
+
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public static class EUnaryComputationalModule
+{
+ public static IData X(this IUnaryComputationalModule m, CacheItem cache) =>
+ m.DataOutPorts[0].OutData.GetFrom(cache)!;
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/IBinaryComputationalModule.cs b/src/Enigmos/Modules/ComputationalModules/IBinaryComputationalModule.cs
new file mode 100644
index 0000000..92ca53d
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/IBinaryComputationalModule.cs
@@ -0,0 +1,6 @@
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public interface IBinaryComputationalModule : IComputationalModule, IParameterModule
+{
+
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/IComputationalModule.cs b/src/Enigmos/Modules/ComputationalModules/IComputationalModule.cs
new file mode 100644
index 0000000..53773c0
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/IComputationalModule.cs
@@ -0,0 +1,9 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public interface IComputationalModule : IBaseModule
+{
+ IDataOutPort[] DataOutPorts { get; set; }
+ void Define();
+}
diff --git a/src/Enigmos/Modules/ComputationalModules/IDuplicateOutputModule.cs b/src/Enigmos/Modules/ComputationalModules/IDuplicateOutputModule.cs
new file mode 100644
index 0000000..638630c
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/IDuplicateOutputModule.cs
@@ -0,0 +1,6 @@
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public interface IDuplicateOutputModule : IComputationalModule
+{
+
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/IOperationModule.cs b/src/Enigmos/Modules/ComputationalModules/IOperationModule.cs
new file mode 100644
index 0000000..9d45e52
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/IOperationModule.cs
@@ -0,0 +1,6 @@
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public interface IOperationModule : IParameterModule
+{
+
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/ITernaryComputationalModule.cs b/src/Enigmos/Modules/ComputationalModules/ITernaryComputationalModule.cs
new file mode 100644
index 0000000..5861951
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/ITernaryComputationalModule.cs
@@ -0,0 +1,6 @@
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public interface ITernaryComputationalModule: IParameterModule, IComputationalModule
+{
+
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ComputationalModules/IUnaryComputationalModule.cs b/src/Enigmos/Modules/ComputationalModules/IUnaryComputationalModule.cs
new file mode 100644
index 0000000..5cb239e
--- /dev/null
+++ b/src/Enigmos/Modules/ComputationalModules/IUnaryComputationalModule.cs
@@ -0,0 +1,6 @@
+namespace Nocturnis.Enigmos.Modules.ComputationalModules;
+
+public interface IUnaryComputationalModule: IComputationalModule, IOperationModule
+{
+
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/EBaseModule.cs b/src/Enigmos/Modules/EBaseModule.cs
new file mode 100644
index 0000000..edffce2
--- /dev/null
+++ b/src/Enigmos/Modules/EBaseModule.cs
@@ -0,0 +1,19 @@
+using Godot;
+using Nocturnis.Enigmos.Ports;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public static class EBaseModule
+{
+ public static TPort GetPort(this IBaseModule m, NodePath path)
+ where TPort : IBasePort
+ {
+ if (m.GetNode(path) is TPort port)
+ {
+ port.Init();
+ return port;
+ }
+
+ throw new Exception("NOT A PORT");
+ }
+}
diff --git a/src/Enigmos/Modules/ECommunicateModule.cs b/src/Enigmos/Modules/ECommunicateModule.cs
new file mode 100644
index 0000000..0b0568b
--- /dev/null
+++ b/src/Enigmos/Modules/ECommunicateModule.cs
@@ -0,0 +1,62 @@
+using Nocturnis.Communicators;
+using Nocturnis.GlobalManagement.Constants;
+using Nocturnis.GlobalManagement.Controls;
+using Nocturnis.GlobalManagement.Providers;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public static class ECommunicateModule
+{
+ public static bool Paired(this ICommunicateModule module) => module.PairedCommunicator != null;
+
+ ///
+ /// Determine if the module can be paired with given communicator
+ ///
+ public static bool IsMatch(this ICommunicateModule module, IBaseCommunicator communicator) =>
+ module.CommunicationDataType == communicator.CommunicationDataType &&
+ GlobalProvider.EnigmosProvider!.CommunicationDirectionCompatible(
+ module.CommunicationDirection,
+ communicator.CommunicationDirection
+ );
+ ///
+ /// Pair the module with given communicator
+ ///
+ public static void Pair(this ICommunicateModule module, IBaseCommunicator communicator)
+ {
+ if(module.Paired())
+ module.Unpair();
+ module.PairedCommunicator = communicator;
+ communicator.PairedModule = module;
+ }
+
+ ///
+ /// Unpair the module with its paired communicator
+ ///
+ public static void Unpair(this ICommunicateModule module)
+ {
+ if (!module.Paired())
+ return;
+ module.PairedCommunicator!.PairedModule = null;
+ module.PairedCommunicator = null;
+ }
+
+ public static void SendData(this ICommunicateModule module)
+ {
+ if (!module.Paired() || module.CommunicationDirection == EnigmosConstant.CommunicationDirections.Receive)
+ return;
+ module.PairedCommunicator!.DataBuffer.Assign(module.DataBuffer, module.CommunicationDataType);
+ }
+
+
+ public static void ReceiveData(this ICommunicateModule module)
+ {
+ if (!module.Paired() || module.CommunicationDirection == EnigmosConstant.CommunicationDirections.Send)
+ return;
+ module.DataBuffer.Assign(module.PairedCommunicator!.DataBuffer, module.CommunicationDataType);
+ }
+
+ public static IBaseCommunicator[] CompatibleCommunicators(this ICommunicateModule module) =>
+ CreatureControl.Instance.CurrentCharacter!.DashboardTab.AllCommunicators
+ .Where(module.IsMatch)
+ .ToArray();
+}
diff --git a/src/Enigmos/Modules/EControllingModule.cs b/src/Enigmos/Modules/EControllingModule.cs
new file mode 100644
index 0000000..eb8f1fe
--- /dev/null
+++ b/src/Enigmos/Modules/EControllingModule.cs
@@ -0,0 +1,13 @@
+using Nocturnis.Enigmos.Ports.SignalPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public static class EControllingModule
+{
+ public static void SignalInInit(this IControllingModule m, string prefix, int sI)
+ {
+ m.SignalInPorts = new ISignalInPort[sI];
+ for (int i = 1; i <= sI; i++)
+ m.SignalInPorts[i - 1] = m.GetPort($"{prefix}{i}");
+ }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/EParameterModule.cs b/src/Enigmos/Modules/EParameterModule.cs
new file mode 100644
index 0000000..2d63cd4
--- /dev/null
+++ b/src/Enigmos/Modules/EParameterModule.cs
@@ -0,0 +1,13 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public static class EParameterModule
+{
+ public static void DataInInit(this IParameterModule m, string prefix, int dI)
+ {
+ m.DataInPorts = new IDataInPort[dI];
+ for (int i = 1; i <= dI; i++)
+ m.DataInPorts[i - 1] = m.GetPort($"{prefix}{i}");
+ }
+}
diff --git a/src/Enigmos/Modules/ERoutingModule.cs b/src/Enigmos/Modules/ERoutingModule.cs
new file mode 100644
index 0000000..f128a04
--- /dev/null
+++ b/src/Enigmos/Modules/ERoutingModule.cs
@@ -0,0 +1,13 @@
+using Nocturnis.Enigmos.Ports.SignalPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public static class ERoutingModule
+{
+ public static void SignalOutInit(this IRoutingModule m, string prefix, int sO)
+ {
+ m.SignalOutPorts = new ISignalOutPort[sO];
+ for (int i = 1; i <= sO; i++)
+ m.SignalOutPorts[i - 1] = m.GetPort($"{prefix}{i}");
+ }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ESourceModule.cs b/src/Enigmos/Modules/ESourceModule.cs
new file mode 100644
index 0000000..61e9538
--- /dev/null
+++ b/src/Enigmos/Modules/ESourceModule.cs
@@ -0,0 +1,12 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public static class ESourceModule
+{
+ public static void Reset(this ISourceModule m)
+ {
+ foreach (IDataOutPort port in m.DataOutPorts)
+ port.OutData.Expire();
+ }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ETerminalModule.cs b/src/Enigmos/Modules/ETerminalModule.cs
new file mode 100644
index 0000000..34c7cfc
--- /dev/null
+++ b/src/Enigmos/Modules/ETerminalModule.cs
@@ -0,0 +1,14 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public static class ETerminalModule
+{
+ public static void Consume(this ITerminalModule m)
+ {
+ foreach (IDataInPort ip in m.DataInPorts)
+ if(ip.GetData.Expired)
+ _ = ip.GetData.Get;
+
+ }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/IActionModule.cs b/src/Enigmos/Modules/IActionModule.cs
new file mode 100644
index 0000000..1e3f1d9
--- /dev/null
+++ b/src/Enigmos/Modules/IActionModule.cs
@@ -0,0 +1,6 @@
+namespace Nocturnis.Enigmos.Modules;
+
+public interface IActionModule : IControllingModule
+{
+ void Act();
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/IBaseModule.cs b/src/Enigmos/Modules/IBaseModule.cs
index c0428f6..41fceab 100644
--- a/src/Enigmos/Modules/IBaseModule.cs
+++ b/src/Enigmos/Modules/IBaseModule.cs
@@ -8,16 +8,19 @@ namespace Nocturnis.Enigmos.Modules;
public interface IBaseModule
{
IEnumerable Ports { get; }
- IBaseBoard Board { get; set; }
+ IBaseBoard? Board { get; set; }
Vector2 PositionToBoard { get; }
Vector2 Size { get; set; }
double MaintenanceAlpha { get; }
double MaintenanceBeta { get; }
string GetDescription { get; }
- ISimpleLabel Label { get; }
+ ISimpleLabel? Label { get; }
Node AsNode { get; }
Vector2 Position { get; set; }
string LabelString { get; set; }
void UpdateCables();
-
-}
\ No newline at end of file
+ //T GetPort(NodePath path);
+ Node GetNode(NodePath path);
+ void Init();
+
+}
diff --git a/src/Enigmos/Modules/ICommunicateModule.cs b/src/Enigmos/Modules/ICommunicateModule.cs
index d6ff8bf..086233d 100644
--- a/src/Enigmos/Modules/ICommunicateModule.cs
+++ b/src/Enigmos/Modules/ICommunicateModule.cs
@@ -4,10 +4,10 @@ using Nocturnis.DataStructures;
namespace Nocturnis.Enigmos.Modules;
-public interface ICommunicateModule
+public interface ICommunicateModule : IBaseModule
{
- IBaseCommunicator PairedCommunicator { get; set; }
+ IBaseCommunicator? PairedCommunicator { get; set; }
StringName CommunicationDataType { get; }
StringName CommunicationDirection { get; }
- IDataPackage DataBuffer { get; set; }
+ IData DataBuffer { get; set; }
}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/IComputationalCompositeModule.cs b/src/Enigmos/Modules/IComputationalCompositeModule.cs
index 5fedf94..0cc4be7 100644
--- a/src/Enigmos/Modules/IComputationalCompositeModule.cs
+++ b/src/Enigmos/Modules/IComputationalCompositeModule.cs
@@ -4,6 +4,5 @@ namespace Nocturnis.Enigmos.Modules;
public interface IComputationalCompositeModule : ICompositeModule
{
- void Compute(IRootModule root);
Vector2 PositionToBoard { get; }
}
diff --git a/src/Enigmos/Modules/IControllingModule.cs b/src/Enigmos/Modules/IControllingModule.cs
index dd3cc51..3e41471 100644
--- a/src/Enigmos/Modules/IControllingModule.cs
+++ b/src/Enigmos/Modules/IControllingModule.cs
@@ -1,6 +1,10 @@
+using Nocturnis.Enigmos.Ports.SignalPorts.Directions;
+
namespace Nocturnis.Enigmos.Modules;
public interface IControllingModule : IBaseModule
{
- void RouteWithTimeoutHandle(IRootModule root);
-}
\ No newline at end of file
+ ISignalInPort[] SignalInPorts { get; set; }
+ void Execute();
+ bool Visited { get; set; }
+}
diff --git a/src/Enigmos/Modules/IFilterModule.cs b/src/Enigmos/Modules/IFilterModule.cs
index 20e405d..897c562 100644
--- a/src/Enigmos/Modules/IFilterModule.cs
+++ b/src/Enigmos/Modules/IFilterModule.cs
@@ -1,6 +1,10 @@
+using Nocturnis.DataStructures;
+
namespace Nocturnis.Enigmos.Modules;
public interface IFilterModule : IProgrammableModule
{
- void FilterWithTimeoutHandle(IRootModule root);
-}
\ No newline at end of file
+ void Filter();
+ IData[] CachedResult { get; set; }
+
+}
diff --git a/src/Enigmos/Modules/IInterlayerDataInModule.cs b/src/Enigmos/Modules/IInterlayerDataInModule.cs
deleted file mode 100644
index 002566e..0000000
--- a/src/Enigmos/Modules/IInterlayerDataInModule.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using Nocturnis.Enigmos.Ports;
-
-namespace Nocturnis.Enigmos.Modules;
-
-public interface IInterlayerDataInModule : IInterlayerModule
-{
- IInterlayerDataOutModule? DualModule { get; set; }
- IDataInPort? DataIn { get; set; }
-}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/IInterlayerDataOutModule.cs b/src/Enigmos/Modules/IInterlayerDataOutModule.cs
deleted file mode 100644
index 5a9a290..0000000
--- a/src/Enigmos/Modules/IInterlayerDataOutModule.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using Nocturnis.Enigmos.Ports;
-
-namespace Nocturnis.Enigmos.Modules;
-
-public interface IInterlayerDataOutModule : IInterlayerModule
-{
- IInterlayerDataInModule? DualModule { get; set; }
- IDataOutPort? DataOut { get; set; }
-}
diff --git a/src/Enigmos/Modules/IInterlayerSignalInModule.cs b/src/Enigmos/Modules/IInterlayerSignalInModule.cs
deleted file mode 100644
index ff5c938..0000000
--- a/src/Enigmos/Modules/IInterlayerSignalInModule.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using Nocturnis.Enigmos.Ports;
-
-namespace Nocturnis.Enigmos.Modules;
-
-public interface IInterlayerSignalInModule : IInterlayerModule
-{
- IInterlayerSignalOutModule? DualModule { get; set; }
- ISignalInPort? SignalIn { get; set; }
-}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/IInterlayerSignalOutModule.cs b/src/Enigmos/Modules/IInterlayerSignalOutModule.cs
deleted file mode 100644
index 8ec7f84..0000000
--- a/src/Enigmos/Modules/IInterlayerSignalOutModule.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using Nocturnis.Enigmos.Ports;
-
-namespace Nocturnis.Enigmos.Modules;
-
-public interface IInterlayerSignalOutModule : IInterlayerModule
-{
- IInterlayerSignalInModule? DualModule { get; set; }
- ISignalOutPort? SignalOut { get; set; }
-}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ILogicModule.cs b/src/Enigmos/Modules/ILogicModule.cs
new file mode 100644
index 0000000..f0f3520
--- /dev/null
+++ b/src/Enigmos/Modules/ILogicModule.cs
@@ -0,0 +1,8 @@
+using Nocturnis.Enigmos.Modules.ComputationalModules;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public interface ILogicModule : IComputationalModule, IParameterModule
+{
+
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/IOptimizationModule.cs b/src/Enigmos/Modules/IOptimizationModule.cs
index 8cb3a04..4393e45 100644
--- a/src/Enigmos/Modules/IOptimizationModule.cs
+++ b/src/Enigmos/Modules/IOptimizationModule.cs
@@ -1,6 +1,10 @@
+using Nocturnis.DataStructures;
+
namespace Nocturnis.Enigmos.Modules;
public interface IOptimizationModule : IProgrammableModule
{
- void OptimizeWithTimeoutHandle(IRootModule root);
-}
\ No newline at end of file
+ IData CachedResult { get; set; }
+ bool Calculated { get; set; }
+ void Optimize();
+}
diff --git a/src/Enigmos/Modules/IParameterModule.cs b/src/Enigmos/Modules/IParameterModule.cs
new file mode 100644
index 0000000..3d316cd
--- /dev/null
+++ b/src/Enigmos/Modules/IParameterModule.cs
@@ -0,0 +1,8 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public interface IParameterModule : IBaseModule
+{
+ IDataInPort[] DataInPorts { get; set; }
+}
diff --git a/src/Enigmos/Modules/IParameterizedModule.cs b/src/Enigmos/Modules/IParameterizedModule.cs
index cefdf6f..b0282d8 100644
--- a/src/Enigmos/Modules/IParameterizedModule.cs
+++ b/src/Enigmos/Modules/IParameterizedModule.cs
@@ -1,4 +1,3 @@
-using Nocturnis.DataStructures;
using Nocturnis.DataStructures.ConfigurableParameters;
namespace Nocturnis.Enigmos.Modules;
diff --git a/src/Enigmos/Modules/IPolymorphismModule.cs b/src/Enigmos/Modules/IPolymorphismModule.cs
index 26137b1..ace76a4 100644
--- a/src/Enigmos/Modules/IPolymorphismModule.cs
+++ b/src/Enigmos/Modules/IPolymorphismModule.cs
@@ -1,4 +1,4 @@
-using Nocturnis.DataStructures;
+using Nocturnis.DataStructures.DataPortGroups;
namespace Nocturnis.Enigmos.Modules;
diff --git a/src/Enigmos/Modules/IProgrammableModule.cs b/src/Enigmos/Modules/IProgrammableModule.cs
index f2d4055..1a026e5 100644
--- a/src/Enigmos/Modules/IProgrammableModule.cs
+++ b/src/Enigmos/Modules/IProgrammableModule.cs
@@ -1,5 +1,3 @@
-using Godot;
-
namespace Nocturnis.Enigmos.Modules;
public interface IProgrammableModule : IBaseModule
diff --git a/src/Enigmos/Modules/IRootModule.cs b/src/Enigmos/Modules/IRootModule.cs
index b50483e..b7cb6a2 100644
--- a/src/Enigmos/Modules/IRootModule.cs
+++ b/src/Enigmos/Modules/IRootModule.cs
@@ -3,10 +3,11 @@ using Nocturnis.Creatures;
namespace Nocturnis.Enigmos.Modules;
-public interface IRootModule : IControllingModule
+public interface IRootModule : IRoutingModule
{
Stopwatch? Timer { get; set; }
bool ActionFinished { get; set; }
- IBaseCreature ManagedBy { get; set; }
+ IBaseCreature? ManagedBy { get; set; }
+ void Start();
}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/IRoutingModule.cs b/src/Enigmos/Modules/IRoutingModule.cs
new file mode 100644
index 0000000..0e7b413
--- /dev/null
+++ b/src/Enigmos/Modules/IRoutingModule.cs
@@ -0,0 +1,9 @@
+using Nocturnis.Enigmos.Ports.SignalPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public interface IRoutingModule : IBaseModule
+{
+ ISignalOutPort[] SignalOutPorts { get; set; }
+
+}
diff --git a/src/Enigmos/Modules/ISourceModule.cs b/src/Enigmos/Modules/ISourceModule.cs
new file mode 100644
index 0000000..9599b9d
--- /dev/null
+++ b/src/Enigmos/Modules/ISourceModule.cs
@@ -0,0 +1,8 @@
+using Nocturnis.Enigmos.Modules.ComputationalModules;
+
+namespace Nocturnis.Enigmos.Modules;
+
+public interface ISourceModule : IComputationalModule
+{
+
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/ITerminalModule.cs b/src/Enigmos/Modules/ITerminalModule.cs
new file mode 100644
index 0000000..57d59d7
--- /dev/null
+++ b/src/Enigmos/Modules/ITerminalModule.cs
@@ -0,0 +1,7 @@
+namespace Nocturnis.Enigmos.Modules;
+
+public interface ITerminalModule : IParameterModule
+{
+ void Drain();
+}
+
diff --git a/src/Enigmos/Modules/InterlayerModules/IInterlayerDataInModule.cs b/src/Enigmos/Modules/InterlayerModules/IInterlayerDataInModule.cs
new file mode 100644
index 0000000..225f1a0
--- /dev/null
+++ b/src/Enigmos/Modules/InterlayerModules/IInterlayerDataInModule.cs
@@ -0,0 +1,11 @@
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules.InterlayerModules;
+
+public interface IInterlayerDataInModule : IInterlayerModule, IParameterModule
+{
+ new IInterlayerDataOutModule? DualModule { get; set; }
+ IDataInPort? DataIn { get; set; }
+
+}
+
diff --git a/src/Enigmos/Modules/InterlayerModules/IInterlayerDataOutModule.cs b/src/Enigmos/Modules/InterlayerModules/IInterlayerDataOutModule.cs
new file mode 100644
index 0000000..91b97f3
--- /dev/null
+++ b/src/Enigmos/Modules/InterlayerModules/IInterlayerDataOutModule.cs
@@ -0,0 +1,11 @@
+using Nocturnis.Enigmos.Modules.ComputationalModules;
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules.InterlayerModules;
+
+public interface IInterlayerDataOutModule : IInterlayerModule, IComputationalModule
+{
+ new IInterlayerDataInModule? DualModule { get; set; }
+ IDataOutPort? DataOut { get; set; }
+
+}
diff --git a/src/Enigmos/Modules/IInterlayerModule.cs b/src/Enigmos/Modules/InterlayerModules/IInterlayerModule.cs
similarity index 73%
rename from src/Enigmos/Modules/IInterlayerModule.cs
rename to src/Enigmos/Modules/InterlayerModules/IInterlayerModule.cs
index 34db93a..a91bdf1 100644
--- a/src/Enigmos/Modules/IInterlayerModule.cs
+++ b/src/Enigmos/Modules/InterlayerModules/IInterlayerModule.cs
@@ -1,10 +1,11 @@
using Nocturnis.Enigmos.Ports;
-namespace Nocturnis.Enigmos.Modules;
+namespace Nocturnis.Enigmos.Modules.InterlayerModules;
public interface IInterlayerModule
{
IBasePort? UnderlyingPort { get; }
IProgrammableModule? ParentModule { get; set; }
-
+
}
+
diff --git a/src/Enigmos/Modules/InterlayerModules/IInterlayerSignalInModule.cs b/src/Enigmos/Modules/InterlayerModules/IInterlayerSignalInModule.cs
new file mode 100644
index 0000000..1350010
--- /dev/null
+++ b/src/Enigmos/Modules/InterlayerModules/IInterlayerSignalInModule.cs
@@ -0,0 +1,9 @@
+using Nocturnis.Enigmos.Ports.SignalPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules.InterlayerModules;
+
+public interface IInterlayerSignalInModule : IInterlayerModule, IControllingModule
+{
+ new IInterlayerSignalOutModule? DualModule { get; set; }
+ ISignalInPort? SignalIn { get; set; }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Modules/InterlayerModules/IInterlayerSignalOutModule.cs b/src/Enigmos/Modules/InterlayerModules/IInterlayerSignalOutModule.cs
new file mode 100644
index 0000000..0a447b0
--- /dev/null
+++ b/src/Enigmos/Modules/InterlayerModules/IInterlayerSignalOutModule.cs
@@ -0,0 +1,9 @@
+using Nocturnis.Enigmos.Ports.SignalPorts.Directions;
+
+namespace Nocturnis.Enigmos.Modules.InterlayerModules;
+
+public interface IInterlayerSignalOutModule : IInterlayerModule, IRoutingModule
+{
+ new IInterlayerSignalInModule? DualModule { get; set; }
+ ISignalOutPort? SignalOut { get; set; }
+}
\ No newline at end of file
diff --git a/src/Enigmos/Ports/DataPorts/Directions/IDataInPort.cs b/src/Enigmos/Ports/DataPorts/Directions/IDataInPort.cs
new file mode 100644
index 0000000..68fc5ea
--- /dev/null
+++ b/src/Enigmos/Ports/DataPorts/Directions/IDataInPort.cs
@@ -0,0 +1,10 @@
+using Nocturnis.DataStructures;
+using Skeleton.DataStructure;
+
+namespace Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+public interface IDataInPort : IDataPort
+{
+ DataCache GetData { get; }
+ new IDataOutPort? ConnectedPort { get; set; }
+}
diff --git a/src/Enigmos/Ports/DataPorts/Directions/IDataOutPort.cs b/src/Enigmos/Ports/DataPorts/Directions/IDataOutPort.cs
new file mode 100644
index 0000000..a7aa145
--- /dev/null
+++ b/src/Enigmos/Ports/DataPorts/Directions/IDataOutPort.cs
@@ -0,0 +1,13 @@
+using Nocturnis.DataStructures;
+using Nocturnis.Enigmos.Modules;
+using Nocturnis.Enigmos.Modules.ComputationalModules;
+using Skeleton.DataStructure;
+
+namespace Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+public interface IDataOutPort : IDataPort
+{
+ new IDataInPort? ConnectedPort { get; set; }
+ new IComputationalModule Module { get; set; }
+ DataCache OutData { get; set; }
+}
diff --git a/src/Enigmos/Ports/DataPorts/EDataPort.cs b/src/Enigmos/Ports/DataPorts/EDataPort.cs
new file mode 100644
index 0000000..fb15f58
--- /dev/null
+++ b/src/Enigmos/Ports/DataPorts/EDataPort.cs
@@ -0,0 +1,6 @@
+namespace Nocturnis.Enigmos.Ports.DataPorts;
+
+public class EDataPort
+{
+
+}
\ No newline at end of file
diff --git a/src/Enigmos/Ports/DataPorts/IDataPort.cs b/src/Enigmos/Ports/DataPorts/IDataPort.cs
new file mode 100644
index 0000000..45831c0
--- /dev/null
+++ b/src/Enigmos/Ports/DataPorts/IDataPort.cs
@@ -0,0 +1,10 @@
+using Godot;
+
+namespace Nocturnis.Enigmos.Ports.DataPorts;
+
+public interface IDataPort : IBasePort
+{
+ new IDataPort? ConnectedPort { get; set; }
+ StringName? DataType { get; set; }
+ void SetDataType(StringName type);
+}
diff --git a/src/Enigmos/Ports/EBasePort.cs b/src/Enigmos/Ports/EBasePort.cs
new file mode 100644
index 0000000..d6e989d
--- /dev/null
+++ b/src/Enigmos/Ports/EBasePort.cs
@@ -0,0 +1,67 @@
+using Godot;
+using Nocturnis.Enigmos.Cables;
+using Nocturnis.Inventories.Items.Items;
+using VirtualChemistry.Chemistry.Mixtures.Implements;
+
+namespace Nocturnis.Enigmos.Ports;
+
+public static class EBasePort
+{
+ public static void FixWith(this IBasePort p, IBaseChemicalItem c)
+ {
+ if (c.ContentMaterial.Amount == 0)
+ return;
+ HeterogeneousMixture material = c.ContentMaterial;
+ double s = 1; //material.LayerOrder.Last.Value.CayleyValue();
+ double u = 1;//material.LayerOrder.Last.Value.EuclidValue();
+ double usedAmount = Math.Min(1d, material.LayerOrder.Last.Value.Amount);
+ double dCond = usedAmount * (p.Module!.MaintenanceAlpha * s - p.Module.MaintenanceBeta * u);
+ double dQuality = usedAmount * (Math.Pow(p.Module.MaintenanceBeta, 2) * s - p.Module.MaintenanceAlpha * u);
+ c.ConsumeFromBottom(usedAmount);
+ p.Condition = Mathf.FloorToInt(Math.Max(0, Math.Min(100, p.Condition + dCond)));
+ p.Quality = Mathf.FloorToInt(Math.Max(0, Math.Min(20000, p.Quality + dQuality)));
+ }
+ public static void Connect(this IBasePort p)
+ {
+ if(p.Connected)
+ p.Disconnect();
+ if (p.Module!.Board!.ConnectPending == null)
+ {
+ p.SetStatusPending();
+ p.Module.Board.ConnectPending = p;
+ return;
+ }
+
+ if (p.Module.Board.ConnectPending.IsMatch(p))
+ {
+ p.ConnectedPort = p.Module.Board.ConnectPending;
+ p.Module.Board.ConnectPending.ConnectedPort = p;
+ IBaseCable cable = p.MakeCable(p.Module.Board.ConnectPending);
+ p.Module.Board.CablePairing[p] = cable;
+ p.Module.Board.CablePairing[p.Module.Board.ConnectPending] = cable;
+ p.Module.Board.AddCable(cable);
+ cable.LineUpdate();
+ p.SetStatusConnected();
+ p.Module.Board.ConnectPending.SetStatusConnected();
+ p.Module.Board.ConnectPending = null;
+ return;
+ }
+ p.Module.Board.ConnectPending.SetStatusNormal();
+ p.Module.Board.ConnectPending = null;
+ }
+ public static void Disconnect(this IBasePort p)
+ {
+ if (!p.Connected)
+ return;
+ IBaseCable cable = p.Module!.Board!.CablePairing[p];
+ p.Module.Board.CablePairing.Remove(p.ConnectedPort!);
+ p.Module.Board.FocusedCables.Remove(p.Module.Board.CablePairing[p]);
+ p.Module.Board.CablePairing.Remove(p);
+
+ cable.Free();
+ p.ConnectedPort!.SetStatusNormal();
+ p.ConnectedPort.ConnectedPort = null;
+ p.SetStatusNormal();
+ p.ConnectedPort = null;
+ }
+}
diff --git a/src/Enigmos/Ports/IBasePort.cs b/src/Enigmos/Ports/IBasePort.cs
index 768e833..14f082f 100644
--- a/src/Enigmos/Ports/IBasePort.cs
+++ b/src/Enigmos/Ports/IBasePort.cs
@@ -1,13 +1,13 @@
using Godot;
+using Nocturnis.Enigmos.Cables;
using Nocturnis.Enigmos.Modules;
-using Nocturnis.Inventories.Items.Items;
namespace Nocturnis.Enigmos.Ports;
public interface IBasePort
{
bool Connected { get; }
- IBaseModule Module { get; set; }
+ IBaseModule? Module { get; set; }
bool IsMatch(IBasePort oth);
IBasePort? ConnectedPort { get; set; }
void SetStatusConnected();
@@ -16,5 +16,7 @@ public interface IBasePort
StringName Name { get; set; }
int Condition { get; set; }
int Quality { get; set; }
- void FixWith(IBaseChemicalItem item);
-}
\ No newline at end of file
+ //void FixWith(IBaseChemicalItem item);
+ void Init();
+ IBaseCable MakeCable(IBasePort port);
+}
diff --git a/src/Enigmos/Ports/IDataInPort.cs b/src/Enigmos/Ports/IDataInPort.cs
deleted file mode 100644
index f866460..0000000
--- a/src/Enigmos/Ports/IDataInPort.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using Nocturnis.DataStructures;
-using Nocturnis.Enigmos.Modules;
-
-namespace Nocturnis.Enigmos.Ports;
-
-public interface IDataInPort : IDataPort
-{
- IDataPackage GetData(IRootModule root);
-}
\ No newline at end of file
diff --git a/src/Enigmos/Ports/IDataOutPort.cs b/src/Enigmos/Ports/IDataOutPort.cs
deleted file mode 100644
index bb74e24..0000000
--- a/src/Enigmos/Ports/IDataOutPort.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-using Nocturnis.DataStructures;
-
-namespace Nocturnis.Enigmos.Ports;
-
-public interface IDataOutPort : IDataPort
-{
- IDataPackage ResultData { get; set; }
-}
\ No newline at end of file
diff --git a/src/Enigmos/Ports/IDataPort.cs b/src/Enigmos/Ports/IDataPort.cs
deleted file mode 100644
index 85d5cc2..0000000
--- a/src/Enigmos/Ports/IDataPort.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace Nocturnis.Enigmos.Ports;
-
-public interface IDataPort : IBasePort
-{
-
-}
\ No newline at end of file
diff --git a/src/Enigmos/Ports/ISignalInPort.cs b/src/Enigmos/Ports/SignalPorts/Directions/ISignalInPort.cs
similarity index 69%
rename from src/Enigmos/Ports/ISignalInPort.cs
rename to src/Enigmos/Ports/SignalPorts/Directions/ISignalInPort.cs
index 6847c2b..923e4e7 100644
--- a/src/Enigmos/Ports/ISignalInPort.cs
+++ b/src/Enigmos/Ports/SignalPorts/Directions/ISignalInPort.cs
@@ -1,6 +1,6 @@
using Nocturnis.Enigmos.Modules;
-namespace Nocturnis.Enigmos.Ports;
+namespace Nocturnis.Enigmos.Ports.SignalPorts.Directions;
public interface ISignalInPort : ISignalPort
{
diff --git a/src/Enigmos/Ports/ISignalOutPort.cs b/src/Enigmos/Ports/SignalPorts/Directions/ISignalOutPort.cs
similarity index 52%
rename from src/Enigmos/Ports/ISignalOutPort.cs
rename to src/Enigmos/Ports/SignalPorts/Directions/ISignalOutPort.cs
index e1c61d6..4625d58 100644
--- a/src/Enigmos/Ports/ISignalOutPort.cs
+++ b/src/Enigmos/Ports/SignalPorts/Directions/ISignalOutPort.cs
@@ -1,9 +1,11 @@
using Nocturnis.Enigmos.Modules;
-namespace Nocturnis.Enigmos.Ports;
+namespace Nocturnis.Enigmos.Ports.SignalPorts.Directions;
public interface ISignalOutPort : ISignalPort
{
- new IControllingModule Module { get; set; }
+ new IRoutingModule Module { get; set; }
new ISignalInPort? ConnectedPort { get; set; }
+ void Route();
+
}
\ No newline at end of file
diff --git a/src/Enigmos/Ports/ISignalPort.cs b/src/Enigmos/Ports/SignalPorts/ISignalPort.cs
similarity index 51%
rename from src/Enigmos/Ports/ISignalPort.cs
rename to src/Enigmos/Ports/SignalPorts/ISignalPort.cs
index fb6cf83..cd9405f 100644
--- a/src/Enigmos/Ports/ISignalPort.cs
+++ b/src/Enigmos/Ports/SignalPorts/ISignalPort.cs
@@ -1,4 +1,4 @@
-namespace Nocturnis.Enigmos.Ports;
+namespace Nocturnis.Enigmos.Ports.SignalPorts;
public interface ISignalPort : IBasePort
{
diff --git a/src/GlobalManagement/Constants/EnigmosConstant.cs b/src/GlobalManagement/Constants/EnigmosConstant.cs
new file mode 100644
index 0000000..6b64b87
--- /dev/null
+++ b/src/GlobalManagement/Constants/EnigmosConstant.cs
@@ -0,0 +1,31 @@
+using Godot;
+
+namespace Nocturnis.GlobalManagement.Constants;
+
+public static class EnigmosConstant
+{
+ public static class DataPortTypes
+ {
+ public static readonly StringName Null = "Null";
+ public static readonly StringName Bit = "Bit";
+ public static readonly StringName Real = "Real";
+ public static readonly StringName Complex = "Complex";
+ public static readonly StringName R2 = "R2";
+ public static readonly StringName C2 = "C2";
+ public static readonly StringName RealArray = "RealArray";
+ public static readonly StringName AnyArrayType = "AnyArrayType";
+ public static readonly StringName[] NumericTypes = new[] { Real, Complex };
+ public static readonly StringName[] AnyTensor = new[] { Real, Complex, R2, C2 };
+ public static readonly StringName[] AnyType = new[] { Real, Complex, R2, C2 };
+ public static readonly StringName[] VectorTypes = new[] { R2, C2 };
+ public static readonly StringName[] AnyArray = Array.Empty();
+
+ }
+ public static class CommunicationDirections
+ {
+ public static readonly StringName Send = "Send";
+ public static readonly StringName Receive = "Receive";
+ }
+
+ public const double IdlePower = 0.2d;
+}
\ No newline at end of file
diff --git a/src/GlobalManagement/Controls/CreatureControl.cs b/src/GlobalManagement/Controls/CreatureControl.cs
new file mode 100644
index 0000000..f489ba2
--- /dev/null
+++ b/src/GlobalManagement/Controls/CreatureControl.cs
@@ -0,0 +1,23 @@
+using Nocturnis.Creatures.Characters;
+
+namespace Nocturnis.GlobalManagement.Controls;
+
+public class CreatureControl
+{
+ private static CreatureControl _instance { get; set; }
+ private static object _lock = new();
+ public static CreatureControl Instance
+ {
+ get
+ {
+ lock(_lock) _instance ??= new CreatureControl();
+ return _instance;
+ }
+ }
+
+ private CreatureControl()
+ {
+ }
+
+ public IBaseCharacter? CurrentCharacter { get; set; }
+}
\ No newline at end of file
diff --git a/src/GlobalManagement/Controls/EnigmosControl.cs b/src/GlobalManagement/Controls/EnigmosControl.cs
new file mode 100644
index 0000000..5fd7a24
--- /dev/null
+++ b/src/GlobalManagement/Controls/EnigmosControl.cs
@@ -0,0 +1,33 @@
+using Nocturnis.Enigmos.Modules;
+
+namespace Nocturnis.GlobalManagement.Controls;
+
+public class EnigmosControl
+{
+ private static EnigmosControl _instance { get; set; }
+ private static object _lock = new();
+ public static EnigmosControl Instance
+ {
+ get
+ {
+ lock(_lock) _instance ??= new EnigmosControl();
+ return _instance;
+ }
+ }
+
+ private EnigmosControl()
+ {
+ }
+
+ public IRootModule RootModule { get; set; }
+
+ public void ShutDownEngine()
+ {
+ }
+
+ public void PowerUpEngine()
+ {
+ }
+
+ public double Energy { get; set; } = 0d;
+}
diff --git a/src/GlobalManagement/Controls/ItemDraggingControl.cs b/src/GlobalManagement/Controls/ItemDraggingControl.cs
new file mode 100644
index 0000000..23a2492
--- /dev/null
+++ b/src/GlobalManagement/Controls/ItemDraggingControl.cs
@@ -0,0 +1,32 @@
+using Nocturnis.Inventories.Items;
+using Nocturnis.Inventories.ItemSlots;
+
+namespace Nocturnis.GlobalManagement.Controls;
+
+public sealed class ItemDraggingControl
+{
+ public IBaseItem? DraggingItem => DraggingFrom?.Item;
+
+ public IBaseItemSlot? DraggingFrom = null;
+
+ public bool Dragging => DraggingFrom != null;
+
+ private static ItemDraggingControl? _instance = null;
+
+ private static object _lock = new object();
+
+ public static ItemDraggingControl Instance
+ {
+ get
+ {
+ lock(_lock) _instance ??= new ItemDraggingControl();
+ return _instance;
+ }
+ }
+
+ public void Release()
+ {
+ DraggingFrom = null;
+ }
+
+}
\ No newline at end of file
diff --git a/src/GlobalManagement/Providers/GlobalProvider.cs b/src/GlobalManagement/Providers/GlobalProvider.cs
new file mode 100644
index 0000000..67f4434
--- /dev/null
+++ b/src/GlobalManagement/Providers/GlobalProvider.cs
@@ -0,0 +1,11 @@
+namespace Nocturnis.GlobalManagement.Providers;
+
+public static class GlobalProvider
+{
+ public static IEnigmosProvider? EnigmosProvider { get; set; }
+ public static IDataStructureProvider? DataStructureProvider { get; set; }
+ public static IUIProvider? UIProvider { get; set; }
+ public static ISceneProvider? SceneProvider { get; set; }
+ public static IPolymorphismProvider? PolymorphismProvider { get; set; }
+ public static IDataPackageTypeProvider? DataPackageTypeProvider { get; set; }
+}
diff --git a/src/GlobalManagement/Providers/IDataPackageTypeProvider.cs b/src/GlobalManagement/Providers/IDataPackageTypeProvider.cs
new file mode 100644
index 0000000..bed585d
--- /dev/null
+++ b/src/GlobalManagement/Providers/IDataPackageTypeProvider.cs
@@ -0,0 +1,13 @@
+using Godot;
+
+namespace Nocturnis.GlobalManagement.Providers;
+
+public interface IDataPackageTypeProvider
+{
+ bool IsComplexTensorType(StringName type);
+ StringName ComplexVersionOf(StringName type);
+ StringName BuildType(StringName nType, int i, int j);
+ StringName GetBaseField(StringName type);
+ bool DataPortTypeCompatible(StringName inType, StringName outType);
+ StringName ToElement(StringName arrayType);
+}
diff --git a/src/GlobalManagement/Providers/IDataStructureProvider.cs b/src/GlobalManagement/Providers/IDataStructureProvider.cs
new file mode 100644
index 0000000..0f01791
--- /dev/null
+++ b/src/GlobalManagement/Providers/IDataStructureProvider.cs
@@ -0,0 +1,29 @@
+using Godot;
+using Nocturnis.DataStructures;
+using Nocturnis.DataStructures.ConfigurableParameters;
+using Nocturnis.DataStructures.DataPortGroups;
+using Nocturnis.Enigmos.Modules;
+using Nocturnis.Enigmos.Ports.DataPorts;
+using Nocturnis.Enigmos.Ports.DataPorts.Directions;
+
+namespace Nocturnis.GlobalManagement.Providers;
+
+public interface IDataStructureProvider
+{
+ Variant NewVariantWithType(string type, Variant a);
+ IBoolParameter NewBoolParameter(string d, string t, string f, bool def);
+
+ IDataPortGroup NewDataPortGroup(IBaseModule m, IDataPort[] pts, string desc, StringName defType, StringName[] typeOpts);
+
+ IDataInGroup NewDataInGroup(IBaseModule m, IDataInPort[] pts, string desc, StringName defType, StringName[] typeOpts);
+
+ IDataOutGroup NewDataOutGroup(IBaseModule m, IDataOutPort[] pts, string desc, StringName defType, StringName[] typeOpts);
+
+ IData NewData(object data, StringName type);
+
+ IDoubleParameter NewDoubleParameter(string name, double min, double max, double def);
+ IKeyParameter NewKeyParameter(string a, string b);
+ IData NullData { get; }
+ IData DefaultData { get; }
+ StringName ArrayToElement(StringName arrayType);
+}
\ No newline at end of file
diff --git a/src/GlobalManagement/Providers/IEnigmosProvider.cs b/src/GlobalManagement/Providers/IEnigmosProvider.cs
new file mode 100644
index 0000000..58a14bf
--- /dev/null
+++ b/src/GlobalManagement/Providers/IEnigmosProvider.cs
@@ -0,0 +1,23 @@
+using Godot;
+
+namespace Nocturnis.GlobalManagement.Providers;
+
+public interface IEnigmosProvider
+{
+ Texture2D DataPortStatusNormal { get; set; }
+ Texture2D DataPortStatusPending { get; set; }
+ Texture2D DataPortStatusConnected { get; set; }
+
+ Texture2D SignalPortStatusNormal { get; set; }
+ Texture2D SignalPortStatusPending { get; set; }
+ Texture2D SignalPortStatusConnected { get; set; }
+
+ PackedScene SignalCableScene { get; set; }
+ PackedScene DataCableScene { get; set; }
+ Dictionary DataPortTypeMap { get; set; }
+
+ bool CommunicationDirectionCompatible(StringName moduleDir, StringName communicatorDir);
+
+ string ModuleDescription();
+
+}
\ No newline at end of file
diff --git a/src/GlobalManagement/Providers/IPolymorphismProvider.cs b/src/GlobalManagement/Providers/IPolymorphismProvider.cs
new file mode 100644
index 0000000..83c1ee0
--- /dev/null
+++ b/src/GlobalManagement/Providers/IPolymorphismProvider.cs
@@ -0,0 +1,18 @@
+using Godot;
+using Nocturnis.DataStructures;
+
+namespace Nocturnis.GlobalManagement.Providers;
+
+public interface IPolymorphismProvider
+{
+ (object, StringName) Square(IData a);
+ (object, StringName) Neg(IData a);
+ (object, StringName) Add(IData a, IData b);
+ (object, StringName) Sub(IData a, IData b);
+ (object, StringName) Div(IData a, IData b);
+ (object, StringName) Dot(IData a, IData b);
+ (object, StringName) Mul(IData a, IData b);
+ (object, StringName) Pow(IData a, IData b);
+ (object, StringName) ScalarDiv(IData a, IData b);
+ (object, StringName) ScalarMul(IData a, IData b);
+}
diff --git a/src/GlobalManagement/Providers/ISceneProvider.cs b/src/GlobalManagement/Providers/ISceneProvider.cs
new file mode 100644
index 0000000..2775c80
--- /dev/null
+++ b/src/GlobalManagement/Providers/ISceneProvider.cs
@@ -0,0 +1,10 @@
+using Godot;
+using Nocturnis.Scenes;
+
+namespace Nocturnis.GlobalManagement.Providers;
+
+public interface ISceneProvider
+{
+ IRootScene RootScene { get; set; }
+ PackedScene AssetMapper();
+}
\ No newline at end of file
diff --git a/src/GlobalManagement/Providers/IUIProvider.cs b/src/GlobalManagement/Providers/IUIProvider.cs
new file mode 100644
index 0000000..72facaa
--- /dev/null
+++ b/src/GlobalManagement/Providers/IUIProvider.cs
@@ -0,0 +1,8 @@
+using Godot;
+
+namespace Nocturnis.GlobalManagement.Providers;
+
+public interface IUIProvider
+{
+ bool Overlap(Vector2 a, Vector2 b, Vector2 c, Vector2 d);
+}
\ No newline at end of file