hch
5 天以前 21adb62fbffeb0c6f07ae6fe6ddc78763876c7df
266 【内政】古宝系统
11个文件已修改
10个文件已添加
829 ■■■■■ 已修改文件
Main/Config/PartialConfigs/GubaoResonanceAttrConfig.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/GubaoResonanceAttrConfig.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/GubaoResonanceConfig.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/GubaoResonanceConfig.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/PlayerPropertyConfig.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoActiveWin.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoBaseWin.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoCell.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoDetailWin.cs 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoManager.cs 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoSuiteItemCell.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoSuiteItemCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoSuiteListCell.cs 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoSuiteListCell.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoSuiteListWin.cs 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoSuiteListWin.cs.meta 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/Gubao/GubaoTipWin.cs 245 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/BoxGetItemModel.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/ItemTip/ChooseItemsCell.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/BackpackData.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/System/KnapSack/Logic/CommonGetItem.cs 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Main/Config/PartialConfigs/GubaoResonanceAttrConfig.cs
New file
@@ -0,0 +1,75 @@
using System.Collections.Generic;
using System.Linq;
public partial class GubaoResonanceAttrConfig : ConfigBase<int, GubaoResonanceAttrConfig>
{
    static Dictionary<int, Dictionary<int, GubaoResonanceAttrConfig>> suiteCfgDict = new Dictionary<int, Dictionary<int, GubaoResonanceAttrConfig>>();
    protected override void OnConfigParseCompleted()
    {
        if (!suiteCfgDict.ContainsKey(ResonanceID))
        {
            suiteCfgDict[ResonanceID] = new Dictionary<int, GubaoResonanceAttrConfig>();
        }
        suiteCfgDict[ResonanceID][ResonanceStar] = this;
    }
    public static GubaoResonanceAttrConfig GetConfig(int ResonanceID, int ResonanceStar)
    {
        if (suiteCfgDict.ContainsKey(ResonanceID))
        {
            if (suiteCfgDict[ResonanceID].ContainsKey(ResonanceStar))
            {
                return suiteCfgDict[ResonanceID][ResonanceStar];
            }
        }
        return null;
    }
    // 获取当前激活的星级,-1 代表没有激活
    //_star 是套装里的最小星级
    public static int GetActiveStar(int ResonanceID, int _star)
    {
        int activeStar = -1;
        if (suiteCfgDict.ContainsKey(ResonanceID))
        {
            // 找不到当前星级,找最接近的星级
            var keys = suiteCfgDict[ResonanceID].Keys.ToList();
            keys.Sort();
            foreach (var star in keys)
            {
                if (_star >= star)
                {
                    activeStar = star;
                }
            }
        }
        return activeStar;
    }
    // 获取临近的星级,先取下一个激活的星级, 最大的就取前一星
    public static int GetNearStar(int ResonanceID, int _Star)
    {
        var keys = suiteCfgDict[ResonanceID].Keys.ToList();
        keys.Sort();
        foreach (var star in keys)
        {
            if (_Star < star)
            {
                return star;
            }
        }
        return keys[keys.Count - 2];
    }
    public static List<int> GetStarList(int ResonanceID)
    {
        var keys = suiteCfgDict[ResonanceID].Keys.ToList();
        keys.Sort();
        return keys;
    }
}
Main/Config/PartialConfigs/GubaoResonanceAttrConfig.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 5c38487f61edd9b4b894c98d224f1108
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Config/PartialConfigs/GubaoResonanceConfig.cs
New file
@@ -0,0 +1,22 @@
using System.Collections.Generic;
public partial class GubaoResonanceConfig : ConfigBase<int, GubaoResonanceConfig>
{
    static Dictionary<int, int> gbIDToSuiteIDDict = new Dictionary<int, int>();
    protected override void OnConfigParseCompleted()
    {
        for (int i = 0; i < GubaoIDList.Length; i++)
        {
            gbIDToSuiteIDDict[GubaoIDList[i]] = ResonanceID;
        }
    }
    public static int GetSuiteIDByGubaoID(int gbID)
    {
        if (gbIDToSuiteIDDict.ContainsKey(gbID))
        {
            return gbIDToSuiteIDDict[gbID];
        }
        return 0;
    }
}
Main/Config/PartialConfigs/GubaoResonanceConfig.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: aa382e59e7d53d445a14104e4d7d2e3d
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/Config/PartialConfigs/PlayerPropertyConfig.cs
@@ -107,7 +107,8 @@
        }
    }
    public static string GetBaseFullDescription(int id, long value, string format="{0}+{1}")
    //基础属性描述
    public static string GetBaseFullDescription(int id, long value, string format = "{0}+{1}")
    {
        var config = Get(id);
        if (config == null)
Main/System/Gubao/GubaoActiveWin.cs
@@ -3,8 +3,6 @@
/// <summary>
/// 古宝激活成功
/// 外部查看类型 0完整tip(可切满级) 1 只有基础满级不可切换 2 只有套装
/// 内部可切换当前0 和 完整1
/// </summary>
public class GubaoActiveWin : UIBase
{
@@ -71,12 +69,18 @@
        //有特殊层级的:如果为0,则第一行只显示单行的属性和提升,第二行显示数值0;如果不为0,则第一行显示单行属性和提升,第二行显示数值
        //有特权效果的亦同
        var specAttrDict = GubaoManager.Instance.GetSpecialAttrByGBID(gubaoID, true);
        if (config.SpecEffType == 0)
        if (config.SpecEffType == 0 && config.SpecAttrID == 0)
        {
            attrSpecialText.SetActive(false);
        }
        else if (config.SpecEffType == 0)
        {
            attrSpecialText.SetActive(true);
            attrSpecialText.text = PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID]);
        }
        else
        {
            attrSpecialText.SetActive(true);
            //有特殊效果的
            var singleLayerAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID);
            attrSpecialText.text = Language.Get("Gubao22_" + config.SpecEffType) + PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, singleLayerAttrDict[config.SpecAttrID]);
