From 1c9b3fb4b45d2096a4c7bf5ef4bb7a7ffac3b7fe Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 08 一月 2026 01:47:14 +0800
Subject: [PATCH] 266 【内政】古宝系统

---
 Main/System/AssetVersion/InGameDownLoad.cs                                              |    5 
 Main/System/Gubao/GubaoManager.cs                                                       |  558 ++++++++++
 Main/System/Gubao/GubaoTipWin.cs                                                        |  107 ++
 Main/System/Gubao/GubaoListNameCell.cs                                                  |   21 
 Main/System/Redpoint/MainRedDot.cs                                                      |    3 
 Main/Config/Configs/GubaoLVConfig.cs                                                    |   47 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB217_tagCMGubaoStarUp.cs.meta      |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3C7_tagMCGubaoInfo.cs      |   12 
 Main/System/Gubao/GubaoListWin.cs                                                       |  118 ++
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB218_tagCMGubaoLVUp.cs             |   18 
 Main/System/Gubao.meta                                                                  |    8 
 Main/System/Gubao/GubaoListCell.cs                                                      |   34 
 Main/Config/PartialConfigs/GubaoConfig.cs                                               |   16 
 Main/Config/PartialConfigs/GubaoLVConfig.cs.meta                                        |   11 
 Main/Config/PartialConfigs/PlayerPropertyConfig.cs                                      |    8 
 Main/Config/Configs/GubaoResonanceAttrConfig.cs.meta                                    |   11 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3C7_tagMCGubaoInfo.cs                |   33 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3C7_tagMCGubaoInfo.cs.meta |   11 
 Main/System/Gubao/GubaoBaseWin.cs.meta                                                  |   11 
 Main/Config/Configs/GubaoStarConfig.cs                                                  |   65 +
 Main/Utility/EnumHelper.cs                                                              |    1 
 Main/Config/PartialConfigs/GubaoLVAttrConfig.cs                                         |   49 
 Main/Config/Configs/GubaoLVAttrConfig.cs                                                |   74 +
 Main/System/Gubao/GubaoListCell.cs.meta                                                 |   11 
 Main/System/KnapSack/VirtualPackManager.cs                                              |  405 +++---
 Main/Config/PartialConfigs/GubaoStarConfig.cs.meta                                      |   11 
 Main/System/Gubao/GubaoListWin.cs.meta                                                  |   11 
 Main/Config/Configs/GubaoStarConfig.cs.meta                                             |   11 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB216_tagCMGubaoActivate.cs.meta    |   11 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB218_tagCMGubaoLVUp.cs.meta        |   11 
 Main/Config/PartialConfigs/GubaoConfig.cs.meta                                          |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs    |    2 
 Main/Config/ConfigManager.cs                                                            |   21 
 Main/Config/Configs/GubaoConfig.cs.meta                                                 |   11 
 Main/System/Gubao/GubaoDetailWin.cs                                                     |  576 +++++++++++
 Main/System/InternalAffairs/AffairFuncCell.cs                                           |    4 
 Main/Config/PartialConfigs/GubaoStarConfig.cs                                           |   52 +
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3C7_tagMCGubaoInfo.cs.meta           |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs      |    2 
 Main/Config/Configs/GubaoResonanceAttrConfig.cs                                         |   74 +
 Main/System/Gubao/GubaoActiveWin.cs                                                     |  107 ++
 Main/Config/Configs/GubaoResonanceConfig.cs.meta                                        |   11 
 Main/Main.cs                                                                            |    1 
 Main/Config/Configs/GubaoLVAttrConfig.cs.meta                                           |   11 
 Main/System/Gubao/GubaoDetailWin.cs.meta                                                |   11 
 Main/System/Gubao/GubaoActiveWin.cs.meta                                                |   11 
 Main/System/Gubao/GubaoBaseWin.cs                                                       |   25 
 Main/System/Gubao/GubaoTipWin.cs.meta                                                   |   11 
 Main/System/Gubao/GubaoCell.cs                                                          |   95 +
 Main/System/ItemTip/ItemTipUtility.cs                                                   |    5 
 Main/Config/Configs/GubaoResonanceConfig.cs                                             |   56 +
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB216_tagCMGubaoActivate.cs         |   18 
 Main/Utility/UIHelper.cs                                                                |   27 
 Main/Config/Configs/GubaoLVConfig.cs.meta                                               |   11 
 Main/System/Gubao/GubaoManager.cs.meta                                                  |   11 
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                    |    5 
 Main/System/Gubao/GubaoCell.cs.meta                                                     |   11 
 Main/System/Gubao/GubaoListNameCell.cs.meta                                             |   11 
 Main/Config/PartialConfigs/GubaoLVAttrConfig.cs.meta                                    |   11 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB217_tagCMGubaoStarUp.cs           |   18 
 Main/Config/Configs/GubaoConfig.cs                                                      |  128 ++
 Main/Config/PartialConfigs/GubaoLVConfig.cs                                             |   42 
 62 files changed, 2,885 insertions(+), 219 deletions(-)

diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index 9d21cdd..bb11e62 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -57,6 +57,12 @@
             typeof(GoldRushCampConfig),
             typeof(GoldRushItemConfig),
             typeof(GoldRushWorkerConfig),
+            typeof(GubaoConfig),
+            typeof(GubaoLVAttrConfig),
+            typeof(GubaoLVConfig),
+            typeof(GubaoResonanceAttrConfig),
+            typeof(GubaoResonanceConfig),
+            typeof(GubaoStarConfig),
             typeof(HeroFatesConfig),
             typeof(HeroFatesQualityLVConfig),
             typeof(HeroLineupHaloConfig),
@@ -73,6 +79,7 @@
             typeof(NPCConfig),
             typeof(NPCExConfig),
             typeof(NPCLineupConfig),
+            typeof(OPConfigConfig),
             typeof(OrderInfoConfig),
             typeof(PlayerAttrConfig),
             typeof(PlayerFaceConfig),
@@ -279,6 +286,18 @@
         ClearConfigDictionary<GoldRushItemConfig>();
         // 娓呯┖ GoldRushWorkerConfig 瀛楀吀
         ClearConfigDictionary<GoldRushWorkerConfig>();
+        // 娓呯┖ GubaoConfig 瀛楀吀
+        ClearConfigDictionary<GubaoConfig>();
+        // 娓呯┖ GubaoLVAttrConfig 瀛楀吀
+        ClearConfigDictionary<GubaoLVAttrConfig>();
+        // 娓呯┖ GubaoLVConfig 瀛楀吀
+        ClearConfigDictionary<GubaoLVConfig>();
+        // 娓呯┖ GubaoResonanceAttrConfig 瀛楀吀
+        ClearConfigDictionary<GubaoResonanceAttrConfig>();
+        // 娓呯┖ GubaoResonanceConfig 瀛楀吀
+        ClearConfigDictionary<GubaoResonanceConfig>();
+        // 娓呯┖ GubaoStarConfig 瀛楀吀
+        ClearConfigDictionary<GubaoStarConfig>();
         // 娓呯┖ HeroFatesConfig 瀛楀吀
         ClearConfigDictionary<HeroFatesConfig>();
         // 娓呯┖ HeroFatesQualityLVConfig 瀛楀吀
@@ -311,6 +330,8 @@
         ClearConfigDictionary<NPCExConfig>();
         // 娓呯┖ NPCLineupConfig 瀛楀吀
         ClearConfigDictionary<NPCLineupConfig>();
+        // 娓呯┖ OPConfigConfig 瀛楀吀
+        ClearConfigDictionary<OPConfigConfig>();
         // 娓呯┖ OrderInfoConfig 瀛楀吀
         ClearConfigDictionary<OrderInfoConfig>();
         // 娓呯┖ PlayerAttrConfig 瀛楀吀
