| using System; | 
| using System.Collections; | 
| using System.Collections.Generic; | 
| using Cysharp.Threading.Tasks; | 
|   | 
| using UnityEngine; | 
| using UnityEngine.UI; | 
|   | 
| //获得装备模板 | 
| public class EquipExchangeCell : MonoBehaviour | 
| { | 
|     [SerializeField] Image equipImage; | 
|     [SerializeField] Text itemName; | 
|     [SerializeField] Text qualityName; | 
|     [SerializeField] OutlineEx itemNameOutline; | 
|     [SerializeField] OutlineEx qualityNameOutline; | 
|     [SerializeField] Text placeName; | 
|     [SerializeField] Text lvText; | 
|     [SerializeField] Image bgFlower;    //背景花纹变色 | 
|     [SerializeField] Text fightPowerNum; | 
|     [SerializeField] GameObject fightPowerGO; | 
|     [SerializeField] GameObject equipedText; | 
|     [SerializeField] List<Text> baseAttrNames; | 
|     [SerializeField] List<Text> baseAttrValues; | 
|     [SerializeField] List<Image> baseAttrStates; | 
|     [SerializeField] GameObject fightAttrGameObj; | 
|     [SerializeField] List<GameObject> fightAttrLine; | 
|     [SerializeField] List<Text> fightAttrNames; | 
|     [SerializeField] List<Text> fightAttrValues; | 
|     [SerializeField] List<Image> fightAttrStates; | 
|     [SerializeField] GameObject decomposeObject; | 
|     [SerializeField] Toggle decomposeCheck; | 
|     [SerializeField] GameObject btnsGO; | 
|     [SerializeField] Button decomposeButton; | 
|     [SerializeField] Button exchangeButton; | 
|     [SerializeField] Button putonButton; | 
|   | 
|     [SerializeField] UIEffectPlayer uieffect; | 
|     [SerializeField] RectTransform bgRect; | 
|   | 
|     int cmpResult = 0;  // 装备对比结果 0相同 1更强 2更弱 | 
|     bool isToggle = true; | 
|   | 
|     void Start() | 
|     { | 
|         putonButton.AddListener(() => | 
|         { | 
|             EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)EquipModel.Instance.selectFloorEquip.gridIndex }, 2); | 
|         }); | 
|   | 
|         exchangeButton.AddListener(ExchangeEquip); | 
|         decomposeButton.AddListener(DecomposeEquip); | 
|   | 
|         decomposeCheck.onValueChanged.RemoveAllListeners(); | 
|         decomposeCheck.onValueChanged.AddListener((bool isOn) => | 
|         { | 
|             isToggle = !isToggle; | 
|         }); | 
|   | 
|     } | 
|     /// <summary> | 
|     ///  | 
|     /// </summary> | 
|     /// <param name="equip">本件装备物品数据</param> | 
|     /// <param name="isNewEquip">是否新装备(即掉落背包里的装备)</param> | 
|     public void Display(ItemModel equip, bool isNewEquip) | 
|     { | 
|         var oldEquip = PackManager.Instance.GetItemByIndex(PackType.Equip, EquipModel.Instance.selectFloorEquip.config.EquipPlace - 1); | 
|         if (oldEquip == null) | 
|             cmpResult = 1; | 
|   | 
|         equipImage.SetOrgSprite(equip.config.IconKey); | 
|         itemName.text = UIHelper.AppendColor(equip.config.ItemColor, equip.config.ItemName, true, 1); | 
|         qualityName.text = UIHelper.GetQualityNameWithColor(equip.config.ItemColor, Language.Get("L1039")); | 
|         itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor); | 
|         qualityNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor); | 
|         placeName.text = EquipModel.Instance.GetEquipPlaceName(equip.config.EquipPlace); | 
|         lvText.text = Language.Get("EquipExchangeWin7", EquipModel.Instance.GetEquipLV(equip)); | 
|         bgFlower.color = UIHelper.GetUIColor(equip.config.ItemColor); | 
|   | 
|         if (!isNewEquip) | 
|         { | 
|             equipedText.SetActive(true); | 
|             fightPowerGO.SetActive(false); | 
|             decomposeObject.SetActive(false); | 
|             btnsGO.SetActive(false); | 
|         } | 
|         else | 
|         { | 
|             equipedText.SetActive(false); | 
|             fightPowerGO.SetActive(true); | 
|             decomposeObject.SetActive(true); | 
|             btnsGO.SetActive(true); | 
|             decomposeCheck.isOn = isToggle; | 
|   | 
|             long showFightPower = FightPowerManager.Instance.GetFightPowerChange(EquipModel.Instance.selectFloorEquip); | 
|   | 
|             if (showFightPower < 0) | 
|             { | 
|                 fightPowerNum.text = UIHelper.AppendColor(TextColType.Red, $"-{UIHelper.ReplaceLargeNum(Math.Abs(showFightPower))}", false); | 
|                 cmpResult = 2; | 
|             } | 
|             else | 
|             { | 
|                 cmpResult = showFightPower > 0 ? 1 : 0; | 
|                 fightPowerNum.text = UIHelper.AppendColor(TextColType.Green, $"+{UIHelper.ReplaceLargeNum(showFightPower)}", false); | 
|   | 
|             } | 
|         } | 
|   | 
|         var baseAttrs = EquipModel.Instance.GetEquipBaseAttrs(equip); | 
|         var baseValues = EquipModel.Instance.GetEquipBaseValues(equip); | 
|         var fightAttrs = EquipModel.Instance.GetEquipFightAttrs(equip); | 
|         var fightValues = EquipModel.Instance.GetEquipFightValues(equip); | 
|   | 
|         for (var i = 0; i < baseAttrNames.Count; i++) | 
|         { | 
|             if (i >= baseAttrs.Count) | 
|             { | 
|                 baseAttrNames[i].text = ""; | 
|                 baseAttrValues[i].text = ""; | 
|             } | 
|             else | 
|             { | 
|                 baseAttrNames[i].text = PlayerPropertyConfig.Get(baseAttrs[i]).Name; | 
|                 baseAttrValues[i].text = PlayerPropertyConfig.GetValueDescription(baseAttrs[i], baseValues[i]); | 
|             } | 
|         } | 
|   | 
|         if (fightAttrs.IsNullOrEmpty()) | 
|         { | 
|             fightAttrGameObj.SetActive(false); | 
|         } | 
|         else | 
|         { | 
|             fightAttrGameObj.SetActive(true); | 
|             for (var i = 0; i < fightAttrNames.Count; i++) | 
|             { | 
|                 if (i >= fightAttrs.Count) | 
|                 { | 
|                     fightAttrNames[i].SetActive(false); | 
|                 } | 
|                 else | 
|                 { | 
|                     fightAttrNames[i].SetActive(true); | 
|                     fightAttrNames[i].text = PlayerPropertyConfig.Get(fightAttrs[i]).Name; | 
|                     fightAttrValues[i].text = PlayerPropertyConfig.GetValueDescription(fightAttrs[i], fightValues[i]); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         //先缩小,这样不会因为间隔帧产生明显的闪烁 | 
|         uieffect.transform.localScale = Vector3.zero; | 
|         ShowAttrState(isNewEquip); | 
|         RefreshEffect(equip).Forget(); | 
|     } | 
|   | 
|     //延迟处理特效大小 | 
|     async UniTask RefreshEffect(ItemModel equip) | 
|     {  | 
|         await UniTask.DelayFrame(3); | 
|         int effectID = EquipModel.Instance.equipUIEffects[Math.Min(equip.config.ItemColor, EquipModel.Instance.equipUIEffects.Length) - 1]; | 
|         if (effectID == 0) | 
|         { | 
|             uieffect.Stop(); | 
|         } | 
|         else | 
|         { | 
|             uieffect.Stop(); | 
|             uieffect.effectId = effectID; | 
|             //计算高度缩放比例 特效显示依赖rect的排版 | 
|             uieffect.transform.localScale = new Vector3(0.98f, bgRect.rect.height / uieffect.GetComponent<RectTransform>().rect.height, 1); | 
|             uieffect.Play(); | 
|         } | 
|     } | 
|   | 
|   | 
|     //替换装备 | 
|     void ExchangeEquip() | 
|     { | 
|         //穿更弱装备 要提示 | 
|         if (cmpResult == 2 && decomposeCheck.isOn) | 
|         { | 
|             ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), | 
|                 Language.Get("EquipExchangeWin4"), (bool ok) => | 
|                 { | 
|                     if (ok) | 
|                     { | 
|                         EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)EquipModel.Instance.selectFloorEquip.gridIndex }, 2, decomposeCheck.isOn); | 
|                     } | 
|                      | 
|                 }); | 
|         } | 
|         else | 
|         { | 
|             EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)EquipModel.Instance.selectFloorEquip.gridIndex }, 2, decomposeCheck.isOn); | 
|         } | 
|   | 
|     } | 
|   | 
|     //分解装备 | 
|     void DecomposeEquip() | 
|     { | 
|         //分解更强装备要提示 | 
|         if (cmpResult == 1) | 
|         { | 
|             ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), | 
|             Language.Get("EquipExchangeWin5"), (bool ok) => | 
|             { | 
|                 if (ok) | 
|                 { | 
|                     EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)EquipModel.Instance.selectFloorEquip.gridIndex }, 1); | 
|                 } | 
|                  | 
|             }); | 
|         } | 
|         else | 
|         { | 
|             EquipModel.Instance.SendEquipOP(new ushort[] { (ushort)EquipModel.Instance.selectFloorEquip.gridIndex }, 1); | 
|         } | 
|     } | 
|   | 
|     void ShowAttrState(bool isNewEquip) | 
|     { | 
|         ItemModel oldEquip = null; | 
|   | 
|         if (isNewEquip) | 
|         {  | 
|             //找对比装备 | 
|             oldEquip = PackManager.Instance.GetItemByIndex(PackType.Equip, EquipModel.Instance.selectFloorEquip.config.EquipPlace - 1); | 
|         } | 
|   | 
|         if (oldEquip == null) | 
|         { | 
|             for (int i = 0; i < baseAttrStates.Count; i++) | 
|             { | 
|                 baseAttrStates[i].SetActive(false); | 
|             } | 
|   | 
|             for (int i = 0; i < fightAttrStates.Count; i++) | 
|             { | 
|                 if (!isNewEquip) | 
|                 { | 
|                     //原装备不对比显示 | 
|                     fightAttrStates[i].SetActive(false); | 
|                     continue; | 
|                 } | 
|                 var list = EquipModel.Instance.GetEquipFightValues(EquipModel.Instance.selectFloorEquip); | 
|                 if (list == null || i >= list.Count) | 
|                 { | 
|                     fightAttrStates[i].SetActive(false); | 
|                 } | 
|                 else | 
|                 { | 
|                     fightAttrStates[i].SetActive(true); | 
|                     fightAttrStates[i].SetSprite("GiftState1"); | 
|                     fightAttrStates[i].SetNativeSize(); | 
|                 } | 
|             } | 
|   | 
|             return; | 
|         } | 
|   | 
|   | 
|         //基础属性 排序和个数是一致的 | 
|         for (int i = 0; i < baseAttrStates.Count; i++) | 
|         { | 
|             var list = EquipModel.Instance.GetEquipBaseValues(EquipModel.Instance.selectFloorEquip); | 
|             var list2 = EquipModel.Instance.GetEquipBaseValues(oldEquip); | 
|             if (list == null || i >= list.Count) | 
|             { | 
|                 baseAttrStates[i].SetActive(false); | 
|             } | 
|             else | 
|             { | 
|                 baseAttrStates[i].SetActive(true); | 
|                 var value = i < list2.Count ? list2[i] : 0; | 
|                 if (list[i] == value) | 
|                 { | 
|                     baseAttrStates[i].SetActive(false); | 
|                 } | 
|                 else | 
|                 { | 
|                     baseAttrStates[i].SetActive(true); | 
|                     baseAttrStates[i].SetSprite(value == 0 ? "GiftState1" : list[i] > value ? "EquipUpIcon" : "EquipDownIcon"); | 
|                     baseAttrStates[i].SetNativeSize(); | 
|                 } | 
|             } | 
|         } | 
|   | 
|         for (int i = 0; i < fightAttrStates.Count; i++) | 
|         { | 
|             //战斗属性 排序和个数不一致 根据ID进行对比 | 
|             var list = EquipModel.Instance.GetEquipFightValues(EquipModel.Instance.selectFloorEquip); | 
|             var list2 = EquipModel.Instance.GetEquipFightValues(oldEquip); | 
|   | 
|             var idList = EquipModel.Instance.GetEquipFightAttrs(EquipModel.Instance.selectFloorEquip); | 
|             var idList2 = EquipModel.Instance.GetEquipFightAttrs(oldEquip); | 
|   | 
|             if (list == null || i >= list.Count) | 
|             { | 
|                 fightAttrStates[i].SetActive(false); | 
|             } | 
|             else | 
|             { | 
|                 fightAttrStates[i].SetActive(true); | 
|                 var value = !list2.IsNullOrEmpty() && i < list2.Count ? list2[i] : 0; | 
|                 var id = !idList2.IsNullOrEmpty() && i < idList2.Count ? idList2[i] : 0; | 
|                 if (idList[i] == id && list[i] == value) | 
|                 { | 
|                     fightAttrStates[i].SetActive(false); | 
|                 } | 
|                 else | 
|                 { | 
|                     fightAttrStates[i].SetActive(true); | 
|                     if (idList[i] != id) | 
|                     { | 
|                         fightAttrStates[i].SetSprite("GiftState1"); | 
|                     } | 
|                     else | 
|                     { | 
|                         fightAttrStates[i].SetSprite(list[i] > value ? "EquipUpIcon" : "EquipDownIcon"); | 
|                     } | 
|                     fightAttrStates[i].SetNativeSize(); | 
|   | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
| } |