Main/System/Gubao/GubaoBaseWin.cs
@@ -22,7 +22,7 @@
                bg.SetActive(false);
                break;
            case 2:
                currentSubUI = UIManager.Instance.OpenWindow<GubaoListWin>();
                currentSubUI = UIManager.Instance.OpenWindow<GubaoSuiteListWin>();
                jbbg.SetActive(false);
                bg.SetActive(true);
                break;
Main/System/Gubao/GubaoCell.cs
@@ -24,12 +24,37 @@
    public void Display(int quality, int index)
    {
        var gubaoID = GubaoManager.Instance.gubaoCollectDict[quality][index];
        DisplayByGBID(gubaoID);
        redImg.SetActive(GubaoManager.Instance.IsRedTip(gubaoID));
    }
    public void Display(int gubaoID)
    {
        DisplayByGBID(gubaoID);
        var gbData = GubaoManager.Instance.TryGetGubaoInfo(gubaoID);
        int star = 0;
        if (gbData != null)
        {
            star = gbData.GubaoStar;
        }
        redImg.SetActive(star < 5 && GubaoManager.Instance.CanStarUpGubao(gubaoID));
    }
    void DisplayByGBID(int gubaoID)
    {
        gbBtn.AddListener(() =>
        {
            UIManager.Instance.OpenWindow<GubaoDetailWin>(gubaoID);
        });
        var config = GubaoConfig.Get(gubaoID);
        if (config == null)
        {
            Debug.LogError($"找不到古宝ID: {gubaoID}");
            return;
        }
        int quality = config.GubaoQuality;
        gbImg.SetOrgSprite(config.Icon, "gbicon");
        gbImg.SetNativeSize();
        gbBGImg.SetSprite($"GubaoBG{quality}");
@@ -90,6 +115,4 @@
        lvText.text = lv == 0 ? "" : Language.Get("L1113", lv);
        redImg.SetActive(GubaoManager.Instance.IsRedTip(gubaoID));
    }
}
Main/System/Gubao/GubaoDetailWin.cs
@@ -78,12 +78,12 @@
    {
        seeSuiteBtn.AddListener(() =>
        {
            GubaoManager.Instance.ShowTip(gubaoID, 3);
            GubaoManager.Instance.ShowTip(gubaoID, 2);
        });
        seeFullBtn.AddListener(() =>
        {
            GubaoManager.Instance.ShowTip(gubaoID, 2);
            GubaoManager.Instance.ShowTip(gubaoID, 1);
        });
        lvupTabBtn.AddListener(() =>
        {
@@ -123,6 +123,15 @@
    public void Display()
    {
        var config = GubaoConfig.Get(gubaoID);
        Debug.Log($"古宝ID: {gubaoID}");
        if (config == null)
        {
            Debug.LogError($"找不到古宝ID: {gubaoID}");
            return;
        }
        seeSuiteBtn.SetActive(GubaoResonanceConfig.GetSuiteIDByGubaoID(gubaoID) != 0);
        var quality = config.GubaoQuality;
        gbImg.SetOrgSprite(config.Icon, "gbicon");
@@ -381,45 +390,54 @@
        var specAttrDict = GubaoManager.Instance.GetSpecialAttrByGBID(gubaoID, true);
        if (config.SpecEffType == 0)
        {
            attrSpecialTexts[0].text = PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID]);
            if (tabIndex == 0)
            if (config.SpecAttrID != 0)
            {
                //合成时不显示
                addAttrSpecialRects[0].SetActive(false);
            }
            else if (tabIndex == 1)
            {
                //满级不显示
                if (GubaoManager.Instance.IsMaxLV(gubaoID))
                attrSpecialRects[0].SetActive(true);
                attrSpecialTexts[0].text = PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID]);
                if (tabIndex == 0)
                {
                    //合成时不显示
                    addAttrSpecialRects[0].SetActive(false);
                }
                else
                else if (tabIndex == 1)
                {
                    var nextAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID, lv + 1);
                    addAttrSpecialRects[0].SetActive(true);
                    addAttrSpecialTexts[0].text = PlayerPropertyConfig.GetValueDescriptionFormat(config.SpecAttrID, nextAttrDict[config.SpecAttrID]);
                    //满级不显示
                    if (GubaoManager.Instance.IsMaxLV(gubaoID))
                    {
                        addAttrSpecialRects[0].SetActive(false);
                    }
                    else
                    {
                        var nextAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID, lv + 1);
                        addAttrSpecialRects[0].SetActive(true);
                        addAttrSpecialTexts[0].text = PlayerPropertyConfig.GetValueDescriptionFormat(config.SpecAttrID, nextAttrDict[config.SpecAttrID]);
                    }
                }
                else if (tabIndex == 2)
                {
                    //满星不显示
                    if (GubaoManager.Instance.IsMaxStar(gubaoID))
                    {
                        addAttrSpecialRects[0].SetActive(false);
                    }
                    else
                    {
                        var nextAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID, 0, star + 1);
                        addAttrSpecialRects[0].SetActive(true);
                        addAttrSpecialTexts[0].text = PlayerPropertyConfig.GetValueDescriptionFormat(config.SpecAttrID, nextAttrDict[config.SpecAttrID]);
                    }
                }
            }
            else if (tabIndex == 2)
            else
            {
                //满星不显示
                if (GubaoManager.Instance.IsMaxStar(gubaoID))
                {
                    addAttrSpecialRects[0].SetActive(false);
                }
                else
                {
                    var nextAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID, 0, star + 1);
                    addAttrSpecialRects[0].SetActive(true);
                    addAttrSpecialTexts[0].text = PlayerPropertyConfig.GetValueDescriptionFormat(config.SpecAttrID, nextAttrDict[config.SpecAttrID]);
                }
                attrSpecialRects[0].SetActive(false);
            }
        }
        else
        {
            //有特殊效果的
            var singleLayerAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID);
            attrSpecialRects[0].SetActive(true);
            attrSpecialTexts[0].text = Language.Get("Gubao22_" + config.SpecEffType) + PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, singleLayerAttrDict[config.SpecAttrID]);
            attrSpecialTexts[1].text = Language.Get("Gubao21", layer, config.SpecEffLayerMax, PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, layer == 0 ? 0 : specAttrDict[config.SpecAttrID]));
            if (tabIndex == 0)
