From 464c36a0811d5a2ef317ebf1adc1711baab52856 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期一, 04 八月 2025 10:51:47 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/Hero/HeroInfo.Fetter.cs                 |   45 +
 Main/System/KnapSack/Logic/composeLineCell.cs.meta  |    2 
 Main/System/KnapSack/Logic/composeLineCell.cs       |   14 
 Main/System/KnapSack/Logic/RolePackLineCell.cs.meta |    2 
 Main/System/Message/ColorAnalysis.cs                |  105 +-
 Main/System/Hero/HeroInfo.Properties.cs             |   12 
 Main/System/HeroUI/HeroScenePosCell.cs              |    2 
 Main/Config/PartialConfigs/PlayerPropertyConfig.cs  |   14 
 Main/System/KnapSack/New/CommonItemBaisc.cs         |  253 +++++---
 Main/System/KnapSack/New/ItemCell.cs                |   10 
 Main/Component/UI/Common/GroupButtonEx.cs           |    4 
 Main/Config/PartialConfigs/HeroFetterConfig.cs      |   13 
 Main/Utility/EnumHelper.cs                          |    3 
 Main/System/HeroUI/HeroBaseWin.cs                   |   25 
 Main/System/HeroUI/HeroFormationCell.cs.meta        |    2 
 Main/Config/PartialConfigs/HeroLineupHaloConfig.cs  |   10 
 Main/System/Hero/HeroInfo.cs                        |    1 
 Main/System/KnapSack/Logic/PackGirdCell.cs.meta     |    2 
 Main/System/HeroUI/HeroSelectBehaviour.cs           |   22 
 Main/System/Main/FuncsBaseWin.cs                    |   12 
 Main/Config/ConfigManager.cs                        |  114 ---
 Main/Component/UI/Effect/UIEffectPlayer.cs          |   10 
 Main/System/HeroUI/HeroConnectionHeadCell.cs        |    6 
 Main/System/KnapSack/Logic/ItemLogicUtility.cs      |    2 
 Main/System/GeneralConfig/GeneralDefine.cs          |    2 
 Main/System/Hero/HeroManager.cs                     |   34 
 Main/System/Main/HomeWin.cs                         |   11 
 Main/Config/Configs/ItemConfig.cs                   |   37 
 Main/System/KnapSack/Logic/SinglePack.cs            |    8 
 Main/System/HeroUI/HeroFormationCell.cs             |   71 ++
 Main/Component/UI/Effect/EffectPlayer.cs            |    1 
 Main/System/Team/TeamBase.cs                        |   10 
 Main/Core/ResModule/GameObjectPoolManager.cs        |   64 ++
 Main/System/KnapSack/Logic/PackGirdCell.cs          |   17 
 Main/System/KnapSack/Logic/RolePackLineCell.cs      |   26 
 Main/System/KnapSack/PackManager.cs                 |   60 +
 Main/System/Hero/UIHeroController.cs                |    5 
 Main/System/KnapSack/Logic/RolePackWin.cs           |  184 ++++++
 Main/System/HeroUI/HeroFormationWin.cs.meta         |    2 
 Main/System/HeroUI/HeroFormationWin.cs              |   70 ++
 /dev/null                                           |   56 --
 Main/System/Team/TeamType.cs                        |   10 
 Main/Utility/UIHelper.cs                            |   32 
 Main/System/HeroUI/HeroConnectionCell.cs            |   22 
 Main/System/HeroUI/HeroPosWin.cs                    |  181 +++++
 Main/System/KnapSack/Logic/RolePackWin.cs.meta      |    2 
 Main/System/Main/MainWin.cs                         |   18 
 Main/Component/UI/Common/GroupButtonExManager.cs    |   22 
 Main/System/HeroUI/HeroUIManager.cs                 |   45 +
 49 files changed, 1,162 insertions(+), 513 deletions(-)

diff --git a/Main/Component/UI/Common/GroupButtonEx.cs b/Main/Component/UI/Common/GroupButtonEx.cs
index 99fa338..f56f99a 100644
--- a/Main/Component/UI/Common/GroupButtonEx.cs
+++ b/Main/Component/UI/Common/GroupButtonEx.cs
@@ -103,7 +103,7 @@
         SelectBtn();
     }
 
-    // 閫変腑褰撳墠鎸夐挳
+    // 閫変腑褰撳墠鎸夐挳锛屽彧澶勭悊鍒锋柊鏄剧ず
     public void SelectBtn(bool forceRefresh = false)
     {
         if (m_State == TitleBtnState.Click && !forceRefresh)
@@ -115,8 +115,6 @@
             m_Manager.SelectButton(this);
         }
 
-        // 璁剧疆褰撳墠鎸夐挳涓洪�変腑鐘舵��
-        state = TitleBtnState.Click;
     }
 
     // 鏇存柊鎸夐挳鐘舵��
diff --git a/Main/Component/UI/Common/GroupButtonExManager.cs b/Main/Component/UI/Common/GroupButtonExManager.cs
index bd88ecf..176a92b 100644
--- a/Main/Component/UI/Common/GroupButtonExManager.cs
+++ b/Main/Component/UI/Common/GroupButtonExManager.cs
@@ -7,6 +7,7 @@
 using System.Collections.Generic;
 
 using System;
+using Cysharp.Threading.Tasks;
 
 /// <summary>
 /// 鎸夐挳缁勭鐞嗗櫒锛岃礋璐g鐞咷roupButtonEx缁勪欢鐨勭粍鍏崇郴鍜岀姸鎬佸垏鎹�
