From cd093eb7b0e9dbcc0fba9a5e08b8b7e49d6e9072 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期三, 17 十二月 2025 11:45:48 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/HappyXB/HeroCallHopeWin.cs                                                 |  217 ++++++++++++
 Main/System/HappyXB/HeroCallHopeLineCell.cs                                            |   34 ++
 Main/Config/ConfigManager.cs                                                           |   60 +++
 Main/System/HappyXB/HeroCallWin.cs                                                     |   31 +
 Main/Config/Configs/TreasureItemLibConfig.cs                                           |    5 
 Main/System/HappyXB/HappyXBModel.Hero.cs                                               |  118 ++++++
 Main/System/HappyXB/HeroCallHopeSelectCell.cs.meta                                     |   11 
 Main/System/HeroUI/HeroHeadBaseNoTrainCell.cs                                          |  155 +++++++++
 Main/System/Equip/BlessLVManager.cs                                                    |   10 
 Main/System/HappyXB/HappyXBModel.cs                                                    |   25 +
 Main/System/HappyXB/HappyXBModel.Hero.cs.meta                                          |   11 
 Main/Core/NetworkPackage/ClientPack/CA5_Function/CA569_tagCSTreasureWishSelect.cs      |   22 +
 Main/System/HappyXB/HeroCallHopeAddCell.cs.meta                                        |   11 
 Main/System/HappyXB/HeroCallHopeAddCell.cs                                             |  108 ++++++
 Main/System/HappyXB/HeroCallHopeWin.cs.meta                                            |   11 
 Main/System/HeroUI/HeroHeadBaseNoTrainCell.cs.meta                                     |   11 
 Main/Config/PartialConfigs/TreasureItemLibConfig.cs                                    |   15 
 Main/System/HappyXB/HeroCallHopeLineCell.cs.meta                                       |   11 
 Main/Config/Configs/HeroConfig.cs                                                      |   21 
 Main/Core/NetworkPackage/ClientPack/CA5_Function/CA569_tagCSTreasureWishSelect.cs.meta |   11 
 Main/Config/Configs/TreasureSetConfig.cs                                               |   10 
 Main/System/HappyXB/HeroCallHopeSelectCell.cs                                          |   78 ++++
 22 files changed, 969 insertions(+), 17 deletions(-)

diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index c073e9a..97d68ae 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -40,10 +40,14 @@
         HashSet<Type> configTypes = new HashSet<Type>() {
             typeof(ADAwardConfig),
             typeof(BattleMapConfig),
+            typeof(ChestsAwardConfig),
+            typeof(CTGConfig),
             typeof(DailyTaskConfig),
+            typeof(DamageNumConfig),
             typeof(DirtyWordConfig),
             typeof(DungeonConfig),
             typeof(DungeonOpenTimeConfig),
+            typeof(FaceConfig),
             typeof(FamilyDonateConfig),
             typeof(FightPowerRatioConfig),
             typeof(FirstChargeConfig),
@@ -58,14 +62,28 @@
             typeof(ItemConfig),
             typeof(LineupRecommendConfig),
             typeof(LLMJConfig),
+            typeof(MainChapterConfig),
             typeof(MainLevelConfig),
             typeof(ModelConfig),
-            typeof(PlayerLVConfig),
+            typeof(NPCConfig),
+            typeof(NPCExConfig),
+            typeof(NPCLineupConfig),
+            typeof(OrderInfoConfig),
+            typeof(PlayerAttrConfig),
+            typeof(PlayerFaceConfig),
+            typeof(PriorBundleConfig),
             typeof(RandomNameConfig),
             typeof(SignInConfig),
+            typeof(StoreConfig),
+            typeof(SuccessConfig),
+            typeof(SysInfoConfig),
             typeof(TianziConfig),
             typeof(TitleConfig),
             typeof(TitleStarUpConfig),
+            typeof(TreasureSetConfig),
+            typeof(TreeLVConfig),
+            typeof(WindowSearchConfig),
+            typeof(XBGetItemConfig),
             typeof(ZhanlingConfig)
         };
 
@@ -220,14 +238,22 @@
         ClearConfigDictionary<ADAwardConfig>();
         // 娓呯┖ BattleMapConfig 瀛楀吀
         ClearConfigDictionary<BattleMapConfig>();
+        // 娓呯┖ ChestsAwardConfig 瀛楀吀
+        ClearConfigDictionary<ChestsAwardConfig>();
+        // 娓呯┖ CTGConfig 瀛楀吀
+        ClearConfigDictionary<CTGConfig>();
         // 娓呯┖ DailyTaskConfig 瀛楀吀
         ClearConfigDictionary<DailyTaskConfig>();
+        // 娓呯┖ DamageNumConfig 瀛楀吀
+        ClearConfigDictionary<DamageNumConfig>();
         // 娓呯┖ DirtyWordConfig 瀛楀吀
         ClearConfigDictionary<DirtyWordConfig>();
         // 娓呯┖ DungeonConfig 瀛楀吀
         ClearConfigDictionary<DungeonConfig>();
         // 娓呯┖ DungeonOpenTimeConfig 瀛楀吀
         ClearConfigDictionary<DungeonOpenTimeConfig>();
+        // 娓呯┖ FaceConfig 瀛楀吀
+        ClearConfigDictionary<FaceConfig>();
         // 娓呯┖ FamilyDonateConfig 瀛楀吀
         ClearConfigDictionary<FamilyDonateConfig>();
         // 娓呯┖ FightPowerRatioConfig 瀛楀吀
@@ -256,22 +282,50 @@
         ClearConfigDictionary<LineupRecommendConfig>();
         // 娓呯┖ LLMJConfig 瀛楀吀
         ClearConfigDictionary<LLMJConfig>();
+        // 娓呯┖ MainChapterConfig 瀛楀吀
+        ClearConfigDictionary<MainChapterConfig>();
         // 娓呯┖ MainLevelConfig 瀛楀吀
         ClearConfigDictionary<MainLevelConfig>();
         // 娓呯┖ ModelConfig 瀛楀吀
         ClearConfigDictionary<ModelConfig>();
