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}