public override void StartRoutineJudging()
    {
        base.StartRoutineJudging();

        bRoutineStarted   = true;
        RoutineStartTime  = DateTime.Now;
        OverlayAnimInterp = 0f;
        OverlayAnimState  = EOverlayAnimState.Out;
        double WaitToStartTime = 10.0;

        StartAnimTime = (RoutineStartTime.AddSeconds(WaitToStartTime));
    }
    public override void StopRoutineJudging()
    {
        base.StopRoutineJudging();

        if (OverlayAnimInterp > 0)
        {
            RoutineFinishTime = DateTime.Now;
            StartAnimTime     = DateTime.Now;
        }

        OverlayAnimInterp = 0f;
        OverlayAnimState  = EOverlayAnimState.In;
        bRoutineStarted   = false;
    }
    // Update is called once per frame
    void Update()
    {
        Global.NetObj.UpdateUdpListener();

        Global.NetObj.UpdateClientJudgeState();

        if (Input.GetKeyDown(KeyCode.Space))
        {
            OverlayMode = OverlayMode == EOverlayMode.Routine ? EOverlayMode.Scoreboard : EOverlayMode.Routine;
        }
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            StartAnimTime     = DateTime.Now;
            OverlayAnimInterp = 0f;
            OverlayAnimState  = EOverlayAnimState.In;
        }
        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            OverlayAnimInterp = 0f;
            OverlayAnimState  = EOverlayAnimState.Out;
            StartAnimTime     = DateTime.Now;
        }

        if (bRoutineStarted && (DateTime.Now - RoutineStartTime).TotalMinutes > GetRoutineLengthMinutes())
        {
            StopRoutineJudging();
        }

        const float AnimateTime = 2f;

        if (OverlayAnimState == EOverlayAnimState.Out && DateTime.Now > StartAnimTime)
        {
            double time = (DateTime.Now - StartAnimTime).TotalSeconds;
            OverlayAnimInterp = Math.Min((float)(time / AnimateTime), 1f);
        }

        if (OverlayAnimState == EOverlayAnimState.In && DateTime.Now > StartAnimTime)
        {
            double SecondsAfterRoutine = (DateTime.Now - StartAnimTime).TotalSeconds;
            OverlayAnimInterp = Math.Max(0f, (float)(SecondsAfterRoutine / AnimateTime));
        }
    }