From d165af063d7365e143d92c3a950a0b52e683a66e Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 23 一月 2026 15:33:29 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/Equip/EquipModel.cs                                                 |   25 
 Main/System/FuncPreset/FuncPresetChooseCell.cs                                  |   73 ++
 Main/System/Main/MoneyMoveByPath.cs                                             |    8 
 Main/System/InternalAffairs/AffairFuncCell.cs                                   |    2 
 Main/System/FuncPreset/FuncPresetChooseCell.cs.meta                             |    2 
 Main/System/Login/LoginWin.cs                                                   |    2 
 Main/System/BoneField/AdsManager.cs                                             |   52 +
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB132_tagSCMinggeInfo.cs |    7 
 Main/System/FuncPreset/FuncPresetManager.cs                                     |  146 +++
 Main/Utility/OperationLogCollect.cs                                             |    4 
 Main/System/Settlement/BoneBattleVictoryWin.cs                                  |    2 
 Main/System/BoneField/BoneFieldManager.cs                                       |   75 +
 Main/System/Team/TeamManager.cs                                                 |   11 
 Main/System/Mingge/MinggeEquipCell.cs                                           |   44 +
 Main/System/Main/HomeWin.cs                                                     |   32 
 Main/System/Mingge/MinggeEquipChangeCell.cs.meta                                |    2 
 Main/System/FuncPreset/FuncPresetChooseCells.cs                                 |   69 +
 Main/System/Mingge/MinggeEquipWin.cs                                            |   96 ++
 Main/System/Mingge/MinggeManager.cs                                             |  258 +++++++
 Main/System/BattlePass/BattlePassManager.Common.cs                              |    1 
 Main/System/BoneField/BoneFieldChallengeButton.cs                               |    4 
 Main/System/AssetVersion/AssetVersionUtility.cs                                 |    2 
 Main/System/Main/AutoFightModel.cs                                              |  136 +-
 Main/Utility/EnumHelper.cs                                                      |    4 
 Main/System/Mingge/MinggeWin.cs                                                 |  221 ++++++
 Main/System/Main/FightPowerManager.cs                                           |  158 ++++
 Main/System/Mingge/MinggeEquipChangeCell.cs                                     |  333 +++++++++
 Main/System/BoneField/BoneFieldWin.cs                                           |   16 
 Main/System/ItemTip/ItemTipUtility.cs                                           |   67 -
 Main/System/Hero/HeroInfo.cs                                                    |   11 
 /dev/null                                                                       |   18 
 Main/Utility/UIHelper.cs                                                        |    8 
 Main/Config/PartialConfigs/PresetUnlockConfig.cs                                |   29 
 Main/System/Mingge/MinggeEquipWin.cs.meta                                       |    2 
 Main/System/Mingge/MinggeItemCell.cs                                            |   54 +
 Main/System/FuncPreset/FuncPresetChooseCells.cs.meta                            |    2 
 Main/System/Login/LoginManager.cs                                               |  139 ++-
 Main/System/Settlement/BoneBattleFailWin.cs                                     |    2 
 Main/System/ChallengeTab/BoneFieldTabHandler.cs                                 |    2 
 39 files changed, 1,838 insertions(+), 281 deletions(-)

diff --git a/Main/Config/PartialConfigs/PresetUnlockConfig.cs b/Main/Config/PartialConfigs/PresetUnlockConfig.cs
index 80208b7..f96c119 100644
--- a/Main/Config/PartialConfigs/PresetUnlockConfig.cs
+++ b/Main/Config/PartialConfigs/PresetUnlockConfig.cs
@@ -2,7 +2,7 @@
 public partial class PresetUnlockConfig : ConfigBase<int, PresetUnlockConfig>
 {
     static Dictionary<int, Dictionary<int, PresetUnlockConfig>> m_PresetUnlockDict = new Dictionary<int, Dictionary<int, PresetUnlockConfig>>();
-
+    static Dictionary<int, int> m_UnLockTypeDict = new Dictionary<int, int>();  
     protected override void OnConfigParseCompleted()
     {
         if (!m_PresetUnlockDict.ContainsKey(PresetType))
@@ -10,6 +10,15 @@
             m_PresetUnlockDict[PresetType] = new Dictionary<int, PresetUnlockConfig>();
         }
         m_PresetUnlockDict[PresetType][PresetID] = this;
+
+        if (!m_UnLockTypeDict.ContainsKey(PresetType))
+        {
+            m_UnLockTypeDict[PresetType] = UnlockType;
+        }
+        else if (m_UnLockTypeDict[PresetType] < UnlockType)
+        {
+            m_UnLockTypeDict[PresetType] = UnlockType;
+        }
     }
 
     public static PresetUnlockConfig GetPresetUnlockConfig(int presetType, int presetID)
@@ -21,4 +30,22 @@
         return null;
     }
 
+    public static int GetUnlockType(int presetType)
+    {
+        if (m_UnLockTypeDict.ContainsKey(presetType))
+        {
+            return m_UnLockTypeDict[presetType];
+        }
+        return 0;
+    }
+
+    public static int GetFuncPresetMaxCount(int presetType)
+    {
+        if (m_PresetUnlockDict.ContainsKey(presetType))
+        {
+            return m_PresetUnlockDict[presetType].Count;
+        }
+        return 0;
+    }
+
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB132_tagSCMinggeInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB132_tagSCMinggeInfo.cs
index b15c72f..805ba6f 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB132_tagSCMinggeInfo.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB132_tagSCMinggeInfo.cs
@@ -1,11 +1,12 @@
-using UnityEngine;
-using System.Collections;
-
+using UnityEngine;
+using System.Collections;
+
 // B1 32 鍛芥牸淇℃伅 #tagSCMinggeInfo
 
 public class DTCB132_tagSCMinggeInfo : DtcBasic {
     public override void Done(GameNetPackBasic vNetPack) {
         base.Done(vNetPack);
         HB132_tagSCMinggeInfo vNetData = vNetPack as HB132_tagSCMinggeInfo;
+        MinggeManager.Instance.UpdateMinggeInfo(vNetData);
     }
 }
diff --git a/Main/System/AssetVersion/AssetVersionUtility.cs b/Main/System/AssetVersion/AssetVersionUtility.cs
index db5a9d0..cb0faa2 100644
--- a/Main/System/AssetVersion/AssetVersionUtility.cs
+++ b/Main/System/AssetVersion/AssetVersionUtility.cs
@@ -56,7 +56,7 @@
 
     public static DateTime assetsBuildTime = DateTime.MinValue;
 
-    static Dictionary<string, AssetVersion> assetVersions = new Dictionary<string, AssetVersion>();
+    public static Dictionary<string, AssetVersion> assetVersions = new Dictionary<string, AssetVersion>();
     //鏈湴LogicBytes鏂囦欢鍜� assetVersions 姣旇緝鏄惁闇�瑕佷笅杞�
     static Dictionary<string, AssetVersion> localAssetVersions = new Dictionary<string, AssetVersion>();
     static List<AssetVersion> priorDownLoadAssetVersions = new List<AssetVersion>();
diff --git a/Main/System/BattlePass/BattlePassManager.Common.cs b/Main/System/BattlePass/BattlePassManager.Common.cs
index 40b7c61..c6f92bc 100644
--- a/Main/System/BattlePass/BattlePassManager.Common.cs
+++ b/Main/System/BattlePass/BattlePassManager.Common.cs
@@ -20,6 +20,7 @@
         {4, 28},
         {5, 27},
         {7, 53},
+        {8, 54}
     };
 
     public int[] battlePassTypeSortList;
diff --git a/Main/System/BoneField/AdsManager.cs b/Main/System/BoneField/AdsManager.cs
index 262527e..cdeecb9 100644
--- a/Main/System/BoneField/AdsManager.cs
+++ b/Main/System/BoneField/AdsManager.cs
@@ -10,6 +10,8 @@
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEvent;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += UpdateRedpoint;
+        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
 
         var keys = ADAwardConfig.GetKeys();
         for (int i = 0; i < keys.Count; i++)
@@ -27,11 +29,33 @@
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEvent;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= UpdateRedpoint;
+        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+    }
+
+    private void OnFuncStateChangeEvent(int funcId)
+    {
+        switch (funcId)
+        {
+            case (int)FuncOpenEnum.BoneBattle:
+                UpdateBoneAdRedPoint();
+                break;
+        }
     }
 
     public void OnBeforePlayerDataInitializeEvent()
     {
         adsInfoDict.Clear();
+    }
+
+    private void OnUpdateFBInfoChangeEvent(int mapID)
+    {
+        switch (mapID)
+        {
+            case 30010:
+                UpdateBoneAdRedPoint();
+                break;
+        }
     }
 
     void SendGetReward(int ADID)
@@ -114,7 +138,7 @@
         foreach (var key in redPointDict.Keys)
         {
             redPointDict[key].state = RedPointState.None;
-            
+
             var config = ADAwardConfig.Get(key);
             if (!FuncOpen.Instance.IsFuncOpen(config.FuncID))
             {
@@ -122,9 +146,33 @@
             }
             if (GetADCntByADID(key) < config.ADCntMax)
             {
-                redPointDict[key].state = RedPointState.Simple;
+                switch (key)
+                {
+                    //鐧介
+                    case 1:
+                        UpdateBoneAdRedPoint();
+                        break;
+                    default:
+                        redPointDict[key].state = RedPointState.Simple;
+                        break;
+                }
             }
         }
     }
+
+
+    private void UpdateBoneAdRedPoint()
+    {
+        int key = 1;
+        if (!ADAwardConfig.HasKey(key))
+            return;
+        var config = ADAwardConfig.Get(key);
+        if (!FuncOpen.Instance.IsFuncOpen(config.FuncID))
+            return;
+        if (redPointDict.IsNullOrEmpty() || !redPointDict.ContainsKey(key))
+            return;
+        bool isNoChallenge = BoneFieldManager.Instance.IsNoChallenge();
+        redPointDict[key].state = isNoChallenge ? RedPointState.None : RedPointState.Simple;
+    }
 }
 
diff --git a/Main/System/BoneField/BoneFieldChallengeButton.cs b/Main/System/BoneField/BoneFieldChallengeButton.cs
index e3d552d..e7cb0dc 100644
--- a/Main/System/BoneField/BoneFieldChallengeButton.cs
+++ b/Main/System/BoneField/BoneFieldChallengeButton.cs
@@ -21,8 +21,8 @@
         this.isHasNextLineID = isHasNextLineID;
         this.lvLimitMin = lvLimitMin;
         isLvOk = PlayerDatas.Instance.baseData.LV >= lvLimitMin;
-        long myFightPower = PlayerDatas.Instance.baseData.FightPower;
-        imgChallengeRed.SetActive(isLvOk && isHasNextLineID && myFightPower >= bossFightPower);
+        bool isShowRed = BoneFieldManager.Instance.IsShowChallengeRed();
+        imgChallengeRed.SetActive(isShowRed);
         txtChallengeLv.SetActive(!isLvOk);
         txtChallengeLv.text = Language.Get("BoneField07", lvLimitMin);
         txtChallengeYes.SetActive(isLvOk && isHasNextLineID);
diff --git a/Main/System/BoneField/BoneFieldManager.cs b/Main/System/BoneField/BoneFieldManager.cs
index e915b7b..bfc1f3a 100644
--- a/Main/System/BoneField/BoneFieldManager.cs
+++ b/Main/System/BoneField/BoneFieldManager.cs
@@ -5,13 +5,13 @@
 
     public readonly int DataMapID = 30010;  // 鐧介鐩堥噹(鎴橀敜绉樺)
     public readonly int MinStartLineID = 1;    // funcLineID浠�1寮�濮�
-    public readonly int funcId = 9;  //鍔熻兘ID 
     public Redpoint parentRedpoint = new Redpoint(MainRedDot.MainChallengeRedpoint, MainRedDot.BoneFieldRepoint);
     public override void Init()
     {
         DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent;
         AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataRefresh;
         TimeMgr.Instance.OnDayEvent += OnDayEvent;
     }
 
@@ -20,12 +20,13 @@
         DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChangeEvent;
         AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+        PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataRefresh;
         TimeMgr.Instance.OnDayEvent -= OnDayEvent;
     }
 
     private void OnFuncStateChangeEvent(int obj)
     {
-        if (obj != funcId)
+        if (obj != (int)FuncOpenEnum.BoneBattle)
             return;
         UpdateRedPoint();
     }
@@ -51,39 +52,75 @@
         UpdateRedPoint();
     }
 
+    private void OnPlayerDataRefresh(PlayerDataType type)
+    {
+        if (type == PlayerDataType.FightPower)
+        {
+            UpdateRedPoint();
+        }
+        else if (type == PlayerDataType.LV)
+        {
+            UpdateRedPoint();
+        }
+    }
+
     public void UpdateRedPoint()
     {
         parentRedpoint.state = RedPointState.None;
-        if (!FuncOpen.Instance.IsFuncOpen(funcId))
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.BoneBattle))
             return;
+
+        bool isShowChallengeRed = IsShowChallengeRed();
+        if (isShowChallengeRed)
+        {
+            parentRedpoint.state = RedPointState.Simple;
+            return;
+        }
+
+        bool isShowSweepRed = IsShowSweepRed();
+        if (isShowSweepRed)
+        {
+            parentRedpoint.state = RedPointState.Simple;
+            return;
+        }
+
+    }
+    public bool IsShowChallengeRed()
+    {
         if (!DungeonManager.Instance.TryGetFBInfoByMapID(DataMapID, out var fbInfo))
-            return;
+            return false;
         bool isHasNextLineID = IsHasNextLineID(fbInfo);
         int nowPassLineID = GetNowPassLineID(fbInfo);
         DungeonConfig.TryGetDungeonID(DataMapID, nowPassLineID, out int dungeonID);
         if (!DungeonConfig.HasKey(dungeonID))
-            return;
+            return false;
         DungeonConfig dungeonConfig = DungeonConfig.Get(dungeonID);
         bool isLvOk = PlayerDatas.Instance.baseData.LV >= dungeonConfig.LVLimitMin;
         long myFightPower = PlayerDatas.Instance.baseData.FightPower;
-        if (myFightPower >= dungeonConfig.FightPower)
+        return isLvOk && isHasNextLineID && myFightPower >= dungeonConfig.FightPower;
+    }
+
+    public bool IsShowSweepRed()
+    {
+        bool isNoChallenge = IsNoChallenge();
+        if (isNoChallenge)
+            return false;
+        if (TryGetShowSweepCount(out int showSweepMaxCount, out int showrealRemainSweepCount))
         {
-            if (isLvOk && isHasNextLineID)
+            bool isSweepCountOk = showrealRemainSweepCount > 0;
+            if (isSweepCountOk)
             {
-                parentRedpoint.state = RedPointState.Simple;
+                return true;
             }
         }
-        else
-        {
-            if (TryGetShowSweepCount(out int showSweepMaxCount, out int showrealRemainSweepCount))
-            {
-                bool isSweepCountOk = showrealRemainSweepCount > 0;
-                if (isSweepCountOk)
-                {
-                    parentRedpoint.state = RedPointState.Simple;
-                }
-            }
-        }
+        return false;
+    }
+
+    public bool IsNoChallenge()
+    {
+        if (!DungeonManager.Instance.TryGetFBInfoByMapID(DataMapID, out var fbInfo))
+            return true;
+        return fbInfo.PassLineID <= 0;
     }
 
     public bool IsHasNextLineID(FBInfo fBInfo)
diff --git a/Main/System/BoneField/BoneFieldWin.cs b/Main/System/BoneField/BoneFieldWin.cs
index c84dbc9..3c01fc2 100644
--- a/Main/System/BoneField/BoneFieldWin.cs
+++ b/Main/System/BoneField/BoneFieldWin.cs
@@ -165,8 +165,8 @@
         DisplaySkillWordsList(lineupConfig);
         DisplayItemCellList(challengeItemCells1, dungeonConfig.PassAwardList);
         DisplayItemCellList(challengeItemCells2, dungeonConfig.PassAwardList);
