using System; using System.Collections; using System.Collections.Generic; using LitJson; using UnityEngine; //武将相关界面的操作数据管理 public partial class HeroUIManager : GameSystemManager { #region 武将列表界面 public List heroSortList { get; private set; } = new List(); //上阵为主线的 GUID列表 public int selectHeroListJob = 0; //武将列表界面 筛选职业 public int selectHeroListCountry = 0; //武将列表界面筛选国家 public string selectHeroGuid; //选中的武将id #endregion public WaitHeroFuncResponse waitResponse; //请求武将功能,与服务端交互 //用于非上阵武将战力变化时 武将ID:上次战力 //使用方法:其他功能界面设置该值即可 public KeyValuePair lastFightPower = new KeyValuePair(); public override void Init() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; HeroManager.Instance.onHeroChangeEvent += OnHeroChangeEvent; ParseConfig(); } public override void Release() { DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; HeroManager.Instance.onHeroChangeEvent -= OnHeroChangeEvent; } void ParseConfig() { var config = FuncConfigConfig.Get("HeroRebirth"); payBackMoneyType = int.Parse(config.Numerical1); rebornAwakeHeroMaxCount = int.Parse(config.Numerical2); rebornFormula = config.Numerical3; rebornPayBackPer = int.Parse(config.Numerical4); deletePayBackPer = int.Parse(config.Numerical5); ParseGiftConfig(); config = FuncConfigConfig.Get("HeroBook"); var arr = JsonMapper.ToObject(config.Numerical1); bookMoneyType = arr[0]; bookMoneyValue = arr[1]; } public void OnBeforePlayerDataInitialize() { heroSortList.Clear(); heroOnTeamSortList.Clear(); awakeRebirthCnt = 0; waitResponse = default; heroCollectInfoDic.Clear(); } private void OnHeroChangeEvent(HeroInfo hero) { if (!DTC0403_tagPlayerLoginLoadOK.finishedLogin) return; WaitServerResponse(hero); } private void WaitServerResponse(HeroInfo hero) { if (waitResponse.Equals(default(WaitHeroFuncResponse))) { return; } // 等待超过5秒 不处理 var nowTime = Time.time; if (waitResponse.time > 0f && waitResponse.time + 5 < nowTime) { waitResponse = default; return; } if (hero.itemHero.guid != waitResponse.guid) { return; } if (waitResponse.type == HeroFuncType.Break) { UIManager.Instance.OpenWindow(); } else if (waitResponse.type == HeroFuncType.Gift) { UIManager.Instance.OpenWindow(); } else if (waitResponse.type == HeroFuncType.Awake) { var config = HeroAwakeConfig.GetHeroAwakeConfig(hero.heroId, hero.awakeLevel); if (hero.talentAwakeRandomIDList.Count > 0) { UIManager.Instance.OpenWindow(); } else if (config.SkillID != 0 || config.UnlockTalentSlot != 0) { UIManager.Instance.OpenWindow(); } } waitResponse = default; } #region 武将UI常用接口 public string GetCountryName(int index) { return RichTextMsgReplaceConfig.GetRichReplace("Country", index); } public string GetJobName(int index) { return RichTextMsgReplaceConfig.GetRichReplace("Class", index); } public string GetCountryIconName(int index) { return StringUtility.Contact("herocountry", index); } public string GetJobIconName(int index) { return StringUtility.Contact("herojob", index); } public int GetMaxLV(int quality) { return HeroQualityBreakConfig.maxlvDic[quality]; } //是否达到最高级 public bool IsLVMax(HeroInfo hero) { return hero.heroLevel >= GetMaxLV(hero.Quality); } //突破限制的最高等级 public int GetMaxLVByBreakLV(int quality, int breakLevel) { return HeroQualityBreakConfig.GetQualityBreakConfig(quality, breakLevel).LVMax; } public bool IsLVMaxByBreakLevel(HeroInfo hero) { return hero.heroLevel == GetMaxLVByBreakLV(hero.Quality, hero.breakLevel); } #endregion public void QueryUnLockHeroPack() { //解锁更多的武将背包 int canBuyCnt = PackManager.Instance.GetCanBuyPackGirdCount(PackType.Hero); if (canBuyCnt <= 0) { return; } var buyInfo = PackManager.Instance.BuyPackGirdNeedData(PackType.Hero); ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("HeroPack1", UIHelper.GetIconNameWithMoneyType(buyInfo[0]), buyInfo[1], buyInfo[2]), (bool isOK) => { if (isOK) { if (UIHelper.GetMoneyCnt(buyInfo[0]) < buyInfo[1]) { SysNotifyMgr.Instance.ShowTip("LackMoney", buyInfo[0]); return; } PackManager.Instance.BuyPackGird(PackType.Hero); } }); } //刷新时机, 打开武将界面 或者 关闭功能界面 public void SortHeroList() { heroSortList = HeroManager.Instance.GetHeroGuidList(selectHeroListJob, selectHeroListCountry); heroSortList.Sort(CmpHero); } int CmpHero(string guidA, string guidB) { HeroInfo heroA = HeroManager.Instance.GetHero(guidA); HeroInfo heroB = HeroManager.Instance.GetHero(guidB); if (heroA == null || heroB == null) { return 0; } // 排序规则:上阵>武将等级>突破等级>武将觉醒阶级>武将品质>武将吞噬星级>武将ID bool isInTeamA = heroA.IsInTeamByTeamType(TeamType.Story); bool isInTeamB = heroB.IsInTeamByTeamType(TeamType.Story); if (isInTeamA != isInTeamB) { return isInTeamA ? -1 : 1; } 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); } #region 招募 public HappXBTitle selectCallType; //寻宝枚举类型 public int selectCallIndex;//0:1抽 1:10抽 对应配置顺序 public const string skipKey = "SkipHeroCall"; //积分招募预览 public List heroCallSortList { get; private set; } = new List(); //积分招募列表 public int selectHeroCallListJob = 0; //筛选职业 public int selectHeroCallListCountry = 0; //筛选国家 public bool IsNewHero(int heroID) { HB122_tagSCHeroInfo.tagSCHero bookInfo; if (TryGetHeroBookInfo(heroID, out bookInfo)) { if (bookInfo.BookInitState < 2) { //更精准的 需要比较本次抽的同武将个数 和 背包里有的个数再比较 if (HappyXBModel.Instance.GetCountInResult(heroID) >= HeroManager.Instance.GetHeroCountByID(heroID)) { return true; } else { return false; } } else { return false; } } return true; } List allHeroCallScoreList = new List(); //积分招募列表 public void SortHeroCallList() { if (allHeroCallScoreList.IsNullOrEmpty()) { allHeroCallScoreList = HappyXBModel.Instance.GetAllGridLibItemIDByType((int)HappXBTitle.HeroCallScore); } heroCallSortList = new List(); if (selectHeroCallListJob == 0 && selectHeroCallListCountry == 0) { heroCallSortList = allHeroCallScoreList; } else { foreach (var item in allHeroCallScoreList) { HeroConfig heroConfig = HeroConfig.Get(item); if (heroConfig == null) { continue; } if (selectHeroCallListJob != 0 && selectHeroCallListJob != heroConfig.Class) { continue; } if (selectHeroCallListCountry != 0 && selectHeroCallListCountry != heroConfig.Country) { continue; } heroCallSortList.Add(item); } } heroCallSortList.Sort(CmpHeroID); } int CmpHeroID(int idA, int idB) { HeroConfig heroA = HeroConfig.Get(idA); HeroConfig heroB = HeroConfig.Get(idB); // 排序规则:武将品质>武将ID if (heroA.Quality != heroB.Quality) { return heroA.Quality > heroB.Quality ? -1 : 1; } return heroA.HeroID.CompareTo(heroB.HeroID); } #endregion } #region 等待服务端响应 public struct WaitHeroFuncResponse { public HeroFuncType type; public string guid; public float time; } //武将功能类型 public enum HeroFuncType { None = 0, //无功能 Break = 1, //突破 Gift = 2, //天赋吞噬 Awake = 3, //觉醒 } #endregion