| | |
| | | |
| | | public partial class HeroUIManager : GameSystemManager<HeroUIManager> |
| | | { |
| | | |
| | | |
| | | |
| | | #region 布阵界面 |
| | | public List<string> heroOnTeamSortList { get; private set; } = new List<string>(); //不同上阵的列表排序 |
| | |
| | | |
| | | var team = TeamManager.Instance.GetTeam(teamType); |
| | | if (team == null) |
| | | { |
| | | { |
| | | return heroCountryCount; |
| | | } |
| | | TeamHero[] teamHeroes = isPreview ? team.tempHeroes : team.serverHeroes; |
| | | |
| | | for (int i = 0; i < teamHeroes.Length; i++) |
| | | { |
| | | if (teamHeroes[i] == null) |
| | | continue; |
| | | var country = teamHeroes[i].Country; |
| | | |
| | | if (!heroCountryCount.ContainsKey(country)) |
| | | { |
| | | heroCountryCount.Add(country, 1); |
| | | } |
| | | else |
| | | { |
| | | heroCountryCount[country] += 1; |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | return heroCountryCount; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获得自定义队伍中各个国家的武将数量 |
| | | /// </summary> |
| | | public Dictionary<HeroCountry, int> GetCountryHeroCountByTeamHeroList(List<TeamHero> teamHeroes) |
| | | { |
| | | Dictionary<HeroCountry, int> heroCountryCount = new Dictionary<HeroCountry, int>(); |
| | | if (teamHeroes == null) |
| | | { |
| | | return heroCountryCount; |
| | | } |
| | | for (int i = 0; i < teamHeroes.Count; i++) |
| | | { |
| | | if (teamHeroes[i] == null) |
| | | continue; |
| | |
| | | return new Int2((int)country, maxValue); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获得自定义队伍中武将数量最大的国家和数量 |
| | | /// </summary> |
| | | public Int2 GetMaxCountHeroCountry(List<TeamHero> teamType) |
| | | { |
| | | var countryCountDict = GetCountryHeroCountByTeamHeroList(teamType); |
| | | //找到最大的国家和数量 |
| | | HeroCountry country = HeroCountry.None; |
| | | int maxValue = 0; |
| | | foreach (var data in countryCountDict) |
| | | { |
| | | if (data.Value > maxValue) |
| | | { |
| | | country = data.Key; |
| | | maxValue = data.Value; |
| | | } |
| | | } |
| | | return new Int2((int)country, maxValue); |
| | | } |
| | | |
| | | //在不同页签下选AttackType 0 攻击阵容 1 防守阵容 |
| | | public int GetSelectTeamTypeByAttackType(int AttackType) |
| | | { |
| | |
| | | //推荐阵容 |
| | | public List<string> SelectRecommend() |
| | | { |
| | | //推荐阵容的算法逻辑 |
| | | //自动选择优先级:武将等级>突破等级>武将觉醒阶级>武将品质>武将吞噬星级>武将ID |
| | | var tmpList = HeroManager.Instance.GetHeroGuidList(); |
| | | tmpList.Sort(CmpHeroRecommend); |
| | | |
| | | |
| | | //推荐最多6个,存在相同heroid,则跳过 |
| | | List<string> selectHeroList = new List<string>(); |
| | | List<int> selectHeroIDList = new List<int>(); |
| | |
| | | string guid = tmpList[i]; |
| | | HeroInfo heroInfo = HeroManager.Instance.GetHero(guid); |
| | | if (selectHeroIDList.Contains(heroInfo.heroId)) |
| | | //重复英雄 |
| | | continue; |
| | | //如果重复了,跳过 |
| | | if (selectHeroList.Contains(guid)) |
| | |
| | | selectHeroList.Add(guid); |
| | | selectHeroIDList.Add(heroInfo.heroId); |
| | | } |
| | | |
| | | // 再按 肉盾>控制>输出>辅助 |
| | | selectHeroList.Sort(CmpByJob); |
| | | |
| | | return selectHeroList; |
| | | } |
| | | |
| | | |
| | | //!!!新排序规则 |
| | | //若在新手引导(引导ID)中,如果5号位为空,则优先放置5号位 |
| | | //按战力排序 |
| | | int CmpHeroRecommend(string guidA, string guidB) |
| | | { |
| | | HeroInfo heroA = HeroManager.Instance.GetHero(guidA); |
| | |
| | | return 0; |
| | | } |
| | | |
| | | // 排序规则:武将等级>突破等级>武将觉醒阶级>武将品质>武将吞噬星级>武将ID |
| | | if (heroA.heroLevel != heroB.heroLevel) |
| | | { |
| | | return heroA.heroLevel > heroB.heroLevel ? -1 : 1; |
| | | } |
| | | if (heroA.breakLevel != heroB.breakLevel) |
| | | { |
| | | return heroA.breakLevel > heroB.breakLevel ? -1 : 1; |
| | | } |
| | | if (heroA.awakeLevel != heroB.awakeLevel) |
| | | { |
| | | return heroA.awakeLevel > heroB.awakeLevel ? -1 : 1; |
| | | } |
| | | if (heroA.Quality != heroB.Quality) |
| | | { |
| | | return heroA.Quality > heroB.Quality ? -1 : 1; |
| | | } |
| | | if (heroA.heroStar != heroB.heroStar) |
| | | { |
| | | return heroA.heroStar > heroB.heroStar ? -1 : 1; |
| | | } |
| | | // // 排序规则:武将等级>突破等级>武将觉醒阶级>武将品质>武将吞噬星级>武将ID |
| | | // if (heroA.heroLevel != heroB.heroLevel) |
| | | // { |
| | | // return heroA.heroLevel > heroB.heroLevel ? -1 : 1; |
| | | // } |
| | | // if (heroA.breakLevel != heroB.breakLevel) |
| | | // { |
| | | // return heroA.breakLevel > heroB.breakLevel ? -1 : 1; |
| | | // } |
| | | // if (heroA.awakeLevel != heroB.awakeLevel) |
| | | // { |
| | | // return heroA.awakeLevel > heroB.awakeLevel ? -1 : 1; |
| | | // } |
| | | // if (heroA.Quality != heroB.Quality) |
| | | // { |
| | | // return heroA.Quality > heroB.Quality ? -1 : 1; |
| | | // } |
| | | // if (heroA.heroStar != heroB.heroStar) |
| | | // { |
| | | // return heroA.heroStar > heroB.heroStar ? -1 : 1; |
| | | // } |
| | | |
| | | return heroA.heroId.CompareTo(heroB.heroId); |
| | | |
| | | |
| | | return heroB.CalculateFightPower(false).CompareTo(heroA.CalculateFightPower(false)); |
| | | } |
| | | |
| | | int CmpByJob(string guidA, string guidB) |
| | | { |
| | | HeroInfo heroA = HeroManager.Instance.GetHero(guidA); |
| | | HeroInfo heroB = HeroManager.Instance.GetHero(guidB); |
| | | if (heroA == null || heroB == null) |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | int indexA = Array.IndexOf(teamSortByJob, heroA.heroConfig.Class); |
| | | int indexB = Array.IndexOf(teamSortByJob, heroB.heroConfig.Class); |
| | | |
| | | return indexA.CompareTo(indexB); |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | |
| | | #region 主界面上的武将上阵解锁显示 和 解锁规则 |
| | | |
| | | public int[][] lockHeroCountLimit; |
| | | public List<int> lockIndexList = new List<int>(); |
| | | |
| | | public int[] teamSortByJob; |
| | | public int onekeyGuideID; |
| | | public int[] onekeyGuidePosList; //一键上阵在引导下的顺序 |
| | | |
| | | public Action OnUnLockHeroCountEvent; |
| | | public int lockState |
| | | { |
| | | get |
| | | { |
| | | return QuickSetting.Instance.GetQuickSettingValue<int>(QuickSettingType.HeroCountLock, 0); |
| | | } |
| | | set |
| | | { |
| | | QuickSetting.Instance.SetQuickSetting(QuickSettingType.HeroCountLock, value, 0); |
| | | QuickSetting.Instance.SendPackage(); |
| | | RefreshServerLockIndex(); |
| | | } |
| | | } |
| | | |
| | | //解锁上阵英雄的数量限制, 解锁条件在界面上是按顺序排序的,但是锁定的位置是动态变化的 |
| | | //比如 第4,5,6格子锁住了,但第6个的锁先完成了解锁条件,解锁后锁住的位置往后顺推 |
| | | //则 第4的位置显示为解锁状态,5和6是锁住状态,5的解锁条件按配置列表的顺序解锁(即为原4的解锁条件) |
| | | |
| | | // 模拟服务端 这里的index 对应的是配表的 |
| | | public bool IsUnLock(int configIndex) |
| | | { |
| | | //按lockState的位判断 |
| | | return (lockState & (1 << configIndex)) != 0; |
| | | } |
| | | |
| | | public bool SetUnLock(int configIndex) |
| | | { |
| | | if (!CanUnLock(configIndex, true)) |
| | | { |
| | | return false; |
| | | } |
| | | lockState |= 1 << configIndex; |
| | | return true; |
| | | } |
| | | |
| | | // 解锁类型 |
| | | // 1.主公等级达X级开启; |
| | | // 2.通关主线X-X开启;同任务配法 |
| | | // 3.开服时间达到X天开启; |
| | | public bool CanUnLock(int configIndex, bool notify = false) |
| | | { |
| | | int type = lockHeroCountLimit[configIndex][0]; |
| | | int value = lockHeroCountLimit[configIndex][1]; |
| | | if (type == 1) |
| | | { |
| | | if (PlayerDatas.Instance.baseData.LV < value) |
| | | { |
| | | if (notify) |
| | | SysNotifyMgr.Instance.ShowTip("HeroCountUnLock1", value); |
| | | return false; |
| | | } |
| | | } |
| | | else if (type == 2) |
| | | { |
| | | //如ExAttr1值为20103代表当前已经过了第2章第1关第3波; value为201 |
| | | if (PlayerDatas.Instance.baseData.ExAttr1 / 100 <= value) |
| | | { |
| | | if (notify) |
| | | SysNotifyMgr.Instance.ShowTip("HeroCountUnLock2", value / 100, value % 100); |
| | | return false; |
| | | } |
| | | } |
| | | else if (type == 3) |
| | | { |
| | | if (TimeUtility.OpenDay < value - 1) |
| | | { |
| | | if (notify) |
| | | SysNotifyMgr.Instance.ShowTip("HeroCountUnLock3", value); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | |
| | | public void ShowUnLockTip(int configIndex) |
| | | { |
| | | int type = lockHeroCountLimit[configIndex][0]; |
| | | int value = lockHeroCountLimit[configIndex][1]; |
| | | if (type == 1) |
| | | { |
| | | if (PlayerDatas.Instance.baseData.LV < value) |
| | | { |
| | | SysNotifyMgr.Instance.ShowTip("HeroCountUnLock1", value); |
| | | return; |
| | | } |
| | | } |
| | | else if (type == 2) |
| | | { |
| | | //如ExAttr1值为20103代表当前已经过了第2章第1关第3波; value为201 |
| | | if (PlayerDatas.Instance.baseData.ExAttr1 / 100 <= value) |
| | | { |
| | | SysNotifyMgr.Instance.ShowTip("HeroCountUnLock2", value / 100, value % 100); |
| | | return; |
| | | } |
| | | } |
| | | else if (type == 3) |
| | | { |
| | | if (TimeUtility.OpenDay < value - 1) |
| | | { |
| | | SysNotifyMgr.Instance.ShowTip("HeroCountUnLock3", value); |
| | | return; |
| | | } |
| | | } |
| | | |
| | | //可以解锁,但未解锁 |
| | | if (!IsUnLock(configIndex)) |
| | | { |
| | | SysNotifyMgr.Instance.ShowTip("HeroCountUnLock4"); |
| | | } |
| | | } |
| | | |
| | | |
| | | // 刷新未解锁武将上限的配置索引列表 |
| | | public void RefreshServerLockIndex() |
| | | { |
| | | lockIndexList.Clear(); |
| | | for (int i = 0; i < lockHeroCountLimit.Length; i++) |
| | | { |
| | | if (!IsUnLock(i)) |
| | | { |
| | | lockIndexList.Add(i); |
| | | } |
| | | } |
| | | } |
| | | |
| | | public bool UnLockHeroCnt(int lockIndex) |
| | | { |
| | | if (lockIndex < 0 || lockIndex >= lockIndexList.Count) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | return SetUnLock(lockIndexList[lockIndex]); |
| | | |
| | | } |
| | | |
| | | void OnQuickSettingUpdate() |
| | | { |
| | | RefreshServerLockIndex(); |
| | | } |
| | | #endregion |
| | | |
| | | } |
| | | |