-        // 娓呯┖ PlayerLVConfig 瀛楀吀
-        ClearConfigDictionary<PlayerLVConfig>();
+        // 娓呯┖ NPCConfig 瀛楀吀
+        ClearConfigDictionary<NPCConfig>();
+        // 娓呯┖ NPCExConfig 瀛楀吀
+        ClearConfigDictionary<NPCExConfig>();
+        // 娓呯┖ NPCLineupConfig 瀛楀吀
+        ClearConfigDictionary<NPCLineupConfig>();
+        // 娓呯┖ OrderInfoConfig 瀛楀吀
+        ClearConfigDictionary<OrderInfoConfig>();
+        // 娓呯┖ PlayerAttrConfig 瀛楀吀
+        ClearConfigDictionary<PlayerAttrConfig>();
+        // 娓呯┖ PlayerFaceConfig 瀛楀吀
+        ClearConfigDictionary<PlayerFaceConfig>();
+        // 娓呯┖ PriorBundleConfig 瀛楀吀
+        ClearConfigDictionary<PriorBundleConfig>();
         // 娓呯┖ RandomNameConfig 瀛楀吀
         ClearConfigDictionary<RandomNameConfig>();
         // 娓呯┖ SignInConfig 瀛楀吀
         ClearConfigDictionary<SignInConfig>();
+        // 娓呯┖ StoreConfig 瀛楀吀
+        ClearConfigDictionary<StoreConfig>();
+        // 娓呯┖ SuccessConfig 瀛楀吀
+        ClearConfigDictionary<SuccessConfig>();
+        // 娓呯┖ SysInfoConfig 瀛楀吀
+        ClearConfigDictionary<SysInfoConfig>();
         // 娓呯┖ TianziConfig 瀛楀吀
         ClearConfigDictionary<TianziConfig>();
         // 娓呯┖ TitleConfig 瀛楀吀
         ClearConfigDictionary<TitleConfig>();
         // 娓呯┖ TitleStarUpConfig 瀛楀吀
         ClearConfigDictionary<TitleStarUpConfig>();
+        // 娓呯┖ TreasureSetConfig 瀛楀吀
+        ClearConfigDictionary<TreasureSetConfig>();
+        // 娓呯┖ TreeLVConfig 瀛楀吀
+        ClearConfigDictionary<TreeLVConfig>();
+        // 娓呯┖ WindowSearchConfig 瀛楀吀
+        ClearConfigDictionary<WindowSearchConfig>();
+        // 娓呯┖ XBGetItemConfig 瀛楀吀
+        ClearConfigDictionary<XBGetItemConfig>();
         // 娓呯┖ ZhanlingConfig 瀛楀吀
         ClearConfigDictionary<ZhanlingConfig>();
     }
diff --git a/Main/Config/Configs/HeroConfig.cs b/Main/Config/Configs/HeroConfig.cs
index d06d937..e827a51 100644
--- a/Main/Config/Configs/HeroConfig.cs
+++ b/Main/Config/Configs/HeroConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           Friday, December 5, 2025
+//    [  Date ]:           Tuesday, December 16, 2025
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -35,6 +35,7 @@
 	public int[] FetterIDList;
 	public float UIScale;
 	public string Desc;
+	public int RecruitBySelf;
 	public int Specialty;
 	public int HurtType;
 	public int[] Specialty2;
@@ -112,17 +113,19 @@
 
 			Desc = tables[18];
 
-			int.TryParse(tables[19],out Specialty); 
+			int.TryParse(tables[19],out RecruitBySelf); 
 
-			int.TryParse(tables[20],out HurtType); 
+			int.TryParse(tables[20],out Specialty); 
 
-			if (tables[21].Contains("["))
+			int.TryParse(tables[21],out HurtType); 
+
+			if (tables[22].Contains("["))
 			{
-				Specialty2 = JsonMapper.ToObject<int[]>(tables[21]);
+				Specialty2 = JsonMapper.ToObject<int[]>(tables[22]);
 			}
 			else
 			{
-				string[] Specialty2StringArray = tables[21].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] Specialty2StringArray = tables[22].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				Specialty2 = new int[Specialty2StringArray.Length];
 				for (int i=0;i<Specialty2StringArray.Length;i++)
 				{
@@ -130,13 +133,13 @@
 				}
 			}
 
