少年修仙传客户端代码仓库
client_linchunjie
2018-08-27 d106f11e7f44c748f595da36e0cdfd54849649e6
System/Dungeon/DungeonGradeWin.cs
@@ -1,321 +1,321 @@
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Monday, October 23, 2017
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class DungeonGradeWin : Window
    {
        [SerializeField] TweenCurve m_PosTweenCurve1;
        [SerializeField] TweenCurve m_PosTweenCurve2;
        [SerializeField] TweenCurve m_ScaleTweenCurve1;
        [SerializeField] TweenCurve m_ScaleTweenCurve2;
        [SerializeField] float m_Duration1 = 0.5f;
        [SerializeField] float m_Duration2 = 1.0f;
        [SerializeField] PositionTween gradePosTween;
        [SerializeField] ScaleTween gradeScaleTween;
        [SerializeField] Image grade;
        [SerializeField] Text surplusTime;
        [SerializeField] PositionTween expPosTween;
        [SerializeField] ScaleTween expScaleTween;
        [SerializeField] Image expGrade;
        [SerializeField] Text expText;
        [SerializeField] GameObject gradeContainer;
        [SerializeField] GameObject expContainer;
        DateTime endTime;
        DateTime dungeonEndTime;
        [SerializeField] RectTransform[] moveRects;
        private bool isCanContinue = true;
        private DungeonModel model
        {
            get
            {
                return ModelCenter.Instance.GetModel<DungeonModel>();
            }
        }
        private int lastStar = 0;
        private bool timeZeroShow = false;
        #region Built-in
        protected override void BindController()
        { }
        protected override void AddListeners()
        { }
        protected override void OnPreOpen()
        {
            model.dungeonCoolDownEvent += DungeonCoolDownEvent;
            SetTween(gradePosTween, gradeScaleTween, 0);
            SetTween(expPosTween, expScaleTween, 0);
            dungeonEndTime = model.GetDungeonCoolDownEndTime(DungeonCoolDownType.TowerTake);
            endTime = model.GetDungeonCoolDownEndTime(DungeonCoolDownType.FlagTake);
            expContainer.SetActive(false);
            isCanContinue = true;
        }
        private void OnEnable()
        {
            Display(true);
        }
        private void UpdateMissionEvent()
        {
            if (lastStar == model.mission.grade || !gameObject.activeInHierarchy)
            {
                return;
            }
            lastStar = model.mission.grade;
            ///根据具体副本显示具体数据
            int _mapid = model.GetDungeonDataIdByMapId(PlayerDatas.Instance.baseData.MapID);
            int rate = 0;
            if (model.GetRewardRateWithGrade(_mapid, model.mission.grade, out rate))
            {
                expGrade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade)));
                expText.text = Language.Get("DungeonGrade_2", rate);
                ShowAwardTween();
            }
            else
            {
                grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade)));
            }
        }
        private void ShowAwardTween()
        {
            SetTween(expPosTween, expScaleTween, 0);
            expContainer.gameObject.SetActive(true);
            expPosTween.Play(() =>
            {
                OnExpTweenCom(0);
            });
        }
        private void OnExpTweenCom(int index)
        {
            if (index == 0)
            {
                SetTween(expPosTween, expScaleTween, 1);
                expPosTween.Play();
                expScaleTween.Play(() =>
                {
                    OnExpTweenCom(1);
                });
            }
            else if (index == 1)
            {
                expContainer.SetActive(false);
                grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade)));
            }
        }
        private void DungeonCoolDownEvent(DungeonCoolDownType type)
        {
            switch (type)
            {
                case DungeonCoolDownType.TowerTake:
                    dungeonEndTime = model.GetDungeonCoolDownEndTime(type);
                    break;
                case DungeonCoolDownType.FlagTake:
                    endTime = model.GetDungeonCoolDownEndTime(type);
                    break;
                case DungeonCoolDownType.LeaveMap:
                    if (isCanContinue)
                    {
                        surplusTime.text = Language.Get("DungeonGrade_5", GetStar(model.mission.grade));
                    }
                    isCanContinue = false;
                    break;
            }
        }
        protected override void OnAfterOpen()
        {
            Display(false);
            model.updateMissionEvent += UpdateMissionEvent;
        }
        private void Display(bool _enable)
        {
            if (!gameObject.activeInHierarchy)
            {
                return;
            }
            if (model.mission.grade > 0)
            {
                lastStar = model.mission.grade;
                gradeContainer.SetActive(true);
                if (model.gradeTween && !_enable)
                {
                    model.cacheGradeMap = PlayerDatas.Instance.baseData.MapID;
                    SetTween(gradePosTween, gradeScaleTween, 0);
                    gradePosTween.Play(OnGradeTweenCom);
                    model.gradeTween = false;
                }
                else
                {
                    SetTween(gradePosTween, gradeScaleTween, 1);
                    gradePosTween.SetEndState();
                    gradeScaleTween.SetEndState();
                }
            }
            else
            {
                expContainer.SetActive(false);
                gradeContainer.SetActive(false);
            }
            grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade)));
        }
        private void OnGradeTweenCom()
        {
            SetTween(gradePosTween, gradeScaleTween, 1);
            gradePosTween.Play();
            gradeScaleTween.Play();
        }
        protected override void OnPreClose()
        {
            model.dungeonCoolDownEvent -= DungeonCoolDownEvent;
            model.updateMissionEvent -= UpdateMissionEvent;
        }
        protected override void OnAfterClose()
        { }
        protected override void LateUpdate()
        {
            base.LateUpdate();
            if (isCanContinue)
            {
                if (model.mission.grade > 1)
                {
                    var surplus = endTime - DateTime.Now;
                    surplus = surplus < TimeSpan.Zero ? TimeSpan.Zero : surplus;
                    if (surplus.Equals(TimeSpan.Zero))
                    {
                        if (timeZeroShow) return;
                        timeZeroShow = true;
                        if (model.DungeonTrialMaps().Contains(PlayerDatas.Instance.baseData.MapID))
                        {
                            surplusTime.text = Language.Get("DungeonGradeNextStage");
                            return;
                        }
                    }
                    else timeZeroShow = false;
                    surplusTime.text = Language.Get("DungeonGrade_3", TimeUtility.SecondsToHMSCHSRetain((int)surplus.TotalSeconds, false, false), GetStar(model.mission.grade - 1));
                }
                else
                {
                    var surplus = dungeonEndTime - DateTime.Now;
                    surplus = surplus < TimeSpan.Zero ? TimeSpan.Zero : surplus;
                    surplusTime.text = Language.Get("DungeonGrade_4", TimeUtility.SecondsToHMSCHSRetain((int)surplus.TotalSeconds, false, false));
                    if (surplus.Equals(TimeSpan.Zero))
                    {
                        isCanContinue = false;
                        surplusTime.text = Language.Get("DungeonGrade_1");
                    }
                }
            }
        }
        private void OnDisable()
        {
            expContainer.gameObject.SetActive(false);
            SetTween(gradePosTween, gradeScaleTween, 1);
            gradePosTween.SetEndState();
            gradeScaleTween.SetEndState();
            SetTween(expPosTween, expScaleTween, 0);
            expPosTween.SetStartState();
            expScaleTween.SetStartState();
        }
        #endregion
        private string GetStar(int star)
        {
            switch (star)
            {
                case 5:
                    return "S";
                case 4:
                    return "A";
                case 3:
                    return "B";
                case 2:
                    return "C";
                case 1:
                    return "D";
            }
            return string.Empty;
        }
        private void SetTween(PositionTween _posTween, ScaleTween _scaleTween, int index)
        {
            _posTween.from = moveRects[index].localPosition;
            _posTween.to = moveRects[index + 1].localPosition;
            _posTween.curve = index == 0 ? m_PosTweenCurve1 : m_PosTweenCurve2;
            _scaleTween.curve = index == 0 ? m_ScaleTweenCurve1 : m_ScaleTweenCurve2;
            _posTween.duration = index == 0 ? m_Duration1 : m_Duration2;
            _posTween.delay = index == 0 ? 0 : 1.0f;
            _posTween.SetStartState();
            if (index == 0)
            {
                _scaleTween.SetStartState();
            }
            else
            {
                _scaleTween.delay = 1.0f;
            }
        }
