Main/System/HeroUI/HeroUIManager.cs
@@ -1,6 +1,9 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Jace.Operations;
using LitJson;
using UnityEngine;
@@ -12,33 +15,51 @@
    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()
@@ -48,13 +69,23 @@
        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)
@@ -80,7 +111,22 @@
        {
            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;
    }
@@ -117,10 +163,19 @@
        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)
@@ -147,7 +202,7 @@
            {
                if (isOK)
                {
                    if (UIHelper.GetMoneyCnt(buyInfo[0]) < (ulong)buyInfo[1])
                    if (UIHelper.GetMoneyCnt(buyInfo[0]) < buyInfo[1])
                    {
                        SysNotifyMgr.Instance.ShowTip("LackMoney", buyInfo[0]);
                        return;
@@ -197,7 +252,7 @@
        {
            return heroA.Quality > heroB.Quality ? -1 : 1;
        }
        if (heroA.heroStar != heroA.heroStar)
        if (heroA.heroStar != heroB.heroStar)
        {
            return heroA.heroStar > heroB.heroStar ? -1 : 1;
        }
@@ -218,16 +273,18 @@
    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
@@ -241,14 +298,34 @@
            }
        }
        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>();
@@ -285,13 +362,11 @@
        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);
    }
@@ -299,8 +374,173 @@
    #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;
@@ -313,5 +553,7 @@
{
    None = 0,   //无功能
    Break = 1,  //突破
    Gift  = 2,  //天赋吞噬
    Awake = 3,  //觉醒
}
#endregion