//-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Friday, March 08, 2019 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace vnxbqy.UI { public class EquipTrainWin : Window { [SerializeField] RectTransform m_LevelContainer; [SerializeField] ScrollRect m_LevelScrollRect; [SerializeField] RectTransform m_OperateContainer; [SerializeField] RectTransform m_EmptyContainer; [SerializeField] Text m_MaxTrainLevel; [SerializeField] ItemCell m_TargetEquip; [SerializeField] Text m_EquipStar; [SerializeField] RectTransform m_EquipEmpty; [SerializeField] MaterialCell m_MaterialCell; [SerializeField] InevitableMaterialCell m_InevitableMaterial; [SerializeField] RectTransform m_UnTrainableContainer; [SerializeField] RectTransform m_TrainableContainer; [SerializeField] Text m_TrainLevel; [SerializeField] EquipTrainPropertyBarBehaviour[] m_PropertyBarBehaviours; [SerializeField] RectTransform m_MaxLevelContainer; [SerializeField] UIEffect m_EffectNormal; [SerializeField] UIEffect m_EffectMust; [SerializeField] Button m_Train; [SerializeField] Text m_AutoTrain; [SerializeField] Button m_Save; [SerializeField] Button m_GiveUp; [SerializeField] Button m_UpdateLevel; List levelBehaviours = new List(); EquipTrainModel model { get { return ModelCenter.Instance.GetModel(); } } EquipStarModel starModel { get { return ModelCenter.Instance.GetModel(); } } EquipModel equipModel { get { return ModelCenter.Instance.GetModel(); } } PackModel packModel { get { return ModelCenter.Instance.GetModel(); } } #region Built-in protected override void BindController() { } protected override void AddListeners() { m_Train.SetListener(Train); //m_Save.SetListener(Save); //m_GiveUp.SetListener(GiveUp); m_UpdateLevel.SetListener(UpdateLevel); } protected override void OnPreOpen() { model.autoTrain = false; packModel.refreshItemCountEvent += OnItemCountRefresh; if (model.selectedLevel.value == 0) { var equipPosition = model.GetRecommendEquipPosition(); model.SelectLevel(equipPosition.x); } } protected override void OnAfterOpen() { } protected override void OnPreClose() { packModel.refreshItemCountEvent -= OnItemCountRefresh; StopAllCoroutines(); model.autoTrain = false; } protected override void OnAfterClose() { model.ResetOperateParams(); } protected override void OnActived() { base.OnActived(); DisplayBaseInfo(); DisplayDynamicInfo(true); } protected override void LateUpdate() { base.LateUpdate(); DisplayDynamicInfo(false); } #endregion private void OnItemCountRefresh(PackType type, int index, int itemId) { if (type == PackType.Item && itemId == 5303) { var material = model.material.Fetch(); m_MaterialCell.Display(material.x, packModel.GetItemCountByID(PackType.Item, 5303), material.z); } if (type == PackType.Item && itemId == 5412) { model.inevitableMaterialCount.dirty = true; } } private void DisplayBaseInfo() { CreateLevelBehaviours(); } private void DisplayDynamicInfo(bool force) { if (force || model.selectedLevel.dirty) { model.autoTrain = false; DisplayCandidateSlots(model.selectedLevel.Fetch(), force); } if (force || model.selectedPlace.dirty) { model.autoTrain = false; var place = model.selectedPlace.Fetch(); if (place == 0) { m_OperateContainer.SetActive(false); m_EmptyContainer.SetActive(true); } else { m_OperateContainer.SetActive(true); m_EmptyContainer.SetActive(false); var equipPosition = new Int2(model.selectedLevel.value, model.selectedPlace.Fetch()); var equipGuid = equipModel.GetEquip(equipPosition); var equip = packModel.GetItemByGuid(equipGuid); if (equip != null) { m_EquipEmpty.SetActive(false); m_TargetEquip.SetActive(true); m_TargetEquip.Init(equip); m_TargetEquip.button.SetListener(ViewEquipTip); var starLevel = starModel.GetEquipStarLevel(equipPosition); m_EquipStar.SetActive(true); m_EquipStar.text = starLevel >= 1 ? Language.Get("EquipStarLevel", starLevel) : ""; } else { m_EquipEmpty.SetActive(true); m_TargetEquip.SetActive(false); m_EquipStar.SetActive(false); } } } if (force || model.equipTrainLevel.dirty) { var trainLevel = model.equipTrainLevel.Fetch(); m_TrainLevel.text = Language.Get("EquipWash1", Mathf.Clamp(trainLevel, 0, int.MaxValue)); } if (force || model.equipTrainMaxLevel.dirty) { var equipPosition = new Int2(model.selectedLevel.value, model.selectedPlace.value); var maxTrain = model.equipTrainMaxLevel.Fetch(); if (maxTrain < 0) { m_MaxTrainLevel.text = Language.Get("EquipWash2"); } else if (maxTrain >= 0) { var star = starModel.GetEquipStarLevel(equipPosition); m_MaxTrainLevel.text = Language.Get("EquipWash3", star, maxTrain); } else { m_MaxTrainLevel.text = Language.Get("EquipWash4"); } } if (force || model.trainLimit.dirty) { m_MaxLevelContainer.SetActive(model.trainLimit.Fetch()); } if (force || model.material.dirty) { DisplayMaterial(model.material.Fetch()); } if (force || model.inevitableMaterialCount.dirty) { var equipPosition = new Int2(model.selectedLevel.value, model.selectedPlace.value); DisplayInevitableMaterial(equipPosition, model.inevitableMaterialCount.Fetch()); } if (force || model.operateType.dirty) { DisplayOperateButton(model.operateType.Fetch()); } if (force || model.propertyBars.dirty) { DisplayProperty(model.propertyBars.Fetch()); } if (force || model.trainEffect.dirty) { DisplayTrainEffect(model.trainEffect.Fetch()); } } private void DisplayCandidateSlots(int selectedLevel, bool resetPosition) { for (var i = 0; i < levelBehaviours.Count; i++) { var behaviour = levelBehaviours[i]; if (behaviour.level != selectedLevel) { behaviour.Dispose(); } } RectTransform selectedBehaviour = null; for (var i = 0; i < levelBehaviours.Count; i++) { var behaviour = levelBehaviours[i]; if (behaviour.level == selectedLevel) { behaviour.Display(); selectedBehaviour = behaviour.transform as RectTransform; } } //if (resetPosition && selectedBehaviour != null) //{ // var height = 0f; // var totalHeight = 0f; // var index = selectedBehaviour.GetSiblingIndex(); // var childCount = m_LevelContainer.childCount; // for (var i = 0; i < childCount; i++) // { // var child = m_LevelContainer.GetChild(i); // if (i < index) // { // height += (child as RectTransform).rect.height; // } // totalHeight += (child as RectTransform).rect.height; // } // var viewRect = (m_LevelScrollRect.transform as RectTransform).rect; // if (totalHeight > viewRect.height) // { // m_LevelScrollRect.verticalNormalizedPosition = 1 - height / (totalHeight - viewRect.height); // } // else // { // m_LevelScrollRect.verticalNormalizedPosition = 1; // } //} } private void DisplayMaterial(Int3 material) { m_MaterialCell.Display(material.x, material.y, material.z); } private void DisplayInevitableMaterial(Int2 equipPosition, int need) { var trainable = model.GetEquipPlaceTrainState(equipPosition) == EquipTrainModel.TrainState.Allowable; if (trainable && need > 0) { var own = packModel.GetItemCountByID(PackType.Item, GeneralDefine.equipTrainMustItemId); var diamond = (need - own) * model.GetInevitableMaterialPrice(); m_InevitableMaterial.Display(false, need, own, diamond); } else { m_InevitableMaterial.Display(true, 0, 0, 0); } } private void DisplayProperty(List propertyBars) { var isTrainable = !propertyBars.IsNullOrEmpty(); if (isTrainable) { m_UnTrainableContainer.SetActive(false); m_TrainableContainer.SetActive(true); for (int i = 0; i < m_PropertyBarBehaviours.Length; i++) { var behaviour = m_PropertyBarBehaviours[i]; if (i < propertyBars.Count) { behaviour.SetActive(true); behaviour.Display(propertyBars[i]); } else { behaviour.SetActive(false); } } } else { m_UnTrainableContainer.SetActive(true); m_TrainableContainer.SetActive(false); } } private void DisplayOperateButton(EquipTrainModel.TrainOperateType opreateType) { if (opreateType == EquipTrainModel.TrainOperateType.Train||opreateType == EquipTrainModel.TrainOperateType.Save) { m_Train.SetActive(true); } else { m_Train.SetActive(false); model.autoTrain = false; } //自动保存 if (opreateType == EquipTrainModel.TrainOperateType.Save) { StartCoroutine("Co_SaveTrain"); } else { StopCoroutine("Co_SaveTrain"); } if (model.autoTrain && opreateType == EquipTrainModel.TrainOperateType.Train) { //自动洗炼 TrainEx(); } if (model.autoTrain) { m_AutoTrain.text = Language.Get("equipAutoTrain2"); } else { m_AutoTrain.text = Language.Get("equipAutoTrain1"); } m_Save.SetActive(false); m_GiveUp.SetActive(false); m_UpdateLevel.SetActive(opreateType == EquipTrainModel.TrainOperateType.LevelUp); } private void DisplayTrainEffect(int value) { switch (value) { case 1: m_EffectNormal.Play(); break; case 2: m_EffectMust.Play(); break; } } private void Train() { if (model.autoTrain) { model.autoTrain = false; m_AutoTrain.text = Language.Get("equipAutoTrain1"); return; } TrainEx(); } private void TrainEx() { var equipPosition = new Int2(model.selectedLevel.value, model.selectedPlace.value); var inevitables = new bool[3]; for (int i = 0; i < 3; i++) { inevitables[i] = model.propertyBars[i].inevitable.value; } model.Train(equipPosition, inevitables); } IEnumerator Co_SaveTrain() { yield return new WaitForSeconds(0.2f); var equipPosition = new Int2(model.selectedLevel.value, model.selectedPlace.value); model.Save(equipPosition); } private void GiveUp() { //var equipPosition = new Int2(model.selectedLevel.value, model.selectedPlace.value); //model.GiveUp(equipPosition); } private void UpdateLevel() { var equipPosition = new Int2(model.selectedLevel.value, model.selectedPlace.value); model.UpdateLevel(equipPosition); } private void ViewEquipTip() { var level = model.selectedLevel.value; var place = model.selectedPlace.value; var equipPosition = new Int2(level, place); var equipGuid = equipModel.GetEquip(equipPosition); ItemTipUtility.Show(equipGuid); } private void CreateLevelBehaviours() { var levels = equipModel.GetUnLockedEquipSetsByFuncID(91); var gap = levels.Count - levelBehaviours.Count; for (var i = 0; i < gap; i++) { var instance = UIUtility.CreateWidget("EquipTrainLevelBehaviour", "EquipTrainLevelBehaviour"); var behaviour = instance.GetComponent(); behaviour.transform.SetParentEx(m_LevelContainer, Vector3.zero, Quaternion.identity, Vector3.one); levelBehaviours.Add(behaviour); } for (var i = 0; i < levelBehaviours.Count; i++) { var behaviour = levelBehaviours[i]; if (i < levels.Count) { behaviour.SetActive(true); behaviour.UnInit(); behaviour.Init(levels[i]); } else { behaviour.UnInit(); behaviour.SetActive(false); } } } [Serializable] public class MaterialCell { public RectTransform m_LockContainer; public ItemBehaviour m_Material; public Text m_MaterialCount; public void Display(int itemId, int own, int need) { if (itemId > 0) { m_LockContainer.SetActive(false); m_Material.SetActive(true); m_MaterialCount.SetActive(true); m_Material.SetItem(itemId, 1); var enough = own >= need; m_MaterialCount.text = string.Format("{0}/{1}", UIHelper.AppendColor(enough ? TextColType.Green : TextColType.Red, own.ToString(), true), need); } else { m_LockContainer.SetActive(true); m_Material.SetActive(false); m_MaterialCount.SetActive(false); } } } [Serializable] public class InevitableMaterialCell { public RectTransform m_LockContainer; public ItemBehaviour m_InevitableMaterial; public Text m_InevitableMaterialCount; public RectTransform m_DiamondContainer; public Text m_DiamondCount; public void Display(bool locked, int need, int own, int diamond) { if (locked) { m_LockContainer.SetActive(true); m_InevitableMaterial.SetActive(false); m_InevitableMaterialCount.SetActive(false); m_DiamondContainer.SetActive(false); } else { m_LockContainer.SetActive(false); m_InevitableMaterial.SetActive(true); m_InevitableMaterialCount.SetActive(true); m_InevitableMaterial.SetItem(GeneralDefine.equipTrainMustItemId, 1); var enough = own >= need; m_InevitableMaterialCount.text = string.Format("{0}/{1}", UIHelper.AppendColor(enough ? TextColType.Green : TextColType.Red, own.ToString(), true), need); if (diamond > 0) { m_DiamondContainer.SetActive(true); m_DiamondCount.text = diamond.ToString(); } else { m_DiamondContainer.SetActive(false); } } } } } }