diff --git a/Main/Config/Configs/GubaoConfig.cs b/Main/Config/Configs/GubaoConfig.cs
new file mode 100644
index 0000000..aab91b8
--- /dev/null
+++ b/Main/Config/Configs/GubaoConfig.cs
@@ -0,0 +1,128 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           Wednesday, January 7, 2026
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class GubaoConfig : ConfigBase<int, GubaoConfig>
+{
+    static GubaoConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int GubaoID;
+	public string Name;
+	public int GubaoQuality;
+	public int UnlockItemID;
+	public int UnlockItemCnt;
+	public int[] BaseAttrIDList;
+	public int[] BaseAttrValueList;
+	public int[] BaseAttrPerStarAddList;
+	public int SpecEffType;
+	public int SpecEffLayerMax;
+	public int SpecAttrID;
+	public int SpecAttrValue;
+	public int SpecAttrPerStarAdd;
+	public int PowerType;
+	public int PowerTypeValue;
+	public int PowerValue;
+	public int PowerPerStarAdd;
+	public string Icon;
+	public string Desc;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out GubaoID); 
+
+			Name = tables[1];
+
+			int.TryParse(tables[2],out GubaoQuality); 
+
+			int.TryParse(tables[3],out UnlockItemID); 
+
+			int.TryParse(tables[4],out UnlockItemCnt); 
+
+			if (tables[5].Contains("["))
+			{
+				BaseAttrIDList = JsonMapper.ToObject<int[]>(tables[5]);
+			}
+			else
+			{
+				string[] BaseAttrIDListStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				BaseAttrIDList = new int[BaseAttrIDListStringArray.Length];
+				for (int i=0;i<BaseAttrIDListStringArray.Length;i++)
+				{
+					 int.TryParse(BaseAttrIDListStringArray[i],out BaseAttrIDList[i]);
+				}
+			}
+
+			if (tables[6].Contains("["))
+			{
+				BaseAttrValueList = JsonMapper.ToObject<int[]>(tables[6]);
+			}
+			else
+			{
+				string[] BaseAttrValueListStringArray = tables[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				BaseAttrValueList = new int[BaseAttrValueListStringArray.Length];
+				for (int i=0;i<BaseAttrValueListStringArray.Length;i++)
+				{
+					 int.TryParse(BaseAttrValueListStringArray[i],out BaseAttrValueList[i]);
+				}
+			}
+
+			if (tables[7].Contains("["))
+			{
+				BaseAttrPerStarAddList = JsonMapper.ToObject<int[]>(tables[7]);
+			}
+			else
+			{
+				string[] BaseAttrPerStarAddListStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				BaseAttrPerStarAddList = new int[BaseAttrPerStarAddListStringArray.Length];
+				for (int i=0;i<BaseAttrPerStarAddListStringArray.Length;i++)
+				{
+					 int.TryParse(BaseAttrPerStarAddListStringArray[i],out BaseAttrPerStarAddList[i]);
+				}
+			}
+
+			int.TryParse(tables[8],out SpecEffType); 
+
+			int.TryParse(tables[9],out SpecEffLayerMax); 
+
+			int.TryParse(tables[10],out SpecAttrID); 
+
+			int.TryParse(tables[11],out SpecAttrValue); 
+
+			int.TryParse(tables[12],out SpecAttrPerStarAdd); 
+
+			int.TryParse(tables[13],out PowerType); 
+
+			int.TryParse(tables[14],out PowerTypeValue); 
+
+			int.TryParse(tables[15],out PowerValue); 
+
+			int.TryParse(tables[16],out PowerPerStarAdd); 
+
+			Icon = tables[17];
+
+			Desc = tables[18];
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/GubaoConfig.cs.meta b/Main/Config/Configs/GubaoConfig.cs.meta
new file mode 100644
index 0000000..c20dd87
--- /dev/null
+++ b/Main/Config/Configs/GubaoConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 97ccaceffe1621547a704b5e8dcb5290
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/GubaoLVAttrConfig.cs b/Main/Config/Configs/GubaoLVAttrConfig.cs
new file mode 100644
index 0000000..46d8e45
--- /dev/null
+++ b/Main/Config/Configs/GubaoLVAttrConfig.cs
@@ -0,0 +1,74 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�1鏈�6鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class GubaoLVAttrConfig : ConfigBase<int, GubaoLVAttrConfig>
+{
+    static GubaoLVAttrConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int Id;
+	public int GubaoQuality;
+	public int GubaoLV;
+	public int[] SpecAttrIDList;
+	public int[] SpecAttrValueList;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out Id); 
+
+			int.TryParse(tables[1],out GubaoQuality); 
+
+			int.TryParse(tables[2],out GubaoLV); 
+
+			if (tables[3].Contains("["))
+			{
+				SpecAttrIDList = JsonMapper.ToObject<int[]>(tables[3]);
+			}
+			else
+			{
+				string[] SpecAttrIDListStringArray = tables[3].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				SpecAttrIDList = new int[SpecAttrIDListStringArray.Length];
+				for (int i=0;i<SpecAttrIDListStringArray.Length;i++)
+				{
+					 int.TryParse(SpecAttrIDListStringArray[i],out SpecAttrIDList[i]);
+				}
+			}
+
+			if (tables[4].Contains("["))
+			{
+				SpecAttrValueList = JsonMapper.ToObject<int[]>(tables[4]);
+			}
+			else
+			{
+				string[] SpecAttrValueListStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				SpecAttrValueList = new int[SpecAttrValueListStringArray.Length];
+				for (int i=0;i<SpecAttrValueListStringArray.Length;i++)
+				{
+					 int.TryParse(SpecAttrValueListStringArray[i],out SpecAttrValueList[i]);
+				}
+			}
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/GubaoLVAttrConfig.cs.meta b/Main/Config/Configs/GubaoLVAttrConfig.cs.meta
new file mode 100644
index 0000000..ad40f29
--- /dev/null
+++ b/Main/Config/Configs/GubaoLVAttrConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 786cd395d0aa20140aa3c0bc17fc9ca0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/GubaoLVConfig.cs b/Main/Config/Configs/GubaoLVConfig.cs
new file mode 100644
index 0000000..30d4d10
--- /dev/null
+++ b/Main/Config/Configs/GubaoLVConfig.cs
@@ -0,0 +1,47 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�1鏈�5鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class GubaoLVConfig : ConfigBase<int, GubaoLVConfig>
+{
+    static GubaoLVConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int ID;
+	public int GubaoQuality;
+	public int LessEqualLV;
+	public int[][] LVUPNeedItemInfo;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out ID); 
+
+			int.TryParse(tables[1],out GubaoQuality); 
+
+			int.TryParse(tables[2],out LessEqualLV); 
+
+			LVUPNeedItemInfo = JsonMapper.ToObject<int[][]>(tables[3].Replace("(", "[").Replace(")", "]")); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/GubaoLVConfig.cs.meta b/Main/Config/Configs/GubaoLVConfig.cs.meta
new file mode 100644
index 0000000..3715ba5
--- /dev/null
+++ b/Main/Config/Configs/GubaoLVConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 48b737ca9a836af42b142bfc63d53909
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/GubaoResonanceAttrConfig.cs b/Main/Config/Configs/GubaoResonanceAttrConfig.cs
new file mode 100644
index 0000000..b87f570
--- /dev/null
+++ b/Main/Config/Configs/GubaoResonanceAttrConfig.cs
@@ -0,0 +1,74 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�1鏈�5鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class GubaoResonanceAttrConfig : ConfigBase<int, GubaoResonanceAttrConfig>
+{
+    static GubaoResonanceAttrConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int ID;
+	public int ResonanceID;
+	public int ResonanceStar;
+	public int[] ResonanceAttrIDList;
+	public int[] ResonanceAttrValueList;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out ID); 
+
+			int.TryParse(tables[1],out ResonanceID); 
+
+			int.TryParse(tables[2],out ResonanceStar); 
+
+			if (tables[3].Contains("["))
+			{
+				ResonanceAttrIDList = JsonMapper.ToObject<int[]>(tables[3]);
+			}
+			else
+			{
+				string[] ResonanceAttrIDListStringArray = tables[3].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				ResonanceAttrIDList = new int[ResonanceAttrIDListStringArray.Length];
+				for (int i=0;i<ResonanceAttrIDListStringArray.Length;i++)
+				{
+					 int.TryParse(ResonanceAttrIDListStringArray[i],out ResonanceAttrIDList[i]);
+				}
+			}
+
+			if (tables[4].Contains("["))
+			{
+				ResonanceAttrValueList = JsonMapper.ToObject<int[]>(tables[4]);
+			}
+			else
+			{
+				string[] ResonanceAttrValueListStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				ResonanceAttrValueList = new int[ResonanceAttrValueListStringArray.Length];
+				for (int i=0;i<ResonanceAttrValueListStringArray.Length;i++)
+				{
+					 int.TryParse(ResonanceAttrValueListStringArray[i],out ResonanceAttrValueList[i]);
+				}
+			}
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/GubaoResonanceAttrConfig.cs.meta b/Main/Config/Configs/GubaoResonanceAttrConfig.cs.meta
new file mode 100644
index 0000000..d3b5ef8
--- /dev/null
+++ b/Main/Config/Configs/GubaoResonanceAttrConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5f751bf28288b7d4c898c3b44ca6350d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/GubaoResonanceConfig.cs b/Main/Config/Configs/GubaoResonanceConfig.cs
new file mode 100644
index 0000000..16d03c2
--- /dev/null
+++ b/Main/Config/Configs/GubaoResonanceConfig.cs
@@ -0,0 +1,56 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�1鏈�5鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class GubaoResonanceConfig : ConfigBase<int, GubaoResonanceConfig>
+{
+    static GubaoResonanceConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int ResonanceID;
+	public string ResonanceName;
+	public int[] GubaoIDList;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out ResonanceID); 
+
+			ResonanceName = tables[1];
+
+			if (tables[2].Contains("["))
+			{
+				GubaoIDList = JsonMapper.ToObject<int[]>(tables[2]);
+			}
+			else
+			{
+				string[] GubaoIDListStringArray = tables[2].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				GubaoIDList = new int[GubaoIDListStringArray.Length];
+				for (int i=0;i<GubaoIDListStringArray.Length;i++)
+				{
+					 int.TryParse(GubaoIDListStringArray[i],out GubaoIDList[i]);
+				}
+			}
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/GubaoResonanceConfig.cs.meta b/Main/Config/Configs/GubaoResonanceConfig.cs.meta
new file mode 100644
index 0000000..164181a
--- /dev/null
+++ b/Main/Config/Configs/GubaoResonanceConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: caf00848b1605d341accaef4e81e39f4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/Configs/GubaoStarConfig.cs b/Main/Config/Configs/GubaoStarConfig.cs
new file mode 100644
index 0000000..a9edffa
--- /dev/null
+++ b/Main/Config/Configs/GubaoStarConfig.cs
@@ -0,0 +1,65 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2026骞�1鏈�6鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class GubaoStarConfig : ConfigBase<int, GubaoStarConfig>
+{
+    static GubaoStarConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int ID;
+	public int GubaoQuality;
+	public int GubaoStar;
+	public int[] Condition;
+	public int StarUPNeedSelfCnt;
+	public int[][] StarUPNeedItemList;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out ID); 
+
+			int.TryParse(tables[1],out GubaoQuality); 
+
+			int.TryParse(tables[2],out GubaoStar); 
+
+			if (tables[3].Contains("["))
+			{
+				Condition = JsonMapper.ToObject<int[]>(tables[3]);
+			}
+			else
+			{
+				string[] ConditionStringArray = tables[3].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				Condition = new int[ConditionStringArray.Length];
+				for (int i=0;i<ConditionStringArray.Length;i++)
+				{
+					 int.TryParse(ConditionStringArray[i],out Condition[i]);
+				}
+			}
+
+			int.TryParse(tables[4],out StarUPNeedSelfCnt); 
+
+			StarUPNeedItemList = JsonMapper.ToObject<int[][]>(tables[5].Replace("(", "[").Replace(")", "]")); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/Configs/GubaoStarConfig.cs.meta b/Main/Config/Configs/GubaoStarConfig.cs.meta
new file mode 100644
index 0000000..a230fca
--- /dev/null
+++ b/Main/Config/Configs/GubaoStarConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 1caa48b80ad4f8849910f600c8de060d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/GubaoConfig.cs b/Main/Config/PartialConfigs/GubaoConfig.cs
new file mode 100644
index 0000000..e6a98d3
--- /dev/null
+++ b/Main/Config/PartialConfigs/GubaoConfig.cs
@@ -0,0 +1,16 @@
+using System.Collections.Generic;
+public partial class GubaoConfig : ConfigBase<int, GubaoConfig>
+{
+
+    public static Dictionary<int, List<int>> gubaoQualityDict = new Dictionary<int, List<int>>();
+    protected override void OnConfigParseCompleted()
+    {
+        if (!gubaoQualityDict.ContainsKey(GubaoQuality))
+        {
+            gubaoQualityDict[GubaoQuality] = new List<int>();
+        }
+        gubaoQualityDict[GubaoQuality].Add(GubaoID);
+    }
+
+
+}
diff --git a/Main/Config/PartialConfigs/GubaoConfig.cs.meta b/Main/Config/PartialConfigs/GubaoConfig.cs.meta
new file mode 100644
index 0000000..fc967bb
--- /dev/null
+++ b/Main/Config/PartialConfigs/GubaoConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e988c089f33c6ce4f861d00cb9c20b0e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/GubaoLVAttrConfig.cs b/Main/Config/PartialConfigs/GubaoLVAttrConfig.cs
new file mode 100644
index 0000000..af1950b
--- /dev/null
+++ b/Main/Config/PartialConfigs/GubaoLVAttrConfig.cs
@@ -0,0 +1,49 @@
+using System.Collections.Generic;
+public partial class GubaoLVAttrConfig : ConfigBase<int, GubaoLVAttrConfig>
+{
+    static Dictionary<int, Dictionary<int, GubaoLVAttrConfig>> gubaoSpecLVAttrDict = new Dictionary<int, Dictionary<int, GubaoLVAttrConfig>>();
+    static Dictionary<int, int> maxLVDict = new Dictionary<int, int>();
+    protected override void OnConfigParseCompleted()
+    {
+        if (!gubaoSpecLVAttrDict.ContainsKey(GubaoQuality))
+        {
+            gubaoSpecLVAttrDict[GubaoQuality] = new Dictionary<int, GubaoLVAttrConfig>();
+        }
+        gubaoSpecLVAttrDict[GubaoQuality][GubaoLV] = this;
+
+        if (!maxLVDict.ContainsKey(GubaoQuality))
+        {
+            maxLVDict[GubaoQuality] = GubaoLV;
+        }
+        else if (maxLVDict[GubaoQuality] < GubaoLV)
+        {
+            maxLVDict[GubaoQuality] = GubaoLV;
+        }
+    }
+
+    // 鍙ゅ疂鐨勬寚瀹氬睘鎬D瀵瑰簲鐨勬垚闀垮��
+    public static long GetSpecLVAttrValue(int gubaoQuality, int gubaoLV, int specAttrID)
+    {
+        if (gubaoSpecLVAttrDict.ContainsKey(gubaoQuality) && gubaoSpecLVAttrDict[gubaoQuality].ContainsKey(gubaoLV))
+        {
+            for (int i = 0; i < gubaoSpecLVAttrDict[gubaoQuality][gubaoLV].SpecAttrIDList.Length; i++)
+            {
+                if (gubaoSpecLVAttrDict[gubaoQuality][gubaoLV].SpecAttrIDList[i] == specAttrID)
+                {
+                    return gubaoSpecLVAttrDict[gubaoQuality][gubaoLV].SpecAttrValueList[i];
+                }
+            }
+        }
+        return 0;
+    }
+
+    public static int GetMaxLV(int gubaoQuality)
+    {
+        if (maxLVDict.ContainsKey(gubaoQuality))
+        {
+            return maxLVDict[gubaoQuality];
+        }
+        return 0;
+    }
+
+}
diff --git a/Main/Config/PartialConfigs/GubaoLVAttrConfig.cs.meta b/Main/Config/PartialConfigs/GubaoLVAttrConfig.cs.meta
new file mode 100644
index 0000000..e321b17
--- /dev/null
+++ b/Main/Config/PartialConfigs/GubaoLVAttrConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 41d470e2f985a294595eac5522e6e8b9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/GubaoLVConfig.cs b/Main/Config/PartialConfigs/GubaoLVConfig.cs
new file mode 100644
index 0000000..4282f9f
--- /dev/null
+++ b/Main/Config/PartialConfigs/GubaoLVConfig.cs
@@ -0,0 +1,42 @@
+using System.Collections.Generic;
+using System.Linq;
+public partial class GubaoLVConfig : ConfigBase<int, GubaoLVConfig>
+{
+    public static List<int> useItemIDS = new List<int>();   // 浣跨敤鐨勭墿鍝両D鍒楄〃 鍒锋柊閫氱煡鐢�
+    static Dictionary<int, Dictionary<int, GubaoLVConfig>> lvConfigDict = new Dictionary<int, Dictionary<int, GubaoLVConfig>>();
+
+    protected override void OnConfigParseCompleted()
+    {
+        if (!lvConfigDict.ContainsKey(GubaoQuality))
+        {
+            lvConfigDict[GubaoQuality] = new Dictionary<int, GubaoLVConfig>();
+        }
+        lvConfigDict[GubaoQuality][LessEqualLV] = this;
+        for (int i = 0; i < LVUPNeedItemInfo.Length; i++)
+        {
+            if (!useItemIDS.Contains(LVUPNeedItemInfo[i][0]))
+            {
+                useItemIDS.Add(LVUPNeedItemInfo[i][0]);
+            }
+        }
+    }
+
+
+    public static GubaoLVConfig GetConfig(int quality, int lv)
+    {
+        //LessEqualLV 鐨勮褰曟槸 鍗囩骇鐩爣灏忎簬绛変簬杩欎釜绛夌骇鐨勯厤缃紝闇�鍒ゆ柇lv; 鍗冲彇涓嬩竴绾х殑閰嶇疆
+        if (lvConfigDict.ContainsKey(quality))
+        {
+            var items = lvConfigDict[quality].Values.ToList();
+            items.Sort((a, b) => a.LessEqualLV.CompareTo(b.LessEqualLV));
+            foreach (var item in items)
+            {
+                if (lv < item.LessEqualLV)
+                {
+                    return item;
+                }
+            }
+        }
+        return null;
+    }
+}
diff --git a/Main/Config/PartialConfigs/GubaoLVConfig.cs.meta b/Main/Config/PartialConfigs/GubaoLVConfig.cs.meta
new file mode 100644
index 0000000..019fac6
--- /dev/null
+++ b/Main/Config/PartialConfigs/GubaoLVConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 73a99158432537d4992da24b2639ff4d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/GubaoStarConfig.cs b/Main/Config/PartialConfigs/GubaoStarConfig.cs
new file mode 100644
index 0000000..e73c1c0
--- /dev/null
+++ b/Main/Config/PartialConfigs/GubaoStarConfig.cs
@@ -0,0 +1,52 @@
+using System.Collections.Generic;
+public partial class GubaoStarConfig : ConfigBase<int, GubaoStarConfig>
+{
+    public static List<int> useItemIDS = new List<int>();   // 浣跨敤鐨勭墿鍝両D鍒楄〃 鍒锋柊閫氱煡鐢�
+    static Dictionary<int, Dictionary<int, GubaoStarConfig>> starConfigDict = new Dictionary<int, Dictionary<int, GubaoStarConfig>>();
+    static Dictionary<int, int> maxStarDict = new Dictionary<int, int>();
+    protected override void OnConfigParseCompleted()
+    {
+        if (!starConfigDict.ContainsKey(GubaoQuality))
+        {
+            starConfigDict[GubaoQuality] = new Dictionary<int, GubaoStarConfig>();
+        }
+        starConfigDict[GubaoQuality][GubaoStar] = this;
+        for (int i = 0; i < StarUPNeedItemList.Length; i++)
+        {
+            if (!useItemIDS.Contains(StarUPNeedItemList[i][0]))
+            {
+                useItemIDS.Add(StarUPNeedItemList[i][0]);
+            }
+        }
+
+        if (!maxStarDict.ContainsKey(GubaoQuality))
+        {
+            maxStarDict[GubaoQuality] = GubaoStar;
+        }
+        else if (maxStarDict[GubaoQuality] < GubaoStar)
+        {
+            maxStarDict[GubaoQuality] = GubaoStar;
+        }
+    }
+
+    public static GubaoStarConfig GetConfig(int quality, int star)
+    {
+        if (starConfigDict.ContainsKey(quality))
+        {
+            if (starConfigDict[quality].ContainsKey(star))
+            {
+                return starConfigDict[quality][star];
+            }
+        }
+        return null;
+    }
+
+    public static int GetMaxStar(int gubaoQuality)
+    {
+        if (maxStarDict.ContainsKey(gubaoQuality))
+        {
+            return maxStarDict[gubaoQuality];
+        }
+        return 0;
+    }
+}
diff --git a/Main/Config/PartialConfigs/GubaoStarConfig.cs.meta b/Main/Config/PartialConfigs/GubaoStarConfig.cs.meta
new file mode 100644
index 0000000..7588384
--- /dev/null
+++ b/Main/Config/PartialConfigs/GubaoStarConfig.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: aaf2c3c60e90e4444b40021b9ea063ed
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Config/PartialConfigs/PlayerPropertyConfig.cs b/Main/Config/PartialConfigs/PlayerPropertyConfig.cs
index add627a..c2bca13 100644
--- a/Main/Config/PartialConfigs/PlayerPropertyConfig.cs
+++ b/Main/Config/PartialConfigs/PlayerPropertyConfig.cs
@@ -140,7 +140,13 @@
         return GetValueDescriptionEx(id, value, largeNumFormat);
     }
 