@@ -16,8 +17,8 @@
 {
     // 鎸夐挳缁勫垪琛�
     private List<GroupButtonEx> m_Buttons = new List<GroupButtonEx>();
-    
-    [SerializeField] Color m_SelectedTextColor = Color.white; // 閫変腑鐘舵�佹枃瀛楅鑹�
+
+    [SerializeField] Color m_SelectedTextColor = UIHelper.GetUIColor(TextColType.titleSelectColor); // 閫変腑鐘舵�佹枃瀛楅鑹�
     public Color selectedTextColor {
         get { return m_SelectedTextColor; }
         set { 
@@ -25,12 +26,24 @@
         }
     }
     
-    [SerializeField] Color m_NormalTextColor = new Color(0.7f, 0.7f, 0.7f); // 鏈�変腑鐘舵�佹枃瀛楅鑹�
+    [SerializeField] Color m_NormalTextColor = UIHelper.GetUIColor(TextColType.titleUnSelectColor); // 鏈�変腑鐘舵�佹枃瀛楅鑹�
     public Color normalTextColor {
         get { return m_NormalTextColor; }
         set { 
             m_NormalTextColor = value;
         }
+    }
+
+
+    void OnEnable()
+    {
+        ExecuteNextFrame();
+    }
+
+    protected async void ExecuteNextFrame()
+    {
+        await UniTask.DelayFrame(1);
+        UpdateAllButtonsState();
     }
 
     /// <summary>
@@ -70,6 +83,7 @@
         if (button == null)
             return;
 
+        button.state = TitleBtnState.Click;
         // 鍙栨秷鍏朵粬鎸夐挳鐨勯�変腑鐘舵��
         foreach (var btn in m_Buttons)
         {
@@ -119,7 +133,7 @@
     /// </summary>
     private void UpdateAllButtonsState()
     {
-        SortBtns();
+        // SortBtns();
 
         foreach (var btn in m_Buttons)
         {
diff --git a/Main/Component/UI/Common/ItemBaseEffect.cs b/Main/Component/UI/Common/ItemBaseEffect.cs
deleted file mode 100644
index d7866fd..0000000
--- a/Main/Component/UI/Common/ItemBaseEffect.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-锘縰sing System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-public class ItemBaseEffect : MonoBehaviour
-{
-    [SerializeField] UIEffectPlayer m_SuitEffect;
-    
-    int itemId = 0;
-
-    private void OnEnable()
-    {
-        Display(itemId);
-    }
-
-    public void Display(int itemId, bool dirty = false)
-    {
-        this.itemId = itemId;
-        var curItem = ItemConfig.Get(this.itemId);
-        bool isPlay = true;
-        if (curItem == null)
-        {
-            isPlay = false;
-            return;
-        }
-
-        int effectId = 0;
-        switch (curItem.ItemColor)
-        {
-            case 4:
-                effectId = 7119;
-                break;
-            case 5:
-                effectId = 7120;
-                break;
-            case 6:
-            case 7:
-            case 8:
-                effectId = 7121;
-                break;
-        }
-
-        if (curItem.BaseEffectID != 0)
-        {
-            effectId = curItem.BaseEffectID;
-        }
-
-        if (m_SuitEffect.effectId != effectId)
-        {
-            //鍚屼竴涓綅缃浛鎹㈢壒鏁堥渶瑕佸厛閲婃斁
-            m_SuitEffect.Stop();
-        }
-        m_SuitEffect.effectId = effectId;
-
-        if (m_SuitEffect.effectId == 0)
-        {
-            isPlay = false;
-        }
-        if (isPlay)
-        {
-            m_SuitEffect.SetActive(true);
-        }
-        else
-        {
-            m_SuitEffect.SetActive(false);
-        }
-    }
-
-    public static ItemBaseEffect Create(RectTransform transform)
-    {
-        var go = UIUtility.CreateWidget("ItemBaseEffect", "ItemBaseEffect");
-        var behaviour = go.GetComponent<ItemBaseEffect>();
-
-        var scale = 1f;
-        var itemBasic = transform.GetComponentInParent<CommonItemBaisc>();
-        if (itemBasic == null)
-            itemBasic = transform.GetComponentInParent<ItemCell>();
-        if (itemBasic != null)
-        {
-            scale = GetEffectScale(itemBasic.format);
-        }
-        else
-        {
-            var itemBehaviour = transform.GetComponentInParent<ItemBehaviour>();
-            if (itemBehaviour != null)
-            {
-                if (itemBehaviour.backGround != null)
-                {
-                    var size = itemBehaviour.backGround.rectTransform.rect.width;
-                    scale = size / 84;
-                }
-            }
-
-        }
-
-        var rect = go.transform as RectTransform;
-        go.transform.SetParentEx(transform, Vector3.zero, Quaternion.identity, Vector3.one);
-        rect.MatchWhith(transform);
-        go.transform.localScale = Vector3.one * scale;
-        go.transform.SetAsLastSibling();
-
-        return behaviour;
-    }
-
-
-    static float GetEffectScale(ItemCellformat format)
-    {
-        switch (format)
-        {
-            case ItemCellformat.Format_120x120:
-                return 1.2f;
-            case ItemCellformat.Format_100x100:
-                return 1.1f;
-            case ItemCellformat.Format_84x84:
-                return 1f;
-            case ItemCellformat.Format_80x80:
-                return 0.95f;
-            case ItemCellformat.Format_70x70:
-                return 0.83f;
-            case ItemCellformat.Format_64x64:
-                return 0.76f;
-            default:
-                return 1f;
-        }
-    }
-}
diff --git a/Main/Component/UI/Common/ItemBaseEffect.cs.meta b/Main/Component/UI/Common/ItemBaseEffect.cs.meta
deleted file mode 100644
index 423ea25..0000000
--- a/Main/Component/UI/Common/ItemBaseEffect.cs.meta
+++ /dev/null
@@ -1,12 +0,0 @@
-fileFormatVersion: 2
-guid: ad12bde7ddfa38e44aa5dc55f1075bc2
-timeCreated: 1603121065
-licenseType: Free
-MonoImporter:
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Component/UI/Common/ItemBehaviour.cs b/Main/Component/UI/Common/ItemBehaviour.cs
deleted file mode 100644
index 8a1e820..0000000
--- a/Main/Component/UI/Common/ItemBehaviour.cs
+++ /dev/null
@@ -1,185 +0,0 @@
-锘�//--------------------------------------------------------
-//    [Author]:           鐜╀釜娓告垙
-//    [  Date ]:           Monday, July 31, 2017
-//--------------------------------------------------------
-using UnityEngine;
-using System.Collections;
-using UnityEngine.UI;
-using System;
-
-
-public class ItemBehaviour : MonoBehaviour
-{
-
-
-    [SerializeField] ImageEx m_Icon;
-    public ImageEx icon { get { return m_Icon; } }
-
-    [SerializeField] ImageEx m_BackGround;
-    public ImageEx backGround { get { return m_BackGround; } }
-
-    [SerializeField] Transform m_CountContainer;
-    public Transform countContainer { get { return m_CountContainer; } }
-
-    [SerializeField] Text m_Count;
-    public Text count { get { return m_Count; } }
-
-    [SerializeField] Button m_ViewDetails;
-
-    [SerializeField] ItemType m_ItemType = ItemType.Rewards;
-
-    //鐗╁搧鍩虹鐗规晥锛堢墿鍝佽〃锛�
-    ItemBaseEffect m_ItemBaseEffect;
-    ItemBaseEffect itemBaseEffect
-    {
-        get
-        {
-            if (m_ItemBaseEffect == null)
-            {
-                m_ItemBaseEffect = ItemBaseEffect.Create(transform as RectTransform);
-            }
-            return m_ItemBaseEffect;
-        }
-    }
-
-    bool m_ShowCount = true;
-    public bool showCount
-    {
-        get
-        {
-            return m_ShowCount;
-        }
-        set
-        {
-            if (m_ShowCount != value)
-            {
-                m_ShowCount = value;
-                DisplayCount();
-            }
-        }
-    }
-
-    public int itemId
-    {
-        get; private set;
-    }
-
-    public int itemCount
-    {
-        get; private set;
-    }
-
-    public int itemQuality { get; private set; }
-
-    private void Awake()
-    {
-        if (m_ViewDetails != null)
-        {
-            m_ViewDetails.SetListener(ViewDetails);
-        }
-    }
-
-    public void SetItem(Item _item)
-    {
-        SetItem(_item.id, _item.count, _item.quality);
-    }
-
-    public void SetItem(int _id, int _count, int _quality = 0)
-    {
-        itemId = _id;
-        itemCount = _count;
-        itemQuality = _quality;
-        DisplayBaseInfo();
-        DisplayCount();
-    }
-
-    public void SetCount(int _count)
-    {
-        itemCount = _count;
-        DisplayCount();
-    }
-
-    public void DisplayEmpty()
-    {
-        try
-        {
-            icon.SetActive(false);
-            backGround.SetActive(false);
-            if (countContainer != null)
-            {
-                countContainer.SetActive(false);
-            }
-        }
-        catch (System.Exception ex)
-        {
-            Debug.Log(ex);
-        }
-    }
-
-    private void DisplayBaseInfo()
-    {
-        try
-        {
-            var itemInfo = ItemConfig.Get(itemId);
-            if (icon != null)
-            {
-                icon.SetActive(true);
-                icon.SetSprite(itemInfo.IconKey);
-            }
-
-            if (backGround != null)
-            {
-                backGround.SetActive(true);
-                backGround.SetItemBackGround(itemQuality != 0 ? itemQuality : itemInfo.ItemColor, itemInfo.QualityEchoType);
-            }
-
-            itemBaseEffect.Display(itemId);
-        }
-        catch (Exception e)
-        {
-            Debug.Log(e);
-        }
-    }
-
-    private void DisplayCount()
-    {
-        if (countContainer == null)
-        {
-            return;
-        }
-        switch (m_ItemType)
-        {
-            case ItemType.Rewards:
-                if (showCount && itemCount > 1)
-                {
-                    countContainer.SetActive(true);
-                    count.text = UIHelper.ReplaceLargeNum((ulong)itemCount);
-                }
-                else
-                {
-                    countContainer.SetActive(false);
-                }
-                break;
-            case ItemType.Use:
-                var _itemCnt = PackManager.Instance.GetItemCountByID(PackType.Item, itemId);
-                count.text = StringUtility.Contact(_itemCnt >= itemCount ? "<color=#35e112>" : "<color=#ff0303>", _itemCnt,
-                    "</color><color=#f7f7f7>/", itemCount, "</color>");
-                break;
-        }
-    }
-
-    private void ViewDetails()
-    {
-        ItemTipUtility.Show(itemId);
-    }
-
-    public enum ItemType
-    {
-        Rewards,
-        Use,
-    }
-}
-
-
-
-
diff --git a/Main/Component/UI/Common/ItemBehaviour.cs.meta b/Main/Component/UI/Common/ItemBehaviour.cs.meta
deleted file mode 100644
index cec07ae..0000000
--- a/Main/Component/UI/Common/ItemBehaviour.cs.meta
+++ /dev/null
@@ -1,12 +0,0 @@
-fileFormatVersion: 2
-guid: a11c4ed088f00fb4baea8b08f0cfa42f
-timeCreated: 1501488202
-licenseType: Free
-MonoImporter:
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Component/UI/Effect/EffectPlayer.cs b/Main/Component/UI/Effect/EffectPlayer.cs
index 0246021..16010c2 100644
--- a/Main/Component/UI/Effect/EffectPlayer.cs
+++ b/Main/Component/UI/Effect/EffectPlayer.cs
@@ -169,6 +169,7 @@
         }
 
         PlayerEffect(true);
+        SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
 
     }
 
diff --git a/Main/Component/UI/Effect/UIEffectPlayer.cs b/Main/Component/UI/Effect/UIEffectPlayer.cs
index 3de63e7..a8fc647 100644
--- a/Main/Component/UI/Effect/UIEffectPlayer.cs
+++ b/Main/Component/UI/Effect/UIEffectPlayer.cs
@@ -73,12 +73,17 @@
         { 
             PlayerEffect(false);
         }
-
+        SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
     }
 
 
     protected override void PlaySpineEffect()
     {
+        if (spineComp == null)
+        {
+            spineComp = gameObject.AddMissingComponent<SkeletonGraphic>();
+        }
+
         if (spineComp.skeletonDataAsset == null)
         {
             //LoadAsset 宸茬粡鏈夌紦瀛楽keletonDataAsset
@@ -86,6 +91,7 @@
             spineComp.raycastTarget = false;
             spineComp.Initialize(true);
             spineAnimationState = spineComp.AnimationState;
+            spineAnimationState.Data.DefaultMix = 0f;
             spineAnimationState.Complete -= OnSpineAnimationComplete;
             spineAnimationState.Complete += OnSpineAnimationComplete;
         }
@@ -103,7 +109,7 @@
         if (skeletonData.Animations.Count > 0)
         {
             string defaultAnimationName = skeletonData.Animations.Items[0].Name;
-            spineComp.AnimationState.SetAnimation(0, defaultAnimationName, isPlaySpineLoop);
+            spineAnimationState.SetAnimation(0, defaultAnimationName, isPlaySpineLoop);
         }
         else
         {
diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index f6e63cb..6061df9 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -38,51 +38,25 @@
 
         // 鍔犺浇閰嶇疆鏂囦欢
         HashSet<Type> configTypes = new HashSet<Type>() {
-            typeof(ChatBubbleBoxConfig),
+            typeof(ChestsAwardConfig),
             typeof(CTGConfig),
-            typeof(DailyLivenessRewardConfig),
-            typeof(DailyQuestConfig),
-            typeof(DailyQuestOpenTimeConfig),
-            typeof(DienstgradConfig),
-            typeof(DirtyNameConfig),
             typeof(DirtyWordConfig),
-            typeof(EffectConfig),
             typeof(EquipGSParamConfig),
-            typeof(EquipPlaceMapConfig),
-            typeof(FamilyEmblemConfig),
-            typeof(FrameAnimationConfig),
-            typeof(FuncConfigConfig),
-            typeof(FuncOpenLVConfig),
-            typeof(FunctionTeamSetConfig),
-            typeof(GetItemWaysConfig),
-            typeof(GmCmdConfig),
-            typeof(HeroAwakeConfig),
-            typeof(HeroConfig),
+            typeof(FaceConfig),
             typeof(HeroLineupHaloConfig),
-            typeof(HeroQualityAwakeConfig),
-            typeof(HeroQualityBreakConfig),
-            typeof(HeroQualityConfig),
             typeof(HeroQualityLVConfig),
-            typeof(HeroSkinConfig),
             typeof(ItemConfig),
-            typeof(KickOutReasonConfig),
             typeof(MainChapterConfig),
             typeof(MainLevelConfig),
             typeof(NPCConfig),
+            typeof(NPCExConfig),
             typeof(NPCLineupConfig),
             typeof(OrderInfoConfig),
             typeof(PlayerFaceConfig),
-            typeof(PlayerLVConfig),
-            typeof(PlayerPropertyConfig),
-            typeof(priorbundleConfig),
-            typeof(RealmConfig),
-            typeof(RealmLVUPTaskConfig),
-            typeof(RuleConfig),
-            typeof(SkillConfig),
-            typeof(TaskConfig),
+            typeof(StoreConfig),
+            typeof(SuccessConfig),
+            typeof(SysInfoConfig),
             typeof(TitleStarUpConfig),
-            typeof(TreasureCntAwardConfig),
-            typeof(TreasureItemLibConfig),
             typeof(TreasureSetConfig),
             typeof(TreeLVConfig),
             typeof(XBGetItemConfig)
@@ -235,96 +209,44 @@
 
     public override void Release()
     {
-        // 娓呯┖ ChatBubbleBoxConfig 瀛楀吀
-        ClearConfigDictionary<ChatBubbleBoxConfig>();
+        // 娓呯┖ ChestsAwardConfig 瀛楀吀
+        ClearConfigDictionary<ChestsAwardConfig>();
         // 娓呯┖ CTGConfig 瀛楀吀
         ClearConfigDictionary<CTGConfig>();
-        // 娓呯┖ DailyLivenessRewardConfig 瀛楀吀
-        ClearConfigDictionary<DailyLivenessRewardConfig>();
-        // 娓呯┖ DailyQuestConfig 瀛楀吀
-        ClearConfigDictionary<DailyQuestConfig>();
-        // 娓呯┖ DailyQuestOpenTimeConfig 瀛楀吀
-        ClearConfigDictionary<DailyQuestOpenTimeConfig>();
-        // 娓呯┖ DienstgradConfig 瀛楀吀
-        ClearConfigDictionary<DienstgradConfig>();
-        // 娓呯┖ DirtyNameConfig 瀛楀吀
-        ClearConfigDictionary<DirtyNameConfig>();
         // 娓呯┖ DirtyWordConfig 瀛楀吀
         ClearConfigDictionary<DirtyWordConfig>();
-        // 娓呯┖ EffectConfig 瀛楀吀
-        ClearConfigDictionary<EffectConfig>();
         // 娓呯┖ EquipGSParamConfig 瀛楀吀
         ClearConfigDictionary<EquipGSParamConfig>();
-        // 娓呯┖ EquipPlaceMapConfig 瀛楀吀
-        ClearConfigDictionary<EquipPlaceMapConfig>();
-        // 娓呯┖ FamilyEmblemConfig 瀛楀吀
-        ClearConfigDictionary<FamilyEmblemConfig>();
-        // 娓呯┖ FrameAnimationConfig 瀛楀吀
-        ClearConfigDictionary<FrameAnimationConfig>();
-        // 娓呯┖ FuncConfigConfig 瀛楀吀
-        ClearConfigDictionary<FuncConfigConfig>();
-        // 娓呯┖ FuncOpenLVConfig 瀛楀吀
-        ClearConfigDictionary<FuncOpenLVConfig>();
-        // 娓呯┖ FunctionTeamSetConfig 瀛楀吀
-        ClearConfigDictionary<FunctionTeamSetConfig>();
-        // 娓呯┖ GetItemWaysConfig 瀛楀吀
-        ClearConfigDictionary<GetItemWaysConfig>();
-        // 娓呯┖ GmCmdConfig 瀛楀吀
-        ClearConfigDictionary<GmCmdConfig>();
-        // 娓呯┖ HeroAwakeConfig 瀛楀吀
-        ClearConfigDictionary<HeroAwakeConfig>();
-        // 娓呯┖ HeroConfig 瀛楀吀
-        ClearConfigDictionary<HeroConfig>();
+        // 娓呯┖ FaceConfig 瀛楀吀
+        ClearConfigDictionary<FaceConfig>();
         // 娓呯┖ HeroLineupHaloConfig 瀛楀吀
         ClearConfigDictionary<HeroLineupHaloConfig>();
-        // 娓呯┖ HeroQualityAwakeConfig 瀛楀吀
-        ClearConfigDictionary<HeroQualityAwakeConfig>();
-        // 娓呯┖ HeroQualityBreakConfig 瀛楀吀
-        ClearConfigDictionary<HeroQualityBreakConfig>();
-        // 娓呯┖ HeroQualityConfig 瀛楀吀
-        ClearConfigDictionary<HeroQualityConfig>();
         // 娓呯┖ HeroQualityLVConfig 瀛楀吀
         ClearConfigDictionary<HeroQualityLVConfig>();
-        // 娓呯┖ HeroSkinConfig 瀛楀吀
-        ClearConfigDictionary<HeroSkinConfig>();
         // 娓呯┖ ItemConfig 瀛楀吀
         ClearConfigDictionary<ItemConfig>();
-        // 娓呯┖ KickOutReasonConfig 瀛楀吀
-        ClearConfigDictionary<KickOutReasonConfig>();
         // 娓呯┖ MainChapterConfig 瀛楀吀
         ClearConfigDictionary<MainChapterConfig>();
         // 娓呯┖ MainLevelConfig 瀛楀吀
         ClearConfigDictionary<MainLevelConfig>();
         // 娓呯┖ NPCConfig 瀛楀吀
         ClearConfigDictionary<NPCConfig>();
+        // 娓呯┖ NPCExConfig 瀛楀吀
+        ClearConfigDictionary<NPCExConfig>();
         // 娓呯┖ NPCLineupConfig 瀛楀吀
         ClearConfigDictionary<NPCLineupConfig>();
         // 娓呯┖ OrderInfoConfig 瀛楀吀
         ClearConfigDictionary<OrderInfoConfig>();
         // 娓呯┖ PlayerFaceConfig 瀛楀吀
         ClearConfigDictionary<PlayerFaceConfig>();
-        // 娓呯┖ PlayerLVConfig 瀛楀吀
-        ClearConfigDictionary<PlayerLVConfig>();
-        // 娓呯┖ PlayerPropertyConfig 瀛楀吀
-        ClearConfigDictionary<PlayerPropertyConfig>();
-        // 娓呯┖ priorbundleConfig 瀛楀吀
-        ClearConfigDictionary<priorbundleConfig>();
-        // 娓呯┖ RealmConfig 瀛楀吀
-        ClearConfigDictionary<RealmConfig>();
-        // 娓呯┖ RealmLVUPTaskConfig 瀛楀吀
-        ClearConfigDictionary<RealmLVUPTaskConfig>();
-        // 娓呯┖ RuleConfig 瀛楀吀
-        ClearConfigDictionary<RuleConfig>();
-        // 娓呯┖ SkillConfig 瀛楀吀
-        ClearConfigDictionary<SkillConfig>();
-        // 娓呯┖ TaskConfig 瀛楀吀
-        ClearConfigDictionary<TaskConfig>();
+        // 娓呯┖ StoreConfig 瀛楀吀
+        ClearConfigDictionary<StoreConfig>();
+        // 娓呯┖ SuccessConfig 瀛楀吀
+        ClearConfigDictionary<SuccessConfig>();
+        // 娓呯┖ SysInfoConfig 瀛楀吀
+        ClearConfigDictionary<SysInfoConfig>();
         // 娓呯┖ TitleStarUpConfig 瀛楀吀
         ClearConfigDictionary<TitleStarUpConfig>();
-        // 娓呯┖ TreasureCntAwardConfig 瀛楀吀
-        ClearConfigDictionary<TreasureCntAwardConfig>();
-        // 娓呯┖ TreasureItemLibConfig 瀛楀吀
-        ClearConfigDictionary<TreasureItemLibConfig>();
         // 娓呯┖ TreasureSetConfig 瀛楀吀
         ClearConfigDictionary<TreasureSetConfig>();
         // 娓呯┖ TreeLVConfig 瀛楀吀
diff --git a/Main/Config/Configs/ItemConfig.cs b/Main/Config/Configs/ItemConfig.cs
index be83867..a39fdc4 100644
--- a/Main/Config/Configs/ItemConfig.cs
+++ b/Main/Config/Configs/ItemConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�7鏈�26鏃�
+//    [  Date ]:           Monday, August 4, 2025
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -71,7 +71,6 @@
 	public int ChangeOrd;
 	public string Description;
 	public string QualityName;
-	public int QualityEchoType;
 	public int LimitSTR;
 	public int LimitPHY;
 	public int LimitPNE;
@@ -227,31 +226,29 @@
 
 			QualityName = tables[59];
 
-			int.TryParse(tables[60],out QualityEchoType); 
+			int.TryParse(tables[60],out LimitSTR); 
 
-			int.TryParse(tables[61],out LimitSTR); 
+			int.TryParse(tables[61],out LimitPHY); 
 
-			int.TryParse(tables[62],out LimitPHY); 
+			int.TryParse(tables[62],out LimitPNE); 
 
-			int.TryParse(tables[63],out LimitPNE); 
+			Template = tables[63];
 
-			Template = tables[64];
+			int.TryParse(tables[64],out DropItemPattern); 
 
-			int.TryParse(tables[65],out DropItemPattern); 
+			int.TryParse(tables[65],out SellTip); 
 
-			int.TryParse(tables[66],out SellTip); 
+			int.TryParse(tables[66],out BatchUse); 
 
-			int.TryParse(tables[67],out BatchUse); 
+			int.TryParse(tables[67],out Jump); 
 
-			int.TryParse(tables[68],out Jump); 
-
-			if (tables[69].Contains("["))
+			if (tables[68].Contains("["))
 			{
-				GetWay = JsonMapper.ToObject<int[]>(tables[69]);
+				GetWay = JsonMapper.ToObject<int[]>(tables[68]);
 			}
 			else
 			{
-				string[] GetWayStringArray = tables[69].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] GetWayStringArray = tables[68].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				GetWay = new int[GetWayStringArray.Length];
 				for (int i=0;i<GetWayStringArray.Length;i++)
 				{
@@ -259,15 +256,15 @@
 				}
 			}
 
-			ItemTypeName = tables[70];
+			ItemTypeName = tables[69];
 
-			if (tables[71].Contains("["))
+			if (tables[70].Contains("["))
 			{
-				UseCondiType = JsonMapper.ToObject<int[]>(tables[71]);
+				UseCondiType = JsonMapper.ToObject<int[]>(tables[70]);
 			}
 			else
 			{
-				string[] UseCondiTypeStringArray = tables[71].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] UseCondiTypeStringArray = tables[70].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				UseCondiType = new int[UseCondiTypeStringArray.Length];
 				for (int i=0;i<UseCondiTypeStringArray.Length;i++)
 				{
@@ -275,7 +272,7 @@
 				}
 			}
 
-			int.TryParse(tables[72],out BaseEffectID); 
+			int.TryParse(tables[71],out BaseEffectID); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/PartialConfigs/HeroFetterConfig.cs b/Main/Config/PartialConfigs/HeroFetterConfig.cs
index 26b58b9..bc0a885 100644
--- a/Main/Config/PartialConfigs/HeroFetterConfig.cs
+++ b/Main/Config/PartialConfigs/HeroFetterConfig.cs
@@ -1,18 +1,19 @@
 锘�
 using System.Collections.Generic;
 using System.IO;
-using System.Threading;
 using System;
 using UnityEngine;
 using LitJson;
+using System.Linq;
 
+//缇佺粖锛氭灏�
 public partial class HeroFetterConfig : ConfigBase<int, HeroFetterConfig>
 {
 	private Dictionary<HeroAttrType, int> attrValues = new Dictionary<HeroAttrType, int>();
 
 	protected override void OnConfigParseCompleted()
-    {
-        base.OnConfigParseCompleted();
+	{
+		base.OnConfigParseCompleted();
 
 		// public int[] AttrIDList;
 		// public int[] AttrValueList;
@@ -34,7 +35,9 @@
 
 			attrValues.Add((HeroAttrType)AttrIDList[i], AttrValueList[i]);
 		}
-    }
+
+
+	}
 
 	public int GetFetterAttr(HeroAttrType attrType)
 	{
@@ -45,4 +48,6 @@
 
 		return 0;
 	}
+
+
 }
diff --git a/Main/Config/PartialConfigs/HeroLineupHaloConfig.cs b/Main/Config/PartialConfigs/HeroLineupHaloConfig.cs
index 832b17e..59d8155 100644
--- a/Main/Config/PartialConfigs/HeroLineupHaloConfig.cs
+++ b/Main/Config/PartialConfigs/HeroLineupHaloConfig.cs
@@ -4,7 +4,7 @@
 public partial class HeroLineupHaloConfig : ConfigBase<int, HeroLineupHaloConfig>
 {
     // 鍥藉 鏁伴噺
-    public static Dictionary<int, Dictionary<int, HeroLineupHaloConfig>> configDics = new Dictionary<int, Dictionary<int, HeroLineupHaloConfig>>();
+    private static Dictionary<int, Dictionary<int, HeroLineupHaloConfig>> configDics = new Dictionary<int, Dictionary<int, HeroLineupHaloConfig>>();
 
     protected override void OnConfigParseCompleted()
     {
@@ -32,4 +32,12 @@
         return configDics[country][count];
     }
 
+    public static Dictionary<int, HeroLineupHaloConfig> GetAttrsByCountry(int country)
+    {
+        Dictionary<int, HeroLineupHaloConfig> attrs;
+        configDics.TryGetValue(country, out attrs);
+
+        return attrs;
+    }
+
 }
\ No newline at end of file
diff --git a/Main/Config/PartialConfigs/PlayerPropertyConfig.cs b/Main/Config/PartialConfigs/PlayerPropertyConfig.cs
index 179c143..4ea7bc6 100644
--- a/Main/Config/PartialConfigs/PlayerPropertyConfig.cs
+++ b/Main/Config/PartialConfigs/PlayerPropertyConfig.cs
@@ -76,7 +76,7 @@
         return GetFullDescription(property.x, property.y);
     }
 
-    public static string GetFullDescription(int id, long value)
+    public static string GetFullDescription(int id, long value, string format="{0}+{1}")
     {
         var config = Get(id);
         if (config == null)
@@ -86,18 +86,18 @@
 
         if (config.ShowName.Contains("%s"))
         {
-            if (id == 52)
-            {
-                return Regex.Replace(config.ShowName, "%s", (value * 0.0001f).ToString("f2"));
-            }
-            else
+            // if (id == 52)
+            // {
+            //     return Regex.Replace(config.ShowName, "%s", (value * 0.0001f).ToString("f2"));
+            // }
+            // else
             {
                 return Regex.Replace(config.ShowName, "%s", value.ToString());
             }
         }
         else
         {
-            return string.Format("{0} +{1}", config.ShowName, GetValueDescription(id, value));
+            return string.Format(format, config.ShowName, GetValueDescription(id, value));
         }
     }
 
diff --git a/Main/Core/ResModule/GameObjectPoolManager.cs b/Main/Core/ResModule/GameObjectPoolManager.cs
index 5214318..942a36e 100644
--- a/Main/Core/ResModule/GameObjectPoolManager.cs
+++ b/Main/Core/ResModule/GameObjectPoolManager.cs
@@ -2,6 +2,11 @@
 using UnityEngine;
 using System;
 using Cysharp.Threading.Tasks;
+using System.Linq;
+
+#if UNITY_EDITOR
+using UnityEngine.Profiling;
+#endif
 
 
 public class GameObjectPoolManager : SingletonMonobehaviour<GameObjectPoolManager>
@@ -10,6 +15,7 @@
     private bool m_ShowDebugPanel = false;
     private Vector2 m_ScrollPosition = Vector2.zero;
 
+    
     private void OnGUI()
     {
         if (!m_ShowDebugPanel) return;
@@ -19,6 +25,7 @@
         m_ScrollPosition = GUILayout.BeginScrollView(m_ScrollPosition, GUILayout.Width(380), GUILayout.Height(580));
 
         GUILayout.Label("瀵硅薄姹犺皟璇曢潰鏉�", GUILayout.Height(30));
+        LogPoolMemoryUsage();
         GUILayout.Space(10);
 
         foreach (var poolEntry in m_PoolDict)
@@ -49,6 +56,63 @@
             Instance.m_ShowDebugPanel = !Instance.m_ShowDebugPanel;
         }
     }
