using System;  
 | 
using System.Collections.Generic;  
 | 
using UnityEngine;  
 | 
  
 | 
  
 | 
//仙盟徽章 解锁途径类型  
 | 
public enum FairyEmblemUnlockMethodType  
 | 
{  
 | 
    Custom,     // 0 - 定制  
 | 
    LV,         // 1 - 等级自动解锁  
 | 
    Active,     // 2 - 活动获得  
 | 
}  
 | 
  
 | 
public class FairyEmblemModel : GameSystemManager<FairyEmblemModel>  
 | 
{  
 | 
    public readonly int MaxItemRowCount = 6;    // 一行展示x个徽章  
 | 
    public readonly int FamilyActionsType = 15;     // 家族行为类型15  
 | 
    public readonly int FuncId = 237;  
 | 
    public int defaultFamilyEmblemId;           // 默认徽章ID  
 | 
  
 | 
    public bool isSendA408Pack = false;  
 | 
  
 | 
    private int m_NowChooseEmblemId;  
 | 
    public int nowChooseEmblemId  
 | 
    {  
 | 
        get { return m_NowChooseEmblemId; }  
 | 
        set  
 | 
        {  
 | 
            m_NowChooseEmblemId = value;  
 | 
            ChooseEmblemIdChangeEvent?.Invoke();  
 | 
        }  
 | 
    }  
 | 
  
 | 
    //<EmblemId,FamilyAction>  
 | 
    Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction> familyActions = new Dictionary<int, HA403_tagGCFamilyActionInfo.tagGCFamilyAction>();  
 | 
  
 | 
    public event Action ChooseEmblemIdChangeEvent;      //切换标签页  
 | 
    public event Action<int, int> UpdateFamilyActionEvent;  
 | 
  
 | 
    Redpoint entranceRedPoint = new Redpoint(10702, MainRedDot.FairyEmbleManageRepoint); //仙盟管理面板入口红点  
 | 
  
 | 
    public override void Init()  
 | 
    {  
 | 
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;  
 | 
        defaultFamilyEmblemId = int.Parse(FuncConfigConfig.Get("FairyEmblem").Numerical1);  
 | 
    }  
 | 
  
 | 
    public override void Release()  
 | 
    {  
 | 
        PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;  
 | 
    }  
 | 
  
 | 
    private void OnRefreshFairyInfo()  
 | 
    {  
 | 
        UpdateRedPoint();  
 | 
    }  
 | 
  
 | 
    public void OnBeforePlayerDataInitialize()  
 | 
    {  
 | 
        familyActions.Clear();  
 | 
    }  
 | 
  
 | 
    public void UpdateRedPoint()  
 | 
    {  
 | 
        entranceRedPoint.state = RedPointState.None;  
 | 
        // 仅盟主能看到  
 | 
        if (!IsCaptain())  
 | 
            return;  
 | 
        // 仙盟2级出现  
 | 
        if (PlayerDatas.Instance.fairyData == null || PlayerDatas.Instance.fairyData.fairy.FamilyLV != 2)  
 | 
            return;  
 | 
        // 只出现一次  
 | 
        if (GetRedPointShow())  
 | 
            return;  
 | 
        entranceRedPoint.state = RedPointState.Simple;  
 | 
    }  
 | 
  
 | 
    string localStr = "FairyEmblemEntranceRedPoint_";  
 | 
  
 | 
    public bool GetRedPointShow()  
 | 
    {  
 | 
        return LocalSave.GetBool(localStr + PlayerDatas.Instance.PlayerId);  
 | 
    }  
 | 
  
 | 
    public void SetRedPointShow()  
 | 
    {  
 | 
        LocalSave.SetBool(localStr + PlayerDatas.Instance.PlayerId, true);  
 | 
    }  
 | 
  
 | 
    public bool TryGetNowEmblemID(out int nowID)  
 | 
    {  
 | 
        nowID = 0;  
 | 
        int emblemID = (int)PlayerDatas.Instance.fairyData.fairy.Extra6;  
 | 
        if (FamilyEmblemConfig.HasKey(emblemID) && IsUnLock(emblemID))  
 | 
        {  
 | 
            nowID = (int)emblemID;  
 | 
            return true;  
 | 
        }  
 | 
  
 | 
        if (FamilyEmblemConfig.HasKey(defaultFamilyEmblemId))  
 | 
        {  
 | 
            nowID = defaultFamilyEmblemId;  
 | 
            return true;  
 | 
        }  
 | 
  
 | 
        nowID = 0;  
 | 
        return false;  
 | 
  
 | 
    }  
 | 
  
 | 
    // 展示指定徽章 表中找不到徽章就显示默认的  
 | 
    public void ShowEmblem(int emblemID, ImageEx imgTitle, float scale = 1.0f)  
 | 
    {  
 | 
        int nowEmblemID = emblemID;  
 | 
        if (!FamilyEmblemConfig.HasKey(nowEmblemID))  
 | 
        {  
 | 
            nowEmblemID = defaultFamilyEmblemId;  
 | 
        }  
 | 
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(nowEmblemID);  
 | 
        UIFrame frame = imgTitle.GetComponent<UIFrame>();  
 | 
        if (UIFrameMgr.Inst.ContainsDynamicImage(config.Image))  
 | 
        {  
 | 
            if (frame == null)  
 | 
                frame = imgTitle.gameObject.AddComponent<UIFrame>();  
 | 
  
 | 
            List<UnityEngine.Sprite> spriteList = UIFrameMgr.Inst.GetDynamicImage(config.Image);  
 | 
            if (!spriteList.IsNullOrEmpty())  
 | 
            {  
 | 
                imgTitle.rectTransform.sizeDelta = new Vector2(spriteList[0].rect.width, spriteList[0].rect.height);  
 | 
            }  
 | 
  
 | 
            imgTitle.raycastTarget = false;  
 | 
            frame.ResetFrame(config.Image);  
 | 
            frame.enabled = true;  
 | 
        }  
 | 
        else  
 | 
        {  
 | 
            if (frame != null)  
 | 
                frame.enabled = false;  
 | 
            imgTitle.SetSprite(config.Image);  
 | 
            imgTitle.SetNativeSize();  
 | 
        }  
 | 
        imgTitle.rectTransform.localScale = new Vector3(scale, scale, scale);  
 | 
    }  
 | 
  
 | 
    //发包 查询玩家当前仙盟徽章  
 | 
    public void TrySendA408EmblemInfoPack()  
 | 
    {  
 | 
        //已经发过包了  
 | 
        if (isSendA408Pack)  
 | 
            return;  
 | 
        isSendA408Pack = true;  
 | 
        var pack = new CA408_tagCGQueryFamilyAction();  
 | 
        pack.ActionType = 15;  
 | 
        pack.FamilyID = PlayerDatas.Instance.baseData.FamilyId;  
 | 
        GameNetSystem.Instance.SendInfo(pack);  
 | 
    }  
 | 
  
 | 
    //发包 更改仙盟徽章  
 | 
    public void SendCA413ChangeFamilyEmblemPack(int emblemId)  
 | 
    {  
 | 
        var pack = new CA413_tagCGChangeFamilyEmblem();  
 | 
        pack.EmblemID = (byte)emblemId;  
 | 
        GameNetSystem.Instance.SendInfo(pack);  
 | 
    }  
 | 
  
 | 
    public List<int> GetShowList()  
 | 
    {  
 | 
        List<int> showList = new List<int>();  
 | 
        List<int> keys = FamilyEmblemConfig.GetKeys();  
 | 
        for (int i = 0; i < keys.Count; i++)  
 | 
        {  
 | 
            showList.Add(keys[i]);  
 | 
        }  
 | 
        showList.Sort(Cmp);  
 | 
        return showList;  
 | 
    }  
 | 
  
 | 
    // 已激活>未激活  
 | 
    private int Cmp(int a, int b)  
 | 
    {  
 | 
        bool isUnlock1 = IsUnLock(a);  
 | 
        bool isUnlock2 = IsUnLock(b);  
 | 
  
 | 
        if (isUnlock1 != isUnlock2)  
 | 
        {  
 | 
            return isUnlock2.CompareTo(isUnlock1);  
 | 
        }  
 | 
  
 | 
        // 如果激活状态相同,比较是否为限时:限时 (true) > 永久 (false)  
 | 
        bool isLimitA = IsLimitTime(a, out var familyAction1);  
 | 
        bool isLimitB = IsLimitTime(b, out var familyAction2);  
 | 
  
 | 
        if (isLimitA != isLimitB)  
 | 
        {  
 | 
            return isLimitB.CompareTo(isLimitA);  
 | 
        }  
 | 
  
 | 
        // 限时状态相同,比较 SortNum  
 | 
        int sortNumA = GetSortNum(a);  
 | 
        int sortNumB = GetSortNum(b);  
 | 
        if (sortNumA != sortNumB)  
 | 
        {  
 | 
            return sortNumA.CompareTo(sortNumB);  
 | 
        }  
 | 
  
 | 
        return a.CompareTo(b);  
 | 
    }  
 | 
  
 | 
    public int GetSortNum(int emblemID)  
 | 
    {  
 | 
        if (!FamilyEmblemConfig.HasKey(emblemID))  
 | 
            return 0;  
 | 
        return FamilyEmblemConfig.Get(emblemID).SortNum;  
 | 
    }  
 | 
  
 | 
    // 获得徽章来源类型  
 | 
    public FairyEmblemUnlockMethodType GetFairyEmblemUnlockType(int emblemID)  
 | 
    {  
 | 
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemID);  
 | 
        if (config == null)  
 | 
            return FairyEmblemUnlockMethodType.LV;  
 | 
        if (config.CustomFamilyID > 0)  
 | 
            return FairyEmblemUnlockMethodType.Custom;  
 | 
        return config.UnlockFamilyLV > 0 ? FairyEmblemUnlockMethodType.LV : FairyEmblemUnlockMethodType.Active;  
 | 
    }  
 | 
  
 | 
    // 指定的徽章解锁了吗  
 | 
    public bool IsUnLock(int emblemId)  
 | 
    {  
 | 
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);  
 | 
        FairyEmblemUnlockMethodType type = GetFairyEmblemUnlockType(emblemId);  
 | 
        HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction;  
 | 
        switch (type)  
 | 
        {  
 | 
            case FairyEmblemUnlockMethodType.Custom:  
 | 
                //所在仙盟不是指定的定制仙盟 未解锁  
 | 
                if (PlayerDatas.Instance.baseData.FamilyId != config.CustomFamilyID)  
 | 
                    return false;  
 | 
                //封包中没有就算未解锁  
 | 
                if (!TryGetfamilyAction(emblemId, out familyAction))  
 | 
                    return false;  
 | 
                if (familyAction.Value2 > 0 && familyAction.Value2 < TimeUtility.AllSeconds)  
 | 
                    return false;  
 | 
                return true;  
 | 
  
 | 
            case FairyEmblemUnlockMethodType.LV:  
 | 
                //所在仙盟等级小于徽章要求等级 未解锁  
 | 
                if (PlayerDatas.Instance.fairyData.fairy.FamilyLV < config.UnlockFamilyLV)  
 | 
                    return false;  
 | 
                return true;  
 | 
  
 | 
            case FairyEmblemUnlockMethodType.Active:  
 | 
                //封包中没有就算未解锁  
 | 
                if (!TryGetfamilyAction(emblemId, out familyAction))  
 | 
                    return false;  
 | 
                if (familyAction.Value2 > 0 && familyAction.Value2 < TimeUtility.AllSeconds)  
 | 
                    return false;  
 | 
                return true;  
 | 
  
 | 
            default:  
 | 
                return false;  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public bool IsUsing(int emblemId)  
 | 
    {  
 | 
        if (!TryGetNowEmblemID(out int Id))  
 | 
        {  
 | 
            return false;  
 | 
        }  
 | 
        return emblemId == Id;  
 | 
    }  
 | 
  
 | 
    public bool IsLimitTime(int emblemId, out HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction)  
 | 
    {  
 | 
        familyAction = new HA403_tagGCFamilyActionInfo.tagGCFamilyAction();  
 | 
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);  
 | 
        FairyEmblemUnlockMethodType type = GetFairyEmblemUnlockType(emblemId);  
 | 
        switch (type)  
 | 
        {  
 | 
            case FairyEmblemUnlockMethodType.LV:  
 | 
                return false;  
 | 
  
 | 
            case FairyEmblemUnlockMethodType.Custom:  
 | 
            case FairyEmblemUnlockMethodType.Active:  
 | 
                if (config.ExpireMinutes <= 0)  
 | 
                    return false;  
 | 
                if (!TryGetfamilyAction(emblemId, out familyAction))  
 | 
                    return false;  
 | 
                return true;  
 | 
  
 | 
            default:  
 | 
                return false;  
 | 
        }  
 | 
    }  
 | 
  
 | 
    public bool IsCaptain()  
 | 
    {  
 | 
        return (int)PlayerDatas.Instance.fairyData.mine.FamilyLV == 3;  
 | 
    }  
 | 
  
 | 
    // 尝试从封包中得到指定的徽章时效信息(活动途径获取的徽章,定制徽章)  
 | 
    private bool TryGetfamilyAction(int emblemId, out HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction)  
 | 
    {  
 | 
        familyAction = new HA403_tagGCFamilyActionInfo.tagGCFamilyAction();  
 | 
        if (!familyActions.TryGetValue(emblemId, out var info))  
 | 
            return false;  
 | 
        familyAction = info;  
 | 
        return true;  
 | 
    }  
 | 
  
 | 
    public bool TryGetEffectID(int emblemId, out int effectID)  
 | 
    {  
 | 
        effectID = 0;  
 | 
        if (!FamilyEmblemConfig.HasKey(emblemId))  
 | 
            return false;  
 | 
        FamilyEmblemConfig config = FamilyEmblemConfig.Get(emblemId);  
 | 
        if (!EffectConfig.HasKey(config.EffectID))  
 | 
            return false;  
 | 
        effectID = config.EffectID;  
 | 
        return true;  
 | 
    }  
 | 
  
 | 
    public void UpdateFamilyAction(HA403_tagGCFamilyActionInfo vNetData)  
 | 
    {  
 | 
        if (vNetData.ActionType != FamilyActionsType || PlayerDatas.Instance.baseData == null || (int)vNetData.FamilyID != (int)PlayerDatas.Instance.baseData.FamilyId)  
 | 
            return;  
 | 
        for (int i = 0; i < vNetData.FamilyActionList.Length; i++)  
 | 
        {  
 | 
            HA403_tagGCFamilyActionInfo.tagGCFamilyAction familyAction = vNetData.FamilyActionList[i];  
 | 
            familyActions[(int)familyAction.Value1] = familyAction;  
 | 
        }  
 | 
        UpdateFamilyActionEvent?.Invoke((int)vNetData.FamilyID, vNetData.ActionType);  
 | 
    }  
 | 
}  
 | 
  
 | 
public class EmblemModel  
 | 
{  
 | 
    public int emblemID { get; private set; }  
 | 
    public int emblemUIEffectID { get; private set; }  
 | 
  
 | 
    public EmblemModel(int emblemID, int emblemUIEffectID)  
 | 
    {  
 | 
        this.emblemID = emblemID;  
 | 
        this.emblemUIEffectID = emblemUIEffectID;  
 | 
    }  
 | 
} 
 |