A game about forced loneliness, made by TACStudios
1namespace Unity.VisualScripting 2{ 3 /// <summary> 4 /// Toggles between two values with on and off triggers. 5 /// </summary> 6 [UnitCategory("Control")] 7 [UnitOrder(19)] 8 [UnitFooterPorts(ControlInputs = true, ControlOutputs = true)] 9 public sealed class ToggleValue : Unit, IGraphElementWithData 10 { 11 public class Data : IGraphElementData 12 { 13 public bool isOn; 14 } 15 16 /// <summary> 17 /// Whether the toggle should start in the on state. 18 /// </summary> 19 [Serialize] 20 [Inspectable] 21 [UnitHeaderInspectable("Start On")] 22 [InspectorToggleLeft] 23 public bool startOn { get; set; } = true; 24 25 /// <summary> 26 /// Trigger to turn on the toggle. 27 /// </summary> 28 [DoNotSerialize] 29 [PortLabel("On")] 30 public ControlInput turnOn { get; private set; } 31 32 /// <summary> 33 /// Trigger to turn off the toggle. 34 /// </summary> 35 [DoNotSerialize] 36 [PortLabel("Off")] 37 public ControlInput turnOff { get; private set; } 38 39 /// <summary> 40 /// Trigger to toggle the state of the toggle. 41 /// </summary> 42 [DoNotSerialize] 43 public ControlInput toggle { get; private set; } 44 45 /// <summary> 46 /// The value to return if the toggle is on. 47 /// </summary> 48 [DoNotSerialize] 49 public ValueInput onValue { get; private set; } 50 51 /// <summary> 52 /// The value to return if the toggle is off. 53 /// </summary> 54 [DoNotSerialize] 55 public ValueInput offValue { get; private set; } 56 57 /// <summary> 58 /// Triggered when the flow gets turned on. 59 /// </summary> 60 [DoNotSerialize] 61 public ControlOutput turnedOn { get; private set; } 62 63 /// <summary> 64 /// Triggered when the flow gets turned off. 65 /// </summary> 66 [DoNotSerialize] 67 public ControlOutput turnedOff { get; private set; } 68 69 /// <summary> 70 /// Whether the flow is currently on. 71 /// </summary> 72 [DoNotSerialize] 73 public ValueOutput isOn { get; private set; } 74 75 /// <summary> 76 /// The value of the toggle selected depending on the state. 77 /// </summary> 78 [DoNotSerialize] 79 public ValueOutput value { get; private set; } 80 81 protected override void Definition() 82 { 83 turnOn = ControlInput(nameof(turnOn), TurnOn); 84 turnOff = ControlInput(nameof(turnOff), TurnOff); 85 toggle = ControlInput(nameof(toggle), Toggle); 86 87 onValue = ValueInput<object>(nameof(onValue)); 88 offValue = ValueInput<object>(nameof(offValue)); 89 90 turnedOn = ControlOutput(nameof(turnedOn)); 91 turnedOff = ControlOutput(nameof(turnedOff)); 92 93 isOn = ValueOutput(nameof(isOn), IsOn); 94 value = ValueOutput(nameof(value), Value); 95 96 Requirement(onValue, value); 97 Requirement(offValue, value); 98 Succession(turnOn, turnedOn); 99 Succession(turnOff, turnedOff); 100 Succession(toggle, turnedOn); 101 Succession(toggle, turnedOff); 102 } 103 104 public IGraphElementData CreateData() 105 { 106 return new Data() { isOn = startOn }; 107 } 108 109 private bool IsOn(Flow flow) 110 { 111 return flow.stack.GetElementData<Data>(this).isOn; 112 } 113 114 private ControlOutput TurnOn(Flow flow) 115 { 116 var data = flow.stack.GetElementData<Data>(this); 117 118 if (data.isOn) 119 { 120 return null; 121 } 122 123 data.isOn = true; 124 125 return turnedOn; 126 } 127 128 private ControlOutput TurnOff(Flow flow) 129 { 130 var data = flow.stack.GetElementData<Data>(this); 131 132 if (!data.isOn) 133 { 134 return null; 135 } 136 137 data.isOn = false; 138 139 return turnedOff; 140 } 141 142 private ControlOutput Toggle(Flow flow) 143 { 144 var data = flow.stack.GetElementData<Data>(this); 145 146 data.isOn = !data.isOn; 147 148 return data.isOn ? turnedOn : turnedOff; 149 } 150 151 private object Value(Flow flow) 152 { 153 var data = flow.stack.GetElementData<Data>(this); 154 155 return flow.GetValue(data.isOn ? onValue : offValue); 156 } 157 } 158}