A game about forced loneliness, made by TACStudios
1using System; 2using System.Collections.Generic; 3using UnityEngine; 4 5namespace Unity.VisualScripting 6{ 7 public class GraphData<TGraph> : IGraphData 8 where TGraph : class, IGraph 9 { 10 public GraphData(TGraph definition) 11 { 12 this.definition = definition; 13 } 14 15 protected TGraph definition { get; } 16 17 protected Dictionary<IGraphElementWithData, IGraphElementData> elementsData { get; } = new Dictionary<IGraphElementWithData, IGraphElementData>(); 18 19 protected Dictionary<IGraphParentElement, IGraphData> childrenGraphsData { get; } = new Dictionary<IGraphParentElement, IGraphData>(); 20 21 protected Dictionary<Guid, IGraphElementData> phantomElementsData { get; } = new Dictionary<Guid, IGraphElementData>(); 22 23 protected Dictionary<Guid, IGraphData> phantomChildrenGraphsData { get; } = new Dictionary<Guid, IGraphData>(); 24 25 public bool TryGetElementData(IGraphElementWithData element, out IGraphElementData data) 26 { 27 return elementsData.TryGetValue(element, out data); 28 } 29 30 public bool TryGetChildGraphData(IGraphParentElement element, out IGraphData data) 31 { 32 return childrenGraphsData.TryGetValue(element, out data); 33 } 34 35 public IGraphElementData CreateElementData(IGraphElementWithData element) 36 { 37 // Debug.Log($"Creating element data for {element}"); 38 39 if (elementsData.ContainsKey(element)) 40 { 41 throw new InvalidOperationException($"Graph data already contains element data for {element}."); 42 } 43 44 IGraphElementData elementData; 45 46 if (phantomElementsData.TryGetValue(element.guid, out elementData)) 47 { 48 // Debug.Log($"Restoring phantom element data for {element}."); 49 phantomElementsData.Remove(element.guid); 50 } 51 else 52 { 53 elementData = element.CreateData(); 54 } 55 56 elementsData.Add(element, elementData); 57 58 return elementData; 59 } 60 61 public void FreeElementData(IGraphElementWithData element) 62 { 63 // Debug.Log($"Freeing element data for {element}"); 64 65 if (elementsData.TryGetValue(element, out var elementData)) 66 { 67 elementsData.Remove(element); 68 phantomElementsData.Add(element.guid, elementData); 69 } 70 else 71 { 72 Debug.LogWarning($"Graph data does not contain element data to free for {element}."); 73 } 74 } 75 76 public IGraphData CreateChildGraphData(IGraphParentElement element) 77 { 78 // Debug.Log($"Creating child graph data for {element}"); 79 80 if (childrenGraphsData.ContainsKey(element)) 81 { 82 throw new InvalidOperationException($"Graph data already contains child graph data for {element}."); 83 } 84 85 IGraphData childGraphData; 86 87 if (phantomChildrenGraphsData.TryGetValue(element.guid, out childGraphData)) 88 { 89 // Debug.Log($"Restoring phantom child graph data for {element}."); 90 phantomChildrenGraphsData.Remove(element.guid); 91 } 92 else 93 { 94 childGraphData = element.childGraph.CreateData(); 95 } 96 97 childrenGraphsData.Add(element, childGraphData); 98 99 return childGraphData; 100 } 101 102 public void FreeChildGraphData(IGraphParentElement element) 103 { 104 // Debug.Log($"Freeing child graph data for {element}"); 105 106 if (childrenGraphsData.TryGetValue(element, out var childGraphData)) 107 { 108 childrenGraphsData.Remove(element); 109 phantomChildrenGraphsData.Add(element.guid, childGraphData); 110 } 111 else 112 { 113 Debug.LogWarning($"Graph data does not contain child graph data to free for {element}."); 114 } 115 } 116 } 117}