Split project

This commit is contained in:
h z
2024-06-29 06:35:23 +08:00
parent b26404abd2
commit 117835b503
45 changed files with 1972 additions and 26 deletions

107
Ports/BasePort.cs Normal file
View File

@@ -0,0 +1,107 @@
using Enigmos.Cables;
using Godot;
using Nocturnis.Enigmos.Cables;
using Nocturnis.Enigmos.Modules;
using Nocturnis.Enigmos.Ports;
using Nocturnis.Inventories.Items.Items;
using VirtualChemistry.Chemistry.Mixtures.Implements;
namespace Enigmos.Ports;
public abstract partial class BasePort : TextureButton, IBasePort
{
public virtual Vector2 PositionToBoard() => Position + PivotOffset + Module?.PositionToBoard ?? Vector2.Zero;
/// <summary>
/// When Condition is Equal to 0, Port is Disabled
/// </summary>
public int Condition { get; set; }
/// <summary>
/// Each time the port is used, there is 1/Quality chance to damage the Condition
/// </summary>
public int Quality { get; set; }
/// <summary>
/// Increase Condition
/// Modify Quality base on property of material
/// </summary>
public void FixWith(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 * (Module.MaintenanceAlpha * s - Module.MaintenanceBeta * u);
double dQuality = usedAmount * (Math.Pow(Module.MaintenanceBeta, 2) * s - Module.MaintenanceAlpha * u);
c.ConsumeFromBottom(usedAmount);
Condition = Mathf.FloorToInt(Math.Max(0, Math.Min(100, Condition + dCond)));
Quality = Mathf.FloorToInt(Math.Max(0, Math.Min(20000, Quality + dQuality)));
}
public IBaseModule? Module { get; set; }
public abstract bool IsMatch(IBasePort oth);
public IBasePort? ConnectedPort { get; set; }
public bool Connected => ConnectedPort != null;
/// <summary>
/// Try to Connect two Ports
/// if this port is Connected already, it will disconnect first
/// </summary>
public void Connect()
{
if(Connected)
Disconnect();
if (Module.Board.ConnectPending == null)
{
SetStatusPending();
Module.Board.ConnectPending = this;
return;
}
if (Module.Board.ConnectPending.IsMatch(this))
{
ConnectedPort = Module.Board.ConnectPending;
Module.Board.ConnectPending.ConnectedPort = this;
BaseCable cable = MakeCable(Module.Board.ConnectPending);
Module.Board.CablePairing[this] = cable;
Module.Board.CablePairing[Module.Board.ConnectPending] = cable;
Module.Board.AddCable(cable);
cable.LineUpdate();
SetStatusConnected();
Module.Board.ConnectPending.SetStatusConnected();
Module.Board.ConnectPending = null;
return;
}
Module.Board.ConnectPending.SetStatusNormal();
Module.Board.ConnectPending = null;
}
protected virtual void Disconnect()
{
if (!Connected)
return;
IBaseCable cable = Module.Board.CablePairing[this];
Module.Board.CablePairing.Remove(ConnectedPort);
Module.Board.FocusedCables.Remove(Module.Board.CablePairing[this]);
Module.Board.CablePairing.Remove(this);
cable.Free();
ConnectedPort.SetStatusNormal();
ConnectedPort.ConnectedPort = null;
SetStatusNormal();
ConnectedPort = null;
}
public abstract void SetStatusPending();
public abstract void SetStatusConnected();
public abstract void SetStatusNormal();
/// <summary>
/// Determine whether this port can be connected with given port
/// </summary>
public abstract BaseCable MakeCable(IBasePort other);
public virtual void Init()
{
}
}

View File

@@ -0,0 +1,37 @@
using Enigmos.Cables;
using Enigmos.Modules.ControllingModules;
using Nocturnis.DataStructures;
using Nocturnis.Enigmos.Ports;
using TabulaSmaragdina;
namespace Enigmos.Ports.DataPorts;
public partial class DataInPort : DataPort, IDataInPort
{
public new DataOutPort ConnectedPort
{
get => base.ConnectedPort as DataOutPort;
set => base.ConnectedPort = value;
}
public override bool IsMatch(IBasePort other) =>
other is DataOutPort dataOut &&
GlobalProvider.EnigmosProvider.DataPortTypeCompatible(DataType, dataOut.DataType);
public IDataPackage GetData(RootModule root)
{
if (!Connected)
return GlobalProvider.DataStructureProvider.DefaultDataPackage;
if(!ConnectedPort.DataUpdated)
ConnectedPort.DataUpdateRequest(root);
return ConnectedPort.ResultData;
}
public override BaseCable MakeCable(IBasePort other)
{
BaseCable res = base.MakeCable(other);
res.PortFrom = this;
res.PortTo = other;
return res;
}
}

View File