-
-        if (fbInfo.PassLineID > 0)
+        bool isNoChallenge = BoneFieldManager.Instance.IsNoChallenge();
+        if (!isNoChallenge)
         {
             DungeonConfig.TryGetDungeonID(dataMapID, (int)fbInfo.PassLineID, out int sweepDungeonID);
             if (!DungeonConfig.HasKey(dungeonID))
@@ -189,8 +189,9 @@
 
     public void DisplayChallengeButton(DungeonConfig dungeonConfig, FBInfo fBInfo)
     {
-        transNoChallenge.SetActive(fBInfo.PassLineID <= 0);
-        transHasChallenge.SetActive(fBInfo.PassLineID > 0);
+        bool isNoChallenge = BoneFieldManager.Instance.IsNoChallenge();
+        transNoChallenge.SetActive(isNoChallenge);
+        transHasChallenge.SetActive(!isNoChallenge);
         btnChallenge1.Display(dungeonConfig.LVLimitMin, isHasNextLineID, dungeonConfig.FightPower);
         btnChallenge2.Display(dungeonConfig.LVLimitMin, isHasNextLineID, dungeonConfig.FightPower);
     }
@@ -204,8 +205,9 @@
         bool isSweepCountOk = showrealRemainSweepCount > 0;
         btnSweep.interactable = isSweepCountOk;
         imgSweep.gray = !isSweepCountOk;
-        long myFightPower = PlayerDatas.Instance.baseData.FightPower;
-        imgSweepRed.SetActive(isSweepCountOk && myFightPower < dungeonConfig.FightPower);
+        bool isShowChallengeRed = BoneFieldManager.Instance.IsShowChallengeRed();
+        bool isShowSweepRed = BoneFieldManager.Instance.IsShowSweepRed();
+        imgSweepRed.SetActive(!isShowChallengeRed && isShowSweepRed);
         txtTodaySweepCount.SetActive(showSweepMaxCount > showrealRemainSweepCount);
         txtTodaySweepCount.text = UIHelper.AppendColor(isSweepCountOk ? TextColType.LightGreen : TextColType.Red, Language.Get("BoneField08", showrealRemainSweepCount, showSweepMaxCount));
 
@@ -231,7 +233,7 @@
                 txtNeedMoneyCount.text = payMoneyValue.ToString();
             }
         }
-    }        
+    }
 
     public void DisplayAdsButton(ADAwardConfig aDAwardConfig)
     {
diff --git a/Main/System/ChallengeTab/BoneFieldTabHandler.cs b/Main/System/ChallengeTab/BoneFieldTabHandler.cs
index bb0c18c..d3f48a6 100644
--- a/Main/System/ChallengeTab/BoneFieldTabHandler.cs
+++ b/Main/System/ChallengeTab/BoneFieldTabHandler.cs
@@ -5,7 +5,7 @@
 {
     protected override int GetIndex() => 2;
     protected override int GetOpenState() => 0; // 0=FuncID
-    protected override int GetFuncId() => BoneFieldManager.Instance.funcId;
+    protected override int GetFuncId() => (int)FuncOpenEnum.BoneBattle;
     protected override int GetRedpointId() => MainRedDot.BoneFieldRepoint;
 
     protected override string GetCountInfo()
diff --git a/Main/System/Equip/EquipModel.cs b/Main/System/Equip/EquipModel.cs
index 10ca09d..f3c8966 100644
--- a/Main/System/Equip/EquipModel.cs
+++ b/Main/System/Equip/EquipModel.cs
@@ -190,18 +190,16 @@
     //澶勭悊鎵�鏈夋帀钀界殑鐗╁搧
     public void CalcAllFloorItems()
     {
-        int cnt = PackManager.Instance.GetSinglePack(PackType.DropItem).GetItems().Count;
-        if (cnt == 0)
-        {
-            Debug.Log("CalcAllFloorItems 娌℃湁鎺夎惤鐗╁搧");
+
+        var items = PackManager.Instance.GetItems(PackType.DropItem);
+        if (items.IsNullOrEmpty())
             return;
-        }
 
-
+        int cnt = items.Count;
         needMoreDrop = cnt == 20;
 
         //鏋勫缓鎵�鏈夌墿鍝�
-        foreach (var item in PackManager.Instance.GetSinglePack(PackType.DropItem).GetItems())
+        foreach (var item in items)
         {
             CalcFloorEquip(item.gridIndex);
         }
@@ -475,7 +473,7 @@
         return equip.GetUseData(23);
     }
 
-    //鎴樻枟灞炴�D鍒楄〃
+    //瑁呭鎴樻枟灞炴�D鍒楄〃, 濡傛灉鏄崷鐜夌殑璇濆熀纭�鍜屾垬鏂楅兘鏀句竴璧�
     public List<int> GetEquipFightAttrs(ItemModel equip)
     {
         if (equip == null)
@@ -505,6 +503,17 @@
         return equip.GetUseData(37);
     }
 
+    public int GetEquipSkillID(ItemModel equip)
+    {
+        if (equip == null)
+        {
+            return 0;
+        }
+        var _list = equip.GetUseData(37);
+        return _list.IsNullOrEmpty() ? 0 : _list[0];
+    }
+
+
     //寰楀埌瑁呭浣嶅搴旂殑閮ㄤ綅鍚嶇О
     public string GetEquipPlaceName(int place)
     {
diff --git a/Main/System/FuncPreset/FuncPresetChooseCell.cs b/Main/System/FuncPreset/FuncPresetChooseCell.cs
new file mode 100644
index 0000000..66db8d2
--- /dev/null
+++ b/Main/System/FuncPreset/FuncPresetChooseCell.cs
@@ -0,0 +1,73 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+//鏂规棰勮 鏂规閫夋嫨缁勪欢
+public class FuncPresetChooseCell : MonoBehaviour
+{
+    [SerializeField] Transform unFoldObj;   //灞曞紑
+    [SerializeField] Transform foldObj; //鎶樺彔 鍦ㄦ鐘舵�佷篃鏈夐�変腑闈為�変腑
+    [SerializeField] Image lockImg;
+    [SerializeField] Text numText;
+    [SerializeField] Image selectImg;
+    [SerializeField] Button unFoldBtn;    //瑙i攣鎴栬�呭睍寮�
+
+    [SerializeField] Text caseNameText;
+    [SerializeField] Button changeNameBtn;
+    [SerializeField] Text numUnFoldText;
+    [SerializeField] Button foldBtn;    //鎶樺彔
+
+    
+    public void Display(int battleType, int funcType, int id, bool isUnFold)
+    {
+        var data = FuncPresetManager.Instance.GetFuncPreset(funcType, id);
+        if (data == null)
+        {
+            return;
+        }
+        var selectID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType(battleType, funcType);
+        if (isUnFold)
+        {
+            unFoldObj.SetActive(true);
+            foldObj.SetActive(false);
+
+            caseNameText.text = data.PresetName;
+            numUnFoldText.text = id.ToString();
+            changeNameBtn.AddListener(ChangeName);
+            foldBtn.AddListener(()=>Fold(funcType, id));
+        }
+        else
+        {
+            unFoldObj.SetActive(false);
+            foldObj.SetActive(true);
+
+            unFoldBtn.AddListener(() => UnFold(funcType, id));
+            lockImg.SetActive(!data.unLock);
+            numText.text = id.ToString();
+            selectImg.SetActive(selectID == id);
+        }
+
+        
+    }
+
+
+    void ChangeName()
+    {
+        // UIManager.Instance.OpenWindow<FuncPresetChangeNameWin>();
+    }
+
+    void Fold(int funcType, int id)
+    {
+        FuncPresetManager.Instance.OnSelectPresetEvent?.Invoke(funcType, id, false);
+    }
+
+    void UnFold(int funcType, int id)
+    {
+        var data = FuncPresetManager.Instance.GetFuncPreset(funcType, id);
+        if (!data.unLock)
+        {
+            // 鏈В閿� 鍒欒喘涔�
+            return;
+        }
+        FuncPresetManager.Instance.OnSelectPresetEvent?.Invoke(funcType, id, true);
+    } 
+}
diff --git a/Main/System/Mingge/MinggeCaseCell.cs.meta b/Main/System/FuncPreset/FuncPresetChooseCell.cs.meta
similarity index 83%
rename from Main/System/Mingge/MinggeCaseCell.cs.meta
rename to Main/System/FuncPreset/FuncPresetChooseCell.cs.meta
index 7a776d9..78a10ab 100644
--- a/Main/System/Mingge/MinggeCaseCell.cs.meta
+++ b/Main/System/FuncPreset/FuncPresetChooseCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d82ac7d0e4493ee4fb4fe720c72564fb
+guid: e19596bebfefd1e4c943e65ebddd11f1
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/FuncPreset/FuncPresetChooseCells.cs b/Main/System/FuncPreset/FuncPresetChooseCells.cs
new file mode 100644
index 0000000..e44dd53
--- /dev/null
+++ b/Main/System/FuncPreset/FuncPresetChooseCells.cs
@@ -0,0 +1,69 @@
+using UnityEngine;
+
+//鏂规棰勮: 澶氭柟妗堥�夋嫨缁勪欢
+//鎺у埗鏄鹃殣锛� 1.鏈紑鍚椂鍏ㄤ笉鏄剧ず
+//          2.寮�鍚悗鏄剧ず宸茶В閿� + 鏈В閿� 3+0
+                //a. 鎸夊厓瀹濊В閿佺殑涓洪�愪竴寮�鍚紝榛樿寮�鍚痻涓紝绗瑇+1涓樉绀烘潯浠堕渶瑕併�愭祦娲鹃璁俱�戝姛鑳藉紑鍚�, 鍙В閿佸悗閫愪竴淇濈暀涓�涓攣浣忕殑锛堢洿鍒板叏寮�鍚級锛�
+                //b. 鎸夊姛鑳芥潯浠跺紑鍚殑锛屽鏋滈粯璁ゅ彧寮�鍏朵竴涓柟妗堢殑鎯呭喌涓嶆樉绀猴紝杈惧埌涓嬩竴涓柟妗堢殑鏉′欢婊¤冻鍚庡叏鏄剧ず锛涢粯璁ゅぇ浜�1涓殑鎯呭喌鐩存帴鍏ㄦ樉绀�
+//          3.褰撳皬浜�4涓殑鏃跺�欙紝娌℃湁涓嬫媺鏄剧ず锛屽鏋滃彲浠ヨ秴杩�4涓殑鏄剧ず涓嬫媺
+//          4.褰撳ぇ浜�4涓殑鏃跺�欙紝閫夋嫨瓒呰繃鏂规4鏃讹紝绗洓涓樉绀轰负閫変腑鐨勬柟妗�; 鍚﹀垯閲嶅紑鐨勬椂鍊欓粯璁ゆ樉绀�1-4 涓嶈褰曞巻鍙茬偣鍑�
+//          5.鍚嶅瓧灞曞紑鍒嗕袱绉嶆儏鍐碉紝澶栧眰鍔熻兘榛樿涓嶅睍寮�锛岀偣鍑诲悗鍒囨崲灞曞紑鐘舵�侊紱娴佹淳棰勮鐣岄潰閲屽彧鏈夊睍寮�鐘舵�佷笉鍙敹缂�
+public class FuncPresetChooseCells : MonoBehaviour
+{
+    [SerializeField] FuncPresetChooseCell[] cells;
+
+    int curBbattleType;
+    bool isUnFold = false; //鏄惁灞曞紑
+    bool forceUnFold = false; //寮哄埗灞曞紑锛屼笉鑳芥敹缂�
+
+    /// <summary>
+    /// 鏄剧ず鏂规棰勮
+    /// </summary>
+    /// <param name="battleType"></param>
+    /// <param name="funcType"></param>
+    /// <param name="forceUnFold"> 寮哄埗灞曞紑锛屼笉鑳芥敹缂�</param>
+    public void Display(int battleType, int funcType, bool _forceUnFold = false)
+    {
+        forceUnFold = _forceUnFold;
+        var _unFoldState = forceUnFold ? true : isUnFold;
+        curBbattleType = battleType;
+        var selectID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType(battleType, funcType);
+        for (int i = 0; i < cells.Length; i++)
+        {
+            if (i < 3)
+            {
+                cells[i].Display(battleType, funcType, i + 1, _unFoldState);
+            }
+            else
+            {
+                //绗洓涓姩鎬佸彉鍖�
+                cells[i].Display(battleType, funcType, selectID > 4 ? selectID : 4, _unFoldState);
+            }
+        }
+    }
+
+
+    void OnEnable()
+    {
+        if (!forceUnFold)
+        {
+            FuncPresetManager.Instance.OnSelectPresetEvent += OnSelectPresetEvent;
+        }
+    }
+
+    void OnDisable()
+    {
+        if (!forceUnFold)
+        {
+            isUnFold = false;
+            FuncPresetManager.Instance.OnSelectPresetEvent -= OnSelectPresetEvent;
+        }
+    }
+
+    void OnSelectPresetEvent(int funcType, int id, bool _isUnFold)
+    {
+        isUnFold = _isUnFold;
+        int index = id > 4 ? 3 : id - 1;
+        cells[index].Display(curBbattleType, funcType, id, isUnFold);
+    }
+}
diff --git a/Main/System/Mingge/MinggeCaseCell.cs.meta b/Main/System/FuncPreset/FuncPresetChooseCells.cs.meta
similarity index 83%
copy from Main/System/Mingge/MinggeCaseCell.cs.meta
copy to Main/System/FuncPreset/FuncPresetChooseCells.cs.meta
index 7a776d9..a2fa231 100644
--- a/Main/System/Mingge/MinggeCaseCell.cs.meta
+++ b/Main/System/FuncPreset/FuncPresetChooseCells.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d82ac7d0e4493ee4fb4fe720c72564fb
+guid: c377e47a1d94e154387ee9c6b4b1d106
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/FuncPreset/FuncPresetManager.cs b/Main/System/FuncPreset/FuncPresetManager.cs
index f689ee0..1bff3a7 100644
--- a/Main/System/FuncPreset/FuncPresetManager.cs
+++ b/Main/System/FuncPreset/FuncPresetManager.cs
@@ -22,7 +22,9 @@
     public const int GlobalDefaultPresetID = 1; //榛樿鍏ㄥ眬鏂规ID
     public const int FuncDefaultPresetID = 1;   //榛樿瀛愬姛鑳芥柟妗圛D
 
-    public int teamPresetMaxID = 1; //闃靛棰勮鏈�澶D, 榛樿1鎸夎В閿佸紑鏀�
+    public int[] openConditions; //娴佹淳棰勮锛堜篃鍙叏灞�鏂规/鎴樻枟鏂规锛� 寮�鍚潯浠躲�愬紑鏈嶇N澶╋紝涓荤嚎閫氬叧X-Y锛屽畾鍐涢榿杈惧埌N灞傘��
+
+    public Action<int, int, bool> OnSelectPresetEvent; //閫夋嫨鍔熻兘棰勮鏂规浜嬩欢 鍔熻兘绫诲瀷 鏂规ID 鏄惁灞曞紑
 
     public override void Init()
     {
@@ -38,13 +40,46 @@
 
     void ParseConfig()
     {
-
+        var config = FuncConfigConfig.Get("FuncPreset");
+        openConditions = JsonMapper.ToObject<int[]>(config.Numerical1);
     }
 
     private void OnBeforePlayerDataInitialize()
     {
         battlePreSetDict.Clear();
+        m_FuncPresetSaveDict.Clear();
         InitFuncPreset();
+    }
+
+    //娴佹淳瑙i攣
+    public bool IsOpen()
+    {
+        //鐗规畩绾﹀畾
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mingge))
+            return false;
+
+        if (TimeUtility.OpenDay < openConditions[0] - 1)
+        {
+            return false;
+        }
+        if (PlayerDatas.Instance.baseData.ExAttr1 / 100 <= openConditions[1])
+        {
+            return false;
+        }
+        int layerNum = 0;
+        WarlordPavilionManager.Instance.TryGetHistoryMaxPassLayerNum(out layerNum);
+        if (layerNum < openConditions[2])
+        {
+            return false;
+        }
+        
+        return true;
+    }
+
+    //鎻愬墠鏄剧ず
+    public bool IsPreShow()
+    {
+        return FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mingge);
     }
 
     void InitFuncPreset()
@@ -68,9 +103,7 @@
                 unLock = config.UnlockType == 0,
                 PresetName = Language.Get("Mingge13") + config.PresetID,
             };
-
         }
-
     }
 
     public void UpdateFuncPresetInfoList(HB161_tagSCFuncPresetInfoList vNetData)
@@ -127,25 +160,114 @@
         OnBattelePresetEvent?.Invoke();
     }
 
-    //鑾峰彇鍏ㄥ眬鏂规ID锛屽鏋滃彇涓嶅埌榛樿鏂规1
-    public int GetGlobalPresetID(int type)
+    //鏍规嵁鎴樻枟鑾峰彇鍏ㄥ眬鏂规ID锛屽鏋滃彇涓嶅埌榛樿鏂规1
+    public int GetGlobalPresetID(int battlePresetType)
     {
-        if (battlePreSetDict.ContainsKey(type))
+        if (battlePreSetDict.ContainsKey(battlePresetType))
         {
-            return battlePreSetDict[type];
+            return battlePreSetDict[battlePresetType];
         }
         return 1;
     }
 
