| | |
| | | using System; |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using Jace.Operations; |
| | | using LitJson; |
| | | |
| | | using UnityEngine; |
| | | |
| | |
| | | public int selectHeroListJob = 0; //武将列表界面 筛选职业 |
| | | public int selectHeroListCountry = 0; //武将列表界面筛选国家 |
| | | public string selectHeroGuid; //选中的武将id |
| | | public int[] heroRedpointItemList; //有影响红点的道具 |
| | | #endregion |
| | | |
| | | public WaitHeroFuncResponse waitResponse; //请求武将功能,与服务端交互 |
| | | |
| | | public const float lihuiScale = 0.6f; //立绘缩放大小 |
| | | |
| | | //用于非上阵武将战力变化时 武将ID:上次战力 |
| | | public KeyValuePair<int, long> lastFightPower = new KeyValuePair<int, long>(0, 0); |
| | | //使用方法:其他功能界面设置该值即可 |
| | | public KeyValuePair<string, long> lastFightPower = new KeyValuePair<string, long>(); |
| | | |
| | | public override void Init() |
| | | { |
| | | DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize; |
| | | DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnLoginLoadOK; |
| | | HeroManager.Instance.onHeroChangeEvent += OnHeroChangeEvent; |
| | | GlobalTimeEvent.Instance.secondEvent += OnSecondEvent; |
| | | PackManager.Instance.RefreshItemEvent += RefreshItemEvent; |
| | | TeamManager.Instance.OnTeamChange += OnTeamChangeEvent; |
| | | ParseConfig(); |
| | | InitHeroOnTeamRedpointList(); |
| | | InitHeroBookRedpointList(); |
| | | } |
| | | |
| | | public override void Release() |
| | | { |
| | | DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize; |
| | | DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnLoginLoadOK; |
| | | HeroManager.Instance.onHeroChangeEvent -= OnHeroChangeEvent; |
| | | GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent; |
| | | PackManager.Instance.RefreshItemEvent -= RefreshItemEvent; |
| | | TeamManager.Instance.OnTeamChange -= OnTeamChangeEvent; |
| | | } |
| | | |
| | | void ParseConfig() |
| | | { |
| | | var config = FuncConfigConfig.Get("HeroRebirth"); |
| | | payBackMoneyType = int.Parse(config.Numerical1); |
| | | payBackMoney = int.Parse(config.Numerical2); |
| | | rebornAwakeHeroMaxCount = int.Parse(config.Numerical2); |
| | | rebornFormula = config.Numerical3; |
| | | rebornPayBackPer = int.Parse(config.Numerical4); |
| | | deletePayBackPer = int.Parse(config.Numerical5); |
| | | |
| | | ParseGiftConfig(); |
| | | |
| | | config = FuncConfigConfig.Get("HeroRedpoint"); |
| | | heroRedpointItemList = JsonMapper.ToObject<int[]>(config.Numerical1); |
| | | } |
| | | |
| | | public void OnBeforePlayerDataInitialize() |
| | |
| | | awakeRebirthCnt = 0; |
| | | waitResponse = default; |
| | | heroCollectInfoDic.Clear(); |
| | | newHeroIDList.Clear(); |
| | | } |
| | | |
| | | |
| | | void OnLoginLoadOK() |
| | | { |
| | | UpdateHeroCardRedpoint(); |
| | | } |
| | | |
| | | private void OnHeroChangeEvent(HeroInfo hero) |
| | | { |
| | | if (!DTC0403_tagPlayerLoginLoadOK.finishedLogin) |
| | | return; |
| | | |
| | | WaitServerResponse(hero); |
| | | |
| | | refreshRedPoint = true; |
| | | } |
| | | |
| | | private void WaitServerResponse(HeroInfo hero) |
| | |
| | | { |
| | | UIManager.Instance.OpenWindow<HeroLVBreakSuccessWin>(); |
| | | } |
| | | |
| | | else if (waitResponse.type == HeroFuncType.Gift) |
| | | { |
| | | UIManager.Instance.OpenWindow<HeroGiftEatSuccessWin>(); |
| | | } |
| | | else if (waitResponse.type == HeroFuncType.Awake) |
| | | { |
| | | var config = HeroAwakeConfig.GetHeroAwakeConfig(hero.heroId, hero.awakeLevel); |
| | | if (hero.talentAwakeRandomIDList.Count > 0) |
| | | { |
| | | UIManager.Instance.OpenWindow<HeroAwakeSelectGiftWin>(); |
| | | } |
| | | else if (config.SkillID != 0 || config.UnlockTalentSlot != 0) |
| | | { |
| | | UIManager.Instance.OpenWindow<HeroAwakeSuccessWin>(); |
| | | } |
| | | } |
| | | waitResponse = default; |
| | | |
| | | } |
| | |
| | | return hero.heroLevel >= GetMaxLV(hero.Quality); |
| | | |
| | | } |
| | | //突破限制的最高等级 |
| | | //突破限制的最高等级; 存在突破等级可能更多的情况,不一定提供等级上限 |
| | | public int GetMaxLVByBreakLV(int quality, int breakLevel) |
| | | { |
| | | return HeroQualityBreakConfig.GetQualityBreakConfig(quality, breakLevel).LVMax; |
| | | for (int i = breakLevel; i >= 0; i--) |
| | | { |
| | | var config = HeroQualityBreakConfig.GetQualityBreakConfig(quality, i); |
| | | if (config == null) |
| | | { |
| | | continue; |
| | | } |
| | | return config.LVMax; |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | public bool IsLVMaxByBreakLevel(HeroInfo hero) |
| | |
| | | { |
| | | if (isOK) |
| | | { |
| | | if (UIHelper.GetMoneyCnt(buyInfo[0]) < (ulong)buyInfo[1]) |
| | | if (UIHelper.GetMoneyCnt(buyInfo[0]) < buyInfo[1]) |
| | | { |
| | | SysNotifyMgr.Instance.ShowTip("LackMoney", buyInfo[0]); |
| | | return; |
| | |
| | | { |
| | | return heroA.Quality > heroB.Quality ? -1 : 1; |
| | | } |
| | | if (heroA.heroStar != heroA.heroStar) |
| | | if (heroA.heroStar != heroB.heroStar) |
| | | { |
| | | return heroA.heroStar > heroB.heroStar ? -1 : 1; |
| | | } |
| | |
| | | public int selectHeroCallListJob = 0; //筛选职业 |
| | | public int selectHeroCallListCountry = 0; //筛选国家 |
| | | |
| | | public List<int> newHeroIDList = new List<int>(); //新武将列表 |
| | | public bool IsNewHero(int heroID) |
| | | { |
| | | var bookInfo = GetHeroBookInfo(heroID); |
| | | if (bookInfo != null) |
| | | HB122_tagSCHeroInfo.tagSCHero bookInfo; |
| | | if (TryGetHeroBookInfo(heroID, out bookInfo)) |
| | | { |
| | | if (bookInfo.BookInitState < 2) |
| | | { |
| | | //更精准的 需要比较本次抽的同武将个数 和 背包里有的个数再比较 |
| | | if (HappyXBModel.Instance.GetCountInResult(heroID) >= HeroManager.Instance.GetHeroCountByID(heroID)) |
| | | { |
| | | AddNewHero(heroID); |
| | | return true; |
| | | } |
| | | else |
| | |
| | | } |
| | | } |
| | | |
| | | AddNewHero(heroID); |
| | | return true; |
| | | } |
| | | |
| | | public void AddNewHero(int heroID) |
| | | { |
| | | if (newHeroIDList.Contains(heroID)) |
| | | { |
| | | return; |
| | | } |
| | | newHeroIDList.Add(heroID); |
| | | } |
| | | |
| | | public void RemoveNewHero(int heroID) |
| | | { |
| | | if (!newHeroIDList.Contains(heroID)) |
| | | { |
| | | return; |
| | | } |
| | | newHeroIDList.Remove(heroID); |
| | | refreshRedPoint = true; |
| | | } |
| | | |
| | | List<int> allHeroCallScoreList = new List<int>(); //积分招募列表 |
| | | public void SortHeroCallList() |
| | | { |
| | | if (allHeroCallScoreList.IsNullOrEmpty()) |
| | | { |
| | | { |
| | | allHeroCallScoreList = HappyXBModel.Instance.GetAllGridLibItemIDByType((int)HappXBTitle.HeroCallScore); |
| | | } |
| | | heroCallSortList = new List<int>(); |
| | |
| | | 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 |
| | | |
| | | |
| | | // 优先功能提醒类型:1觉醒 2升星 3突破 4升级 |
| | | // 主线上阵武将才需要提醒 觉醒>升星>突破>升级 |
| | | public int GetFuncState(HeroInfo hero) |
| | | { |
| | | if (!hero.IsInTeamByTeamType(TeamType.Story)) |
| | | { |
| | | return 0; |
| | | } |
| | | |
| | | var heroCnt = PackManager.Instance.GetItemCountByID(PackType.Hero, hero.heroId); |
| | | var itemPack = PackManager.Instance.GetSinglePack(PackType.Item); |
| | | //5星后才能觉醒 |
| | | if (hero.heroStar < starLevelCanAwake) |
| | | { |
| | | if (heroCnt > 1) return 2; |
| | | } |
| | | else |
| | | { |
| | | //判断觉醒材料是否足够 |
| | | var maxAwakeLV = HeroAwakeConfig.GetMaxAwakeLV(hero.heroId); |
| | | if (hero.awakeLevel < maxAwakeLV) |
| | | { |
| | | var config = HeroQualityAwakeConfig.GetQualityAwakeConfig(hero.Quality, hero.awakeLevel); |
| | | if (itemPack.GetCountById(config.UPCostItem[0]) >= config.UPCostItem[1]) |
| | | { |
| | | return 1; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (heroCnt > 1) return 2; |
| | | |
| | | var maxBreakLV = HeroBreakConfig.GetMaxBreakLv(hero.heroId); |
| | | if (hero.breakLevel < maxBreakLV) |
| | | { |
| | | if (IsLVMaxByBreakLevel(hero)) |
| | | { |
| | | var breakConfig = HeroQualityBreakConfig.GetQualityBreakConfig(hero.Quality, hero.breakLevel); |
| | | if (itemPack.GetCountById(breakConfig.UPCostItem[0]) >= breakConfig.UPCostItem[1]) |
| | | { |
| | | return 3; |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (!IsLVMax(hero)) |
| | | { |
| | | var lvupConfig = HeroQualityLVConfig.GetQualityLVConfig(hero.Quality, hero.heroLevel); |
| | | if (itemPack.GetCountById(lvupConfig.UPCostItem[0]) >= lvupConfig.UPCostItem[1]) |
| | | { |
| | | return 4; |
| | | } |
| | | } |
| | | return 0; |
| | | } |
| | | |
| | | #region 红点 |
| | | |
| | | public bool refreshRedPoint = false; |
| | | List<Redpoint> heroOnTeamRedpointList = new List<Redpoint>(); //上阵的武将红点 |
| | | List<Redpoint> heroBookRedpointList = new List<Redpoint>(); //图鉴所有武将红点 |
| | | |
| | | //新标识的红点 所有武将统一个 |
| | | Redpoint newMarkRedPoint = new Redpoint(MainRedDot.HeroCardRedpoint, MainRedDot.HeroCardRedpoint * 10 + 9); |
| | | void InitHeroOnTeamRedpointList() |
| | | { |
| | | heroOnTeamRedpointList.Clear(); |
| | | for (int i = 0; i < TeamConst.MaxTeamHeroCount; i++) |
| | | { |
| | | heroOnTeamRedpointList.Add(new Redpoint(MainRedDot.HeroCardRedpoint, MainRedDot.HeroCardRedpoint * 10 + i)); |
| | | } |
| | | } |
| | | |
| | | |
| | | //武将卡的红点:只给上阵武将刷红点(含新标识),非上阵武将的新图标按图片处理不归类为红点 |
| | | void UpdateHeroCardRedpoint() |
| | | { |
| | | if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Hero)) |
| | | return; |
| | | |
| | | var team = TeamManager.Instance.GetTeam(TeamType.Story); |
| | | for (int i = 0; i < heroOnTeamRedpointList.Count; i++) |
| | | { |
| | | var redpoint = heroOnTeamRedpointList[i]; |
| | | var teamHero = team.GetServerHeroByIndex(i); |
| | | if (teamHero != null) |
| | | { |
| | | var hero = HeroManager.Instance.GetHero(teamHero.guid); |
| | | if (hero != null) |
| | | { |
| | | if (GetFuncState(hero) > 0) |
| | | { |
| | | redpoint.state = RedPointState.Simple; |
| | | continue; |
| | | } |
| | | } |
| | | } |
| | | |
| | | redpoint.state = RedPointState.None; |
| | | } |
| | | |
| | | newMarkRedPoint.state = newHeroIDList.Count > 0 ? RedPointState.New : RedPointState.None; |
| | | } |
| | | |
| | | |
| | | void InitHeroBookRedpointList() |
| | | { |
| | | heroBookRedpointList.Clear(); |
| | | foreach (var key in HeroConfig.GetKeys()) |
| | | { |
| | | var config = HeroConfig.Get(key); |
| | | if (config.PlayerCanUse == 0) |
| | | continue; |
| | | heroBookRedpointList.Add(new Redpoint(MainRedDot.HeroCardCollectRedpoint, MainRedDot.HeroCardCollectRedpoint * 10000000 + key)); |
| | | } |
| | | } |
| | | |
| | | void UpdateHeroBookRedpoint() |
| | | { |
| | | if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Hero)) |
| | | return; |
| | | |
| | | foreach (var redpoint in heroBookRedpointList) |
| | | { |
| | | var heroID = redpoint.id % 10000000; |
| | | var state = GetHeroBookState(heroID, HeroConfig.Get(heroID).Quality); |
| | | if (state == 1 || state == 3 || state == 4) |
| | | { |
| | | redpoint.state = RedPointState.Simple; |
| | | continue; |
| | | } |
| | | redpoint.state = RedPointState.None; |
| | | } |
| | | } |
| | | |
| | | |
| | | void OnSecondEvent() |
| | | { |
| | | if (refreshRedPoint) |
| | | { |
| | | UpdateHeroCardRedpoint(); |
| | | refreshRedPoint = false; |
| | | } |
| | | } |
| | | |
| | | void RefreshItemEvent(PackType packType, int index, int itemID) |
| | | { |
| | | if (packType != PackType.Item) |
| | | return; |
| | | |
| | | if (heroRedpointItemList.Contains(itemID)) |
| | | { |
| | | refreshRedPoint = true; |
| | | } |
| | | } |
| | | |
| | | void OnTeamChangeEvent(TeamType teamType) |
| | | { |
| | | if (teamType == TeamType.Story) |
| | | { |
| | | refreshRedPoint = true; |
| | | } |
| | | } |
| | | #endregion |
| | | } |
| | | |
| | | #region 等待服务端响应 |
| | | public struct WaitHeroFuncResponse |
| | | { |
| | | public HeroFuncType type; |
| | |
| | | { |
| | | None = 0, //无功能 |
| | | Break = 1, //突破 |
| | | |
| | | Gift = 2, //天赋吞噬 |
| | | Awake = 3, //觉醒 |
| | | } |
| | | #endregion |