Files
HauntedBloodlines/Assets/Scripts/Puzzles/RedGreenLightPuzzle/TrafficLightsPuzzleController.cs
2025-05-29 22:31:40 +03:00

211 lines
6.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class TrafficLightsPuzzleController : MonoBehaviour
{
public Transform medeaTrafficLightsStartPos;
public bool lightsAreGreenOnStart;
public bool useOrangeLight; // New optional orange light setting
public float greenLightsTimerMin = 1f;
public float greenLightsTimerMax = 1.5f;
public float redLightsTimerMin = 1f;
public float redLightsTimerMax = 1.5f;
public float orangeLightsTimerMin = 0.5f; // Shorter transition time
public float orangeLightsTimerMax = 0.7f;
public List<ChangeLightColour> changeLightColourToGreen;
public List<ChangeLightColour> changeLightColourToRed;
public List<ChangeLightColour> changeLightColourToDefault;
public List<ChangeLightColour> changeLightColourToOrange; // Added for orange light
public EventTrigger OrangeLightEvent;
private bool orangleLightEventExecuted;
public bool sanityShouldBeDecreasingWhileInPuzzle;
public GameObject lightsGroupWithSanity;
private SanityActivation[] sanity;
private static TrafficLightsPuzzleController _instance;
public static TrafficLightsPuzzleController GetInstance() { return _instance; }
void Awake()
{
if (!_instance)
{
_instance = this;
}
}
private void Start()
{
if (lightsAreGreenOnStart)
{
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreGreen = true;
}
if (sanityShouldBeDecreasingWhileInPuzzle)
{
sanity = lightsGroupWithSanity.GetComponentsInChildren<SanityActivation>();
}
}
private void SanityEnable()
{
if (sanityShouldBeDecreasingWhileInPuzzle)
{
foreach (var _sanity in sanity)
{
_sanity.EnableSanityTrigger();
}
}
}
private void SanityDisable()
{
if (sanityShouldBeDecreasingWhileInPuzzle)
{
foreach (var _sanity in sanity)
{
_sanity.DisableSanityTrigger();
}
}
}
public void StartRedTrafficLights()
{
print("Started red traffic lights");
PuzzlesManager.GetInstance().trafficLightsPuzzleData.medeaTrafficLightsStartPos = medeaTrafficLightsStartPos;
StartCoroutine(LightsAreRed());
SanityDisable();
}
public void StartGreenTrafficLights()
{
PuzzlesManager.GetInstance().trafficLightsPuzzleData.medeaTrafficLightsStartPos = medeaTrafficLightsStartPos;
StartCoroutine(LightsAreGreen());
SanityDisable();
}
public void StopTrafficLights()
{
StopAllCoroutines();
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreGreen = true;
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreOrange = false;
ChangeLampLightColorToDefault();
SanityEnable();
if (MedeaDemonicEnemyBehaviour.GetInstance() != null)
{
MedeaDemonicEnemyBehaviour.GetInstance().TrafficLightPuzzleSolved();
}
}
IEnumerator LightsAreGreen()
{
print("Lights Are Green Coroutine runs");
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreGreen = true;
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreOrange = false;
ChangeLampLightColorToGreen();
float waitTime = Random.Range(greenLightsTimerMin, greenLightsTimerMax);
Debug.Log("Wait time for green light is: " + waitTime);
yield return new WaitForSeconds(waitTime);
if (useOrangeLight)
{
StartCoroutine(LightsAreOrange(false)); // Transition from green to red
}
else
{
StartCoroutine(LightsAreRed());
}
}
IEnumerator LightsAreRed()
{
print("Lights Are Red Coroutine runs");
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreGreen = false;
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreOrange = false;
ChangeLampLightColorToRed();
float waitTime = Random.Range(redLightsTimerMin, redLightsTimerMax);
Debug.Log("Wait time for red light is: " + waitTime);
yield return new WaitForSeconds(waitTime);
if (useOrangeLight)
{
StartCoroutine(LightsAreOrange(true)); // Transition from red to green
}
else
{
StartCoroutine(LightsAreGreen());
}
}
IEnumerator LightsAreOrange(bool transitioningToGreen)
{
print("Lights Are Orange Coroutine runs");
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreGreen = false;
PuzzlesManager.GetInstance().trafficLightsPuzzleData.lightsAreOrange = true;
ChangeLampLightColorToOrange();
float waitTime = Random.Range(orangeLightsTimerMin, orangeLightsTimerMax);
Debug.Log("Wait time for orange light is: " + waitTime);
if (OrangeLightEvent != null)
{
if (orangleLightEventExecuted == false)
{
OrangeLightEvent.Invoke();
orangleLightEventExecuted = true;
}
}
yield return new WaitForSeconds(waitTime);
orangleLightEventExecuted = false;
if (transitioningToGreen)
{
StartCoroutine(LightsAreGreen());
}
else
{
StartCoroutine(LightsAreRed());
}
}
public void ChangeLampLightColorToGreen()
{
foreach (var _changeLightColourToGreen in changeLightColourToGreen)
{
_changeLightColourToGreen.ChangeColour();
print("Changing lamp renderers to Green");
}
}
public void ChangeLampLightColorToRed()
{
foreach (var _changeLightColourToRed in changeLightColourToRed)
{
_changeLightColourToRed.ChangeColour();
print("Changing lamp renderers to Red");
}
}
public void ChangeLampLightColorToDefault()
{
foreach (var _changeLightColourToDefault in changeLightColourToDefault)
{
_changeLightColourToDefault.ChangeColour();
print("Changing lamp renderers to Default");
}
}
public void ChangeLampLightColorToOrange()
{
foreach (var _changeLightColourToOrange in changeLightColourToOrange)
{
_changeLightColourToOrange.ChangeColour();
print("Changing lamp renderers to Orange");
}
}
}