| | |
| | | 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;
|
| | | }
|
| | |
|
| | | }
|
| | | }
|
| | |
|