Main/System/Gubao/GubaoManager.cs
@@ -416,6 +416,20 @@
        return attrDict;
    }
    public Dictionary<int, long> GetBaseMaxAttrByGBID(int gubaoID)
    {
        Dictionary<int, long> attrDict = new Dictionary<int, long>();
        var config = GubaoConfig.Get(gubaoID);
        var maxStar = GubaoStarConfig.GetMaxStar(config.GubaoQuality);
        for (int i = 0; i < config.BaseAttrIDList.Length; i++)
        {
            attrDict[config.BaseAttrIDList[i]] = config.BaseAttrValueList[i] + config.BaseAttrPerStarAddList[i] * maxStar;
        }
        return attrDict;
    }
    public Dictionary<int, long> GetSpecialAttrByGBID(int gubaoID, bool isPreview = false)
    {
        Dictionary<int, long> attrDict = new Dictionary<int, long>();
@@ -443,6 +457,25 @@
        return attrDict;
    }
    public Dictionary<int, long> GetSpecialMaxAttrByGBID(int gubaoID)
    {
        Dictionary<int, long> attrDict = new Dictionary<int, long>();
        var config = GubaoConfig.Get(gubaoID);
        int quality = config.GubaoQuality;
        var maxStar = GubaoStarConfig.GetMaxStar(config.GubaoQuality);
        var maxLV = GubaoLVAttrConfig.GetMaxLV(quality);
        attrDict[config.SpecAttrID] = config.SpecAttrValue + config.SpecAttrPerStarAdd * maxStar
            + GubaoLVAttrConfig.GetSpecLVAttrValue(quality, maxLV, config.SpecAttrID);
        if (config.SpecEffType != 0)
        {
            attrDict[config.SpecAttrID] *= config.SpecEffLayerMax;
        }
        return attrDict;
    }
    //单层的属性,或者不需要层的