-    //鑾峰彇瀛愬姛鑳芥柟妗圛D锛屽鏋滃彇涓嶅埌榛樿鏂规1
-    public int GetFuncPresetID(int type, int presetID)
+    //鎸囧畾鎴樻枟妯″紡涓嬭幏鍙栧瓙鍔熻兘鏂规ID锛屽鏋滃彇涓嶅埌榛樿鏂规1
+    public int GetFuncPresetIDByBattleType(int battlePresetType, int funcType)
     {
-        if (m_FuncPresetSaveDict.ContainsKey(presetID) && m_FuncPresetSaveDict[presetID].ContainsKey(type))
+        int globalPresetID = GetGlobalPresetID(battlePresetType);
+        if (m_FuncPresetSaveDict.ContainsKey(globalPresetID) && m_FuncPresetSaveDict[globalPresetID].ContainsKey(funcType))
         {
-            return m_FuncPresetSaveDict[presetID][type];
+            return m_FuncPresetSaveDict[globalPresetID][funcType];
         }
         return 1;
     }
+
+    //鎸囧畾娴佹淳鑾峰彇瀛愬姛鑳芥柟妗圛D锛屽鏋滃彇涓嶅埌榛樿鏂规1
+    public int GetFuncPresetID(int globalPresetID, int funcType)
+    {
+        if (m_FuncPresetSaveDict.ContainsKey(globalPresetID) && m_FuncPresetSaveDict[globalPresetID].ContainsKey(funcType))
+        {
+            return m_FuncPresetSaveDict[globalPresetID][funcType];
+        }
+        return 1;
+    }
+
+    //鑾峰彇瀛愬姛鑳芥柟妗圛D锛屽鏋滃彇涓嶅埌榛樿鏂规1; 榛樿鍙栧綋鍓嶆祦娲句笅鐨�
+    public int GetFuncPresetID(int funcType)
+    {
+        int globalPresetID = GetGlobalPresetID((int)BattlePreSetType.Story);
+        if (m_FuncPresetSaveDict.ContainsKey(globalPresetID) && m_FuncPresetSaveDict[globalPresetID].ContainsKey(funcType))
+        {
+            return m_FuncPresetSaveDict[globalPresetID][funcType];
+        }
+        return 1;
+    }
+
+    //
+    public FuncPreset GetFuncPreset(int funcType, int presetID)
+    {
+        if (m_FuncPresetDict.ContainsKey(funcType) && m_FuncPresetDict[funcType].ContainsKey(presetID))
+        {
+            return m_FuncPresetDict[funcType][presetID];
+        }
+        return null;
+    }
+
+    // 杩欓噷铏界劧浼犵殑鏄� battleType锛屼絾鏄疄闄呰繕鏄牴鎹叏灞�鏂规ID鍋氬搴斾慨鏀癸紱濡傛灉杩欎釜鍏ㄥ眬鏂规鍏朵粬鍦版柟鏈変娇鐢ㄤ篃鏄悓姝ュ彉鍖�
+    public void SaveFuncPresetID(int battleType, int funcType, int presetID)
+    {
+        var pack = new CB262_tagCSFuncPresetSwitch();
+        pack.FuncPresetType = (byte)funcType;
+        pack.PresetID = (byte)presetID;
+        pack.BatPresetID = (byte)battleType;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void SaveBattlePresetID(int battleType, int globalPresetID)
+    {
+        var pack = new CB263_tagCSBatPresetSwitch();
+        pack.BatPresetID = (byte)globalPresetID;
+        pack.BatPresetType = (byte)battleType;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    //瑕佹樉绀虹殑鏂规鏁伴噺; 鏍规嵁鎯呭喌浼氬寘鍚湭瑙i攣
+    //a. 鎸夊厓瀹濊В閿佺殑涓洪�愪竴寮�鍚紝榛樿寮�鍚痻涓紝绗瑇+1涓樉绀烘潯浠堕渶瑕併�愭祦娲鹃璁俱�戝姛鑳藉紑鍚�, 鍙В閿佸悗閫愪竴淇濈暀涓�涓攣浣忕殑锛堢洿鍒板叏寮�鍚級锛�
+    //b. 鎸夊姛鑳芥潯浠跺紑鍚殑锛屽鏋滈粯璁ゅ彧寮�鍏朵竴涓柟妗堢殑鎯呭喌涓嶆樉绀猴紝杈惧埌涓嬩竴涓柟妗堢殑鏉′欢婊¤冻鍚庡叏鏄剧ず锛涢粯璁ゅぇ浜�1涓殑鎯呭喌鐩存帴鍏ㄦ樉绀�
+    public int GetShowFuncPresetCount(int funcType)
+    {
+        var showCount = GetUnlockCnt(funcType);
+        var maxCount = PresetUnlockConfig.GetFuncPresetMaxCount(funcType);
+        var unlockType = PresetUnlockConfig.GetUnlockType((int)FuncPresetType.Mingge);
+        if (unlockType > 1)
+        {
+            //闈炲厓瀹濊В閿�
+            //鍙湁1涓柟妗堝垯涓嶆樉绀猴紝澶т簬1涓垯鍏ㄦ樉绀�
+            return showCount == 1 ? 0 : maxCount;
+        }
+        if (!IsOpen())
+        {
+            //鏈紑鍚椂锛岄粯璁ゅぇ浜�1鍒欐樉绀�
+            return showCount == 1 ? 0 : showCount;
+        }
+
+        return showCount == maxCount ? showCount : showCount + 1;
+    }
+
+    public int GetUnlockCnt(int funcType)
+    {
+        int count = 0;
+        if (m_FuncPresetDict.ContainsKey(funcType))
+        {
+            for (int i = 0; i < m_FuncPresetDict[funcType].Count; i++)
+            {
+                if (m_FuncPresetDict[funcType][i + 1].unLock)
+                {
+                    count++;
+                }
+            }
+        }
+        return count;
+    }
 }
 
 
diff --git a/Main/System/Hero/HeroInfo.cs b/Main/System/Hero/HeroInfo.cs
index 842b847..61ab98d 100644
--- a/Main/System/Hero/HeroInfo.cs
+++ b/Main/System/Hero/HeroInfo.cs
@@ -48,7 +48,7 @@
     {
         get
         {
-            return itemHero.GetUseDataFirstValue(80) == 1;
+            return itemHero.GetUseDataFirstValue(83) != 0;
         }
     }
 
@@ -120,7 +120,8 @@
     //鏄惁涓婁换浣曢樀瀹�
     public bool IsInAnyTeam()
     {
-        for (int i = 1; i < FuncPresetManager.Instance.teamPresetMaxID; i++)
+        var maxCnt = FuncPresetManager.Instance.GetUnlockCnt((int)FuncPresetType.Mingge);
+        for (int i = 1; i < maxCnt + 1; i++)
         {
             if (TeamManager.Instance.GetTeam(i).HasHeroInServer(itemHero.guid))
             {
@@ -133,7 +134,8 @@
     //鏄惁涓婁换浣曢樀瀹癸紝涓斿彧鏈変竴鍙�
     public bool IsInAnyTeamJustOne()
     {
-        for (int i = 1; i < FuncPresetManager.Instance.teamPresetMaxID; i++)
+        var maxCnt = FuncPresetManager.Instance.GetUnlockCnt((int)FuncPresetType.Mingge);
+        for (int i = 1; i < maxCnt + 1; i++)
         {
             var team = TeamManager.Instance.GetTeam(i);
             if (team.HasHeroInServer(itemHero.guid))
@@ -148,7 +150,8 @@
     //涓嬮樀鎵�鏈夐樀瀹�
     public void LeaveAllTeam()
     {
-        for (int i = 1; i < FuncPresetManager.Instance.teamPresetMaxID; i++)
+        var maxCnt = FuncPresetManager.Instance.GetUnlockCnt((int)FuncPresetType.Mingge);
+        for (int i = 1; i < maxCnt + 1; i++)
         {
             int pos;
             var team = TeamManager.Instance.GetTeam(i);
diff --git a/Main/System/InternalAffairs/AffairFuncCell.cs b/Main/System/InternalAffairs/AffairFuncCell.cs
index 006b9ca..b632253 100644
--- a/Main/System/InternalAffairs/AffairFuncCell.cs
+++ b/Main/System/InternalAffairs/AffairFuncCell.cs
@@ -57,7 +57,7 @@
         }
         else if (funcID == 54)
         {
-            UIManager.Instance.OpenWindow<GubaoBaseWin>();
+            UIManager.Instance.OpenWindow<MinggeWin>();
         }
 
 
diff --git a/Main/System/ItemTip/ItemTipUtility.cs b/Main/System/ItemTip/ItemTipUtility.cs
index ea18a42..fadcf96 100644
--- a/Main/System/ItemTip/ItemTipUtility.cs
+++ b/Main/System/ItemTip/ItemTipUtility.cs
@@ -20,6 +20,7 @@
         BoxChooseItem,    //瀹濈鑷�夌墿鍝�
         TreasurePavilion, //鍙ゅ疂鐗╁搧锛堢鐗囷級
         Hero,   //姝﹀皢
+        Mingge,  //鍛芥牸
     }
 
     public class TipData
@@ -297,26 +298,8 @@
                     mainTipData.guid = PackManager.Instance.GetItemGUIDByID(itemId, true, PackType.DropItem);
                 }
 
-                // mainTipData = CreateNormalEquipData(itemId);
-                // if (item.isAuctionEquip && !item.legendProperty.Equals(default(LegendProperty)))
-                // {
-                //     mainTipData.legendProperty = item.legendProperty;
-                //     mainTipData.baseInfo.score = item.score;
-                //     mainTipData.baseInfo.isPreview = false;
-                // }
-
-                // if (item.compare)
-                // {
-                //     if (ItemLogicUtility.Instance.IsJobCompatibleItem(itemId))
-                //     {
-                //         var equipedGuid = equipModel.GetEquip(new Int2(config.LV, config.EquipPlace));
-                //         if (equipedGuid != string.Empty)
-                //         {
-                //             secondaryData = CreateNormalEquipData(equipedGuid, false);
-                //         }
-                //     }
-                // }
                 break;
+            
             default:
                 mainTipData = CreateItemData(itemId);
                 break;
@@ -380,32 +363,13 @@
                         mainTipData = new TipData() { guid = guid };
                         break;
                     default:
-                        // if (item.isAuction)
-                        // {
-                        //     mainTipData = CreateEquipAuctionData(guid, operatable);
 
-                        //     if (ItemLogicUtility.Instance.IsJobCompatibleItem(item.itemId))
-                        //     {
-                        //         var equipedGuid = equipModel.GetEquip(new Int2(item.config.LV, item.config.EquipPlace));
-                        //         if (equipedGuid != string.Empty)
-                        //         {
-                        //             secondaryData = CreateNormalEquipData(equipedGuid, false);
-                        //         }
-                        //     }
-                        // }
-                        // else
-                        // {
-                        //     mainTipData = CreateNormalEquipData(guid, operatable);
-                        //     var equipedGuid = equipModel.GetEquip(new Int2(item.config.LV, item.config.EquipPlace));
-                        //     if (equipedGuid != guid)
-                        //     {
-                        //         secondaryData = CreateNormalEquipData(equipedGuid, false);
-                        //     }
-                        // }
                         break;
                 }
                 break;
-
+            case TipType.Mingge:
+                mainTipData = new TipData() { guid = guid };
+                break;
             default:
                 mainTipData = CreateItemData(guid, operatable);
                 break;
@@ -425,11 +389,9 @@
             case TipType.BoxChooseItem:
                 UIManager.Instance.OpenWindow<ChooseItemsWin>();
                 break;
-            // case TipType.TreasurePavilion:
-            //     TreasurePavilionModel.Instance.selectGubao = item.config.EffectValueA1;
-            //     TreasurePavilionModel.Instance.showTipFromPiece = item.itemId;
-            //     WindowCenter.Instance.OpenIL<TreasurePavilionTipWin>();
-            //     break;
+            case TipType.Mingge:
+                // UIManager.Instance.OpenWindow<MinggeWin>();
+                break;
             default:
                 UIManager.Instance.OpenWindow<ItemTipWin>();
                 break;
@@ -1679,6 +1641,19 @@
                 return TipType.TreasurePavilion;
             case 150:
                 return TipType.Hero;
+            case 201:
+            case 202:
+            case 203:
+            case 204:
+            case 205:
+            case 206:
+            case 207:
+            case 208:
+            case 209:
+            case 210:
+            case 211:
+            case 212:
+                return TipType.Mingge;
             default:
                 return TipType.Item;
         }
diff --git a/Main/System/Login/LoginManager.cs b/Main/System/Login/LoginManager.cs
index a51c094..1f81e89 100644
--- a/Main/System/Login/LoginManager.cs
+++ b/Main/System/Login/LoginManager.cs
@@ -10,6 +10,8 @@
     public readonly static string USER_ACCOUNT = Application.dataPath + "UserAccount";
     public readonly static string USER_PASSWORD = Application.dataPath + "UserPassword";
 
+    public string hotVersion = "";
+
     public bool sdkLogined
     {
         get;
@@ -302,6 +304,65 @@
         }
     }
 
+    //logicversion 鍜宎ssetversion 涓や釜鏂囦欢 鐨勫唴瀹筸d5鍏ㄥ紓鎴栧彇鏈�鍚庝袱涓瓧姣�
+    public void RefreshHotVersion()
+    {
+        try
+        {
+            string logicVersionMd5 = "";
+            string assetVersionMd5 = "";
+            // 鍒濆鍖栫粨鏋滃瓧鑺傛暟缁�(MD5 鏄� 16 瀛楄妭)
+            byte[] resultBytes = new byte[16];
+            foreach (var item in LocalResManager.Instance.assetVersions)
+            {
+                // 瀵规瘡涓� MD5 杩涜寮傛垨杩愮畻
+                byte[] md5Bytes = HexStringToByteArray(item.Value.md5);
+                for (int j = 0; j < 16; j++)
+                {
+                    resultBytes[j] ^= md5Bytes[j];
+                }
+
+            }
+            //鍙栨渶鍚庝袱浣�
+            logicVersionMd5 = BitConverter.ToString(resultBytes).Replace("-", "").ToLower().Substring(14, 2);
+
+            resultBytes = new byte[16];
+            foreach (var item in AssetVersionUtility.assetVersions)
+            {
+                // 瀵规瘡涓� MD5 杩涜寮傛垨杩愮畻
+                byte[] md5Bytes = HexStringToByteArray(item.Value.md5);
+                for (int j = 0; j < 16; j++)
+                {
+                    resultBytes[j] ^= md5Bytes[j];
+                }
+
+            }
+            assetVersionMd5 = BitConverter.ToString(resultBytes).Replace("-", "").ToLower().Substring(14, 2);
+            hotVersion = logicVersionMd5 + assetVersionMd5;
+            Debug.Log($"RefreshHotVersion {hotVersion}");
+        }
+        catch
+        {
+            Debug.LogError("RefreshHotVersion 閿欒");            
+        }
+    }
+
+    
+
+    // 杈呭姪鏂规硶:鍗佸叚杩涘埗瀛楃涓茶浆瀛楄妭鏁扮粍
+    private byte[] HexStringToByteArray(string hex)
+    {
+        byte[] bytes = new byte[hex.Length / 2];
+        for (int i = 0; i < hex.Length; i += 2)
+        {
+            bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
+        }
+        return bytes;
+    }
+
+
+
+
     public C0101_tagCPlayerLogin Get0101SendPackage(H0101_tagServerPrepared _serverInfo)
     {
         GameNetSystem.Instance.SetIsWaitLogin(false);
@@ -328,46 +389,48 @@
                 send.Extra = "";
                 break;
             case VersionAuthority.Release:
-            {
-                var deviceInfo = DeviceUtility.GetDeviceModel();
-                deviceInfo.Replace(" ", "").Replace("=", "").Replace("%", "").Replace("-", "").Replace("|", "");
-                var versionStr = StringUtility.Concat(VersionConfig.Get().version, "_", VersionConfig.Get().buildIndex.ToString(), "_", deviceInfo);
-
-                send.Extra = StringUtility.Concat(VersionConfig.Get().SpID, "|",
-                                                    SDKUtils.Instance.Device.uniqueID, "|",
-                                                    sdkLoginResult.token, "|",
-                                                    sdkLoginResult.qkUserName, "|",
-                                                    versionStr.Substring(0, Math.Min(24, versionStr.Length)));
-
-
-                Debug.Log("=====> extra: " + send.Extra);
-                send.ExtraLen = (ushort)send.Extra.Length;
-
-                send.IDType = (byte)SDKUtils.Instance.ChannelPlatform;
-                send.Password = sdkLoginResult.token;
-                send.AccID = sdkLoginResult.account;
-                send.MAC = DeviceUtility.GetMac();
-                send.Version = _serverInfo.Version;
-                send.LineNO = 255;
-                send.AppID = VersionConfig.Get().appId;
-                send.AccountID = (uint)sdkLoginResult.accountID;
-                send.TokenExpire = sdkLoginResult.tokenExpire;
-                send.Phone = (byte)sdkLoginResult.phone;
-                send.ServerID = (uint)ServerListCenter.Instance.currentServer.region_flag;
-                if (sdkIDCheckIDAuthentication.type == "1")
                 {
-                    send.Adult = 1;
+                    var deviceInfo = DeviceUtility.GetDeviceModel();
+                    deviceInfo.Replace(" ", "").Replace("=", "").Replace("%", "").Replace("-", "").Replace("|", "");
+                    var versionStr = StringUtility.Concat(VersionConfig.Get().version, "_",
+                    VersionConfig.Get().buildIndex.ToString(), "_",
+                    hotVersion, "-", deviceInfo);
+
+                    send.Extra = StringUtility.Concat(VersionConfig.Get().SpID, "|",
+                                                        SDKUtils.Instance.Device.uniqueID, "|",
+                                                        sdkLoginResult.token, "|",
+                                                        sdkLoginResult.qkUserName, "|",
+                                                        versionStr.Substring(0, Math.Min(24, versionStr.Length)));
+
+
+                    Debug.Log("=====> extra: " + send.Extra);
+                    send.ExtraLen = (ushort)send.Extra.Length;
+
+                    send.IDType = (byte)SDKUtils.Instance.ChannelPlatform;
+                    send.Password = sdkLoginResult.token;
+                    send.AccID = sdkLoginResult.account;
+                    send.MAC = DeviceUtility.GetMac();
+                    send.Version = _serverInfo.Version;
+                    send.LineNO = 255;
+                    send.AppID = VersionConfig.Get().appId;
+                    send.AccountID = (uint)sdkLoginResult.accountID;
+                    send.TokenExpire = sdkLoginResult.tokenExpire;
+                    send.Phone = (byte)sdkLoginResult.phone;
+                    send.ServerID = (uint)ServerListCenter.Instance.currentServer.region_flag;
+                    if (sdkIDCheckIDAuthentication.type == "1")
+                    {
+                        send.Adult = 1;
+                    }
+                    else if (sdkIDCheckIDAuthentication.type == "2")
+                    {
+                        send.Adult = MathUtility.CheckAdult(sdkIDCheckIDAuthentication.card_id) ? (byte)1 : (byte)0;
+                    }
+                    else
+                    {
+                        send.Adult = 0;
+                    }
+                    break;
                 }
-                else if (sdkIDCheckIDAuthentication.type == "2")
-                {
-                    send.Adult = MathUtility.CheckAdult(sdkIDCheckIDAuthentication.card_id) ? (byte)1 : (byte)0;
-                }
-                else
-                {
-                    send.Adult = 0;
-                }
-                break;
-            }
         }
 
         return send;
diff --git a/Main/System/Login/LoginWin.cs b/Main/System/Login/LoginWin.cs
index 301ef5c..e81f412 100644
--- a/Main/System/Login/LoginWin.cs
+++ b/Main/System/Login/LoginWin.cs
@@ -89,7 +89,7 @@
     {
         base.OnPreOpen();
         Debug.Log("鎵撳紑鐧诲綍绐楀彛");
-
+        LoginManager.Instance.RefreshHotVersion();
 
         ServerListCenter.Instance.serverSelectEvent += OnServerChange;
         ServerListCenter.Instance.onServerListRefreshEvent += OnServerListRefresh;
diff --git a/Main/System/Main/AutoFightModel.cs b/Main/System/Main/AutoFightModel.cs
index 183d973..a2d0d14 100644
--- a/Main/System/Main/AutoFightModel.cs
+++ b/Main/System/Main/AutoFightModel.cs
@@ -80,6 +80,7 @@
         }
     }
 
+    public event Action<bool> OnAutoChallengeBossEvent;
     //鑷姩鎸戞垬棣栭
     public bool isAutoChallengeBoss
     {
@@ -90,6 +91,7 @@
         set
         {
             QuickSetting.Instance.SetQuickSetting(QuickSettingType.AutoFight_ChallengeBoss, value);
+            OnAutoChallengeBossEvent?.Invoke(value);
         }
     }
 
@@ -107,9 +109,11 @@
             if (m_NowChallengeCount >= tryChallengeCount)
             {
                 m_NowChallengeCount = -1;   //浠h〃鍋滄缁х画鎸戞垬BOSS, 浣嗕笉鏄仠姝㈡垬鏂�
+                isAutoChallengeBoss = false; //鍙栨秷鍕鹃�夎嚜鍔ㄦ寫鎴榖oss
             }
         }
     }
