public ScoreScreenManager(RoundManager rm, GameManager gm)
 {
     // setup
     m_MainObject   = GameObject.Find("ScoreScreen");
     m_State        = ScoreScreenState.Setup;
     m_RoundManager = rm;
     m_ItemManager  = m_RoundManager.Get_ItemManager();
     m_GameManager  = gm;
     // Camera
     m_Camera         = m_MainObject.transform.Find("Score_Camera").GetComponent <Camera>();
     m_Camera.enabled = false;
     m_CameraManager  = rm.Get_Camera_Manager();
     // Foreground and Background
     m_Background      = m_MainObject.transform.Find("Backdrop").gameObject;
     m_Foreground      = m_MainObject.transform.Find("Foreground").gameObject;
     m_confettiEffects = m_MainObject.transform.Find("ConfettiParticles").gameObject;
     m_dustEffect      = m_MainObject.transform.Find("RoundEnd_Dust").GetComponent <ParticleSystem>();
     m_source          = m_MainObject.GetComponent <AudioSource>();
     // Find all drop zones
     for (int i = 1; i < 5; i++)
     {
         // Populate drop zones
         m_DropZones.Add(m_MainObject.transform.Find("PlayerDropZone_" + i).gameObject);
         m_Winner_Text.Add(m_Foreground.transform.Find("Player" + i + "_WinText").GetComponent <Text>());
         for (int badge = 1; badge <= 4; badge++)
         {
             m_Badge_Points.Add(GameObject.Find("Player" + badge + "_Badge"));
         }
         foreach (GameObject o in GameObject.FindGameObjectsWithTag("BADGE_IMAGE"))
         {
             m_Badges.Add(o);
         }
     }
     // turn off all winner texts
     foreach (Text t in m_Winner_Text)
     {
         t.enabled = false;
     }
     // turn off all badges
     foreach (GameObject o in m_Badges)
     {
         o.SetActive(false);
     }
     // Find all drop zone objects
     foreach (GameObject dz in m_DropZones)
     {
         m_Drop_Points.Add(dz.transform.Find("DropPoint"));
         m_Player_Points.Add(dz.transform.Find("PlayerPoint"));
         m_Winner_Points.Add(dz.transform.Find("PlayerWinnerPoint"));
         m_Trophies.Add(dz.transform.Find("Trophy").gameObject);
         List <GameObject> l_lights = new List <GameObject>();
         for (int i = 1; i < 4; i++)
         {
             l_lights.Add(dz.transform.Find("Win_Light_" + i).gameObject);
         }
         m_Lights.Add(l_lights);
     }
     // turn all trophies and lights off
     foreach (GameObject t in m_Trophies)
     {
         t.SetActive(false);
     }
     foreach (List <GameObject> l_list in m_Lights)
     {
         foreach (GameObject l in l_list)
         {
             l.SetActive(false);
         }
     }
     SetupComplete = true;
 }
    private void SetState(ScoreScreenState new_state)
    {
        // leave previous state
        LeaveState();
        // change state
        m_State = new_state;
        switch (m_State)
        {
        case ScoreScreenState.Waiting:
        {
            m_Activated = false;
            break;
        }

        case ScoreScreenState.Setup:
        {
            // reset the flag so you know current setup is completed.
            SetupComplete = false;
            break;
        }

        case ScoreScreenState.Dropping:
        {
            // Reset all scores.
            List <AgentManager> new_list = m_GameManager.Get_Players();
            for (int i = 0; i < m_GameManager.Player_Count(); i++)
            {
                m_Score_Values.Add(new_list[i].Get_Score());
            }
            m_CameraManager.SetActiveCamera(m_Camera);
            List <AgentManager> players = m_GameManager.Get_Players();
            // show players
            for (int i = 0; i < players.Count; i++)
            {
                AgentManager player = players[i];
                player.Drop(false);
                player.Set_Default_State();
                player.Set_Position(m_Player_Points[i].position);
                player.Set_Rotation(m_Player_Points[i].rotation);
                player.Set_Scale(2);
                player.Wake_Up();
            }

            // starting to drop items, set up the timer
            if (m_Timer != null)
            {
                m_Timer.Reset();
                m_Timer.Add(GLOBAL_VALUES.SCORE_SCREEN_DROP_SPEED, true);
            }
            else
            {
                m_Timer = new Timer(GLOBAL_VALUES.SCORE_SCREEN_DROP_SPEED, true);
            }

            m_source.clip = Resources.Load("Sound/snd_DrumRoll") as AudioClip;
            m_source.Play();
            m_Background.transform.Find("TopBar").GetComponent <Animator>().SetTrigger("Activate");
            m_Background.transform.Find("BottomBarPanel").transform.Find("BottomBar").GetComponent <Animator>().SetTrigger("Activate");
            break;
        }

        case ScoreScreenState.Winner:
        {
            // starting to show the winner of the round screen
            // setup the timer
            if (m_Timer != null)
            {
                m_Timer.Reset();
                m_Timer.Add(GLOBAL_VALUES.SCORE_SCREEN_BADGE_DELAY_AFTER_WINNER, true);
            }
            else
            {
                m_Timer = new Timer(GLOBAL_VALUES.SCORE_SCREEN_BADGE_DELAY_AFTER_WINNER, true);
            }
            // do the extra celebrations we want
            m_dustEffect.Play();
            m_source.Stop();
            m_source.PlayOneShot(Resources.Load("Sound/snd_DrumRollEnd") as AudioClip);
            m_source.loop = false;
            // TODO
            List <int>          winners = Get_Winners();
            List <AgentManager> players = m_GameManager.Get_Players();
            foreach (int win_index in winners)
            {
                // Show trophy
                m_Trophies[win_index].SetActive(true);
                // Drop Confetti
                foreach (ParticleSystem p in m_confettiEffects.GetComponentsInChildren <ParticleSystem>())
                {
                    p.Play();
                }
                // move player
                players[win_index].Set_Position(m_Winner_Points[win_index].position);
                players[win_index].Set_Rotation(m_Winner_Points[win_index].rotation);
                players[win_index].Give_Round_Win();
                //FIX WAVE TO LOOP
                players[win_index].Get_Animator().SetTrigger(GLOBAL_VALUES.ANIM_TRIGGER_WAVE);
                m_Winner_Text[win_index].enabled = true;
                m_Winner_Text[win_index].text    = players[win_index].Get_Name() + "\nWINS!";
                // Show lights
                foreach (GameObject lo in m_Lights[win_index])
                {
                    lo.SetActive(true);
                }
            }
            break;
        }

        case ScoreScreenState.Badges:
        {
            // Show Badges
            Show_Badges();
            // Setup Timing
            if (m_Timer != null)
            {
                m_Timer.Reset();
                m_Timer.Add(GLOBAL_VALUES.SCORE_SCREEN_WAIT_TO_COMPLETE, true);
            }
            else
            {
                m_Timer = new Timer(GLOBAL_VALUES.SCORE_SCREEN_WAIT_TO_COMPLETE, true);
            }
            break;
        }

        case ScoreScreenState.Complete:
        {
            Close = true;
            m_CameraManager.SetActiveCamera(m_CameraManager.MainCamera());
            foreach (GameObject item in m_DroppedItems)
            {
                GameObject.Destroy(item);
            }
            m_DroppedItems.Clear();
            break;
        }

        default:
        {
            // THROW ERROR!
            throw new System.NotImplementedException("State missing in ScoreScreenManager.SetState() [" + new_state + "]");
        }
        }
    }