-			if (tables[22].Contains("["))
+			if (tables[23].Contains("["))
 			{
-				TalentList = JsonMapper.ToObject<int[]>(tables[22]);
+				TalentList = JsonMapper.ToObject<int[]>(tables[23]);
 			}
 			else
 			{
-				string[] TalentListStringArray = tables[22].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] TalentListStringArray = tables[23].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				TalentList = new int[TalentListStringArray.Length];
 				for (int i=0;i<TalentListStringArray.Length;i++)
 				{
diff --git a/Main/Config/Configs/TreasureItemLibConfig.cs b/Main/Config/Configs/TreasureItemLibConfig.cs
index ffda1c6..61758cf 100644
--- a/Main/Config/Configs/TreasureItemLibConfig.cs
+++ b/Main/Config/Configs/TreasureItemLibConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�8鏈�5鏃�
+//    [  Date ]:           2025骞�12鏈�16鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -20,6 +20,7 @@
 	public int LibID;
 	public int ItemID;
 	public int ItemCount;
+	public int WishOutCnt;
 
     public override int LoadKey(string _key)
     {
@@ -38,6 +39,8 @@
 			int.TryParse(tables[2],out ItemID); 
 
 			int.TryParse(tables[3],out ItemCount); 
+
+			int.TryParse(tables[4],out WishOutCnt); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/Configs/TreasureSetConfig.cs b/Main/Config/Configs/TreasureSetConfig.cs
index e305172..e839447 100644
--- a/Main/Config/Configs/TreasureSetConfig.cs
+++ b/Main/Config/Configs/TreasureSetConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�9鏈�4鏃�
+//    [  Date ]:           2025骞�12鏈�16鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -31,6 +31,8 @@
 	public Dictionary<int, int> GridNumMaxLimitInfo;
 	public int AwardMoneyType;
 	public int AwardMoneyValue;
+	public int WishOpen;
+	public Dictionary<int, int> WishLibSelect;
 	public string ProbabilityDisplay;
 
     public override int LoadKey(string _key)
@@ -109,7 +111,11 @@
 
 			int.TryParse(tables[14],out AwardMoneyValue); 
 
-			ProbabilityDisplay = tables[15];
+			int.TryParse(tables[15],out WishOpen); 
+
+			WishLibSelect = ConfigParse.ParseIntDict(tables[16]); 
+
+			ProbabilityDisplay = tables[17];
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/PartialConfigs/TreasureItemLibConfig.cs b/Main/Config/PartialConfigs/TreasureItemLibConfig.cs
index 8ed45e7..bf60ef3 100644
--- a/Main/Config/PartialConfigs/TreasureItemLibConfig.cs
+++ b/Main/Config/PartialConfigs/TreasureItemLibConfig.cs
@@ -5,6 +5,7 @@
 public partial class TreasureItemLibConfig : ConfigBase<int, TreasureItemLibConfig>
 {
     private static Dictionary<int, List<int>> resultDict = new Dictionary<int, List<int>>();
+    private static Dictionary<int, List<int>> resultWishIDDict = new Dictionary<int, List<int>>();
 	protected override void OnConfigParseCompleted()
     {
         if (!resultDict.ContainsKey(LibID))
@@ -15,6 +16,15 @@
         {
             resultDict[LibID].Add(ItemID);
         }
+
+        if (!resultWishIDDict.ContainsKey(LibID))
+        {
+            resultWishIDDict[LibID] = new List<int>();
+        }
+        if (WishOutCnt > 0)
+        {
+            resultWishIDDict[LibID].Add(ID);
+        }
     }
 
 
@@ -22,4 +32,9 @@
     {
         return resultDict[libID];
     }
+
+    public static List<int> GetWishIDList(int libID)
+    {
+        return resultWishIDDict[libID];
+    }
 }
diff --git a/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA569_tagCSTreasureWishSelect.cs b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA569_tagCSTreasureWishSelect.cs
new file mode 100644
index 0000000..5d774fb
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA569_tagCSTreasureWishSelect.cs
@@ -0,0 +1,22 @@
+using UnityEngine;
+using System.Collections;
+
+// A5 69 瀵诲疂蹇冩効鐗╁搧閫夋嫨 #tagCSTreasureWishSelect
+
+public class CA569_tagCSTreasureWishSelect : GameNetPackBasic {
+    public byte TreasureType;    //瀵诲疂绫诲瀷
+    public byte WishCnt;
+    public  uint[] WishIDList;    // 閫夋嫨鐨勫瀹濈墿鍝佸簱涓殑鏁版嵁ID锛屾敞鎰忎笉鏄簱ID
+
+    public CA569_tagCSTreasureWishSelect () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA569;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (TreasureType, NetDataType.BYTE);
+        WriteBytes (WishCnt, NetDataType.BYTE);
+        WriteBytes (WishIDList, NetDataType.DWORD, WishCnt);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA569_tagCSTreasureWishSelect.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA569_tagCSTreasureWishSelect.cs.meta
new file mode 100644
index 0000000..e437a5c
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA569_tagCSTreasureWishSelect.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 6e1a5a03a70ad654a962dc171c579f0b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Equip/BlessLVManager.cs b/Main/System/Equip/BlessLVManager.cs
index 5861a29..4ea6914 100644
--- a/Main/System/Equip/BlessLVManager.cs
+++ b/Main/System/Equip/BlessLVManager.cs
@@ -38,6 +38,7 @@
         m_LVPackTime = 0;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOK;
         GlobalTimeEvent.Instance.fiveSecondEvent += OnTimeEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefresh;
 
         ParseConfig();
     }
@@ -46,6 +47,7 @@
     {
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOK;
         GlobalTimeEvent.Instance.fiveSecondEvent -= OnTimeEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefresh;
     }
 
     void OnPlayerLoginOK()
@@ -148,6 +150,14 @@
         }
     }
 
