少年修仙传客户端代码仓库
System/EquipStar/EquipStarModel.cs
@@ -1,861 +1,786 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace Snxxz.UI
{
    public class EquipStarModel : Model, IPlayerLoginOk, IBeforePlayerDataInitialize
    {
        public readonly LogicInt selectedLevel = new LogicInt();
        public readonly LogicInt selectedPlace = new LogicInt();
        public readonly LogicInt equipStarLevel = new LogicInt();
        public readonly LogicInt equipMaxStarLevel = new LogicInt();
        public readonly LogicInt starUpgradeProbability = new LogicInt();
        public readonly LogicList<EquipStarUpgradeCandidate> candidatePlaces = new LogicList<EquipStarUpgradeCandidate>();
        public readonly LogicList<Star> stars = new LogicList<Star>();
        public readonly LogicList<string> normalMaterials = new LogicList<string>(); //已选择用于升星的装备
        public readonly LogicInt specialMaterial = new LogicInt();
        public readonly LogicInt starResultEffect = new LogicInt();
        public readonly LogicInt autoBuy = new LogicInt();
        public Int2 jumpEquipPos = Int2.zero;
        public List<string> useStarMaterials = new List<string>();  //可用于升星的装备
        public string biggestRateMaterial = string.Empty;  //低境界非红装的最高概率一件
        Dictionary<int, EquipSetStar> equipStars = new Dictionary<int, EquipSetStar>();
        public Dictionary<int, EquipSetStar> EquipStars { get { return equipStars; } }
        Redpoint redpoint = new Redpoint(106, 1720000);
        bool redpointDirty = false;
        LogicUpdate logicUpdate = new LogicUpdate(1);
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        EquipModel equipModel { get { return ModelCenter.Instance.GetModel<EquipModel>(); } }
        public override void Init()
        {
            ParseConfig();
            logicUpdate.Start(OnUpdate);
            packModel.refreshItemCountEvent += OnItemCountRefresh;
            DTC0721_tagMakeItemAnswer.MakeItemAnswerEvent += OnGetUpgradeStarResult;
            autoBuy.value = -1;
        }
        public override void UnInit()
        {
            packModel.refreshItemCountEvent -= OnItemCountRefresh;
            DTC0721_tagMakeItemAnswer.MakeItemAnswerEvent -= OnGetUpgradeStarResult;
        }
        public void OnBeforePlayerDataInitialize()
        {
            foreach (var equipStar in equipStars)
            {
                equipStar.Value.ResetStarLevel();
            }
        }
        public void OnPlayerLoginOk()
        {
        }
        public void UpdateStarLevels(HA3B1_tagMCEquipPartStarInfo info)
        {
            var selectedEquipOldStar = GetEquipStarLevel(new Int2(selectedLevel.value, selectedPlace.value));
            for (var i = 0; i < info.InfoList.Length; i++)
            {
                var equipPosition = EquipSet.ServerPlaceToClientPlace(info.InfoList[i].EquipPackIndex);
                var level = equipPosition.x;
                if (equipStars.ContainsKey(level))
                {
                    equipStars[level].UpdateEquipStarLevel(equipPosition.y, info.InfoList[i].Star);
                }
            }
            var starLevel = GetEquipStarLevel(new Int2(selectedLevel.value, selectedPlace.value));
            equipStarLevel.value = starLevel;
            selectedPlace.dirty = true;
            var maxStarLevel = GetMaxStarLevel(selectedLevel.value);
            UpdateSelelctedEquipStars(selectedEquipOldStar, starLevel, maxStarLevel);
            for (int i = 0; i < candidatePlaces.Count; i++)
            {
                var candidate = candidatePlaces[i];
                candidate.starLevel.value = GetEquipStarLevel(candidate.equipPosition);
            }
            redpointDirty = true;
        }
        void OnGetUpgradeStarResult(H0721_tagMakeItemAnswer info)
        {
            if (info.MakeType == (byte)MakeType.EquipStarUpgrade)
            {
                var equipPosition = new Int2(selectedLevel.value, selectedPlace.value);
                AutoAddMaterials(equipPosition);
                CalculateStarUpgradeProbability(equipPosition);
                if (info.Result == 1)
                {
                    var successModel = ModelCenter.Instance.GetModel<EquipStarSuccessModel>();
                    successModel.Show(equipPosition, GetStarLevel(equipPosition));
                    starResultEffect.value = 1;
                }
                else
                {
                    EffectMgr.Instance.PlayUIEffect(7066, 2500, WindowCenter.Instance.uiRoot.tipsCanvas, false);
                    SysNotifyMgr.Instance.ShowTip("StarLevelUpFail");
                    starResultEffect.value = -1;
                }
            }
        }
        //查询自动购买状态
        public void QueryAutoBuy()
        {
            var placeValue = selectedPlace.value;
            if (placeValue == 0) return;
            var equipPosition = new Int2(selectedLevel.value, placeValue);
            var currentStarLevel = GetEquipStarLevel(equipPosition);
            if (starUpgradeProbability.value >= 100)
            {
                autoBuy.value = GetItemsMoney(equipPosition, currentStarLevel + 1);
                return;
            }
            DoStarUpgrade(equipPosition, currentStarLevel + 1, 2);
        }
        //装备已填充100%后,客户端自己计算升星石价格
        public int GetItemsMoney(Int2 equipPosition, int starLevel)
        {
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, starLevel);
            if (config == null)
            {
                return 0;
            }
            int itemID = config.CostItemDict.x;
            int count = config.CostItemDict.y;
            if (itemID <= 0 || count <= 0) return 0;
            var shopConfig = StoreConfig.GetStoreCfg(itemID, 2, 5);
            if (shopConfig == null) return 0;
            int hasCnt = packModel.GetItemCountByID(PackType.Item, config.CostItemDict.x);
            int needCnt = count >= hasCnt ? count - hasCnt : 0;
            return needCnt * shopConfig.MoneyNumber;
        }
        public void DoStarUpgrade(Int2 equipPosition, int starLevel, int auto=0)
        {
            if (!equipStars.ContainsKey(equipPosition.x))
            {
                return;
            }
            var equip = packModel.GetItemByGuid(equipModel.GetEquip(equipPosition));
            if (equip == null)
            {
                return;
            }
            if (equip.config.ItemColor < 4)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp4");
                return;
            }
            var maxLevel = GetMaxStarLevel(equipPosition.x);
            if (starLevel > maxLevel)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp1");
                return;
            }
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, starLevel);
            if (config == null)
            {
                return;
            }
            if (config.CostItemDict.x > 0 && specialMaterial.value == 0 && auto == 0)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp2", config.CostItemDict.x);
                return;
            }
            if (config.CostItemDict.x > 0 && packModel.GetItemCountByID(PackType.Item, config.CostItemDict.x) < config.CostItemDict.y && auto == 0)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp2", config.CostItemDict.x);
                return;
            }
            var materialIndexs = new List<ushort>();
            var materialItemIds = new List<uint>();
            for (var i = 0; i < normalMaterials.Count; i++)
            {
                var material = normalMaterials[i];
                if (!string.IsNullOrEmpty(material))
                {
                    var item = packModel.GetItemByGuid(material);
                    materialIndexs.Add((ushort)item.gridIndex);
                    materialItemIds.Add((uint)item.itemId);
                }
            }
            Action sendInfo = () =>
            {
                var info = new CA5C5_tagCMEquipPartStarUp();
                info.EquipPackIndex = (ushort)EquipSet.ClientPlaceToServerPlace(equipPosition);
                info.CostEquipIndex = materialIndexs.ToArray();
                info.CostEquipID = materialItemIds.ToArray();
                info.CostEquipCnt = (byte)materialIndexs.Count;
                info.AutoBuy = (byte)auto;
                GameNetSystem.Instance.SendInfo(info);
            };
            if (starUpgradeProbability.value < 50 && auto == 0)
            {
                ConfirmCancel.ShowPopConfirm(
                    Language.Get("Mail101"),
                    Language.Get("EquipStarUpgradePossibility"),
                    () => { }
                );
            }
            else
            {
                sendInfo();
            }
        }
        public void ResetOperateParams()
        {
            if (autoBuy.value == -2) autoBuy.value = -1;
            selectedLevel.value = 0;
            selectedPlace.value = 0;
            equipStarLevel.value = 0;
            equipMaxStarLevel.value = 0;
            starUpgradeProbability.value = -1;
            starResultEffect.value = 0;
            normalMaterials.Clear();
            stars.Clear();
        }
        public Int2 GetRecommendEquipPosition()
        {
            foreach (var starSet in equipStars.Values)
            {
                var level = starSet.level;
                for (var place = 1; place <= 12; place++)
                {
                    var isRedpoint = starSet.GetRedpointState(place) != RedPointState.None;
                    if (isRedpoint)
                    {
                        return new Int2(level, place);
                    }
                }
            }
            foreach (var starSet in equipStars.Values)
            {
                var level = starSet.level;
                for (var i = 1; i <= 12; i++)
                {
                    var equipPosition = new Int2(level, i);
                    var item = packModel.GetItemByGuid(equipModel.GetEquip(equipPosition));
                    if (item == null)
                    {
                        continue;
                    }
                    var starLevel = GetStarLevel(equipPosition);
                    var maxStarLevel = GetMaxStarLevel(item.config.ItemColor, item.config.LV);
                    if (starLevel >= maxStarLevel)
                    {
                        continue;
                    }
                }
            }
            return new Int2(1, 1);
        }
        public void SelectLevel(int level)
        {
            selectedLevel.value = level;
            candidatePlaces.Clear();
            if (level > 0)
            {
               // int equipCnt = level < 2 ? 8 : 12;
                for (var i = 1; i <= 12; i++)
                {
                    var place = i;
                    var equipPosition = new Int2(level, place);
                    var candidate = new EquipStarUpgradeCandidate(equipPosition);
                    candidate.starLevel.value = GetEquipStarLevel(equipPosition);
                    candidatePlaces.Add(candidate);
                }
                candidatePlaces.Sort(EquipStarUpgradeCandidateCompare);
                SelectPlace(candidatePlaces[0].equipPosition);
            }
            else
            {
                SelectPlace(Int2.zero);
            }
        }
        public void SelectPlace(Int2 equipPosition)
        {
            selectedPlace.value = equipPosition.y;
            selectedPlace.dirty = true;
            if (equipPosition.x > 0 && equipPosition.y >= 1 && equipPosition.y <= 12)
            {
                for (int i = 0; i < candidatePlaces.Count; i++)
                {
                    var candidate = candidatePlaces[i];
                    candidate.selected.value = candidate.equipPosition == equipPosition;
                }
                var starLevel = GetEquipStarLevel(equipPosition);
                var maxStarLevel = GetMaxStarLevel(equipPosition.x);
                equipStarLevel.value = starLevel;
                equipMaxStarLevel.value = maxStarLevel;
                UpdateSelelctedEquipStars(starLevel, starLevel, maxStarLevel);
                AutoAddMaterials(equipPosition);
                CalculateStarUpgradeProbability(equipPosition);
            }
        }
        public bool IsEquipPlaceUpgradable(string equipGuid)
        {
            if (string.IsNullOrEmpty(equipGuid))
            {
                return false;
            }
            var equip = packModel.GetItemByGuid(equipGuid);
            if (equip == null)
            {
                return false;
            }
            var maxStarLevel = GetMaxStarLevel(equip.config.ItemColor, equip.config.LV);
            var currentStarLevel = GetEquipStarLevel(new Int2(equip.config.LV, equip.config.EquipPlace));
            return currentStarLevel < maxStarLevel;
        }
        public static int GetMaxStarLevel(int quality, int level)
        {
            var max = 0;
            if (GeneralDefine.equipStarLimit.ContainsKey(quality))
            {
                var itemLevelStars = GeneralDefine.equipStarLimit[quality];
                if (itemLevelStars.ContainsKey(level))
                {
                    max = itemLevelStars[level];
                }
            }
            return max;
        }
        public static int GetMaxStarLevel(int level)
        {
            var max = 0;
            foreach (var itemLevelStars in GeneralDefine.equipStarLimit.Values)
            {
                if (itemLevelStars.ContainsKey(level))
                {
                    if (itemLevelStars[level] > max)
                    {
                        max = itemLevelStars[level];
                    }
                }
            }
            return max;
        }
        public int GetEquipPositionMaxStarLevel(Int2 equipPosition)
        {
            var equipGuid = equipModel.GetEquip(equipPosition);
            if (equipGuid == null)
            {
                return 0;
            }
            var equip = packModel.GetItemByGuid(equipGuid);
            if (equip == null)
            {
                return 0;
            }
            return GetMaxStarLevel(equip.config.ItemColor, equip.config.LV);
        }
        public int GetTotalStarLevel(int level)
        {
            if (!equipStars.ContainsKey(level))
            {
                return 0;
            }
            return equipStars[level].GetTotalStarLevel();
        }
        /// <summary>
        /// 这是指已经装备位置已经升级到的星级,不考虑当前穿戴的装备
        /// </summary>
        /// <param name="equipPosition"></param>
        /// <returns></returns>
        public int GetStarLevel(Int2 equipPosition)
        {
            if (!equipStars.ContainsKey(equipPosition.x))
            {
                return 0;
            }
            return equipStars[equipPosition.x].GetEquipStarLevel(equipPosition.y);
        }
        /// <summary>
        /// 这是指受当前装备限制的星级,比如当前装备位已经升级到了9星,但是穿戴的装备最高可升级到6星,那么返回的值是6
        /// </summary>
        /// <param name="equipPosition"></param>
        /// <returns></returns>
        public int GetEquipStarLevel(Int2 equipPosition)
        {
            var starLevel = GetStarLevel(equipPosition);
            var maxLevel = GetEquipPositionMaxStarLevel(equipPosition);
            return Mathf.Min(starLevel, maxLevel);
        }
        public List<int> GetMaterialGetWays(Int2 equipPosition, int starLevel)
        {
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, starLevel);
            if (config == null)
            {
                return null;
            }
            var getWays = new List<int>();
            foreach (int place in config.CostEquipPlace)
            {
                var equipControlConfig = EquipControlConfig.Get(equipPosition.x, place);
                foreach (int getWay in equipControlConfig.getWays)
                {
                    if (!getWays.Contains(getWay))
                    {
                        getWays.Add(getWay);
                    }
                }
            }
            return getWays;
        }
        //1、可提升战力装备不显示.
        //2、红装排最后
        //3、境界,小于等级自身的优先显示
        //4、特殊处理概率【最高】的一件低境界非红装显示在第一件
        //筛选可用于升星的装备材料
        public List<string> GetMaterials(Int2 equipPosition, int starLevel)
        {
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, starLevel);
            if (config == null)
            {
                return null;
            }
            var equipGuid = equipModel.GetEquip(equipPosition);
            var equip = packModel.GetItemByGuid(equipGuid);
            if (equip == null)
            {
                return null;
            }
            var expcetMaterials = packModel.GetItems(PackType.Item, new SinglePack.FilterParams()
            {
                qualitys = new List<int>(config.CostEquipColor),
                equipTypes = new List<int>(config.CostEquipPlace),
                jobs = config.IsJobLimit == 1 ? new List<int>() { PlayerDatas.Instance.baseData.Job } : null,
            });
            float rate = 0;
            var materialGuids = new List<string>();
            foreach (var item in expcetMaterials)
            {
                if (ItemLogicUtility.Instance.IsFightUpEx(item.itemId, item.score, item.config.RealmLimit) == -1)
                {
                    //4、特殊处理概率【最高】的一件低境界非红装显示在第一件
                    if (item.config.ItemColor <= 4 && item.config.RealmLimit <= PlayerDatas.Instance.baseData.realmLevel)
                    {
                        var tmpRate = GetMaterialSuccessRate(equipPosition, item.guid);
                        if (rate < tmpRate)
                        {
                            biggestRateMaterial = item.guid;
                            rate = tmpRate;
                        }
                    }
                    //不显示更高战力的装备
                    materialGuids.Add(item.guid);
                }
            }
            materialGuids.Remove(biggestRateMaterial);
            return materialGuids;
        }
        public void AddMaterial(string guid)
        {
            if (!normalMaterials.Contains(guid))
            {
                normalMaterials.Add(guid);
                CalculateStarUpgradeProbability(new Int2(selectedLevel.value, selectedPlace.value));
            }
        }
        public void RemoveMaterial(string guid)
        {
            if (normalMaterials.Contains(guid))
            {
                normalMaterials.Remove(guid);
                CalculateStarUpgradeProbability(new Int2(selectedLevel.value, selectedPlace.value));
            }
        }
        private void AutoAddMaterials(Int2 equipPosition)
        {
            var equipGuid = equipModel.GetEquip(equipPosition);
            var upgradable = IsEquipPlaceUpgradable(equipGuid);
            if (upgradable)
            {
                normalMaterials.Clear();
                var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, GetEquipStarLevel(equipPosition) + 1);
                if (config.CostItemDict.x > 0)
                {
                    var itemId = config.CostItemDict.x;
                    specialMaterial.value = itemId;
                }
                else
                {
                    specialMaterial.value = 0;
                }
            }
            else
            {
                normalMaterials.Clear();
            }
            CalculateStarUpgradeProbability(new Int2(selectedLevel.value, selectedPlace.value));
        }
        public void CalculateStarUpgradeProbability(Int2 equipPosition)
        {
            var probability = 0f;
            var equipGuid = equipModel.GetEquip(equipPosition);
            var upgradable = IsEquipPlaceUpgradable(equipGuid);
            if (upgradable)
            {
                var currentStarLevel = GetEquipStarLevel(equipPosition);
                var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, currentStarLevel + 1);
                if (config != null && config.CostEquipCnt == 0)
                {
                    if (config.CostItemDict.x > 0)
                    {
                        var own = packModel.GetItemCountByID(PackType.Item, config.CostItemDict.x);
                        probability = own >= config.CostItemDict.y ? 1f : 0f;
                    }
                    else
                    {
                        probability = 0f;
                    }
                }
                else
                {
                    for (int i = 0; i < normalMaterials.Count; i++)
                    {
                        var material = normalMaterials[i];
                        probability += GetMaterialSuccessRate(equipPosition, material);
                    }
                }
                // 95%以上概率 则为100%
                int value = Mathf.RoundToInt(probability * 100);
                if (value >= 95 && value < 100)
                    value = 100;
                starUpgradeProbability.value = value;
                starUpgradeProbability.dirty = true;
            }
            else
            {
                starUpgradeProbability.value = -1;
            }
        }
        public float GetMaterialSuccessRate(Int2 equipPosition, string guid)
        {
            if (string.IsNullOrEmpty(guid))
            {
                return 0f;
            }
            var item = packModel.GetItemByGuid(guid);
            if (item == null)
            {
                return 0f;
            }
            var currentStarLevel = GetEquipStarLevel(equipPosition);
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, currentStarLevel + 1);
            if (config == null)
            {
                return 0f;
            }
            var amendLevel = item.config.LV - equipPosition.x;
            var amendRate = 1f;
            if (amendLevel > 0)
            {
                amendRate = 1 + amendLevel * GeneralDefine.equipStarUpAmendFactor * 0.01f;
            }
            else
            {
                amendRate = 1 + amendLevel * GeneralDefine.equipStarDownAmendFactor * 0.01f;
            }
            var successRate = 0.5f;
            var isSuit = item.config.SuiteiD > 0;
            if (isSuit)
            {
                successRate = Mathf.Clamp(Mathf.CeilToInt((float)Math.Round(config.SuitRate * amendRate, 2)), GeneralDefine.suitEquipStarUpgradeRateFloor, GeneralDefine.suitEquipStarUpgradeRateCeiling);
            }
            else
            {
                successRate = Mathf.Clamp(Mathf.CeilToInt((float)Math.Round(config.UnSuitRate * amendRate, 2)), GeneralDefine.normalEquipStarUpgradeRateFloor, GeneralDefine.normalEquipStarUpgradeRateCeiling);
            }
            return successRate * 0.01f;
        }
        private void UpdateSelelctedEquipStars(int oldStarLevel, int newStarLevel, int maxStarLevel)
        {
            stars.Clear();
            for (var i = 1; i <= maxStarLevel; i++)
            {
                stars.Add(new Star()
                {
                    actived = i <= newStarLevel,
                    newGet = i <= newStarLevel && i > oldStarLevel,
                });
            }
        }
        private void OnItemCountRefresh(PackType type, int index, int itemId)
        {
            switch (type)
            {
                case PackType.Item:
                    if (ItemLogicUtility.Instance.IsRealmEquip(itemId))
                    {
                        redpointDirty = true;
                    }
                    var itemConfig = ItemConfig.Get(itemId);
                    if (itemConfig.Type == 34)
                    {
                        redpointDirty = true;
                    }
                    break;
                case PackType.Equip:
                    var clientEquipPosition = EquipSet.ServerPlaceToClientPlace(index);
                    if (clientEquipPosition.x > 0)
                    {
                        redpointDirty = true;
                    }
                    break;
            }
        }
        private void UpdateStarRedpoint()
        {
            var targetEquipPosition = Int2.zero;
            var minStarLevel = 999;
            foreach (var trainSet in equipStars.Values)
            {
                var level = trainSet.level;
                for (var place = 1; place <= 12; place++)
                {
                    var equipPosition = new Int2(level, place);
                    var item = packModel.GetItemByGuid(equipModel.GetEquip(equipPosition));
                    if (item == null)
                    {
                        continue;
                    }
                    //达到最大星级
                    var maxStarLevel = GetMaxStarLevel(item.config.ItemColor, item.config.LV);
                    var starLevel = GetStarLevel(new Int2(level, place));
                    if (starLevel >= maxStarLevel)
                    {
                        continue;
                    }
                    //不是候选者中星级最小的
                    if (targetEquipPosition != Int2.zero && starLevel >= minStarLevel)
                    {
                        continue;
                    }
                    var config = EquipStarConfig.Get(level, place, starLevel + 1);
                    if (config == null)
                    {
                        continue;
                    }
                    //固定材料不足
                    if (config.CostItemDict.x > 0 && packModel.GetItemCountByID(PackType.Item, config.CostItemDict.x) < config.CostItemDict.y)
                    {
                        continue;
                    }
                    var materials = packModel.GetItems(PackType.Item, new SinglePack.FilterParams()
                    {
                        qualitys = new List<int>(config.CostEquipColor),
                        equipTypes = new List<int>(config.CostEquipPlace),
                        levels = new List<int>() { item.config.LV },
                        jobs = config.IsJobLimit == 1 ? new List<int>() { PlayerDatas.Instance.baseData.Job } : null,
                    });
                    for (int j = materials.Count - 1; j >= 0; j--)
                    {
                        var material = materials[j];
                        if (ItemLogicUtility.Instance.IsFightUp(material.itemId, material.score) == 1)
                        {
                            materials.RemoveAt(j);
                        }
                    }
                    var successRate = 0f;
                    foreach (var material in materials)
                    {
                        successRate += GetMaterialSuccessRate(equipPosition, material.guid);
                        if (successRate >= 0.5f)
                        {
                            break;
                        }
                    }
                    if (successRate < 0.5f)
                    {
                        continue;
                    }
                    minStarLevel = starLevel;
                    targetEquipPosition = new Int2(level, place);
                }
            }
            foreach (var starSet in equipStars.Values)
            {
                var level = starSet.level;
                if (!equipModel.IsLevelUnLocked(level))
                {
                    continue;
                }
                for (var place = 1; place <= 12; place++)
                {
                    var isRedpoint = level == targetEquipPosition.x && place == targetEquipPosition.y;
                    starSet.UpdateRedpoint(place, isRedpoint ? RedPointState.Simple : RedPointState.None);
                }
            }
        }
        private void OnUpdate()
        {
            if (redpointDirty && FuncOpen.Instance.IsFuncOpen(172))
            {
                redpointDirty = false;
                UpdateStarRedpoint();
            }
        }
        private int EquipStarUpgradeCandidateCompare(EquipStarUpgradeCandidate x, EquipStarUpgradeCandidate y)
        {
            var guidX = equipModel.GetEquip(x.equipPosition);
            var guidY = equipModel.GetEquip(y.equipPosition);
            if (!string.IsNullOrEmpty(guidX) && string.IsNullOrEmpty(guidY))
            {
                return -1;
            }
            if (string.IsNullOrEmpty(guidX) && !string.IsNullOrEmpty(guidY))
            {
                return 1;
            }
            return x.equipPosition.y.CompareTo(y.equipPosition.y);
            //var factorX = x.equipPosition.x * 100 + x.equipPosition.y;
            //var factorY = y.equipPosition.x * 100 + y.equipPosition.y;
            //if (string.IsNullOrEmpty(guidX) && string.IsNullOrEmpty(guidY))
            //{
            //    return factorX.CompareTo(factorY);
            //}
            //var equipX = packModel.GetItemByGuid(guidX);
            //var equipY = packModel.GetItemByGuid(guidY);
            //var canUpgradeStarLevelX = GetMaxStarLevel(equipX.config.ItemColor, equipX.config.LV) - GetStarLevel(x.equipPosition);
            //var canUpgradeStarLevelY = GetMaxStarLevel(equipY.config.ItemColor, equipY.config.LV) - GetStarLevel(y.equipPosition);
            //var compareResult = canUpgradeStarLevelX.CompareTo(canUpgradeStarLevelY);
            //if (compareResult != 0)
            //{
            //    return -compareResult;
            //}
            //return factorX.CompareTo(factorY);
        }
        private void ParseConfig()
        {
            var configs = EquipStarConfig.GetValues();
            foreach (var config in configs)
            {
                if (!equipStars.ContainsKey(config.Level))
                {
                    equipStars[config.Level] = new EquipSetStar(config.Level);
                }
            }
        }
        public struct Star
        {
            public bool actived;
            public bool newGet;
        }
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace Snxxz.UI
{
    public class EquipStarModel : Model, IPlayerLoginOk, IBeforePlayerDataInitialize
    {
        public readonly LogicInt selectedLevel = new LogicInt();
        public readonly LogicInt selectedPlace = new LogicInt();
        public readonly LogicInt equipStarLevel = new LogicInt();
        public readonly LogicInt equipMaxStarLevel = new LogicInt();
        public readonly LogicList<EquipStarUpgradeCandidate> candidatePlaces = new LogicList<EquipStarUpgradeCandidate>();
        public readonly LogicList<Star> stars = new LogicList<Star>();
        public readonly LogicInt specialMaterial = new LogicInt();
        public readonly LogicInt specialMaterial2 = new LogicInt();
        public readonly LogicInt starResultEffect = new LogicInt();
        public readonly LogicInt autoBuy = new LogicInt();
        public Int2 jumpEquipPos = Int2.zero;
        public List<string> useStarMaterials = new List<string>();  //可用于升星的装备
        public string biggestRateMaterial = string.Empty;  //低境界非红装的最高概率一件
        Dictionary<int, EquipSetStar> equipStars = new Dictionary<int, EquipSetStar>();
        public Dictionary<int, EquipSetStar> EquipStars { get { return equipStars; } }
        Redpoint redpoint = new Redpoint(106, 1720000);
        bool redpointDirty = false;
        LogicUpdate logicUpdate = new LogicUpdate(1);
        PackModel packModel { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
        EquipModel equipModel { get { return ModelCenter.Instance.GetModel<EquipModel>(); } }
        public static List<int> StarList = new List<int> { 0, 3, 6, 9, 12, 15, 18 };
    public override void Init()
        {
            ParseConfig();
            logicUpdate.Start(OnUpdate);
            packModel.refreshItemCountEvent += OnItemCountRefresh;
            DTC0721_tagMakeItemAnswer.MakeItemAnswerEvent += OnGetUpgradeStarResult;
            autoBuy.value = -1;
        }
        public override void UnInit()
        {
            packModel.refreshItemCountEvent -= OnItemCountRefresh;
            DTC0721_tagMakeItemAnswer.MakeItemAnswerEvent -= OnGetUpgradeStarResult;
        }
        public void OnBeforePlayerDataInitialize()
        {
            foreach (var equipStar in equipStars)
            {
                equipStar.Value.ResetStarLevel();
            }
        }
        public void OnPlayerLoginOk()
        {
        }
        public void UpdateStarLevels(HA3B1_tagMCEquipPartStarInfo info)
        {
            var selectedEquipOldStar = GetEquipStarLevel(new Int2(selectedLevel.value, selectedPlace.value));
            for (var i = 0; i < info.InfoList.Length; i++)
            {
                var equipPosition = EquipSet.ServerPlaceToClientPlace(info.InfoList[i].EquipPackIndex);
                var level = equipPosition.x;
                if (equipStars.ContainsKey(level))
                {
                    equipStars[level].UpdateEquipStarLevel(equipPosition.y, info.InfoList[i].Star);
                }
            }
            var starLevel = GetEquipStarLevel(new Int2(selectedLevel.value, selectedPlace.value));
            equipStarLevel.value = starLevel;
            selectedPlace.dirty = true;
            var maxStarLevel = GetMaxStarLevel(selectedLevel.value);
            UpdateSelelctedEquipStars(selectedEquipOldStar, starLevel, maxStarLevel);
            for (int i = 0; i < candidatePlaces.Count; i++)
            {
                var candidate = candidatePlaces[i];
                candidate.starLevel.value = GetEquipStarLevel(candidate.equipPosition);
            }
            redpointDirty = true;
        }
        void OnGetUpgradeStarResult(H0721_tagMakeItemAnswer info)
        {
            if (info.MakeType == (byte)MakeType.EquipStarUpgrade)
            {
                var equipPosition = new Int2(selectedLevel.value, selectedPlace.value);
                AutoAddMaterials(equipPosition);
                if (info.Result == 1)
                {
                    var successModel = ModelCenter.Instance.GetModel<EquipStarSuccessModel>();
                    successModel.Show(equipPosition, GetStarLevel(equipPosition));
                    starResultEffect.value = 1;
                }
                else
                {
                    EffectMgr.Instance.PlayUIEffect(7066, 2500, WindowCenter.Instance.uiRoot.tipsCanvas, false);
                    SysNotifyMgr.Instance.ShowTip("StarLevelUpFail");
                    starResultEffect.value = -1;
                }
            }
        }
        //装备已填充100%后,客户端自己计算升星石价格
        public int GetItemsMoney(Int2 equipPosition, int starLevel)
        {
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, starLevel);
            if (config == null)
            {
                return 0;
            }
            int itemID = config.CostItemDict[0].x;
            int count = config.CostItemDict[0].y;
            if (itemID <= 0 || count <= 0) return 0;
            var shopConfig = StoreConfig.GetStoreCfg(itemID, 2, 5);
            if (shopConfig == null) return 0;
            int hasCnt = packModel.GetItemCountByID(PackType.Item, config.CostItemDict[0].x);
            int needCnt = count >= hasCnt ? count - hasCnt : 0;
            return needCnt * shopConfig.MoneyNumber;
        }
        public void DoStarUpgrade(Int2 equipPosition, int starLevel, int auto=0)
        {
            if (!equipStars.ContainsKey(equipPosition.x))
            {
                return;
            }
            var equip = packModel.GetItemByGuid(equipModel.GetEquip(equipPosition));
            if (equip == null)
            {
                return;
            }
            if (equip.config.ItemColor < 4)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp4");
                return;
            }
            var maxLevel = GetMaxStarLevel(equipPosition.x);
            if (starLevel > maxLevel)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp1");
                return;
            }
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, starLevel);
            if (config == null)
            {
                return;
            }
            if (config.CostItemDict[0].x > 0 && specialMaterial.value == 0 && auto == 0)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp2", config.CostItemDict[0].x);
                return;
            }
            if (config.CostItemDict.Length > 1 && config.CostItemDict[1].x > 0 && specialMaterial2.value == 0 )
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp2", config.CostItemDict[1].x);
                return;
            }
            if (config.CostItemDict[0].x > 0 && packModel.GetItemCountByID(PackType.Item, config.CostItemDict[0].x) < config.CostItemDict[0].y && auto == 0)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp2", config.CostItemDict[0].x);
                return;
            }
            if (config.CostItemDict.Length > 1 && config.CostItemDict[1].x > 0 &&
                packModel.GetItemCountByID(PackType.Item, config.CostItemDict[1].x) < config.CostItemDict[1].y)
            {
                SysNotifyMgr.Instance.ShowTip("StarLevelUp2", config.CostItemDict[1].x);
                return;
            }
            var materialIndexs = new List<ushort>();
            var materialItemIds = new List<uint>();
            Action sendInfo = () =>
            {
                var info = new CA5C5_tagCMEquipPartStarUp();
                info.EquipPackIndex = (ushort)EquipSet.ClientPlaceToServerPlace(equipPosition);
                info.CostEquipIndex = materialIndexs.ToArray();
                info.CostEquipID = materialItemIds.ToArray();
                info.CostEquipCnt = (byte)materialIndexs.Count;
                info.AutoBuy = (byte)auto;
                GameNetSystem.Instance.SendInfo(info);
            };
            sendInfo();
        }
        public void ResetOperateParams()
        {
            if (autoBuy.value == -2) autoBuy.value = -1;
            selectedLevel.value = 0;
            selectedPlace.value = 0;
            equipStarLevel.value = 0;
            equipMaxStarLevel.value = 0;
            starResultEffect.value = 0;
            stars.Clear();
        }
        public Int2 GetRecommendEquipPosition()
        {
            foreach (var starSet in equipStars.Values)
            {
                var level = starSet.level;
                for (var place = 1; place <= 12; place++)
                {
                    var isRedpoint = starSet.GetRedpointState(place) != RedPointState.None;
                    if (isRedpoint)
                    {
                        return new Int2(level, place);
                    }
                }
            }
            foreach (var starSet in equipStars.Values)
            {
                var level = starSet.level;
                for (var i = 1; i <= 12; i++)
                {
                    var equipPosition = new Int2(level, i);
                    var item = packModel.GetItemByGuid(equipModel.GetEquip(equipPosition));
                    if (item == null)
                    {
                        continue;
                    }
                    var starLevel = GetStarLevel(equipPosition);
                    var maxStarLevel = GetMaxStarLevel(item.config.ItemColor, item.config.LV);
                    if (starLevel >= maxStarLevel)
                    {
                        continue;
                    }
                }
            }
            return new Int2(1, 1);
        }
        public void SelectLevel(int level)
        {
            selectedLevel.value = level;
            candidatePlaces.Clear();
            if (level > 0)
            {
               // int equipCnt = level < 2 ? 8 : 12;
                for (var i = 1; i <= 12; i++)
                {
                    var place = i;
                    var equipPosition = new Int2(level, place);
                    var candidate = new EquipStarUpgradeCandidate(equipPosition);
                    candidate.starLevel.value = GetEquipStarLevel(equipPosition);
                    candidatePlaces.Add(candidate);
                }
                candidatePlaces.Sort(EquipStarUpgradeCandidateCompare);
                SelectPlace(candidatePlaces[0].equipPosition);
            }
            else
            {
                SelectPlace(Int2.zero);
            }
        }
        public void SelectPlace(Int2 equipPosition)
        {
            selectedPlace.value = equipPosition.y;
            selectedPlace.dirty = true;
            if (equipPosition.x > 0 && equipPosition.y >= 1 && equipPosition.y <= 12)
            {
                for (int i = 0; i < candidatePlaces.Count; i++)
                {
                    var candidate = candidatePlaces[i];
                    candidate.selected.value = candidate.equipPosition == equipPosition;
                }
                var starLevel = GetEquipStarLevel(equipPosition);
                var maxStarLevel = GetMaxStarLevel(equipPosition.x);
                equipStarLevel.value = starLevel;
                equipMaxStarLevel.value = maxStarLevel;
                UpdateSelelctedEquipStars(starLevel, starLevel, maxStarLevel);
                AutoAddMaterials(equipPosition);
            }
        }
        //是否可升星
        public bool IsEquipPlaceUpgradable(string equipGuid)
        {
            if (string.IsNullOrEmpty(equipGuid))
            {
                return false;
            }
            var equip = packModel.GetItemByGuid(equipGuid);
            if (equip == null)
            {
                return false;
            }
            var maxStarLevel = GetMaxStarLevel(equip.config.ItemColor, equip.config.LV);
            var currentStarLevel = GetEquipStarLevel(new Int2(equip.config.LV, equip.config.EquipPlace));
            return currentStarLevel < maxStarLevel;
        }
        public static int GetMaxStarLevel(int quality, int level)
        {
            var max = 0;
            if (GeneralDefine.equipStarLimit.ContainsKey(quality))
            {
                var itemLevelStars = GeneralDefine.equipStarLimit[quality];
                if (itemLevelStars.ContainsKey(level))
                {
                    max = itemLevelStars[level];
                }
            }
            return max;
        }
        public static int GetMaxStarLevel(int level)
        {
            var max = 0;
            foreach (var itemLevelStars in GeneralDefine.equipStarLimit.Values)
            {
                if (itemLevelStars.ContainsKey(level))
                {
                    if (itemLevelStars[level] > max)
                    {
                        max = itemLevelStars[level];
                    }
                }
            }
            return max;
        }
        public int GetEquipPositionMaxStarLevel(Int2 equipPosition)
        {
            var equipGuid = equipModel.GetEquip(equipPosition);
            if (equipGuid == null)
            {
                return 0;
            }
            var equip = packModel.GetItemByGuid(equipGuid);
            if (equip == null)
            {
                return 0;
            }
            return GetMaxStarLevel(equip.config.ItemColor, equip.config.LV);
        }
        public int GetTotalStarLevel(int level)
        {
            if (!equipStars.ContainsKey(level))
            {
                return 0;
            }
            return equipStars[level].GetTotalStarLevel();
        }
        /// <summary>
        /// 这是指已经装备位置已经升级到的星级,不考虑当前穿戴的装备
        /// </summary>
        /// <param name="equipPosition"></param>
        /// <returns></returns>
        public int GetStarLevel(Int2 equipPosition)
        {
            if (!equipStars.ContainsKey(equipPosition.x))
            {
                return 0;
            }
            return equipStars[equipPosition.x].GetEquipStarLevel(equipPosition.y);
        }
        /// <summary>
        /// 这是指受当前装备限制的星级,比如当前装备位已经升级到了9星,但是穿戴的装备最高可升级到6星,那么返回的值是6
        /// </summary>
        /// <param name="equipPosition"></param>
        /// <returns></returns>
        public int GetEquipStarLevel(Int2 equipPosition)
        {
            var starLevel = GetStarLevel(equipPosition);
            var maxLevel = GetEquipPositionMaxStarLevel(equipPosition);
            return Mathf.Min(starLevel, maxLevel);
        }
        public List<int> GetMaterialGetWays(Int2 equipPosition, int starLevel)
        {
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, starLevel);
            if (config == null)
            {
                return null;
            }
            var getWays = new List<int>();
            foreach (int place in config.CostEquipPlace)
            {
                var equipControlConfig = EquipControlConfig.Get(equipPosition.x, place);
                foreach (int getWay in equipControlConfig.getWays)
                {
                    if (!getWays.Contains(getWay))
                    {
                        getWays.Add(getWay);
                    }
                }
            }
            return getWays;
        }
        //1、可提升战力装备不显示.
        //2、红装排最后
        //3、境界,小于等级自身的优先显示
        //4、特殊处理概率【最高】的一件低境界非红装显示在第一件
        //筛选可用于升星的装备材料
        public List<string> GetMaterials(Int2 equipPosition, int starLevel)
        {
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, starLevel);
            if (config == null)
            {
                return null;
            }
            var equipGuid = equipModel.GetEquip(equipPosition);
            var equip = packModel.GetItemByGuid(equipGuid);
            if (equip == null)
            {
                return null;
            }
            var expcetMaterials = packModel.GetItems(PackType.Item, new SinglePack.FilterParams()
            {
                qualitys = new List<int>(config.CostEquipColor),
                equipTypes = new List<int>(config.CostEquipPlace),
                jobs = config.IsJobLimit == 1 ? new List<int>() { PlayerDatas.Instance.baseData.Job } : null,
            });
            float rate = 0;
            var materialGuids = new List<string>();
            foreach (var item in expcetMaterials)
            {
                if (ItemLogicUtility.Instance.IsFightUpEx(item.itemId, item.score, item.config.RealmLimit) == -1)
                {
                    //4、特殊处理概率【最高】的一件低境界非红装显示在第一件
                    if (item.config.ItemColor <= 4 && item.config.RealmLimit <= PlayerDatas.Instance.baseData.realmLevel)
                    {
                        var tmpRate = GetMaterialSuccessRate(equipPosition, item.guid);
                        if (rate < tmpRate)
                        {
                            biggestRateMaterial = item.guid;
                            rate = tmpRate;
                        }
                    }
                    //不显示更高战力的装备
                    materialGuids.Add(item.guid);
                }
            }
            materialGuids.Remove(biggestRateMaterial);
            return materialGuids;
        }
        private void AutoAddMaterials(Int2 equipPosition)
        {
            var equipGuid = equipModel.GetEquip(equipPosition);
            var upgradable = IsEquipPlaceUpgradable(equipGuid);
            if (upgradable)
            {
                var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, GetEquipStarLevel(equipPosition) + 1);
                if (config.CostItemDict.Length > 0 && config.CostItemDict[0].x > 0)
                {
                    var itemId = config.CostItemDict[0].x;
                    specialMaterial.value = itemId;
                }
                else
                {
                    specialMaterial.value = 0;
                }
                if (config.CostItemDict.Length > 1)
                {
                    var itemId = config.CostItemDict[1].x;
                    specialMaterial2.value = itemId;
                }
                else
                {
                    specialMaterial2.value = 0;
                }
            }
        }
        public float GetMaterialSuccessRate(Int2 equipPosition, string guid)
        {
            if (string.IsNullOrEmpty(guid))
            {
                return 0f;
            }
            var item = packModel.GetItemByGuid(guid);
            if (item == null)
            {
                return 0f;
            }
            var currentStarLevel = GetEquipStarLevel(equipPosition);
            var config = EquipStarConfig.Get(equipPosition.x, equipPosition.y, currentStarLevel + 1);
            if (config == null)
            {
                return 0f;
            }
            var amendLevel = item.config.LV - equipPosition.x;
            var amendRate = 1f;
            if (amendLevel > 0)
            {
                amendRate = 1 + amendLevel * GeneralDefine.equipStarUpAmendFactor * 0.01f;
            }
            else
            {
                amendRate = 1 + amendLevel * GeneralDefine.equipStarDownAmendFactor * 0.01f;
            }
            var successRate = 0.5f;
            var isSuit = item.config.SuiteiD > 0;
            if (isSuit)
            {
                successRate = Mathf.Clamp(Mathf.CeilToInt((float)Math.Round(config.SuitRate * amendRate, 2)), GeneralDefine.suitEquipStarUpgradeRateFloor, GeneralDefine.suitEquipStarUpgradeRateCeiling);
            }
            else
            {
                successRate = Mathf.Clamp(Mathf.CeilToInt((float)Math.Round(config.UnSuitRate * amendRate, 2)), GeneralDefine.normalEquipStarUpgradeRateFloor, GeneralDefine.normalEquipStarUpgradeRateCeiling);
            }
            return successRate * 0.01f;
        }
        private void UpdateSelelctedEquipStars(int oldStarLevel, int newStarLevel, int maxStarLevel)
        {
            stars.Clear();
            for (var i = 1; i <= maxStarLevel; i++)
            {
                stars.Add(new Star()
                {
                    actived = i <= newStarLevel,
                    newGet = i <= newStarLevel && i > oldStarLevel,
                });
            }
        }
        private void OnItemCountRefresh(PackType type, int index, int itemId)
        {
            switch (type)
            {
                case PackType.Item:
                    if (ItemLogicUtility.Instance.IsRealmEquip(itemId))
                    {
                        redpointDirty = true;
                    }
                    var itemConfig = ItemConfig.Get(itemId);
                    if (itemConfig.Type == 34)
                    {
                        redpointDirty = true;
                    }
                    break;
                case PackType.Equip:
                    var clientEquipPosition = EquipSet.ServerPlaceToClientPlace(index);
                    if (clientEquipPosition.x > 0)
                    {
                        redpointDirty = true;
                    }
                    break;
            }
        }
        private void UpdateStarRedpoint()
        {
            var targetEquipPosition = Int2.zero;
            var minStarLevel = 999;
            foreach (var trainSet in equipStars.Values)
            {
                var level = trainSet.level;
                for (var place = 1; place <= 12; place++)
                {
                    var equipPosition = new Int2(level, place);
                    var item = packModel.GetItemByGuid(equipModel.GetEquip(equipPosition));
                    if (item == null)
                    {
                        continue;
                    }
                    //达到最大星级
                    var maxStarLevel = GetMaxStarLevel(item.config.ItemColor, item.config.LV);
                    var starLevel = GetStarLevel(new Int2(level, place));
                    if (starLevel >= maxStarLevel)
                    {
                        continue;
                    }
                    //不是候选者中星级最小的
                    if (targetEquipPosition != Int2.zero && starLevel >= minStarLevel)
                    {
                        continue;
                    }
                    var config = EquipStarConfig.Get(level, place, starLevel + 1);
                    if (config == null)
                    {
                        continue;
                    }
                    //固定材料不足
                    if (config.CostItemDict[0].x > 0 && packModel.GetItemCountByID(PackType.Item, config.CostItemDict[0].x) < config.CostItemDict[0].y)
                    {
                        continue;
                    }
                    if (config.CostItemDict.Length > 1 && config.CostItemDict[1].x > 0 &&
                        packModel.GetItemCountByID(PackType.Item, config.CostItemDict[1].x) < config.CostItemDict[1].y)
                    {
                        continue;
                    }
                    var materials = packModel.GetItems(PackType.Item, new SinglePack.FilterParams()
                    {
                        qualitys = new List<int>(config.CostEquipColor),
                        equipTypes = new List<int>(config.CostEquipPlace),
                        levels = new List<int>() { item.config.LV },
                        jobs = config.IsJobLimit == 1 ? new List<int>() { PlayerDatas.Instance.baseData.Job } : null,
                    });
                    for (int j = materials.Count - 1; j >= 0; j--)
                    {
                        var material = materials[j];
                        if (ItemLogicUtility.Instance.IsFightUp(material.itemId, material.score) == 1)
                        {
                            materials.RemoveAt(j);
                        }
                    }
                    var successRate = 0f;
                    foreach (var material in materials)
                    {
                        successRate += GetMaterialSuccessRate(equipPosition, material.guid);
                        if (successRate >= 0.5f)
                        {
                            break;
                        }
                    }
                    if (successRate < 0.5f)
                    {
                        continue;
                    }
                    minStarLevel = starLevel;
                    targetEquipPosition = new Int2(level, place);
                }
            }
            foreach (var starSet in equipStars.Values)
            {
                var level = starSet.level;
                if (!equipModel.IsLevelUnLocked(level))
                {
                    continue;
                }
                for (var place = 1; place <= 12; place++)
                {
                    var isRedpoint = level == targetEquipPosition.x && place == targetEquipPosition.y;
                    starSet.UpdateRedpoint(place, isRedpoint ? RedPointState.Simple : RedPointState.None);
                }
            }
        }
        private void OnUpdate()
        {
            if (redpointDirty && FuncOpen.Instance.IsFuncOpen(172))
            {
                redpointDirty = false;
                UpdateStarRedpoint();
            }
        }
        private int EquipStarUpgradeCandidateCompare(EquipStarUpgradeCandidate x, EquipStarUpgradeCandidate y)
        {
            var guidX = equipModel.GetEquip(x.equipPosition);
            var guidY = equipModel.GetEquip(y.equipPosition);
            if (!string.IsNullOrEmpty(guidX) && string.IsNullOrEmpty(guidY))
            {
                return -1;
            }
            if (string.IsNullOrEmpty(guidX) && !string.IsNullOrEmpty(guidY))
            {
                return 1;
            }
            return x.equipPosition.y.CompareTo(y.equipPosition.y);
            //var factorX = x.equipPosition.x * 100 + x.equipPosition.y;
            //var factorY = y.equipPosition.x * 100 + y.equipPosition.y;
            //if (string.IsNullOrEmpty(guidX) && string.IsNullOrEmpty(guidY))
            //{
            //    return factorX.CompareTo(factorY);
            //}
            //var equipX = packModel.GetItemByGuid(guidX);
            //var equipY = packModel.GetItemByGuid(guidY);
            //var canUpgradeStarLevelX = GetMaxStarLevel(equipX.config.ItemColor, equipX.config.LV) - GetStarLevel(x.equipPosition);
            //var canUpgradeStarLevelY = GetMaxStarLevel(equipY.config.ItemColor, equipY.config.LV) - GetStarLevel(y.equipPosition);
            //var compareResult = canUpgradeStarLevelX.CompareTo(canUpgradeStarLevelY);
            //if (compareResult != 0)
            //{
            //    return -compareResult;
            //}
            //return factorX.CompareTo(factorY);
        }
        private void ParseConfig()
        {
            var configs = EquipStarConfig.GetValues();
            foreach (var config in configs)
            {
                if (!equipStars.ContainsKey(config.Level))
                {
                    equipStars[config.Level] = new EquipSetStar(config.Level);
                }
            }
        }
        public struct Star
        {
            public bool actived;
            public bool newGet;
        }
    }
}