A game about forced loneliness, made by TACStudios
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using UnityEngine;
5
6namespace Unity.VisualScripting
7{
8 public interface IUnit : IGraphElementWithDebugData
9 {
10 new FlowGraph graph { get; }
11
12 #region Definition
13
14 bool canDefine { get; }
15
16 bool isDefined { get; }
17
18 bool failedToDefine { get; }
19
20 Exception definitionException { get; }
21
22 void Define();
23
24 void EnsureDefined();
25
26 void RemoveUnconnectedInvalidPorts();
27
28 #endregion
29
30 #region Default Values
31
32 Dictionary<string, object> defaultValues { get; }
33
34 #endregion
35
36 #region Ports
37
38 IUnitPortCollection<ControlInput> controlInputs { get; }
39
40 IUnitPortCollection<ControlOutput> controlOutputs { get; }
41
42 IUnitPortCollection<ValueInput> valueInputs { get; }
43
44 IUnitPortCollection<ValueOutput> valueOutputs { get; }
45
46 IUnitPortCollection<InvalidInput> invalidInputs { get; }
47
48 IUnitPortCollection<InvalidOutput> invalidOutputs { get; }
49
50 IEnumerable<IUnitInputPort> inputs { get; }
51
52 IEnumerable<IUnitOutputPort> outputs { get; }
53
54 IEnumerable<IUnitInputPort> validInputs { get; }
55
56 IEnumerable<IUnitOutputPort> validOutputs { get; }
57
58 IEnumerable<IUnitPort> ports { get; }
59
60 IEnumerable<IUnitPort> invalidPorts { get; }
61
62 IEnumerable<IUnitPort> validPorts { get; }
63
64 void PortsChanged();
65
66 event Action onPortsChanged;
67
68 #endregion
69
70 #region Connections
71
72 IConnectionCollection<IUnitRelation, IUnitPort, IUnitPort> relations { get; }
73
74 IEnumerable<IUnitConnection> connections { get; }
75
76 #endregion
77
78 #region Analysis
79
80 bool isControlRoot { get; }
81
82 #endregion
83
84 #region Widget
85
86 Vector2 position { get; set; }
87
88 #endregion
89 }
90
91 public static class XUnit
92 {
93 public static ValueInput CompatibleValueInput(this IUnit unit, Type outputType)
94 {
95 Ensure.That(nameof(outputType)).IsNotNull(outputType);
96
97 return unit.valueInputs
98 .Where(valueInput => ConversionUtility.CanConvert(outputType, valueInput.type, false))
99 .OrderBy((valueInput) =>
100 {
101 var exactType = outputType == valueInput.type;
102 var free = !valueInput.hasValidConnection;
103
104 if (free && exactType)
105 {
106 return 1;
107 }
108 else if (free)
109 {
110 return 2;
111 }
112 else if (exactType)
113 {
114 return 3;
115 }
116 else
117 {
118 return 4;
119 }
120 }).FirstOrDefault();
121 }
122
123 public static ValueOutput CompatibleValueOutput(this IUnit unit, Type inputType)
124 {
125 Ensure.That(nameof(inputType)).IsNotNull(inputType);
126
127 return unit.valueOutputs
128 .Where(valueOutput => ConversionUtility.CanConvert(valueOutput.type, inputType, false))
129 .OrderBy((valueOutput) =>
130 {
131 var exactType = inputType == valueOutput.type;
132 var free = !valueOutput.hasValidConnection;
133
134 if (free && exactType)
135 {
136 return 1;
137 }
138 else if (free)
139 {
140 return 2;
141 }
142 else if (exactType)
143 {
144 return 3;
145 }
146 else
147 {
148 return 4;
149 }
150 }).FirstOrDefault();
151 }
152 }
153}