Tanoda
FinishAction.cs
Go to the documentation of this file.
1using NaughtyAttributes;
2using System;
3using System.Collections;
4using System.Globalization;
5using System.Linq;
6using System.Runtime.Serialization;
7using UnityEngine;
8using UnityEngine.UI;
9
10public class FinishAction : ActionObject, ISerializable
11{
12 [HorizontalLine] public bool Failed;
13 public bool FailAfter;
14 public float Timer;
15
16 internal bool AlwaysFail;
17 public Text currTime;
18 public Toggle alwaysFailToggle;
19 public InputField inputTime;
20 [SerializeField] internal float failTime;
21
22 public void OnValueChanged(bool value)
23 {
24 FailAfter = value;
25 }
26
27 public void OnAlwaysFailChanged(bool value)
28 {
29 AlwaysFail = value;
30 }
31
32 public void StartTimer()
33 {
34 Failed = false;
35 Timer = 0.0f;
36 IsCounting = true;
37 }
38
39 new void Start()
40 {
41 base.Start();
42 alwaysFailToggle.isOn = AlwaysFail;
43 }
44
45 new void Update()
46 {
47 if (IsCounting) Timer += Time.deltaTime;
48
49 var cg = GetComponentInParent<CanvasGroup>();
50
51 if (cg.alpha != 0)
52 {
53 currTime.text = Mathf.FloorToInt(Timer / 60).ToString("D2") + ":" +
54 (Timer % 60).ToString("00.00").Replace(',', '.');
55 }
56 if (!Failed && FailAfter && Timer > failTime)
57 {
58 Failed = true;
59 MiscLogicManager.instance.LevelFailed(Timer);
60 SavedUser.instance.LevelFinished(false, Timer, HandStatistics.instance.GetPercent());
61 }
62 }
63
64 public override void Triggered(string id)
65 {
66 if (!IsCounting) return;
68 base.Triggered(id);
69 ConveyorBeltManager.instance.started = false;
70 TriggerOutput(AlwaysFail || Failed ? outPuts[1].name : outPuts[0].name);
71 if (SavedUser.instance.courseType == SavedUser.CourseType.Quality)
72 {
73 if (AlwaysFail || Failed)
74 {
75 MiscLogicManager.instance.LevelFailed(Timer);
76 SavedUser.instance.LevelFinished(false, Timer, HandStatistics.instance.GetPercent());
77 return;
78 }
79 SavedUser.instance.loopCount++;
80 if (SavedUser.instance.loopCount >= ConveyorBeltManager.instance.repeatTimes)
81 {
82 SavedUser.instance.LevelFinished(true, Timer, HandStatistics.instance.GetPercent());
83
84 IsCounting = false;
85 ReplayLogic.instance.StageStarted = false;
86 HandStatistics.instance.StopCollecting();
87 var allFinish2 = FindObjectsOfType<FinishAction>();
88 foreach (var fa in allFinish2) fa.IsCounting = false;
89
90 SavedUser.instance.loopCount = 0;
91
92 return;
93 }
95 return;
96 }
97 var actions = Controller.Instance.actions;
98 foreach (var action in actions)
99 {
100 if (action.Value.taktTime > 0 && action.Value.taktTime < action.Value.spentTimeOnAction)
101 {
103 {
104 FailedTakt = true;
105 }
106
107 #if DANA
108
109#endif
110
111 }
112 }
113 if (!Failed && !AlwaysFail && !FailedTakt)
114 {
115 SavedUser.instance.LevelFinished(true, Timer, HandStatistics.instance.GetPercent());
116#if DANA
117 StartCoroutine(WaitAFrame());
118#endif
119
120 }
121 else if (AlwaysFail || FailedTakt)
122 {
123 MiscLogicManager.instance.LevelFailed(Timer);
124 SavedUser.instance.LevelFinished(false, Timer, HandStatistics.instance.GetPercent());
125 }
126
127 IsCounting = false;
128 ReplayLogic.instance.StageStarted = false;
129 HandStatistics.instance.StopCollecting();
130 var allFinish = FindObjectsOfType<FinishAction>();
131 foreach (var fa in allFinish) fa.IsCounting = false;
132 if (SavedUser.instance.courseType == SavedUser.CourseType.Dobot)
133 {
134 if (!System.IO.File.Exists(SavedUser.instance.levelName + ".xml"))
135 {
136 FindObjectOfType<SolveIK>()?.SavePosition();
137 FindObjectOfType<SolveIK>()?.SavePositionsToFile();
138 }
139 }
140 }
141 public IEnumerator WaitAFrame()
142 {
143 yield return null;
144#if DANA
145 {
146 try
147 {
148 UserStatManager.Instance.GetStats(SavedUser.instance.currentUser.Value, out var collectedTimes, out var collectedAllTimes, out var recognitionList, out var timeSpendList, out var penaltyList);
149 float bestTime = collectedAllTimes.Min();
150 float myBestTime;
151 //float focus = ((timeSpendList.Sum() - recognitionList.Sum()) / timeSpendList.Sum()) * 100;
152 float focus = ((UserStatManager.instance.TimeSpendList.Sum() - UserStatManager.instance.RecognitionList.Sum()) / UserStatManager.instance.TimeSpendList.Sum()) * 100;
153 //float accuracy = ((Timer - PenaltyCounter.Instance.penaltyTime) / Timer) * 100;
154 float accuracy = ((Timer -UserStatManager.instance.PenaltyList.Sum()) / Timer) * 100;
155 float overallPer = (focus + accuracy) / 2;
156 if (collectedTimes.Count() == 0)
157 {
158 myBestTime = Timer;
159 }
160 else
161 {
162 if (Timer <= collectedTimes.Min())
163 {
164 myBestTime = Timer;
165 }
166 else
167 {
168 myBestTime = collectedTimes.Min();
169 }
170
171 }
172 float averageTime = collectedAllTimes.Average();
173 MiscLogicManager.instance.LevelEnded(Timer, accuracy, focus, overallPer);
174 Debug.Log("FinishAction" + "\n" + " RecognitionFull: " + Mathf.FloorToInt(UserStatManager.instance.RecognitionList.Sum() / 60).ToString("D2") + ":" + (UserStatManager.instance.RecognitionList.Sum() % 60).ToString("00.00").Replace(',', '.') +
175 "\n" + "TimeOnActionFull: " + Mathf.FloorToInt(UserStatManager.instance.TimeSpendList.Sum() / 60).ToString("D2") + ":" + (UserStatManager.instance.TimeSpendList.Sum() % 60).ToString("00.00").Replace(',', '.') +
176 "\n" + " PenaltyFull: " + Mathf.FloorToInt(UserStatManager.instance.PenaltyList.Sum() / 60).ToString("D2") + ":" + (UserStatManager.instance.PenaltyList.Sum() % 60).ToString("00.00").Replace(',', '.') + "\n"
177 + "Timer: " +Mathf.FloorToInt(Timer / 60).ToString("D2") + ":" + (Timer % 60).ToString("00.00").Replace(',', '.'));
178 }
179 catch (Exception e)
180 {
181
182 Debug.LogError(e);
183 MiscLogicManager.instance.LevelEnded(Timer, 0, 0, 0);
184 }
185 }
186#endif
187 }
188 public void InputEnded(string input)
189 {
190 if (input == "")
191 {
192 failTime = 0;
193 return;
194 }
195
196 var ci = CultureInfo.CurrentCulture;
197 var nfi = ci.NumberFormat;
198 input = input.Replace(',', nfi.CurrencyDecimalSeparator[0]);
199 input = input.Replace('.', nfi.CurrencyDecimalSeparator[0]);
200 inputTime.text = input;
201 if (input.Contains(":"))
202 {
203 var first = input.Split(':');
204 failTime = int.Parse(first[0]) * 60;
205 failTime += float.Parse(first[1]);
206 }
207 else
208 {
209 failTime = float.Parse(input);
210 }
211
212 inputTime.text = Mathf.FloorToInt(failTime / 60).ToString("D2") + ":" +
213 (failTime % 60).ToString("00.00").Replace(',', '.');
214 }
215
216
217 public new void GetObjectData(SerializationInfo info, StreamingContext context)
218 {
219 base.GetObjectData(info, context);
220 info.AddValue("FailAfter", FailAfter, typeof(bool));
221 info.AddValue("AlwaysFail", AlwaysFail, typeof(bool));
222 info.AddValue("failTime", failTime, typeof(float));
223 }
224
225 public FinishAction(SerializationInfo info, StreamingContext context) : base(info, context)
226 {
227 FailAfter = info.GetBoolean("FailAfter");
228 failTime = info.GetSingle("failTime");
229 try
230 {
231 AlwaysFail = info.GetBoolean("AlwaysFail");
232 }
233 catch (Exception)
234 {
235 // ignore, old save
236 }
237 }
238}
UnityEngine.Debug Debug
Definition: TanodaServer.cs:19
void TriggerOutput(string id)
string action
Definition: ActionObject.cs:32
List< GameObject > outPuts
Definition: ActionObject.cs:19
static Controller Instance
Definition: Controller.cs:16
override void Triggered(string id)
Definition: FinishAction.cs:64
void OnValueChanged(bool value)
Definition: FinishAction.cs:22
FinishAction(SerializationInfo info, StreamingContext context)
Toggle alwaysFailToggle
Definition: FinishAction.cs:18
void InputEnded(string input)
void OnAlwaysFailChanged(bool value)
Definition: FinishAction.cs:27
InputField inputTime
Definition: FinishAction.cs:19
void StartTimer()
Definition: FinishAction.cs:32
new void GetObjectData(SerializationInfo info, StreamingContext context)
IEnumerator WaitAFrame()
void StopFollowing()
Definition: FollowMe.cs:28
static FollowMe Instance
Definition: FollowMe.cs:19
void GetStats(UserManager.User user, out IEnumerable< float > notzerotimes, out IEnumerable< float > notzerotimesAll, out List< float > recognitionList, out List< float > timeSpendList, out List< float > penaltyList)
static UserStatManager Instance