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}