+    public void OnPlayerDataRefresh(PlayerDataType type)
+    {
+        if (type == PlayerDataType.default33)
+        {
+            UpdateTreeRedpoint();
+        }
+    }
+
     public void AutoUpgrade()
     {
         //鏃堕棿缁撴潫鑷姩閫氱煡鏈嶅姟绔崌绾э紝鎴栬�呮墦寮�鐣岄潰鏃讹紝鎴栬�呬笂绾� 閮藉仛妫�鏌�
diff --git a/Main/System/HappyXB/HappyXBModel.Hero.cs b/Main/System/HappyXB/HappyXBModel.Hero.cs
new file mode 100644
index 0000000..de0b77c
--- /dev/null
+++ b/Main/System/HappyXB/HappyXBModel.Hero.cs
@@ -0,0 +1,118 @@
+锘縰sing LitJson;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+//姝﹀皢鐩稿叧鎷涘嫙
+public partial class HappyXBModel : GameSystemManager<HappyXBModel>
+{
+    public const int XBHeroCallSH_RedKey = 20303;    //姝﹀皢蹇冩効绁炶瘽 鏄惁閫夋嫨
+    public const int XBHeroCallCS_RedKey = 20304;    //姝﹀皢蹇冩効浼犺 鏄惁閫夋嫨
+    public Redpoint shWishRedpoint = new Redpoint(HappyXB_RedKey, XBHeroCallSH_RedKey);
+    public Redpoint csWishRedpoint = new Redpoint(HappyXB_RedKey, XBHeroCallCS_RedKey);
+
+    public const int wishMaxOutCnt = 1; //蹇冩効鏈�澶у嚭璐ф暟閲忥紝绁炶瘽/浼犺鍚勫嚭涓�娆�
+    public int selectWishQuality = 5; //蹇冩効閫変腑鐨勫搧璐�
+
+
+    public int selectSHHeroWishID = 0;  //蹇冩効閫変腑鐨勭璇濇灏嗗績鎰縄D 瀹㈡埛绔�  -1浠h〃鍙栨秷
+    public int selectCSHeroWishID = 0;  //蹇冩効閫変腑鐨勪紶璇存灏嗗績鎰縄D 瀹㈡埛绔�  -1浠h〃鍙栨秷
+
+    public Action OnSelectWishHeroEvent;
+
+    public int selectWishListTab = 0;  //0:绁炶瘽 1:浼犺  鐣岄潰鏍囩閫夋嫨
+
+
+    //蹇冩効閫変腑鐨勬灏咺D
+    public bool TryGetHeroWishIDByQuality(int type, int quality, out int wishID, out int wishCnt)
+    {
+        wishID = 0;
+        wishCnt = 0;
+        var data = GetXBInfoByType((int)HappXBTitle.HeroCallAdvanced);
+        if (data == null || data.wishCntDict.IsNullOrEmpty())
+        {
+            return false;
+        }
+        foreach (var id in data.wishCntDict.Keys)
+        {
+            if (id == 0)
+            {
+                continue;
+            }
+            if (HeroConfig.Get(TreasureItemLibConfig.Get(id).ItemID).Quality == quality)
+            {
+                wishID = id;
+                wishCnt = data.wishCntDict[id];
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public bool IsTodayWishFinish()
+    {
+        var data = GetXBInfoByType((int)HappXBTitle.HeroCallAdvanced);
+        if (data == null || data.wishCntDict.IsNullOrEmpty())
+        {
+            return false;
+        }
+        int wishCnt = 0;
+        foreach (var id in data.wishCntDict.Keys)
+        {
+            if (id == 0)
+            {
+                continue;
+            }
+            wishCnt += data.wishCntDict[id];
+        }
+        if (wishCnt >= wishMaxOutCnt*2)
+        {
+            return true;
+        }
+        return false;
+    }
+
+
+
+    //蹇冩効绾㈢偣锛屾湭鍒嗛厤鐨勯渶瑕佺孩鐐�
+    void UpdateWishRedpoint()
+    {
+        shWishRedpoint.state = RedPointState.None;
+        csWishRedpoint.state = RedPointState.None;
+
+
+        var data = GetXBInfoByType((int)HappXBTitle.HeroCallAdvanced);
+        if (data == null)
+        {
+            return;
+        }
+        var config = TreasureSetConfig.Get((int)HappXBTitle.HeroCallAdvanced);
+        var needOpenCnt = config.WishOpen - data.treasureCount;
+        if (needOpenCnt > 0)
+        {
+            return;
+        }
+
+        if (data.wishCntDict.IsNullOrEmpty())
+        {
+            shWishRedpoint.state = RedPointState.Simple;
+            csWishRedpoint.state = RedPointState.Simple;
+            return;
+        }
+
+        int wishID = 0;
+        int wishCnt = 0;
+        if (!TryGetHeroWishIDByQuality((int)HappXBTitle.HeroCallAdvanced, 5, out wishID, out wishCnt))
+        {
+            shWishRedpoint.state = RedPointState.Simple;
+        }
+
+        if (!TryGetHeroWishIDByQuality((int)HappXBTitle.HeroCallAdvanced, 4, out wishID, out wishCnt))
+        {
+            csWishRedpoint.state = RedPointState.Simple;
+        }
+
+    }
+}
diff --git a/Main/System/HappyXB/HappyXBModel.Hero.cs.meta b/Main/System/HappyXB/HappyXBModel.Hero.cs.meta
new file mode 100644
index 0000000..2fc9c1b
--- /dev/null
+++ b/Main/System/HappyXB/HappyXBModel.Hero.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: b44ecdb2a98211746a0b190bf0c08ae7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/HappyXB/HappyXBModel.cs b/Main/System/HappyXB/HappyXBModel.cs
index 7d072a4..509a342 100644
--- a/Main/System/HappyXB/HappyXBModel.cs
+++ b/Main/System/HappyXB/HappyXBModel.cs
@@ -6,7 +6,7 @@
 using UnityEngine;
 
 
-public class HappyXBModel : GameSystemManager<HappyXBModel>
+public partial class HappyXBModel : GameSystemManager<HappyXBModel>
 {
     //瀵诲疂浜у嚭搴�
     private Dictionary<int, Dictionary<int, XBGetItemConfig>> xbGetItemDict = new Dictionary<int, Dictionary<int, XBGetItemConfig>>(); //濂栨睜鐨勬墍鏈夌墿鍝侊紙鎸夌被鍨�+绛夌骇锛�
@@ -214,6 +214,18 @@
                     int cnt = info.TreasuerInfoList[i].GridLimitCntList[j].GridCnt;
                     typeInfo.gridLimitCntDict[num] = cnt;
                 }
+                if (typeInfo.wishCntDict == null)
+                {
+                    typeInfo.wishCntDict = new Dictionary<int, int>();
+                }
+                typeInfo.wishCntDict.Clear();
+                for (int j = 0; j < info.TreasuerInfoList[i].WishCnt; j++)
+                {
+                    int num = info.TreasuerInfoList[i].WishList[j].WishID;
+                    int cnt = info.TreasuerInfoList[i].WishList[j].OutCnt;
+                    typeInfo.wishCntDict[num] = cnt;
+                }
+
                 xbTypeInfoDict.Add(info.TreasuerInfoList[i].TreasureType, typeInfo);
             }
             else
@@ -230,6 +242,14 @@
                     int num = info.TreasuerInfoList[i].GridLimitCntList[j].GridNum;
                     int cnt = info.TreasuerInfoList[i].GridLimitCntList[j].GridCnt;
                     xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].gridLimitCntDict[num] = cnt;
+                }
+                
+                xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].wishCntDict.Clear();
+                for (int j = 0; j < info.TreasuerInfoList[i].WishCnt; j++)
+                {
+                    int num = info.TreasuerInfoList[i].WishList[j].WishID;
+                    int cnt = info.TreasuerInfoList[i].WishList[j].OutCnt;
+                    xbTypeInfoDict[info.TreasuerInfoList[i].TreasureType].wishCntDict[num] = cnt;
                 }
             }
         }
@@ -597,6 +617,8 @@
         if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Hero))
             return;
 
+        UpdateWishRedpoint();
+
         // 鍏嶈垂 10杩� 绉垎
         bestXB10Red.state = RedPointState.None;
         bestXBFreeRed.state = RedPointState.None;
@@ -648,6 +670,7 @@
     public int treasureCountToday;        //浠婃棩宸插瀹濇�绘鏁�
     public int treasureCntAward;        //绱瀵诲疂娆℃暟瀵瑰簲濂栧姳棰嗗鐘舵�侊紝鎸夊鍔辫褰曠储寮曚簩杩涘埗璁板綍鏄惁宸查鍙�
     public Dictionary<int, int> gridLimitCntDict;        //<鏈夐檺鍒舵娊鍙栨鏁扮殑鏍煎瓙缂栧彿,宸叉娊鍒版鏁�> 鏈夐檺鍒舵娊鍙栨鏁扮殑鏍煎瓙娆℃暟淇℃伅
+    public Dictionary<int, int> wishCntDict;        //蹇冩効鎶藉彇鎯呭喌 <蹇冩効ID,宸叉娊鍒版鏁�>
 }
 
 
