//$ Copyright 2015-22, Code Respawn Technologies Pvt Ltd - All Rights Reserved $// using System.Collections.Generic; using UnityEngine; namespace DungeonArchitect.RuntimeGraphs { public class RuntimeGraph { public List> Nodes = new List>(); public void RemoveNode(RuntimeGraphNode node) { if (node.Graph == this) { node.BreakAllLinks(); Nodes.Remove(node); } else { Debug.LogWarning("Remove node from an invalid graph"); } } } public class RuntimeGraphNode { public T Payload = default(T); public RuntimeGraph Graph; public Vector2 Position = Vector2.zero; public List> Outgoing = new List>(); public List> Incoming = new List>(); public RuntimeGraphNode(RuntimeGraph graph) { this.Graph = graph; } public void MakeLinkTo(RuntimeGraphNode destNode) { Outgoing.Add(destNode); destNode.Incoming.Add(this); } public void BreakLinkTo(RuntimeGraphNode destNode) { Outgoing.Remove(destNode); destNode.Incoming.Remove(this); } public void BreakAllOutgoingLinks() { var outgoingNodes = new List>(Outgoing); foreach (var outgoingNode in outgoingNodes) { BreakLinkTo(outgoingNode); } } public void BreakAllIncomingLinks() { var incomingNodes = new List>(Incoming); foreach (var incomingNode in incomingNodes) { incomingNode.BreakLinkTo(this); } } public void BreakAllLinks() { BreakAllOutgoingLinks(); BreakAllIncomingLinks(); } public override string ToString() { if (Payload != null) { return Payload.ToString(); } return base.ToString(); } } }