+
 
     //鑷姩鎸戞垬棣栭锛屾垬璐娆″仠姝�
     public int tryChallengeCount
@@ -208,81 +212,81 @@
     {
         ProccessCloseWin();
     }
-	void ProccessCloseWin()
+    void ProccessCloseWin()
     {
         if (!isAutoAttack)
             return;
-		if (isAutoChallengeBoss)
-		{
-			if (UIManager.Instance.IsOpened<BattleVictoryWin>())
-			{
-				if (!winWaitCloseDict.ContainsKey("BattleVictoryWin"))
-				{
-					winWaitCloseDict["BattleVictoryWin"] = 0;
-				}
+        if (isAutoChallengeBoss)
+        {
+            if (UIManager.Instance.IsOpened<BattleVictoryWin>())
+            {
+                if (!winWaitCloseDict.ContainsKey("BattleVictoryWin"))
+                {
+                    winWaitCloseDict["BattleVictoryWin"] = 0;
+                }
 
-				if (winWaitCloseDict["BattleVictoryWin"] == 0)
-				{
-					winWaitCloseDict["BattleVictoryWin"] = (int)Time.time;
-				}
-				else if (Time.time - winWaitCloseDict["BattleVictoryWin"] > AutoFightModel.Instance.autoCloseWinCD)
-				{
-					UIManager.Instance.CloseWindow<BattleVictoryWin>();
-					winWaitCloseDict["BattleVictoryWin"] = 0;
-				}
-			}
+                if (winWaitCloseDict["BattleVictoryWin"] == 0)
+                {
+                    winWaitCloseDict["BattleVictoryWin"] = (int)Time.time;
+                }
+                else if (Time.time - winWaitCloseDict["BattleVictoryWin"] > AutoFightModel.Instance.autoCloseWinCD)
+                {
+                    UIManager.Instance.CloseWindow<BattleVictoryWin>();
+                    winWaitCloseDict["BattleVictoryWin"] = 0;
+                }
+            }
 
-			if (UIManager.Instance.IsOpened<BattleFailWin>())
-			{
-				if (!winWaitCloseDict.ContainsKey("BattleFailWin"))
-				{
-					winWaitCloseDict["BattleFailWin"] = 0;
-				}
+            if (UIManager.Instance.IsOpened<BattleFailWin>())
+            {
+                if (!winWaitCloseDict.ContainsKey("BattleFailWin"))
+                {
+                    winWaitCloseDict["BattleFailWin"] = 0;
+                }
 
-				if (winWaitCloseDict["BattleFailWin"] == 0)
-				{
-					winWaitCloseDict["BattleFailWin"] = (int)Time.time;
-				}
-				else if (Time.time - winWaitCloseDict["BattleFailWin"] > autoCloseWinCD)
-				{
-					UIManager.Instance.CloseWindow<BattleFailWin>();
-					winWaitCloseDict["BattleFailWin"] = 0;
-				}
-			}
-		}
-		
-		if (isAutoFinishTask)
-		{
-			if (TaskManager.Instance.GetMainTaskState() == 2 && UIManager.Instance.IsOpened<HomeWin>()
+                if (winWaitCloseDict["BattleFailWin"] == 0)
+                {
+                    winWaitCloseDict["BattleFailWin"] = (int)Time.time;
+                }
+                else if (Time.time - winWaitCloseDict["BattleFailWin"] > autoCloseWinCD)
+                {
+                    UIManager.Instance.CloseWindow<BattleFailWin>();
+                    winWaitCloseDict["BattleFailWin"] = 0;
+                }
+            }
+        }
+
+        if (isAutoFinishTask)
+        {
+            if (TaskManager.Instance.GetMainTaskState() == 2 && UIManager.Instance.IsOpened<HomeWin>()
             && !UIManager.Instance.ExistAnyFullScreenOrMaskWin("") && !NewBieCenter.Instance.inGuiding)
-			{
-				//棰嗗彇浠诲姟濂栧姳
-				CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward();
-				getReward.RewardType = 66;
-				getReward.DataEx = (uint)TaskManager.Instance.mainTask.TaskID;
-				GameNetSystem.Instance.SendInfo(getReward);
-				return;
-			}
+            {
+                //棰嗗彇浠诲姟濂栧姳
+                CA504_tagCMPlayerGetReward getReward = new CA504_tagCMPlayerGetReward();
+                getReward.RewardType = 66;
+                getReward.DataEx = (uint)TaskManager.Instance.mainTask.TaskID;
+                GameNetSystem.Instance.SendInfo(getReward);
+                return;
+            }
 
-			if (UIManager.Instance.IsOpened<CommonGetItemWin>() && ItemLogicUtility.Instance.getItemEventName == "Task")
-			{
-				if (!winWaitCloseDict.ContainsKey("CommonGetItemWin"))
-				{
-					winWaitCloseDict["CommonGetItemWin"] = 0;
-				}
+            if (UIManager.Instance.IsOpened<CommonGetItemWin>() && ItemLogicUtility.Instance.getItemEventName == "Task")
+            {
+                if (!winWaitCloseDict.ContainsKey("CommonGetItemWin"))
+                {
+                    winWaitCloseDict["CommonGetItemWin"] = 0;
+                }
 
-				if (winWaitCloseDict["CommonGetItemWin"] == 0)
-				{
-					winWaitCloseDict["CommonGetItemWin"] = (int)Time.time;
-				}
-				else if (Time.time - winWaitCloseDict["CommonGetItemWin"] > autoCloseWinCD)
-				{
-					UIManager.Instance.CloseWindow<CommonGetItemWin>();
-					winWaitCloseDict["CommonGetItemWin"] = 0;
-				}
-			}
-		}
-	}
+                if (winWaitCloseDict["CommonGetItemWin"] == 0)
+                {
+                    winWaitCloseDict["CommonGetItemWin"] = (int)Time.time;
+                }
+                else if (Time.time - winWaitCloseDict["CommonGetItemWin"] > autoCloseWinCD)
+                {
+                    UIManager.Instance.CloseWindow<CommonGetItemWin>();
+                    winWaitCloseDict["CommonGetItemWin"] = 0;
+                }
+            }
+        }
+    }
 
 
     public void SaveAutoFightSetting()
diff --git a/Main/System/Main/FightPowerManager.cs b/Main/System/Main/FightPowerManager.cs
index a408d50..4055c16 100644
--- a/Main/System/Main/FightPowerManager.cs
+++ b/Main/System/Main/FightPowerManager.cs
@@ -123,23 +123,38 @@
     int teamTypeCalc = 1; //涓嶅悓闃靛鎴樺姏涓嶅悓
     bool isPreviewTeamPower;  //棰勮闃靛锛堥槦浼嶏級鎴樺姏
     int dropIndexCalc = -1; //鎺夎惤瑁呭鍦ㄩ樀瀹圭殑绱㈠紩锛岀敤浜庨瑙堟垬鍔涘姣�
+    int minggePresetID; //鍛芥牸棰勮ID
+    int minggeDropIndex;    //鎺夎惤鍛芥牸鍦ㄨ儗鍖呯殑绱㈠紩 锛岀敤浜庨瑙堟垬鍔涘姣�
 
     //璁$畻闃靛鎴樺姏锛岃澶囧姣旂瓑鎯呭喌闇�瑕佷唬鍏�
     /// <summary>
     /// 
     /// </summary>
-    /// <param name="teamType">闃靛绫诲瀷</param>
+    /// <param name="teamType">闃靛绫诲瀷锛氭柟妗圛D涓嬬殑闃熶紞</param>
     /// <param name="dropindex">鎺夎惤瑁呭鐨勭储寮曪紝-1浠h〃涓嶆浛鎹㈣绠�</param>
     /// <param name="ispreview">棰勮闃靛鎴樺姏</param>