#if UNITY_EDITOR
        [ContextMenu("ExpTween")]
        public void PreviewExpTween()
        {
            SetTween(expPosTween, expScaleTween, 0);
            expPosTween.Play(OnPreviewExpTweenComplete);
        }
        [ContextMenu("GradeTween")]
        public void PreviewGradeTween()
        {
            SetTween(gradePosTween, gradeScaleTween, 0);
            gradePosTween.Play(OnPreviewGradeTweenComplete);
        }
        private void OnPreviewGradeTweenComplete()
        {
            SetTween(gradePosTween, gradeScaleTween, 1);
            gradePosTween.Play();
            gradeScaleTween.Play();
        }
        private void OnPreviewExpTweenComplete()
        {
            SetTween(expPosTween, expScaleTween, 1);
            expPosTween.Play();
            expScaleTween.Play();
        }
#endif
    }
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Monday, October 23, 2017
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class DungeonGradeWin : Window
    {
        [SerializeField] TweenCurve m_PosTweenCurve1;
        [SerializeField] TweenCurve m_PosTweenCurve2;
        [SerializeField] TweenCurve m_ScaleTweenCurve1;
        [SerializeField] TweenCurve m_ScaleTweenCurve2;
        [SerializeField] float m_Duration1 = 0.5f;
        [SerializeField] float m_Duration2 = 1.0f;
        [SerializeField] PositionTween gradePosTween;
        [SerializeField] ScaleTween gradeScaleTween;
        [SerializeField] Image grade;
        [SerializeField] Text surplusTime;
        [SerializeField] PositionTween expPosTween;
        [SerializeField] ScaleTween expScaleTween;
        [SerializeField] Image expGrade;
        [SerializeField] Text expText;
        [SerializeField] GameObject gradeContainer;
        [SerializeField] GameObject expContainer;
        DateTime endTime;
        DateTime dungeonEndTime;
        [SerializeField] RectTransform[] moveRects;
        private bool isCanContinue = true;
        private DungeonModel model
        {
            get
            {
                return ModelCenter.Instance.GetModel<DungeonModel>();
            }
        }
        private int lastStar = 0;
        private bool timeZeroShow = false;
        #region Built-in
        protected override void BindController()
        { }
        protected override void AddListeners()
        { }
        protected override void OnPreOpen()
        {
            model.dungeonCoolDownEvent += DungeonCoolDownEvent;
            SetTween(gradePosTween, gradeScaleTween, 0);
            SetTween(expPosTween, expScaleTween, 0);
            dungeonEndTime = model.GetDungeonCoolDownEndTime(DungeonCoolDownType.TowerTake);
            endTime = model.GetDungeonCoolDownEndTime(DungeonCoolDownType.FlagTake);
            expContainer.SetActive(false);
            isCanContinue = true;
        }
        private void OnEnable()
        {
            Display(true);
        }
        private void UpdateMissionEvent()
        {
            if (lastStar == model.mission.grade || !gameObject.activeInHierarchy)
            {
                return;
            }
            lastStar = model.mission.grade;
            ///根据具体副本显示具体数据
            int _mapid = model.GetDungeonDataIdByMapId(PlayerDatas.Instance.baseData.MapID);
            int rate = 0;
            if (model.GetRewardRateWithGrade(_mapid, model.mission.grade, out rate))
            {
                expGrade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade)));
                expText.text = Language.Get("DungeonGrade_2", rate);
                ShowAwardTween();
            }
            else
            {
                grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade)));
            }
        }
        private void ShowAwardTween()
        {
            SetTween(expPosTween, expScaleTween, 0);
            expContainer.gameObject.SetActive(true);
            expPosTween.Play(() =>
            {
                OnExpTweenCom(0);
            });
        }
        private void OnExpTweenCom(int index)
        {
            if (index == 0)
            {
                SetTween(expPosTween, expScaleTween, 1);
                expPosTween.Play();
                expScaleTween.Play(() =>
                {
                    OnExpTweenCom(1);
                });
            }
            else if (index == 1)
            {
                expContainer.SetActive(false);
                grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade)));
            }
        }
        private void DungeonCoolDownEvent(DungeonCoolDownType type)
        {
            switch (type)
            {
                case DungeonCoolDownType.TowerTake:
                    dungeonEndTime = model.GetDungeonCoolDownEndTime(type);
                    break;
                case DungeonCoolDownType.FlagTake:
                    endTime = model.GetDungeonCoolDownEndTime(type);
                    break;
                case DungeonCoolDownType.LeaveMap:
                    if (isCanContinue)
                    {
                        surplusTime.text = Language.Get("DungeonGrade_5", GetStar(model.mission.grade));
                    }
                    isCanContinue = false;
                    break;
            }
        }
        protected override void OnAfterOpen()
        {
            Display(false);
            model.updateMissionEvent += UpdateMissionEvent;
        }
        private void Display(bool _enable)
        {
            if (!gameObject.activeInHierarchy)
            {
                return;
            }
            if (model.mission.grade > 0)
            {
                lastStar = model.mission.grade;
                gradeContainer.SetActive(true);
                if (model.gradeTween && !_enable)
                {
                    model.cacheGradeMap = PlayerDatas.Instance.baseData.MapID;
                    SetTween(gradePosTween, gradeScaleTween, 0);
                    gradePosTween.Play(OnGradeTweenCom);
                    model.gradeTween = false;
                }
                else
                {
                    SetTween(gradePosTween, gradeScaleTween, 1);
                    gradePosTween.SetEndState();
                    gradeScaleTween.SetEndState();
                }
            }
            else
            {
                expContainer.SetActive(false);
                gradeContainer.SetActive(false);
            }
            grade.SetSprite(StringUtility.Contact("Remark_", GetStar(model.mission.grade)));
        }
        private void OnGradeTweenCom()
        {
            SetTween(gradePosTween, gradeScaleTween, 1);
            gradePosTween.Play();
            gradeScaleTween.Play();
        }
        protected override void OnPreClose()
        {
            model.dungeonCoolDownEvent -= DungeonCoolDownEvent;
            model.updateMissionEvent -= UpdateMissionEvent;
        }
        protected override void OnAfterClose()
        { }
        protected override void LateUpdate()
        {
            base.LateUpdate();
            if (isCanContinue)
            {
                if (model.mission.grade > 1)
                {
                    var surplus = endTime - DateTime.Now;
                    surplus = surplus < TimeSpan.Zero ? TimeSpan.Zero : surplus;
                    if (surplus.Equals(TimeSpan.Zero))
                    {
                        if (timeZeroShow) return;
                        timeZeroShow = true;
                        if (model.DungeonTrialMaps().Contains(PlayerDatas.Instance.baseData.MapID))
                        {
                            surplusTime.text = Language.Get("DungeonGradeNextStage");
                            return;
                        }
                    }
                    else timeZeroShow = false;
                    surplusTime.text = Language.Get("DungeonGrade_3", TimeUtility.SecondsToHMSCHSRetain((int)surplus.TotalSeconds, false, false), GetStar(model.mission.grade - 1));
                }
                else
                {
                    var surplus = dungeonEndTime - DateTime.Now;
                    surplus = surplus < TimeSpan.Zero ? TimeSpan.Zero : surplus;
                    surplusTime.text = Language.Get("DungeonGrade_4", TimeUtility.SecondsToHMSCHSRetain((int)surplus.TotalSeconds, false, false));
                    if (surplus.Equals(TimeSpan.Zero))
                    {
                        isCanContinue = false;
                        surplusTime.text = Language.Get("DungeonGrade_1");
                    }
                }
            }
        }
        private void OnDisable()
        {
            expContainer.gameObject.SetActive(false);
            SetTween(gradePosTween, gradeScaleTween, 1);
            gradePosTween.SetEndState();
            gradeScaleTween.SetEndState();
            SetTween(expPosTween, expScaleTween, 0);
            expPosTween.SetStartState();
            expScaleTween.SetStartState();
        }
        #endregion
        private string GetStar(int star)
        {
            switch (star)
            {
                case 5:
                    return "S";
                case 4:
                    return "A";
                case 3:
                    return "B";
                case 2:
                    return "C";
                case 1:
                    return "D";
            }
            return string.Empty;
        }
        private void SetTween(PositionTween _posTween, ScaleTween _scaleTween, int index)
        {
            _posTween.from = moveRects[index].localPosition;
            _posTween.to = moveRects[index + 1].localPosition;
            _posTween.curve = index == 0 ? m_PosTweenCurve1 : m_PosTweenCurve2;
            _scaleTween.curve = index == 0 ? m_ScaleTweenCurve1 : m_ScaleTweenCurve2;
            _posTween.duration = index == 0 ? m_Duration1 : m_Duration2;
            _posTween.delay = index == 0 ? 0 : 1.0f;
            _posTween.SetStartState();
            if (index == 0)
            {
                _scaleTween.SetStartState();
            }
            else
            {
                _scaleTween.delay = 1.0f;
            }
        }
#if UNITY_EDITOR
        [ContextMenu("ExpTween")]
        public void PreviewExpTween()
        {
            SetTween(expPosTween, expScaleTween, 0);
            expPosTween.Play(OnPreviewExpTweenComplete);
        }
        [ContextMenu("GradeTween")]
        public void PreviewGradeTween()
        {
            SetTween(gradePosTween, gradeScaleTween, 0);
            gradePosTween.Play(OnPreviewGradeTweenComplete);
        }
        private void OnPreviewGradeTweenComplete()
        {
            SetTween(gradePosTween, gradeScaleTween, 1);
            gradePosTween.Play();
            gradeScaleTween.Play();
        }
        private void OnPreviewExpTweenComplete()
        {
            SetTween(expPosTween, expScaleTween, 1);
            expPosTween.Play();
            expScaleTween.Play();
        }
#endif
    }
}