diff --git a/Main/System/HappyXB/HeroCallHopeAddCell.cs b/Main/System/HappyXB/HeroCallHopeAddCell.cs
new file mode 100644
index 0000000..34ce3fa
--- /dev/null
+++ b/Main/System/HappyXB/HeroCallHopeAddCell.cs
@@ -0,0 +1,108 @@
+using UnityEngine;
+using UnityEngine.Events;
+using UnityEngine.UI;
+
+
+public class HeroCallHopeAddCell : MonoBehaviour
+{
+    [SerializeField] HeroHeadBaseNoTrainCell head;
+    [SerializeField] Image notOpenImg;
+    [SerializeField] Image addImg;
+    [SerializeField] Button addBtn;
+
+
+
+    public void Display(int quality, UnityAction<int> addAction = null, UnityAction<int> heroAction = null, int changeHeroID = 0)
+    {
+        var data = HappyXBModel.Instance.GetXBInfoByType((int)HappXBTitle.HeroCallAdvanced);
+        var config = TreasureSetConfig.Get((int)HappXBTitle.HeroCallAdvanced);
+        var needOpenCnt = config.WishOpen - data.treasureCount;
+
+
+        int wishID = 0;
+        int wishCnt = 0;
+        int heroID = 0;
+        if (needOpenCnt <= 0)
+        {
+            notOpenImg.SetActive(false);
+            
+
+            if (HappyXBModel.Instance.TryGetHeroWishIDByQuality((int)HappXBTitle.HeroCallAdvanced, quality, out wishID, out wishCnt))
+            {
+                if (heroAction == null)
+                {
+                    heroAction = (quality) =>
+                    {
+                        if (HappyXBModel.Instance.IsTodayWishFinish())
+                        {
+                            SysNotifyMgr.Instance.ShowTip("HeroWishFinish");
+                            return;
+                        }
+
+                        UIManager.Instance.OpenWindow<HeroCallHopeWin>(quality == 4 ? 1 : 0);
+                    };
+                }
+
+                heroID = TreasureItemLibConfig.Get(wishID).ItemID;
+
+            }
+            if (changeHeroID > 0)
+            {
+                //棰勮
+                heroID = changeHeroID;
+            }
+            else if (changeHeroID == -1)
+            {
+                //鍙栨秷棰勮
+                heroID = 0;
+            }
+            if (heroID > 0)
+            {
+                head.SetActive(true);
+                addImg.SetActive(false);
+                head.Init(heroID, wishCnt >= HappyXBModel.wishMaxOutCnt, ()=> { heroAction.Invoke(quality); });
+            }
+            else
+            {
+                head.SetActive(false);
+                addImg.SetActive(true);
+            }
+        }
+        else
+        {
+            notOpenImg.SetActive(true);
+            addImg.SetActive(false);
+            head.SetActive(false);
+        }
+
+
+
+
+        if (addAction == null)
+        {
+            addBtn.AddListener(() =>
+            {
+                if (needOpenCnt <= 0)
+                {
+                    if (HappyXBModel.Instance.IsTodayWishFinish())
+                    {
+                        SysNotifyMgr.Instance.ShowTip("HeroWishFinish");
+                        return;
+                    }
+                    UIManager.Instance.OpenWindow<HeroCallHopeWin>(quality == 4 ? 1 : 0);
+                    return;
+                }
+                else
+                {
+                    SysNotifyMgr.Instance.ShowTip("HeroWishCallOpen", needOpenCnt);
+                }
+            });
+        }
+        else
+        {
+            addBtn.AddListener(()=> { addAction.Invoke(quality); });
+        }
+    }
+
+}
+
diff --git a/Main/System/HappyXB/HeroCallHopeAddCell.cs.meta b/Main/System/HappyXB/HeroCallHopeAddCell.cs.meta
new file mode 100644
index 0000000..14676d5
--- /dev/null
+++ b/Main/System/HappyXB/HeroCallHopeAddCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 03f46fdaedeebd148921ae2997a40299
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/HappyXB/HeroCallHopeLineCell.cs b/Main/System/HappyXB/HeroCallHopeLineCell.cs
new file mode 100644
index 0000000..c5d4e35
--- /dev/null
+++ b/Main/System/HappyXB/HeroCallHopeLineCell.cs
@@ -0,0 +1,34 @@
+using UnityEngine;
+using UnityEngine.Events;
+using UnityEngine.UI;
+
+
+public class HeroCallHopeLineCell : CellView
+{
+    [SerializeField] HeroCallHopeSelectCell[] heads;
+
+
+
+    public void Display(int libID, int index)
+    {
+        var list = TreasureItemLibConfig.GetWishIDList(libID);
+        if (list == null || list.Count == 0)
+        {
+            return;
+        }
+        for (int i = 0; i < heads.Length; i++)
+        {
+            if (index + i < list.Count)
+            {
+                heads[i].SetActive(true);
+                heads[i].Display(list[index + i]);
+            }
+            else
+            {
+                heads[i].SetActive(false);
+            }
+        }
+    }
+
+}
+
diff --git a/Main/System/HappyXB/HeroCallHopeLineCell.cs.meta b/Main/System/HappyXB/HeroCallHopeLineCell.cs.meta
new file mode 100644
index 0000000..25ded63
--- /dev/null
+++ b/Main/System/HappyXB/HeroCallHopeLineCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e75e54662e5a2ce41ab610f286b3638f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/HappyXB/HeroCallHopeSelectCell.cs b/Main/System/HappyXB/HeroCallHopeSelectCell.cs
new file mode 100644
index 0000000..c348372
--- /dev/null
+++ b/Main/System/HappyXB/HeroCallHopeSelectCell.cs
@@ -0,0 +1,78 @@
+using UnityEngine;
+using UnityEngine.Events;
+using UnityEngine.UI;
+
+
+public class HeroCallHopeSelectCell : MonoBehaviour
+{
+    [SerializeField] HeroHeadBaseNoTrainCell head;
+    [SerializeField] Image selectImg;
+    [SerializeField] Transform lockImg;
+
+
+
+    public void Display(int wishID)
+    {
+        var config = TreasureItemLibConfig.Get(wishID);
+        if (config == null)
+        {
+            return;
+        }
+        head.SetActive(true);
+        bool isActive = true;
+        if (HeroConfig.Get(config.ItemID).RecruitBySelf == 1 && HeroUIManager.Instance.GetHeroBookState(config.ItemID, 0) == 0)
+        {
+            isActive = false;
+        }
+        lockImg.SetActive(!isActive);
+
+        var selectID = HappyXBModel.Instance.selectWishListTab == 0 ? HappyXBModel.Instance.selectSHHeroWishID : HappyXBModel.Instance.selectCSHeroWishID;
+        selectImg.SetActive(config.ID == selectID);
+
+        head.Init(config.ItemID, false, ()=>
+        {
+            if (!isActive)
+            {
+                SysNotifyMgr.Instance.ShowTip("HeroWishUnLock");
+                return;
+            }
+            int quality = HappyXBModel.Instance.selectWishListTab == 0 ? 5 : 4;
+            if (HappyXBModel.Instance.TryGetHeroWishIDByQuality((int)HappXBTitle.HeroCallAdvanced, quality, out int _wishID, out int _wishCnt))
+            {
+                if (_wishCnt >= HappyXBModel.wishMaxOutCnt)
+                {
+                    SysNotifyMgr.Instance.ShowTip("HeroWishFinish");
+                    return;
+                }
+            }
+
+            //-1浠h〃鍙栨秷
+
+            if (HappyXBModel.Instance.selectWishListTab == 0)
+            {
+                if (HappyXBModel.Instance.selectSHHeroWishID == wishID)
+                {
+                    HappyXBModel.Instance.selectSHHeroWishID = -1;
+                }
+                else
+                {
+                    HappyXBModel.Instance.selectSHHeroWishID = wishID;
+                }
+            }
+            else
+            {
+                if (HappyXBModel.Instance.selectCSHeroWishID == wishID)
+                {
+                    HappyXBModel.Instance.selectCSHeroWishID = -1;
+                }
+                else
+                {
+                    HappyXBModel.Instance.selectCSHeroWishID = wishID;
+                }
+            }
+            HappyXBModel.Instance.OnSelectWishHeroEvent?.Invoke();
+        });
+    }
+
+}
+
diff --git a/Main/System/HappyXB/HeroCallHopeSelectCell.cs.meta b/Main/System/HappyXB/HeroCallHopeSelectCell.cs.meta
new file mode 100644
index 0000000..9980711
--- /dev/null
+++ b/Main/System/HappyXB/HeroCallHopeSelectCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: de3fbdcb1649eef4389f255bdbf6a1c5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/HappyXB/HeroCallHopeWin.cs b/Main/System/HappyXB/HeroCallHopeWin.cs
new file mode 100644
index 0000000..55a5035
--- /dev/null
+++ b/Main/System/HappyXB/HeroCallHopeWin.cs
@@ -0,0 +1,217 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 鎷涘嫙蹇冩効
+/// </summary>
+public class HeroCallHopeWin : UIBase
+{
+    [SerializeField] HeroCallHopeAddCell shHero;
+    [SerializeField] HeroCallHopeAddCell csHero;
+    [SerializeField] Text tip;
+    [SerializeField] ScrollerController scroller;
+    [SerializeField] GroupButtonEx shBtn;
+    [SerializeField] GroupButtonEx csBtn;
+    [SerializeField] Button cancleBtn;
+    [SerializeField] Button confirmBtn;
+
+
+    
+    Dictionary<int, int> qualityLibIDDict = new Dictionary<int, int>()
+    {
+        { 0, 105 },
+        { 1, 104 }
+    };
+
+
+    protected override void InitComponent()
+    {
+        cancleBtn.AddListener(CloseWindow);
+        confirmBtn.AddListener(SendSelectHero);
+        shBtn.AddListener(()=>
+        {
+            HappyXBModel.Instance.selectWishListTab = 0;
+            Display();
+        });
+        csBtn.AddListener(()=>
+        {
+            HappyXBModel.Instance.selectWishListTab = 1;
+            Display();
+        });
+    }
+
+
+    protected override void OnPreOpen()
+    {
+        HappyXBModel.Instance.selectWishListTab = functionOrder;
+        HappyXBModel.Instance.RefreshXBTypeInfoAct += RefreshXBTypeInfo;
+        HappyXBModel.Instance.OnSelectWishHeroEvent += OnSelectWishHeroEvent;
+        scroller.OnRefreshCell += OnRefreshCell;
+        HappyXBModel.Instance.TryGetHeroWishIDByQuality((int)HappXBTitle.HeroCallAdvanced, 5, out HappyXBModel.Instance.selectSHHeroWishID, out int shWishCnt);
+        HappyXBModel.Instance.TryGetHeroWishIDByQuality((int)HappXBTitle.HeroCallAdvanced, 4, out HappyXBModel.Instance.selectCSHeroWishID, out int csWishCnt);
+        
+        tip.text = Language.Get("HeroCall7", HappyXBModel.wishMaxOutCnt);
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        HappyXBModel.Instance.RefreshXBTypeInfoAct -= RefreshXBTypeInfo;
+        scroller.OnRefreshCell -= OnRefreshCell;
+        HappyXBModel.Instance.OnSelectWishHeroEvent -= OnSelectWishHeroEvent;
+    }
+
+    void Display()
+    {
+        int shHeroID = 0;
+        if (HappyXBModel.Instance.selectSHHeroWishID == -1)
+        {
+            shHeroID = -1;
+        }
+        else if (HappyXBModel.Instance.selectSHHeroWishID == 0)
+        {
+            shHeroID = 0;
+        }
+        else
+        {
+            shHeroID = TreasureItemLibConfig.Get(HappyXBModel.Instance.selectSHHeroWishID).ItemID;
+        }
+
+        int csHeroID = 0;
+        if (HappyXBModel.Instance.selectCSHeroWishID == -1)
+        {
+            csHeroID = -1;
+        }
+        else if (HappyXBModel.Instance.selectCSHeroWishID == 0)
+        {
+            csHeroID = 0;
+        }
+        else
+        {
+            csHeroID = TreasureItemLibConfig.Get(HappyXBModel.Instance.selectCSHeroWishID).ItemID;
+        }
+
+        shHero.Display(5, AddHero, ShowHeroTip, shHeroID);
+        csHero.Display(4, AddHero, ShowHeroTip, csHeroID);
+
+        CreateScroller();
+
+        if (HappyXBModel.Instance.selectWishListTab == 0)
+        {
+            shBtn.SelectBtn();
+        }
+        else
+        {
+            csBtn.SelectBtn();
+        }
+    }
+
+
+    void CreateScroller()
+    {
+        int libID = qualityLibIDDict[HappyXBModel.Instance.selectWishListTab];
+        if (!TreasureSetConfig.Get((int)HappXBTitle.HeroCallAdvanced).WishLibSelect.ContainsKey(libID))
+        {
+            Debug.LogError("瀵诲疂搴揑D鍙樻洿锛岀▼搴忚鏍稿qualityLibIDDict");
+            return;
+        }
+        scroller.Refresh();
+        var list = TreasureItemLibConfig.GetWishIDList(libID);
+        for (int i = 0; i < list.Count; i++)
+        {
+            if (i % 5 == 0)
+            {
+                scroller.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        scroller.Restart();
+    }
+
+
+
+    void AddHero(int quality)
+    {
+        SysNotifyMgr.Instance.ShowTip("HeroWishAdd");
+        HappyXBModel.Instance.selectWishListTab = quality == 4 ? 1 : 0;
+
+        Display();
+    }
+
+    void ShowHeroTip(int quality)
+    {
+        ItemTipUtility.Show(quality == 4 ? TreasureItemLibConfig.Get(HappyXBModel.Instance.selectCSHeroWishID).ItemID : 
+        TreasureItemLibConfig.Get(HappyXBModel.Instance.selectSHHeroWishID).ItemID);
+    }
+
+    void RefreshXBTypeInfo()
+    {
+        HappyXBModel.Instance.TryGetHeroWishIDByQuality((int)HappXBTitle.HeroCallAdvanced, 5, out HappyXBModel.Instance.selectSHHeroWishID, out int shWishCnt);
+        HappyXBModel.Instance.TryGetHeroWishIDByQuality((int)HappXBTitle.HeroCallAdvanced, 4, out HappyXBModel.Instance.selectCSHeroWishID, out int csWishCnt);
+        Display();
+    }
+
+    void OnSelectWishHeroEvent()
+    {
+        int shHeroID = 0;
+        if (HappyXBModel.Instance.selectSHHeroWishID == -1)
+        {
+            shHeroID = -1;
+        }
+        else if (HappyXBModel.Instance.selectSHHeroWishID == 0)
+        {
+            shHeroID = 0;
+        }
+        else
+        {
+            shHeroID = TreasureItemLibConfig.Get(HappyXBModel.Instance.selectSHHeroWishID).ItemID;
+        }
+
+        int csHeroID = 0;
+        if (HappyXBModel.Instance.selectCSHeroWishID == -1)
+        {
+            csHeroID = -1;
+        }
+        else if (HappyXBModel.Instance.selectCSHeroWishID == 0)
+        {
+            csHeroID = 0;
+        }
+        else
+        {
+            csHeroID = TreasureItemLibConfig.Get(HappyXBModel.Instance.selectCSHeroWishID).ItemID;
+        }
+
+        shHero.Display(5, AddHero, ShowHeroTip, shHeroID);
+        csHero.Display(4, AddHero, ShowHeroTip, csHeroID);
+        scroller.m_Scorller.RefreshActiveCellViews();
+    }
+
+
+    void SendSelectHero()
+    {
+        if (HappyXBModel.Instance.selectSHHeroWishID == 0 && HappyXBModel.Instance.selectCSHeroWishID == 0)
+        {
+            SysNotifyMgr.Instance.ShowTip("HeroWishAdd");
+            return;
+        }
+        var pack = new CA569_tagCSTreasureWishSelect();
+        pack.TreasureType = (int)HappXBTitle.HeroCallAdvanced;
+
+        
+        pack.WishIDList = new uint[] { (uint)Math.Max(0, HappyXBModel.Instance.selectSHHeroWishID), (uint)Math.Max(0, HappyXBModel.Instance.selectCSHeroWishID) };
+        pack.WishCnt = 2;
+        GameNetSystem.Instance.SendInfo(pack);
+        CloseWindow();
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<HeroCallHopeLineCell>();
+        _cell.Display(qualityLibIDDict[HappyXBModel.Instance.selectWishListTab], cell.index);
+
+    }
+    
+
+}
\ No newline at end of file
diff --git a/Main/System/HappyXB/HeroCallHopeWin.cs.meta b/Main/System/HappyXB/HeroCallHopeWin.cs.meta
new file mode 100644
index 0000000..5773220
--- /dev/null
+++ b/Main/System/HappyXB/HeroCallHopeWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 171ff86eed580f34fa0215bd6f14648d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/HappyXB/HeroCallWin.cs b/Main/System/HappyXB/HeroCallWin.cs
index c056fb5..f93f84d 100644
--- a/Main/System/HappyXB/HeroCallWin.cs
+++ b/Main/System/HappyXB/HeroCallWin.cs
@@ -25,6 +25,14 @@
     [SerializeField] Button closeBtn;
     [SerializeField] Text callTip;
 
+    //蹇冩効
+    [SerializeField] Text openXYTip;
+    [SerializeField] HeroCallHopeAddCell shHero;
+    [SerializeField] HeroCallHopeAddCell csHero;
+
+    //鐗规潈淇濆簳
+    [SerializeField] Text openPrivilegeTip;
+
 
     protected override void InitComponent()
     {
@@ -56,15 +64,22 @@
     protected override void OnPreOpen()
     {
         HappyXBModel.Instance.RefreshXBTypeInfoAct += Refresh;
+        InvestModel.Instance.onInvestUpdate += OnInvestUpdate;
         skipToggle.isOn = LocalSave.GetBool(HeroUIManager.skipKey + PlayerDatas.Instance.baseData.PlayerID, false);
         Refresh();
+        openPrivilegeTip.SetActive(!InvestModel.Instance.IsInvested(InvestModel.foreverCardType));
     }
 
     protected override void OnPreClose()
     {
         HappyXBModel.Instance.RefreshXBTypeInfoAct -= Refresh;
+        InvestModel.Instance.onInvestUpdate -= OnInvestUpdate;
     }
 
+    void OnInvestUpdate(int type)
+    {
+        openPrivilegeTip.SetActive(!InvestModel.Instance.IsInvested(InvestModel.foreverCardType));
+    }
 
     public override void Refresh()
     {
@@ -74,7 +89,7 @@
         call1ItemIcon.SetOrgSprite(IconKey);
         call10ItemIcon.SetOrgSprite(IconKey);
         var itemCount = PackManager.Instance.GetItemCountByID(PackType.Item, funcSet.CostItemID);
-        
+
         int todayFreeCount = HappyXBModel.Instance.GetFreeCountToday((int)HappXBTitle.HeroCallAdvanced);
         int dayMaxCount = HappyXBModel.Instance.GetDailyFreeCount((int)HappXBTitle.HeroCallAdvanced);
         if (todayFreeCount < dayMaxCount)
@@ -109,6 +124,7 @@
             qualityStrList.Add(UIHelper.AppendColor(qualityList[i], Language.Get("L1039", Language.Get("CommonQuality" + qualityList[i]))));
         }
         callTip.text = Language.Get("HeroCall6", needCount, string.Join(Language.Get("L1130"), qualityStrList.ToArray()));
+        ShowWish();
     }
 
     //姣忕鍒锋柊鍏嶈垂CD鐨勫�掕鏃�
@@ -151,4 +167,17 @@
         }
     }
 