@@ -0,0 +1,46 @@
using Enigmos.Cables;
using Enigmos.Modules.ComputationalModules;
using Enigmos.Modules.ControllingModules;
using Nocturnis.DataStructures;
using Nocturnis.Enigmos.Ports;
using TabulaSmaragdina;
namespace Enigmos.Ports.DataPorts;
public partial class DataOutPort : DataPort, IDataOutPort
{
public bool DataUpdated { get; set; }
public new ComputationalModule Module
{
get => base.Module as ComputationalModule;
set => base.Module = value;
}
public void DataUpdateRequest(RootModule root) => Module.ComputeWithTimeoutHandle(root);
public DataOutPort()
{
DataUpdated = false;
ResultData = GlobalProvider.DataStructureProvider.NewDataPackage();
}
public new DataInPort ConnectedPort
{
get => base.ConnectedPort as DataInPort;
set => base.ConnectedPort = value;
}
public override bool IsMatch(IBasePort other) =>
other is DataInPort inPort &&
GlobalProvider.EnigmosProvider.DataPortTypeCompatible(inPort.DataType, DataType);
public IDataPackage ResultData { get; set; }
public override BaseCable MakeCable(IBasePort other)
{
BaseCable res = base.MakeCable(other);
res.PortFrom = other;
res.PortTo = this;
return res;
}
}

View File

@@ -0,0 +1,54 @@
using Enigmos.Cables;
using Godot;
using Nocturnis.Enigmos.Ports;
using TabulaSmaragdina;
namespace Enigmos.Ports.DataPorts;
public abstract partial class DataPort : BasePort, IDataPort
{
public new DataPort ConnectedPort
{
get => base.ConnectedPort as DataPort;
set => base.ConnectedPort = value;
}
protected Sprite2D DataTypeTexture { get; set; }
public StringName DataType { get; set; }
public override void Init()
{
Console.WriteLine("XY");
DataTypeTexture = GetNode<Sprite2D>("DataTypeTexture");
DataTypeTexture.Visible = false;
base.Init();
}
public void SetDataType(StringName val)
{
if(Connected && val != ConnectedPort.DataType)
Disconnect();
DataType = val;
DataTypeTexture.Texture = GlobalProvider.EnigmosProvider.DataPortTypeMap[val];
}
private void MouseEnterHandler() => DataTypeTexture.Visible = true;
private void MouseExitHandler() => DataTypeTexture.Visible = false;
public override BaseCable MakeCable(IBasePort other)
{
BaseCable res = GlobalProvider.EnigmosProvider.DataCableScene.Instantiate<BaseCable>();
res.Init();
return res;
}
public override void SetStatusNormal() =>
TextureNormal = GlobalProvider.EnigmosProvider.DataPortStatusNormal;
public override void SetStatusPending() =>
TextureNormal = GlobalProvider.EnigmosProvider.DataPortStatusPending;
public override void SetStatusConnected() =>
TextureNormal = GlobalProvider.EnigmosProvider.DataPortStatusConnected;
}

View File

@@ -1,11 +0,0 @@
using Godot;
namespace Enigmos.Ports;
public interface IBasePort
{
Vector2 PositionToBoard();
int Condition { get; set; }
int Quality { get; set; }
}

View File

@@ -0,0 +1,29 @@
using Enigmos.Cables;
using Enigmos.Modules.ControllingModules;
using Nocturnis.Enigmos.Ports;
namespace Enigmos.Ports.SignalPorts;
public partial class SignalInPort : SignalPort, ISignalInPort
{
public new ControllingModule Module
{
get => base.Module as ControllingModule;
set => base.Module = value;
}
public new SignalOutPort ConnectedPort
{
get => base.ConnectedPort as SignalOutPort;
set => base.ConnectedPort = value;
}
public override bool IsMatch(IBasePort other) => other is SignalOutPort;
public override BaseCable MakeCable(IBasePort other)
{
BaseCable res = base.MakeCable(other);
res.PortFrom = this;
res.PortTo = other;
return res;
}
}

View File

@@ -0,0 +1,31 @@
using Enigmos.Cables;
using Enigmos.Modules.ControllingModules;
using Nocturnis.Enigmos.Ports;
namespace Enigmos.Ports.SignalPorts;
public partial class SignalOutPort : SignalPort, ISignalOutPort
{
public new ControllingModule Module
{
get => base.Module as ControllingModule;
set => base.Module = value;
}
public new SignalInPort ConnectedPort
{
get => base.ConnectedPort as SignalInPort;
set => base.ConnectedPort = value;
}
public override bool IsMatch(IBasePort other) => other is SignalInPort;
public override BaseCable MakeCable(IBasePort other)
{
BaseCable res = base.MakeCable(other);
res.PortFrom = other;
res.PortTo = this;
return res;
}
}

View File

@@ -0,0 +1,38 @@
using Enigmos.Cables;
using Godot;
using Nocturnis.Enigmos.Ports;
using TabulaSmaragdina;
namespace Enigmos.Ports.SignalPorts;
public abstract partial class SignalPort : BasePort, ISignalInPort
{
protected AnimatedSprite2D SignalDirection { get; set; }
public override void Init()
{
base.Init();
SignalDirection = GetNode<AnimatedSprite2D>("SignalDirection");
SignalDirection.Visible = false;
}
private void MouseEnteredHandler() => SignalDirection.Visible = true;
private void MouseExitedHandler() => SignalDirection.Visible = false;
public override void SetStatusConnected() =>
TextureNormal = GlobalProvider.EnigmosProvider.SignalPortStatusConnected;
public override void SetStatusNormal() =>
TextureNormal = GlobalProvider.EnigmosProvider.SignalPortStatusNormal;
public override void SetStatusPending() =>
TextureNormal = GlobalProvider.EnigmosProvider.SignalPortStatusPending;
public override BaseCable MakeCable(IBasePort other)
{
BaseCable res = GlobalProvider.EnigmosProvider.SignalCableScene.Instantiate<BaseCable>();
res.Init();
return res;
}
}