using Enigmos.Cables; using Enigmos.Modules; using Enigmos.Modules.ProgrammableModules; using Godot; using Nocturnis.DataStructures; using Nocturnis.Enigmos.Boards; using Nocturnis.Enigmos.Cables; using Nocturnis.Enigmos.Modules; using Nocturnis.Enigmos.Modules.InterlayerModules; using Nocturnis.Enigmos.Ports; using Nocturnis.GlobalManagement.Controls; using Nocturnis.GlobalManagement.Providers; using Nocturnis.Inventories.Items; using Nocturnis.Inventories.Items.Items; using Nocturnis.UIElements; using Nocturnis.UIElements.Layers; namespace Enigmos.Boards; public abstract partial class BaseBoard : Panel, IBaseBoard { public bool CableVisualMode { get; set; } public bool LabelVisualMode { get; set; } public HashSet FocusedCables { get; set; } = new(); public void SetCableVisualMode(bool mode) { CableVisualMode = mode; foreach (BaseCable cable in GetChildren().OfType()) cable.Modulate = Color.Color8(255, 255, 255, (Byte)(mode ? 20 : 255)); } public void SetLabelVisualMode(bool mode) { LabelVisualMode = mode; foreach (BaseModule module in GetChildren().OfType()) if(module.HasLabel) module.Label!.Visible = !mode; } public void AddCable(IBaseCable cable) { AddChild(cable.AsNode); cable.Modulate = Color.Color8(255, 255, 255, (Byte)(CableVisualMode ? 20 : 255)); } public IModuleManualLayer ModuleManualLayer { get; set; } public bool ManualOpened { get; set; } protected HashSet Modules { get; set; } = new(); protected IEnumerable ProgrammableModules => Modules .OfType(); public IEnumerable TerminalModules => Modules .OfType() .Union(ProgrammableModules.SelectMany(module => module.UnderlyingBoard!.TerminalModules)); public IPanelViewer PanelViewer { get; set; } public Dictionary CablePairing { get; set; } = new(); public IEnumerable OnBoardPorts { get { IEnumerable res = Array.Empty(); foreach (IInterlayerModule im in GetChildren().OfType()) res = res.Union(im.Ports); return res; } } public IBasePort ConnectPending { get; set; } public IBoardControlLayer CircuitBoardControlLayer { get; set; } public IModuleMovingLayer ModuleMovingLayer { get; set; } public virtual void Init() { CablePairing = new Dictionary(); Modules = new HashSet(); FocusedCables = new HashSet(); ConnectPending = null; ModuleManualLayer = GetNode("ModuleManualLayer"); ModuleMovingLayer = GetNode("ModuleMovingLayer"); ModuleMovingLayer.Board = this; PanelViewer = GetNode("PanelViewer"); CircuitBoardControlLayer = GetNode("CircuitBoardControlLayer"); CircuitBoardControlLayer.Board = this; } protected virtual void AddModule(IBaseModule module, Vector2 pos) { module.Board = this; AddChild(module.AsNode); if (module is ICompositeModule compositeModule) foreach (IBaseModule subModule in compositeModule.SubModules) subModule.Board = this; module.Position = pos; Modules.Add(module); } public virtual void Reset() { foreach (ISourceModule sm in Modules.OfType()) sm.Reset(); foreach (IProgrammableModule pm in Modules.OfType()) pm.Board!.Reset(); foreach (IControllingModule cm in Modules.OfType()) cm.Visited = false; foreach (ITerminalModule tm in Modules.OfType()) tm.Finished = true; } public override bool _CanDropData(Vector2 atPosition, Variant data) { VariantWithType vData = data.As(); if (vData.TypeHint != "Module") { if(vData.TypeHint != "Item") return false; IBaseItem item = vData.UnderlyingData.As() as IBaseItem; if (item is IBaseModuleItem moduleItem) { foreach (IBaseModule module in Modules) if (GlobalProvider.UIProvider!.Overlap(atPosition, moduleItem.ContentModule.Size, module.Position, module.Size)) return false; return true; } return false; } BaseModule? moduleData = vData.UnderlyingData.As(); if (moduleData == null) return false; Vector2 pos = atPosition - moduleData.PivotOffset; foreach (IBaseModule module in Modules) { if(module == moduleData) continue; if (GlobalProvider.UIProvider.Overlap(pos, moduleData.Size, module.Position, module.Size)) return false; } return true; } public override void _DropData(Vector2 atPosition, Variant data) { VariantWithType vData = data.As(); if(vData.TypeHint == "Module") { BaseModule vModule = vData.UnderlyingData.As(); vModule.Position = atPosition - vModule.PivotOffset; vModule.UpdateCables(); } else { IBaseModuleItem moduleItem = vData.UnderlyingData.As() as IBaseModuleItem; AddModule(moduleItem.ContentModule, atPosition); ItemDraggingControl.Instance.DraggingFrom!.Item = null; } } protected T GetModule(NodePath path) where T : BaseModule { T res = GetNode(path); res.Init(); Modules.Add(res); res.Board = this; return res; } public T[] GetModules() where T : BaseModule { T[] res = GetChildren().OfType().OrderBy(x => x.Name).ToArray(); foreach (T m in res) { m.Init(); Modules.Add(m); m.Board = this; } return res; } }