@@ -492,6 +525,15 @@
        return attrDict;
    }
    public Dictionary<int, int> GetPrivilegeMaxValueByGBID(int gubaoID)
    {
        Dictionary<int, int> attrDict = new Dictionary<int, int>();
        var config = GubaoConfig.Get(gubaoID);
        var maxStar = GubaoStarConfig.GetMaxStar(config.GubaoQuality);
        attrDict[config.PowerType] = config.PowerValue + config.PowerPerStarAdd * maxStar;
        return attrDict;
    }
    public bool IsMaxLV(int gubaoID)
    {
        var config = GubaoConfig.Get(gubaoID);
@@ -515,6 +557,38 @@
        return gubaoInfo.GubaoStar >= GubaoStarConfig.GetMaxStar(config.GubaoQuality);
    }
    //套装星级 -1没激活
    public int GetSuiteStar(int suiteID)
    {
        var suiteCfg = GubaoResonanceConfig.Get(suiteID);
        int minStar = 999999;   //取最小星级
        foreach (var gubaoID in suiteCfg.GubaoIDList)
        {
            var gubaoInfo = TryGetGubaoInfo(gubaoID);
            if (gubaoInfo == null)
            {
                return -1;
            }
            minStar = Math.Min(minStar, gubaoInfo.GubaoStar);
        }
        return GubaoResonanceAttrConfig.GetActiveStar(suiteID, minStar);
    }
    public int GetSuiteActiveGBCnt(int suiteID)
    {
        var suiteCfg = GubaoResonanceConfig.Get(suiteID);
        int cnt = 0;
        foreach (var gubaoID in suiteCfg.GubaoIDList)
        {
            var gubaoInfo = TryGetGubaoInfo(gubaoID);
            if (gubaoInfo != null)
            {
                cnt++;
            }
        }
        return cnt;
    }
    #endregion
    #region 鉴宝