-    public static string GetValueDescriptionEx(int id, long value, int largeNumFormat = 2)
+    //甯︽牸寮�
+    public static string GetValueDescriptionFormat(int id, long value, int largeNumFormat = 2, string format="+{0}")
+    {
+        return string.Format(format, GetValueDescriptionEx(id, value, largeNumFormat));
+    }
+
+    static string GetValueDescriptionEx(int id, long value, int largeNumFormat = 2)
     {
         var config = Get(id);
         if (config == null)
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB216_tagCMGubaoActivate.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB216_tagCMGubaoActivate.cs
new file mode 100644
index 0000000..542f49c
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB216_tagCMGubaoActivate.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 16 鍙ゅ疂婵�娲� #tagCMGubaoActivate
+
+public class CB216_tagCMGubaoActivate : GameNetPackBasic {
+    public ushort GubaoID;
+
+    public CB216_tagCMGubaoActivate () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xB216;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (GubaoID, NetDataType.WORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB216_tagCMGubaoActivate.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB216_tagCMGubaoActivate.cs.meta
new file mode 100644
index 0000000..f9d6e44
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB216_tagCMGubaoActivate.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4b6850273686799418d5085ab470fb2a
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB217_tagCMGubaoStarUp.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB217_tagCMGubaoStarUp.cs
new file mode 100644
index 0000000..c6d5a9c
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB217_tagCMGubaoStarUp.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 17 鍙ゅ疂鍗囨槦 #tagCMGubaoStarUp
+
+public class CB217_tagCMGubaoStarUp : GameNetPackBasic {
+    public ushort GubaoID;
+
+    public CB217_tagCMGubaoStarUp () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xB217;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (GubaoID, NetDataType.WORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB217_tagCMGubaoStarUp.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB217_tagCMGubaoStarUp.cs.meta
new file mode 100644
index 0000000..01ed9b8
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB217_tagCMGubaoStarUp.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a71f795baf8d4914699f52bb22a0f91c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB218_tagCMGubaoLVUp.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB218_tagCMGubaoLVUp.cs
new file mode 100644
index 0000000..d892cc5
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB218_tagCMGubaoLVUp.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 18 鍙ゅ疂鍗囩骇 #tagCMGubaoLVUp
+
+public class CB218_tagCMGubaoLVUp : GameNetPackBasic {
+    public ushort GubaoID;
+
+    public CB218_tagCMGubaoLVUp () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xB218;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (GubaoID, NetDataType.WORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB218_tagCMGubaoLVUp.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB218_tagCMGubaoLVUp.cs.meta
new file mode 100644
index 0000000..e66caa1
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB218_tagCMGubaoLVUp.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e6b331cfe08316a41a340ad69f56e262
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs
index fbbcb0c..0e4c023 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA204_tagMCVPackRefresh.cs
@@ -8,6 +8,6 @@
     {
         base.Done(vNetPack);
         HA204_tagMCVPackRefresh vNetData = vNetPack as HA204_tagMCVPackRefresh;
-        VirtualPackManager.Instance.OnReceiveServerPack(vNetData);
+        // VirtualPackManager.Instance.OnReceiveServerPack(vNetData);
     }
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs
index f768e3b..6ce4cb8 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA2_Package/DTCA205_tagMCVPackClear.cs
@@ -7,6 +7,6 @@
     public override void Done(GameNetPackBasic vNetPack) {
         base.Done(vNetPack);
         HA205_tagMCVPackClear vNetData = vNetPack as HA205_tagMCVPackClear;
-        VirtualPackManager.Instance.OnReceiveServerPack(vNetData);
+        // VirtualPackManager.Instance.OnReceiveServerPack(vNetData);
     }
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3C7_tagMCGubaoInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3C7_tagMCGubaoInfo.cs
new file mode 100644
index 0000000..a30c865
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3C7_tagMCGubaoInfo.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 C7 鍙ゅ疂淇℃伅 #tagMCGubaoInfo
+
+public class DTCA3C7_tagMCGubaoInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA3C7_tagMCGubaoInfo vNetData = vNetPack as HA3C7_tagMCGubaoInfo;
+        GubaoManager.Instance.UpdateGubaoNetPack(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3C7_tagMCGubaoInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3C7_tagMCGubaoInfo.cs.meta
new file mode 100644
index 0000000..5e767f6
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3C7_tagMCGubaoInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 25a8641c031f0aa42b7e7fd5746095bc
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index 74d0d34..45f3975 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -41,8 +41,8 @@
         Register(typeof(H0707_tagItemCountRefresh), typeof(DTC0707_tagItemCountRefresh));
         Register(typeof(H0709_tagClearItem), typeof(DTC0709_tagClearItem));
         Register(typeof(H0711_tagClearItemPack), typeof(DTC0711_tagClearItemPack));
-        Register(typeof(HA204_tagMCVPackRefresh), typeof(DTCA204_tagMCVPackRefresh));
-        Register(typeof(HA205_tagMCVPackClear), typeof(DTCA205_tagMCVPackClear));
+        // Register(typeof(HA204_tagMCVPackRefresh), typeof(DTCA204_tagMCVPackRefresh));
+        // Register(typeof(HA205_tagMCVPackClear), typeof(DTCA205_tagMCVPackClear));
         Register(typeof(HA206_tagMCAutoItemCountRefresh), typeof(DTCA206_tagMCAutoItemCountRefresh));
         Register(typeof(HA710_tagMCGuideState), typeof(DTCA710_tagMCGuideState));
         Register(typeof(H0418_tagObjInfoRefresh), typeof(DTC0418_tagObjInfoRefresh));
@@ -138,6 +138,7 @@
         Register(typeof(HB131_tagSCHeroFatesInfo), typeof(DTCB131_tagSCHeroFatesInfo));
         Register(typeof(HB130_tagSCBeautyInfo), typeof(DTCB130_tagSCBeautyInfo));
         Register(typeof(HB040_tagSCTravelInfo), typeof(DTCB040_tagSCTravelInfo));
+        Register(typeof(HA3C7_tagMCGubaoInfo), typeof(DTCA3C7_tagMCGubaoInfo));
     }
 
     //涓诲伐绋嬫敞鍐屽皝鍖�
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3C7_tagMCGubaoInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3C7_tagMCGubaoInfo.cs
new file mode 100644
index 0000000..4914aae
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3C7_tagMCGubaoInfo.cs
@@ -0,0 +1,33 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 C7 鍙ゅ疂淇℃伅 #tagMCGubaoInfo
+
+public class HA3C7_tagMCGubaoInfo : GameNetPackBasic {
+    public ushort Count;
+    public  tagMCGubao[] GubaoInfoList;
+
+    public HA3C7_tagMCGubaoInfo () {
+        _cmd = (ushort)0xA3C7;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Count, vBytes, NetDataType.WORD);
+        GubaoInfoList = new tagMCGubao[Count];
+        for (int i = 0; i < Count; i ++) {
+            GubaoInfoList[i] = new tagMCGubao();
+            TransBytes (out GubaoInfoList[i].GubaoID, vBytes, NetDataType.WORD);
+            TransBytes (out GubaoInfoList[i].GubaoStar, vBytes, NetDataType.BYTE);
+            TransBytes (out GubaoInfoList[i].GubaoLV, vBytes, NetDataType.BYTE);
+            TransBytes (out GubaoInfoList[i].EffLayer, vBytes, NetDataType.WORD);
+        }
+    }
+
+    public class tagMCGubao {
+        public ushort GubaoID;
+        public byte GubaoStar;
+        public byte GubaoLV;
+        public ushort EffLayer;        // 璇ョ壒娈婃晥鏋滅疮鍔犲眰鍊�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3C7_tagMCGubaoInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3C7_tagMCGubaoInfo.cs.meta
new file mode 100644
index 0000000..4016f3b
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA3C7_tagMCGubaoInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8ba431a20165a6145b8e0d86a889c682
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Main.cs b/Main/Main.cs
index c416293..b7bf254 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -97,6 +97,7 @@
         managers.Add(HeroFatesManager.Instance);
         managers.Add(BeautyMMManager.Instance);
         managers.Add(DailySpecialsManager.Instance);
+        managers.Add(GubaoManager.Instance);
         foreach (var manager in managers)
         {
             manager.Init();
diff --git a/Main/System/AssetVersion/InGameDownLoad.cs b/Main/System/AssetVersion/InGameDownLoad.cs
index 6e9d7b0..6635633 100644
--- a/Main/System/AssetVersion/InGameDownLoad.cs
+++ b/Main/System/AssetVersion/InGameDownLoad.cs
@@ -88,7 +88,6 @@
         set { LocalSave.SetString("InGameDownLoadCompleteAccount", value); }
     }
 
-    public Redpoint downLoadRedpoint = new Redpoint(MainRedDot.RedPoint_Download);
 
     private void Awake()
     {
@@ -320,7 +319,7 @@
         }
 
         
-        downLoadRedpoint.state = state == State.Award ? RedPointState.Simple : RedPointState.None;
+        MainRedDot.Instance.downLoadRedpoint.state = state == State.Award ? RedPointState.Simple : RedPointState.None;
 
         if (onDownLoadOk != null)
         {
@@ -346,7 +345,7 @@
             state = !hasReward && completeDownLoadAccount == PlayerDatas.Instance.baseData.AccID ? State.Award : State.Completed;
         }
 
-        downLoadRedpoint.state = state == State.Award ? RedPointState.Simple : RedPointState.None;
+        MainRedDot.Instance.downLoadRedpoint.state = state == State.Award ? RedPointState.Simple : RedPointState.None;
     }
 
     public void RequestDownLoadReward()
diff --git a/Main/System/Gubao.meta b/Main/System/Gubao.meta
new file mode 100644
index 0000000..4e4f11e
--- /dev/null
+++ b/Main/System/Gubao.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9054f2d1e012d21458dc12cc8a624e00
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoActiveWin.cs b/Main/System/Gubao/GubaoActiveWin.cs
new file mode 100644
index 0000000..da60dde
--- /dev/null
+++ b/Main/System/Gubao/GubaoActiveWin.cs
@@ -0,0 +1,107 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍙ゅ疂婵�娲绘垚鍔�
+/// 澶栭儴鏌ョ湅绫诲瀷 0瀹屾暣tip锛堝彲鍒囨弧绾э級 1 鍙湁鍩虹婊$骇涓嶅彲鍒囨崲 2 鍙湁濂楄
+/// 鍐呴儴鍙垏鎹㈠綋鍓�0 鍜� 瀹屾暣1
+/// </summary>
+public class GubaoActiveWin : UIBase
+{
+    [SerializeField] ImageEx gbImg;
+    [SerializeField] UIEffectPlayer gbBGEffect;
+    [SerializeField] UIEffectPlayer gbEffect;
+    [SerializeField] Text nameText;
+    //鍩虹灞炴��
+    [SerializeField] Text[] attrBaseTexts;
+    [SerializeField] Text attrSpecialText;
+    [SerializeField] Transform attrPrivilegeRect;
+    [SerializeField] Text attrPrivilegeText;
+
+    [SerializeField] Button okBtn;
+
+    int gubaoID = 0;
+
+    protected override void InitComponent()
+    {
+        okBtn.AddListener(CloseWindow);
+    }
+
+    protected override void OnPreOpen()
+    {
+        gubaoID = functionOrder;
+        Display();
+    }
+
+
+    public void Display()
+    {
+        var config = GubaoConfig.Get(gubaoID);
+        gbImg.SetOrgSprite(config.Icon, "gbicon");
+        gbImg.SetNativeSize();
+
+        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);
+    }
+
+    void ShowAttr(GubaoConfig config)
+    {
+        //鍩虹灞炴��
+        var attrDict = GubaoManager.Instance.GetBaseAttrByGBID(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]]);
+            }
+            else
+            {
+                attrBaseTexts[i].SetActive(false);
+            }
+        }
+
+        //鐗规畩灞炴�э細鍙湁涓�涓睘鎬э紝绗竴琛屽崟灞傚睘鎬э紝绗簩琛屼负鐗规晥鏁堟灉灞傜骇鍔犳垚姹囨��
+        //鍒嗕袱绉嶆儏鍐�
+        //鏃犱换浣曟晥鏋滅殑姝e父鍗囨槦鍗囩骇鏄剧ず绗竴琛岋紝绗簩琛岄殣钘�
+        //鏈夌壒娈婂眰绾х殑锛氬鏋滀负0锛屽垯绗竴琛屽彧鏄剧ず鍗曡鐨勫睘鎬у拰鎻愬崌锛岀浜岃鏄剧ず鏁板��0锛涘鏋滀笉涓�0锛屽垯绗竴琛屾樉绀哄崟琛屽睘鎬у拰鎻愬崌锛岀浜岃鏄剧ず鏁板��
+        //鏈夌壒鏉冩晥鏋滅殑浜﹀悓
+        var specAttrDict = GubaoManager.Instance.GetSpecialAttrByGBID(gubaoID, true);
+        if (config.SpecEffType == 0)
+        {
+            attrSpecialText.text = PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID]);
+        }
+        else
+        {
+            //鏈夌壒娈婃晥鏋滅殑
+            var singleLayerAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID);
+            attrSpecialText.text = Language.Get("Gubao22_" + config.SpecEffType) + PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, singleLayerAttrDict[config.SpecAttrID]);
+        }
+        if (config.PowerType != 0)
+        {
+            // 1	娓稿巻鍙屽�嶅鍔辨鐜�	鏃�	澧炲姞涓囧垎鐜�	涓囧垎鐜�
+            // 2	鏈堝崱棰嗗彇棰濆濂栧姳	鐗╁搧ID	鎻愬崌鐧惧垎姣�	鐧惧垎姣�
+
+            //鏈夌壒鏉冩晥鏋滅殑 闈炲睘鎬х被
+            attrPrivilegeRect.SetActive(true);
+            var valueDict = GubaoManager.Instance.GetPrivilegeValueByGBID(gubaoID, true);
+            if (config.PowerType == 1)
+            {
+                attrPrivilegeText.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]);
+            }
+        }
+        else
+        {
+            attrPrivilegeRect.SetActive(false);
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Gubao/GubaoActiveWin.cs.meta b/Main/System/Gubao/GubaoActiveWin.cs.meta
new file mode 100644
index 0000000..5a841e5
--- /dev/null
+++ b/Main/System/Gubao/GubaoActiveWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 88840ea3d5ffae142931dacc80cb1b34
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoBaseWin.cs b/Main/System/Gubao/GubaoBaseWin.cs
new file mode 100644
index 0000000..029dafb
--- /dev/null
+++ b/Main/System/Gubao/GubaoBaseWin.cs
@@ -0,0 +1,25 @@
+using UnityEngine;
+
+/// <summary>
+/// 鍙ゅ疂鍩虹鐣岄潰
+/// </summary>
+public class GubaoBaseWin : OneLevelWin
+{
+    protected override void OpenSubUIByTabIndex()
+    {
+        switch (functionOrder)
+        {
+            case 0:
+                currentSubUI = UIManager.Instance.OpenWindow<GubaoListWin>();
+                break;
+            case 1:
+                // 鍏呭�肩晫闈�
+                // currentSubUI = UIManager.Instance.OpenWindow<RechargeWin>();
+                break;
+            default:
+                Debug.LogWarning("鏈煡鐨勬爣绛剧储寮�: " + functionOrder);
+                break;
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Gubao/GubaoBaseWin.cs.meta b/Main/System/Gubao/GubaoBaseWin.cs.meta
new file mode 100644
index 0000000..7eb23f6
--- /dev/null
+++ b/Main/System/Gubao/GubaoBaseWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 336cf62e928024346bd1ef43ab2ad091
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoCell.cs b/Main/System/Gubao/GubaoCell.cs
new file mode 100644
index 0000000..eff34fd
--- /dev/null
+++ b/Main/System/Gubao/GubaoCell.cs
@@ -0,0 +1,95 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class GubaoCell : MonoBehaviour
+{
+    [SerializeField] Button gbBtn;
+    [SerializeField] ImageEx gbImg;
+    [SerializeField] Image gbBGImg;
+    [SerializeField] UIEffectPlayer gbBGEffect;
+    [SerializeField] UIEffectPlayer gbEffect;
+    [SerializeField] Image canActiveImg;
+    [SerializeField] Text nameText;
+    [SerializeField] Text lvText;
+    [SerializeField] Transform starRect;
+    [SerializeField] Image[] starImgs;
+    [SerializeField] Transform processRect;
+    [SerializeField] Image processImg;
+    [SerializeField] Text processText;
+    [SerializeField] Image fullProcessImg;
+    [SerializeField] Image redImg;
+
+
+    public void Display(int quality, int index)
+    {
+        var gubaoID = GubaoManager.Instance.gubaoCollectDict[quality][index];
+        gbBtn.AddListener(() =>
+        {
+            UIManager.Instance.OpenWindow<GubaoDetailWin>(gubaoID);
+        });
+
+        var config = GubaoConfig.Get(gubaoID);
+        gbImg.SetOrgSprite(config.Icon, "gbicon");
+        gbImg.SetNativeSize();
+        gbBGImg.SetSprite($"GubaoBG{quality}");
+        
+        var gbData = GubaoManager.Instance.TryGetGubaoInfo(gubaoID);
+        int lv = 0;
+        int star = 0;
+        if (gbData != null)
+        {
+            lv = gbData.GubaoLV;
+            star = gbData.GubaoStar;
+            gbImg.gray = false;
+            canActiveImg.SetActive(false);
+            starRect.SetActive(true);
+            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);
+                }
+            }
+            processRect.SetActive(false);
+        }
+        else
+        {
+            gbImg.gray = true;
+            canActiveImg.SetActive(GubaoManager.Instance.CanActiveGubao(gubaoID));
+            starRect.SetActive(false);
+            processRect.SetActive(true);
+            var cnt = VirtualPackManager.Instance.GetNoPackItemCount(config.UnlockItemID);
+            float value = cnt*1.0f / config.UnlockItemCnt;
+            processImg.fillAmount = value;
+            fullProcessImg.SetActive(value >= 1);
+            processText.text = $"{cnt}/{config.UnlockItemCnt}";
+        }
+        gbBGEffect.PlayByArrIndex(quality - 2);
+        if (GubaoManager.Instance.IsActive(gubaoID))
+        {
+            gbEffect.PlayByArrIndex(quality - 2);
+        }
+        else
+        {
+            gbEffect.Stop();
+        }
+        nameText.text = config.Name;
+        nameText.color = UIHelper.GetFuncQualityColor(quality);
+        lvText.text = lv == 0 ? "" : Language.Get("L1113", lv);
+        redImg.SetActive(GubaoManager.Instance.IsRedTip(gubaoID));
+    }
+
+
+}
diff --git a/Main/System/Gubao/GubaoCell.cs.meta b/Main/System/Gubao/GubaoCell.cs.meta
new file mode 100644
index 0000000..9c3a211
--- /dev/null
+++ b/Main/System/Gubao/GubaoCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: edea553bfc2595746989b1386fefe74b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoDetailWin.cs b/Main/System/Gubao/GubaoDetailWin.cs
new file mode 100644
index 0000000..92634f1
--- /dev/null
+++ b/Main/System/Gubao/GubaoDetailWin.cs
@@ -0,0 +1,576 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+/// <summary>
+/// 鍙ゅ疂璇︽儏鐣岄潰 - 鍒� 鍚堟垚 鍜� 鍗囨槦/鍗囩骇涓ら儴鍒�
+/// </summary>
+public class GubaoDetailWin : UIBase
+{
+    [SerializeField] ImageEx gbImg;
+    [SerializeField] Image gbBGImg;
+    [SerializeField] UIEffectPlayer gbBGEffect;
+    [SerializeField] UIEffectPlayer gbEffect;
+    [SerializeField] UIEffectPlayer lvupEffect;
+    [SerializeField] UIEffectPlayer starupEffect;
+    [SerializeField] Text nameText;
+    [SerializeField] Text lvText;
+    [SerializeField] Image[] starImgs;
+    [SerializeField] Button seeSuiteBtn;
+    [SerializeField] Button seeFullBtn;
+    [SerializeField] Text descText;
+    [SerializeField] Text wayText;
+
+    //鍩虹灞炴��
+    [SerializeField] Transform[] attrBaseRects;
+    [SerializeField] Text[] attrBaseTexts;
+
+    //鐗规畩灞炴��  
+    [SerializeField] Transform[] attrSpecialRects;  //琚姩灞炴�у彧鏈変竴涓紝浣嗘湁鐗规畩鍔犳垚璇存槑鎺掔増
+    [SerializeField] Text[] attrSpecialTexts;
+
+    //鐗规潈 鍙湁鍗囨槦鏈�
+    [SerializeField] Transform attrPrivilegeRect;
+    [SerializeField] Text attrPrivilegeText;
+    [SerializeField] Transform addPrivilegeRect;
+    [SerializeField] Text addPrivilegeText;
+
+    //鍗囨槦/鍗囩骇閮ㄥ垎
+    [SerializeField] Transform[] addAttrBaseRects;
+    [SerializeField] Text[] addAttrBaseTexts;
+    [SerializeField] Transform[] addAttrSpecialRects;
+    [SerializeField] Text[] addAttrSpecialTexts;
+    [SerializeField] Image lvStarBGImg;
+    [SerializeField] Transform opBtns;
+    [SerializeField] GroupButtonEx lvupTabBtn;
+    [SerializeField] GroupButtonEx starupTabBtn;
+    [SerializeField] Text starUpTabNameText;
+    [SerializeField] Image lvupRedImg;
+    [SerializeField] Image starupRedImg;
+    [SerializeField] Button lvupBtn;
+    [SerializeField] Image itemIconImg;
+    [SerializeField] Text itemCntText;
+    [SerializeField] Button starupBtn;
+    [SerializeField] Text starUpNameText;
+    [SerializeField] Transform fullRect;
+    [SerializeField] Text fullLVStarText;
+
+    //鍗囨槦闄愬埗 鍜屾敼鐢ㄩ亾鍏�
+    [SerializeField] Text starLimitText;
+
+    //鍗囨槦鍜屽悎鎴愭湁杩涘害鏉�
+    [SerializeField] Transform processRect;
+    [SerializeField] Image processImg;
+    [SerializeField] Text processText;
+    [SerializeField] Image fullProcessImg;
+
+    //鍚堟垚閮ㄥ垎
+    [SerializeField] Button composeBtn;
+    [SerializeField] Image composeBGImg;
+
+
+
+    int gubaoID = 0;
+    int tabIndex = 0; //0 鍚堟垚 1 鍗囩骇 2 鍗囨槦
+
+    protected override void InitComponent()
+    {
+        seeSuiteBtn.AddListener(() =>
+        {
+            GubaoManager.Instance.ShowTip(gubaoID, 3);
+        });
+
+        seeFullBtn.AddListener(() =>
+        {
+            GubaoManager.Instance.ShowTip(gubaoID, 2);
+        });
+        lvupTabBtn.AddListener(() =>
+        {
+            tabIndex = 1;
+            Display();
+        });
+        starupTabBtn.AddListener(() =>
+        {
+            tabIndex = 2;
+            Display();
+        });
+        lvupBtn.AddListener(LVUp);
+        starupBtn.AddListener(StarUp);
+        composeBtn.AddListener(Compose);
+    }
+    protected override void OnPreOpen()
+    {
+        GubaoManager.Instance.UpdateGubaoEvent += UpdateGubaoEvent;
+        gubaoID = functionOrder;
+        //鍗囨槦鍜屽崌绾у叆鍙e搴旓紝鍏ㄩ儴鍏ュ彛鏍规嵁鐘舵��
+        tabIndex = GubaoManager.Instance.selectTagIndex;
+        RefreshTabIndex();
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        GubaoManager.Instance.UpdateGubaoEvent -= UpdateGubaoEvent;
+    }
+
+    void UpdateGubaoEvent()
+    {
+        RefreshTabIndex();
+        Display();
+    }
+
+    public void Display()
+    {
+        var config = GubaoConfig.Get(gubaoID);
+        var quality = config.GubaoQuality;
+
+        gbImg.SetOrgSprite(config.Icon, "gbicon");
+        gbImg.SetNativeSize();
+        gbBGImg.SetSprite($"GubaoBG{quality}");
+
+        var gbData = GubaoManager.Instance.TryGetGubaoInfo(gubaoID);
+        int lv = 0;
+        int star = 0;
+        int layer = 0;
+        if (gbData != null)
+        {
+            lv = gbData.GubaoLV;
+            star = gbData.GubaoStar;
+            layer = gbData.EffLayer;
+            gbImg.gray = false;
+            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);
+                }
+            }
+            processRect.SetActive(false);
+        }
+        else
+        {
+            gbImg.gray = true;
+            for (int i = 0; i < starImgs.Length; i++)
+            {
+                starImgs[i].SetActive(false);
+            }
+        }
+        gbBGEffect.PlayByArrIndex(quality - 2);
+        gbEffect.PlayByArrIndex(quality - 2);
+        nameText.text = config.Name;
+        nameText.color = UIHelper.GetFuncQualityColor(quality);
+        lvText.text = lv == 0 ? "" : Language.Get("L1113", lv);
+
+        descText.text = config.Desc;
+        var itemConfig = ItemConfig.Get(config.UnlockItemID);
+        if (itemConfig.GetWay.IsNullOrEmpty())
+        {
+            wayText.text = "";
+        }
+        else
+        {
+            wayText.text = Language.Get("PhantasmPavilion06", GetItemWaysConfig.Get(itemConfig.GetWay[0]).Name);
+        }
+        ShowAttr(config, layer, lv, star);
+
+        if (tabIndex == 0)
+        {
+            composeBGImg.SetActive(true);
+            lvStarBGImg.SetActive(false);
+            opBtns.SetActive(false);
+            composeBtn.SetActive(true);
+
+            processRect.SetActive(true);
+            var cnt = VirtualPackManager.Instance.GetNoPackItemCount(config.UnlockItemID);
+            float value = cnt * 1.0f / config.UnlockItemCnt;
+            processImg.fillAmount = value;
+            fullProcessImg.SetActive(value >= 1);
+            processText.text = $"{cnt}/{config.UnlockItemCnt}";
+            itemCntText.SetActive(false);
+
+            starupBtn.SetActive(false);
+            lvupBtn.SetActive(false);
+        }
+        else
+        {
+            composeBGImg.SetActive(false);
+            composeBtn.SetActive(false);
+            lvStarBGImg.SetActive(true);
+            opBtns.SetActive(true);
+            bool isAwake = false;
+            var starConfig = GubaoStarConfig.GetConfig(config.GubaoQuality, gbData.GubaoStar + 1);
+            if (starConfig != null && !starConfig.Condition.IsNullOrEmpty())
+            {
+                isAwake = true;
+            }
+
+
+            starUpTabNameText.text = !isAwake ? Language.Get("Gubao7") : Language.Get("herocard41");
+            lvupRedImg.SetActive(GubaoManager.Instance.CanLVUpGubao(gubaoID));
+            starupRedImg.SetActive(GubaoManager.Instance.CanStarUpGubao(gubaoID));
+
+            if (tabIndex == 1)
+            {
+                if (GubaoManager.Instance.IsMaxLV(gubaoID))
+                {
+                    fullRect.SetActive(true);
+                    fullLVStarText.text = Language.Get("L1055");
+                    lvupBtn.SetActive(false);
+                    itemCntText.SetActive(false);
+                }
+                else
+                {
+                    fullRect.SetActive(false);
+                    lvupBtn.SetActive(true);
+                    var lvUseCfg = GubaoLVConfig.GetConfig(quality, lv);
+                    int itemID = lvUseCfg.LVUPNeedItemInfo[0][0];
+                    itemIconImg.SetItemSprite(itemID);
+                    itemCntText.text = UIHelper.ShowUseItem(PackType.Item, itemID, lvUseCfg.LVUPNeedItemInfo[0][1]);
+                    itemCntText.SetActive(true);
+                }
+                starupBtn.SetActive(false);
+                processRect.SetActive(false);
+            }
+            else
+            {
+                lvupBtn.SetActive(false);
+                starUpNameText.text = !isAwake ? Language.Get("Gubao7") : Language.Get("herocard41");
+                if (GubaoManager.Instance.IsMaxStar(gubaoID))
+                {
+                    fullRect.SetActive(true);
+                    fullLVStarText.text = Language.Get("HeroGift7");
+                    starupBtn.SetActive(false);
+                    itemCntText.SetActive(false);
+                    processRect.SetActive(false);
+                }
+                else
+                {
+                    fullRect.SetActive(false);
+                    starupBtn.SetActive(true);
+                    if (starConfig.StarUPNeedSelfCnt > 0)
+                    {
+                        itemCntText.SetActive(false);
+                        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);
+                        itemCntText.SetActive(true);
+                        int itemID = starConfig.StarUPNeedItemList[0][0];
+                        itemIconImg.SetItemSprite(itemID);
+                        itemCntText.text = UIHelper.ShowUseItem(PackType.Item, itemID, starConfig.StarUPNeedItemList[0][1]);
+                        itemCntText.SetActive(true);
+                    }
+
+                    if (starConfig.Condition.IsNullOrEmpty())
+                    {
+                        starLimitText.SetActive(false);
+                    }
+                    else
+                    {
+                        starLimitText.SetActive(true);
+                        int cnt = GubaoManager.Instance.GetGubaoCntByStar(quality, starConfig.Condition[1]);
+                        string cntInfo = UIHelper.AppendColor(cnt < starConfig.Condition[0] ? TextColType.Red : TextColType.Green, cnt + "/" + starConfig.Condition[0]);
+                        //闇�瑕亄0}鏄焮1}锛歿2}
+                        starLimitText.text = Language.Get("Gubao20", starConfig.Condition[1], Language.Get($"GubaoTypeName{quality}"), cntInfo);
+                    }
+                }
+
+            }
+        }
+
+
+    }
+
+    //鍚堟垚浼氬彉鍖栨垚鍗囩骇
+    void RefreshTabIndex()
+    {
+        if (tabIndex == 0)
+        {
+            if (GubaoManager.Instance.IsActive(gubaoID))
+            {
+                if (GubaoManager.Instance.CanLVUpGubao(gubaoID))
+                {
+                    tabIndex = 1;
+                    lvupTabBtn.SelectBtn();
+                }
+                else if (GubaoManager.Instance.CanStarUpGubao(gubaoID))
+                {
+                    tabIndex = 2;
+                    starupTabBtn.SelectBtn();
+                }
+                else
+                {
+                    tabIndex = 1;
+                    lvupTabBtn.SelectBtn();
+                }
+            }
+            else
+            {
+                tabIndex = 0;
+            }
+        }
+        else if (tabIndex == 1)
+        {
+            lvupTabBtn.SelectBtn();
+        }
+        else if (tabIndex == 2)
+        {
+            starupTabBtn.SelectBtn();
+        }
+    }
+
+    void ShowAttr(GubaoConfig config, int layer, int lv, int star)
+    {
+        //鍩虹灞炴��
+        var attrDict = GubaoManager.Instance.GetBaseAttrByGBID(gubaoID, true);
+        for (int i = 0; i < attrBaseRects.Length; i++)
+        {
+            if (i < config.BaseAttrIDList.Length)
+            {
+                attrBaseRects[i].SetActive(true);
+                attrBaseTexts[i].text = PlayerPropertyConfig.GetFullDescription(config.BaseAttrIDList[i], attrDict[config.BaseAttrIDList[i]]);
+                if (tabIndex != 2)
+                {
+                    //鍙湁鍗囨槦鏈夊姞鎴�
+                    addAttrBaseRects[i].SetActive(false);
+                }
+                else
+                {
+                    //婊℃槦涔熶笉鏄剧ず
+                    if (GubaoManager.Instance.IsMaxStar(gubaoID))
+                    {
+                        addAttrBaseRects[i].SetActive(false);
+                    }
+                    else
+                    {
+                        addAttrBaseRects[i].SetActive(true);
+                        addAttrBaseTexts[i].text = PlayerPropertyConfig.GetValueDescriptionFormat(config.BaseAttrIDList[i], attrDict[config.BaseAttrIDList[i]] + config.BaseAttrPerStarAddList[i]);
+                    }
+                }
+            }
+            else
+            {
+                attrBaseRects[i].SetActive(false);
+            }
+        }
+
+        //鐗规畩灞炴�э細鍙湁涓�涓睘鎬э紝绗竴琛屽崟灞傚睘鎬э紝绗簩琛屼负鐗规晥鏁堟灉灞傜骇鍔犳垚姹囨��
+        attrSpecialRects[1].SetActive(config.SpecEffType != 0);
+        //鍒嗕袱绉嶆儏鍐�
+        //鏃犱换浣曟晥鏋滅殑姝e父鍗囨槦鍗囩骇鏄剧ず绗竴琛岋紝绗簩琛岄殣钘�
+        //鏈夌壒娈婂眰绾х殑锛氬鏋滀负0锛屽垯绗竴琛屽彧鏄剧ず鍗曡鐨勫睘鎬у拰鎻愬崌锛岀浜岃鏄剧ず鏁板��0锛涘鏋滀笉涓�0锛屽垯绗竴琛屾樉绀哄崟琛屽睘鎬у拰鎻愬崌锛岀浜岃鏄剧ず鏁板��
+        //鏈夌壒鏉冩晥鏋滅殑浜﹀悓
+        var specAttrDict = GubaoManager.Instance.GetSpecialAttrByGBID(gubaoID, true);
+        if (config.SpecEffType == 0)
+        {
+            attrSpecialTexts[0].text = PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID]);
+            if (tabIndex == 0)
+            {
+                //鍚堟垚鏃朵笉鏄剧ず
+                addAttrSpecialRects[0].SetActive(false);
+            }
+            else if (tabIndex == 1)
+            {
+                //婊$骇涓嶆樉绀�
+                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
+        {
+            //鏈夌壒娈婃晥鏋滅殑
+            var singleLayerAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID);
+            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)
+            {
+                //鍚堟垚鏃朵笉鏄剧ず
+                addAttrSpecialRects[0].SetActive(false);
+                addAttrSpecialRects[1].SetActive(false);
+            }
+            else if (tabIndex == 1)
+            {
+                //婊$骇涓嶆樉绀�
+                if (GubaoManager.Instance.IsMaxLV(gubaoID))
+                {
+                    addAttrSpecialRects[0].SetActive(false);
+                    addAttrSpecialRects[1].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]);
+                    addAttrSpecialRects[1].SetActive(true);
+                    addAttrSpecialTexts[1].text = PlayerPropertyConfig.GetValueDescriptionFormat(config.SpecAttrID, nextAttrDict[config.SpecAttrID] * layer);
+                }
+            }
+            else if (tabIndex == 2)
+            {
+                //婊℃槦涓嶆樉绀�
+                if (GubaoManager.Instance.IsMaxStar(gubaoID))
+                {
+                    addAttrSpecialRects[0].SetActive(false);
+                    addAttrSpecialRects[1].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]);
+                    addAttrSpecialRects[1].SetActive(true);
+                    addAttrSpecialTexts[1].text = PlayerPropertyConfig.GetValueDescriptionFormat(config.SpecAttrID, nextAttrDict[config.SpecAttrID] * layer);
+                }
+            }
+        }
+        if (config.PowerType != 0)
+        {
+            // 1	娓稿巻鍙屽�嶅鍔辨鐜�	鏃�	澧炲姞涓囧垎鐜�	涓囧垎鐜�
+            // 2	鏈堝崱棰嗗彇棰濆濂栧姳	鐗╁搧ID	鎻愬崌鐧惧垎姣�	鐧惧垎姣�
+
+            //鏈夌壒鏉冩晥鏋滅殑 闈炲睘鎬х被
+            attrPrivilegeRect.SetActive(true);
+            var valueDict = GubaoManager.Instance.GetPrivilegeValueByGBID(gubaoID, true);
+            if (config.PowerType == 1)
+            {
+                attrPrivilegeText.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]);
+            }
+
+            if (tabIndex != 2)
+            {
+                addPrivilegeRect.SetActive(false);
+            }
+            else
+            {
+                addPrivilegeRect.SetActive(true);
+                float addValue = 0f;
+                if (config.PowerType == 1)
+                {
+                    addValue = config.PowerPerStarAdd / 100.0f;
+                }
+                else if (config.PowerType == 2)
+                {
+                    addValue = config.PowerPerStarAdd;
+                }
+                addPrivilegeText.text = Language.Get("Gubao24", valueDict[config.PowerType] + addValue);
+            }
+        }
+        else
+        {
+            attrPrivilegeRect.SetActive(false);
+        }
+
+    }
+
+    void StarUp()
+    {
+        var gbData = GubaoManager.Instance.TryGetGubaoInfo(gubaoID);
+        if (gbData == null)
+            return;
+
+        //鎻愰啋闇�瑕亁鏄焫涓彜瀹�
+        var starConfig = GubaoStarConfig.GetConfig(gbData.Quality, gbData.GubaoStar + 1);
+        if (!starConfig.Condition.IsNullOrEmpty() && GubaoManager.Instance.GetGubaoCntByStar(gbData.Quality, starConfig.Condition[1]) < starConfig.Condition[0])
+        {
+            SysNotifyMgr.Instance.ShowTip("GubaoStar", starConfig.Condition[0], starConfig.Condition[1], Language.Get($"GubaoTypeName{gbData.Quality}"));
+            return;
+        }
+
+        if (starConfig.StarUPNeedSelfCnt > 0)
+        {
+            var config = GubaoConfig.Get(gubaoID);
+            if (VirtualPackManager.Instance.GetNoPackItemCount(config.UnlockItemID) < starConfig.StarUPNeedSelfCnt)
+            {
+                ItemTipUtility.Show(config.UnlockItemID, true);
+                return;
+            }
+        }
+        if (starConfig.StarUPNeedItemList.Length > 0)
+        {
+            if (PackManager.Instance.GetItemCountByID(PackType.Item, starConfig.StarUPNeedItemList[0][0]) < starConfig.StarUPNeedItemList[0][1])
+            {
+                ItemTipUtility.Show(starConfig.StarUPNeedItemList[0][0], true);
+                return;
+            }
+        }
+        starupEffect.Play();
+        GubaoManager.Instance.UpgradeGubaoStar(gubaoID);
+
+    }
+
+    void LVUp()
+    {
+        var gbData = GubaoManager.Instance.TryGetGubaoInfo(gubaoID);
+        if (gbData == null)
+            return;
+
+        var lvConfig = GubaoLVConfig.GetConfig(gbData.Quality, gbData.GubaoLV);
+
+        //妫�鏌ユ潗鏂�
+        if (PackManager.Instance.GetItemCountByID(PackType.Item, lvConfig.LVUPNeedItemInfo[0][0]) < lvConfig.LVUPNeedItemInfo[0][1])
+        {
+            ItemTipUtility.Show(lvConfig.LVUPNeedItemInfo[0][0], true);
+            return;
+        }
+
+        lvupEffect.Play();
+        GubaoManager.Instance.UpgradeGubaoLV(gubaoID);
+    }
+
+    void Compose()
+    {
+        var config = GubaoConfig.Get(gubaoID);
+        if (VirtualPackManager.Instance.GetNoPackItemCount(config.UnlockItemID) < config.UnlockItemCnt)
+        {
+            ItemTipUtility.Show(config.UnlockItemID, true);
+            return;
+        }
+
+        GubaoManager.Instance.ActiveGubao(gubaoID);
+    }
+
+}
diff --git a/Main/System/Gubao/GubaoDetailWin.cs.meta b/Main/System/Gubao/GubaoDetailWin.cs.meta
new file mode 100644
index 0000000..a6f3501
--- /dev/null
+++ b/Main/System/Gubao/GubaoDetailWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: db6d6b2a988ad0a4f93543482340a23c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoListCell.cs b/Main/System/Gubao/GubaoListCell.cs
new file mode 100644
index 0000000..946e656
--- /dev/null
+++ b/Main/System/Gubao/GubaoListCell.cs
@@ -0,0 +1,34 @@
+锘縰sing System;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+public class GubaoListCell : CellView
+{
+    [SerializeField] GubaoCell[] gubaoCells;
+
+
+    public void Display(int index)
+    {
+        var quality = index / 100000;
+        var startIndex = index % 100000;
+        var allCnt = GubaoManager.Instance.gubaoCollectDict[quality].Count;
+        for (int i = 0; i < gubaoCells.Length; i++)
+        {
+            if (startIndex + i < allCnt)
+            {
+                gubaoCells[i].SetActive(true);
+                gubaoCells[i].Display(quality, startIndex + i);
+            }
+            else
+            {
+                gubaoCells[i].SetActive(false);
+            }
+        }
+    }
+
+
+}
+
+
diff --git a/Main/System/Gubao/GubaoListCell.cs.meta b/Main/System/Gubao/GubaoListCell.cs.meta
new file mode 100644
index 0000000..0be9b5a
--- /dev/null
+++ b/Main/System/Gubao/GubaoListCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 21573adcd53524f4c93c9919e9a073a2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoListNameCell.cs b/Main/System/Gubao/GubaoListNameCell.cs
new file mode 100644
index 0000000..6924bd1
--- /dev/null
+++ b/Main/System/Gubao/GubaoListNameCell.cs
@@ -0,0 +1,21 @@
+锘縰sing System;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+public class GubaoListNameCell : CellView
+{
+    [SerializeField] Text nameText;
+
+
+    public void Display(int quality)
+    {
+        nameText.text = Language.Get($"GubaoTypeName{quality}") +
+        Language.Get("HeroFates11", GubaoManager.Instance.GetActiveCnt(quality), GubaoManager.Instance.gubaoCollectDict[quality].Count);
+    }
+
+
+}
+
+
diff --git a/Main/System/Gubao/GubaoListNameCell.cs.meta b/Main/System/Gubao/GubaoListNameCell.cs.meta
new file mode 100644
index 0000000..93dc5e2
--- /dev/null
+++ b/Main/System/Gubao/GubaoListNameCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 41792f1bb891437429dd1ec9731cfa32
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoListWin.cs b/Main/System/Gubao/GubaoListWin.cs
new file mode 100644
index 0000000..00d385b
--- /dev/null
+++ b/Main/System/Gubao/GubaoListWin.cs
@@ -0,0 +1,118 @@
+using System;
+using System.Linq;
+using System.Text;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍙ゅ疂鍒楄〃
+/// </summary>
+public class GubaoListWin : UIBase
+{
+    [SerializeField] GroupButtonEx allBtn;
+    [SerializeField] GroupButtonEx lvupBtn;
+    [SerializeField] GroupButtonEx starBtn;
+    [SerializeField] Button seeAttrBtn;
+    [SerializeField] ScrollerController scroller;
+
+    protected override void InitComponent()
+    {
+        allBtn.AddListener(() =>
+        {
+            GubaoManager.Instance.selectTagIndex = 0;
+        });
+        lvupBtn.AddListener(() =>
+        {
+            GubaoManager.Instance.selectTagIndex = 1;
+        });
+        starBtn.AddListener(() =>
+        {
+            GubaoManager.Instance.selectTagIndex = 2;
+        });
+        seeAttrBtn.AddListener(() =>
+        {
+            AttributeManager.Instance.OpenTotalAttributeWin(BeautyMMManager.Instance.allMMTalentAttr);
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        GubaoManager.Instance.selectTagIndex = 0;
+        GubaoManager.Instance.SortGubaoList();
+        GubaoManager.Instance.OnSelectUpdate += OnSelectUpdate;
+        scroller.OnRefreshCell += OnRefreshCell;
+        UIManager.Instance.OnCloseWindow += OnCloseWindow;
+        allBtn.SelectBtn();
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        GubaoManager.Instance.OnSelectUpdate -= OnSelectUpdate;
+        scroller.OnRefreshCell -= OnRefreshCell;
+        UIManager.Instance.OnCloseWindow -= OnCloseWindow;
+    }
+
+    void OnCloseWindow(UIBase ui)
+    {
+        if (ui is GubaoDetailWin)
+        {
+            scroller.m_Scorller.RefreshActiveCellViews();
+        }
+    }
+
+    void OnSelectUpdate()
+    {
+        GubaoManager.Instance.SortGubaoList();
+        Display();
+    }
+
+    void Display()
+    {
+        scroller.Refresh();
+        var keys = GubaoManager.Instance.gubaoCollectDict.Keys.ToList();
+        keys.OrderByDescending(x => x);
+        int jumpIndex = 0; 
+        int activeIndex = -1; //鍙縺娲婚渶瑕佽烦杞�
+        for (int i = 0; i < keys.Count; i++)
+        {
+            var quality = keys[i];
+            scroller.AddCell(ScrollerDataType.Header, quality);
+            var idList = GubaoManager.Instance.gubaoCollectDict[quality];
+            for (int j = 0; j < idList.Count; j++)
+            {
+                if (j % 4 == 0)
+                {
+                    scroller.AddCell(ScrollerDataType.Normal, quality * 100000 + j);
+                    jumpIndex++;
+                    if (activeIndex == -1 && GubaoManager.Instance.CanActiveGubao(idList[j]))
+                    {
+                        activeIndex = jumpIndex;
+                    }
+                }
+            }
+            jumpIndex++;
+        }
+
+        scroller.Restart();
+        if (GubaoManager.Instance.selectTagIndex == 0)
+        {
+            //璺宠浆绾㈢偣
+            scroller.JumpIndex(activeIndex);
+        }
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        if (type == ScrollerDataType.Header)
+        {
+            var _cell = cell as GubaoListNameCell;
+            _cell.Display(cell.index);
+        }
+        else if (type == ScrollerDataType.Normal)
+        {
+            var _cell = cell as GubaoListCell;
+            _cell.Display(cell.index);
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Gubao/GubaoListWin.cs.meta b/Main/System/Gubao/GubaoListWin.cs.meta
new file mode 100644
index 0000000..0debd8c
--- /dev/null
+++ b/Main/System/Gubao/GubaoListWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7118eabd602fad24b855b87de6849aec
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoManager.cs b/Main/System/Gubao/GubaoManager.cs
new file mode 100644
index 0000000..d82667e
--- /dev/null
+++ b/Main/System/Gubao/GubaoManager.cs
@@ -0,0 +1,558 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using System.Linq;
+using LitJson;
+
+
+public partial class GubaoManager : GameSystemManager<GubaoManager>
+{
+    //鍙ゅ疂ID锛歔鏄熺骇锛岀瓑绾�, 鐗规畩灞俔
+    Dictionary<int, GubaoInfo> gubaoDict = new Dictionary<int, GubaoInfo>();
+    public event Action UpdateGubaoEvent;
+    public int waitActiveGubao;
+    public int selectGubao; //浠庤棌瀹濋榿閫変腑
+
+    int m_SelectTagIndex = 0;  //鍙ゅ疂Tag绫诲瀷 0 鍏ㄩ儴 1 鍙崌绾� 2 鍙崌鏄�
+    public event Action OnSelectUpdate;
+    public int selectTagIndex
+    {
+        get { return m_SelectTagIndex; }
+        set
+        {
+            if (m_SelectTagIndex != value)
+            {
+                m_SelectTagIndex = value;
+                OnSelectUpdate?.Invoke();
+            }
+        }
+    }
+
+    //鎸� 鍏ㄩ儴 鍗囩骇 鍗囨槦 鍖哄垎
+    public Dictionary<int, List<int>> gubaoCollectDict = new Dictionary<int, List<int>>();  //鍙ゅ疂鍥鹃壌鎸夊搧璐ㄥ垪琛�
+
+
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitialize;
+        PackManager.Instance.RefreshItemEvent += RefreshItemCount;
+        VirtualPackManager.Instance.OnNoPackItemCountRefresh += UpdateRedpoint;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOK;
+        ParseConfig();
+
+
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitialize;
+        PackManager.Instance.RefreshItemEvent -= RefreshItemCount;
+        VirtualPackManager.Instance.OnNoPackItemCountRefresh -= UpdateRedpoint;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOK;
+    }
+
+    void ParseConfig()
+    {
+    }
+
+
+    void OnBeforePlayerDataInitialize()
+    {
+        gubaoDict.Clear();
+        waitActiveGubao = 0;
+    }
+
+    void OnPlayerLoginOK()
+    {
+        UpdateRedpoint();
+    }
+
+    void RefreshItemCount(PackType packType, int index, int itemID)
+    {
+        if (packType == PackType.Item)
+        {
+            if (CanRefreshRepoint(itemID))
+            {
+                UpdateRedpoint();
+            }
+        }
+    }
+
+
+
+
+    //鐗╁搧鍒锋柊
+    bool CanRefreshRepoint(int itemID)
+    {
+
+        if (GubaoLVConfig.useItemIDS.Contains(itemID))
+            return true;
+
+        if (GubaoStarConfig.useItemIDS.Contains(itemID))
+            return true;
+        return false;
+    }
+
+    public void UpdateGubaoNetPack(HA3C7_tagMCGubaoInfo netPack)
+    {
+
+        for (int i = 0; i < netPack.Count; i++)
+        {
+            gubaoDict[netPack.GubaoInfoList[i].GubaoID] = new GubaoInfo()
+            {
+                GubaoStar = netPack.GubaoInfoList[i].GubaoStar,
+                GubaoLV = netPack.GubaoInfoList[i].GubaoLV,
+                EffLayer = netPack.GubaoInfoList[i].EffLayer,
+                Quality = GubaoConfig.Get(netPack.GubaoInfoList[i].GubaoID).GubaoQuality
+            };
+        }
+
+        UpdateGubaoEvent?.Invoke();
+        if (DTC0403_tagPlayerLoginLoadOK.finishedLogin && waitActiveGubao != 0 && gubaoDict.ContainsKey(waitActiveGubao))
+        {
+            UIManager.Instance.OpenWindow<GubaoActiveWin>(waitActiveGubao);
+            waitActiveGubao = 0;
+        }
+        UpdateRedpoint();
+    }
+
+
+
+    public GubaoInfo TryGetGubaoInfo(int gubaoID)
+    {
+        if (!gubaoDict.ContainsKey(gubaoID))
+            return null;
+
+        return gubaoDict[gubaoID];
+    }
+
+    // 鎸夐�夋嫨鎺掑簭 m_SelectTagIndex 鍙悎鎴� 锛屽凡鍚堟垚锛屾湭鍚堟垚
+    public void SortGubaoList()
+    {
+        gubaoCollectDict.Clear();
+        if (m_SelectTagIndex == 0)
+        {
+            var keys = GubaoConfig.GetKeys();
+            foreach (var key in keys)
+            {
+                var config = GubaoConfig.Get(key);
+                if (!gubaoCollectDict.ContainsKey(config.GubaoQuality))
+                {
+                    gubaoCollectDict[config.GubaoQuality] = new List<int>();
+                }
+                gubaoCollectDict[config.GubaoQuality].Add(key);
+            }
+        }
+        else if (m_SelectTagIndex == 1)
+        {
+            //鍙崌绾�
+            foreach (var gubao in gubaoDict.Keys)
+            {
+                var quality = gubaoDict[gubao].Quality;
+                if (!CanLVUpGubao(gubao))
+                {
+                    continue;
+                }
+                if (!gubaoCollectDict.ContainsKey(quality))
+                {
+                    gubaoCollectDict[quality] = new List<int>();
+                }
+                gubaoCollectDict[quality].Add(gubao);
+            }
+        }
+        else if (m_SelectTagIndex == 2)
+        {
+            //鍙崌鏄�
+            foreach (var gubao in gubaoDict.Keys)
+            {
+                var quality = gubaoDict[gubao].Quality;
+                if (!CanStarUpGubao(gubao))
+                {
+                    continue;
+                }
+                if (!gubaoCollectDict.ContainsKey(quality))
+                {
+                    gubaoCollectDict[quality] = new List<int>();
+                }
+                gubaoCollectDict[quality].Add(gubao);
+            }
+        }
+
+
+        foreach (var idList in gubaoCollectDict.Values)
+        {
+            idList.Sort(CmpGubao);
+        }
+    }
+
+    //鎺掑簭鏄剧ず 鍙縺娲�-宸叉縺娲� - ID
+    int CmpGubao(int gubaoA, int gubaoB)
+    {
+        var isActiveA = gubaoDict.ContainsKey(gubaoA);
+        var isActiveB = gubaoDict.ContainsKey(gubaoB);
+
+        var configA = GubaoConfig.Get(gubaoA);
+        var configB = GubaoConfig.Get(gubaoB);
+        var canActiveA = false;
+        var canActiveB = false;
+        if (!isActiveA)
+        {
+            canActiveA = VirtualPackManager.Instance.GetNoPackItemCount(configA.UnlockItemID) >= configA.UnlockItemCnt;
+        }
+
+        if (!isActiveB)
+        {
+            canActiveB = VirtualPackManager.Instance.GetNoPackItemCount(configB.UnlockItemID) >= configB.UnlockItemCnt;
+        }
+
+        if (canActiveA != canActiveB)
+        {
+            return canActiveB.CompareTo(canActiveA);
+        }
+
+        if (isActiveA != isActiveB)
+        {
+            return isActiveB.CompareTo(isActiveA);
+        }
+
+
+        return gubaoA.CompareTo(gubaoB);
+    }
+
+    public int GetActiveCnt(int gubaoQuality)
+    {
+        int cnt = 0;
+        foreach (var gubao in gubaoDict.Keys)
+        {
+            if (GubaoConfig.Get(gubao).GubaoQuality == gubaoQuality)
+            {
+                cnt++;
+            }
+        }
+        return cnt;
+    }
+
+    public void ActiveGubao(int gubaoID)
+    {
+        var pak = new CB216_tagCMGubaoActivate();
+        pak.GubaoID = (ushort)gubaoID;
+        GameNetSystem.Instance.SendInfo(pak);
+        waitActiveGubao = gubaoID;
+    }
+
+    public void UpgradeGubaoStar(int gubaoID)
+    {
+        var pak = new CB217_tagCMGubaoStarUp();
+        pak.GubaoID = (ushort)gubaoID;
+        GameNetSystem.Instance.SendInfo(pak);
+        waitActiveGubao = 0;
+    }
+
+    public void UpgradeGubaoLV(int gubaoID)
+    {
+        var pak = new CB218_tagCMGubaoLVUp();
+        pak.GubaoID = (ushort)gubaoID;
+        GameNetSystem.Instance.SendInfo(pak);
+        waitActiveGubao = 0;
+    }
+
+    public bool IsActive(int gubaoID)
+    {
+        return gubaoDict.ContainsKey(gubaoID);
+    }
+
+    public bool CanActiveGubao(int gubaoID)
+    {
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo != null)
+            return false;
+        var config = GubaoConfig.Get(gubaoID);
+
+        return VirtualPackManager.Instance.GetNoPackItemCount(config.UnlockItemID) >= config.UnlockItemCnt;
+    }
+
+    //鑾峰彇鍚屽搧璐ㄧ殑鍙ゅ疂鏁伴噺涓旇揪鍒癤鏄�
+    public int GetGubaoCntByStar(int gubaoQuality, int gubaoStar)
+    {
+        int cnt = 0;
+        foreach (var gubaoInfo in gubaoDict.Values)
+        {
+            if (gubaoInfo.Quality == gubaoQuality && gubaoInfo.GubaoStar >= gubaoStar)
+            {
+                cnt++;
+            }
+        }
+        return cnt;
+    }
+
+    public bool CanStarUpGubao(int gubaoID)
+    {
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo == null)
+        {
+            return false;
+        }
+        //鍒ゆ柇娑堣��
+        var config = GubaoConfig.Get(gubaoID);
+        var starConfig = GubaoStarConfig.GetConfig(config.GubaoQuality, gubaoInfo.GubaoStar + 1);
+        if (starConfig == null)
+        {
+            return false;
+        }
+
+        //鍒ゆ柇鍚屽搧璐ㄧ殑鍙ゅ疂鏁伴噺涓旇揪鍒癤鏄�
+        if (!starConfig.Condition.IsNullOrEmpty())
+        {
+            if (GetGubaoCntByStar(config.GubaoQuality, starConfig.Condition[1]) < starConfig.Condition[0])
+            {
+				return false;
+			}
+        }
+
+        if (starConfig.StarUPNeedSelfCnt > 0 &&
+        VirtualPackManager.Instance.GetNoPackItemCount(config.UnlockItemID) < starConfig.StarUPNeedSelfCnt)
+        {
+            return false;
+        }
+
+        for (int i = 0; i < starConfig.StarUPNeedItemList.Length; i++)
+        {
+            if (PackManager.Instance.GetItemCountByID(PackType.Item, starConfig.StarUPNeedItemList[i][0]) < starConfig.StarUPNeedItemList[i][1])
+            {
+                return false;
+            }
+        }
+        return true;
+
+    }
+
+    public bool CanLVUpGubao(int gubaoID)
+    {
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo == null)
+        {
+            return false;
+        }
+        //鍒ゆ柇娑堣��
+        var config = GubaoConfig.Get(gubaoID);
+        var lvConfig = GubaoLVConfig.GetConfig(config.GubaoQuality, gubaoInfo.GubaoLV);
+        if (lvConfig == null)
+        {
+            return false;
+        }
+        for (int i = 0; i < lvConfig.LVUPNeedItemInfo.Length; i++)
+        {
+            if (PackManager.Instance.GetItemCountByID(PackType.Item, lvConfig.LVUPNeedItemInfo[i][0]) < lvConfig.LVUPNeedItemInfo[i][1])
+            {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    //鏄惁鏈夌孩鐐�
+    public bool IsRedTip(int gubaoID)
+    {
+        if (selectTagIndex == 0 && CanActiveGubao(gubaoID))
+        {
+            return true;
+        }
+        if (selectTagIndex == 2 && CanStarUpGubao(gubaoID))
+        {
+            return true;
+        }
+        if (selectTagIndex == 1 && CanLVUpGubao(gubaoID))
+        {
+            return true;
+        }
+        return false;
+    }
+
+    public int tipType = 0; // 0瀹屾暣tip锛堝彲鍒囨弧绾э級 1 鍙湁鍩虹婊$骇涓嶅彲鍒囨崲 2 鍙湁濂楄
+    public void ShowTip(int gubaoID, int type)
+    {
+        tipType = type;
+        UIManager.Instance.OpenWindow<GubaoTipWin>(gubaoID);
+    }
+
+
+    #region 灞炴��
+
+    public Dictionary<int, long> GetBaseAttrByGBID(int gubaoID, bool isPreview = false)
+    {
+        Dictionary<int, long> attrDict = new Dictionary<int, long>();
+        var config = GubaoConfig.Get(gubaoID);
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo == null)
+        {
+            if (isPreview)
+            {
+                for (int i = 0; i < config.BaseAttrIDList.Length; i++)
+                {
+                    attrDict[config.BaseAttrIDList[i]] = config.BaseAttrValueList[i];
+                }
+            }
+
+            return attrDict;
+        }
+
+        for (int i = 0; i < config.BaseAttrIDList.Length; i++)
+        {
+            attrDict[config.BaseAttrIDList[i]] = config.BaseAttrValueList[i] + config.BaseAttrPerStarAddList[i] * gubaoInfo.GubaoStar;
+        }
+        return attrDict;
+    }
+
+    public Dictionary<int, long> GetSpecialAttrByGBID(int gubaoID, bool isPreview = false)
+    {
+        Dictionary<int, long> attrDict = new Dictionary<int, long>();
+        var config = GubaoConfig.Get(gubaoID);
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo == null)
+        {
+            if (isPreview)
+            {
+                //鐗规畩灞炴�ф縺娲诲睘鎬� = 鍒濆灞炴�� + 1绾х殑鐗规畩灞炴��
+                attrDict[config.SpecAttrID] = config.SpecAttrValue + GubaoLVAttrConfig.GetSpecLVAttrValue(config.GubaoQuality, 1, config.SpecAttrID);
+            }
+            return attrDict;
+        }
+
+        attrDict[config.SpecAttrID] = config.SpecAttrValue + config.SpecAttrPerStarAdd * gubaoInfo.GubaoStar
+            + GubaoLVAttrConfig.GetSpecLVAttrValue(gubaoInfo.Quality, gubaoInfo.GubaoLV, config.SpecAttrID);
+
+        if (config.SpecEffType != 0)
+        {
+            //鏈嶅姟绔褰�
+            attrDict[config.SpecAttrID] *= gubaoInfo.EffLayer;
+        }
+
+        return attrDict;
+    }
+
+
+
+    //鍗曞眰鐨勫睘鎬э紝鎴栬�呬笉闇�瑕佸眰鐨�
+    public Dictionary<int, long> GetSpecialAttrSingleLayerByGBID(int gubaoID, int lv = 0, int star = 0)
+    {
+        Dictionary<int, long> attrDict = new Dictionary<int, long>();
+        var config = GubaoConfig.Get(gubaoID);
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo == null)
+        {
+            //鐗规畩灞炴�ф縺娲诲睘鎬� = 鍒濆灞炴�� + 1绾х殑鐗规畩灞炴��
+            attrDict[config.SpecAttrID] = config.SpecAttrValue + GubaoLVAttrConfig.GetSpecLVAttrValue(config.GubaoQuality, 1, config.SpecAttrID);
+            return attrDict;
+        }
+
+        if (lv == 0)
+        {
+            lv = gubaoInfo.GubaoLV;
+        }
+        if (star == 0)
+        {
+            star = gubaoInfo.GubaoStar;
+        }
+
+        attrDict[config.SpecAttrID] = config.SpecAttrValue + config.SpecAttrPerStarAdd * star
+            + GubaoLVAttrConfig.GetSpecLVAttrValue(gubaoInfo.Quality, lv, config.SpecAttrID);
+
+        return attrDict;
+    }
+
+    //鑾峰彇鐗规潈鍊�
+    public Dictionary<int, int> GetPrivilegeValueByGBID(int gubaoID, bool isPreview = false)
+    {
+        Dictionary<int, int> attrDict = new Dictionary<int, int>();
+        var config = GubaoConfig.Get(gubaoID);
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo == null)
+        {
+            if (isPreview)
+            {
+                attrDict[config.PowerType] = config.PowerValue;
+            }
+            return attrDict;
+        }
+
+        attrDict[config.PowerType] = config.PowerValue + config.PowerPerStarAdd * gubaoInfo.GubaoStar;
+        return attrDict;
+    }
+
+    public bool IsMaxLV(int gubaoID)
+    {
+        var config = GubaoConfig.Get(gubaoID);
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo == null)
+        {
+            return false;
+        }
+
+        return gubaoInfo.GubaoLV >= GubaoLVAttrConfig.GetMaxLV(gubaoInfo.Quality);
+    }
+
+    public bool IsMaxStar(int gubaoID)
+    {
+        var config = GubaoConfig.Get(gubaoID);
+        var gubaoInfo = TryGetGubaoInfo(gubaoID);
+        if (gubaoInfo == null)
+        {
+            return false;
+        }
+        return gubaoInfo.GubaoStar >= GubaoStarConfig.GetMaxStar(config.GubaoQuality);
+    }
+
+    #endregion
+
+    #region 绾㈢偣
+    Redpoint tmpRP = new Redpoint(MainRedDot.MainAffairsRedpoint, MainRedDot.RedPoint_GuaBao);
+    Redpoint gubaoRP = new Redpoint(MainRedDot.RedPoint_GuaBao, MainRedDot.RedPoint_GuaBao * 10 + 1); //鍙ゅ疂 鍜� 鍏ㄩ儴
+    Redpoint gubaoCallRP = new Redpoint(MainRedDot.RedPoint_GuaBao, MainRedDot.RedPoint_GuaBao * 10 + 2); // 閴村疂
+    Redpoint gubaoSuiteRP = new Redpoint(MainRedDot.RedPoint_GuaBao, MainRedDot.RedPoint_GuaBao * 10 + 3); // 濂楄
+    Redpoint activeRP = new Redpoint(MainRedDot.RedPoint_GuaBao * 10 + 1, MainRedDot.RedPoint_GuaBao * 100); //鍙縺娲� 鍏ㄩ儴
+    Redpoint gubaoLVRP = new Redpoint(MainRedDot.RedPoint_GuaBao * 10 + 1, MainRedDot.RedPoint_GuaBao * 100 + 1); //鍗囩骇
+    Redpoint gubaoStarRP = new Redpoint(MainRedDot.RedPoint_GuaBao * 10 + 1, MainRedDot.RedPoint_GuaBao * 100 + 2); //鍗囨槦
+
+
+    public void UpdateRedpoint()
+    {
+        activeRP.state = RedPointState.None;
+        gubaoLVRP.state = RedPointState.None;
+        gubaoStarRP.state = RedPointState.None;
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.GuaBao))
+            return;
+        
+        var keys = GubaoConfig.GetKeys();
+        for (int i = 0; i < keys.Count; i++)
+        {
+            var gubaoID = keys[i];
+            if (activeRP.state == RedPointState.None && CanActiveGubao(gubaoID))
+            {
+                activeRP.state = RedPointState.Simple;
+            }
+
+            if (gubaoLVRP.state == RedPointState.None && CanLVUpGubao(gubaoID))
+            {
+                gubaoLVRP.state = RedPointState.Simple;
+            }
+
+            if (gubaoStarRP.state == RedPointState.None && CanStarUpGubao(gubaoID))
+            {
+                gubaoStarRP.state = RedPointState.Simple;
+            }
+        }
+        
+    }
+
+    #endregion
+}
+
+
+public class GubaoInfo
+{
+    public int GubaoStar;
+    public int GubaoLV;
+    public int EffLayer;
+    public int Quality;
+}
diff --git a/Main/System/Gubao/GubaoManager.cs.meta b/Main/System/Gubao/GubaoManager.cs.meta
new file mode 100644
index 0000000..4290584
--- /dev/null
+++ b/Main/System/Gubao/GubaoManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2b3a37ebb944365409e1f3783771b5c6
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Gubao/GubaoTipWin.cs b/Main/System/Gubao/GubaoTipWin.cs
new file mode 100644
index 0000000..55975bc
--- /dev/null
+++ b/Main/System/Gubao/GubaoTipWin.cs
@@ -0,0 +1,107 @@
+
+using System.Text;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鍙ゅ疂TIP
+/// </summary>
+public class GubaoTipWin : UIBase
+{
+[SerializeField] ImageEx gbImg;
+    [SerializeField] UIEffectPlayer gbBGEffect;
+    [SerializeField] UIEffectPlayer gbEffect;
+    [SerializeField] Text nameText;
+    //鍩虹灞炴��
+    [SerializeField] Text[] attrBaseTexts;
+    [SerializeField] Text attrSpecialText;
+    [SerializeField] Transform attrPrivilegeRect;
+    [SerializeField] Text attrPrivilegeText;
+
+    [SerializeField] Button okBtn;
+
+    int gubaoID = 0;
+
+    protected override void InitComponent()
+    {
+        okBtn.AddListener(CloseWindow);
+    }
+
+    protected override void OnPreOpen()
+    {
+        gubaoID = functionOrder;
+        Display();
+    }
+
+
+    public void Display()
+    {
+        var config = GubaoConfig.Get(gubaoID);
+        gbImg.SetOrgSprite(config.Icon, "gbicon");
+        gbImg.SetNativeSize();
+
+        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);
+    }
+
+    void ShowAttr(GubaoConfig config)
+    {
+        //鍩虹灞炴��
+        var attrDict = GubaoManager.Instance.GetBaseAttrByGBID(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]]);
+            }
+            else
+            {
+                attrBaseTexts[i].SetActive(false);
+            }
+        }
+
+        //鐗规畩灞炴�э細鍙湁涓�涓睘鎬э紝绗竴琛屽崟灞傚睘鎬э紝绗簩琛屼负鐗规晥鏁堟灉灞傜骇鍔犳垚姹囨��
+        //鍒嗕袱绉嶆儏鍐�
+        //鏃犱换浣曟晥鏋滅殑姝e父鍗囨槦鍗囩骇鏄剧ず绗竴琛岋紝绗簩琛岄殣钘�
+        //鏈夌壒娈婂眰绾х殑锛氬鏋滀负0锛屽垯绗竴琛屽彧鏄剧ず鍗曡鐨勫睘鎬у拰鎻愬崌锛岀浜岃鏄剧ず鏁板��0锛涘鏋滀笉涓�0锛屽垯绗竴琛屾樉绀哄崟琛屽睘鎬у拰鎻愬崌锛岀浜岃鏄剧ず鏁板��
+        //鏈夌壒鏉冩晥鏋滅殑浜﹀悓
+        var specAttrDict = GubaoManager.Instance.GetSpecialAttrByGBID(gubaoID, true);
+        if (config.SpecEffType == 0)
+        {
+            attrSpecialText.text = PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, specAttrDict[config.SpecAttrID]);
+        }
+        else
+        {
+            //鏈夌壒娈婃晥鏋滅殑
+            var singleLayerAttrDict = GubaoManager.Instance.GetSpecialAttrSingleLayerByGBID(gubaoID);
+            attrSpecialText.text = Language.Get("Gubao22_" + config.SpecEffType) + PlayerPropertyConfig.GetFullDescription(config.SpecAttrID, singleLayerAttrDict[config.SpecAttrID]);
+        }
+        if (config.PowerType != 0)
+        {
+            // 1	娓稿巻鍙屽�嶅鍔辨鐜�	鏃�	澧炲姞涓囧垎鐜�	涓囧垎鐜�
+            // 2	鏈堝崱棰嗗彇棰濆濂栧姳	鐗╁搧ID	鎻愬崌鐧惧垎姣�	鐧惧垎姣�
+
+            //鏈夌壒鏉冩晥鏋滅殑 闈炲睘鎬х被
+            attrPrivilegeRect.SetActive(true);
+            var valueDict = GubaoManager.Instance.GetPrivilegeValueByGBID(gubaoID, true);
+            if (config.PowerType == 1)
+            {
+                attrPrivilegeText.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]);
+            }
+        }
+        else
+        {
+            attrPrivilegeRect.SetActive(false);
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Gubao/GubaoTipWin.cs.meta b/Main/System/Gubao/GubaoTipWin.cs.meta
new file mode 100644
index 0000000..e577e7a
--- /dev/null
+++ b/Main/System/Gubao/GubaoTipWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b1c7ee1650690444ab2c53a1ccd0fd4d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/InternalAffairs/AffairFuncCell.cs b/Main/System/InternalAffairs/AffairFuncCell.cs
index 364921d..3c491db 100644
--- a/Main/System/InternalAffairs/AffairFuncCell.cs
+++ b/Main/System/InternalAffairs/AffairFuncCell.cs
@@ -51,6 +51,10 @@
         {
             UIManager.Instance.OpenWindow<BeautyMMBaseWin>();
         }
+        else if (funcID == 28)
+        {
+            UIManager.Instance.OpenWindow<GubaoBaseWin>();
+        }
 
 
     }
