void Start()
        {
            base.Start();

            for (int iter = 1; iter <= 4; iter++)
            {
                m_playerScores.Add(0);
            }

            m_infoText = GameObject.FindGameObjectWithTag("DaSText");

            m_mode         = GameModeManager.GameModeState.DRIVEANDSEEK;
            m_currentPhase = DriveAndSeekPhases.INACTIVE;
        }
        void InitializePhase()
        {
            switch (m_currentPhase)
            {
            case DriveAndSeekPhases.SETUP:
            {
                EventManager.m_instance.AddEvent(Events.Event.DS_SETUP);
                SetupHiderAndSeekers();

                //Setup buffer phase
                m_currentPhase            = DriveAndSeekPhases.BUFFER;
                m_bufferPhase.m_lenght    = 5.0f;
                m_bufferPhase.m_nextPhase = DriveAndSeekPhases.RUNNING;
                m_bufferPhase.m_message   = "Runner Get Ready!";
                InitializePhase();
                break;
            }

            case DriveAndSeekPhases.RUNNING:
            {
                EventManager.m_instance.AddEvent(Events.Event.DS_RUNNING);
                m_infoText.GetComponent <Text>().text = "Start Running!";
                m_timers[GetTimer("Running")].StartTimer();

                ChangeAllPlayerMovement(false);
                ChangePlayerMovement(m_hiderNumber, true);
                break;
            }

            case DriveAndSeekPhases.CHASING:
            {
                EventManager.m_instance.AddEvent(Events.Event.DS_CHASING);

                m_infoText.GetComponent <Text>().text = "Catch the Runner!";

                ChangeAllPlayerMovement(true);

                m_timers[GetTimer("Chasing")].StartTimer();
                break;
            }

            case DriveAndSeekPhases.RESET:
            {
                EventManager.m_instance.AddEvent(Events.Event.DS_RESET);

                if (m_hiderWon)
                {
                    m_playerScores[m_hiderNumber]++;
                }
                else
                {
                    for (int iter = 0; iter <= PlayerManager.m_instance.m_playerCars.Count - 1; iter++)
                    {
                        if (iter != m_hiderNumber)
                        {
                            m_playerScores[iter]++;
                        }
                    }
                }

                for (int iter = 0; iter <= PlayerManager.m_instance.m_playerCars.Count - 1; iter++)
                {
                    PlayerManager.m_instance.m_playerCars[iter].GetComponent <Car>().ToggleCamera(true);
                }

                if (CheckFinished())
                {
                    m_currentPhase = DriveAndSeekPhases.FINISH;
                    InitializePhase();
                }
                else
                {
                    ResetRound();
                    m_currentPhase = DriveAndSeekPhases.SETUP;
                    InitializePhase();
                }
                break;
            }

            case DriveAndSeekPhases.FINISH:
            {
                EventManager.m_instance.AddEvent(Events.Event.DS_FINISH);

                EndGame();

                //Setup buffer phase
                m_currentPhase            = DriveAndSeekPhases.BUFFER;
                m_bufferPhase.m_lenght    = 5.0f;
                m_bufferPhase.m_nextPhase = DriveAndSeekPhases.INACTIVE;
                m_bufferPhase.m_message   = "Player " + m_gameWinner + " Wins!";
                InitializePhase();

                break;
            }

            case DriveAndSeekPhases.BUFFER:
            {
                EventManager.m_instance.AddEvent(Events.Event.DS_BUFFER);

                ChangeAllPlayerMovement(false);

                m_timers[GetTimer("Buffer")].m_timerLength = m_bufferPhase.m_lenght;
                m_infoText.GetComponent <Text>().text      = m_bufferPhase.m_message;
                m_timers[GetTimer("Buffer")].StartTimer();
                break;
            }

            case DriveAndSeekPhases.INACTIVE:
            {
                m_infoText.GetComponent <Text>().text = "";
                ChangeAllPlayerMovement(true);
                break;
            }

            default:
            {
                break;
            }
            }
        }
        void UpdatePhase()
        {
            switch (m_currentPhase)
            {
            case DriveAndSeekPhases.SETUP:
            {
                break;
            }

            case DriveAndSeekPhases.RUNNING:
            {
                if (m_timers[GetTimer("Running")].CheckFinished())
                {
                    m_currentPhase = DriveAndSeekPhases.CHASING;
                    InitializePhase();
                }
                break;
            }

            case DriveAndSeekPhases.CHASING:
            {
                if (CheckHidersCaught())
                {
                    m_currentPhase = DriveAndSeekPhases.RESET;
                    InitializePhase();
                }

                if (CheckSeekersDead())
                {
                    m_hiderWon     = true;
                    m_currentPhase = DriveAndSeekPhases.RESET;
                    InitializePhase();
                }

                if (m_timers[GetTimer("Chasing")].CheckFinished())
                {
                    m_hiderWon     = true;
                    m_currentPhase = DriveAndSeekPhases.RESET;
                    InitializePhase();
                }


                break;
            }

            case DriveAndSeekPhases.RESET:
            {
                break;
            }

            case DriveAndSeekPhases.FINISH:
            {
                break;
            }

            case DriveAndSeekPhases.BUFFER:
            {
                if (m_timers[GetTimer("Buffer")].CheckFinished())
                {
                    m_currentPhase = m_bufferPhase.m_nextPhase;
                    InitializePhase();
                }
                break;
            }

            case DriveAndSeekPhases.INACTIVE:
            {
                if (m_active)
                {
                    m_currentPhase = DriveAndSeekPhases.SETUP;
                    InitializePhase();
                }

                break;
            }

            default:
            {
                break;
            }
            }
        }