Tanoda
Controller.cs
Go to the documentation of this file.
1using GILES;
2using GILES.Interface;
3using NaughtyAttributes;
4using Newtonsoft.Json;
5using System;
6using System.Collections;
7using System.Collections.Generic;
8using System.Linq;
9using System.Runtime.Serialization;
10using UnityEngine;
12using UnityEngine.UI;
13
14public class Controller : MonoBehaviour, ISerializable
15{
16 public static Controller Instance { get; private set; }
17
18 public delegate void TriggerHandler(string id);
19
21
22 public GameObject UIParent;
23 public GameObject prefab;
24
25 public bool onlyOneStartAction = true;
26 [ReorderableList] public List<GameObject> actionPrefabs;
27
28 [HideInInspector] public bool isLoading;
29
30 private List<KeyValuePair<string, Connection>> connections;
31
32 internal Dictionary<string, ActionObject> actions;
33
34 private string currentOutput = "";
35
36 public GraphicRaycaster m_Raycaster;
37 PointerEventData m_PointerEventData;
38 public EventSystem m_EventSystem;
39 public Dropdown AddNodeDropdown;
40 public CanvasGroup StageWindow;
41 private bool rightClickMenu;
42 private Vector3 rightClickPos = Vector3.zero;
43
44 private string lastClickedOn = "";
45 internal bool fastForwarding = false;
46 private bool isShiftKeyDown = false;
47
48
49 public void GetObjectData(SerializationInfo info, StreamingContext context)
50 {
51 info.AddValue("connections", connections);
52 info.AddValue("actions", actions, typeof(ActionObject));
53 //info.AddValue("OnTrigger", OnTrigger);
54 }
55
56
57 public Controller(SerializationInfo info, StreamingContext context)
58 {
59
60 try
61 {
62 connections = new List<KeyValuePair<string, Connection>>();
63 var dict = (Dictionary<string, Connection>)info.GetValue("connections", typeof(Dictionary<string, Connection>));
64 foreach (var kv in dict)
65 {
66 connections.Add(new KeyValuePair<string, Connection>(kv.Key, kv.Value));
67 }
68 }
69 catch (Exception)
70 {
71 connections =
72 (List<KeyValuePair<string, Connection>>)info.GetValue("connections", typeof(List<KeyValuePair<string, Connection>>));
73
74 }
75 actions = (Dictionary<string, ActionObject>)info.GetValue("actions", typeof(Dictionary<string, ActionObject>));
76 CleanupV2();
77 }
78
79 public void LoadJson(Controller controller)
80 {
81 try
82 {
83 if (controller.actions.Count != 0) StartCoroutine(LoadControllerFromJSON(controller));
84 }
85 catch (Exception)
86 {
87 // ignored
88 }
89 }
90
91 public IEnumerator LoadControllerFromJSON(Controller controller)
92 {
93 if (!LoadingManager.instance.isLoading)
94 {
95 LoadingManager.instance.SetLoading();
96 LoadingManager.instance.ShowWindow();
97 LoadingManager.instance.timeout += 15f;
98 }
99
100 isLoading = true;
101 var translationTableActions = new Dictionary<string, string>();
102 var translationTableInOutputs = new Dictionary<string, string>();
103
104 foreach (var action in controller.actions)
105 foreach (var actionType in actionPrefabs)
106 if (actionType && actionType.GetComponent<ActionObject>())
107 if (action.Value.GetType() == actionType.GetComponent<ActionObject>().GetType())
108 {
109 AddAction(actionType, action.Key);
110 var newaction = actions.Last().Value;
111 var oldaction = GameObject.Find(action.Key);
112 var oao = oldaction.GetComponent<ActionObject>();
113
114
115 newaction.transform.localPosition = oldaction.transform.localPosition;
116 newaction.comment = action.Value.comment;
117 newaction.minimized = action.Value.minimized;
118 newaction.ApplyComment();
119 newaction.GetOriginalHeight();
120 if (newaction.minimized)
121 {
122 StartCoroutine(newaction.LateMinimize());
123 }
124
125 (newaction as WaiterAction)?.Start();
126 newaction.Start();
127
128 translationTableActions.Add(action.Key, actions.Last().Key);
129
130 if (newaction is WaiterAction)
131 {
132 var targetnum = (action.Value as WaiterAction).savedInputCount;
133 (newaction as WaiterAction).savedInputCount = targetnum;
134 (newaction as WaiterAction).inputCount.text = targetnum.ToString();
135 (newaction as WaiterAction).InputEnded();
136 (newaction as WaiterAction).taktTime = (action.Value as WaiterAction).taktTime;
137 newaction.inPuts.Clear();
138 foreach (var inID in (newaction as WaiterAction).inIDs) newaction.inPuts.Add(inID.Value);
139 (newaction as WaiterAction).RefreshTargetDisplay();
140 }
141
142
143 if (newaction is GameObjectAction)
144 {
145 (newaction as GameObjectAction).Offset = (action.Value as GameObjectAction).Offset;
146 (newaction as GameObjectAction).LeftOffset = (action.Value as GameObjectAction).LeftOffset;
147 (newaction as GameObjectAction).Rotation = (action.Value as GameObjectAction).Rotation;
148 (newaction as GameObjectAction).LeftRotation = (action.Value as GameObjectAction).LeftRotation;
149 StartCoroutine(
150 (newaction as GameObjectAction).SetGameObjectJob((action.Value as GameObjectAction)
151 .selectedHash));
152 }
153
154 if (newaction is CheckAction)
155 {
156 StartCoroutine(
157 (newaction as CheckAction).SetGameObjectJob((action.Value as CheckAction).selectedHash));
158 (newaction as CheckAction).timeToWatch = (action.Value as CheckAction).timeToWatch;
159 }
160
161 if (newaction is ShowHideAction)
162 {
163 StartCoroutine(
164 (newaction as ShowHideAction).SetGameObjectJob(
165 (action.Value as ShowHideAction).selectedHash));
166 (newaction as ShowHideAction).selectedHash = (action.Value as ShowHideAction).selectedHash;
167 (newaction as ShowHideAction).Show = (action.Value as ShowHideAction).Show;
168 }
169
170 if (newaction is PositionAction pa)
171 {
172 pa.targetPosition = (action.Value as PositionAction).targetPosition;
173 pa.targetRotation = (action.Value as PositionAction).targetRotation;
174 pa.tolerance = (action.Value as PositionAction).tolerance;
175 pa.taktTime = (action.Value as PositionAction).taktTime;
176 pa.useObjectPositioning = (action.Value as PositionAction).useObjectPositioning;
177 pa.localpos = (action.Value as PositionAction).localpos;
178 pa.localrot = (action.Value as PositionAction).localrot;
179 pa.upoffset = (action.Value as PositionAction).upoffset;
180 pa.fwdoffset = (action.Value as PositionAction).fwdoffset;
181 pa.oneHanded = (action.Value as PositionAction).oneHanded;
182 pa.selectedLocalHash = (action.Value as PositionAction).selectedLocalHash;
183
184 pa.RefreshTargetDisplay();
185 }
186
187 if (newaction is HoldPositionAction hpa)
188 {
189 hpa.targetPosition =
190 (action.Value as HoldPositionAction).targetPosition;
191 hpa.targetRotation =
192 (action.Value as HoldPositionAction).targetRotation;
193 hpa.tolerance = (action.Value as HoldPositionAction).tolerance;
194 hpa.taktTime = (action.Value as HoldPositionAction).taktTime;
195 hpa.holdTime = (action.Value as HoldPositionAction).holdTime;
196 hpa.RefreshTargetDisplay();
197 }
198
199 if (newaction is HoldToolAction hta)
200 {
201 hta.targetPosition = (action.Value as HoldToolAction).targetPosition;
202 hta.targetRotation = (action.Value as HoldToolAction).targetRotation;
203 hta.toolIndex = (action.Value as HoldToolAction).toolIndex;
204 hta.torqueNm = (action.Value as HoldToolAction).torqueNm;
205 hta.customToolHash = (action.Value as HoldToolAction).customToolHash;
206 hta.holdTime = (action.Value as HoldToolAction).holdTime;
207 hta.taktTime = (action.Value as HoldToolAction).taktTime;
208 hta.drop.SetValueWithoutNotify((action.Value as HoldToolAction).toolIndex);
209#if DANA
210 hta.SetupIfDigitalTW();
211#endif
212 StartCoroutine(
213 hta.SetGameObjectJob((action.Value as HoldToolAction).selectedHash));
214 hta.RefreshTargetDisplay();
215 }
216
217 if (newaction is ToolAction toola)
218 {
219 toola.targetPosition = (action.Value as ToolAction).targetPosition;
220 toola.targetRotation = (action.Value as ToolAction).targetRotation;
221 toola.toolIndex = (action.Value as ToolAction).toolIndex;
222#if DANA
223 toola.torqueNm = (action.Value as ToolAction).torqueNm;
224#endif
225 toola.taktTime = (action.Value as ToolAction).taktTime;
226 toola.customToolHash = (action.Value as ToolAction).customToolHash;
227 toola.drop.SetValueWithoutNotify((action.Value as ToolAction).toolIndex);
228#if DANA
229 toola.SetupIfDigitalTW();
230#endif
231 StartCoroutine(
232 toola.SetGameObjectJob((action.Value as ToolAction).selectedHash));
233#if DANA
234 toola.hasTwoObjects = (action.Value as ToolAction).hasTwoObjects;
235 toola.secondPos = (action.Value as ToolAction).secondPos;
236 toola.secondRot = (action.Value as ToolAction).secondRot;
237 toola.secondGoHash = (action.Value as ToolAction).secondGoHash;
238#endif
239 toola.RefreshTargetDisplay();
240 }
241
242 if (newaction is MoveAction ma)
243 {
244 ma.targetPosition = (action.Value as MoveAction).targetPosition;
245 ma.targetRotation = (action.Value as MoveAction).targetRotation;
246 ma.timeToMove = (action.Value as MoveAction).timeToMove;
247 ma.HandMove = (action.Value as MoveAction).HandMove;
248 ma.RefreshTargetDisplay();
249 }
250
251 if (newaction is CollectorAction ca)
252 {
253 ca.ActionChildCount = (action.Value as CollectorAction).ActionChildCount;
254 ca.ActionChildrenList = (action.Value as CollectorAction).ActionChildrenList;
255 ca.GameObjectChildrenList = (action.Value as CollectorAction).GameObjectChildrenList;
256 ca.ActionChildCount = (action.Value as CollectorAction).ActionChildCount;
257 ca.isSmall = (action.Value as CollectorAction).isSmall;
258 ca.inOrder = (action.Value as CollectorAction).inOrder;
259 ca.Welding = (action.Value as CollectorAction).Welding;
260 ca.OriginalSize = (action.Value as CollectorAction).OriginalSize;
261 ca.SetTheChildren();
262 ca.MoveTheChildren();
263 }
264
265 if (newaction is TriggerAction triggera)
266 {
267 triggera.triggerPosition = (action.Value as TriggerAction).triggerPosition;
268 triggera.triggerRotation = (action.Value as TriggerAction).triggerRotation;
269 triggera.triggerScale = (action.Value as TriggerAction).triggerScale;
270 triggera.showVisuals = (action.Value as TriggerAction).showVisuals;
271 triggera.triggerOnce = (action.Value as TriggerAction).triggerOnce;
272 triggera.bFollowGo = (action.Value as TriggerAction).bFollowGo;
273 triggera.SetTriggerTransformNow();
274 StartCoroutine(
275 triggera.SetGameObjectJob((action.Value as TriggerAction)
276 .selectedHash));
277 }
278
279 if (newaction is RotateAction ra)
280 {
281 ra.targetPosition =
282 (action.Value as RotateAction).targetPosition;
283 ra.targetRotation =
284 (action.Value as RotateAction).targetRotation;
285 ra.taktTime = (action.Value as RotateAction).taktTime;
286 ra.selectedAxis = (action.Value as RotateAction).selectedAxis;
287 ra.selectedHash = (action.Value as RotateAction).selectedHash;
288 ra.selectedToolHash = (action.Value as RotateAction).selectedToolHash;
289 ra.rotateAmount = (action.Value as RotateAction).rotateAmount;
290 ra.RefreshTargetDisplay();
291 }
292
293 if (newaction is LedAction la)
294 {
295 la.ledIndex = (action.Value as LedAction).ledIndex;
296 la.drop.SetValueWithoutNotify((action.Value as LedAction).ledIndex);
297 }
298
299 if (newaction is SoundAction sounda)
300 {
301 sounda.selectedSound = (action.Value as SoundAction).selectedSound;
302 sounda.triggerNextOnSoundEnd =
303 (action.Value as SoundAction).triggerNextOnSoundEnd;
304 }
305#if DANA
306 if (newaction is ScriptAction sctipta)
307 {
308 sctipta.selectedScript = (action.Value as ScriptAction).selectedScript;
309 sctipta.autostart = (action.Value as ScriptAction).autostart;
310 sctipta.FillScriptText();
311 }
312
313 if (newaction is VoiceAction va)
314 {
315 va.selectedLanguage = (action.Value as VoiceAction).selectedLanguage;
316 va.textToSpeak = (action.Value as VoiceAction).textToSpeak;
317 }
318#endif
319 if (newaction is QuizAction qa)
320 qa.quizName = (action.Value as QuizAction).quizName;
321 if (newaction is CountdownAction counta)
322 {
323 counta.countdown = (action.Value as CountdownAction).countdown;
324 try
325 {
326 counta.time.text = (action.Value as CountdownAction).time.text;
327 }
328 catch (Exception e)
329 {
330 // ignored
331 }
332 }
333
334
335
336 if (newaction is RealToolAction rta)
337 {
338 rta.targetPosition = (action.Value as RealToolAction).targetPosition;
339 rta.targetRotation = (action.Value as RealToolAction).targetRotation;
340 rta.selectedSerial = (action.Value as RealToolAction).selectedSerial;
341 rta.holdTime = (action.Value as RealToolAction).holdTime;
342 rta.taktTime = (action.Value as RealToolAction).taktTime;
343 rta.RefreshTargetDisplay();
344 }
345
346 if (newaction is FinishAction fa)
347 {
348 fa.FailAfter = (action.Value as FinishAction).FailAfter;
349 fa.AlwaysFail = (action.Value as FinishAction).AlwaysFail;
350 var failTime = (action.Value as FinishAction).failTime;
351 fa.failTime = failTime;
352 try
353 {
354 fa.inputTime.text =
355 Mathf.FloorToInt(failTime / 60).ToString("D2") + ":" +
356 (failTime % 60).ToString("00.00").Replace(',', '.');
357 }
358 catch (Exception e)
359 {
360 // ignored
361 }
362
363 try
364 {
365 fa.alwaysFailToggle.isOn =
366 (action.Value as FinishAction).AlwaysFail;
367 }
368 catch (Exception e)
369 {
370 // ignored
371 }
372 }
373
374 var i = 0;
375 if (newaction.inPuts != null)
376 foreach (var inPut in newaction.inPuts)
377 {
378 try
379 {
380 translationTableInOutputs.Add(action.Value.inIDs.ElementAt(i).Key, inPut.name);
381 i++;
382 }
383 catch (Exception)
384 {
385 // ignored
386 }
387 }
388
389 i = 0;
390 if (newaction.outPuts != null)
391 foreach (var outPut in newaction.outPuts)
392 {
393 if (action.Value.outIDs == null || action.Value.outIDs.Count == 0)
394 {
395 continue;
396 }
397 try
398 {
399 translationTableInOutputs.Add(action.Value.outIDs.ElementAt(i).Key, outPut.name);
400 i++;
401 }
402 catch (Exception)
403 {
404 // ignored
405 }
406 }
407
408 if (oldaction && !oao) Destroy(oldaction);
409 if (oao) Destroy(oao);
410 }
411
412 CleanupV2();
413
414 var start1 = new List<string>();
415 var start2 = new List<string>();
416 var end1 = new List<string>();
417 var end2 = new List<string>();
418 foreach (var o in controller.connections)
419 try
420 {
421 var conn = o.Value;
422 var newactionidFrom =
423 translationTableActions[
424 controller.actions.First(x =>
425 x.Value.GetOutputs().Any(y => y.Equals(conn.fromId)) ||
426 x.Value.GetInputs().Any(y => y.Equals(conn.fromId)))
427 .Key];
428 var newactionidTo =
429 translationTableActions[
430 controller.actions.First(x =>
431 x.Value.GetOutputs().Any(y => y.Equals(conn.toId)) ||
432 x.Value.GetInputs().Any(y => y.Equals(conn.toId)))
433 .Key];
434 start1.Add(translationTableInOutputs[conn.fromId]);
435 start2.Add(newactionidFrom);
436 end1.Add(translationTableInOutputs[conn.toId]);
437 end2.Add(newactionidTo);
438 }
439 catch (Exception e)
440 {
441 // ignored
442 }
443
444 yield return null;
445
446
447 if (!LoadingManager.instance.isLoading)
448 {
449 LoadingManager.instance.SetLoading();
450 LoadingManager.instance.ShowWindow();
451 LoadingManager.instance.timeout += 15f;
452 }
453
454 CleanupV2();
455
456 //start1.Reverse();
457 //start2.Reverse();
458 //end1.Reverse();
459 //end2.Reverse();
460
461 for (var i = 0; i < start1.Count; i++)
462 {
463 StartConnection(start1[i], start2[i]);
464 yield return null;
465 EndConnection(end1[i], end2[i]);
466 }
467
468 foreach (var inOutput in translationTableInOutputs)
469 {
470 var target = GameObject.Find(inOutput.Key);
471 while (target)
472 {
473 DestroyImmediate(GameObject.Find(inOutput.Key)); //cleanup (multiple objects could appear)
474 target = GameObject.Find(inOutput.Key);
475 }
476 }
477
478 Destroy(controller);
479 //var sas = FindObjectsOfType<StartAction>();
480 //foreach (var sa in sas)
481 //{
482 // if (GetOutputConnectionsToObject(sa.name).Count == 0)
483 // {
484 // Destroy(sa.gameObject);
485 // }
486 //}
487 //yield return null;
488 {
489 var sa = FindObjectOfType<StartAction>();
490 if (sa) lastClickedOn = sa.action;
491 }
492 LineDrawer.Instance.UpdateLines();
493
494 isLoading = false;
495
496 pb_Hierarchy.instance.RebuildInspector();
497
498 LoadingManager.instance.HideWindow();
499
501 yield return null;
502 CleanupV2();
503 }
504
505 private static void CleanupV2()
506 {
507
508 //CLEANUP v2
509 var regex = "^[{]?[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}[}]?$";
510 var filename = "^.*\\....$";
511 var allroot = UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects();
512 foreach (var go in allroot)
513 {
514 if (go.name.EndsWith("(Clone)")) go.name = go.name.Replace("(Clone)", "");
515 if (System.Text.RegularExpressions.Regex.IsMatch(go.name, regex))
516 {
517 Destroy(go);
518 }
519 else if (go.name == "New Game Object" || go.name == "movingPart")
520 {
521 Destroy(go);
522 }
523 else if (System.Text.RegularExpressions.Regex.IsMatch(go.name, filename))
524 {
525 Destroy(go);
526 }
527 }
528 Destroy(GameObject.Find("abortion"));
529 //END CLEANUP v2
530 }
531
532 private void Awake()
533 {
534 Instance = this;
535 connections = new List<KeyValuePair<string, Connection>>();
536 actions = new Dictionary<string, ActionObject>();
537 }
538
540 {
541 if (!FindObjectOfType<StartAction>())
542 AddAction(actionPrefabs[0]); //StartAction
543 }
544
545 public GameObject AddAction(GameObject obj, string id)
546 {
547#if !DANA
548 if (/*onlyOneStartAction && */!isLoading)
549#endif
550 if (obj.GetComponent<StartAction>() && FindObjectOfType<StartAction>())
551 {
552 var sa = FindObjectOfType<StartAction>();
553 if (sa.setupOk)
554 {
555 return null;
556 }
557 }
558 var go = Instantiate(obj, UIParent.transform);
559 if (string.IsNullOrEmpty(id))
560 {
561 go.name = Guid.NewGuid().ToString();
562 }
563 else
564 {
565 go.name = id;
566 }
567 if (rightClickMenu)
568 {
569 go.transform.position = rightClickPos;
570 rightClickMenu = false;
571 }
572 else
573 {
574 RectTransformUtility.ScreenPointToLocalPointInRectangle(UIParent.transform as RectTransform,
575 new Vector2(Screen.width / 2, Screen.height / 2),
576 null, out var point);
577 go.transform.localPosition = point;
578 }
579
580 if (obj.GetComponent<StartAction>())
581 {
582 var sa = go.GetComponent<StartAction>();
583 sa.setupOk = true;
584 }
585 actions.Add(go.name, go.GetComponent<ActionObject>());
586 try
587 {
588 var dnd = GameObject.Find("DoNOTDelete");
589 var saveButton = dnd.transform.Find("SaveButton");
590 //var saveButton = GameObject.Find("SaveButton");
591 var title = go.transform.Find("Window Title Bar");
592
593 if (title)
594 {
595 title.GetComponent<Image>().color =
596 saveButton.GetComponent<Image>().color;
597 title.GetComponentInChildren<Text>().color =
598 saveButton.GetComponentInChildren<Text>().color;
599 }
600
601#if DANA
602 var chelperIn = GameObject.Find("CHelper_in").GetComponent<Image>();
603 var chelperOut = GameObject.Find("CHelper_out").GetComponent<Image>();
604 Sprite InSprite = Resources.Load<Sprite>("InPut");//(Sprite)AssetDatabase.LoadAssetAtPath("Assets/Textures/UI/Actions/InPut.png", typeof(Sprite));
605 Sprite InSpriteBlue = Resources.Load<Sprite>("InPut_blue");//(Sprite)AssetDatabase.LoadAssetAtPath("Assets/Textures/UI/Actions/InPut_blue.png", typeof(Sprite));
606 Sprite OutSprite = Resources.Load<Sprite>("OutPut");//(Sprite)AssetDatabase.LoadAssetAtPath("Assets/Textures/UI/Actions/OutPut.png", typeof(Sprite));
607 Sprite OutSpriteBlue = Resources.Load<Sprite>("OutPut_blue");//(Sprite)AssetDatabase.LoadAssetAtPath("Assets/Textures/UI/Actions/OutPut_blue.png", typeof(Sprite));
608 foreach (var inPut in go.GetComponent<ActionObject>().inPuts)
609 {
610 inPut.GetComponent<RectTransform>().sizeDelta = new Vector2(30f, 50f);
611 var xPos = inPut.GetComponent<RectTransform>().localPosition.x;
612 var yPos = inPut.GetComponent<RectTransform>().localPosition.y;
613 var zPos = inPut.GetComponent<RectTransform>().localPosition.z;
614 xPos = inPut.GetComponent<RectTransform>().localPosition.x - 15.0f;
615 inPut.GetComponent<RectTransform>().localPosition = new Vector3(xPos, yPos, zPos);
616 var img = inPut.GetComponent<Image>();
617 Color imgColor = img.color;
618 Color otherColor = new Color(0f, 202f / 255f, 222f / 255f);
619 if (imgColor.Equals(otherColor))
620 {
621 img.sprite = InSpriteBlue;
622 img.color = Color.white;
623 }
624 else
625 {
626 img.sprite = InSprite;
627 }
628
629 }
630
631 foreach (var outPut in go.GetComponent<ActionObject>().outPuts)
632 {
633 outPut.GetComponent<RectTransform>().sizeDelta = new Vector2(30f, 50f);
634 var xPos = outPut.GetComponent<RectTransform>().localPosition.x;
635 var yPos = outPut.GetComponent<RectTransform>().localPosition.y;
636 var zPos = outPut.GetComponent<RectTransform>().localPosition.z;
637 xPos = outPut.GetComponent<RectTransform>().localPosition.x + 15.0f;
638 outPut.GetComponent<RectTransform>().localPosition = new Vector3(xPos, yPos, zPos);
639 var img = outPut.GetComponent<Image>();
640 Color imgColor = img.color;
641 Color otherColor = new Color(0f, 202f / 255f, 222f / 255f);
642 if (imgColor.Equals(otherColor))
643 {
644 img.sprite = OutSpriteBlue;
645 img.color = Color.white;
646 }
647 else
648 {
649 img.sprite = OutSprite;
650 }
651 }
652#endif
653
654#if UNITY_WEBGL
655 var chelperIn = GameObject.Find("CHelper_in").GetComponent<Image>();
656 var chelperOut = GameObject.Find("CHelper_out").GetComponent<Image>();
657 foreach (var inPut in go.GetComponent<ActionObject>().inPuts)
658 {
659 var img = inPut.GetComponent<Image>();
660 img.sprite = chelperIn.sprite;
661 }
662 foreach (var outPut in go.GetComponent<ActionObject>().outPuts)
663 {
664 var img = outPut.GetComponent<Image>();
665 img.sprite = chelperOut.sprite;
666 }
667#endif
668 var buttons = go.transform.GetComponentsInChildren<Button>();
669
670 foreach (var button in buttons)
671 {
672 if (!button)
673 continue;
674
675 if (button.name == "Remove" || button.name == "Minimize")
676 continue;
677
678 if (!button.gameObject.GetComponent<Image>())
679 continue;
680
681 button.gameObject.GetComponent<Image>().color = saveButton.GetComponent<Image>().color;
682#if DANA
683 if (!button.gameObject.GetComponent<Image>().sprite.name.Contains("Audio"))
684 {
685 button.gameObject.GetComponent<Image>().sprite = saveButton.GetComponent<Image>().sprite;
686 button.gameObject.GetComponent<Image>().pixelsPerUnitMultiplier = 3;
687 }
688#endif
689
690 if (!button.gameObject.GetComponentInChildren<Text>())
691 continue;
692
693 button.gameObject.GetComponentInChildren<Text>().color =
694 saveButton.GetComponentInChildren<Text>().color;
695 }
696 }
697 catch (Exception)
698 {
699 // ignored
700 }
701
703 return go;
704 }
705
706 public void AddAction(GameObject obj)
707 {
708 AddAction(obj, "");
709 }
710
711 public void AddAction()
712 {
713 var go = Instantiate(prefab, UIParent.transform);
714 go.name = Guid.NewGuid().ToString();
715
716 actions.Add(go.name, go.GetComponent<ActionObject>());
717 }
718
719 public void ClearAll()
720 {
721 var actionObjects = actions.ToArray();
722 foreach (var o in actionObjects) RemoveAction(o.Key);
723 actions.Clear();
724 connections.Clear();
725 }
726
727 public void RemoveAction(string id)
728 {
729 //Remove Line GameObjects
730 try
731 {
732 foreach (var item in GetConnectionsToObject(id)) RemoveConnection(item);
733 }
734 catch (NullReferenceException)
735 {
736 // ignored
737 }
738
739 //Remove Action GameObject
740 try
741 {
742 Destroy/*Immediate*/(actions[id].gameObject);
743
744 //Remove Action object
745 actions.Remove(id);
746 }
747 catch (NullReferenceException)
748 {
749 // ignored
750 }
751 }
752
753 public void StartConnection(string outputID, string actionID)
754 {
755 LineDrawer.Instance.StartConnection(actions[actionID].GetOutput(outputID).GetComponent<RectTransform>(),
756 outputID, actions[actionID] is GameObjectAction);
757 currentOutput = actionID;
758 }
759
760 public void EndConnection(string inputID, string actionID)
761 {
762 var last = Input.GetKey(KeyCode.LeftAlt);
763 if (actions[actionID].LimitInputTypes())
764 {
765 var acceptedInput = actions[actionID].GetAcceptedInputTypes();
766 var outputType = actions[currentOutput].GetComponent<ActionObject>();
767 var done = false;
768
769 foreach (var type in acceptedInput)
770 if (type == outputType.GetType())
771 {
772 done = true;
773 var welder = actions[actionID] is WeldAction;
774 var input = actions[actionID].GetInput(inputID);
775 var firstInWelder = welder && !HasConnectionByEndpoint(actions[actionID].inPuts[0].name) &&
776 actions[actionID].inPuts[0] == input;
777
779 actions[actionID].GetInput(inputID).GetComponent<RectTransform>(),
780 inputID, firstInWelder));
781 break;
782 }
783
784 if (!done)
786 else
787 actions[actionID].InputAdded(inputID);
788 }
789 else
790 {
791 var welder = actions[actionID] is WeldAction;
792 //var list = GetConnectionsToObject(actionID);
793 var input = actions[actionID].GetInput(inputID);
794 var firstInWelder = welder && !HasConnectionByEndpoint(actions[actionID].inPuts[0].name) &&
795 actions[actionID].inPuts[0] == input;
796 if (last) firstInWelder = true;
797 var inCount = actions[actionID].inPuts.Count;
798 var lastInWelder = welder && !HasConnectionByEndpoint(actions[actionID].inPuts[inCount - 1].name) &&
799 actions[actionID].inPuts[inCount - 1] == input;
801 actions[actionID].GetInput(inputID).GetComponent<RectTransform>(),
802 inputID, firstInWelder));
803 actions[actionID].InputAdded(inputID);
804 }
805 }
806
807 public void EndConnection()
808 {
810 }
811
812 public void DragConnection(Vector2 position)
813 {
815 }
816
817 public void AddConnection(LineObject lineObj)
818 {
819 AddConnection(lineObj.startID, lineObj.endID, lineObj.id);
820 }
821
822 public void AddConnection(string from, string to, string connection)
823 {
824 var c = new Connection();
825 c.fromId = from;
826 c.toId = to;
827 c.connectionId = connection;
828
829 var last = Input.GetKey(KeyCode.LeftAlt);
830 if (last)
831 connections.Insert(0, new KeyValuePair<string, Connection>(connection, c));
832 else
833 connections.Add(new KeyValuePair<string, Connection>(connection, c));
834 }
835
836 public void RemoveConnection(string connectionId)
837 {
838 LineDrawer.Instance.RemoveLine(connectionId);
839 connections.RemoveAt(connections.IndexOf(connections.First(x => x.Key == connectionId)));
840 }
841
842 public void RemoveConnectionByEndPointId(string id)
843 {
844 var last = Input.GetKey(KeyCode.LeftAlt);
846 RemoveConnection(last ? connections.Where(x => x.Value.fromId.Equals(id) || x.Value.toId.Equals(id)).Last().Value
847 .connectionId : connections.Where(x => x.Value.fromId.Equals(id) || x.Value.toId.Equals(id)).First().Value
848 .connectionId);
849 }
850
851 public bool HasConnectionByEndpoint(string id)
852 {
853 return connections.Where(x => x.Value.fromId.Equals(id)).Count() +
854 connections.Where(x => x.Value.toId.Equals(id)).Count() > 0;
855 }
856
858 {
859 return connections.Where(x => x.Value.fromId.Equals(id) || x.Value.toId.Equals(id)).First().Value;
860 }
861
863 {
864 var retval = new List<Connection>();
865 connections.Where(x => x.Value.fromId.Equals(id) || x.Value.toId.Equals(id)).ToList()
866 .ForEach(x => retval.Add(x.Value));
867 return retval.ToArray();
868 }
869
870
872 {
873 return connections.First(x => x.Key.Equals(id)).Value;
874 }
875
876 public List<string> GetConnectionsToObject(string id)
877 {
878 var connectionIds = new List<string>();
879
880 foreach (var conn in connections)
881 if (actions[id].GetInputs().Contains(conn.Value.toId) ||
882 actions[id].GetOutputs().Contains(conn.Value.fromId))
883 connectionIds.Add(conn.Key);
884
885 return connectionIds;
886 }
887
888 public List<string> GetInputConnectionsToObject(string id)
889 {
890 var connectionIds = new List<string>();
891
892 foreach (var conn in connections)
893 if (actions[id].GetInputs().Contains(conn.Value.toId))
894 connectionIds.Add(conn.Key);
895
896 return connectionIds;
897 }
898
899 public List<string> GetOutputConnectionsToObject(string id)
900 {
901 var connectionIds = new List<string>();
902
903 foreach (var conn in connections)
904 if (actions[id].GetOutputs().Contains(conn.Value.fromId))
905 connectionIds.Add(conn.Key);
906
907 return connectionIds;
908 }
909
910 public void Trigger(string id)
911 {
912 foreach (var conn in connections.Where(x => x.Value.fromId.Equals(id))) OnTrigger?.Invoke(conn.Value.toId);
913 }
914
915 public void DirektTrigger(string id)
916 {
917 OnTrigger.Invoke(id);
918 }
919
920 public bool HasConnection(string id)
921 {
922 return connections.Any(x => x.Value.fromId.Equals(id));
923 }
924
926 {
927 return actions
928 .Where(x => x.Value.GetOutputs().Any(y => y.Equals(id)) || x.Value.GetInputs().Any(y => y.Equals(id)))
929 .First().Value;
930 }
931
932 public ActionObject GetActionByIn(string id)
933 {
934 return actions.First(x => x.Value.GetInputs().Any(y => y.Equals(id))).Value;
935 }
936
937 public ActionObject[] GetActionsByOut(string id)
938 {
939 var retval = new List<ActionObject>();
940 actions.Where(x => x.Value.GetOutputs().Any(y => y.Equals(id))).ToList().ForEach(x => retval.Add(x.Value));
941 return retval.ToArray();
942 }
943 public ActionObject[] GetActionsByIn(string id)
944 {
945 var retval = new List<ActionObject>();
946 actions.Where(x => x.Value.GetInputs().Any(y => y.Equals(id))).ToList().ForEach(x => retval.Add(x.Value));
947 return retval.ToArray();
948 }
949
950 public ActionObject GetActionById(string id)
951 {
952 return actions[id];
953 }
954
955 public void TOJson()
956 {
957 Debug.Log(JsonConvert.SerializeObject(actions));
958 }
959
960 public IEnumerator RestoreOnly()
961 {
962 var currentAction = FindObjectOfType<StartAction>();
963 if (currentAction)
964 {
965 LoadingManager.instance.SetLoading();
966 LoadingManager.instance.ShowWindow();
967 ClickedOn(currentAction.name);
968 while (fastForwarding)
969 {
970 yield return null;
971 }
972 LoadingManager.instance.HideWindow();
973 }
974 }
975 public void ClickedOn(string id)
976 {
977 if (Input.GetKey(KeyCode.LeftAlt))
978 {
979 var myAction = GetActionById(id);
980 if (myAction is MoveAction m) { m.GetInputGO(); m.FinalPosition(); }
981
982 if (myAction is HoldPositionAction hp) { hp.GetInputGO(); hp.FinalPosition(); }
983
984 if (myAction is PositionAction p) { p.GetInputGO(); p.FinalPosition(); }
985 return;
986 }
987 if (lastClickedOn == id)
988 return;
989 fastForwarding = true;
990 if (!isShiftKeyDown) StartCoroutine(SlowClickOn(id));
991 else
992 {
993 var myAction = GetActionById(id);
994 if (myAction is GameObjectAction gOA) pb_Selection.SetSelection(gOA.GetGameObject());
995 if (myAction is ToolAction tA)
996 {
997 var go = tA.GetGameObject();
998
999 if (go)
1001 }
1002 if (myAction is MoveAction m) m.FinalPosition();
1003
1004 if (myAction is HoldPositionAction hp) hp.FinalPosition();
1005
1006 if (myAction is PositionAction p) p.FinalPosition();
1007
1008 if (myAction is WeldAction w) w.Reparent();
1009
1010 if (myAction is ShowHideAction sh) sh.SetActualState();
1011
1012 fastForwarding = false;
1013 }
1014 }
1015
1016 private IEnumerator SlowClickOn(string id)
1017 {
1018 lastClickedOn = id;
1019
1020 var myaction = GetActionById(id);
1021 if (myaction is GameObjectAction goa) pb_Selection.SetSelection(goa.GetGameObject());
1022 if (myaction is ToolAction ta)
1023 {
1024 var go = ta.GetGameObject();
1025
1026 if (go)
1028 }
1029
1030 var currentAction = FindObjectOfType<StartAction>();
1031
1032 if (!currentAction)
1033 {
1034 fastForwarding = false;
1035 yield break;
1036 }
1037
1038 var actionList = BuildActionList(id);
1039 actionList.Reverse();
1040
1041 var allActionObject = FindObjectsOfType<ActionObject>();
1042 foreach (var o in allActionObject)
1043 {
1044 if (o is HoldPositionAction hp)
1045 {
1046 hp.StartPosition();
1047 continue;
1048 }
1049
1050 if (o is PositionAction p)
1051 {
1052 p.StartPosition();
1053 continue;
1054 }
1055
1056 if (o is MoveAction m)
1057 {
1058 m.StartPosition();
1059 continue;
1060 }
1061
1062 if (o is WeldAction w)
1063 {
1064 w.RestoreWeld();
1065 yield return null;
1066 continue;
1067 }
1068
1069 if (o is ShowHideAction sh) sh.RestoreOriginalState();
1070 }
1071
1072 foreach (var o in actionList)
1073 {
1074 if (o is MoveAction m) m.FinalPosition();
1075
1076 if (o is HoldPositionAction hp) hp.FinalPosition();
1077
1078 if (o is PositionAction p) p.FinalPosition();
1079
1080 if (o is WeldAction w) { w.Reparent(); yield return null; }
1081
1082 if (o is ShowHideAction sh) sh.SetActualState();
1083 }
1084
1085 //if (myaction is WeldAction wa)
1086 // { wa.Reparent(); yield return null; }
1087
1088 pb_Hierarchy.instance.RebuildInspector();
1089
1090 var selection = pb_Selection.activeGameObject;
1092 yield return null;
1093 pb_Selection.SetSelection(selection);
1094 fastForwarding = false;
1095 }
1096
1097 private List<ActionObject> BuildActionList(string id)
1098 {
1099 var myaction = GetActionById(id);
1100
1101 var actionList = new List<ActionObject>();
1102
1103 var action = myaction;
1104
1105 if (action is WeldAction) actionList.Add(action);
1106 if (action is PositionAction) actionList.Add(action);
1107 if (action is MoveAction) actionList.Add(action);
1108 if (action is ShowHideAction) actionList.Add(action);
1109
1110 var possibleSteps = new Queue<ActionObject>();
1111 do
1112 {
1113 if (possibleSteps.Count > 0) action = possibleSteps.Dequeue();
1114
1115 ActionObject lastAction = null;
1116 foreach (var inPut in action.inPuts)
1117 {
1118 if (HasConnectionByEndpoint(inPut.name))
1119 {
1120 var conns = GetConnectionsByEndPointId(inPut.name);
1121 foreach (var conn in conns)
1122 {
1123 var tmpaction = GetActionByInOut(conn.fromId);
1124
1125 if (lastAction != tmpaction)
1126 lastAction = tmpaction;
1127 else
1128 continue;
1129
1130 if (actionList.Contains(tmpaction) && tmpaction is WeldAction)
1131 {
1132 continue;
1133 }
1134
1135 if (tmpaction is WeldAction) actionList.Add(tmpaction);
1136 if (tmpaction is PositionAction) actionList.Add(tmpaction);
1137 if (tmpaction is MoveAction) actionList.Add(tmpaction);
1138 if (tmpaction is ShowHideAction) actionList.Add(tmpaction);
1139 possibleSteps.Enqueue(tmpaction);
1140 }
1141
1142 }
1143 }
1144 foreach (var outPut in action.outPuts)
1145 {
1146 if (HasConnectionByEndpoint(outPut.name))
1147 {
1148 var conns = GetConnectionsByEndPointId(outPut.name);
1149 foreach (var conn in conns)
1150 {
1151 var tmpaction = GetActionByInOut(conn.toId);
1152
1153 if (lastAction != tmpaction)
1154 lastAction = tmpaction;
1155 else
1156 continue;
1157
1158 if (actionList.Contains(tmpaction) && tmpaction is WeldAction)
1159 {
1160 continue;
1161 }
1162
1163 if (action == myaction) continue;
1164
1165 if (tmpaction is ShowHideAction) actionList.Add(tmpaction);
1166 }
1167
1168 }
1169 }
1170 if (possibleSteps.Count > 1000)
1171 {
1172 break;
1173 }
1174 } while (possibleSteps.Count > 0);
1175
1176
1177 return actionList;
1178 }
1179
1180 #region DEPRACATED
1181
1182 private List<ActionObject> BuildActionListForward(string id)
1183 {
1184 var myaction = GetActionById(id);
1185
1186 var actionList = new List<ActionObject>();
1187
1188 var action = myaction;
1189
1190
1191 var possibleSteps = new Queue<ActionObject>();
1192 do
1193 {
1194 if (possibleSteps.Count > 0) action = possibleSteps.Dequeue();
1195 foreach (var outPut in action.outPuts)
1196 if (HasConnectionByEndpoint(outPut.name))
1197 {
1198 var conn = GetConnectionByEndPointId(outPut.name);
1199 var tmpaction = GetActionByInOut(conn.toId);
1200
1201 if (tmpaction is WeldAction) actionList.Add(tmpaction);
1202 if (tmpaction is PositionAction) actionList.Add(tmpaction);
1203 if (tmpaction is MoveAction) actionList.Add(tmpaction);
1204 possibleSteps.Enqueue(tmpaction);
1205 }
1206 } while (possibleSteps.Count > 0);
1207
1208 return actionList;
1209 }
1210
1211 #endregion
1212
1213 void Update()
1214 {
1215 isShiftKeyDown = Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift);
1216 if (StageWindow.alpha < 0.5f) return;
1217 if (Input.GetMouseButtonUp(1) && FindObjectOfType<pb_StageManagerButton>().isOn)
1218 {
1219 if (!RectTransformUtility.RectangleContainsScreenPoint(StageWindow.GetComponent<RectTransform>(),
1220 Input.mousePosition)) return;
1221 rightClickMenu = true;
1222
1223 AddNodeDropdown.Show();
1224 var ddl = GameObject.Find("Dropdown List");
1225 if (ddl)
1226 if (RectTransformUtility.ScreenPointToWorldPointInRectangle(UIParent.transform as RectTransform,
1227 Input.mousePosition, null, out var pos))
1228 {
1229 rightClickPos = pos;
1230 ddl.transform.position =
1231 pos + Vector3.right * (AddNodeDropdown.transform as RectTransform).sizeDelta.x / 2;
1232 }
1233 else
1234 {
1235 AddNodeDropdown.Hide();
1236 rightClickMenu = false;
1237 }
1238 }
1239 else if (rightClickMenu && Input.GetMouseButtonUp(0))
1240 {
1241 rightClickMenu = false;
1242 }
1243 }
1244}
1245
1246[Serializable]
1247public class Connection
1248{
1249 public string fromId;
1250 public string toId;
1251 public string connectionId;
1252}
UnityEngine.UI.Button Button
Definition: Pointer.cs:7
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
System.Drawing.Image Image
Definition: TestScript.cs:37
UnityEngine.Color Color
Definition: TestScript.cs:32
List< GameObject > inPuts
Definition: ActionObject.cs:18
string comment
Definition: ActionObject.cs:34
List< GameObject > outPuts
Definition: ActionObject.cs:19
string connectionId
Definition: Controller.cs:1251
string fromId
Definition: Controller.cs:1249
string toId
Definition: Controller.cs:1250
List< string > GetConnectionsToObject(string id)
Definition: Controller.cs:876
ActionObject[] GetActionsByIn(string id)
Definition: Controller.cs:943
void LoadJson(Controller controller)
Definition: Controller.cs:79
void EndConnection()
Definition: Controller.cs:807
ActionObject[] GetActionsByOut(string id)
Definition: Controller.cs:937
Connection[] GetConnectionsByEndPointId(string id)
Definition: Controller.cs:862
IEnumerator RestoreOnly()
Definition: Controller.cs:960
void DragConnection(Vector2 position)
Definition: Controller.cs:812
GraphicRaycaster m_Raycaster
Definition: Controller.cs:36
List< string > GetOutputConnectionsToObject(string id)
Definition: Controller.cs:899
void AddAction()
Definition: Controller.cs:711
GameObject UIParent
Definition: Controller.cs:22
bool isLoading
Definition: Controller.cs:28
Connection GetConnectionByEndPointId(string id)
Definition: Controller.cs:857
ActionObject GetActionByIn(string id)
Definition: Controller.cs:932
void OnStageManagerToggle()
Definition: Controller.cs:539
void EndConnection(string inputID, string actionID)
Definition: Controller.cs:760
void RemoveConnection(string connectionId)
Definition: Controller.cs:836
void GetObjectData(SerializationInfo info, StreamingContext context)
Definition: Controller.cs:49
void AddConnection(LineObject lineObj)
Definition: Controller.cs:817
void DirektTrigger(string id)
Definition: Controller.cs:915
void ClearAll()
Definition: Controller.cs:719
bool HasConnectionByEndpoint(string id)
Definition: Controller.cs:851
delegate void TriggerHandler(string id)
Connection GetConnectionById(string id)
Definition: Controller.cs:871
void AddAction(GameObject obj)
Definition: Controller.cs:706
IEnumerator LoadControllerFromJSON(Controller controller)
Definition: Controller.cs:91
ActionObject GetActionByInOut(string id)
Definition: Controller.cs:925
ActionObject GetActionById(string id)
Definition: Controller.cs:950
bool onlyOneStartAction
Definition: Controller.cs:25
CanvasGroup StageWindow
Definition: Controller.cs:40
Controller(SerializationInfo info, StreamingContext context)
Definition: Controller.cs:57
EventSystem m_EventSystem
Definition: Controller.cs:38
GameObject AddAction(GameObject obj, string id)
Definition: Controller.cs:545
void RemoveConnectionByEndPointId(string id)
Definition: Controller.cs:842
List< string > GetInputConnectionsToObject(string id)
Definition: Controller.cs:888
void AddConnection(string from, string to, string connection)
Definition: Controller.cs:822
List< GameObject > actionPrefabs
Definition: Controller.cs:26
static Controller Instance
Definition: Controller.cs:16
GameObject prefab
Definition: Controller.cs:23
void StartConnection(string outputID, string actionID)
Definition: Controller.cs:753
bool HasConnection(string id)
Definition: Controller.cs:920
Dropdown AddNodeDropdown
Definition: Controller.cs:39
void Trigger(string id)
Definition: Controller.cs:910
void RemoveAction(string id)
Definition: Controller.cs:727
TriggerHandler OnTrigger
Definition: Controller.cs:20
void ClickedOn(string id)
Definition: Controller.cs:975
void TOJson()
Definition: Controller.cs:955
static void SetSelection(IEnumerable< GameObject > selection)
Definition: pb_Selection.cs:92
static void Clear()
Definition: pb_Selection.cs:61
static GameObject activeGameObject
Definition: pb_Selection.cs:82
static LineDrawer Instance
Definition: LineDrawer.cs:16
void DragConnection(Vector2 position)
Definition: LineDrawer.cs:316
LineObject EndConnection(RectTransform endRect, string inputID, bool weldParent=false)
Definition: LineDrawer.cs:284
void StartConnection(RectTransform startRect, string outputID, bool blue=false)
Definition: LineDrawer.cs:262
void RemoveLine(string lineId)
Definition: LineDrawer.cs:214
string startID
Definition: LineDrawer.cs:357
string endID
Definition: LineDrawer.cs:358
string id
Definition: LineDrawer.cs:355
static Localization_SOURCE Instance
void ReloadLanguage(GameObject onlyThis=null)
string GetInput()
Definition: WeldAction.cs:145