diff --git a/Main/System/ItemTip/ItemTipUtility.cs b/Main/System/ItemTip/ItemTipUtility.cs
index bc29044..ea18a42 100644
--- a/Main/System/ItemTip/ItemTipUtility.cs
+++ b/Main/System/ItemTip/ItemTipUtility.cs
@@ -350,10 +350,7 @@
                 UIManager.Instance.OpenWindow<ChooseItemsWin>();
                 break;
             case TipType.TreasurePavilion:
-                // TreasurePavilionModel.Instance.selectGubao = config.EffectValueA1;
-                // TreasurePavilionModel.Instance.showTipFromPiece = config.ID;
-                // WindowCenter.Instance.OpenIL<TreasurePavilionTipWin>();
-                UIManager.Instance.OpenWindow<ItemTipWin>();
+                GubaoManager.Instance.ShowTip(itemId, 0);
                 break;
             default:
                 UIManager.Instance.OpenWindow<ItemTipWin>();
diff --git a/Main/System/KnapSack/VirtualPackManager.cs b/Main/System/KnapSack/VirtualPackManager.cs
index 623bfb6..2cbb883 100644
--- a/Main/System/KnapSack/VirtualPackManager.cs
+++ b/Main/System/KnapSack/VirtualPackManager.cs
@@ -7,55 +7,46 @@
 
 public class VirtualPackManager : GameSystemManager<VirtualPackManager>
 {
-    Dictionary<PackType, List<VirtualPackItem>> virtualPackItems
-        = new Dictionary<PackType, List<VirtualPackItem>>();
-    Dictionary<PackType, ObjectPool<VirtualPackItem>> m_VirtualItemPool
-        = new Dictionary<PackType, ObjectPool<VirtualPackItem>>();
-    Dictionary<PackType, int> virtualPackCapacityDict = new Dictionary<PackType, int>();
+    // Dictionary<PackType, List<VirtualPackItem>> virtualPackItems
+    //     = new Dictionary<PackType, List<VirtualPackItem>>();
+    // Dictionary<PackType, ObjectPool<VirtualPackItem>> m_VirtualItemPool
+    //     = new Dictionary<PackType, ObjectPool<VirtualPackItem>>();
+    // Dictionary<PackType, int> virtualPackCapacityDict = new Dictionary<PackType, int>();
 
-    public event Action<PackType> virtualPackRefresh;
-    int getA206Count = 0;          //鏀跺埌浜嗗嚑娆206鍖�
-    bool isFrist = false;          //鏄笉鏄涓�娆¤幏寰楄仛榄傜鐗�
+    // public event Action<PackType> virtualPackRefresh;
+    // int getA206Count = 0;          //鏀跺埌浜嗗嚑娆206鍖�
     Dictionary<int, int> noPackItemCountDict = new Dictionary<int, int>();  //鏃犻渶鑳屽寘鐨勭墿鍝佹暟閲忓埛鏂帮紝鑷姩杞寲涓烘暟鍊�
     public event Action OnNoPackItemCountRefresh;
 
     public void OnBeforePlayerDataInitialize()
     {
-        foreach (var packType in virtualPackItems.Keys)
-        {
-            var pool = m_VirtualItemPool[packType];
-            var items = virtualPackItems[packType];
-            foreach (var item in items)
-            {
-                pool.Release(item);
-            }
-        }
-        virtualPackItems.Clear();
+        // foreach (var packType in virtualPackItems.Keys)
+        // {
+        //     var pool = m_VirtualItemPool[packType];
+        //     var items = virtualPackItems[packType];
+        //     foreach (var item in items)
+        //     {
+        //         pool.Release(item);
+        //     }
+        // }
+        // virtualPackItems.Clear();
         noPackItemCountDict.Clear();
-        getA206Count = 0;
-        isFrist = false;
     }
 
-    public void OnPlayerLoginOk()
-    {
-        isFrist = noPackItemCountDict.Count == 0;
-    }
 
     public override void Init()
     {
         base.Init();
         ParseConfig();
-        m_VirtualItemPool.Add(PackType.GatherSoul, new ObjectPool<VirtualPackItem>(OnGetItem, OnReleaseItem));
-        m_VirtualItemPool.Add(PackType.RunePack, new ObjectPool<VirtualPackItem>(OnGetItem, OnReleaseItem));
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
-        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
+        // m_VirtualItemPool.Add(PackType.GatherSoul, new ObjectPool<VirtualPackItem>(OnGetItem, OnReleaseItem));
+        // m_VirtualItemPool.Add(PackType.RunePack, new ObjectPool<VirtualPackItem>(OnGetItem, OnReleaseItem));
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitialize;
     }
 
     public override void Release()
     {
         base.Release();
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
-        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitialize;
     }
 
     void ParseConfig()
@@ -63,157 +54,157 @@
         // virtualPackCapacityDict.Add(PackType.RunePack, int.Parse(funcConfig.Numerical1));
     }
 
