A game about forced loneliness, made by TACStudios
1using UnityEngine;
2using UnityEngine.UI;
3using System.Collections;
4using TMPro;
5using UnityEngine.SceneManagement;
6
7public class InteractableText : MonoBehaviour
8{
9 [Header("Interactable Settings")]
10 public string interactableName;
11 [Header("Text Settings")]
12 public string[] day1Text;
13 public string[] day2Text;
14 public string[] day3Text;
15 public string[] day4Text;
16 public string[] day5Text;
17
18 public string[] notYetText;
19 public string[] doesntMatter;
20 public PlayerStats player;
21
22 public GameObject interactIcon;
23 public Image textBox;
24
25 public bool canInteract = false;
26 public movement movement;
27
28 public ProgressTracker progressTracker;
29
30 public float characterDisplaySpeed = 0.05f;
31
32 public GameObject tableSecond;
33
34 public GameObject bedSecond;
35
36 public GameObject wallGraphic;
37
38 public GameObject choice1;
39
40 public GameObject drownChoice;
41
42 public FadeScript fadeScript;
43
44 public dayIntro dayIntro;
45
46 public bool skipTyping = false;
47 public bool isTyping = false;
48
49
50
51 private void Update()
52 {
53 Inputs();
54
55 if (Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0))
56 {
57 if (isTyping)
58 {
59 skipTyping = true;
60 }
61 }
62 }
63 private void Inputs()
64 {
65 if (Input.GetKeyDown(KeyCode.E) && canInteract && !movement.movementDisabled)
66 {
67 CheckTextToUse(interactableName);
68 }
69 }
70
71 private void CheckTextToUse(string interactableName)
72 {
73 switch (interactableName)
74 {
75 case "Mirror":
76 switch (player.dayNumber)
77 {
78 case 1:
79 ShowDialogue(day1Text);
80 interactIcon.SetActive(false);
81 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
82 progressTracker.interactedWithToday++;
83 break;
84 case 2:
85 ShowDialogue(day2Text);
86 interactIcon.SetActive(false);
87 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
88 progressTracker.interactedWithToday++;
89 break;
90 case 3:
91 ShowDialogue(day3Text);
92 interactIcon.SetActive(false);
93 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
94 progressTracker.interactedWithToday++;
95 break;
96 case 4:
97 if (progressTracker.gotFood)
98 {
99 ShowDialogue(doesntMatter);
100 }
101 else
102 {
103 ShowDialogue(notYetText);
104 }
105 break;
106 }
107 break;
108 case "Sink":
109 switch (player.dayNumber)
110 {
111 case 1:
112 ShowDialogue(day1Text);
113 interactIcon.SetActive(false);
114 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
115 progressTracker.interactedWithToday++;
116 break;
117 case 2:
118 ShowDialogue(day2Text);
119 interactIcon.SetActive(false);
120 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
121 progressTracker.interactedWithToday++;
122 break;
123 case 3:
124 ShowDialogue(day3Text);
125 interactIcon.SetActive(false);
126 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
127 progressTracker.interactedWithToday++;
128 break;
129 case 4:
130 if (progressTracker.gotFood)
131 {
132 ShowDialogue(day4Text);
133 interactIcon.SetActive(false);
134 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
135 progressTracker.drown = true;
136 break;
137 }
138 else
139 {
140 ShowDialogue(notYetText);
141 }
142 break;
143 }
144 break;
145 case "Doors":
146 switch (player.dayNumber)
147 {
148 case 1:
149 ShowDialogue(day1Text);
150 interactIcon.SetActive(false);
151 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
152 progressTracker.interactedWithToday++;
153 break;
154 case 2:
155 ShowDialogue(day2Text);
156 interactIcon.SetActive(false);
157 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
158 progressTracker.interactedWithToday++;
159 break;
160 case 3:
161 ShowDialogue(day3Text);
162 interactIcon.SetActive(false);
163 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
164 progressTracker.interactedWithToday++;
165 break;
166 case 4:
167 if (progressTracker.gotFood)
168 {
169 ShowDialogue(doesntMatter);
170 }
171 else
172 {
173 ShowDialogue(notYetText);
174 }
175 break;
176 }
177 break;
178 case "Bed":
179 switch (player.dayNumber)
180 {
181 case 1:
182 ShowDialogue(day1Text);
183 interactIcon.SetActive(false);
184 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
185 progressTracker.interactedWithToday++;
186 progressTracker.interactedWithBed = true;
187 break;
188 case 2:
189 ShowDialogue(day2Text);
190 interactIcon.SetActive(false);
191 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
192 progressTracker.interactedWithToday++;
193 progressTracker.interactedWithBed = true;
194 break;
195 case 3:
196 ShowDialogue(day3Text);
197 interactIcon.SetActive(false);
198 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
199 progressTracker.interactedWithToday++;
200 progressTracker.interactedWithBed = true;
201 break;
202 case 4:
203 if (progressTracker.gotFood)
204 {
205 StartCoroutine(SendToPreCreds());
206 }
207 else
208 {
209 ShowDialogue(notYetText);
210 }
211 break;
212 }
213 break;
214 case "BedSecond":
215 switch (player.dayNumber)
216 {
217 case 1:
218 ShowDialogue(day1Text);
219 interactIcon.SetActive(false);
220 break;
221 case 2:
222 ShowDialogue(day2Text);
223 interactIcon.SetActive(false);
224 break;
225 case 3:
226 ShowDialogue(day3Text);
227 interactIcon.SetActive(false);
228 break;
229 case 4:
230 if (progressTracker.gotFood)
231 {
232 ShowDialogue(doesntMatter);
233 }
234 else
235 {
236 ShowDialogue(notYetText);
237 }
238 break;
239 }
240 break;
241 case "BedThird":
242 switch (player.dayNumber)
243 {
244 case 1:
245 ShowDialogue(day1Text);
246 interactIcon.SetActive(false);
247 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
248 progressTracker.interactedWithToday++;
249 break;
250 case 2:
251 ShowDialogue(day2Text);
252 interactIcon.SetActive(false);
253 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
254 progressTracker.interactedWithToday++;
255 break;
256 case 3:
257 ShowDialogue(day3Text);
258 interactIcon.SetActive(false);
259 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
260 progressTracker.interactedWithToday++;
261 break;
262 case 4:
263 if (progressTracker.gotFood)
264 {
265 ShowDialogue(doesntMatter);
266 }
267 else
268 {
269 ShowDialogue(notYetText);
270 }
271 break;
272 }
273 break;
274 case "Table":
275 switch (player.dayNumber)
276 {
277 case 1:
278 ShowDialogue(day1Text);
279 interactIcon.SetActive(false);
280 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
281 progressTracker.interactedWithToday++;
282 progressTracker.interactedWithTable = true;
283 break;
284 case 2:
285 ShowDialogue(day2Text);
286 interactIcon.SetActive(false);
287 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
288 progressTracker.interactedWithToday++;
289 progressTracker.interactedWithTable = true;
290 break;
291 case 3:
292 ShowDialogue(day3Text);
293 interactIcon.SetActive(false);
294 gameObject.GetComponent<Collider2D>().enabled = false; // Disable collider to prevent further interaction
295 progressTracker.interactedWithToday++;
296 progressTracker.interactedWithTable = true;
297 break;
298 case 4:
299 if (progressTracker.gotFood)
300 {
301 ShowDialogue(doesntMatter);
302 }
303 else
304 {
305 ShowDialogue(notYetText);
306 }
307 break;
308 }
309 break;
310 case "Wall":
311 switch (player.dayNumber)
312 {
313 case 1:
314 ShowDialogue(day1Text);
315 interactIcon.SetActive(false);
316 gameObject.GetComponent<Collider2D>().enabled = false;
317 progressTracker.interactedWithToday++;
318 break;
319 case 2:
320 ShowDialogue(day2Text);
321 progressTracker.hasInteractedWithDay2Wall = true;
322 wallGraphic.SetActive(true);
323 interactIcon.SetActive(false);
324 gameObject.GetComponent<Collider2D>().enabled = false;
325 progressTracker.interactedWithToday++;
326 break;
327 case 3:
328 ShowDialogue(day3Text);
329 interactIcon.SetActive(false);
330 gameObject.GetComponent<Collider2D>().enabled = false;
331 progressTracker.interactedWithToday++;
332 break;
333 case 4:
334 if (progressTracker.gotFood)
335 {
336 ShowDialogue(doesntMatter);
337 }
338 else
339 {
340 ShowDialogue(notYetText);
341 }
342 break;
343 }
344 break;
345 case "TableSecond":
346 switch (player.dayNumber)
347 {
348 case 1:
349 ShowDialogue(day1Text);
350 interactIcon.SetActive(false);
351 gameObject.GetComponent<Collider2D>().enabled = false;
352 progressTracker.interactedWithToday++;
353 break;
354 case 2:
355 ShowDialogue(day2Text);
356 interactIcon.SetActive(false);
357 gameObject.GetComponent<Collider2D>().enabled = false;
358 progressTracker.interactedWithToday++;
359 break;
360 case 3:
361 ShowDialogue(day3Text);
362 interactIcon.SetActive(false);
363 gameObject.GetComponent<Collider2D>().enabled = false;
364 progressTracker.interactedWithToday++;
365 break;
366 case 4:
367 if (progressTracker.gotFood)
368 {
369 ShowDialogue(doesntMatter);
370 }
371 else
372 {
373 ShowDialogue(notYetText);
374 }
375 break;
376 }
377 break;
378 case "Food":
379 switch (player.dayNumber)
380 {
381 case 1:
382 ShowDialogue(day1Text);
383 interactIcon.SetActive(false);
384 gameObject.GetComponent<SpriteRenderer>().sortingOrder = -10;
385 gameObject.GetComponent<Collider2D>().enabled = false;
386 progressTracker.interactedWithToday++;
387 progressTracker.gotFood = true;
388 break;
389 case 2:
390 ShowDialogue(day2Text);
391 interactIcon.SetActive(false);
392 gameObject.GetComponent<SpriteRenderer>().sortingOrder = -10;
393 gameObject.GetComponent<Collider2D>().enabled = false;
394 progressTracker.interactedWithToday++;
395 progressTracker.gotFood = true;
396 break;
397 case 3:
398 ShowDialogue(day3Text);
399 interactIcon.SetActive(false);
400 gameObject.GetComponent<SpriteRenderer>().sortingOrder = -10;
401 gameObject.GetComponent<Collider2D>().enabled = false;
402 progressTracker.interactedWithToday++;
403 progressTracker.gotFood = true;
404 break;
405 case 4:
406 ShowDialogue(day4Text);
407 interactIcon.SetActive(false);
408 gameObject.GetComponent<SpriteRenderer>().sortingOrder = -10;
409 gameObject.GetComponent<Collider2D>().enabled = false;
410 progressTracker.interactedWithToday++;
411 progressTracker.gotFood = true;
412 progressTracker.interactedWithDay4Food = true;
413 break;
414 }
415 break;
416 }
417 }
418
419 public IEnumerator SendToPreCreds()
420 {
421 fadeScript.FadeIn();
422 yield return new WaitForSecondsRealtime(1f);
423 SceneManager.LoadScene("BeforeCredits");
424 }
425
426 public void ShowDialogue(string[] dialogueLines)
427 {
428 StartCoroutine(DialogueCoroutine(dialogueLines));
429 }
430
431 private void DayEnd()
432 {
433 dayIntro.dayText.text = "";
434 fadeScript.FadeIn(true);
435 }
436
437 private IEnumerator DialogueCoroutine(string[] dialogueLines)
438 {
439 movement.movementDisabled = true;
440 textBox.gameObject.SetActive(true);
441 TMP_Text uiText = textBox.GetComponentInChildren<TMP_Text>();
442 int currentLine = 0;
443
444 while (currentLine < dialogueLines.Length)
445 {
446 isTyping = true;
447 uiText.text = "";
448 string line = dialogueLines[currentLine];
449
450 foreach (char c in line)
451 {
452 if (skipTyping)
453 {
454 uiText.text = line;
455 break;
456 }
457 uiText.text += c;
458 yield return new WaitForSeconds(characterDisplaySpeed);
459 }
460
461 isTyping = false;
462 skipTyping = false;
463 bool nextLine = false;
464 while (!nextLine)
465 {
466 if ((Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)))
467 {
468 if (isTyping)
469 skipTyping = true;
470 else
471 nextLine = true;
472 }
473 yield return null;
474 }
475 currentLine++;
476 }
477
478 textBox.gameObject.SetActive(false);
479 movement.movementDisabled = false;
480
481 if (progressTracker.dayHasEnded)
482 {
483 DayEnd();
484 }
485
486 if (progressTracker.hasInteractedWithDay2Wall && player.dayNumber == 2)
487 {
488 progressTracker.SetName();
489 progressTracker.hasInteractedWithDay2Wall = false;
490 }
491
492 if (progressTracker.playerName != "" && player.dayNumber == 2)
493 {
494 wallGraphic.SetActive(false);
495 }
496
497 if (progressTracker.interactedWithDay4Food && player.dayNumber == 4)
498 {
499 choice1.SetActive(true);
500 movement.movementDisabled = true;
501 }
502
503 if (progressTracker.drown)
504 {
505 drownChoice.SetActive(true);
506 }
507 }
508
509 private void OnTriggerEnter2D(Collider2D other)
510 {
511 if (other.CompareTag("Player"))
512 {
513 interactIcon.SetActive(true);
514 canInteract = true;
515 }
516 }
517
518 private void OnTriggerExit2D(Collider2D collision)
519 {
520 if (collision.CompareTag("Player"))
521 {
522 interactIcon.SetActive(false);
523 canInteract = false;
524 }
525 }
526}