IEnumerator DelayStart(float scale, float duration, GameTimeScaleContext context, float delayed)
 {
     if (delayed > 0)
     {
         yield return(new WaitForSeconds(delayed));
     }
     ReqTimeScale(scale, duration, context);
 }
    /// <summary>
    /// 延迟启动系统减速.
    /// </summary>
    /// <returns><c>true</c>, if time scale delayed was reqed, <c>false</c> otherwise.</returns>
    /// <param name="scale">Scale.</param>
    /// <param name="duration">Duration.</param>
    /// <param name="context">Context.</param>
    /// <param name="delayTime">Delay time.</param>

    public bool ReqTimeScaleDelayed(float scale, float duration, GameTimeScaleContext context, float delayTime)
    {
        if (duration <= 0)
        {
            CancelTimeScale(context);
            return(false);
        }
        AppMain.Instance().StartCoroutine(DelayStart(scale, duration, context, delayTime));
        return(true);
    }
 /// <summary>
 /// 覆盖当前Scale.
 /// </summary>
 /// <param name="scale">Scale.</param>
 /// <param name="duration">Duration.</param>
 /// <param name="context">Context.</param>
 void OverrideCurScale(float scale, float duration, GameTimeScaleContext context, System.Action <TimeScaleContextData> OnUpdate = null)
 {
     if (_currentScaleData == null)
     {
         _currentScaleData = new TimeScaleContextData();
     }
     _currentScaleData.scale         = scale;
     _currentScaleData.duration      = duration;
     _currentScaleData.context       = context;
     _currentScaleData.beginRealTime = Time.realtimeSinceStartup;
     _currentScaleData.OnUpdate      = OnUpdate;
     Time.timeScale = scale;
 }
    void BreakCurScale(float scale, float duration, GameTimeScaleContext context, System.Action <TimeScaleContextData> OnUpdate = null)
    {
        if (_currentScaleData != null)
        {
            _stack.Push(_currentScaleData);
        }

        _currentScaleData = new TimeScaleContextData()
        {
            scale    = scale,
            duration = duration,
            context  = context,
            OnUpdate = OnUpdate,
        };
    }
    /// <summary>
    /// 取消当前的TimeScale.
    /// </summary>
    /// <returns><c>true</c>是否取消成功 <c>false</c>.</returns>
    /// <param name="contex">Contex.</param>
    public bool CancelTimeScale(GameTimeScaleContext contex)
    {
        if (_currentScaleData == null)
        {
            return(true);
        }
        if (_currentScaleData.context == contex)
        {
            Time.timeScale = 1;
            if (OnTimeScaleChange != null)
            {
                OnTimeScaleChange(1);
            }
            _currentScaleData = null;
            return(true);
        }

        return(false);
    }
    /*
     * public void Awake()
     * {
     *      if(s_instance == null)
     *              s_instance = this;
     * }*/
    /// <summary>
    /// 请求系统减速.
    /// </summary>
    /// <returns><c>true</c>, if time scale was reqed, <c>false</c> otherwise.</returns>
    /// <param name="scale">Scale.</param>
    /// <param name="duration">Duration.</param>
    /// <param name="context">Context.</param>
    public bool ReqTimeScale(float scale, float duration, GameTimeScaleContext context, System.Action <TimeScaleContextData> OnUpdate = null)
    {
        if (duration <= 0)
        {
            CancelTimeScale(context);
            return(false);
        }

        ReqTimeScaleResult policy = CheckTimeScalePolicy(context);

//		if(_currentScaleData != null)
//			Log.info(this, "[Check Time scale] currentContexgt " + _currentScaleData.context +" context "  + context + " result " + policy);
//		else
//			Log.info(this, "[Check Time scale] currentContexgt null  context "  + context + " result " + policy);
        switch (policy)
        {
        case ReqTimeScaleResult.Override:
            OverrideCurScale(scale, duration, context, OnUpdate);
            break;

        case ReqTimeScaleResult.Refused:
            RefuseScale(scale, duration, context, OnUpdate);
            return(false);

        case ReqTimeScaleResult.Break:
            BreakCurScale(scale, duration, context, OnUpdate);
            break;

        case ReqTimeScaleResult.Queued:
            break;

        default:
            break;
        }
        return(true);
    }
    /// <summary>
    /// Checks the time scale policy.
    /// </summary>
    /// <returns>The time scale policy.</returns>
    /// <param name="context">Context.</param>
    public ReqTimeScaleResult CheckTimeScalePolicy(GameTimeScaleContext context)
    {
        if (_currentScaleData == null)
        {
            return(ReqTimeScaleResult.Override);
        }
        ReqTimeScaleResult ret = ReqTimeScaleResult.None;

        switch (_currentScaleData.context)
        {
        case GameTimeScaleContext.BossKilled:
            switch (context)
            {
            case GameTimeScaleContext.BossKilled:
                ret = ReqTimeScaleResult.Override;
                break;

            case GameTimeScaleContext.GamePause:
                ret = ReqTimeScaleResult.Break;
                break;

            case GameTimeScaleContext.PlayerSkill:
                ret = ReqTimeScaleResult.Refused;
                break;

            case GameTimeScaleContext.BreakArmor:
                ret = ReqTimeScaleResult.Refused;
                break;

            case GameTimeScaleContext.PlayerVisible:
                ret = ReqTimeScaleResult.Refused;
                break;

            default:
                ret = ReqTimeScaleResult.Override;
                break;
            }
            break;

        case GameTimeScaleContext.GamePause:
            switch (context)
            {
            case GameTimeScaleContext.BossKilled:
                ret = ReqTimeScaleResult.Refused;
                break;

            case GameTimeScaleContext.GamePause:
                ret = ReqTimeScaleResult.Override;
                break;

            case GameTimeScaleContext.PlayerSkill:
                ret = ReqTimeScaleResult.Refused;
                break;

            case GameTimeScaleContext.BreakArmor:
                ret = ReqTimeScaleResult.Refused;
                break;

            case GameTimeScaleContext.PlayerVisible:
                ret = ReqTimeScaleResult.Refused;
                break;

            default:
                ret = ReqTimeScaleResult.Override;
                break;
            }
            break;

        case GameTimeScaleContext.PlayerSkill:
            switch (context)
            {
            case GameTimeScaleContext.BossKilled:
                ret = ReqTimeScaleResult.Override;
                break;

            case GameTimeScaleContext.GamePause:
                ret = ReqTimeScaleResult.Break;
                break;

            case GameTimeScaleContext.PlayerSkill:
                ret = ReqTimeScaleResult.Override;
                break;

            case GameTimeScaleContext.BreakArmor:
                ret = ReqTimeScaleResult.Override;
                break;

            case GameTimeScaleContext.PlayerVisible:
                ret = ReqTimeScaleResult.Override;
                break;

            default:
                ret = ReqTimeScaleResult.Override;
                break;
            }
            break;

        case GameTimeScaleContext.BreakArmor:
            switch (context)
            {
            case GameTimeScaleContext.BossKilled:
                ret = ReqTimeScaleResult.Override;
                break;

            case GameTimeScaleContext.GamePause:
                ret = ReqTimeScaleResult.Break;
                break;

            case GameTimeScaleContext.PlayerSkill:
                ret = ReqTimeScaleResult.Refused;
                break;

            case GameTimeScaleContext.BreakArmor:
                ret = ReqTimeScaleResult.Override;
                break;

            case GameTimeScaleContext.PlayerVisible:
                ret = ReqTimeScaleResult.Refused;
                break;

            default:
                ret = ReqTimeScaleResult.Override;
                break;
            }
            break;

        case GameTimeScaleContext.PlayerVisible:
            switch (context)
            {
            case GameTimeScaleContext.BossKilled:
                ret = ReqTimeScaleResult.Override;
                break;

            case GameTimeScaleContext.GamePause:
                ret = ReqTimeScaleResult.Break;
                break;

            case GameTimeScaleContext.PlayerSkill:
                ret = ReqTimeScaleResult.Refused;
                break;

            case GameTimeScaleContext.BreakArmor:
                ret = ReqTimeScaleResult.Refused;
                break;

            case GameTimeScaleContext.PlayerVisible:
                ret = ReqTimeScaleResult.Override;
                break;

            default:
                ret = ReqTimeScaleResult.Override;
                break;
            }
            break;

        default:
            ret = ReqTimeScaleResult.Override;
            break;
        }
        return(ret);
    }
 void RefuseScale(float scale, float duration, GameTimeScaleContext context, System.Action <TimeScaleContextData> OnUpdate = null)
 {
     return;
 }