-    public bool IsVirtualPack(PackType packType)
-    {
-        switch (packType)
-        {
-            case PackType.GatherSoul:
-            case PackType.RunePack:
-                return true;
-        }
-        return false;
-    }
+    // public bool IsVirtualPack(PackType packType)
+    // {
+    //     switch (packType)
+    //     {
+    //         case PackType.GatherSoul:
+    //         case PackType.RunePack:
+    //             return true;
+    //     }
+    //     return false;
+    // }
 
-    public int GetPackCapacity(PackType packType)
-    {
-        if (virtualPackCapacityDict.ContainsKey(packType))
-        {
-            return virtualPackCapacityDict[packType];
-        }
-        return 0;
-    }
+    // public int GetPackCapacity(PackType packType)
+    // {
+    //     if (virtualPackCapacityDict.ContainsKey(packType))
+    //     {
+    //         return virtualPackCapacityDict[packType];
+    //     }
+    //     return 0;
+    // }
 
-    public int GetPackRemainCount(PackType packType)
-    {
-        var capacity = GetPackCapacity(packType);
-        return capacity - GetPackItemCount(packType);
-    }
+    // public int GetPackRemainCount(PackType packType)
+    // {
+    //     var capacity = GetPackCapacity(packType);
+    //     return capacity - GetPackItemCount(packType);
+    // }
 