Main/System/Gubao/GubaoSuiteItemCell.cs
New file
@@ -0,0 +1,82 @@
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class GubaoSuiteItemCell : MonoBehaviour
{
    [SerializeField] ItemCell mainItemCell;
    [SerializeField] Image[] starImgs;
    [SerializeField] Transform processRect;
    [SerializeField] Image processImg;
    [SerializeField] Text processText;
    [SerializeField] Image fullProcessImg;
    public void DisplayByGBID(int gubaoID)
    {
        var config = GubaoConfig.Get(gubaoID);
        if (config == null)
        {
            Debug.LogError($"找不到古宝ID: {gubaoID}");
            return;
        }
        var gbData = GubaoManager.Instance.TryGetGubaoInfo(gubaoID);
        int lv = 0;
        int star = 0;
        if (gbData != null)
        {
            lv = gbData.GubaoLV;
            star = gbData.GubaoStar;
        }
        mainItemCell.Init(new ItemCellModel(config.UnlockItemID, false, 1));
        mainItemCell.pieceIcon.SetActive(false);
        mainItemCell.countText.text = lv == 0 ? "" : Language.Get("L1113", lv);
        mainItemCell.button.AddListener(()=>
        {
            GubaoManager.Instance.ShowTip(gubaoID, 1);
        });
        for (int i = 0; i < starImgs.Length; i++)
        {
            if (i < star)
            {
                starImgs[i].SetActive(true);
                //循环不同图
                int starIndex = star / starImgs.Length * starImgs.Length + i + 1;
                if (starIndex > star)
                {
                    starIndex -= starImgs.Length;
                }
                starImgs[i].SetSprite($"GubaoStar{starIndex}");
            }
            else
            {
                starImgs[i].SetActive(false);
            }
        }
        if (GubaoManager.Instance.IsMaxStar(gubaoID))
        {
            processRect.SetActive(false);
        }
        else
        {
            var starConfig = GubaoStarConfig.GetConfig(config.GubaoQuality, star + 1);
            if (starConfig.StarUPNeedSelfCnt > 0)
            {
                processRect.SetActive(true);
                var cnt = VirtualPackManager.Instance.GetNoPackItemCount(config.UnlockItemID);
                float value = cnt * 1.0f / starConfig.StarUPNeedSelfCnt;
                processImg.fillAmount = value;
                fullProcessImg.SetActive(value >= 1);
                processText.text = $"{cnt}/{starConfig.StarUPNeedSelfCnt}";
            }
            else
            {
                processRect.SetActive(false);
            }
        }
    }
}
Main/System/Gubao/GubaoSuiteItemCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 9e8abe6412cf2a747b9a3ed7b94c2db8
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Gubao/GubaoSuiteListCell.cs
New file
@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class GubaoSuiteListCell : CellView
{
    [SerializeField] GubaoCell[] gubaoCells;
    [SerializeField] Text suiteNameText;
    [SerializeField] Text[] suiteAttrTexts;
    [SerializeField] Image[] activeImgs;
    [SerializeField] Image[] lockImgs;
    [SerializeField] Button seeSuiteBtn;
    public void Display(int id)
    {
        var suiteCfg = GubaoResonanceConfig.Get(id);
        suiteNameText.text = suiteCfg.ResonanceName;
        seeSuiteBtn.AddListener(() =>
        {
            GubaoManager.Instance.ShowTip(suiteCfg.GubaoIDList[0], 2);
        });
        var config = GubaoResonanceConfig.Get(id);
        for (int i = 0; i < gubaoCells.Length; i++)
        {
            if (i < config.GubaoIDList.Length)
            {
                gubaoCells[i].SetActive(true);
                gubaoCells[i].Display(config.GubaoIDList[i]);
            }
            else
            {
                gubaoCells[i].SetActive(false);
            }
        }
        var curSuiteStar = GubaoManager.Instance.GetSuiteStar(id);
        var tmpStar = curSuiteStar == -1 ? 0 : curSuiteStar;
        var nearSuiteStar = GubaoResonanceAttrConfig.GetNearStar(id, tmpStar);
        var starList = new List<int>() { tmpStar, nearSuiteStar };
        starList.Sort();
        for (int i = 0; i < suiteAttrTexts.Length; i++)
        {
            string preStr;
            var star = starList[i];
            var attrCfg = GubaoResonanceAttrConfig.GetConfig(id, star);
            if (star == 0)
            {
                preStr = Language.Get("Gubao27");
            }
            else
            {
                preStr = Language.Get("Gubao28", star);
            }
            if (star <= curSuiteStar)
            {
                //激活
                string format = "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}", false);
                suiteAttrTexts[i].text = Language.Get("L1100", preStr, PlayerPropertyConfig.GetFullDescription(attrCfg.ResonanceAttrIDList[0], attrCfg.ResonanceAttrValueList[0], format));
                activeImgs[i].SetActive(true);
                lockImgs[i].SetActive(false);
            }
            else
            {
                //锁定
                suiteAttrTexts[i].text = UIHelper.AppendColor(TextColType.NavyGray, Language.Get("L1100", preStr, PlayerPropertyConfig.GetFullDescription(attrCfg.ResonanceAttrIDList[0], attrCfg.ResonanceAttrValueList[0])));
                activeImgs[i].SetActive(false);
                lockImgs[i].SetActive(true);
            }
        }
    }
}
Main/System/Gubao/GubaoSuiteListCell.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 71612a00de9ad6b4285b2f7ce1a0d3e0
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Gubao/GubaoSuiteListWin.cs
New file
@@ -0,0 +1,55 @@
using System;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 古宝套装列表
/// </summary>
public class GubaoSuiteListWin : UIBase
{
    [SerializeField] ScrollerController scroller;
    protected override void OnPreOpen()
    {
        scroller.OnRefreshCell += OnRefreshCell;
        UIManager.Instance.OnCloseWindow += OnCloseWindow;
        Display();
    }
    protected override void OnPreClose()
    {
        scroller.OnRefreshCell -= OnRefreshCell;
        UIManager.Instance.OnCloseWindow -= OnCloseWindow;
    }
    void OnCloseWindow(UIBase ui)
    {
        if (ui is GubaoDetailWin)
        {
            scroller.m_Scorller.RefreshActiveCellViews();
        }
    }
    void Display()
    {
        scroller.Refresh();
        var keys = GubaoResonanceConfig.GetKeys();
        for (int i = 0; i < keys.Count; i++)
        {
            scroller.AddCell(ScrollerDataType.Header, keys[i]);
        }
        scroller.Restart();
    }
    void OnRefreshCell(ScrollerDataType type, CellView cell)
    {
        var _cell = cell as GubaoSuiteListCell;
        _cell.Display(cell.index);
    }
}
Main/System/Gubao/GubaoSuiteListWin.cs.meta
New file
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 4cea86c782acca946a4c90aa92236f81
MonoImporter:
  externalObjects: {}
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Main/System/Gubao/GubaoTipWin.cs
@@ -4,60 +4,177 @@
using UnityEngine.UI;
/// <summary>
/// 古宝TIP
/// 古宝TIP
/// 外部查看类型 0完整tip(可切满级) 1 只有基础满级不可切换 2 只有套装
/// 内部可切换当前0 和 完整1
/// </summary>
public class GubaoTipWin : UIBase
{
    [SerializeField] ImageEx gbImg;
    [SerializeField] UIEffectPlayer gbBGEffect;
    [SerializeField] UIEffectPlayer gbEffect;
    [SerializeField] ItemCell mainItemCell;
    [SerializeField] Text nameText;
    [SerializeField] Image[] starImgs;
    [SerializeField] Transform processRect;
    [SerializeField] Image processImg;
    [SerializeField] Text processText;
    [SerializeField] Image fullProcessImg;
    //基础属性
    [SerializeField] Text[] attrBaseTexts;
    [SerializeField] Text attrSpecialText;
    [SerializeField] Transform attrPrivilegeRect;
    [SerializeField] Text attrPrivilegeText;
    [SerializeField] Text specialText;  //特殊属性和特权效果
    [SerializeField] Button okBtn;
    [SerializeField] Button changeBtn;
    [SerializeField] Text changeText;
    [SerializeField] Transform fullRect;
    [SerializeField] GubaoSuiteItemCell[] suiteItemCells;
    [SerializeField] Text suiteNameText;
    [SerializeField] Text[] suiteAttrTexts;
    [SerializeField] Transform basePanel;
    [SerializeField] Transform linePanel;
    [SerializeField] Transform suitePanel;
    int gubaoID = 0;
    bool isFull = false;    //  是否显示满级
    int lv = 0;
    int star = 0;
    int quality = 0;
    GubaoConfig config;
    protected override void InitComponent()
    {
        okBtn.AddListener(CloseWindow);
        changeBtn.AddListener(()=>
        {
            isFull = !isFull;
            ShowAttr();
        });
    }
    protected override void OnPreOpen()
    {
        gubaoID = functionOrder;
        if (GubaoManager.Instance.tipType == 0)
        {
            isFull = false;
        }
        else if (GubaoManager.Instance.tipType == 1)
        {
            isFull = true;
        }
        Display();
    }
    public void Display()
    {
        var config = GubaoConfig.Get(gubaoID);
        gbImg.SetOrgSprite(config.Icon, "gbicon");
        gbImg.SetNativeSize();
        config = GubaoConfig.Get(gubaoID);
        var gbData = GubaoManager.Instance.TryGetGubaoInfo(gubaoID);
        gbBGEffect.PlayByArrIndex(gbData.Quality - 2);
        gbEffect.PlayByArrIndex(gbData.Quality - 2);
        nameText.text = config.Name;
        nameText.color = UIHelper.GetFuncQualityColor(gbData.Quality);
        ShowAttr(config);
        lv = 0;
        star = 0;
        quality = config.GubaoQuality;
        if (gbData != null)
        {
            lv = gbData.GubaoLV;
            star = gbData.GubaoStar;
        }
        /// 外部查看类型 0完整tip(可切满级) 1 只有基础满级不可切换 2 只有套装
        if (GubaoManager.Instance.tipType == 0)
        {
            basePanel.SetActive(true);
            fullRect.SetActive(false);
            changeBtn.SetActive(true);
            linePanel.SetActive(true);
            ShowBase();
            ShowSuite();
        }
        else if (GubaoManager.Instance.tipType == 1)
        {
            basePanel.SetActive(true);
            linePanel.SetActive(false);
            suitePanel.SetActive(false);
            fullRect.SetActive(true);
            changeBtn.SetActive(false);
            ShowBase();
        }
        else if (GubaoManager.Instance.tipType == 2)
        {
            basePanel.SetActive(false);
            linePanel.SetActive(false);
            ShowSuite();
        }
    }
    void ShowAttr(GubaoConfig config)
    void ShowBase()
    {
        nameText.text = Language.Get("L1039", Language.Get($"FuncQuality{quality}")) + config.Name;
        nameText.color = UIHelper.GetFuncQualityColor(quality);
        ShowAttr();
    }
    void ShowAttr()
    {
        changeText.text = isFull ? Language.Get("Gubao8") : Language.Get("Gubao9");
        mainItemCell.Init(new ItemCellModel(config.UnlockItemID, false, 1));
        mainItemCell.pieceIcon.SetActive(false);
        mainItemCell.countText.text = lv == 0 ? "" : Language.Get("L1113", isFull ? GubaoLVAttrConfig.GetMaxLV(quality) : lv);
        if (GubaoManager.Instance.IsMaxStar(gubaoID))
        {
            processRect.SetActive(false);
        }
        else
        {
            var starConfig = GubaoStarConfig.GetConfig(config.GubaoQuality, star + 1);
            if (starConfig.StarUPNeedSelfCnt > 0)
            {
                processRect.SetActive(true);
                var cnt = VirtualPackManager.Instance.GetNoPackItemCount(config.UnlockItemID);
                float value = cnt * 1.0f / starConfig.StarUPNeedSelfCnt;
                processImg.fillAmount = value;
                fullProcessImg.SetActive(value >= 1);
                processText.text = $"{cnt}/{starConfig.StarUPNeedSelfCnt}";
            }
            else
            {
                processRect.SetActive(false);
            }
        }
        int showStar = isFull ? GubaoStarConfig.GetMaxStar(quality) : star;
        for (int i = 0; i < starImgs.Length; i++)
        {
            if (i < showStar)
            {
                starImgs[i].SetActive(true);
                //循环不同图
                int starIndex = showStar / starImgs.Length * starImgs.Length + i + 1;
                if (starIndex > showStar)
                {
                    starIndex -= starImgs.Length;
                }
                starImgs[i].SetSprite($"GubaoStar{starIndex}");
            }
            else
            {
                starImgs[i].SetActive(false);
            }
        }
        string format = "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}", false);
        //基础属性
        var attrDict = GubaoManager.Instance.GetBaseAttrByGBID(gubaoID);
        var attrDict = !isFull ? GubaoManager.Instance.GetBaseAttrByGBID(gubaoID, true) : GubaoManager.Instance.GetBaseMaxAttrByGBID(gubaoID);
        for (int i = 0; i < attrBaseTexts.Length; i++)
        {
            if (i < config.BaseAttrIDList.Length)
            {
                attrBaseTexts[i].SetActive(true);
                attrBaseTexts[i].text = PlayerPropertyConfig.GetFullDescription(config.BaseAttrIDList[i], attrDict[config.BaseAttrIDList[i]]);
                attrBaseTexts[i].text = PlayerPropertyConfig.GetFullDescription(config.BaseAttrIDList[i], attrDict[config.BaseAttrIDList[i]], format);
            }
            else
            {
@@ -65,43 +182,91 @@
            }
        }
        //特殊属性:只有一个属性,第一行单层属性,第二行为特效效果层级加成汇总
        //分两种情况
        //无任何效果的正常升星升级显示第一行,第二行隐藏
        //有特殊层级的:如果为0,则第一行只显示单行的属性和提升,第二行显示数值0;如果不为0,则第一行显示单行属性和提升,第二行显示数值
        //有特权效果的亦同
        var specAttrDict = GubaoManager.Instance.GetSpecialAttrByGBID(gubaoID, true);
        if (config.SpecEffType == 0)
        //特殊属性和特权只显示一个
        var specAttrDict = !isFull ? GubaoManager.Instance.GetSpecialAttrByGBID(gubaoID, true) : GubaoManager.Instance.GetSpecialMaxAttrByGBID(gubaoID);
        if (config.SpecEffType == 0 && config.SpecAttrID != 0)
        {
            attrSpecialText.text = PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID]);
            specialText.text = PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID], format);
        }
        else
        else if (config.SpecEffType != 0 && config.SpecAttrID != 0)
        {
            //有特殊效果的
            var singleLayerAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID);
            attrSpecialText.text = Language.Get("Gubao22_" + config.SpecEffType) + PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, singleLayerAttrDict[config.SpecAttrID]);
            specialText.text = Language.Get("Gubao22_" + config.SpecEffType) + PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID], format);
        }
        if (config.PowerType != 0)
        else
        {
            // 1    游历双倍奖励概率    无    增加万分率    万分率
            // 2    月卡领取额外奖励    物品ID    提升百分比    百分比
            //有特权效果的 非属性类
            attrPrivilegeRect.SetActive(true);
            var valueDict = GubaoManager.Instance.GetPrivilegeValueByGBID(gubaoID, true);
            var valueDict = !isFull ? GubaoManager.Instance.GetPrivilegeValueByGBID(gubaoID, true) : GubaoManager.Instance.GetPrivilegeMaxValueByGBID(gubaoID);
            if (config.PowerType == 1)
            {
                attrPrivilegeText.text = Language.Get("Gubao23_" + config.PowerType, valueDict[config.PowerType] / 100.0);
                specialText.text = Language.Get("Gubao23_" + config.PowerType, valueDict[config.PowerType] / 100.0);
            }
            else if (config.PowerType == 2)
            {
                attrPrivilegeText.text = Language.Get("Gubao23_" + config.PowerType, ItemConfig.Get(config.PowerTypeValue).ItemName, valueDict[config.PowerType]);
                specialText.text = Language.Get("Gubao23_" + config.PowerType, ItemConfig.Get(config.PowerTypeValue).ItemName, valueDict[config.PowerType]);
            }
        }
        else
    }
    void ShowSuite()
    {
        var suitID = GubaoResonanceConfig.GetSuiteIDByGubaoID(gubaoID);
        if (suitID == 0)
        {
            attrPrivilegeRect.SetActive(false);
            suitePanel.SetActive(false);
            linePanel.SetActive(false);
            return;
        }
        suitePanel.SetActive(true);
        var suitConfig = GubaoResonanceConfig.Get(suitID);
        suiteNameText.text = suitConfig.ResonanceName + Language.Get("HeroFates11", GubaoManager.Instance.GetSuiteActiveGBCnt(suitID), suitConfig.GubaoIDList.Length);
        for (int i = 0; i < suiteItemCells.Length; i++)
        {
            if (i < suitConfig.GubaoIDList.Length)
            {
                suiteItemCells[i].SetActive(true);
                suiteItemCells[i].DisplayByGBID(suitConfig.GubaoIDList[i]);
            }
            else
            {
                suiteItemCells[i].SetActive(false);
            }
        }
        var curSuiteStar = GubaoManager.Instance.GetSuiteStar(suitID);
        var starList = GubaoResonanceAttrConfig.GetStarList(suitID);
        for (int i = 0; i < suiteAttrTexts.Length; i++)
        {
            string preStr;
            var star = starList[i];
            var attrCfg = GubaoResonanceAttrConfig.GetConfig(suitID, star);
            if (star == 0)
            {
                preStr = Language.Get("Gubao27");
            }
            else
            {
                preStr = Language.Get("Gubao28", star);
            }
            if (star <= curSuiteStar)
            {
                //激活
                string format = "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}", false);
                suiteAttrTexts[i].text = Language.Get("L1100", preStr, PlayerPropertyConfig.GetFullDescription(attrCfg.ResonanceAttrIDList[0], attrCfg.ResonanceAttrValueList[0], format));
            }
            else
            {
                //锁定
                suiteAttrTexts[i].text = UIHelper.AppendColor(TextColType.NavyGray, Language.Get("L1100", preStr, PlayerPropertyConfig.GetFullDescription(attrCfg.ResonanceAttrIDList[0], attrCfg.ResonanceAttrValueList[0])));
            }
        }
    }
}
Main/System/ItemTip/BoxGetItemModel.cs
@@ -105,6 +105,8 @@
            }
        }
        bool isMergeItem = true;
        //约定IsBind=10 为古宝额外增加
        if (netPack.ItemList.Length != 0)
        {
            for (int i = 0; i < netPack.ItemLen; i++)
@@ -112,6 +114,10 @@
                showItems.Add(new Item((int)netPack.ItemList[i].ItemID,
                netPack.ItemList[i].Count + netPack.ItemList[i].CountEx * Constants.ExpPointValue,
                netPack.ItemList[i].IsBind));
                if (isMergeItem && netPack.ItemList[i].IsBind >= 10)
                {
                    isMergeItem = false;
                }
            }
        }