-    public void InitFightPowerParam(int teamType = 1, int dropindex = -1, bool ispreview = false)
+    public void InitFightPowerParam(int teamType = 0, int dropindex = -1, bool ispreview = false,
+    int _minggePresetID = 0, int _minggeDropIndex = -1)
     {
 #if !UNITY_EDITOR
         openLog = false;
 #endif
+        if (teamType == 0)
+        {
+            // 娌℃湁璁剧疆榛樿浣跨敤涓婚樀瀹�
+            teamType = TeamManager.Instance.GetMainTeamID();
+        }
+        if (_minggePresetID == 0)
+        {
+            // 娌℃湁璁剧疆榛樿褰撳墠娴佹淳涓嬪懡鏍兼柟妗�
+            _minggePresetID = FuncPresetManager.Instance.GetFuncPresetID((int)FuncPresetType.Mingge);
+        }
         teamTypeCalc = teamType;
+        minggePresetID = _minggePresetID;
         isPreviewTeamPower = ispreview;
 
         dropIndexCalc = dropindex;
+        minggeDropIndex = _minggeDropIndex;
 #if UNITY_EDITOR
         FightPowerDebug("鎴樺姏锛氬垵濮嬪寲鍙傛暟 dropIndex锛�" + dropIndexCalc + " 闃靛瀷锛�" + teamTypeCalc + " ispreview:" + ispreview);
 #endif
@@ -158,6 +173,7 @@
     public Dictionary<int, int> equipAttrs = new Dictionary<int, int>();   //瑁呭灞炴��
     // public Dictionary<string, int> lineUpPerDict = new Dictionary<string, int>();  //闃靛灞炴�у姞鎴�
     public Dictionary<int, int> countryAttrs = new Dictionary<int, int>();   //闃靛鍥藉锛堝厜鐜級灞炴��
+    public Dictionary<int, int> minggeAttrs = new Dictionary<int, int>();   //鍛芥牸灞炴�� 鎶�鑳芥垬鍔涗负鍥哄畾鐨勫彧绠椾釜鏁板尯鍒嵆鍙�
 
     float allHeroAddPer = 0;  //鎵�鏈夋灏嗗姞鎴�
 
@@ -216,13 +232,18 @@
     void RefrehEquipAttrs()
     {
         equipAttrs.Clear();  //韬笂瑁呭灞炴�ч噸缃�
+        ItemModel dropEquip = null;
+        if (dropIndexCalc != -1)
+        {
+            dropEquip = PackManager.Instance.GetItemByIndex(PackType.DropItem, dropIndexCalc);
+        }
+
         for (int i = 0; i < EquipModel.TotleEquip; i++)
         {
             var equip = EquipModel.Instance.GetEquip(i);
             if (dropIndexCalc != -1)
             {
-                var dropEquip = PackManager.Instance.GetItemByIndex(PackType.DropItem, dropIndexCalc);
-                if (dropEquip.config.EquipPlace - 1 == i)
+                if (dropEquip != null && dropEquip.config.EquipPlace - 1 == i)
                 {
                     equip = dropEquip;  //鏇挎崲璁$畻鎬绘垬鍔�
                 }
@@ -288,6 +309,59 @@
 #endif
     }
 
+    //绫讳技瑁呭闇�瑕佸疄鏃舵浛鎹㈠姣旓紱鍔熻兘澶勬煡鐪嬮噸绠椾竴娆℃樉绀�
+    void RefrehMinggeAttrs()
+    {
+        minggeAttrs.Clear();  //韬笂鍛芥牸灞炴�ч噸缃�
+        ItemModel dropEquip = null;
+        int packIndex = -1;
+        if (minggeDropIndex != -1)
+        {
+            dropEquip = PackManager.Instance.GetItemByIndex(PackType.MinggeDrop, minggeDropIndex);
+            packIndex = MinggeManager.Instance.GetPackIndex(minggePresetID, dropEquip.config.EquipPlace);
+        }
+
+        var starIndex = (minggePresetID - 1) * MinggeManager.TotleEquip;
+
+        for (int i = starIndex; i < starIndex + MinggeManager.TotleEquip; i++)
+        {
+            var equip = PackManager.Instance.GetItemByIndex(PackType.Mingge, i);
+            if (minggeDropIndex != -1)
+            {
+                if (dropEquip != null && packIndex == i)
+                {
+                    equip = dropEquip;  //鏇挎崲璁$畻鎬绘垬鍔�
+                }
+            }
+            if (equip == null)
+            {
+                continue;
+            }
+
+            var fightIDAttrs = EquipModel.Instance.GetEquipFightAttrs(equip);
+            var fightValueAttrs = EquipModel.Instance.GetEquipFightValues(equip);
+            if (fightIDAttrs != null)
+            {
+                for (int j = 0; j < fightIDAttrs.Count; j++)
+                {
+                    if (!minggeAttrs.ContainsKey(fightIDAttrs[j]))
+                    {
+                        minggeAttrs[fightIDAttrs[j]] = fightValueAttrs[j];
+                    }
+                    else
+                    {
+                        minggeAttrs[fightIDAttrs[j]] += fightValueAttrs[j];
+                    }
+                }
+            }
+        }
+
+#if UNITY_EDITOR
+        FightPowerDebug("鎴樺姏锛氬懡鏍煎睘鎬� " + JsonMapper.ToJson(minggeAttrs));
+#endif
+    }
+
+
     #endregion
 
     //鍗曞睘鎬у叕寮忓垎鍩虹涓夌淮鍜屾垬鏂楀睘鎬�
@@ -316,7 +390,7 @@
     public double GetPropertyVaule(int attrType, HeroInfo hero, int type)
     {
         // propertyVariables.Clear();
-        
+
         propertyVariables[LV_VALUE] = lvAttrs.ContainsKey(attrType) ? lvAttrs[attrType] : 0;
         propertyVariables[EQUIP_VALUE] = equipAttrs.ContainsKey(attrType) ? equipAttrs[attrType] : 0;
         // propertyVariables[BOOK_VALUE] = 0;
@@ -335,8 +409,8 @@
         propertyVariables[FATES_PER] = HeroFatesManager.Instance.GetAttrPer(attrType) / 10000.0f;
         propertyVariables[DINGJUNGE_VALUE] = 0; //榛樿涓嶉渶瑕佸姞锛岀埇濉旂壒娈婄敤锛岄厤鍚堝叕寮�
         propertyVariables[DINGJUNGE_PER] = 0;   //榛樿涓嶉渶瑕佸姞锛岀埇濉旂壒娈婄敤锛岄厤鍚堝叕寮�
-        propertyVariables[MINGGE_VALUE] = 0;
-        propertyVariables[MINGGE_PER] = 0;
+        propertyVariables[MINGGE_VALUE] = minggeAttrs.ContainsKey(attrType) ? minggeAttrs[attrType] : 0;
+        propertyVariables[MINGGE_PER] = (minggeAttrs.ContainsKey(attrType) ? minggeAttrs[attrType] : 0) / 10000.0f;
 
         //鍏ㄤ綋鍗$墝鍔犳垚
         propertyVariables[HERO_CARDPER] = allHeroAddPer;
@@ -439,6 +513,7 @@
         RefreshLVAttrs();
         RefreshOfficialAttrs();
         RefrehEquipAttrs();
+        RefrehMinggeAttrs();
         RefreshTeamAttrs();
 
         // --- 绠楀崟姝﹀皢鍔熻兘灞炴�ф垬鍔� 鍚庣浉鍔�---
@@ -465,8 +540,9 @@
 
         }
 
+        fightPower += GetMinggeSkillPower();
 // #if UNITY_EDITOR
-         FightPowerDebug("鎴樺姏锛氳绠楀畬姣� " + fightPower);
+        FightPowerDebug("鎴樺姏锛氳绠楀畬姣� " + fightPower);
 // #endif
         return fightPower;
     }
@@ -583,6 +659,49 @@
             return fightPower + skillPower;
     }
 
+    //鍛芥牸鎶�鑳芥垬鍔涳細鎶�鑳芥垬鍔�*涓暟锛涘鏋滄槸鏇挎崲鐨勮鍒ゆ柇鏄惁鎶�鑳戒釜鏁板彉鍖�
+    long GetMinggeSkillPower()
+    {
+        //褰撳墠鏂规鎶�鑳戒俊鎭�
+        int _skillTypeID = 0;    //鍙栧叾涓竴涓敤浜庤绠楀嵆鍙�
+        var count = MinggeManager.Instance.GetMinggeSkillCountByPresetID(minggePresetID, out _skillTypeID);
+        
+        ItemModel dropEquip = null;
+        if (minggeDropIndex != -1)
+        {
+            dropEquip = PackManager.Instance.GetItemByIndex(PackType.MinggeDrop, minggeDropIndex);
+            //甯︽妧鑳界殑鍛芥牸 闇�鍒ゆ柇鏄惁鎶�鑳戒釜鏁板彉鍖�
+            if (MinggeManager.Instance.minggeSkillEquipPlaceList.Contains(dropEquip.config.EquipPlace))
+            {
+                var packIndex = MinggeManager.Instance.GetPackIndex(minggePresetID, minggeDropIndex);
+                //瑕佸姣旂殑瑁呭
+                var equip = PackManager.Instance.GetItemByIndex(PackType.Mingge, packIndex);
+                if (equip == null)
+                {
+                    count++;
+                    if (_skillTypeID == 0)
+                    {
+                        _skillTypeID = EquipModel.Instance.GetEquipSkillID(dropEquip);
+                    }
+                }
+
+            }
+        }
+
+        if (_skillTypeID == 0)
+            return 0;
+
+
+        //鍔犱笂鎶�鑳芥垬鍔�
+        fightPowerVariables.Clear();
+        fightPowerVariables[PLAYER_LV] = PlayerDatas.Instance.baseData.LV;
+        fightPowerVariables[OFFICIAL_LV] = PlayerDatas.Instance.baseData.realmLevel;
+        fightPowerVariables[SKILL_POWER] = SkillConfig.Get(_skillTypeID).FightPower;
+
+        long skillPower = (long)FightPowerFormula.GetSkillsFightPower(fightPowerVariables);
+
+        return skillPower * count;
+    }
 
 
     /// <summary>
@@ -594,13 +713,26 @@
     {
         InitFightPowerParam();
         var fightPower = CalculatePower();
-    
+
         InitFightPowerParam(dropindex: item.gridIndex);
         var tmpFightPower = CalculatePower();
         return tmpFightPower - fightPower;
     }
 
-    
+    /// <summary>
+    /// 鍛芥牸瑁呭瀵规瘮
+    /// </summary>
+    /// minggePresetID 鎸囪瀵规瘮鐨勫摢濂楁柟妗堜笅鐨勫懡鏍硷紝鐜╁鍙互鐐瑰嚮鍒囨崲瀵规瘮锛岃嚜鍔ㄩ粯璁や細閬嶅巻鎵�鏈夋縺娲绘柟妗�
+    public long GetFightPowerMinggeChange(ItemModel item, int minggePresetID)
+    {
+        InitFightPowerParam(_minggePresetID: minggePresetID);
+        var fightPower = CalculatePower();
+
+        InitFightPowerParam(_minggePresetID: minggePresetID, _minggeDropIndex: item.gridIndex);
+        var tmpFightPower = CalculatePower();
+        return tmpFightPower - fightPower;
+    }
+ 
 
     // 鍗曡嫳闆勬煡鐪嬫垬鍔� 
     // 1. 涓婇樀鑻遍泟鏄剧ず锛屽湪涓荤嚎闃靛涓嬬殑鎴樺姏
@@ -627,11 +759,13 @@
         InitFightPowerParam(ispreview: ispreview);
         RefreshLVAttrs();
         RefreshOfficialAttrs();
+        RefrehMinggeAttrs();
         RefrehEquipAttrs();
         RefreshTeamAttrs();
 
         var fightPower = CalculateTeamHeroPower(heroInfo);
-
+        fightPower += GetMinggeSkillPower();
+        
         //璁$畻瀹屾仮澶嶉槦浼�
         if (ispreview)
             team.RestoreTeam();
@@ -642,7 +776,7 @@
     //鏌ョ湅闃靛鎴樺姏
     public long GetTeamFightPower(int team, bool isPreview)
     {
-        InitFightPowerParam(team, -1, isPreview);
+        InitFightPowerParam(team, ispreview:isPreview);
         return CalculatePower();
     }
     #endregion
diff --git a/Main/System/Main/HomeWin.cs b/Main/System/Main/HomeWin.cs
index dbb0079..91d98ff 100644
--- a/Main/System/Main/HomeWin.cs
+++ b/Main/System/Main/HomeWin.cs
@@ -92,10 +92,10 @@
     [SerializeField] ButtonEx btnChatWin;
     [SerializeField] TextEx txtChatChannel;
 
-
     [SerializeField] Transform transChatBulletView;
     GameObject chatBulletViewPrefab;
 
+    [SerializeField] UIEffectPlayer autoFightBossUIEffectPlayer;
 
 
     /// <summary>
@@ -266,6 +266,8 @@
         TimeMgr.Instance.OnDayEvent += OnDayEvent;
         ChatManager.Instance.OnUpdateTalkEvent += OnUpdateTalkEvent;
         UIManager.Instance.OnOpenWindow += OnOpenWindow;
+        AutoFightModel.Instance.OnAutoChallengeBossEvent += OnAutoChallengeBossEvent;
+        TryPlayAutoFightBoss();
         Display();
         DisplayFirstChargeBtn();
         DisplayOSActivity();
@@ -274,9 +276,8 @@
         // battleWin.SetBattleField(BattleManager.Instance.storyBattleField);
 
         DelayPlayMusic().Forget();
+
     }
-
-
 
     protected override void OnPreClose()
     {
@@ -300,10 +301,22 @@
         TimeMgr.Instance.OnDayEvent -= OnDayEvent;
         ChatManager.Instance.OnUpdateTalkEvent -= OnUpdateTalkEvent;
         UIManager.Instance.OnOpenWindow -= OnOpenWindow;
-
+        AutoFightModel.Instance.OnAutoChallengeBossEvent += OnAutoChallengeBossEvent;
 
         //  鍏抽棴鐨勬椂鍊欐妸鎴樻枟鐣岄潰涔熺粰鍏充簡 铏界劧鏄湪澶栭潰寮�鐨�
         UIManager.Instance.CloseWindow<BattleWin>();
+    }
+
+    private void OnAutoChallengeBossEvent(bool isStart)
+    {
+        if (isStart)
+        {
+            autoFightBossUIEffectPlayer.Play();
+        }
+        else
+        {
+            autoFightBossUIEffectPlayer.Stop();
+        }
     }
 
     private void OnOpenWindow(UIBase win)
@@ -511,6 +524,15 @@
         blessLVText.text = BlessLVManager.Instance.m_TreeLV.ToString();
     }
 
+    void TryPlayAutoFightBoss()
+    {
+        autoFightBossUIEffectPlayer.Stop();
+        if (AutoFightModel.Instance.isAutoAttackSet && AutoFightModel.Instance.isAutoChallengeBoss)
+        {
+            autoFightBossUIEffectPlayer.Play();
+        }
+    }
+
     void DisplayAutoFight()
     {
         if (AutoFightModel.Instance.isAutoAttackSet)
@@ -523,7 +545,7 @@
             autoCloseImg.SetActive(true);
             autoOpenEffect.Stop();
         }
-
+        TryPlayAutoFightBoss();
 
     }
 
diff --git a/Main/System/Main/MoneyMoveByPath.cs b/Main/System/Main/MoneyMoveByPath.cs
index bf052e7..9ab0326 100644
--- a/Main/System/Main/MoneyMoveByPath.cs
+++ b/Main/System/Main/MoneyMoveByPath.cs
@@ -31,7 +31,8 @@
     /// <param name="targetPosition">鐩殑鍦板潗鏍�</param>
     /// <param name="moneyType">璐у竵绫诲瀷</param>
     /// <param name="num">鎺夊嚑涓揣甯�</param>