-    public int GetPackItemCount(PackType packType)
-    {
-        if (virtualPackItems.ContainsKey(packType))
-        {
-            return virtualPackItems[packType].Count;
-        }
-        return 0;
-    }
+    // public int GetPackItemCount(PackType packType)
+    // {
+    //     if (virtualPackItems.ContainsKey(packType))
+    //     {
+    //         return virtualPackItems[packType].Count;
+    //     }
+    //     return 0;
+    // }
 
-    public int GetItemCountById(PackType packType, int id)
-    {
-        var count = 0;
-        List<int> list;
-        if (TryGetItems(packType, out list))
-        {
-            for (int i = 0; i < list.Count; i++)
-            {
-                VirtualPackItem item;
-                if (TryGetItem(packType, list[i], out item)
-                    && item.id == id)
-                {
-                    count++;
-                }
-            }
-        }
-        return count;
-    }
+    // public int GetItemCountById(PackType packType, int id)
+    // {
+    //     var count = 0;
+    //     List<int> list;
+    //     if (TryGetItems(packType, out list))
+    //     {
+    //         for (int i = 0; i < list.Count; i++)
+    //         {
+    //             VirtualPackItem item;
+    //             if (TryGetItem(packType, list[i], out item)
+    //                 && item.id == id)
+    //             {
+    //                 count++;
+    //             }
+    //         }
+    //     }
+    //     return count;
+    // }
 
