//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Thursday, July 18, 2019 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; namespace Snxxz.UI { public class EquipStarSuccessWin : Window { [SerializeField] ScrollRect m_ScrollRect; [SerializeField] Star[] m_Stars; [SerializeField] ItemCell m_ItemCell; [SerializeField] Text m_EquipStar; [SerializeField] BaseProperty[] m_BaseProperties; [SerializeField] RectTransform m_CloseTip; [SerializeField] Button m_Close; List activeItemBehaviours = new List(); EquipModel equipModel { get { return ModelCenter.Instance.GetModel(); } } PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } EquipStarModel starModel { get { return ModelCenter.Instance.GetModel(); } } EquipStarSuccessModel model { get { return ModelCenter.Instance.GetModel(); } } EquipStrengthModel strengthModel { get { return ModelCenter.Instance.GetModel(); } } #region Built-in protected override void BindController() { } protected override void AddListeners() { m_Close.SetListener(() => { WindowCenter.Instance.Close(); }); } protected override void OnPreOpen() { m_CloseTip.gameObject.SetActive(false); m_Close.gameObject.SetActive(false); foreach (var behaviour in activeItemBehaviours) { behaviour.gameObject.SetActive(false); } } protected override void OnAfterOpen() { } protected override void OnPreClose() { } protected override void OnAfterClose() { } protected override void OnActived() { base.OnActived(); Clock.AlarmAfter(3f, () => { m_Close.gameObject.SetActive(true); m_CloseTip.gameObject.SetActive(true); }); DisplayItem(); DisplayStars(); DisplayBaseProperty(); DisplaySpecialEffects(); } #endregion private void DisplayItem() { var equip = equipModel.GetEquip(model.equipPosition); m_ItemCell.gameObject.SetActive(true); m_ItemCell.Init(packModel.GetItemByGuid(equip)); m_EquipStar.gameObject.SetActive(true); m_EquipStar.text = string.Format("{0}星", model.star); } private void DisplayStars() { var maxStarLevel = EquipStarModel.GetMaxStarLevel(model.equipPosition.x); var currentStar = model.star; for (int i = 0; i < m_Stars.Length; i++) { var behaviour = m_Stars[i]; if (i < maxStarLevel) { if (i < currentStar) { behaviour.Display(true); if (i == currentStar - 1) { behaviour.Display(false); Clock.AlarmAfter(1f, () => { behaviour.Display(true); behaviour.PlayScaleAnimation(); }); } } else { behaviour.Display(false); } } else { behaviour.Hide(); } } } private void DisplayBaseProperty() { var configs = EquipStarConfig.GetConfigs(model.equipPosition.x, model.equipPosition.y); EquipStarConfig beforeConfig = null; EquipStarConfig nowConfig = null; for (int i = 0; i < configs.Count; i++) { var config = configs[i]; if (config.Star == model.star - 1) { beforeConfig = config; } else if (config.Star == model.star) { nowConfig = config; } } var nowValues = nowConfig.BaseAttrInfo; var beforeValues = new Int2[nowValues.Length]; if (beforeConfig != null) { for (var i = 0; i < beforeConfig.BaseAttrInfo.Length; i++) { beforeValues[i] = beforeConfig.BaseAttrInfo[i]; } } for (int i = 0; i < m_BaseProperties.Length; i++) { var behaviour = m_BaseProperties[i]; if (i < nowValues.Length) { behaviour.Display(nowValues[i].x, beforeValues[i].y, nowValues[i].y); } else { behaviour.Hide(); } } } private void DisplaySpecialEffects() { m_ScrollRect.verticalNormalizedPosition = 0f; DisplaySuitEffect(); DisplayStarProperty(); DisplayGemHole(); DisplayStrengthLevel(); DisplayTrainLevel(); } private void DisplaySuitEffect() { if (model.star % 3 == 0) { var count = 0; for (int i = 1; i <= 8; i++) { var star = starModel.GetStarLevel(new Int2(model.equipPosition.x, i)); if (star >= model.star) { count++; } } var behaviour = GetStarSuccessActiveItemBehaviour(); var job = PlayerDatas.Instance.baseData.Job; switch (count) { case 2: var twoConfigs = EquipSuitConfig.GetConfigs(job, model.equipPosition.x, EquipSuitType.TwoSuit); var twoConfig = twoConfigs.Find(x => { return x.star == model.star; }); behaviour.DisplaySuitEffect(model.star, EquipSuitType.TwoSuit, twoConfig.attr); break; case 5: var fiveConfigs = EquipSuitConfig.GetConfigs(job, model.equipPosition.x, EquipSuitType.FiveSuit); var fiveConfig = fiveConfigs.Find(x => { return x.star == model.star; }); behaviour.DisplaySuitEffect(model.star, EquipSuitType.FiveSuit, fiveConfig.attr); break; case 8: var eightConfigs = EquipSuitConfig.GetConfigs(job, model.equipPosition.x, EquipSuitType.EightSuit); var eightConfig = eightConfigs.Find(x => { return x.star == model.star; }); if (eightConfig.skillID > 0) { behaviour.DisplaySuitEffect(model.star, eightConfig.description); } else { behaviour.DisplaySuitEffect(model.star, EquipSuitType.EightSuit, eightConfig.attr); } break; } } } private void DisplayStarProperty() { var beforeConfig = EquipStarConfig.Get(model.equipPosition.x, model.equipPosition.y, model.star - 1); var nowConfig = EquipStarConfig.Get(model.equipPosition.x, model.equipPosition.y, model.star); if (beforeConfig == null || beforeConfig.StarAttrInfo.Length != nowConfig.StarAttrInfo.Length) { var behaviour = GetStarSuccessActiveItemBehaviour(); behaviour.DisplayStarProperty(model.star, nowConfig.StarAttrInfo[nowConfig.StarAttrInfo.Length - 1]); } } private void DisplayGemHole() { if (model.star == 2 || model.star == 5) { var behaviour = GetStarSuccessActiveItemBehaviour(); behaviour.DisplayGemHole(model.star); } } private void DisplayStrengthLevel() { var type = EquipStrengthModel.GetEquipStrengthType(model.equipPosition.y); var beforeLevel = strengthModel.GetEquipLevelMax(type, model.star - 1); var nowLevel = strengthModel.GetEquipLevelMax(type, model.star); if (beforeLevel != nowLevel) { var behaviour = GetStarSuccessActiveItemBehaviour(); behaviour.DisplayStrengthLevelLimit(model.star, nowLevel); } } private void DisplayTrainLevel() { var type = EquipTrainModel.GetTrainType(model.equipPosition.y); var beforeConfig = WashLevelMaxConfig.Get(type, model.star - 1); var nowConfig = WashLevelMaxConfig.Get(type, model.star); if (beforeConfig == null || beforeConfig.levelMax != nowConfig.levelMax) { var behaviour = GetStarSuccessActiveItemBehaviour(); behaviour.DisplayTrainLevelLimit(model.star, nowConfig.levelMax); } } private EquipStarSuccessActiveItemBehaviour GetStarSuccessActiveItemBehaviour() { foreach (var item in activeItemBehaviours) { if (!item.gameObject.activeInHierarchy) { item.gameObject.SetActive(true); return item; } } var instance = UIUtility.CreateWidget("EquipStarSuccessActiveItemBehaviour", "EquipStarSuccessActiveItemBehaviour"); instance.transform.SetParentEx(m_ScrollRect.content, Vector3.zero, Quaternion.identity, Vector3.one); var behaviour = instance.GetComponent(); activeItemBehaviours.Add(behaviour); return behaviour; } [System.Serializable] public class Star { public RectTransform container; public Image imageBase; public Image imageStar; public void Display(bool active) { container.gameObject.SetActive(true); imageStar.gameObject.SetActive(active); imageStar.transform.localScale = Vector3.one; } public void Hide() { container.gameObject.SetActive(false); } public void PlayScaleAnimation() { imageStar.transform.localScale = Vector3.one * 5; imageStar.transform.DOScale(Vector3.one, 0.5f); } } [System.Serializable] public class BaseProperty { public RectTransform container; public Text title; public Text before; public Text now; public void Hide() { container.gameObject.SetActive(false); } public void Display(int id, int beforeValue, int nowValue) { container.gameObject.SetActive(true); var config = PlayerPropertyConfig.Get(id); title.text = string.Format("{0}:", config.Name); before.text = beforeValue.ToString(); now.text = nowValue.ToString(); } } } }