+
+    void ShowWish()
+    {
+        var data = HappyXBModel.Instance.GetXBInfoByType((int)HappXBTitle.HeroCallAdvanced);
+        var config = TreasureSetConfig.Get((int)HappXBTitle.HeroCallAdvanced);
+        var needOpenCnt = config.WishOpen - data.treasureCount;
+
+        openXYTip.SetActive(needOpenCnt > 0);
+        openXYTip.text = Language.Get("HeroCall10", needOpenCnt);
+        shHero.Display(5);
+        csHero.Display(4);
+    }
+
 }
\ No newline at end of file
diff --git a/Main/System/HeroUI/HeroHeadBaseNoTrainCell.cs b/Main/System/HeroUI/HeroHeadBaseNoTrainCell.cs
new file mode 100644
index 0000000..085120e
--- /dev/null
+++ b/Main/System/HeroUI/HeroHeadBaseNoTrainCell.cs
@@ -0,0 +1,155 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+using UnityEngine.Events;
+using System.Collections.Generic;
+
+public class HeroHeadBaseNoTrainCell : MonoBehaviour
+{
+
+    Button m_ClickBtn;
+    Button clickBtn
+    {
+        get
+        {
+            if (m_ClickBtn == null)
+            {
+                m_ClickBtn = this.transform.GetComponent<Button>("Container_HeadCell");
+            }
+            return m_ClickBtn;
+        }
+    }
+
+    Image m_QualityBG;
+    Image qualityBG
+    {
+        get
+        {
+            if (m_QualityBG == null)
+            {
+                m_QualityBG = this.transform.GetComponent<Image>("Container_HeadCell/qualityIcon");
+            }
+            return m_QualityBG;
+        }
+    }
+
+    ImageEx m_HeroIcon;
+    ImageEx heroIcon
+    {
+        get
+        {
+            if (m_HeroIcon == null)
+            {
+                m_HeroIcon = this.transform.GetComponent<ImageEx>("Container_HeadCell/heroIcon");
+            }
+            return m_HeroIcon;
+        }
+    }
+
+
+
+    Image m_CountryImg;
+    Image countryImg
+    {
+        get
+        {
+            if (m_CountryImg == null)
+            {
+                m_CountryImg = this.transform.GetComponent<Image>("Container_HeadCell/country");
+            }
+            return m_CountryImg;
+        }
+    }
+
+    Image m_JobImg;
+    Image jobImg
+    {
+        get
+        {
+            if (m_JobImg == null)
+            {
+                m_JobImg = this.transform.GetComponent<Image>("Container_HeadCell/name/job");
+            }
+            return m_JobImg;
+        }
+    }
+
+    Text m_NameText;
+    Text nameText
+    {
+        get
+        {
+            if (m_NameText == null)
+            {
+                m_NameText = this.transform.GetComponent<Text>("Container_HeadCell/name");
+            }
+            return m_NameText;
+        }
+    }
+
+    void Awake()
+    {
+        LoadPrefab();
+    }
+
+    // 姝﹀皢灏忓ご鍍忥紝锛堣亴涓氬拰鍚嶇О涓嶅啀姝ょ鐞嗭紝鍚勪釜鐣岄潰鎺掔増涓嶅悓锛�
+    public void Init(int heroID, bool _gray = false, UnityAction onclick = null)
+    {
+        LoadPrefab();   //瀛樺湪琚嵏杞界殑鍙兘锛岄噸鏂板姞杞�
+        clickBtn.AddListener(onclick);
+        var heroConfig = HeroConfig.Get(heroID);
+        qualityBG.SetSprite("heroheadBG" + heroConfig.Quality);
+
+        var sprite = UILoader.LoadSprite("HeroHead", HeroSkinConfig.Get(heroConfig.SkinIDList[0]).SquareIcon);
+        heroIcon.overrideSprite = sprite;
+        heroIcon.gray = _gray;
+
+        countryImg.SetSprite(HeroUIManager.Instance.GetCountryIconName(heroConfig.Country));
+        jobImg.SetSprite(HeroUIManager.Instance.GetJobIconName(heroConfig.Class));
+        nameText.text = heroConfig.Name;
+
+
+    }
+
+    GameObject cellContainer;
+    protected void LoadPrefab()
+    {
+        if (cellContainer != null)
+            return;
+
+        var tmp = transform.Find("Container_HeadCell");
+        if (tmp != null)
+        {
+            cellContainer = tmp.gameObject;
+            return;
+        }
+        if (cellContainer == null)
+        {
+            cellContainer = UIUtility.CreateWidget("HeroHeadBaseNoTrainCell", "Container_HeadCell");
+
+            if (cellContainer != null)
+            {
+                cellContainer.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one);
+                cellContainer.transform.SetAsFirstSibling();
+            }
+        }
+        
+        //缂╂斁鍒板拰鐖秗ect涓�鏍峰ぇ
+        var scale = 1f;
+        var rect = cellContainer.GetComponent<RectTransform>();
+        var parentRect = transform.GetComponent<RectTransform>();
+        float width = parentRect.sizeDelta.x;
+        if (width <= 0f)
+        {
+            //澶栭儴鎺у埗浜嗗昂瀵歌幏鍙栦负0
+            GridLayoutGroup grid = GetComponentInParent<GridLayoutGroup>();
+            if (grid != null)
+            { 
+                width = grid.cellSize.x;
+            }
+            
+        }
+        scale = width / rect.sizeDelta.x;
+        cellContainer.transform.localScale = cellContainer.transform.localScale * scale;
+    }
+}
+
diff --git a/Main/System/HeroUI/HeroHeadBaseNoTrainCell.cs.meta b/Main/System/HeroUI/HeroHeadBaseNoTrainCell.cs.meta
new file mode 100644
index 0000000..f7eff80
--- /dev/null
+++ b/Main/System/HeroUI/HeroHeadBaseNoTrainCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d35032963a8cb6248ace536aff906122
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0