+
+    public void LogPoolMemoryUsage()
+    {
+        long totalMemory = 0;
+        long totalFreeMemory = 0;
+        var prefabMemoryDict = new Dictionary<string, long>();
+
+        foreach (var poolEntry in m_PoolDict)
+        {
+            int prefabInstanceId = poolEntry.Key;
+            GameObjectPool pool = poolEntry.Value;
+            string prefabName = pool.Prefab.name;
+            long prefabMemory = 0;
+            long freeMemory = 0;
+
+            // 璁$畻娲昏穬瀵硅薄鐨勫唴瀛樺崰鐢�
+            foreach (var gameObject in pool.m_ActiveHashSet)
+            {
+                if (gameObject != null)
+                {
+                    long memory = Profiler.GetRuntimeMemorySizeLong(gameObject);
+                    prefabMemory += memory;
+                }
+            }
+
+            // 璁$畻绌洪棽瀵硅薄鐨勫唴瀛樺崰鐢�
+            foreach (var gameObject in pool.m_FreeQueue)
+            {
+                if (gameObject != null)
+                {
+                    long memory = Profiler.GetRuntimeMemorySizeLong(gameObject);
+                    prefabMemory += memory;
+                    freeMemory += memory;
+                }
+            }
+
+            totalMemory += prefabMemory;
+            totalFreeMemory += freeMemory;
+            prefabMemoryDict[prefabName] = prefabMemory;
+        }
+
+        // 鎸夊唴瀛樺崰鐢ㄦ帓搴�
+        var sortedPrefabs = prefabMemoryDict.OrderByDescending(kv => kv.Value).Take(3).ToList();
+
+        GUILayout.Label($"鎬诲唴瀛樺崰鐢�: {totalMemory / 1024} KB", GUILayout.Height(30));
+        GUILayout.Label($"绌洪棽鍐呭瓨鍗犵敤: {totalFreeMemory / 1024} KB", GUILayout.Height(30));
+        GUILayout.Label("鍗犵敤鏈�楂樼殑鍓�3棰勫埗浣撳悕:", GUILayout.Height(30));
+        foreach (var prefabInstance in sortedPrefabs)
+        {
+            GUILayout.BeginHorizontal("Box");
+            GUILayout.Label($"{prefabInstance.Key}({prefabInstance.Value / 1024} KB)", GUILayout.Height(25));
+            GUILayout.EndHorizontal();
+        }
+
+    }
+
+
 #endif
     // 姹犵粺璁℃暟鎹�
     public Dictionary<int, PoolStats> PoolStatistics { get; private set; } = new Dictionary<int, PoolStats>();
diff --git a/Main/System/GeneralConfig/GeneralDefine.cs b/Main/System/GeneralConfig/GeneralDefine.cs
index 7b2c547..302a4e9 100644
--- a/Main/System/GeneralConfig/GeneralDefine.cs
+++ b/Main/System/GeneralConfig/GeneralDefine.cs
@@ -12,7 +12,6 @@
     public const int CrossFamilyBattleMapID = 32090;
     public static int initDepotGridCount { get; private set; }
     public static int maxDepotGridCount { get; private set; }
-    public static int initBagGridCount { get; private set; }
     public static int maxBagGridCount { get; private set; }
     public static int maxXBGridCount { get; private set; }
     public static int playerMaxLevel { get; private set; }
@@ -260,7 +259,6 @@
             // BlueEquipJumpLevel = GetInt("BlueEquipJumpLevel");
             // initDepotGridCount = GetInt("InitDepotCellCount");
             // maxDepotGridCount = GetInt("MaxDepotCellCount");
-            // initBagGridCount = GetInt("InitBagCellCount");
             // maxBagGridCount = GetInt("MaxBagCellCount");
             // maxXBGridCount = GetInt("TreasureSet", 3);
 
diff --git a/Main/System/Hero/HeroFetterInfo.cs b/Main/System/Hero/HeroFetterInfo.cs
deleted file mode 100644
index 2bab5c8..0000000
--- a/Main/System/Hero/HeroFetterInfo.cs
+++ /dev/null
@@ -1,56 +0,0 @@
-using System;
-using System.Collections.Generic;
-
-public class HeroFetterInfo
-{
-    private HeroInfo heroInfo;
-    private int fetterId;
-
-	public HeroFetterConfig fetterConfig;
-
-    protected bool isActive = false;
-
-    public HeroFetterInfo(HeroInfo _heroInfo, int _fetterId)
-    {
-        heroInfo = _heroInfo;
-        fetterId = _fetterId;
-
-		fetterConfig = HeroFetterConfig.Get(fetterId);
-    }
-
-    //	鏄惁婵�娲讳簡缇佺粖
-    public bool IsActiveFetter()
-    {
-    	return isActive;
-    }
-
-    public void SetIsActiveFetter(TeamBase teamBase)
-    {
-        int fetterHeroCount = fetterConfig.HeroIDList.Length;
-
-        int count = 0;
-
-        for (int i = 0; i < teamBase.serverHeroes.Length; i++)
-        {
-            TeamHero teamHero = teamBase.serverHeroes[i];
-
-            if (null == teamHero)
-                continue;
-
-            if (Array.IndexOf(fetterConfig.HeroIDList, teamHero.heroId) >= 0)
-            {
-                count++;
-            }
-        }
-
-        isActive = (count >= fetterHeroCount);
-    }
-
-    public int GetFetterAttr(HeroAttrType attrType)
-    {
-        if (!isActive)
-            return 0;
-        
-        return fetterConfig.GetFetterAttr(attrType);
-    }
-}
\ No newline at end of file
diff --git a/Main/System/Hero/HeroInfo.Fetter.cs b/Main/System/Hero/HeroInfo.Fetter.cs
index b5e0f71..9175f06 100644
--- a/Main/System/Hero/HeroInfo.Fetter.cs
+++ b/Main/System/Hero/HeroInfo.Fetter.cs
@@ -1,21 +1,44 @@
 
 
 
+using System.Collections.Generic;
+using System.Linq;
+
 public partial class HeroInfo
 {
 	//  缇佺粖閰嶇疆
-    public HeroFetterConfig fetterConfig;
+	public HeroFetterConfig fetterConfig;
 
-	protected int GetIFByInheritFetterPercent(HeroAttrType attrType)
+
+	public List<int> GetActiveFetter(HeroConfig config, TeamBase teamBase)
 	{
-		//	YYL TODO
-		int total = 0;
-		for (int i = 0; i < fetterInfoList.Count; i++)
-		{
-			HeroFetterInfo fetterInfo = fetterInfoList[i];
-			total += fetterInfo.GetFetterAttr(attrType);
-		}
-		return total;
-	}
+		List<int> list = new List<int>();
+		if (config.FetterIDList.Length == 0)
+			return list;
 
+		foreach (var fetterID in config.FetterIDList)
+		{
+			HeroFetterConfig fetterConfig = HeroFetterConfig.Get(fetterID);
+			int count = 0;
+			for (int i = 0; i < teamBase.tempHeroes.Length; i++)
+			{
+				TeamHero teamHero = teamBase.tempHeroes[i];
+
+				if (null == teamHero)
+					continue;
+
+				if (fetterConfig.HeroIDList.Contains(teamHero.heroId))
+				{
+					count++;
+				}
+				if (count >= fetterConfig.HeroIDList.Length)
+				{
+					list.Add(fetterID);
+					break;
+				}
+			}
+		}
+
+		return list;
+	}
 }
diff --git a/Main/System/Hero/HeroInfo.Properties.cs b/Main/System/Hero/HeroInfo.Properties.cs
index 0d25126..4b383dd 100644
--- a/Main/System/Hero/HeroInfo.Properties.cs
+++ b/Main/System/Hero/HeroInfo.Properties.cs
@@ -115,7 +115,7 @@
         return GetStableProperties(attrType)
                     * GetCultivationPercent(attrType)
                     * GetInheritRate(attrType)
-                    * GetInfluenceByInheritPercent(attrType);
+                    * GetTotalPercent(attrType);
     }
 
 
@@ -139,15 +139,15 @@
     }
 
     //  琚户鎵挎瘮渚嬪奖鍝嶇殑鐧惧垎姣斿睘鎬�
-    public int GetInfluenceByInheritPercent(HeroAttrType attrType)
+    public int GetTotalPercent(HeroAttrType attrType)
     {
         // 锛�1+缇佺粖鍔犳垚%+娼滆兘鍔犳垚%+澶╄祴鍔犳垚%+瑙夐啋鏁堟灉鍔犳垚%锛�
 
         int IFByInheritPercent = 100;
-        IFByInheritPercent += GetIFByInheritFetterPercent(attrType); //缇佺粖鍔犳垚 HeroInfo.Fetter
-        IFByInheritPercent += GetIFByInheritBreakPercent(attrType);  //娼滆兘鍔犳垚 HeroInfo.Break
-        IFByInheritPercent += GetIFByInheritTalentPercent(attrType); //澶╄祴鍔犳垚 HeroInfo.Talent
-        IFByInheritPercent += GetIFByInheritAwakePercent(attrType); //瑙夐啋鍔犳垚 HeroInfo.Awake
+        // IFByInheritPercent += GetIFByInheritFetterPercent(attrType); //缇佺粖鍔犳垚 HeroInfo.Fetter
+        // IFByInheritPercent += GetIFByInheritBreakPercent(attrType);  //娼滆兘鍔犳垚 HeroInfo.Break
+        // IFByInheritPercent += GetIFByInheritTalentPercent(attrType); //澶╄祴鍔犳垚 HeroInfo.Talent
+        // IFByInheritPercent += GetIFByInheritAwakePercent(attrType); //瑙夐啋鍔犳垚 HeroInfo.Awake
         return IFByInheritPercent;
     }
 
diff --git a/Main/System/Hero/HeroInfo.cs b/Main/System/Hero/HeroInfo.cs
index a480fbf..d0cab14 100644
--- a/Main/System/Hero/HeroInfo.cs
+++ b/Main/System/Hero/HeroInfo.cs
@@ -41,7 +41,6 @@
 
 
 
-    public List<HeroFetterInfo> fetterInfoList = new List<HeroFetterInfo>();
     public List<HeroTalentInfo> talentList = new List<HeroTalentInfo>();
 
 
diff --git a/Main/System/Hero/HeroManager.cs b/Main/System/Hero/HeroManager.cs
index af90076..416dbc2 100644
--- a/Main/System/Hero/HeroManager.cs
+++ b/Main/System/Hero/HeroManager.cs
@@ -40,7 +40,7 @@
 
     void OnBeforePlayerDataInitialize()
     {
-        
+
         heroInfoDict.Clear();
     }
 
@@ -73,7 +73,7 @@
             heroInfoDict.TryGetValue(guid, out heroInfo);
 
             heroInfoDict.Remove(guid);
-            
+
             if (null != heroInfo)
                 onHeroDeleteEvent?.Invoke(heroInfo);
         }
@@ -95,12 +95,27 @@
     {
         if (job == 0 && country == 0)
             return heroInfoDict.Keys.ToList();
-            
-        return heroInfoDict.Keys.Where((x) =>
+
+
+        List<string> retGuidList = new List<string>();
+        foreach (string guid in heroInfoDict.Keys)
         {
-            HeroInfo heroInfo = heroInfoDict[x];
-            return heroInfo.heroConfig.Class == job && heroInfo.heroConfig.Country == country;
-        }).ToList();
+            HeroInfo heroInfo = heroInfoDict[guid];
+            //0浠h〃鍏ㄩ儴
+            if (job == 0 || country == 0)
+            {
+                if (job != 0 && job == heroInfo.heroConfig.Class)
+                    retGuidList.Add(guid);
+                if (country != 0 && country == heroInfo.heroConfig.Country)
+                    retGuidList.Add(guid);
+            }
+            else
+            {
+                if (job == heroInfo.heroConfig.Class && country == heroInfo.heroConfig.Country)
+                    retGuidList.Add(guid);
+            }
+        }
+        return retGuidList;
     }
 
     public List<HeroInfo> GetPowerfulHeroList()
@@ -131,7 +146,10 @@
     }
 
 
-
+    public int GetHeroCount()
+    { 
+        return heroInfoDict.Count;
+    }
 
 
 }
\ No newline at end of file
diff --git a/Main/System/Hero/UIHeroController.cs b/Main/System/Hero/UIHeroController.cs
index c2291e3..20fd6af 100644
--- a/Main/System/Hero/UIHeroController.cs
+++ b/Main/System/Hero/UIHeroController.cs
@@ -48,6 +48,7 @@
 		skeletonGraphic.Initialize(true);
 		this.transform.localScale = Vector3.one * scale;
 		spineAnimationState = skeletonGraphic.AnimationState;
+		spineAnimationState.Data.DefaultMix = 0f;
 		PlayAnimation(MotionName.idle, true);
 		spineAnimationState.Complete -= OnAnimationComplete;
 		spineAnimationState.Complete += OnAnimationComplete;
@@ -73,8 +74,8 @@
     {
         if (spineAnimationState == null) return;
 
-        // 鐩存帴浣跨敤 ToString() 鑰屼笉鏄皟鐢� GetAnimationName
-         spineAnimationState.SetAnimation(0, motionName.ToString(), loop);
+		// 鐩存帴浣跨敤 ToString() 鑰屼笉鏄皟鐢� GetAnimationName
+        spineAnimationState.SetAnimation(0, motionName.ToString(), loop);
     }
 
 	/// <summary>
diff --git a/Main/System/HeroUI/HeroBaseWin.cs b/Main/System/HeroUI/HeroBaseWin.cs
index 3efbd11..6f4d8a7 100644
--- a/Main/System/HeroUI/HeroBaseWin.cs
+++ b/Main/System/HeroUI/HeroBaseWin.cs
@@ -9,10 +9,6 @@
 public class HeroBaseWin : FunctionsBaseWin
 {
 
-    [SerializeField] List<Image> funcSelectImgList;
-    [SerializeField] List<Image> funcUnSelectImgList;
-    [SerializeField] List<Text> titleNameList;
-
     /// </summary>
     protected override void InitComponent()
     {
@@ -23,6 +19,7 @@
     protected override void OnPreOpen()
     {
         base.OnPreOpen();
+        tabButtons[functionOrder].SelectBtn(true);
     }
 
     protected override void OnPreClose()
@@ -37,26 +34,6 @@
     }
 
 
-    protected override void UpdateButtonsState()
-    {
-        for (int i = 0; i < funcSelectImgList.Count; i++)
-        {
-            if (i == functionOrder)
-            {
-                funcSelectImgList[i].SetActive(true);
-                funcUnSelectImgList[i].SetActive(false);
-                titleNameList[i].color = UIHelper.GetUIColor(TextColType.titleSelectColor);
-
-            }
-            else
-            {
-                funcSelectImgList[i].SetActive(false);
-                funcUnSelectImgList[i].SetActive(true);
-                titleNameList[i].color = UIHelper.GetUIColor(TextColType.titleUnSelectColor);
-
-            }
-        }
-    }
 
     protected override void OpenSubUIByTabIndex()
     {
diff --git a/Main/System/HeroUI/HeroConnectionCell.cs b/Main/System/HeroUI/HeroConnectionCell.cs
index 7cdeae4..f09ef80 100644
--- a/Main/System/HeroUI/HeroConnectionCell.cs
+++ b/Main/System/HeroUI/HeroConnectionCell.cs
@@ -7,9 +7,27 @@
     [SerializeField] HeroConnectionHeadCell[] heros;
     [SerializeField] Text connAttrText;
 
-    public void Display()
+    public void Display(int fetterID)
     {
-        
+        HeroFetterConfig heroFetterConfig = HeroFetterConfig.Get(fetterID);
+        for (int i = 0; i < heros.Length; i++)
+        {
+            if (i < heroFetterConfig.HeroIDList.Length)
+            {
+                heros[i].SetActive(true);
+                heros[i].Display(heroFetterConfig.HeroIDList[i], i);
+            }
+            else
+            {
+                heros[i].SetActive(false);
+            }
+        }
+        string attrStr = "";
+        for (int i = 0; i < heroFetterConfig.AttrIDList.Length; i++)
+        {
+            attrStr += PlayerPropertyConfig.GetFullDescription(heroFetterConfig.AttrIDList[i], heroFetterConfig.AttrValueList[i]) + " ";
+        }
+        connAttrText.text = Language.Get("L1100", heroFetterConfig.FetterName, UIHelper.AppendColor(TextColType.lightYellow, attrStr));
     }
 }
 
diff --git a/Main/System/HeroUI/HeroConnectionHeadCell.cs b/Main/System/HeroUI/HeroConnectionHeadCell.cs
index 540cffc..0b13c49 100644
--- a/Main/System/HeroUI/HeroConnectionHeadCell.cs
+++ b/Main/System/HeroUI/HeroConnectionHeadCell.cs
@@ -9,6 +9,12 @@
     [SerializeField] Text nameText;
     [SerializeField] Image connMarkImg; //閾炬帴鐨勯攣鍥炬爣锛岀涓�涓笉鏄剧ず
 
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <param name="heroID"></param>
+    /// <param name="index"> 鍙槸涓轰簡璁╃涓�涓笉鏄剧ず閿佸浘鏍囩敤</param>
+    /// <param name="guid">閮ㄥ垎鐣岄潰鏄剧ず涓嶅悓鐨偆鍥炬爣</param>
     public void Display(int heroID, int index, string guid = "")
     {
         int skinID = 0;
diff --git a/Main/System/HeroUI/HeroFormationCell.cs b/Main/System/HeroUI/HeroFormationCell.cs
new file mode 100644
index 0000000..914eb12
--- /dev/null
+++ b/Main/System/HeroUI/HeroFormationCell.cs
@@ -0,0 +1,71 @@
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+
+//闃靛瀷
+public class HeroFormationCell : CellView
+{
+    [SerializeField] Image activeImg;
+    [SerializeField] Image countryOnImg;    //涓婇樀闃靛瀷婵�娲诲浗瀹�
+    [SerializeField] Image[] OnCountImgs;    //涓婇樀鏁伴噺婵�娲�
+    [SerializeField] RichText attrText;
+
+    public void Display(int index)
+    {
+        Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(HeroUIManager.Instance.selectTeamType);
+
+        var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
+        bool sameCountry = result.x == (index + 1);
+
+        activeImg.SetActive(config != null && sameCountry);
+
+
+        countryOnImg.SetSprite("heroTeamCountry" + (index + 1));
+        if (config == null || !sameCountry)
+        {
+            for (int i = 0; i < OnCountImgs.Length; i++)
+            {
+                OnCountImgs[i].SetActive(false);
+            }
+        }
+        else
+        {
+            for (int i = 0; i < OnCountImgs.Length; i++)
+            {
+                if (i < result.y)
+                {
+                    OnCountImgs[i].SetActive(true);
+                    OnCountImgs[i].SetSprite("heroTeamCountryPoint" + result.x);
+                }
+                else
+                {
+                    OnCountImgs[i].SetActive(false);
+                }
+            }
+        }
+
+
+        var attrDict = HeroLineupHaloConfig.GetAttrsByCountry(index + 1);
+        var countList = attrDict.Keys.ToList();
+        countList.Sort();
+        string text = string.Empty;
+        for (int k = 0; k < countList.Count; k++)
+        {
+            int count = countList[k];
+            string lineText = string.Empty;
+            bool isActive = sameCountry && count <= result.y;
+            string countStr = isActive ? UIHelper.AppendColor(TextColType.Green, count.ToString()) : count.ToString();
+            lineText = (k == 0 ? "" : "</r>") + Language.Get("herocard37", countStr, RichTextMsgReplaceConfig.GetRichReplace("Country", index + 1));
+            var attrConfig = attrDict[count];
+            for (int i = 0; i < attrConfig.AttrIDList.Length; i++)
+            {
+                string format = !isActive ? "{0}+{1}" : "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}");
+                lineText += " " + PlayerPropertyConfig.GetFullDescription(attrConfig.AttrIDList[i], attrConfig.AttrValueList[i], format);
+            }
+
+            text += UIHelper.AppendColor(isActive ? TextColType.NavyBrown : TextColType.Gray, lineText);
+        }
+        attrText.text = text;
+    }
+}
+
diff --git a/Main/System/Hero/HeroFetterInfo.cs.meta b/Main/System/HeroUI/HeroFormationCell.cs.meta
similarity index 83%
rename from Main/System/Hero/HeroFetterInfo.cs.meta
rename to Main/System/HeroUI/HeroFormationCell.cs.meta
index b759df1..37d6bc3 100644
--- a/Main/System/Hero/HeroFetterInfo.cs.meta
+++ b/Main/System/HeroUI/HeroFormationCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 61d40aba9c2091445ae692419d4c5ebf
+guid: bfc8cbe2e59ef934db88a564da0a7869
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/HeroUI/HeroFormationWin.cs b/Main/System/HeroUI/HeroFormationWin.cs
new file mode 100644
index 0000000..4c8e657
--- /dev/null
+++ b/Main/System/HeroUI/HeroFormationWin.cs
@@ -0,0 +1,70 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+/// <summary>
+/// 姝﹀皢闃靛瀷婵�娲荤晫闈�
+/// </summary>
+public class HeroFormationWin : UIBase
+{
+    [SerializeField] Button closeBtn;
+    [SerializeField] ScrollerController scroller;
+    [SerializeField] Text totalAttrText;     
+
+
+    protected override void InitComponent()
+    {
+        closeBtn.AddListener(CloseWindow);
+    }
+
+
+    protected override void OnPreOpen()
+    {
+        scroller.OnRefreshCell += OnRefreshCell;
+        CreateScroller();
+
+        Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(HeroUIManager.Instance.selectTeamType);
+
+        var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
+        if (config == null)
+        {
+            totalAttrText.text = "";
+        }
+        else
+        {
+            string lineText = string.Empty;
+
+            for (int i = 0; i < config.AttrIDList.Length; i++)
+            {
+                string format = "{0}+" + UIHelper.AppendColor(TextColType.Green, "{1}");
+                lineText += " " + PlayerPropertyConfig.GetFullDescription(config.AttrIDList[i], config.AttrValueList[i], format);
+            }
+            totalAttrText.text = Language.Get("herocard36") + lineText.Trim();
+        }
+    }
+
+    protected override void OnPreClose()
+    {
+        scroller.OnRefreshCell -= OnRefreshCell;
+    }
+
+
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as HeroFormationCell;
+        _cell.Display(cell.index);
+    }
+
+    void CreateScroller()
+    {
+        scroller.Refresh();
+        for (int i = 0; i < 4; i++)
+        {
+            scroller.AddCell(ScrollerDataType.Header, i);
+        }
+        scroller.Restart();
+    }
+
+}
\ No newline at end of file
diff --git a/Main/System/Hero/HeroFetterInfo.cs.meta b/Main/System/HeroUI/HeroFormationWin.cs.meta
similarity index 83%
copy from Main/System/Hero/HeroFetterInfo.cs.meta
copy to Main/System/HeroUI/HeroFormationWin.cs.meta
index b759df1..fff13af 100644
--- a/Main/System/Hero/HeroFetterInfo.cs.meta
+++ b/Main/System/HeroUI/HeroFormationWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 61d40aba9c2091445ae692419d4c5ebf
+guid: 93fbb2862890fb440bc497898f9935ef
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/HeroUI/HeroPosWin.cs b/Main/System/HeroUI/HeroPosWin.cs
index 8656678..0cbf08c 100644
--- a/Main/System/HeroUI/HeroPosWin.cs
+++ b/Main/System/HeroUI/HeroPosWin.cs
@@ -3,14 +3,19 @@
 using UnityEngine;
 using UnityEngine.UI;
 using DG.Tweening;
+using Cysharp.Threading.Tasks;
+using System.Threading;
+using System;
 
 /// <summary>