-    public void PlayAnimation(int moneyType, int num)
+    /// <param name="type">1 璐у竵 2 鐗╁搧</param>
+    public void PlayAnimation(int id, int num, int type = 1)
     {
         int createImgCnt = 0;
         if (imgMoneys.IsNullOrEmpty())
@@ -51,7 +52,10 @@
                 //鎸傜埗鑺傜偣
                 imgMoney.transform.SetParentEx(this.transform, Vector3.zero, Quaternion.identity, Vector3.one);
                 var moneyImg = imgMoney.GetComponent<ImageEx>();
-                moneyImg.SetIconWithMoneyType(moneyType);
+                if (type == 1)
+                    moneyImg.SetIconWithMoneyType(id);
+                else
+                    moneyImg.SetItemSprite(id);
                 moneyImg.raycastTarget = false;
                 moneyImg.GetComponent<RectTransform>().sizeDelta = IconSize;
                 imgMoneys.Add(moneyImg);
diff --git a/Main/System/Mingge/MinggeCaseCell.cs b/Main/System/Mingge/MinggeCaseCell.cs
deleted file mode 100644
index 7126763..0000000
--- a/Main/System/Mingge/MinggeCaseCell.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-锘縰sing UnityEngine;
-using UnityEngine.UI;
-using System.Collections.Generic;
-
-//鍛芥牸鏂规
-public class MinggeCaseCell : MonoBehaviour
-{
-    [SerializeField] Text caseNameText;
-    [SerializeField] Transform selectObj;
-    [SerializeField] Transform unSelectObj; 
-
-    public void Display(int index)
-    {
-        
-    }
-
-}
-
diff --git a/Main/System/Mingge/MinggeEquipCell.cs b/Main/System/Mingge/MinggeEquipCell.cs
index 8b6c761..0bd8aad 100644
--- a/Main/System/Mingge/MinggeEquipCell.cs
+++ b/Main/System/Mingge/MinggeEquipCell.cs
@@ -1,8 +1,9 @@
 锘縰sing UnityEngine;
 using UnityEngine.UI;
-using System.Collections.Generic;
+using DG.Tweening;
 
 
+//瀹炶鐨勬樉绀�
 public class MinggeEquipCell : MonoBehaviour
 {
     [SerializeField] UIEffectPlayer loopEffect;
@@ -12,20 +13,24 @@
     [SerializeField] Image skillImage;  //鍙湁甯︽剰璞℃妧鑳芥墠鏄剧ず
     [SerializeField] UIEffectPlayer activeEffect;
     [SerializeField] Button button;
+    [SerializeField] Transform flyStartObj;
 
     [Header("鍛芥牸瑁呭浣�")]
-    public int equipIndex;   
+    public int equipIndex;
 
+    string lastGuid = "uninit";
     public void Display()
     {
-        var packIndex = equipIndex - 1; //瀵瑰簲鍗︾帀鑳屽寘绱㈠紩 = (濂楃紪鍙�-1)*12+瑁呭浣�-1
+        var presetID = FuncPresetManager.Instance.GetFuncPresetID((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
+        var packIndex = MinggeManager.Instance.GetPackIndex(presetID, equipIndex);//瀵瑰簲鍗︾帀鑳屽寘绱㈠紩 
         var item = PackManager.Instance.GetItemByIndex(PackType.Mingge, packIndex);
         if (item == null)
         {
             loopEffect?.Stop();
-            posNameText.text = Language.Get($"MinggeGird{packIndex}");
+            posNameText.text = Language.Get($"MinggeGird{equipIndex}");
             iconImage.SetActive(false);
             button.RemoveAllListeners();
+            lastGuid = "";
             return;
         }
         posNameText.text = "";
@@ -35,8 +40,17 @@
         if (packIndex <= 4 && skillImage != null)
         {
             skillImage.SetActive(true);
-            skillImage.SetSprite($"MinggeSkill_{itemID}");
-            loopEffect.Play();
+            var skillID = EquipModel.Instance.GetEquipSkillID(item);
+            if (skillID != 0)
+            {
+                skillImage.SetSprite($"MinggeSkill_{skillID}");
+                loopEffect.Play();
+            }
+            else
+            {
+                skillImage.SetActive(false);
+                loopEffect.Stop();
+            }
         }
         else
         {
@@ -49,11 +63,25 @@
         {
             ItemTipUtility.Show(itemID);
         });
+
+        if (lastGuid == "uninit")
+        {
+            lastGuid = item.guid;
+        }
+        else if (lastGuid != item.guid)
+        {
+            lastGuid = item.guid;
+            PlayEffect();
+        }
     }
-    
+
     public void PlayEffect()
     {
-        activeEffect.Play();
+        iconImage.transform.position = flyStartObj.position;
+        iconImage.transform.DOLocalMove(Vector3.zero, 0.2f).SetEase(Ease.InQuad).OnComplete(() =>
+        {
+            activeEffect.Play();
+        });
     }
 
 }
diff --git a/Main/System/Mingge/MinggeEquipChangeCell.cs b/Main/System/Mingge/MinggeEquipChangeCell.cs
new file mode 100644
index 0000000..7875af7
--- /dev/null
+++ b/Main/System/Mingge/MinggeEquipChangeCell.cs
@@ -0,0 +1,333 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+using System.Collections.Generic;
+using System;
+
+
+public class MinggeEquipChangeCell : MonoBehaviour
+{
+
+    [SerializeField] MinggeItemCell itemCell;
+    [SerializeField] Text itemName;
+    [SerializeField] OutlineEx itemNameOutline;
+    [SerializeField] GameObject presetGO;
+    [SerializeField] Text presetName;
+    [SerializeField] Image nameBG;
+    [SerializeField] Image bgFlower;    //鑳屾櫙鑺辩汗鍙樿壊
+    [SerializeField] Text fightPowerNum;
+    [SerializeField] List<Text> fightAttrNames;
+    [SerializeField] List<Text> fightAttrValues;
+    [SerializeField] List<Image> fightAttrStates;
+    [SerializeField] Text skillDesc;
+    [SerializeField] GameObject decomposeObject;
+    [SerializeField] Toggle decomposeCheck;
+    [SerializeField] Button decomposeButton;
+    [SerializeField] Button exchangeButton;
+    [SerializeField] Button putonButton;
+
+    [SerializeField] UIEffectPlayer uieffect;
+
+    int cmpResult = 0;  // 瑁呭瀵规瘮缁撴灉 0鐩稿悓 1鏇村己 2鏇村急
+    bool isToggle = true;
+    int selectMinggePresetID = 0;
+
+    void Start()
+    {
+        if (putonButton == null)
+        {
+            return;
+        }
+        putonButton.AddListener(() =>
+        {
+            MinggeManager.Instance.SendChangeMingge(selectMinggePresetID, MinggeManager.Instance.selectFloorEquip.gridIndex, decomposeCheck.isOn);
+        });
+
+        exchangeButton.AddListener(ExchangeEquip);
+        decomposeButton.AddListener(DecomposeEquip);
+
+        decomposeCheck.onValueChanged.RemoveAllListeners();
+        decomposeCheck.onValueChanged.AddListener((bool isOn) =>
+        {
+            isToggle = !isToggle;
+        });
+
+    }
+    /// <summary>
+    /// 
+    /// </summary>
+    /// <param name="equip">鏈欢鍛芥牸鐗╁搧鏁版嵁</param>
+    /// <param name="isNewEquip">鏄惁鏂拌澶囷紙鍗冲懡鏍兼帀钀借儗鍖呴噷鐨勮澶囷級</param>
+    /// <param name="oldEquip">姣斿鐨勮澶�</param>
+    /// <param name="selectPresetID">閫変腑鐨勬柟妗堝姣�</param>
+    public void Display(ItemModel equip, bool isNewEquip, ItemModel oldEquip, int selectPresetID)
+    {
+        selectMinggePresetID = selectPresetID;
+        if (oldEquip == null)
+            cmpResult = 1;
+
+        itemCell.Display(equip.guid);
+        string qualityName = Language.Get("L1039", MGGuayuQualityConfig.Get(equip.config.ItemColor).ColorName);
+        itemName.text = UIHelper.AppendColor(equip.config.ItemColor, qualityName + equip.config.ItemName, true, 2);
+        itemNameOutline.OutlineColor = UIHelper.GetUIOutlineColor(equip.config.ItemColor);
+        nameBG.SetSprite("MinggeNameBG" + equip.config.ItemColor);
+        bgFlower.color = UIHelper.GetUIColor(equip.config.ItemColor + 1);
+
+        var activePresetCnt = FuncPresetManager.Instance.GetUnlockCnt((int)FuncPresetType.Mingge);
+        if (!isNewEquip)
+        {
+            presetGO.SetActive(activePresetCnt > 1);
+            presetName.text = FuncPresetManager.Instance.GetFuncPreset((int)FuncPresetType.Mingge, MinggeManager.Instance.equipShowPresetID).PresetName;
+        }
+        else
+        {
+            if (oldEquip == null)
+            {
+                presetGO.SetActive(activePresetCnt > 1);
+                presetName.text = FuncPresetManager.Instance.GetFuncPreset((int)FuncPresetType.Mingge, MinggeManager.Instance.equipShowPresetID).PresetName;
+            }
+            else
+            {
+                presetGO.SetActive(false);
+            }
+            decomposeCheck.isOn = isToggle;
+
+            if (oldEquip == null)
+            {
+                decomposeObject.SetActive(false);
+                decomposeButton.SetActive(false);
+                exchangeButton.SetActive(false);
+                putonButton.SetActive(true);
+            }
+            else
+            {
+                decomposeObject.SetActive(true);
+                decomposeButton.SetActive(true);
+                exchangeButton.SetActive(true);
+                putonButton.SetActive(false);
+            }
+
+
+            long showFightPower = FightPowerManager.Instance.GetFightPowerMinggeChange(MinggeManager.Instance.selectFloorEquip, selectPresetID);
+
+            if (showFightPower < 0)
+            {
+                fightPowerNum.text = UIHelper.AppendColor(TextColType.Red, $"-{UIHelper.ReplaceLargeNum(Math.Abs(showFightPower))}", false);
+                cmpResult = 2;
+            }
+            else
+            {
+                cmpResult = showFightPower > 0 ? 1 : 0;
+                fightPowerNum.text = UIHelper.AppendColor(TextColType.Green, $"+{UIHelper.ReplaceLargeNum(showFightPower)}", false);
+
+            }
+        }
+
+        var fightAttrs = EquipModel.Instance.GetEquipFightAttrs(equip);
+        var fightValues = EquipModel.Instance.GetEquipFightValues(equip);
+
+
+        for (var i = 0; i < fightAttrNames.Count; i++)
+        {
+            if (i >= fightAttrs.Count)
+            {
+                //鏄剧ず閿佷綇
+                fightAttrNames[i].text = Language.Get("Mingge27", MinggeManager.Instance.unlockAttrLVList[i - 1] - 1);
+                fightAttrValues[i].SetActive(false);
+            }
+            else
+            {
+                fightAttrNames[i].text = PlayerPropertyConfig.Get(fightAttrs[i]).Name;
+                fightAttrValues[i].SetActive(true);
+                fightAttrValues[i].text = PlayerPropertyConfig.GetValueDescription(fightAttrs[i], fightValues[i]);
+            }
+        }
+
+        ShowAttrState(isNewEquip);
+        RefreshEffect(equip);
+
+        var skillID = EquipModel.Instance.GetEquipSkillID(equip);
+        if (skillID == 0)
+        {
+            skillDesc.text = "";
+        }
+        else
+        {
+            var dict = MinggeManager.Instance.GetMinggeSkillTypeIDDict();
+            //濡傛灉鏄棫瑁呭 鏄剧ず褰撳墠鏁伴噺锛涙柊瑁呭涓嶅悓鎶�鑳芥暟閲�+1锛屽悓鎶�鑳戒笉鍙�
+            var hasCnt = dict.ContainsKey(skillID) ? dict[skillID].Count : 0;
+            var oldSkillID = isNewEquip && oldEquip != null ? EquipModel.Instance.GetEquipSkillID(oldEquip) : 0;
+            var showCnt = isNewEquip ? (oldSkillID == skillID ? hasCnt : hasCnt + 1) : hasCnt;
+            skillDesc.text = SkillConfig.Get(skillID).Description + " " + Language.Get("HeroFates11", showCnt, MinggeManager.Instance.maxSuiteSkillCount);
+        }
+    }
+
+
+    void RefreshEffect(ItemModel equip)
+    { 
+        int effectID = EquipModel.Instance.equipUIEffects[Math.Min(equip.config.ItemColor + 1, EquipModel.Instance.equipUIEffects.Length) - 1];
+        if (effectID == 0)
+        {
+            uieffect.Stop();
+        }
+        else
+        {
+            uieffect.Stop();
+            uieffect.effectId = effectID;
+            uieffect.Play();
+        }
+
+    }
+
+
+    //鏇挎崲瑁呭
+    void ExchangeEquip()
+    {
+        //绌挎洿寮辫澶� 瑕佹彁绀�
+        if (cmpResult == 2 && decomposeCheck.isOn)
+        {
+            ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),
+                Language.Get("Mingge28"), (bool ok) =>
+                {
+                    if (ok)
+                    {
+                        MinggeManager.Instance.SendChangeMingge(selectMinggePresetID, MinggeManager.Instance.selectFloorEquip.gridIndex, decomposeCheck.isOn);
+                    }
+                    
+                });
+        }
+        else
+        {
+            MinggeManager.Instance.SendChangeMingge(selectMinggePresetID, MinggeManager.Instance.selectFloorEquip.gridIndex, decomposeCheck.isOn);
+        }
+
+    }
+
+    //鍒嗚В瑁呭
+    void DecomposeEquip()
+    {
+        //鍒嗚В鏇村己瑁呭瑕佹彁绀�
+        if (cmpResult == 1)
+        {
+            ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"),
+            Language.Get("Mingge29"), (bool ok) =>
+            {
+                if (ok)
+                {
+                    MinggeManager.Instance.SendDecompose(new byte[] { (byte)MinggeManager.Instance.selectFloorEquip.gridIndex });
+                }
+                
+            });
+        }
+        else
+        {
+            MinggeManager.Instance.SendDecompose(new byte[] { (byte)MinggeManager.Instance.selectFloorEquip.gridIndex });
+        }
+    }
+
+    void ShowAttrState(bool isNewEquip)
+    {
+        ItemModel oldEquip = null;
+
+        if (isNewEquip)
+        { 
+            //鎵炬槸鍚︽湁瀵规瘮瑁呭
+            oldEquip = PackManager.Instance.GetItemByIndex(PackType.Mingge, MinggeManager.Instance.GetPackIndex(selectMinggePresetID,
+            MinggeManager.Instance.selectFloorEquip.config.EquipPlace));
+        }
+
+        if (oldEquip == null)
+        {
+            //鍗曡澶� 鍜� 鏃ц澶囦細璧拌繖涓�昏緫
+            for (int i = 0; i < fightAttrStates.Count; i++)
+            {
+                if (!isNewEquip)
+                {
+                    //瀵规瘮鐨勬椂鍊欐棫瑁呭UI
+                    oldEquip = PackManager.Instance.GetItemByIndex(PackType.Mingge, MinggeManager.Instance.GetPackIndex(selectMinggePresetID,
+                    MinggeManager.Instance.selectFloorEquip.config.EquipPlace));
+                    var list2 = EquipModel.Instance.GetEquipFightValues(oldEquip);
+
+                    if (list2 == null || i >= list2.Count)
+                    {
+                        fightAttrStates[i].SetActive(true);
+                        fightAttrStates[i].SetOrgSprite("heroreborn_img_108", "Common");
+                        fightAttrStates[i].SetNativeSize();
+                        fightAttrStates[i].transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
+                    }
+                    else
+                    {
+                        fightAttrStates[i].SetActive(false);
+                    }
+                    continue;
+                }
+
+
+                var list = EquipModel.Instance.GetEquipFightValues(MinggeManager.Instance.selectFloorEquip);
+                if (list == null || i >= list.Count)
+                {
+                    fightAttrStates[i].SetActive(true);
+                    fightAttrStates[i].SetOrgSprite("heroreborn_img_108", "Common");
+                    fightAttrStates[i].SetNativeSize();
+                    fightAttrStates[i].transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
+                }
+                else
+                {
+                    fightAttrStates[i].SetActive(true);
+                    fightAttrStates[i].SetSprite("GiftState2");
+                    fightAttrStates[i].SetNativeSize();
+
+                    fightAttrStates[i].transform.localScale = Vector3.one;
+                }
+            }
+
+            return;
+        }
+
+
+
+        for (int i = 0; i < fightAttrStates.Count; i++)
+        {
+            //鎴樻枟灞炴�� 鎺掑簭鍜屼釜鏁颁笉涓�鑷� 鏍规嵁ID杩涜瀵规瘮
+            var list = EquipModel.Instance.GetEquipFightValues(MinggeManager.Instance.selectFloorEquip);
+            var list2 = EquipModel.Instance.GetEquipFightValues(oldEquip);
+
+            var idList = EquipModel.Instance.GetEquipFightAttrs(MinggeManager.Instance.selectFloorEquip);
+            var idList2 = EquipModel.Instance.GetEquipFightAttrs(oldEquip);
+
+            if (list == null || i >= list.Count)
+            {
+                fightAttrStates[i].SetActive(true);
+                fightAttrStates[i].SetOrgSprite("heroreborn_img_108", "Common");
+                fightAttrStates[i].SetNativeSize();
+                fightAttrStates[i].transform.localScale = new Vector3(0.7f, 0.7f, 0.7f);
+            }
+            else
+            {
+                fightAttrStates[i].transform.localScale = Vector3.one;
+                fightAttrStates[i].SetActive(true);
+                var value = !list2.IsNullOrEmpty() && i < list2.Count ? list2[i] : 0;
+                var id = !idList2.IsNullOrEmpty() && i < idList2.Count ? idList2[i] : 0;
+                if (idList[i] == id && list[i] == value)
+                {
+                    fightAttrStates[i].SetActive(false);
+                }
+                else
+                {
+                    fightAttrStates[i].SetActive(true);
+                    if (idList[i] != id)
+                    {
+                        fightAttrStates[i].SetSprite("GiftState1");
+                    }
+                    else
+                    {
+                        fightAttrStates[i].SetSprite(list[i] > value ? "EquipUpIcon" : "EquipDownIcon");
+                    }
+                    fightAttrStates[i].SetNativeSize();
+
+                }
+            }
+        }
+    }
+
+}
+
diff --git a/Main/System/Mingge/MinggeCaseCell.cs.meta b/Main/System/Mingge/MinggeEquipChangeCell.cs.meta
similarity index 83%
copy from Main/System/Mingge/MinggeCaseCell.cs.meta
copy to Main/System/Mingge/MinggeEquipChangeCell.cs.meta
index 7a776d9..434d0e1 100644
--- a/Main/System/Mingge/MinggeCaseCell.cs.meta
+++ b/Main/System/Mingge/MinggeEquipChangeCell.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d82ac7d0e4493ee4fb4fe720c72564fb
+guid: 12d21be6f160f244d9d97557fda832a8
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Mingge/MinggeEquipWin.cs b/Main/System/Mingge/MinggeEquipWin.cs
new file mode 100644
index 0000000..329fd98
--- /dev/null
+++ b/Main/System/Mingge/MinggeEquipWin.cs
@@ -0,0 +1,96 @@
+锘縰sing System;
+using UnityEngine;
+using UnityEngine.UI;
+public class MinggeEquipWin : UIBase
+{
+    [SerializeField] MinggeEquipChangeCell oldEquipCell;
+    [SerializeField] MinggeEquipChangeCell newEquipCell;
+    [SerializeField] Transform presetObj;
+    [SerializeField] GroupButtonEx[] presetBtns;
+
+    int selectPresetID = 0;
+    int lastDropIndex = -1;
+    protected override void InitComponent()
+    {
+        for (int i = 0; i < presetBtns.Length; i++)
+        {
+            presetBtns[i].AddListener(() =>
+            {
+                selectPresetID = i;
+                Display();
+            });
+        }
+    }
+
+    protected override void OnPreOpen()
+    {
+        selectPresetID = MinggeManager.Instance.equipShowPresetID;
+        lastDropIndex = MinggeManager.Instance.selectFloorEquip.gridIndex;
+        PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
+        Display();
+
+    }
+
+    protected override void OnPreClose()
+    {
+        PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
+    }
+
+    void RefreshItemEvent(PackType packType, int index, int itemID)
+    {
+        if (packType == PackType.Mingge)
+        {
+            MinggeManager.Instance.selectFloorEquip = PackManager.Instance.GetItemByIndex(PackType.MinggeDrop, lastDropIndex);
+            Display();
+        }
+    }
+
+    void Display()
+    {
+        var cnt = FuncPresetManager.Instance.GetUnlockCnt((int)FuncPresetType.Mingge);
+        if (cnt == 1)
+        {
+            cnt = 0;
+        }
+        if (cnt > 0)
+        {
+            presetObj.SetActive(true);
+            for (int i = 0; i < presetBtns.Length; i++)
+            {
+                presetBtns[i].SetActive(i < cnt);
+            }
+
+        }
+        else
+        {
+            presetObj.SetActive(false);
+        }
+
+        var packIndex = MinggeManager.Instance.GetPackIndex(selectPresetID, MinggeManager.Instance.selectFloorEquip.config.EquipPlace);
+        var oldEquip = PackManager.Instance.GetItemByIndex(PackType.Mingge, packIndex);
+        if (oldEquip == null)
+        {
+            oldEquipCell.SetActive(false);
+            newEquipCell.SetActive(true);
+            newEquipCell.Display(MinggeManager.Instance.selectFloorEquip, true, oldEquip, selectPresetID);
+        }
+        else
+        {
+            if (oldEquip.guid == MinggeManager.Instance.selectFloorEquip.guid)
+            {
+                Debug.LogError("Display: 鏂版棫鍛芥牸鐩稿悓GUID 瀹㈡埛绔富鍔ㄥ垹闄よ儗鍖呯墿鍝佺储寮�=" + MinggeManager.Instance.selectFloorEquip.gridIndex);
+                PackManager.Instance.GetSinglePack(PackType.MinggeDrop).RemoveItem(MinggeManager.Instance.selectFloorEquip.gridIndex);
+                CloseWindow();
+                return;
+            }
+            oldEquipCell.SetActive(true);
+            newEquipCell.SetActive(true);
+            oldEquipCell.Display(oldEquip, false, null, selectPresetID);
+            newEquipCell.Display(MinggeManager.Instance.selectFloorEquip, true, oldEquip, selectPresetID);
+
+        }
+
+
+    }
+}
+
diff --git a/Main/System/Mingge/MinggeCaseCell.cs.meta b/Main/System/Mingge/MinggeEquipWin.cs.meta
similarity index 83%
copy from Main/System/Mingge/MinggeCaseCell.cs.meta
copy to Main/System/Mingge/MinggeEquipWin.cs.meta
index 7a776d9..6c68b4b 100644
--- a/Main/System/Mingge/MinggeCaseCell.cs.meta
+++ b/Main/System/Mingge/MinggeEquipWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: d82ac7d0e4493ee4fb4fe720c72564fb
+guid: 70c6870ff9894174fabb4d0d87940a3f
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Mingge/MinggeItemCell.cs b/Main/System/Mingge/MinggeItemCell.cs
index 950e6d0..c57fb12 100644
--- a/Main/System/Mingge/MinggeItemCell.cs
+++ b/Main/System/Mingge/MinggeItemCell.cs
@@ -1,16 +1,62 @@
 锘縰sing UnityEngine;
 using UnityEngine.UI;
