/// <summary>
    /// Gets next TripStage enum value from current value.
    /// Used to invoke the NextStage event.
    /// </summary>
    /// <param name="currentStage"></param>
    /// <returns></returns>
    private LSDTripStage NextStage(LSDTripStage currentStage)
    {
        Debug.Log("Current Stage: " + currentStage);
        LSDTripStage newStage = (LSDTripStage)((int)currentStage + 1);

        Debug.Log("Next Stage: " + newStage);
        return(newStage);
    }
    void StartEffect(LSDTripStage stage)
    {
        switch (stage)
        {
        case LSDTripStage.None:
            gameObject.GetComponent <None>().enabled = true;
            break;

        case LSDTripStage.Onset:
            gameObject.GetComponent <None>().enabled  = false;
            gameObject.GetComponent <Onset>().enabled = true;
            break;

        case LSDTripStage.MildHallucinations:
            gameObject.GetComponent <Onset>().enabled = false;
            gameObject.GetComponent <MildHallucinations>().enabled = true;
            break;

        case LSDTripStage.MildIntenseTransition:
            gameObject.GetComponent <MildHallucinations>().enabled    = false;
            gameObject.GetComponent <MildIntenseTransition>().enabled = true;
            break;

        case LSDTripStage.IntenseHallucinations:
            gameObject.GetComponent <MildIntenseTransition>().enabled = false;
            gameObject.GetComponent <IntenseHallucinations>().enabled = true;
            break;

        case LSDTripStage.PsychedelicPhase:
            gameObject.GetComponent <IntenseHallucinations>().enabled = false;
            gameObject.GetComponent <PsychedelicPhase>().enabled      = true;
            break;

        case LSDTripStage.FractalPhase:
            gameObject.GetComponent <PsychedelicPhase>().enabled = false;
            gameObject.GetComponent <FractalPhase>().enabled     = true;
            break;

        case LSDTripStage.BadTrip:
            gameObject.GetComponent <FractalPhase>().enabled = false;
            if (Player != null)
            {
                Debug.Log("Destroying Player");
                GameObject.Destroy(Player);
            }
            SceneManager.LoadScene("BadTripScene");
            break;

        default:
            break;
        }
    }
 public void InitState(LSDTripStage stage)
 {
     Debug.Log("switching to state: " + stage);
     if (stage != LSDTripStage.BadTrip)
     {
         Destroy(activeObject);
         activeObject = GameObject.Instantiate(TripStages[stage]);
         Debug.Log(activeObject.name);
     }
     else
     {
         InitBadTrip();
     }
 }
    /// <summary>
    /// Invokes TripStageStartEvent after the duration for that trip stage is passed.
    /// </summary>
    /// <param name="currentStage"></param>
    /// <returns></returns>
    public IEnumerator TimedLSDTrip()
    {
        while (isRunning)
        {
            Debug.Log("stage: " + current);
            if ((int)current <= (int)LSDTripStage.BadTrip)
            {
                TripStageStartEvent.Invoke(current);
            }
            else
            {
                isRunning = false;
            }

            yield return(new WaitForSeconds(TripStageDurations[current]));

            current = NextStage(current);
        }
    }