-/// 姝﹀皢甯冮樀: 濡傛灉鍙互鍚屾椂鎵撳紑澶氫釜甯冮樀鐣岄潰 鍒欎娇鐢� functionOrder锛氬竷闃电被鍨�
+/// 姝﹀皢甯冮樀鐣岄潰
 /// </summary>
 public class HeroPosWin : UIBase
 {
     [SerializeField] Text[] attrOnList; //涓婇樀灞炴�у姞鎴�
+    [SerializeField] Button countryOnBtn;
     [SerializeField] Image countryOnImg;    //涓婇樀闃靛瀷婵�娲诲浗瀹�
+    [SerializeField] UIEffectPlayer countryEffect;
     [SerializeField] List<Image> OnCountImgs;    //涓婇樀鏁伴噺婵�娲�
     [SerializeField] List<Image> scenePosImgs;  //鍦烘櫙甯冮樀浣嶇疆
     [SerializeField] HeroScenePosCell[] sceneHero;
@@ -22,14 +27,14 @@
     [SerializeField] ScrollerController heroListScroller;
     [SerializeField] Transform heroListEmpty;
     [SerializeField] Toggle showConnTipToggleBtn;
-    private bool isToggleOn = false;
+
     [SerializeField] HeroSelectBehaviour fiterManager;  //姝﹀皢绛涢��
 
     [SerializeField] Button oneKeyOnBtn;     //涓�閿笂闃�
     [SerializeField] Button saveBtn;        //淇濆瓨闃靛瀷
     [SerializeField] Button backBtn;      //閫�鍑虹晫闈�
     [SerializeField] GroupButtonEx jjcBtn;       //绔炴妧鍦�
-    [SerializeField] GroupButtonEx tttBtn;        //閫氬ぉ濉�
+    // [SerializeField] GroupButtonEx tttBtn;        //閫氬ぉ濉�
     [SerializeField] GroupButtonEx mainFBBtn;     //涓荤嚎鍓湰
 
     //缇佺粖
@@ -38,43 +43,75 @@
     [SerializeField] CanvasGroup flyAlphaTween;
 
     Sequence sequence;
+    CancellationTokenSource _cts;
+    Queue<int> showConnectTipQueue = new Queue<int>();
+
+    private bool m_IsToggleOn = false;
+    private bool isToggleOn
+    { 
+        get { return m_IsToggleOn; }
+        set
+        {
+            if (m_IsToggleOn != value)
+            {
+                m_IsToggleOn = value;
+                LocalSave.SetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, value);
+            }
+        }
+    }
 
     protected override void InitComponent()
     {
         attackTeamBtn.AddListener(() =>
         {
-            if (HeroUIManager.Instance.selectTeamType == TeamType.Arena)
-            {
-                return;
-            }
-
-            HeroUIManager.Instance.selectTeamType = (TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(0);
-            Refresh();
+            SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(0));
         });
         defendTeamBtn.AddListener(() =>
         {
-            if (HeroUIManager.Instance.selectTeamType == TeamType.ArenaDefense)
-            {
-                return;
-            }
-            HeroUIManager.Instance.selectTeamType = (TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(1);
-            Refresh();
+            SelectTeamFunc((TeamType)HeroUIManager.Instance.GetSelectTeamTypeByAttackType(1));
         });
+
+        mainFBBtn.AddListener(() =>
+        {
+            SelectTeamFunc(TeamType.Story);
+        });
+
+        jjcBtn.AddListener(() =>
+        {
+            SelectTeamFunc(TeamType.Arena);
+        });
+        // tttBtn.AddListener(() =>
+        // {
+        //     SelectTeamFunc(TeamType.Tower);
+        // });
 
         showConnTipToggleBtn.AddListener((value) =>
         {
             isToggleOn = showConnTipToggleBtn.isOn;
+            if (isToggleOn == false)
+            {
+                CancelCurrentTask();
+            }
         });
         oneKeyOnBtn.AddListener(OneKeyOnPos);
         saveBtn.AddListener(SaveTeam);
 
         backBtn.AddListener(CloseWindow);
+
+        countryOnBtn.AddListener(() =>
+        {
+            UIManager.Instance.OpenWindow<HeroFormationWin>();
+        });
+
+        m_IsToggleOn = LocalSave.GetBool("ShowConn" + PlayerDatas.Instance.baseData.PlayerID, false);
     }
 
 
     protected override void OnPreOpen()
     {
-        HeroUIManager.Instance.SortHeroOnTeamList();    //鎵撳紑鐣岄潰鍜屼繚瀛橈紙鏈嶅姟绔級鏇存柊闃靛鏄埛鏂�
+        HeroUIManager.Instance.selectTeamPosJob = 0;
+        HeroUIManager.Instance.selectTeamPosCountry = 0;
+        HeroUIManager.Instance.SortHeroOnTeamList();
         heroListScroller.OnRefreshCell += OnRefreshCell;
         HeroUIManager.Instance.OnTeamPosChangeEvent += TeamChangeEvent;
         CreateScroller();
@@ -83,7 +120,10 @@
 
     protected override void OnPreClose()
     {
+        CancelCurrentTask();
         heroListScroller.OnRefreshCell -= OnRefreshCell;
+        HeroUIManager.Instance.OnTeamPosChangeEvent -= TeamChangeEvent;
+        TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType).RestoreTeam();
     }
 
 
@@ -94,8 +134,9 @@
         RefreshOnTeamBtn();
         RefreshTeamHero();
         RefreshFlyHead();
+        RefreshConn();
 
-        if (HeroUIManager.Instance.heroOnTeamSortList.Count == 0)
+        if (HeroManager.Instance.GetHeroCount() == 0)
         {
             heroListEmpty.SetActive(true);
             heroListScroller.SetActive(false);
@@ -108,10 +149,12 @@
 
         showConnTipToggleBtn.isOn = isToggleOn;
 
-        fiterManager.Display(0, 0, 0, SelectJobCountry);
+        fiterManager.Display(0, HeroUIManager.Instance.selectTeamPosJob, HeroUIManager.Instance.selectTeamPosCountry, SelectJobCountry);
 
 
         fightPowerText.text = "1234k";
+
+        
     }
 
     void RefreshFlyHead()
@@ -123,11 +166,21 @@
         flyHead.transform.localScale = Vector3.zero;
     }
 
+    void RefreshConn()
+    {
+        connetionForm.SetActive(false);
+        var canvasConn = connetionForm.GetComponent<Canvas>();
+        canvasConn.sortingLayerID = canvas.sortingLayerID;
+        canvasConn.sortingOrder = canvas.sortingOrder + 9;
+        CancelCurrentTask();
+    }
+
     void SelectJobCountry(int job, int country)
     {
         HeroUIManager.Instance.selectTeamPosJob = job;
         HeroUIManager.Instance.selectTeamPosCountry = country;
         HeroUIManager.Instance.SortHeroOnTeamList();
+        CreateScroller();
     }
 
     void OnRefreshCell(ScrollerDataType type, CellView cell)
@@ -176,14 +229,14 @@
     }
 
     //涓婇樀姝﹀皢鍥藉鍏夌幆婵�娲�
-    void RefreshOnTeamCountry()
+    void RefreshOnTeamCountry(bool playEffect = false)
     {
         Int2 result = HeroUIManager.Instance.GetMaxCountHeroCountry(HeroUIManager.Instance.selectTeamType);
 
         var config = HeroLineupHaloConfig.GetConfig(result.x, result.y);
         if (config == null)
         {
-            countryOnImg.SetSprite("heroTeamCountry" + result.x);
+            countryOnImg.SetSprite("heroTeamCountry0");
             for (int i = 0; i < OnCountImgs.Count; i++)
             {
                 OnCountImgs[i].SetActive(false);
@@ -204,8 +257,9 @@
                     OnCountImgs[i].SetActive(false);
                 }
             }
+            if (playEffect)
+                countryEffect.Play();
         }
-
 
     }
 
@@ -258,7 +312,7 @@
     }
 
     void RefreshPosScale()
-    { 
+    {
         for (int i = 0; i < scenePosImgs.Count; i++)
         {
             scenePosImgs[i].transform.localScale = Vector3.one;
@@ -292,6 +346,7 @@
         }
         RefreshPosScale();
         heroListScroller.m_Scorller.RefreshActiveCellViews();
+        RefreshOnTeamCountry(true);
 
         //琛ㄧ幇椋炲叆锛岃繛缁偣鍑讳笉鍚屽ご鍍忚Е鍙戠殑璇濆垯閲嶇疆
         if (flyFrom > -1)
@@ -317,7 +372,72 @@
                 .Join(flyHead.transform.DOScale(new Vector3(0.5f, 0.5f, 0.5f), HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad))
                 .Join(flyAlphaTween.DOFade(0f, HeroUIManager.clickFlyPosTime).SetEase(Ease.OutQuad));
             sequence.onComplete = () => { flyHead.transform.localScale = Vector3.zero; };
+
+            if (isToggleOn)
+            { 
+                ShowFetter(flyHero);
+            }
         }
+    }
+
+    void ShowFetter(HeroInfo hero)
+    {
+        var heroConfig = hero.heroConfig;
+        var fetterList = hero.GetActiveFetter(heroConfig, TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType));
+        for (int i = 0; i < fetterList.Count; i++)
+        {
+            if(!showConnectTipQueue.Contains(fetterList[i]))
+                showConnectTipQueue.Enqueue(fetterList[i]);
+        }
+
+        if (_cts == null)
+        {
+            _cts = new CancellationTokenSource();
+            RunTaskAsync(_cts.Token).Forget(); // Forget() 琛ㄧず涓嶇瓑寰呮浠诲姟瀹屾垚
+        }
+
+    }
+    async UniTask RunTaskAsync(CancellationToken token)
+    {
+        try
+        {
+            while (showConnectTipQueue.Count > 0)
+            {
+                await UniTask.Delay(300, cancellationToken: token);
+                showConnectTipQueue.TryDequeue(out int fetterID);
+                if (fetterID == 0)
+                {
+                    continue;
+                }
+                connetionForm.SetActive(true);
+                connetionForm.Display(fetterID);
+                //鏄剧ず1.5绉掑悗鍏抽棴
+                await UniTask.Delay(1500, cancellationToken: token);
+                connetionForm.SetActive(false);
+            }
+
+        }
+        catch (OperationCanceledException)
+        {
+            Debug.Log("缇佺粖 鍗忕▼琚彇娑�");
+            connetionForm.SetActive(false);
+        }
+        finally
+        {
+            _cts?.Dispose();     // 閲婃斁璧勬簮
+            _cts = null;         // 缃┖閬垮厤閲嶅鍙栨秷
+            showConnectTipQueue.Clear();
+        }
+
+    }
+
+    // 鍙栨秷褰撳墠姝e湪杩愯鐨勪换鍔�
+    public void CancelCurrentTask()
+    {
+        _cts?.Cancel();      // 瑙﹀彂鍙栨秷
+        _cts?.Dispose();     // 閲婃斁璧勬簮
+        _cts = null;         // 缃┖閬垮厤閲嶅鍙栨秷
+        showConnectTipQueue.Clear();
     }
 
     void OneKeyOnPos()
@@ -339,4 +459,19 @@
         var team = TeamManager.Instance.GetTeam(HeroUIManager.Instance.selectTeamType);
         team.SaveTeam();
     }
+
+    void SelectTeamFunc(TeamType type)
+    {
+        if (HeroUIManager.Instance.selectTeamType == type)
+        {
+            return;
+        }
+        
+        HeroUIManager.Instance.selectTeamPosJob = 0;
+        HeroUIManager.Instance.selectTeamPosCountry = 0;
+        HeroUIManager.Instance.SortHeroOnTeamList();
+        HeroUIManager.Instance.selectTeamType = type;
+        Refresh();
+        heroListScroller.m_Scorller.RefreshActiveCellViews();
+    }
 }
\ No newline at end of file
diff --git a/Main/System/HeroUI/HeroScenePosCell.cs b/Main/System/HeroUI/HeroScenePosCell.cs
index 9846fdc..a8351d2 100644
--- a/Main/System/HeroUI/HeroScenePosCell.cs
+++ b/Main/System/HeroUI/HeroScenePosCell.cs
@@ -39,7 +39,7 @@
             heroConfig.AtkDistType == 2 && TeamConst.TeamPos1Array.Contains(index))
         {
             suggestForm.SetActive(true);
-            jobTip.text = Language.Get("heroClass" + heroConfig.Class);
+            jobTip.text = RichTextMsgReplaceConfig.GetRichReplace("Class", heroConfig.Class);
             posTip.text = Language.Get("heroAtkDistType" + heroConfig.AtkDistType);
         }
         else
diff --git a/Main/System/HeroUI/HeroSelectBehaviour.cs b/Main/System/HeroUI/HeroSelectBehaviour.cs
index 2430711..0385c40 100644
--- a/Main/System/HeroUI/HeroSelectBehaviour.cs
+++ b/Main/System/HeroUI/HeroSelectBehaviour.cs
@@ -12,16 +12,16 @@
     [SerializeField] Button unFoldBtn;  //灞曞紑鎸夐挳
     [SerializeField] GroupButtonEx[] jobsBtn;
     [SerializeField] GroupButtonEx[] countrysBtn;
-    [SerializeField] GroupButtonExManager jobManager; 
-    [SerializeField] GroupButtonExManager countryManager; 
+    [SerializeField] GroupButtonExManager jobManager;
+    [SerializeField] GroupButtonExManager countryManager;
 
     int m_Job = 0;
     int m_Country = 0;
     int foldState = 0;  //0 鏀惰捣锛�1 灞曞紑
 
     //鐐瑰嚮鎸夐挳闇�閫氱煡鍝嶅簲澶栭儴浜嬩欢
-    public Action<int, int> selectAction;
-    
+    private Action<int, int> selectAction;
+
 
 
 
@@ -92,5 +92,19 @@
         unFoldForm.SetActive(foldState == 1);
         foldForm.SetActive(foldState == 0);
     }
+    
+
+    private void LateUpdate()
+    {
+        if (foldState == 0)
+            return;
+        if (Input.GetMouseButtonDown(0))
+        {
+            if (!RectTransformUtility.RectangleContainsScreenPoint(this.transform as RectTransform, Input.mousePosition, CameraManager.uiCamera))
+            {
+                foldBtn.onClick.Invoke();
+            }
+        }
+    }
 }
 
diff --git a/Main/System/HeroUI/HeroUIManager.cs b/Main/System/HeroUI/HeroUIManager.cs
index 1efeaae..6890863 100644
--- a/Main/System/HeroUI/HeroUIManager.cs
+++ b/Main/System/HeroUI/HeroUIManager.cs
@@ -93,7 +93,24 @@
     #region 甯冮樀鐣岄潰
     public List<string> heroOnTeamSortList { get; private set; } = new List<string>();    //涓嶅悓涓婇樀鐨勫垪琛ㄦ帓搴�
 