-using System.Collections.Generic;
 
 
+//鐗╁搧鍥炬爣鏄剧ず
 public class MinggeItemCell : MonoBehaviour
 {
 
-
-    public void Display(int index)
+    [SerializeField] UIEffectPlayer loopEffect; //鍩虹鍝佽川鐗规晥
+    [SerializeField] Text lvText;
+    [SerializeField] Image iconImage;
+    [SerializeField] Image skillImage;  //鍙湁甯︽剰璞℃妧鑳芥墠鏄剧ず
+    [SerializeField] Image bgIcon;
+    public void Display(string guid)
     {
-        
+        var item = PackManager.Instance.GetItemByGuid(guid);
+        if (item == null)
+        {
+            return;
+        }
+        int itemID = item.config.ID;
+        iconImage.SetItemSprite(itemID);
+
+        var skillID = EquipModel.Instance.GetEquipSkillID(item);
+        if (skillID != 0)
+        {
+            skillImage.SetActive(true);
+            skillImage.SetSprite($"MinggeSkill_{skillID}");
+        }
+        else
+        {
+            skillImage.SetActive(false);
+        }
+        var lv = EquipModel.Instance.GetEquipLV(item);
+
+        lvText.text = lv == 0 ? "" : Language.Get("L1113", lv);
+        DisPlayEffect(item.config);
+
+        bgIcon.SetSprite("equipQuality" + (item.config.ItemColor + 1));
+
     }
 
+
+
+    void DisPlayEffect(ItemConfig config)
+    {
+
+        if (config.ItemColor >= 6)
+        {
+            loopEffect.effectId = 1026;
+
+            loopEffect.PlayByArrIndex(config.ItemColor - 6, true, true);
+        }
+        else
+        {
+            loopEffect.Stop();
+        }
+        //鐗规晥鍙傝�冨昂瀵�106*150 鍚屾瘮渚嬬缉鏀�
+        loopEffect.transform.localScale = new Vector3(1, 0.76f, 1);
+    }
 }
 
diff --git a/Main/System/Mingge/MinggeManager.cs b/Main/System/Mingge/MinggeManager.cs
index 97f7a4e..5fb091b 100644
--- a/Main/System/Mingge/MinggeManager.cs
+++ b/Main/System/Mingge/MinggeManager.cs
@@ -6,37 +6,295 @@
 
 public class MinggeManager : GameSystemManager<MinggeManager>
 {
+    public int m_GanwuLV;    //鎰熸偀绛夌骇锛屼粠1寮�濮�
+    public int m_GanwuExp;    //褰撳墠鎰熸偀绛夌骇缁忛獙锛屾瘡绾т粠0寮�濮�
+    public int m_Lingying;    //褰撳墠鐏靛簲鍊�
+    public event Action OnMinggeInfoUpdate;
+
+    public int equipShowPresetID;   // 鏄剧ず瑁呭鏃讹紝褰撳墠鐨勫瓙鏂规ID
+    public ItemModel selectFloorEquip;
+
+    bool waitTYOPPack;
+    public event Action<int> OnOPCallbackEvent;
+
+    public Dictionary<int, long> minggeAttrDict = new Dictionary<int, long>();
+
+
+    //鑷姩璁剧疆
+    public int autoCostCnt; //鑷姩鎺ㄦ紨娑堣�椾釜鏁�
+    public bool isOpenAuto;
+    
+
+
+    //閰嶇疆
+    public const int TotleEquip = 12; //涓�濂楄澶囩殑鎬绘暟
+    public int[] unlockAttrLVList;  //瑙i攣灞炴�ф墍闇�鍛芥牸鐗╁搧绛夌骇鍒楄〃
     public int tyItemID;    //鎺ㄦ紨鐗╁搧ID
     public int qlItemID;    //绁堢伒鐗╁搧ID
     public int[] minggeItemTypeList;    //鍙惡甯︽剰璞$殑鍗︾帀绫诲瀷鍒楄〃
+    public List<int> minggeSkillEquipPlaceList = new List<int>(); //鍙惡甯︽剰璞$殑鍗︾帀绫诲瀷鐨勮澶囦綅缃�
+    public int maxSuiteSkillCount;
     public int[] minggeSkillTypeIDList; //鎰忓悜鏁堟灉鎶�鑳絋ypeID鍒楄〃
+    public int deitemID;    //鍗︾帀鍒嗚В鐨勭墿鍝両D
 
     public override void Init()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
+        PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
+        DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent += OnEquipResult;
         ParseConfig();
     }
 
     public override void Release()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
+        PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
+        DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent -= OnEquipResult;
     }
 
 
     void ParseConfig()
     {
         var config = FuncConfigConfig.Get("MinggeCfg");
+        unlockAttrLVList = JsonMapper.ToObject<int[]>(config.Numerical1);
         tyItemID = int.Parse(config.Numerical2);
         qlItemID = int.Parse(config.Numerical3);
 
         config = FuncConfigConfig.Get("MinggeTY");
+        deitemID = ConfigParse.GetMultipleStr<int>(config.Numerical1)[0];
         minggeItemTypeList = JsonMapper.ToObject<int[]>(config.Numerical4);
         minggeSkillTypeIDList = JsonMapper.ToObject<int[]>(config.Numerical5);
+
+        for (int i = 0; i < minggeItemTypeList.Length; i++)
+        {
+            minggeSkillEquipPlaceList.Add(MGGuayuTypeConfig.Get(minggeItemTypeList[i]).EquipPlace);
+        }
+        maxSuiteSkillCount = minggeSkillEquipPlaceList.Count;
 
     }
 
     private void OnBeforePlayerDataInitialize()
     {
+        m_GanwuLV = 1;
+        m_GanwuExp = 0;
+        m_Lingying = 0;
+        waitTYOPPack = false;
+    }
+    private void OnEquipResult(HA814_tagMCMakeItemAnswer info)
+    {
+        if (info.MakeType != (int)MakeType.MinggeTY)
+            return;
+
+        OnOPCallbackEvent?.Invoke(0);
+        
     }
 
