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 changeLightColourToGreen; public List changeLightColourToRed; public List changeLightColourToDefault; public List 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(); } } 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"); } } }