-    public TeamType selectTeamType = TeamType.Story;  //褰撳墠閫変腑鐨勬槸鍝釜闃靛, 甯冮樀鐩稿叧閫昏緫浣跨敤
+    private TeamType m_SelectTeamType = TeamType.Story; //褰撳墠閫変腑鐨勬槸鍝釜闃靛, 甯冮樀鐩稿叧閫昏緫浣跨敤
+    public TeamType selectTeamType
+    { 
+        get { return m_SelectTeamType; }
+        set
+        {
+            if (m_SelectTeamType == value)
+                return;
+            //涓婁竴涓樀瀹归渶瑕佹仮澶嶅埌鍘熺姸鎬�
+            if (m_SelectTeamType != TeamType.None)
+            {
+                TeamManager.Instance.GetTeam(m_SelectTeamType).RestoreTeam();
+            }
+
+            m_SelectTeamType = value;
+        }
+    }  
+
     public int selectTeamPosJob = 0;    //甯冮樀鐣岄潰 绛涢�夎亴涓�
     public int selectTeamPosCountry = 0;    //甯冮樀鐣岄潰 绛涢�夊浗瀹�
 
@@ -160,23 +177,21 @@
         var team = TeamManager.Instance.GetTeam(teamType);
         if (team != null)
         {
-            for (int i = 0; i < team.serverHeroes.Length; i++)
+            for (int i = 0; i < team.tempHeroes.Length; i++)
             {
-                if (team.serverHeroes[i] == null)
+                if (team.tempHeroes[i] == null)
                     continue;
-                var hero = HeroManager.Instance.GetHero(team.serverHeroes[i].guid);
-                if (hero != null)
-                {
-                    if (!heroCountryCount.ContainsKey(hero.heroCountry))
-                    {
-                        heroCountryCount.Add(hero.heroCountry, 1);
-                    }
-                    else
-                    {
-                        heroCountryCount[hero.heroCountry] += 1;
-                    }
+                var country = (HeroCountry)team.tempHeroes[i].heroConfig.Country;
 
+                if (!heroCountryCount.ContainsKey(country))
+                {
+                    heroCountryCount.Add(country, 1);
                 }
+                else
+                {
+                    heroCountryCount[country] = heroCountryCount[country] + 1;
+                }
+
             }
 
         }
@@ -226,7 +241,7 @@
         //鎺ㄨ崘闃靛鐨勭畻娉曢�昏緫
         //鑷姩閫夋嫨浼樺厛绾э細姝﹀皢绛夌骇锛炵獊鐮寸瓑绾э紴姝﹀皢瑙夐啋闃剁骇锛炴灏嗗搧璐紴姝﹀皢鍚炲櫖鏄熺骇锛炴灏咺D
         var tmpList = HeroManager.Instance.GetHeroGuidList();
-        tmpList.Sort(CmpHeroByTeamType);
+        tmpList.Sort(CmpHeroRecommend);
 
 
         //鎺ㄨ崘鏈�澶�6涓紝瀛樺湪鐩稿悓heroid锛屽垯璺宠繃
diff --git a/Main/System/KnapSack/Logic/ItemLogicUtility.cs b/Main/System/KnapSack/Logic/ItemLogicUtility.cs
index ac55fb5..e43d797 100644
--- a/Main/System/KnapSack/Logic/ItemLogicUtility.cs
+++ b/Main/System/KnapSack/Logic/ItemLogicUtility.cs
@@ -352,7 +352,7 @@
             SinglePack singlePack = packModel.GetSinglePack(PackType.Item);
             if (singlePack == null) return false;
 
-            int startLockIndex = singlePack.unlockedGridCount - GeneralDefine.initBagGridCount;
+            int startLockIndex = singlePack.unlockedGridCount - PackManager.Instance.initBagGridCount;
             FuncConfigConfig _tagFuncModel = FuncConfigConfig.Get("OpenBagItem");
             int haveCount = packModel.GetItemCountByID(PackType.Item, itemId);
             Equation.Instance.Clear();
diff --git a/Main/System/KnapSack/Logic/PackGirdCell.cs b/Main/System/KnapSack/Logic/PackGirdCell.cs
new file mode 100644
index 0000000..16b5df8
--- /dev/null
+++ b/Main/System/KnapSack/Logic/PackGirdCell.cs
@@ -0,0 +1,17 @@
+锘縰sing UnityEngine;
+
+/// <summary>
+/// 鑳屽寘鏍煎瓙
+/// </summary>
+public class PackGirdCell : MonoBehaviour
+{
+    [SerializeField] ItemCell itemCell;
+    [SerializeField] RedpointBehaviour redPoint;    // 姝ゅ绾㈢偣鍙互鐢ㄥ浘鐗囪〃绀�
+    public void Display(int index)
+    {
+        var guid = PackManager.Instance.GetSinglePack(PackType.Item).itemGuidList[index];
+        if (string.IsNullOrEmpty(guid))
+            return;
+        itemCell.Init(PackManager.Instance.GetItemByGuid(guid));
+    }
+}
diff --git a/Main/System/Hero/HeroFetterInfo.cs.meta b/Main/System/KnapSack/Logic/PackGirdCell.cs.meta
similarity index 83%
copy from Main/System/Hero/HeroFetterInfo.cs.meta
copy to Main/System/KnapSack/Logic/PackGirdCell.cs.meta
index b759df1..d25b99a 100644
--- a/Main/System/Hero/HeroFetterInfo.cs.meta
+++ b/Main/System/KnapSack/Logic/PackGirdCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 61d40aba9c2091445ae692419d4c5ebf
+guid: 3c64a63d0c44fce40a3d1b90b18b2324
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/KnapSack/Logic/RolePackLineCell.cs b/Main/System/KnapSack/Logic/RolePackLineCell.cs
new file mode 100644
index 0000000..bb860db
--- /dev/null
+++ b/Main/System/KnapSack/Logic/RolePackLineCell.cs
@@ -0,0 +1,26 @@
+锘縰sing UnityEngine;
+
+/// <summary>
+/// 鑳屽寘鏍煎瓙琛�
+/// </summary>
+public class RolePackLineCell : CellView
+{
+    [SerializeField] PackGirdCell[] itemCell;
+    public void Display(int index)
+    {
+        var itemPack = PackManager.Instance.GetSinglePack(PackType.Item);
+        for (int i = 0; i < itemCell.Length; i++)
+        {
+            if (index + i < itemPack.itemGuidList.Count)
+            {
+                itemCell[i].SetActive(true);
+                itemCell[i].Display(index + i);
+            }
+            else
+            {
+                itemCell[i].SetActive(false);
+            }
+        }
+
+    }
+}
diff --git a/Main/System/Hero/HeroFetterInfo.cs.meta b/Main/System/KnapSack/Logic/RolePackLineCell.cs.meta
similarity index 83%
copy from Main/System/Hero/HeroFetterInfo.cs.meta
copy to Main/System/KnapSack/Logic/RolePackLineCell.cs.meta
index b759df1..a1191e5 100644
--- a/Main/System/Hero/HeroFetterInfo.cs.meta
+++ b/Main/System/KnapSack/Logic/RolePackLineCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 61d40aba9c2091445ae692419d4c5ebf
+guid: b5df92a5e4b691444919db543a27de21
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/KnapSack/Logic/RolePackWin.cs b/Main/System/KnapSack/Logic/RolePackWin.cs
new file mode 100644
index 0000000..cabf0db
--- /dev/null
+++ b/Main/System/KnapSack/Logic/RolePackWin.cs
@@ -0,0 +1,184 @@
+using System;
+using UnityEngine;
+
+/// <summary>
+/// 鑳屽寘鐣岄潰
+/// </summary>
+public class RolePackWin : UIBase
+{
+
+    [SerializeField] ScrollerController packScroller;
+    [SerializeField] ScrollerController composeScroller;
+    [SerializeField] GroupButtonEx packBtn;
+    [SerializeField] GroupButtonEx composeBtn;
+
+
+    SinglePack itemPack;
+    bool isRefreshPack = false;  //鏄惁鍒锋柊鑳屽寘
+    /// </summary>
+    protected override void InitComponent()
+    {
+        packBtn.AddListener(() =>
+        {
+            functionOrder = 0;
+            Refresh();
+        });
+        composeBtn.AddListener(() =>
+        {
+            functionOrder = 1;
+            Refresh();
+        });
+    }
+
+
+    protected override void OnPreOpen()
+    {
+        itemPack = PackManager.Instance.GetSinglePack(PackType.Item);
+        packScroller.OnRefreshCell += RefreshPackCell;
+        composeScroller.OnRefreshCell += RefreshComposeCell;
+        PackManager.Instance.refrechPackEvent += RefrechPackEvent;
+        PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
+
+        if (functionOrder == 0)
+        {
+            packBtn.SelectBtn();
+        }
+        else
+        {
+            composeBtn.SelectBtn();
+        }
+        SortItems();
+        Refresh();
+    }
+
+    protected override void OnPreClose()
+    {
+        packScroller.OnRefreshCell -= RefreshPackCell;
+        composeScroller.OnRefreshCell -= RefreshComposeCell;
+        PackManager.Instance.refrechPackEvent -= RefrechPackEvent;
+    }
+
+    float cdTime = 0f;
+    void LateUpdate()
+    {
+        if (isRefreshPack)
+        {
+            //鍒锋柊cd0.2绉�
+            if (Time.time > cdTime + 0.2f)
+            {
+                SortItems();
+                Refresh();
+                isRefreshPack = false;
+                cdTime = Time.time;
+            }
+
+        }
+    }
+
+    void RefrechPackEvent(PackType type)
+    {
+        if (type != PackType.Item)
+        {
+            return;
+        }
+        //寤惰繜0.2绉掑埛鏂� 璁剧疆 isRefreshPack涓簍rue
+        isRefreshPack = true;
+
+    }
+
+    void RefreshItemEvent(PackType type, int index, int itemID)
+    { 
+        if (type != PackType.Item)
+        {
+            return;
+        }
+        isRefreshPack = true;
+    }
+
+
+    public override void Refresh()
+    {
+
+        packScroller.SetActive(functionOrder == 0);
+        composeScroller.SetActive(functionOrder != 0);
+        CreatePackScroller();
+        CreateComposeScroller();
+    }
+
+    void SortItems()
+    {
+        itemPack.itemGuidList.Clear();
+        var itemDict = itemPack.GetAllItems();
+        foreach (var itemID in itemDict.Values)
+        {
+            itemPack.itemGuidList.Add(itemID.guid);
+        }
+        itemPack.itemGuidList.Sort(CmpItem);
+    }
+
+    int CmpItem(string guidA, string guidB)
+    {
+        var itemA = PackManager.Instance.GetItemByGuid(guidA);
+        var itemB = PackManager.Instance.GetItemByGuid(guidB);
+
+        var typeIndexA = Array.IndexOf(PackManager.Instance.itemPackSortTyps, itemA.config.Type);
+        var typeIndexB = Array.IndexOf(PackManager.Instance.itemPackSortTyps, itemB.config.Type);
+        if (typeIndexA != typeIndexB)
+        {
+            return typeIndexA - typeIndexB;
+        }
+
+        var qualityA = itemA.config.ItemColor;
+        var qualityB = itemB.config.ItemColor;
+        if (qualityA != qualityB)
+        {
+            return qualityB - qualityA;
+        }
+
+        var lvA = itemA.config.LV;
+        var lvB = itemB.config.LV;
+        if (lvA != lvB)
+        {
+            return lvB - lvA;
+        }
+
+        var itemIDA = itemA.config.ID;
+        var itemIDB = itemB.config.ID;
+        return itemIDA - itemIDB;
+    }
+
+    void CreatePackScroller()
+    {
+        if (functionOrder != 0)
+        {
+            return;
+        }
+        packScroller.Refresh();
+        for (int i = 0; i < itemPack.itemGuidList.Count; i++)
+        {
+            if (i % 5 == 0)
+            {
+                packScroller.AddCell(ScrollerDataType.Header, i);
+            }
+        }
+        packScroller.Restart();
+    }
+
+    void CreateComposeScroller()
+    {
+        if (functionOrder != 1)
+        {
+            return;
+        }
+    }
+
+    void RefreshPackCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as RolePackLineCell;
+        _cell.Display(cell.index);
+    }
+
+    void RefreshComposeCell(ScrollerDataType type, CellView cell)
+    {
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Hero/HeroFetterInfo.cs.meta b/Main/System/KnapSack/Logic/RolePackWin.cs.meta
similarity index 83%
copy from Main/System/Hero/HeroFetterInfo.cs.meta
copy to Main/System/KnapSack/Logic/RolePackWin.cs.meta
index b759df1..f7f55ff 100644
--- a/Main/System/Hero/HeroFetterInfo.cs.meta
+++ b/Main/System/KnapSack/Logic/RolePackWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 61d40aba9c2091445ae692419d4c5ebf
+guid: bbbbfd91a59637f4cb7cee421f98052c
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/KnapSack/Logic/SinglePack.cs b/Main/System/KnapSack/Logic/SinglePack.cs
index c597917..36f22b3 100644
--- a/Main/System/KnapSack/Logic/SinglePack.cs
+++ b/Main/System/KnapSack/Logic/SinglePack.cs
@@ -1,7 +1,4 @@
-锘縰sing System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+锘縰sing System.Collections.Generic;
 
 public class SinglePack
 {
@@ -9,6 +6,9 @@
     public int unlockedGridCount { get; private set; }  //宸插紑鍚儗鍖呮牸瀛愭暟
     private Dictionary<int, ItemModel> items = new Dictionary<int, ItemModel>(); //key 鐗╁搧浣嶇疆绱㈠紩
     private Dictionary<int, List<int>> itemIDs = new Dictionary<int, List<int>>(); //key 鐗╁搧ID锛氱墿鍝佷綅缃储寮�
+
+    public List<string> itemGuidList = new List<string>();  //鍓嶇鐣岄潰GUID鎺掑簭锛屽悇涓儗鍖呮牴鎹疄闄呮儏鍐典娇鐢�
+
     public SinglePack(PackType type)
     {
         this.type = type;
diff --git a/Main/System/KnapSack/Logic/composeLineCell.cs b/Main/System/KnapSack/Logic/composeLineCell.cs
new file mode 100644
index 0000000..72122ec
--- /dev/null
+++ b/Main/System/KnapSack/Logic/composeLineCell.cs
@@ -0,0 +1,14 @@
+锘縰sing UnityEngine;
+
+/// <summary>
+/// 鍚堟垚鏍煎瓙琛�
+/// </summary>
+public class composeLineCell : CellView
+{
+    [SerializeField] PackGirdCell[] itemCell;
+    public void Display(int index)
+    {
+        
+
+    }
+}
diff --git a/Main/System/Hero/HeroFetterInfo.cs.meta b/Main/System/KnapSack/Logic/composeLineCell.cs.meta
similarity index 83%
copy from Main/System/Hero/HeroFetterInfo.cs.meta
copy to Main/System/KnapSack/Logic/composeLineCell.cs.meta
index b759df1..0418484 100644
--- a/Main/System/Hero/HeroFetterInfo.cs.meta
+++ b/Main/System/KnapSack/Logic/composeLineCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 61d40aba9c2091445ae692419d4c5ebf
+guid: ff43611139197a9479fcc08c18d025f4
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/KnapSack/New/CommonItemBaisc.cs b/Main/System/KnapSack/New/CommonItemBaisc.cs
index a2bb5ed..6ba1861 100644
--- a/Main/System/KnapSack/New/CommonItemBaisc.cs
+++ b/Main/System/KnapSack/New/CommonItemBaisc.cs
@@ -20,11 +20,12 @@
     public ItemCellformat format { get { return m_Format; } set { m_Format = value; } }
 
     Image m_BgIcon;
-    private Image bgIcon {
-        get {
+    private Image bgIcon
+    {
+        get
+        {
             if (m_BgIcon == null)
             {
-                LoadPrefab();
                 m_BgIcon = this.transform.GetComponent<Image>("Container_ItemCell/Img_BackGround");
             }
             return m_BgIcon;
@@ -32,11 +33,12 @@
     }
 
     Image m_ItemIcon;
-    private Image itemIcon {
-        get {
+    private Image itemIcon
+    {
+        get
+        {
             if (m_ItemIcon == null)
             {
-                LoadPrefab();
                 m_ItemIcon = this.transform.GetComponent<Image>("Container_ItemCell/Img_Icon");
             }
             return m_ItemIcon;
@@ -45,11 +47,12 @@
 
 
     Image m_StateIcon;
-    public Image stateIcon {
-        get {
+    public Image stateIcon
+    {
+        get
+        {
             if (m_StateIcon == null)
             {
-                LoadPrefab();
                 m_StateIcon = this.transform.GetComponent<Image>("Container_ItemCell/Img_State");
             }
             return m_StateIcon;
@@ -57,61 +60,99 @@
     }
 
     Text m_CountText;
-    public Text countText {
-        get {
+    public Text countText
+    {
+        get
+        {
             if (m_CountText == null)
             {
-                LoadPrefab();
                 m_CountText = this.transform.GetComponent<Text>("Container_ItemCell/Txt_Count");
             }
             return m_CountText;
         }
     }
 
+    Image m_CountryIcon;
+    public Image countryIcon
+    {
+        get
+        {
+            if (m_CountryIcon == null)
+            {
+                m_CountryIcon = this.transform.GetComponent<Image>("Container_ItemCell/Img_Country");
+            }
+            return m_CountryIcon;
+        }
+    }
+
+    Image m_PieceIcon;
+    public Image pieceIcon
+    {
+        get
+        {
+            if (m_PieceIcon == null)
+            {
+                m_PieceIcon = this.transform.GetComponent<Image>("Container_ItemCell/Img_Piece");
+            }
+            return m_PieceIcon;
+        }
+    }
+
+    Transform m_TimeForm;
+    public Transform timeForm
+    {
+        get
+        {
+            if (m_TimeForm == null)
+            {
+                m_TimeForm = this.transform.Find("Container_ItemCell/Bg_Time");
+            }
+            return m_TimeForm;
+        }
+    }
+
+    Text m_TimeText;
+    public Text timeText
+    {
+        get
+        {
+            if (m_TimeText == null)
+            {
+                m_TimeText = this.transform.GetComponent<Text>("Container_ItemCell/Bg_Time/Txt_Time");
+            }
+            return m_TimeText;
+        }
+    }
+
+
     Button m_Button;
-    public Button button {
-        get {
+    public Button button
+    {
+        get
+        {
             if (m_Button == null)
             {
-                LoadPrefab();
                 m_Button = this.GetComponent<Button>("Container_ItemCell");
             }
             return m_Button;
         }
     }
 
-    // EquipSuitEffect m_SuitEffect;
-    // EquipSuitEffect suitEffect {
-    //     get {
-    //         if (m_SuitEffect == null)
-    //         {
-    //             LoadPrefab();
-    //             //clone 浼氶�犳垚浜屾鍒涘缓
-    //             m_SuitEffect = transform.GetComponentInChildren<EquipSuitEffect>();
-    //             if (m_SuitEffect == null)
-    //                 m_SuitEffect = EquipSuitEffect.Create(transform as RectTransform);
-    //         }
-    //         return m_SuitEffect;
-    //     }
-    // }
 
     //鐗╁搧鍩虹鐗规晥锛堢墿鍝佽〃锛�
-    ItemBaseEffect m_ItemBaseEffect;
-    ItemBaseEffect itemBaseEffect {
-        get {
+    UIEffectPlayer m_ItemBaseEffect;
+    UIEffectPlayer itemBaseEffect
+    {
+        get
+        {
             if (m_ItemBaseEffect == null)
             {
-                LoadPrefab();
-                //clone 浼氶�犳垚浜屾鍒涘缓
-                m_ItemBaseEffect = transform.GetComponentInChildren<ItemBaseEffect>();
-                if (m_ItemBaseEffect == null)
-                    m_ItemBaseEffect = ItemBaseEffect.Create(transform as RectTransform);
+                m_ItemBaseEffect = transform.GetComponentInChildren<UIEffectPlayer>();
             }
             return m_ItemBaseEffect;
         }
     }
 
-    // public bool suitEffectDirty { get; set; }
 
     GameObject cellContainer;
     protected void LoadPrefab()
@@ -127,31 +168,11 @@
         }
         if (cellContainer == null)
         {
-            switch (format)
-            {
-                case ItemCellformat.Format_64x64:
-                    cellContainer = UIUtility.CreateWidget("ItemCell_64", "Container_ItemCell");
-                    break;
-                case ItemCellformat.Format_70x70:
-                    cellContainer = UIUtility.CreateWidget("ItemCell_70", "Container_ItemCell");
-                    break;
-                case ItemCellformat.Format_80x80:
-                    cellContainer = UIUtility.CreateWidget("ItemCell_80", "Container_ItemCell");
-                    break;
-                case ItemCellformat.Format_84x84:
-                    cellContainer = UIUtility.CreateWidget("ItemCell_84", "Container_ItemCell");
-                    break;
-                case ItemCellformat.Format_100x100:
-                    cellContainer = UIUtility.CreateWidget("ItemCell_100", "Container_ItemCell");
-                    break;
-                case ItemCellformat.Format_120x120:
-                    cellContainer = UIUtility.CreateWidget("ItemCell_120", "Container_ItemCell");
-                    break;
-            }
+            cellContainer = UIUtility.CreateWidget("ItemCell_120", "Container_ItemCell");
 
             if (cellContainer != null)
             {
-                cellContainer.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one);
+                cellContainer.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one * GetScale(format));
                 cellContainer.transform.SetAsFirstSibling();
             }
         }
@@ -159,7 +180,11 @@
 
     public int itemId { get; private set; }
     PackManager packModel { get { return PackManager.Instance; } }
-    // EquipModel equipModel { get { return ModelCenter.Instance.GetModel<EquipModel>(); } }
+
+    void OnEnable()
+    {
+        LoadPrefab();
+    }
 
     /// <summary>
     /// 鍒濆鍖栨暟鎹� bool鍊肩敤鏉ュ垽鏂槸鍚﹂渶瑕佸睍绀鸿瘎鍒嗛珮浣庢垨鑰呰亴涓氶檺鍒�
@@ -191,7 +216,7 @@
         bgIcon.SetActive(true);
         itemIcon.SetSprite(config.IconKey);
         ItemConfig itemConfig = ItemConfig.Get(itemId);
-        bgIcon.SetItemBackGround(ItemLogicUtility.Instance.GetItemQuality(itemId, useDataDic), itemConfig.QualityEchoType);
+        bgIcon.SetItemBackGround(ItemLogicUtility.Instance.GetItemQuality(itemId, useDataDic));
         if (packModel.textCountShow.ContainsKey(itemId))
         {
             countText.SetActive(true);
@@ -217,29 +242,41 @@
             }
         }
 
-        // suitEffect.Display(itemId, suitEffectDirty);
-        // suitEffectDirty = false;
-        itemBaseEffect.Display(itemId);
 
-        var compareReslut = isCompare ? Compare(type, itemId, score, guid) : 0;
-        switch (compareReslut)
+        DisPlayEffect(config);
+
+        // var compareReslut = isCompare ? Compare(type, itemId, score, guid) : 0;
+        // switch (compareReslut)
+        // {
+        //     case -1:
+        //         stateIcon.SetActive(true);
+        //         stateIcon.SetSprite("EquipDownIcon");
+        //         break;
+        //     case 0:
+        //         stateIcon.SetActive(false);
+        //         break;
+        //     case 1:
+        //         stateIcon.SetActive(true);
+        //         stateIcon.SetSprite("EquipUpIcon");
+        //         break;
+        //     case 99:
+        //         stateIcon.SetActive(true);
+        //         stateIcon.SetSprite("EquipForbidIcon");
+        //         break;
+        // }
+
+        if (config.Type == (int)ItemType.Hero)
         {
-            case -1:
-                stateIcon.SetActive(true);
-                stateIcon.SetSprite("EquipDownIcon");
-                break;
-            case 0:
-                stateIcon.SetActive(false);
-                break;
-            case 1:
-                stateIcon.SetActive(true);
-                stateIcon.SetSprite("EquipUpIcon");
-                break;
-            case 99:
-                stateIcon.SetActive(true);
-                stateIcon.SetSprite("EquipForbidIcon");
-                break;
+            var heroConfig = HeroConfig.Get(itemId);
+            countryIcon.SetActive(true);
+            countryIcon.SetSprite("herocountry" + heroConfig.Country);
+
         }
+        else
+        {
+            countryIcon.SetActive(false);
+        }
+        // pieceIcon.SetActive(); //寰呯瓥鍒掔‘瀹�
     }
 
     // / <summary>
@@ -286,21 +323,43 @@
         }
     }
 
-    // int GetDogzEquipScore(int equipPlace)
-    // {
-    //     var dogzModel = ModelCenter.Instance.GetModel<DogzModel>();
-    //     ItemModel putOnModel = null;
-    //     dogzModel.TryGetDogzEquip(dogzModel.presentSelectDogz, equipPlace, out putOnModel);
-    //     return putOnModel == null ? 0 : putOnModel.score;
-    // }
-
-    // int GetSpiritWeaponScore(int equipPlace)
-    // {
-    //     var spiritWeaponModel = ModelCenter.Instance.GetModel<SpiritWeaponModel>();
-    //     var guid = spiritWeaponModel.GetSpiritWeapon((RoleEquipType)equipPlace);
-    //     var item = packModel.GetItemByGuid(guid);
-    //     return item != null ? item.score : 0;
-    // }
+    void DisPlayEffect(ItemConfig config)
+    {
+        if (config.BaseEffectID == 0)
+        {
+            if (itemBaseEffect != null)
+            {
+                itemBaseEffect.SetActive(false);
+            }
+        }
+        else
+        {
+            itemBaseEffect.SetActive(true);
+            itemBaseEffect.effectId = config.BaseEffectID;
+            itemBaseEffect.Play();
+        }
+    }
+    
+    float GetScale(ItemCellformat format)
+    {
+        switch (format)
+        {
+            case ItemCellformat.Format_120x120:
+                return 1f;
+            case ItemCellformat.Format_100x100:
+                return 0.83f;
+            case ItemCellformat.Format_84x84:
+                return 0.7f;
+            case ItemCellformat.Format_80x80:
+                return 0.66f;
+            case ItemCellformat.Format_70x70:
+                return 0.58f;
+            case ItemCellformat.Format_64x64:
+                return 0.53f;
+            default:
+                return 1f;
+        }
+    }
 
 }
 
diff --git a/Main/System/KnapSack/New/ItemCell.cs b/Main/System/KnapSack/New/ItemCell.cs
index cfe14d8..6602211 100644
--- a/Main/System/KnapSack/New/ItemCell.cs
+++ b/Main/System/KnapSack/New/ItemCell.cs
@@ -1,14 +1,14 @@
-锘縰sing UnityEngine;
-using UnityEngine.UI;
-using System.Collections.Generic;
-using System;
-
+锘�
 public class ItemCell : CommonItemBaisc
 {
 
 
     public override void Init(ItemModel model, bool isCompare = false)
     {
+        if (model == null)
+        {
+            return;
+        }
         base.Init(model, isCompare);
 
     }
diff --git a/Main/System/KnapSack/PackManager.cs b/Main/System/KnapSack/PackManager.cs
index 22e4249..d4acb33 100644
--- a/Main/System/KnapSack/PackManager.cs
+++ b/Main/System/KnapSack/PackManager.cs
@@ -3,12 +3,16 @@
 using System.Linq;
 using UnityEngine;
 using LitJson;
-using System.Text.RegularExpressions;
 using System.Collections;
+using System.IO;
 
 public class PackManager : GameSystemManager<PackManager>
-//public class PackModel : Model, IBeforePlayerDataInitialize, IAfterPlayerDataInitialize, IPlayerLoginOk
 {
+    public Dictionary<int, int> PackMaxCountDict = new Dictionary<int, int>(); //鑳屽寘绫诲瀷锛氳儗鍖呮牸瀛愭渶澶ф暟閲�
+    public Dictionary<int, int> PackInitCountDict = new Dictionary<int, int>(); //鑳屽寘绫诲瀷锛氬垵濮嬫暟閲�
+    public int initBagGridCount { get; private set; } //鍒濆鐗╁搧鑳屽寘鏍煎瓙鏁�
+    public int[] itemPackSortTyps { get; private set; }    //鑳屽寘鐗╁搧鐨勬寜绫诲瀷鎺掑簭
+
     public static string StrengthAttrShift_RecordKey = "";
     public const string RecordKnapsackTitle = "RecordKnapsackTitle";
 
@@ -329,6 +333,7 @@
                 DeleteItemDictByGUID(type, guid);
             }
         }
+        refrechPackEvent?.Invoke(type);
     }
 
     public void RemoveItem(H0709_tagClearItem clearItem)
@@ -474,13 +479,54 @@
     #region 鐜╁瑁呭鐗规畩閫昏緫
     void ParseConfig()
     {
-        
-
         var config = FuncConfigConfig.Get("CommonShowAwards");
         commonShowAwardEvents = JsonMapper.ToObject<List<string>>(config.Numerical1);
 
+        config= FuncConfigConfig.Get("InitBagCellCount");
+        initBagGridCount = int.Parse(config.Numerical1);
+        PackInitCountDict = ConfigParse.ParseIntDict(config.Numerical2);
+
+        config = FuncConfigConfig.Get("PackageSortPriority");
+        itemPackSortTyps = ConfigParse.GetMultipleStr<int>(config.Numerical1);
+        ParsePackConfigIni();
     }
 
+    void ParsePackConfigIni()
+    {
+        string[] lines = LoadConfigIni("MapServerConfig");
+        foreach (string line in lines)
+        {
+            if (line.StartsWith("PackCnt") && line.Contains("="))
+            {
+                string[] parts = line.Split('=');
+                if (parts.Length == 2 && int.TryParse(parts[1], out int count))
+                {
+                    string packTypeStr = parts[0].Replace("PackCnt", "");
+                    if (int.TryParse(packTypeStr, out int packTypeIndex))
+                    {
+                        PackMaxCountDict[packTypeIndex] = count;
+                    }
+                }
+            }
+        }
+    }
+
+    public string[] LoadConfigIni(string name)
+    {
+        string path = string.Empty;
+#if UNITY_EDITOR
+        if (!AssetSource.isUseAssetBundle)
+        {
+            path = ResourcesPath.CONFIG_FODLER + "/" + name + ".ini";
+        }
+        else
+#endif
+        {
+            path = AssetVersionUtility.GetAssetFilePath($"Config/{name}.ini");
+        }
+
+        return File.ReadAllLines(path);
+    }
 
 
     private void UpdateSecond()
@@ -550,7 +596,11 @@
     public SinglePack GetSinglePack(PackType type)
     {
         SinglePack singlePack = null;
-        playerPackDict.TryGetValue(type, out singlePack);
+        if (!playerPackDict.TryGetValue(type, out singlePack))
+        { 
+            singlePack = new SinglePack(type);
+            playerPackDict.Add(type, singlePack);
+        }
         return singlePack;
     }
 
diff --git a/Main/System/Main/FuncsBaseWin.cs b/Main/System/Main/FuncsBaseWin.cs
index 94d3429..2a2689c 100644
--- a/Main/System/Main/FuncsBaseWin.cs
+++ b/Main/System/Main/FuncsBaseWin.cs
@@ -9,7 +9,7 @@
 public abstract class FunctionsBaseWin : UIBase
 {
     // 鏍囩鎸夐挳缁�
-    public Button[] tabButtons;
+    public GroupButtonEx[] tabButtons;
 
     // 褰撳墠鎵撳紑鐨勫瓙鐣岄潰
     protected UIBase currentSubUI;
@@ -19,8 +19,6 @@
     /// </summary>
     protected override void InitComponent()
     {
-        base.InitComponent();
-
         // 鍒濆鍖朥I缁勪欢浜嬩欢
         InitButtonEvents();
     }
@@ -71,9 +69,6 @@
         // 鏇存柊褰撳墠閫変腑鐨勬爣绛剧储寮�
         functionOrder = index;
 
-        // 鏇存柊鎸夐挳鐘舵��
-        UpdateButtonsState();
-
         // 鍏抽棴褰撳墠鎵撳紑鐨勫瓙鐣岄潰
         CloseCurrentSubUI();
 
@@ -96,10 +91,7 @@
     }
 
 
-    /// <summary>
-    /// 鏇存柊鎸夐挳鐘舵��
-    /// </summary>
-    protected abstract void UpdateButtonsState();
+
 
     /// <summary>
     /// 鏍规嵁鏍囩绱㈠紩鎵撳紑瀵瑰簲鐨勫瓙鐣岄潰
diff --git a/Main/System/Main/HomeWin.cs b/Main/System/Main/HomeWin.cs
index 3b77d73..168cd28 100644
--- a/Main/System/Main/HomeWin.cs
+++ b/Main/System/Main/HomeWin.cs
@@ -25,6 +25,8 @@
     //鍏冲崱
     [SerializeField] Button bossBtn;
 
+    [SerializeField] Button changeHeroPosBtn;
+
     /// <summary>
     /// 鍒濆鍖栫粍浠�
     /// </summary>
@@ -34,6 +36,12 @@
         bossBtn.AddListener(() =>
         {
             UIManager.Instance.OpenWindow<MainBossEnterWin>();
+        });
+        
+        changeHeroPosBtn.AddListener(() =>
+        {
+            HeroUIManager.Instance.selectTeamType = TeamType.Story;
+            UIManager.Instance.OpenWindow<HeroPosWin>();
         });
     }
 
@@ -52,9 +60,6 @@
         TaskManager.Instance.OnTaskUpdate += UpdateTask;
         Refresh();
         UIManager.Instance.OpenWindow<BattleWin>();
-
-        taskEffect.effectId = Random.Range(1007, 1008);
-        taskEffect.Play();
     }
     protected override void OnOpen()
     {
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index b589ac7..95327a6 100644
--- a/Main/System/Main/MainWin.cs
+++ b/Main/System/Main/MainWin.cs
@@ -121,22 +121,6 @@
     }
     
 
-    
-    /// <summary>
-    /// 鏇存柊鎸夐挳鐘舵��
-    /// </summary>
-    protected override void UpdateButtonsState()
-    {
-        // 閬嶅巻鎵�鏈夋寜閽紝璁剧疆閫変腑鐘舵��
-        // for (int i = 0; i < tabButtons.Length; i++)
-        // {
-
-        //     // bottomTabButtons[i].image.color = (i == currentTabIndex) ?  Color.white : Color.gray;
-        // }
-    }
-    
-
-
     /// <summary>
     /// 鏍规嵁鏍囩绱㈠紩鎵撳紑瀵瑰簲鐨勫瓙鐣岄潰
     /// </summary>
@@ -154,7 +138,7 @@
                 Debug.Log("鎵撳紑涓诲煄鐣岄潰");
                 break;
             case 1:
-                // currentSubUI = UIManager.Instance.OpenUI<CharacterUI>();
+                currentSubUI = UIManager.Instance.OpenWindow<RolePackWin>();
                 Debug.Log("鎵撳紑鍐呮斂鐣岄潰");
                 break;
             case 2:
diff --git a/Main/System/Message/ColorAnalysis.cs b/Main/System/Message/ColorAnalysis.cs
index a719dc8..5cda495 100644
--- a/Main/System/Message/ColorAnalysis.cs
+++ b/Main/System/Message/ColorAnalysis.cs
@@ -9,25 +9,26 @@
 
     public override string Analysis(string val, bool IsRich)
     {
-        if (!Color_Start_Regex.IsMatch(val) || RichTextMgr.Inst.presentRichText == null)
-        {
-            return val;
-        }
-        int index = 0;
-        m_StringBuilder.Length = 0;
-        var _text = RichTextMgr.Inst.presentRichText;
-        if (_text.colorType == RichText.ColorType.Bright)
-        {
-            return val;
-        }
-        foreach (Match match in Color_Start_Regex.Matches(val))
-        {
-            m_StringBuilder.Append(val.Substring(index, match.Groups[1].Index - index));
-            m_StringBuilder.Append(GetColorMap(match.Groups[1].Value));
-            index = match.Groups[1].Index + match.Groups[1].Length;
-        }
-        m_StringBuilder.Append(val.Substring(index, val.Length - index));
-        return m_StringBuilder.ToString();
+        return val;
+        // if (!Color_Start_Regex.IsMatch(val) || RichTextMgr.Inst.presentRichText == null)
+        // {
+        //     return val;
+        // }
+        // int index = 0;
+        // m_StringBuilder.Length = 0;
+        // var _text = RichTextMgr.Inst.presentRichText;
+        // if (_text.colorType == RichText.ColorType.Bright)
+        // {
+        //     return val;
+        // }
+        // foreach (Match match in Color_Start_Regex.Matches(val))
+        // {
+        //     m_StringBuilder.Append(val.Substring(index, match.Groups[1].Index - index));
+        //     m_StringBuilder.Append(GetColorMap(match.Groups[1].Value));
+        //     index = match.Groups[1].Index + match.Groups[1].Length;
+        // }
+        // m_StringBuilder.Append(val.Substring(index, val.Length - index));
+        // return m_StringBuilder.ToString();
     }
 
     private string GetColorMap(string _value)
@@ -36,39 +37,39 @@
         {
             _value = _value.Substring(0, 6);
         }
-        switch (_value.ToLower())
-        {
-            case "109d06":
-                return "35e122";
-            case "ff6701":
-                return "f8983b";
-            case "006be3":
-                return "31cefb";
-            case "ff0303":
-                return "fa0101";
-            case "12a199":
-                return "13a199";
-            case "686868":
-                return "f7f7f7";
-            case "da48d5":
-                return "ec4bf6";
-            case "f6408d":
-                return "ff7c7c";
-            case "bb8800":
-                return "ffde00";
-            case "666666":
-                return "dddddd";
-            case "9460ff":
-                return "7999ff";
-            case "0066ff":
-                return "00c6ff";
-            case "00b337":
-                return "66ff00";
-            case "ff6600":
-                return "ff9000";
-            case "ff00f6":
-                return "f000ff";
-        }
+        // switch (_value.ToLower())
+        // {
+        //     case "109d06":
+        //         return "35e122";
+        //     case "ff6701":
+        //         return "f8983b";
+        //     case "006be3":
+        //         return "31cefb";
+        //     case "ff0303":
+        //         return "fa0101";
+        //     case "12a199":
+        //         return "13a199";
+        //     case "686868":
+        //         return "f7f7f7";
+        //     case "da48d5":
+        //         return "ec4bf6";
+        //     case "f6408d":
+        //         return "ff7c7c";
+        //     case "bb8800":
+        //         return "ffde00";
+        //     case "666666":
+        //         return "dddddd";
+        //     case "9460ff":
+        //         return "7999ff";
+        //     case "0066ff":
+        //         return "00c6ff";
+        //     case "00b337":
+        //         return "66ff00";
+        //     case "ff6600":
+        //         return "ff9000";
+        //     case "ff00f6":
+        //         return "f000ff";
+        // }
         return _value;
     }
 
diff --git a/Main/System/Team/TeamBase.cs b/Main/System/Team/TeamBase.cs
index 14622c7..f578df0 100644
--- a/Main/System/Team/TeamBase.cs
+++ b/Main/System/Team/TeamBase.cs
@@ -252,6 +252,16 @@
         tempHeroes[posNum] = hero;
     }
 
+    //  甯冮樀鎺ュ彛: 鎭㈠闃靛
+    public void RestoreTeam()
+    {
+        for (int i = 0; i < tempHeroes.Length; i++)
+        {
+            tempHeroes[i] = serverHeroes[i];
+        }
+    }
+    
+
     public void AddHero(HeroInfo heroInfo, int targetPosition)
     {
         if (targetPosition < 0 || targetPosition >= tempHeroes.Length)
diff --git a/Main/System/Team/TeamType.cs b/Main/System/Team/TeamType.cs
index 8140550..79b7b12 100644
--- a/Main/System/Team/TeamType.cs
+++ b/Main/System/Team/TeamType.cs
@@ -3,12 +3,8 @@
 public enum TeamType
 {
 	None = 0,
-	//	PVE
-	Story = 1,
-	//	PVP 杩涙敾
-	Arena = 2,
-	//	PVP 闃插畧
-	ArenaDefense = 3,
-	Tower = 4,
+	Story = 1, //涓荤嚎
+	Arena = 2,	//绔炴妧鍦鸿繘鏀�
+	ArenaDefense = 3,	//绔炴妧鍦洪槻瀹�
 }
 
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index 959cc05..3e95377 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -792,6 +792,7 @@
     Equip_Wing = 113,              // 缈呰唨
     Guard_1 = 114,                  // 鐏靛畧 1
     Guard_2 = 115,                   //鐏靛畧 2
+    Hero = 150,                 //姝﹀皢
     
 }
 
@@ -1085,7 +1086,7 @@
     White = 1,
     titleSelectColor = 2,
     titleUnSelectColor = 3,
-
+    lightYellow = 4,    //娴呴粍鑹�
     Red = 5,
     Pink = 6,
     /// <summary>
diff --git a/Main/Utility/UIHelper.cs b/Main/Utility/UIHelper.cs
index b3bdcd3..f135ca8 100644
--- a/Main/Utility/UIHelper.cs
+++ b/Main/Utility/UIHelper.cs
@@ -113,13 +113,13 @@
     }
 
     // 鍩轰簬itemColor 涓嬶紝ColorEx鍋氫簩绾у尯鍒�
-    public static void SetItemBackGround(this Image _image, int itemColor, int ColorEx = 0)
+    public static void SetItemBackGround(this Image _image, int itemColor)
     {
         if (_image == null)
         {
             return;
         }
-        _image.SetSprite(string.Format("Common_Public_ItemColor{0}{1}", itemColor, ColorEx));
+        _image.SetSprite($"ItemBG{itemColor}");
     }
     /// <summary>
     /// 鍓╀綑鏃堕棿
@@ -515,10 +515,10 @@
 
     public static readonly Color s_NavyBrown = new Color32(110, 76, 49, 255);//6e4c31
     public static readonly Color s_Black = new Color32(0, 0, 0, 255);
-    public static readonly Color s_NavyYellow = new Color32(255, 239, 71, 255);
+    public static readonly Color s_NavyYellow = new Color32(242, 238, 2, 255); //f2ee02
     public static readonly Color s_LightGreen = new Color32(42, 227, 55, 255);//2ae337
     public static readonly Color s_LightWhite = new Color32(245, 246, 230, 255); //f5f6e6
-    public static readonly Color s_Gray = new Color32(187, 187, 187, 255);  //bbbbbb
+    public static readonly Color s_Gray = new Color32(132, 121, 123, 255);  //84797b
     public static readonly Color s_Gold = new Color32(255, 239, 71, 255);//ffef47
     public static readonly Color s_EarthYellow = new Color32(248, 152, 59, 255);//f8983b
 
@@ -645,9 +645,9 @@
             case TextColType.White:
                 return bright ? s_BrightWhiteColor : s_DarkWhiteColor;  // s_BrightWhiteColor 鏄寒搴曠伆鑹�
             case TextColType.titleSelectColor:
-                return new Color32(114, 157, 228, 255);
-            case TextColType.titleUnSelectColor:
                 return new Color32(127, 65, 57, 255);
+            case TextColType.titleUnSelectColor:
+                return new Color32(110, 92, 96, 255);
             case TextColType.Red:
                 return bright ? s_BrightRedColor : s_DarkRedColor;
             case TextColType.Pink:
@@ -660,6 +660,8 @@
                 return s_BrightGreenColor;
             case TextColType.Black:
                 return s_Black;
+            case TextColType.lightYellow:   //娴呴粍鑹�
+                return new Color32(252, 237, 185, 255);
             case TextColType.NavyYellow:
                 return s_NavyYellow;
             case TextColType.LightGreen:
@@ -771,12 +773,12 @@
 
     public static string AppendColor(TextColType type, string msg, bool bright = false)
     {
-        if (m_TextColorRegex.IsMatch(msg) && msg.ToLower().StartsWith("<color=#")
-            && msg.ToLower().EndsWith("</color>"))
-        {
-            Match match = m_TextColorRegex.Match(msg);
-            msg = match.Groups[1].Value;
-        }
+        // if (m_TextColorRegex.IsMatch(msg) && msg.ToLower().StartsWith("<color=#")
+        //     && msg.ToLower().EndsWith("</color>"))
+        // {
+        //     Match match = m_TextColorRegex.Match(msg);
+        //     msg = match.Groups[1].Value;
+        // }
         switch (type)
         {
             case TextColType.None:
@@ -803,7 +805,11 @@
             case TextColType.LightGreen:
                 return StringUtility.Contact("<color=#", "8ddc11", ">", msg, "</color>");
             case TextColType.Gray:
-                return StringUtility.Contact("<color=#", "686868", ">", msg, "</color>");
+                return StringUtility.Contact("<color=#", "84797b", ">", msg, "</color>");
+            case TextColType.lightYellow:
+                return StringUtility.Contact("<color=#", "fcedb9", ">", msg, "</color>");
+            case TextColType.NavyYellow:
+                return StringUtility.Contact("<color=#", "f2ee02", ">", msg, "</color>");
         }
         return msg;
     }

--
Gitblit v1.8.0