+    void RefreshItemEvent(PackType type, int index, int itemID)
+    {
+        if (type == PackType.MinggeDrop)
+        {
+            waitTYOPPack = false;
+            CalcEquip();
+        }
+    }
+
+    //澶勭悊鏈鐞嗙殑鍛芥牸
+    public bool CalcEquip()
+    {
+        var items = PackManager.Instance.GetItems(PackType.MinggeDrop);
+        if (items.IsNullOrEmpty())
+        {
+            if (UIManager.Instance.IsOpened<MinggeEquipWin>())
+            {
+                UIManager.Instance.CloseWindow<MinggeEquipWin>();
+            }
+            return false;
+        }
+
+        foreach (var item in items)
+        {
+            if (OpenMinggeEquipWin(item))
+            {
+                //闇�瑕佺帺瀹跺鐞嗙殑鏃跺�欓��鍑�
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public void UpdateMinggeInfo(HB132_tagSCMinggeInfo netPack)
+    {
+        m_GanwuLV = netPack.GanwuLV;
+        m_GanwuExp = (int)netPack.GanwuExp;
+        m_Lingying = (int)netPack.Lingying;
+
+        OnMinggeInfoUpdate?.Invoke();
+    }
+
+
+    //鎰忓悜鎶�鑳絀D锛氥�恎uid..銆�
+    public Dictionary<int, List<string>> GetMinggeSkillTypeIDDict()
+    {
+        var presetID = FuncPresetManager.Instance.GetFuncPresetID((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
+        var startIndex = (presetID - 1) * TotleEquip;//瀵瑰簲鍗︾帀鑳屽寘绱㈠紩 = (濂楃紪鍙�-1)*12+瑁呭浣�-1
+
+        var dict = new Dictionary<int, List<string>>();
+        for (int i = 0; i < minggeSkillEquipPlaceList.Count; i++)
+        {
+            var equip = PackManager.Instance.GetItemByIndex(PackType.Mingge, startIndex + minggeSkillEquipPlaceList[i] - 1);
+            var skillID = EquipModel.Instance.GetEquipSkillID(equip);
+            if (skillID == 0) continue;
+            if (dict.ContainsKey(skillID))
+            {
+                dict[skillID].Add(equip.guid);
+            }
+            else
+            {
+                dict[skillID] = new List<string>() { equip.guid };
+            }
+        }
+        return dict;
+    }
+
+    //鑾峰緱鍛芥牸鎶�鑳戒釜鏁帮紝杩斿洖涓暟鍜屾妧鑳絀D锛屼笉绠′粈涔堟妧鑳芥垬鍔涢兘鏄竴鏍风殑
+    public int GetMinggeSkillCountByPresetID(int presetID, out int _skillTypeID)
+    {
+        _skillTypeID = 0;
+        var startIndex = (presetID - 1) * TotleEquip;//瀵瑰簲鍗︾帀鑳屽寘绱㈠紩 = (濂楃紪鍙�-1)*12+瑁呭浣�-1
+
+        int count = 0;
+        for (int i = 0; i < minggeSkillEquipPlaceList.Count; i++)
+        {
+            var equip = PackManager.Instance.GetItemByIndex(PackType.Mingge, startIndex + minggeSkillEquipPlaceList[i] - 1);
+            var skillID = EquipModel.Instance.GetEquipSkillID(equip);
+            if (skillID == 0)
+                continue;
+
+            count++;
+            _skillTypeID = skillID;
+        }
+        return count;
+    }
+
+    public bool OpenMinggeEquipWin(ItemModel equip)
+    {
+        if (equip == null)
+        {
+            return false;
+        }
+
+        if (!DTC0403_tagPlayerLoginLoadOK.finishedLogin)
+        {
+            return false;
+        }
+
+        if (UIManager.Instance.IsOpened<MinggeEquipWin>())
+        {
+            return false;
+        }
+        //鑷姩澶勭悊锛� 鍒ゆ柇鍒嗚В 鍜屾垬鍔涢珮浣� 鍜屽喅瀹氭槸鍝釜鏂规涓嬬殑瑁呭瀵规瘮
+
+
+        //闈炶嚜鍔ㄦ儏鍐典笅锛岄粯璁ゅ綋鍓嶆柟妗�
+        equipShowPresetID = FuncPresetManager.Instance.GetFuncPresetID((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
+        selectFloorEquip = equip;
+        if (UIManager.Instance.IsOpened<MinggeWin>())
+        {
+            UIManager.Instance.OpenWindow<MinggeEquipWin>();
+        }
+        return true;
+
+    }
+
+    public int GetPackIndex(int presetID, int equipPlace)
+    {
+        return (presetID - 1) * TotleEquip + equipPlace - 1;//瀵瑰簲鍗︾帀鑳屽寘绱㈠紩 = (濂楃紪鍙�-1)*12+瑁呭浣�-1
+    }
+
+    public void SendTY(int count)
+    {
+
+        if (CalcEquip())
+        {
+            return;
+        }
+        if (waitTYOPPack)
+        {
+            return;
+        }
+
+        if (!ItemLogicUtility.CheckItemCount(PackType.Item, tyItemID, count, 2))
+        {
+            return;
+        }
+        waitTYOPPack = true;
+
+        var pack = new CB250_tagCSMinggeTuiyan();
+        pack.Count = (byte)count;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void SendChangeMingge(int selectMinggePresetID, int dropIndex, bool autodec)
+    {
+        var pack = new CB252_tagCSMinggeEquip();
+        pack.MGNum = (byte)selectMinggePresetID;
+        pack.Index = (byte)dropIndex;
+        pack.AutoDec = (byte)(autodec ? 1 : 0);
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void SendDecompose(byte[] itemIndexList)
+    {
+        var pack = new CB251_tagCSMinggeDecompose();
+        pack.IndexList = itemIndexList;
+        pack.Count = (byte)itemIndexList.Length;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+
+    public void RefrehMinggeAttrs()
+    {
+        minggeAttrDict.Clear();  //韬笂鍛芥牸灞炴�ч噸缃�
+
+        var minggePresetID = FuncPresetManager.Instance.GetFuncPresetID((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
+        var starIndex = (minggePresetID - 1) * TotleEquip;
+
+        for (int i = starIndex; i < starIndex + TotleEquip; i++)
+        {
+            var equip = PackManager.Instance.GetItemByIndex(PackType.Mingge, i);
+            if (equip == null)
+            {
+                continue;
+            }
+
+            var fightIDAttrs = EquipModel.Instance.GetEquipFightAttrs(equip);
+            var fightValueAttrs = EquipModel.Instance.GetEquipFightValues(equip);
+            if (fightIDAttrs != null)
+            {
+                for (int j = 0; j < fightIDAttrs.Count; j++)
+                {
+                    if (!minggeAttrDict.ContainsKey(fightIDAttrs[j]))
+                    {
+                        minggeAttrDict[fightIDAttrs[j]] = fightValueAttrs[j];
+                    }
+                    else
+                    {
+                        minggeAttrDict[fightIDAttrs[j]] += fightValueAttrs[j];
+                    }
+                }
+            }
+        }
+
+    }
+
+
+
+
+    #region 绾㈢偣
+    Redpoint tmpRP = new Redpoint(MainRedDot.MainAffairsRedpoint, MainRedDot.RedPoint_Mingge);
+    Redpoint redpointMG = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 1);
+    Redpoint redpointPray = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 2);
+    
+    #endregion
 }
\ No newline at end of file
diff --git a/Main/System/Mingge/MinggeWin.cs b/Main/System/Mingge/MinggeWin.cs
index e797886..b1fff9c 100644
--- a/Main/System/Mingge/MinggeWin.cs
+++ b/Main/System/Mingge/MinggeWin.cs
@@ -1,33 +1,246 @@
 锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
 public class MinggeWin : UIBase
 {
     [SerializeField] Button seeAttrBtn;
     [SerializeField] MinggeEquipCell[] equipCells;
-    [SerializeField] MinggeCaseCell[] caseCells;
+    [SerializeField] UIEffectPlayer tyEffect;   //鎺ㄦ紨鐗规晥
+    [SerializeField] Image dropIcon;
+    [SerializeField] Image dropSkillIcon;
+    [SerializeField] MoneyMoveByPath moneyMoveByPathCell;     //鎺夎惤鐗╅噾閽�
+    [SerializeField] Transform caseesObj;
     [SerializeField] Text rankLevelText;
-    
+    [SerializeField] Text processExpText;
+    [SerializeField] Image processImg;
+    [SerializeField] UIEffectPlayer processEffect;
+    [SerializeField] UIEffectPlayer lvUpEffect;
+    [SerializeField] Text[] suiteNameTexts; //甯︽寜閽�
+    [SerializeField] Text[] baseAttrTexts;
+    [SerializeField] Text[] fightAttrTexts;
+
+    [SerializeField] Button autoBtn;
+    [SerializeField] UIEffectPlayer autoEffect; //寮�
+    [SerializeField] Image autoImg; //鍏�
+    [SerializeField] Button prayBtn;
+    [SerializeField] Button tyBtn;
+    [SerializeField] Image tyItemImg;
+    [SerializeField] Text tyItemCntText;
+
+
+    int lastLV = 0;
+    int lastExp = 0;
     protected override void InitComponent()
     {
-
+        var presetObj = UIUtility.CreateWidget("FuncPresetChooseCells", "FuncPresetChooseCells");
+        presetObj.transform.SetParentEx(caseesObj, Vector3.zero, Quaternion.identity, Vector3.one);
+        seeAttrBtn.AddListener(() =>
+        {
+            AttributeManager.Instance.OpenTotalAttributeWin(MinggeManager.Instance.minggeAttrDict);
+        });
+        tyBtn.AddListener(SendTuiyan);
+        for (int i = 0; i < suiteNameTexts.Length; i++)
+        {
+            int index = i;
+            suiteNameTexts[i].GetComponent<Button>().AddListener(() =>
+            {
+                ClickSuite(index);
+            });
+        }
     }
 
     protected override void OnPreOpen()
     {
-
+        MinggeManager.Instance.RefrehMinggeAttrs();
+        PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
+        PackManager.Instance.DeleteItemEvent += DeleteDropItem;
+        MinggeManager.Instance.OnMinggeInfoUpdate += OnMinggeInfoUpdate;
+        UIManager.Instance.OnCloseWindow += OnCloseWindow;
+        lastLV = MinggeManager.Instance.m_GanwuLV;
+        lastExp = MinggeManager.Instance.m_GanwuExp;
         Display();
+
 
     }
 
     protected override void OnPreClose()
     {
+        PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
+        PackManager.Instance.DeleteItemEvent -= DeleteDropItem;
+        MinggeManager.Instance.OnMinggeInfoUpdate -= OnMinggeInfoUpdate;
+        UIManager.Instance.OnCloseWindow -= OnCloseWindow;
+    }
 
+    void OnCloseWindow(UIBase win)
+    {
+        if (win is MinggeEquipWin)
+        {
+            if (MinggeManager.Instance.m_GanwuExp == 0)
+            {
+                lvUpEffect.Play();
+            }
+            processEffect.Play();
+        }
     }
 
     void Display()
     {
+        DisplayMGGanwu();
+        DisplaySlotEquip();
+        DisplayDrop();
+
+        DisplayCostItem();
+        moneyMoveByPathCell.SetActive(false);
+    }
+    void RefreshItemEvent(PackType type, int index, int itemID)
+    {
+        if (type == PackType.Mingge)
+        {
+            DisplaySlotEquip();
+        }
+        else if (type == PackType.MinggeDrop)
+        {
+            DisplayDrop();
+        }
+        else if (type == PackType.Item)
+        {
+            if (itemID == MinggeManager.Instance.tyItemID)
+            {
+                DisplayCostItem();
+            }
+        }
+    }
+
+    void DisplayCostItem()
+    {
+        tyItemImg.SetItemSprite(MinggeManager.Instance.tyItemID);
+        tyItemCntText.text = UIHelper.ShowUseItem(PackType.Item, MinggeManager.Instance.tyItemID, 1);
+    }
+
+    void DisplaySlotEquip()
+    {
+        for (int i = 0; i < equipCells.Length; i++)
+        {
+            equipCells[i].Display();
+        }
+        DisplaySuite();
+        DisplayAttr();
+    }
+
+    void DisplayAttr()
+    {
+        var attrIDList = PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.baseType];
+        string format = "{0}" + UIHelper.AppendColor(TextColType.Green, "+{1}", false);
+        for (int i = 0; i < baseAttrTexts.Length; i++)
+        {
+            var value = MinggeManager.Instance.minggeAttrDict.ContainsKey(attrIDList[i]) ? MinggeManager.Instance.minggeAttrDict[attrIDList[i]] : 0;
+            baseAttrTexts[i].text = PlayerPropertyConfig.GetFullDescription(attrIDList[i], value, format);
+        }
+
+        List<int> attrIDList1 = new List<int>();
+        attrIDList1.AddRange(PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.fightType]);
+        attrIDList1.AddRange(PlayerPropertyConfig.playerPropertyDict[PlayerPropertyConfig.fightAntiType]);
+        for (int i = 0; i < fightAttrTexts.Length; i++)
+        {
+            var value = MinggeManager.Instance.minggeAttrDict.ContainsKey(attrIDList1[i]) ? MinggeManager.Instance.minggeAttrDict[attrIDList1[i]] : 0;
+            fightAttrTexts[i].text = PlayerPropertyConfig.GetFullDescription(attrIDList1[i], value, format);
+        }
+    }
+
+    void DisplayDrop()
+    {
+        //鎵惧埌绗竴浠舵樉绀�
+        var dropItems = PackManager.Instance.GetItems(PackType.MinggeDrop);
+        if (dropItems.IsNullOrEmpty())
+        {
+            dropIcon.SetActive(false);
+            // moneyMoveByPathCell.SetActive(false);
+            return;
+        }
+        dropIcon.SetActive(true);
+        dropIcon.SetOrgSprite(dropItems[0].config.IconKey, "Icon");
+        var skillID = EquipModel.Instance.GetEquipSkillID(dropItems[0]);
+        if (skillID == 0)
+        {
+            dropSkillIcon.SetActive(false);
+        }
+        else
+        {
+            dropSkillIcon.SetActive(true);
+            dropSkillIcon.SetSprite($"MinggeSkill_{skillID}");
+        }
+    }
+
+    void DeleteDropItem(PackType packType, string guid, int itemID, int index, int clearType)
+    {
+        if (packType != PackType.MinggeDrop)
+            return;
+
+        dropIcon.SetActive(false);
+        moneyMoveByPathCell.SetActive(true);
+        moneyMoveByPathCell.PlayAnimation(MinggeManager.Instance.deitemID, 8, 2);
+    }
+
+    void SendTuiyan()
+    {
+        MinggeManager.Instance.SendTY(1);
+        tyEffect.Play();
+    }
+
+
+    void OnMinggeInfoUpdate()
+    {
+        DisplayMGGanwu();
+    }
+
+    void DisplayMGGanwu()
+    {
+        var config = MGGanwuLVConfig.Get(MinggeManager.Instance.m_GanwuLV);
+        rankLevelText.text = Language.Get("Mingge26", UIHelper.ChineseNumber(MinggeManager.Instance.m_GanwuLV));
+        processExpText.text = $"{MinggeManager.Instance.m_GanwuExp}/{config.NextNeedExp}";
+        processImg.fillAmount = MinggeManager.Instance.m_GanwuExp / (float)config.NextNeedExp;
+
+        if (lastLV != MinggeManager.Instance.m_GanwuLV)
+        {
+            lastLV = MinggeManager.Instance.m_GanwuLV;
+            lvUpEffect.Play();
+        }
+
+        if (lastExp != MinggeManager.Instance.m_GanwuExp)
+        {
+            lastExp = MinggeManager.Instance.m_GanwuExp;
+            processEffect.Play();
+        }
+    }
+
+    void DisplaySuite()
+    {
+        var dict = MinggeManager.Instance.GetMinggeSkillTypeIDDict();
+        var keys = dict.Keys.ToList();
+        keys.Sort();
+        for (int i = 0; i < suiteNameTexts.Length; i++)
+        {
+            if (i >= keys.Count)
+            {
+                suiteNameTexts[i].SetActive(false);
+                continue;
+            }
+            suiteNameTexts[i].SetActive(true);
+            suiteNameTexts[i].text = Language.Get($"MinggeSkillType_{keys[i]}") + $"({dict[keys[i]].Count})";
+        }
+    }
+
+    void ClickSuite(int index)
+    {
+        var dict = MinggeManager.Instance.GetMinggeSkillTypeIDDict();
+        var keys = dict.Keys.ToList();
+        keys.Sort();
+        if (index >= keys.Count)
+            return;
         
+        ItemTipUtility.Show(dict[keys[index]][0]);
     }
 }
 
diff --git a/Main/System/Settlement/BoneBattleFailWin.cs b/Main/System/Settlement/BoneBattleFailWin.cs
index 6d410d6..9dabd6f 100644
--- a/Main/System/Settlement/BoneBattleFailWin.cs
+++ b/Main/System/Settlement/BoneBattleFailWin.cs
@@ -36,7 +36,7 @@
 
     protected override void OnPreOpen()
     {
-        int funcId = BoneFieldManager.Instance.funcId;
+        int funcId = (int)FuncOpenEnum.BoneBattle;
         txtFuncName.text = FuncOpenLVConfig.HasKey(funcId) ? FuncOpenLVConfig.Get(funcId).Name : string.Empty;
         if (!FirstChargeManager.Instance.GetLocalFail())
         {
diff --git a/Main/System/Settlement/BoneBattleVictoryWin.cs b/Main/System/Settlement/BoneBattleVictoryWin.cs
index 765321f..2cfb115 100644
--- a/Main/System/Settlement/BoneBattleVictoryWin.cs
+++ b/Main/System/Settlement/BoneBattleVictoryWin.cs
@@ -22,7 +22,7 @@
     {
         scroller.OnRefreshCell += OnRefreshCell;
         CreateScroller();
-        int funcId = BoneFieldManager.Instance.funcId;
+        int funcId = (int)FuncOpenEnum.BoneBattle;
         txtFuncName.text = FuncOpenLVConfig.HasKey(funcId) ? FuncOpenLVConfig.Get(funcId).Name : string.Empty;
     }
 
diff --git a/Main/System/Team/TeamManager.cs b/Main/System/Team/TeamManager.cs
index 4fc2b47..1fd3e90 100644
--- a/Main/System/Team/TeamManager.cs
+++ b/Main/System/Team/TeamManager.cs
@@ -72,16 +72,16 @@
 		return teamDict.ContainsKey(teamType);
 	}
 
-	//閫氳繃闃靛鏂规ID鑾峰彇闃靛
-	public TeamBase GetTeam(int teamType)
+	//閫氳繃闃靛鏂规ID鑾峰彇闃靛 浠�1寮�濮�
+	public TeamBase GetTeam(int presetID)
 	{
 		TeamBase team = null;
 
-		if (!teamDict.TryGetValue(teamType, out team))
+		if (!teamDict.TryGetValue(presetID, out team))
 		{
-			team = new TeamBase(teamType);
+			team = new TeamBase(presetID);
 			// team.CreateDefault(HeroManager.Instance.GetPowerfulHeroList());
-			teamDict.Add(teamType, team);
+			teamDict.Add(presetID, team);
 		}
 
 		return team;
@@ -109,6 +109,7 @@
 		return FuncPresetManager.Instance.GetFuncPresetID((int)BattlePreSetType.Story, (int)FuncPresetType.Team);
 	}
 
+	// 鑾峰彇鎸囧畾鐨勬柟妗圛D
 	public int GetTeamID(int battleType)
 	{
 		return FuncPresetManager.Instance.GetFuncPresetID(battleType, (int)FuncPresetType.Team);
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index 22d3d9f..b0f4845 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -789,7 +789,8 @@
     RuneCompound = 22,//绗﹀嵃鍚堟垚
     GatherSoulCompound = 23,//鑱氶瓊鍚堟垚
     GatherSoulDecompose = 24,//鑱氶瓊鍒嗚В
-    EquipOP,   // 25 涓荤晫闈㈣澶囧垎瑙�/鏇挎崲鍥炲 瀵瑰簲 B4 15 涓荤嚎鎺夎惤鐗╁搧鎿嶄綔 #tagCSMainDropItemOP
+    EquipOP = 25,   // 25 涓荤晫闈㈣澶囧垎瑙�/鏇挎崲鍥炲 瀵瑰簲 B4 15 涓荤嚎鎺夎惤鐗╁搧鎿嶄綔 #tagCSMainDropItemOP
+    MinggeTY = 26,
 
 }
 
@@ -817,6 +818,7 @@
     Official = 3,//鍐呮斂
     BeautyMM = 7,//绾㈤ 
     GoldRush = 8, //娣橀噾
+    BoneBattle = 9, //鐧介鐩堥噹
     Realm = 10, //澧冪晫 瀹樿亴
     Guild = 11,// 鍏細
     BlessLV = 12, //绁濈绛夌骇
diff --git a/Main/Utility/OperationLogCollect.cs b/Main/Utility/OperationLogCollect.cs
index 58acbe5..7b83620 100644
--- a/Main/Utility/OperationLogCollect.cs
+++ b/Main/Utility/OperationLogCollect.cs
@@ -129,7 +129,7 @@
 
         var contentPrefix = StringUtility.Concat("IMEI:", DeviceUtility.GetDeviceUniquenessIdentify(), ";");
         contentPrefix = StringUtility.Concat(contentPrefix, "Version:", StringUtility.Concat(VersionConfig.Get().version, "_", 
-            VersionConfig.Get().buildIndex.ToString()), Language.Id, ";");
+            VersionConfig.Get().buildIndex.ToString(), "-", LoginManager.Instance.hotVersion), Language.Id, ";");
         contentPrefix = StringUtility.Concat(contentPrefix, "Brand:", DeviceUtility.GetDeviceName(), ";");
         contentPrefix = StringUtility.Concat(contentPrefix, "MI5:", DeviceUtility.GetDeviceModel(), ";");
         contentPrefix = StringUtility.Concat(contentPrefix, "os_version:", DeviceUtility.GetDeviceOSLevel(), ";");
@@ -162,7 +162,7 @@
 
             var contentPrefix = StringUtility.Concat("IMEI:", DeviceUtility.GetDeviceUniquenessIdentify(), ";");
             contentPrefix = StringUtility.Concat(contentPrefix, "Version:", StringUtility.Concat(VersionConfig.Get().version, "_",
-                VersionConfig.Get().buildIndex.ToString()), Language.Id, ";");
+                VersionConfig.Get().buildIndex.ToString(), "-", LoginManager.Instance.hotVersion), Language.Id, ";");
             contentPrefix = StringUtility.Concat(contentPrefix, "Brand:", DeviceUtility.GetDeviceName(), ";");
             contentPrefix = StringUtility.Concat(contentPrefix, "MI5:", DeviceUtility.GetDeviceModel(), ";");
             contentPrefix = StringUtility.Concat(contentPrefix, "os_version:", DeviceUtility.GetDeviceOSLevel(), ";");
diff --git a/Main/Utility/UIHelper.cs b/Main/Utility/UIHelper.cs
index e685d0d..e4ebbab 100644
--- a/Main/Utility/UIHelper.cs
+++ b/Main/Utility/UIHelper.cs
@@ -917,12 +917,12 @@
 
     //鐗╁搧 鍚勫姛鑳藉搧璐�  浠庣簿鑹�1鍝佽川 瀵瑰簲 3寮�濮�
     /// <summary>
-    /// 棰滆壊瀹氫箟鏍规嵁鍒嗙粍澶勭悊锛屽鏅�氱墿鍝佺殑棰滆壊绮捐壇鏄�1寮�濮嬶紝鏍戝拰瑁呭涔熸槸绮楃硻1寮�濮嬶紝闇�瑕佽皟鏁村尮閰�
+    /// 棰滆壊瀹氫箟鏍规嵁鍒嗙粍澶勭悊锛屽鏅�氱墿鍝佺殑棰滆壊绮捐壇鏄�1寮�濮嬶紝鏍戝拰瑁呭涔熸槸绮楃硻1寮�濮嬶紝鍛芥牸鏄粠棰滆壊2寮�濮嬮渶瑕佽皟鏁村尮閰�
     /// </summary>
     /// <param name="itemColor"></param>
     /// <param name="msg"></param>
     /// <param name="bright"></param>
-    /// <param name="colorGroupType">0 閫氱敤鍔熻兘鍝佽川鍒嗙粍绮捐壇鍒扮璇�</param>
+    /// <param name="colorGroupType">0 閫氱敤鍔熻兘鍝佽川鍒嗙粍绮捐壇鍒扮璇� 1 绁濈鍜岃澶囩敤 2鍛芥牸鐢�</param>
     /// <returns></returns>
     public static string AppendColor(int itemColor, string msg, bool bright = true, int colorGroupType = 0)
     {
@@ -930,6 +930,10 @@
         {
             itemColor = itemColor + 2;
         }
+        else if (colorGroupType == 2)
+        {
+            itemColor = itemColor + 1;
+        }
 
         switch (itemColor)
         {

--
Gitblit v1.8.0