-    public void GetItemIndexs(PackType packType, ref List<int> list)
-    {
-        list.Clear();
-        List<VirtualPackItem> _list;
-        if (virtualPackItems.TryGetValue(packType, out _list))
-        {
-            for (int i = 0; i < _list.Count; i++)
-            {
-                list.Add(_list[i].index);
-            }
-        }
-    }
+    // public void GetItemIndexs(PackType packType, ref List<int> list)
+    // {
+    //     list.Clear();
+    //     List<VirtualPackItem> _list;
+    //     if (virtualPackItems.TryGetValue(packType, out _list))
+    //     {
+    //         for (int i = 0; i < _list.Count; i++)
+    //         {
+    //             list.Add(_list[i].index);
+    //         }
+    //     }
+    // }
 
-    public bool TryGetItems(PackType packType, out List<int> list)
-    {
-        list = new List<int>();
-        List<VirtualPackItem> _list;
-        if (virtualPackItems.TryGetValue(packType, out _list))
-        {
-            for (int i = 0; i < _list.Count; i++)
-            {
-                list.Add(_list[i].index);
-            }
-            return true;
-        }
-        return false;
-    }
+    // public bool TryGetItems(PackType packType, out List<int> list)
+    // {
+    //     list = new List<int>();
+    //     List<VirtualPackItem> _list;
+    //     if (virtualPackItems.TryGetValue(packType, out _list))
+    //     {
+    //         for (int i = 0; i < _list.Count; i++)
+    //         {
+    //             list.Add(_list[i].index);
+    //         }
+    //         return true;
+    //     }
+    //     return false;
+    // }
 