@@ -123,7 +129,7 @@
        if (showItems.Count == 0)
            return;
        ItemLogicUtility.Instance.ShowGetItem(showItems, eventName);
        ItemLogicUtility.Instance.ShowGetItem(showItems, eventName, isMergeItem:isMergeItem);
    }
    // public int GetUseCntByID(int itemId)
Main/System/ItemTip/ChooseItemsCell.cs
@@ -10,6 +10,7 @@
    [SerializeField] LongPressButton btnReduce;
    [SerializeField] LongPressButton btnPlus;
    [SerializeField] Transform numForm;
    [SerializeField] Transform unHaveRect;
    int itemId;
    string guid;
@@ -42,6 +43,16 @@
            btnReduce.SetListener(OnClickReduce);
            btnReduce.onPress.AddListener(OnClickReduce);
        }
        var gbCfg = GubaoConfig.Get(itemId);
        if (gbCfg != null && !GubaoManager.Instance.IsActive(itemId))
        {
            unHaveRect.SetActive(true);
        }
        else
        {
            unHaveRect.SetActive(false);
        }
    }
    void OnClickPlus()
Main/System/KnapSack/BackpackData.cs
@@ -11,7 +11,7 @@
    public int id;
    public long countEx;   
    public int quality;
    public int useType;    //用途定义:0 无 1 预留 2 红颜增加
    public int useType;    //用途定义:0 无 1 预留 2 红颜增加 10 古宝增加
    public Item(int _id, long _count)
    {
Main/System/KnapSack/Logic/CommonGetItem.cs
@@ -25,6 +25,8 @@
            ItemTipUtility.Show(itemID);
        });
        beautyExImg.SetActive(item.useType == 2);
        beautyExImg.SetActive(item.useType != 0);
        beautyExImg.SetSprite($"AwardMark{item.useType}");
        beautyExImg.SetNativeSize();
    }
}