-    public bool TryGetItem<T>(PackType packType, int packIndex, out T item) where T : VirtualPackItem
-    {
-        item = default(T);
-        if (virtualPackItems.ContainsKey(packType))
-        {
-            var _index = virtualPackItems[packType].FindIndex((x) =>
-                {
-                    return x.index == packIndex;
-                });
-            if (_index != -1)
-            {
-                item = virtualPackItems[packType][_index] as T;
-            }
-            return _index != -1;
-        }
-        return false;
-    }
+    // public bool TryGetItem<T>(PackType packType, int packIndex, out T item) where T : VirtualPackItem
+    // {
+    //     item = default(T);
+    //     if (virtualPackItems.ContainsKey(packType))
+    //     {
+    //         var _index = virtualPackItems[packType].FindIndex((x) =>
+    //             {
+    //                 return x.index == packIndex;
+    //             });
+    //         if (_index != -1)
+    //         {
+    //             item = virtualPackItems[packType][_index] as T;
+    //         }
+    //         return _index != -1;
+    //     }
+    //     return false;
+    // }
 
-    public void OnReceiveServerPack(HA204_tagMCVPackRefresh package)
-    {
-        var packType = (PackType)package.PackType;
-        if (!IsVirtualPack(packType))
-        {
-            return;
-        }
-        List<VirtualPackItem> list;
-        if (!virtualPackItems.TryGetValue(packType, out list))
-        {
-            list = new List<VirtualPackItem>();
-            virtualPackItems.Add(packType, list);
-        }
-        SetVirtualItem(packType, ref list, package.VPacklItemList);
-        if (virtualPackRefresh != null)
-        {
-            virtualPackRefresh((PackType)package.PackType);
-        }
+    // public void OnReceiveServerPack(HA204_tagMCVPackRefresh package)
+    // {
+    //     var packType = (PackType)package.PackType;
+    //     if (!IsVirtualPack(packType))
+    //     {
+    //         return;
+    //     }
+    //     List<VirtualPackItem> list;
+    //     if (!virtualPackItems.TryGetValue(packType, out list))
+    //     {
+    //         list = new List<VirtualPackItem>();
+    //         virtualPackItems.Add(packType, list);
+    //     }
+    //     SetVirtualItem(packType, ref list, package.VPacklItemList);
+    //     if (virtualPackRefresh != null)
+    //     {
+    //         virtualPackRefresh((PackType)package.PackType);
+    //     }
 
-    }
+    // }
 
-    public void OnReceiveServerPack(HA205_tagMCVPackClear package)
-    {
-        var packType = (PackType)package.PackType;
-        if (!IsVirtualPack(packType))
-        {
-            return;
-        }
-        List<VirtualPackItem> list;
-        if (virtualPackItems.TryGetValue(packType, out list))
-        {
-            var pool = m_VirtualItemPool[packType];
-            for (int i = 0; i < package.Count; i++)
-            {
-                var index = package.ItemPlaceList[i];
-                var items = list.FindAll((x) =>
-                {
-                    return x.index == index;
-                });
-                foreach (var item in items)
-                {
-                    list.Remove(item);
-                    pool.Release(item);
-                }
-            }
-            if (virtualPackRefresh != null)
-            {
-                virtualPackRefresh(packType);
-            }
-        }
-    }
+    // public void OnReceiveServerPack(HA205_tagMCVPackClear package)
+    // {
+    //     var packType = (PackType)package.PackType;
+    //     if (!IsVirtualPack(packType))
+    //     {
+    //         return;
+    //     }
+    //     List<VirtualPackItem> list;
+    //     if (virtualPackItems.TryGetValue(packType, out list))
+    //     {
+    //         var pool = m_VirtualItemPool[packType];
+    //         for (int i = 0; i < package.Count; i++)
+    //         {
+    //             var index = package.ItemPlaceList[i];
+    //             var items = list.FindAll((x) =>
+    //             {
+    //                 return x.index == index;
+    //             });
+    //             foreach (var item in items)
+    //             {
+    //                 list.Remove(item);
+    //                 pool.Release(item);
+    //             }
+    //         }
+    //         if (virtualPackRefresh != null)
+    //         {
+    //             virtualPackRefresh(packType);
+    //         }
+    //     }
+    // }
 
 
     public void UpdateAutoItemCountRefresh(HA206_tagMCAutoItemCountRefresh netPack)
@@ -243,46 +234,46 @@
 
 
 
-    void SetVirtualItem(PackType packType, ref List<VirtualPackItem> list, HA204_tagMCVPackRefresh.tagMCVPackItem[] items)
-    {
-        var pool = m_VirtualItemPool[packType];
-        for (int i = 0; i < items.Length; i++)
-        {
-            var item = list.Find((x) =>
-            {
-                return x.index == items[i].ItemPlace;
-            });
-            if (item != null)
-            {
-                item.Release();
-            }
-            else
-            {
-                if (pool.inactivedCount > 0)
-                {
-                    item = pool.Get();
-                    list.Add(item);
-                }
-            }
-            if (item == null)
-            {
-                item = VirtualPackItem.Get(packType);
-                list.Add(item);
-            }
-            item.ParsePackItem(items[i].ItemPlace, items[i].ItemData);
+    // void SetVirtualItem(PackType packType, ref List<VirtualPackItem> list, HA204_tagMCVPackRefresh.tagMCVPackItem[] items)
+    // {
+    //     var pool = m_VirtualItemPool[packType];
+    //     for (int i = 0; i < items.Length; i++)
+    //     {
+    //         var item = list.Find((x) =>
+    //         {
+    //             return x.index == items[i].ItemPlace;
+    //         });
+    //         if (item != null)
+    //         {
+    //             item.Release();
+    //         }
+    //         else
+    //         {
+    //             if (pool.inactivedCount > 0)
+    //             {
+    //                 item = pool.Get();
+    //                 list.Add(item);
+    //             }
+    //         }
+    //         if (item == null)
+    //         {
+    //             item = VirtualPackItem.Get(packType);
+    //             list.Add(item);
+    //         }
+    //         item.ParsePackItem(items[i].ItemPlace, items[i].ItemData);
 
-        }
-    }
+    //     }
+    // }
 
-    static void OnGetItem(VirtualPackItem item)
-    {
+    // static void OnGetItem(VirtualPackItem item)
+    // {
 
-    }
+    // }
 
-    static void OnReleaseItem(VirtualPackItem item)
-    {
-        item.Release();
-    }
+    // static void OnReleaseItem(VirtualPackItem item)
+    // {
+    //     item.Release();
+    // }
 }
 
 public abstract class VirtualPackItem
diff --git a/Main/System/Redpoint/MainRedDot.cs b/Main/System/Redpoint/MainRedDot.cs
index 06b1084..da94e4e 100644
--- a/Main/System/Redpoint/MainRedDot.cs
+++ b/Main/System/Redpoint/MainRedDot.cs
@@ -76,8 +76,11 @@
     Redpoint osGalaRedpoint = new Redpoint(RedPoint_OSGala);
 
     public const int RedPoint_Download = 116;
+    public Redpoint downLoadRedpoint = new Redpoint(MainRedDot.RedPoint_Download);
     //绾㈤
     public const int Redpoint_BeautyMM = 117;
+    //鍙ゅ疂
+    public const int RedPoint_GuaBao = 118;
     //姝﹀皢鍗�
     public const int HeroCardRedpoint = 200;
     public Redpoint HeroListRedpoint = new Redpoint(MainHerosRedpoint, HeroCardRedpoint);
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index 7054f07..7be73bb 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -837,6 +837,7 @@
     AutoFight = 20,//鑷姩鎴樻枟
     Recharge = 22,//鍏呭��
     PrivilegeCard = 25, //鐗规潈鍗�
+    GuaBao = 28, //鍙ゅ疂
     Horse = 37,  //鍧愰獞
     HeroAwake = 38, //姝﹀皢瑙夐啋
     BattlePass = 40, //鍩洪噾锛堟垬浠わ級
diff --git a/Main/Utility/UIHelper.cs b/Main/Utility/UIHelper.cs
index 3b2c1f3..8b6c868 100644
--- a/Main/Utility/UIHelper.cs
+++ b/Main/Utility/UIHelper.cs
@@ -817,6 +817,33 @@
     }
 
 
+    //鍔熻兘鍝佽川鏂囧瓧棰滆壊锛屽摢浜涘姛鑳界敱缇庢湳鍐冲畾锛岀洰鍓嶇敤浜庡彜瀹�
+    public static Color GetFuncQualityColor(int quality)
+    {
+
+        switch (quality)
+        {
+            case 1:
+                // bbd5ff
+                return new Color32(187, 213, 255, 255);
+            case 2:
+                // e4bbfe
+                return new Color32(228, 187, 254, 255);
+            case 3:
+                // f7eba4
+                return new Color32(247, 235, 164, 255);
+            case 4:
+                // ffc096
+                return new Color32(255, 192, 150, 255);
+            case 5:
+                // fe9896
+                return new Color32(254, 152, 150, 255);
+        }
+        return Color.white;
+    }
+
+
+
 
     //needName 鎸囧畼鑱�0鏄惁闇�瑕佸悕绉�
     public static string GetRealmName(int realmLv, bool bright = true, bool needName = false)

--
Gitblit v1.8.0