From 853fca9637124fcc2d172115b113da88d8591fb3 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 26 一月 2026 01:58:53 +0800
Subject: [PATCH] 419 【内政】命格系统

---
 Main/System/FuncPreset/FuncPresetChooseCell.cs          |   45 ++-
 Main/Component/UI/Common/SliderPanel.cs                 |   24 +
 Main/System/Tip/ConfirmCancel.cs                        |    2 
 Main/System/FuncPreset/FuncPresetChooseMoreCell.cs.meta |   11 
 Main/System/Mingge/MinggeWin.cs                         |   26 +
 Main/System/FuncPreset/FuncPresetChangeNameWin.cs.meta  |   11 
 Main/System/Mingge/MinggePrayWin.cs                     |  157 +++++++++++
 Main/System/FuncPreset/FuncPresetChangeNameWin.cs       |   32 ++
 Main/System/Main/FightPowerManager.cs                   |   12 
 Main/System/Mingge/MinggePrayWin.cs.meta                |   11 
 Main/System/Mingge/MinggeSmallTipWin.cs                 |  100 ++++++
 Main/System/ItemTip/ItemTipUtility.cs                   |    2 
 Main/System/FuncPreset/FuncPresetManager.cs             |   89 +++++-
 Main/System/Hero/HeroInfo.cs                            |    7 
 Main/System/Mingge/MinggePrayRateCell.cs                |   39 ++
 Main/System/Mingge/MinggePrayRateCell.cs.meta           |   11 
 Main/Config/PartialConfigs/PresetUnlockConfig.cs        |    2 
 Main/System/Mingge/MinggeEquipCell.cs                   |    6 
 Main/System/Attribute/TotalAttributeWin.cs              |    2 
 Main/System/FuncPreset/FuncPresetChooseCells.cs         |   88 ++++--
 Main/System/FuncPreset/FuncPresetChooseMoreCell.cs      |   61 ++++
 Main/System/Mingge/MinggeEquipWin.cs                    |   16 
 Main/System/Mingge/MinggeManager.cs                     |   41 ++
 23 files changed, 707 insertions(+), 88 deletions(-)

diff --git a/Main/Component/UI/Common/SliderPanel.cs b/Main/Component/UI/Common/SliderPanel.cs
index 019107b..e3548be 100644
--- a/Main/Component/UI/Common/SliderPanel.cs
+++ b/Main/Component/UI/Common/SliderPanel.cs
@@ -47,19 +47,25 @@
             slider.value -= 1;
         });
 
-        maxBtn.AddListener(() =>
+        maxBtn?.AddListener(() =>
         {
             slider.value = slider.maxValue;
         });
     }
 
+    /// <summary>
+    /// 鍒濆鍖�
+    /// </summary>
+    /// <param name="_OnChangeEvent">鏁伴噺鍙樺寲浜嬩欢</param>
+    /// <param name="_maxCount">鏈�澶ф暟閲� 鍙互璁剧疆鏈�灏�1</param>
+    /// <param name="_count">鍒濆鏄剧ず鏁伴噺</param>
     public void Init(Action<int> _OnChangeEvent, int _maxCount, int _count = 1)
     {
         count = _count;
         maxCount = _maxCount;
-        slider.value = count;
         slider.minValue = 0;
         slider.maxValue = _maxCount;
+        slider.value = count;
 
         Refresh();
         OnChangeEvent = _OnChangeEvent;
@@ -74,15 +80,21 @@
         {
             addBtn.interactable = false;
             addBtn.SetColorful(null, false);
-            maxBtn.interactable = false;
-            maxBtn.SetColorful(null, false);
+            if (maxBtn != null)
+            {
+                maxBtn.interactable = false;
+                maxBtn.SetColorful(null, false);
+            }
         }
         else
         {
             addBtn.interactable = true;
             addBtn.SetColorful(null, true);
-            maxBtn.interactable = true;
-            maxBtn.SetColorful(null, true);
+            if (maxBtn != null)
+            {
+                maxBtn.interactable = true;
+                maxBtn.SetColorful(null, true);
+            }
         }
 
         if (count <= 1)
diff --git a/Main/Config/PartialConfigs/PresetUnlockConfig.cs b/Main/Config/PartialConfigs/PresetUnlockConfig.cs
index f96c119..e91bbd0 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>();  
+    static Dictionary<int, int> m_UnLockTypeDict = new Dictionary<int, int>();  // 棰勮绫诲瀷 瑙i攣绫诲瀷锛屾殏绾﹀畾鍙湁1绉�
     protected override void OnConfigParseCompleted()
     {
         if (!m_PresetUnlockDict.ContainsKey(PresetType))
diff --git a/Main/System/Attribute/TotalAttributeWin.cs b/Main/System/Attribute/TotalAttributeWin.cs
index d925399..5e47032 100644
--- a/Main/System/Attribute/TotalAttributeWin.cs
+++ b/Main/System/Attribute/TotalAttributeWin.cs
@@ -93,7 +93,7 @@
             });
         }
 
-        ForceRefreshLayout();
+        ForceRefreshLayout().Forget();
     }
 
 
diff --git a/Main/System/FuncPreset/FuncPresetChangeNameWin.cs b/Main/System/FuncPreset/FuncPresetChangeNameWin.cs
new file mode 100644
index 0000000..b7bb3f5
--- /dev/null
+++ b/Main/System/FuncPreset/FuncPresetChangeNameWin.cs
@@ -0,0 +1,32 @@
+using System.Text;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class FuncPresetChangeNameWin : UIBase
+{
+    [SerializeField] InputField nameText;
+    [SerializeField] Button confirmBtn;
+
+    protected override void InitComponent()
+    {
+        confirmBtn.AddListener(OnConfirm);
+    }
+
+    void OnConfirm()
+    {
+        var len = (byte)Encoding.Default.GetBytes(nameText.text).Length;
+
+        if (len > 12)
+        {
+            return;
+        }
+        var pack = new CB261_tagCSFuncPresetUpdName();
+        pack.FuncPresetType = (byte)(functionOrder/100);
+        pack.PresetID = (byte)(functionOrder % 100);
+        pack.NameLen = len;
+        pack.PresetName = nameText.text;
+        GameNetSystem.Instance.SendInfo(pack);
+        CloseWindow();
+    }
+}
+
diff --git a/Main/System/FuncPreset/FuncPresetChangeNameWin.cs.meta b/Main/System/FuncPreset/FuncPresetChangeNameWin.cs.meta
new file mode 100644
index 0000000..3d5ee95
--- /dev/null
+++ b/Main/System/FuncPreset/FuncPresetChangeNameWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ddcba8cfb66dcd146b86ec62bffcd50d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FuncPreset/FuncPresetChooseCell.cs b/Main/System/FuncPreset/FuncPresetChooseCell.cs
index 66db8d2..fbd7f5b 100644
--- a/Main/System/FuncPreset/FuncPresetChooseCell.cs
+++ b/Main/System/FuncPreset/FuncPresetChooseCell.cs
@@ -9,12 +9,14 @@
     [SerializeField] Image lockImg;
     [SerializeField] Text numText;
     [SerializeField] Image selectImg;
-    [SerializeField] Button unFoldBtn;    //瑙i攣鎴栬�呭睍寮�
+    [SerializeField] Button unFoldBtn;    //瑙i攣 鎴栭�変腑
 
     [SerializeField] Text caseNameText;
     [SerializeField] Button changeNameBtn;
     [SerializeField] Text numUnFoldText;
     [SerializeField] Button foldBtn;    //鎶樺彔
+
+    [SerializeField] FuncPresetChooseCells pareant;
 
     
     public void Display(int battleType, int funcType, int id, bool isUnFold)
@@ -32,7 +34,7 @@
 
             caseNameText.text = data.PresetName;
             numUnFoldText.text = id.ToString();
-            changeNameBtn.AddListener(ChangeName);
+            changeNameBtn.AddListener(()=>ChangeName(funcType, id));
             foldBtn.AddListener(()=>Fold(funcType, id));
         }
         else
@@ -40,9 +42,28 @@
             unFoldObj.SetActive(false);
             foldObj.SetActive(true);
 
-            unFoldBtn.AddListener(() => UnFold(funcType, id));
+            unFoldBtn.AddListener(() =>
+            {
+                if (id == selectID && pareant.unFoldID == 0)
+                {
+                    //閫変腑鐘舵�佷笅鐐瑰嚮鎶樺彔锛屽垯涓嶆姌鍙�
+                    pareant.unFoldID = id;
+                }
+                if (pareant.unFoldID == id)
+                {
+                    FuncPresetManager.Instance.OnSelectPresetEvent?.Invoke(funcType, id, true);
+                }
+                else
+                {
+                    if (FuncPresetManager.Instance.ClickFuncPreset(battleType, funcType, id))
+                    {
+                        pareant.unFoldID = id;
+                    }
+                }
+            });
+                
             lockImg.SetActive(!data.unLock);
-            numText.text = id.ToString();
+            numText.text = !data.unLock ? "" :id.ToString();
             selectImg.SetActive(selectID == id);
         }
 
@@ -50,24 +71,16 @@
     }
 
 
-    void ChangeName()
+    void ChangeName(int funcType, int id)
     {
-        // UIManager.Instance.OpenWindow<FuncPresetChangeNameWin>();
+        UIManager.Instance.OpenWindow<FuncPresetChangeNameWin>(funcType*100 + id);
     }
 
     void Fold(int funcType, int id)
     {
+        pareant.unFoldID = 0;
         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/FuncPreset/FuncPresetChooseCells.cs b/Main/System/FuncPreset/FuncPresetChooseCells.cs
index e44dd53..9b360a0 100644
--- a/Main/System/FuncPreset/FuncPresetChooseCells.cs
+++ b/Main/System/FuncPreset/FuncPresetChooseCells.cs
@@ -1,69 +1,101 @@
+using System;
+using Cysharp.Threading.Tasks;
 using UnityEngine;
+using UnityEngine.UI;
 
 //鏂规棰勮: 澶氭柟妗堥�夋嫨缁勪欢
 //鎺у埗鏄鹃殣锛� 1.鏈紑鍚椂鍏ㄤ笉鏄剧ず
 //          2.寮�鍚悗鏄剧ず宸茶В閿� + 鏈В閿� 3+0
-                //a. 鎸夊厓瀹濊В閿佺殑涓洪�愪竴寮�鍚紝榛樿寮�鍚痻涓紝绗瑇+1涓樉绀烘潯浠堕渶瑕併�愭祦娲鹃璁俱�戝姛鑳藉紑鍚�, 鍙В閿佸悗閫愪竴淇濈暀涓�涓攣浣忕殑锛堢洿鍒板叏寮�鍚級锛�
-                //b. 鎸夊姛鑳芥潯浠跺紑鍚殑锛屽鏋滈粯璁ゅ彧寮�鍏朵竴涓柟妗堢殑鎯呭喌涓嶆樉绀猴紝杈惧埌涓嬩竴涓柟妗堢殑鏉′欢婊¤冻鍚庡叏鏄剧ず锛涢粯璁ゅぇ浜�1涓殑鎯呭喌鐩存帴鍏ㄦ樉绀�
+//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; //寮哄埗灞曞紑锛屼笉鑳芥敹缂�
+    [SerializeField] Button unFoldBtn;   //灞曞紑鏇村
+    //琚�変腑鐨勬柟妗堜細鏄剧ず鍦ㄥ灞傦紝濡傛灉涓嶆槸绗洓涓垯绗洓涓細鏄剧ず鍦ㄦ渶涓婇潰
+    [SerializeField] FuncPresetChooseMoreCell[] moreCells;
+    bool forceUnFold = false; //寮哄埗灞曞紑锛屼笉鑳芥敹缂�; 娴佹淳鐣岄潰鐨勯渶姹�
+    [NonSerialized] public int unFoldID = 0;    //褰撳墠灞曞紑鐨勬柟妗圛D锛屽湪閫変腑鐨勬儏鍐典笅鎵嶇敓鏁�
+    int curBattleType;
 
     /// <summary>
     /// 鏄剧ず鏂规棰勮
     /// </summary>
-    /// <param name="battleType"></param>
-    /// <param name="funcType"></param>
+    /// <param name="battleType">涓荤嚎鎴樻枟 鍏朵粬闃插畧</param>
+    /// <param name="funcType">鍔熻兘绫诲瀷</param>
+    /// <param name="unFoldID">灞曞紑鐨勬柟妗圛D锛岄粯璁�0锛屼笉灞曞紑</param>
     /// <param name="forceUnFold"> 寮哄埗灞曞紑锛屼笉鑳芥敹缂�</param>
     public void Display(int battleType, int funcType, bool _forceUnFold = false)
     {
         forceUnFold = _forceUnFold;
-        var _unFoldState = forceUnFold ? true : isUnFold;
-        curBbattleType = battleType;
+        curBattleType = battleType;
+
         var selectID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType(battleType, funcType);
+        var showCount = FuncPresetManager.Instance.GetShowFuncPresetCount(funcType);
+        unFoldBtn.SetActive(showCount > 4);
+
         for (int i = 0; i < cells.Length; i++)
         {
-            if (i < 3)
+            if (i < showCount)
             {
-                cells[i].Display(battleType, funcType, i + 1, _unFoldState);
+                cells[i].SetActive(true);
+                if (i < 3)
+                {
+                    var _unFoldState = forceUnFold ? true : i + 1 == unFoldID;
+                    cells[i].Display(battleType, funcType, i + 1, _unFoldState);
+                }
+                else
+                {
+                    var _unFoldState = forceUnFold ? true : (selectID > 4 ? selectID : 4) == unFoldID;
+                    //绗洓涓姩鎬佸彉鍖�
+                    cells[i].Display(battleType, funcType, selectID > 4 ? selectID : 4, _unFoldState);
+                }
             }
             else
             {
-                //绗洓涓姩鎬佸彉鍖�
-                cells[i].Display(battleType, funcType, selectID > 4 ? selectID : 4, _unFoldState);
+                cells[i].SetActive(false);
             }
         }
-    }
 
+        var showMoreCount = showCount - 4;
+        for (int i = 0; i < showMoreCount; i++)
+        {
+            if (i < showMoreCount)
+            {
+                moreCells[i].SetActive(true);
+                var id = i + 5;
+                if (i == 0 && selectID > 4)
+                {
+                    id = 4;
+                }
+                moreCells[i].Display(battleType, funcType, id);
+            }
+            else
+            {
+                moreCells[i].SetActive(false);
+            }
+        }
+
+        UIUtility.ForceRefreshLayout(this.transform).Forget();
+    }
 
     void OnEnable()
     {
-        if (!forceUnFold)
-        {
-            FuncPresetManager.Instance.OnSelectPresetEvent += OnSelectPresetEvent;
-        }
+        FuncPresetManager.Instance.OnSelectPresetEvent += OnSelectPresetEvent;
     }
 
     void OnDisable()
     {
-        if (!forceUnFold)
-        {
-            isUnFold = false;
-            FuncPresetManager.Instance.OnSelectPresetEvent -= OnSelectPresetEvent;
-        }
+        unFoldID = 0;
+        FuncPresetManager.Instance.OnSelectPresetEvent -= OnSelectPresetEvent;
     }
 
-    void OnSelectPresetEvent(int funcType, int id, bool _isUnFold)
+    void OnSelectPresetEvent(int funcType, int id, bool isUnFold)
     {
-        isUnFold = _isUnFold;
-        int index = id > 4 ? 3 : id - 1;
-        cells[index].Display(curBbattleType, funcType, id, isUnFold);
+        Display(curBattleType, funcType, forceUnFold);
     }
 }
diff --git a/Main/System/FuncPreset/FuncPresetChooseMoreCell.cs b/Main/System/FuncPreset/FuncPresetChooseMoreCell.cs
new file mode 100644
index 0000000..38b4284
--- /dev/null
+++ b/Main/System/FuncPreset/FuncPresetChooseMoreCell.cs
@@ -0,0 +1,61 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+//鏂规棰勮 鏂规閫夋嫨缁勪欢, 闅愯棌鐨勬柟妗�
+public class FuncPresetChooseMoreCell : MonoBehaviour
+{
+    [SerializeField] Button lockBtn;
+    [SerializeField] Button changeNameBtn;
+    [SerializeField] Text caseNameText;
+    [SerializeField] Button chooseBtn;
+
+    [SerializeField] Transform selectObj;   //娴佹淳鍚嶆墠鏈夐�変腑锛屾柟妗堝悕閫変腑鍚庡氨鏄剧ず鍦ㄥ灞傜鍥涗釜
+    [SerializeField] FuncPresetChooseCells pareant;
+
+    
+    public void Display(int battleType, int funcType, int id)
+    {
+        var data = FuncPresetManager.Instance.GetFuncPreset(funcType, id);
+        if (data == null)
+        {
+            return;
+        }
+        var selectID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType(battleType, funcType);
+        caseNameText.text = Language.Get("FuncPreset11", id, UIHelper.AppendColor(selectID == id ? TextColType.titleSelectColor : TextColType.titleUnSelectColor, data.PresetName));
+        if (data.unLock)
+        {
+            lockBtn.SetActive(false);
+            changeNameBtn.SetActive(true);
+            changeNameBtn.AddListener(()=>
+            {
+                ChangeName(funcType, id);
+            });
+            chooseBtn.AddListener(() =>
+            {
+                if (pareant)
+                {
+                    pareant.unFoldID = id;
+                }
+                FuncPresetManager.Instance.ClickFuncPreset(battleType, funcType, id);
+            });
+        }
+        else
+        {
+            lockBtn.SetActive(true);
+            lockBtn.AddListener(() => FuncPresetManager.Instance.ClickFuncPreset(battleType, funcType, id));
+            changeNameBtn.SetActive(false);
+            chooseBtn.RemoveAllListeners();
+        }
+        selectObj?.SetActive(selectID == id);
+        
+    }
+
+
+    void ChangeName(int funcType, int id)
+    {
+        UIManager.Instance.OpenWindow<FuncPresetChangeNameWin>(funcType*100 + id);
+    }
+
+
+
+}
diff --git a/Main/System/FuncPreset/FuncPresetChooseMoreCell.cs.meta b/Main/System/FuncPreset/FuncPresetChooseMoreCell.cs.meta
new file mode 100644
index 0000000..ffc7681
--- /dev/null
+++ b/Main/System/FuncPreset/FuncPresetChooseMoreCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 9872e1f383702764ab1534fe3f862fe4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FuncPreset/FuncPresetManager.cs b/Main/System/FuncPreset/FuncPresetManager.cs
index 1bff3a7..9f1678d 100644
--- a/Main/System/FuncPreset/FuncPresetManager.cs
+++ b/Main/System/FuncPreset/FuncPresetManager.cs
@@ -9,7 +9,6 @@
 {
     //棰勮鏂规锛氬姛鑳界被鍨嬶紙鍚叏灞�鍜屽瓙鍔熻兘锛岄厤琛級-瀛愭柟妗圛D-棰勮鏂规瑙i攣鍚嶇О淇℃伅
     Dictionary<int, Dictionary<int, FuncPreset>> m_FuncPresetDict = new Dictionary<int, Dictionary<int, FuncPreset>>();
-    public event Action OnFuncPresetInfoListChanged;    //娴佹淳璁剧疆鎬讳俊鎭�
 
     //瀵瑰簲 BattlePreSetType 鎴樻枟绫诲瀷 锛� 鍏ㄥ眬鏂规ID
     Dictionary<int, int> battlePreSetDict = new Dictionary<int, int>();
@@ -99,9 +98,8 @@
             }
             m_FuncPresetDict[config.PresetType][config.PresetID] = new FuncPreset()
             {
-                PresetID = config.PresetID,
                 unLock = config.UnlockType == 0,
-                PresetName = Language.Get("Mingge13") + config.PresetID,
+                PresetName = Language.Get("Mingge13", config.PresetID)
             };
         }
     }
@@ -119,16 +117,16 @@
             {
                 var preset = funcPresetInfo.PresetList[j];
                 //璇ュ姛鑳介璁捐В閿佺姸鎬侊紝鎸夐璁綢D浜岃繘鍒朵綅杩愮畻璁板綍鏄惁宸茶В閿�
+                bool _unlock = (funcPresetInfo.UnlockState & (1 << preset.PresetID)) != 0;
                 m_FuncPresetDict[funcPresetInfo.FuncPresetType][preset.PresetID] = new FuncPreset()
                 {
-                    PresetID = preset.PresetID,
-                    unLock = (funcPresetInfo.UnlockState & (1 << preset.PresetID)) != 0,
-                    PresetName = string.IsNullOrEmpty(preset.PresetName) ? Language.Get("Mingge13") + preset.PresetID : preset.PresetName,
+                    unLock = _unlock,
+                    PresetName = string.IsNullOrEmpty(preset.PresetName) ? Language.Get("Mingge13", preset.PresetID) : preset.PresetName,
                 };
             }
         }
 
-        OnFuncPresetInfoListChanged?.Invoke();
+        OnFuncPresetUseDataEvent?.Invoke();
     }
 
     //姣忎釜鍏ㄥ眬鏂规鐨勫瓨鍌ㄤ俊鎭�
@@ -191,7 +189,7 @@
         return 1;
     }
 
-    //鑾峰彇瀛愬姛鑳芥柟妗圛D锛屽鏋滃彇涓嶅埌榛樿鏂规1; 榛樿鍙栧綋鍓嶆祦娲句笅鐨�
+    //鑾峰彇褰撳墠娴佹淳涓嬬殑瀛愬姛鑳界殑鏂规ID锛屽鏋滃彇涓嶅埌榛樿鏂规1
     public int GetFuncPresetID(int funcType)
     {
         int globalPresetID = GetGlobalPresetID((int)BattlePreSetType.Story);
@@ -202,7 +200,7 @@
         return 1;
     }
 
-    //
+    //鎸囧畾棰勮淇℃伅
     public FuncPreset GetFuncPreset(int funcType, int presetID)
     {
         if (m_FuncPresetDict.ContainsKey(funcType) && m_FuncPresetDict[funcType].ContainsKey(presetID))
@@ -215,6 +213,11 @@
     // 杩欓噷铏界劧浼犵殑鏄� battleType锛屼絾鏄疄闄呰繕鏄牴鎹叏灞�鏂规ID鍋氬搴斾慨鏀癸紱濡傛灉杩欎釜鍏ㄥ眬鏂规鍏朵粬鍦版柟鏈変娇鐢ㄤ篃鏄悓姝ュ彉鍖�
     public void SaveFuncPresetID(int battleType, int funcType, int presetID)
     {
+        if (funcType == 1)
+        {
+            SaveBattlePresetID(battleType, presetID);
+            return;
+        }
         var pack = new CB262_tagCSFuncPresetSwitch();
         pack.FuncPresetType = (byte)funcType;
         pack.PresetID = (byte)presetID;
@@ -230,27 +233,44 @@
         GameNetSystem.Instance.SendInfo(pack);
     }
 
+    public void UnLockPreset(int funcType, int presetID)
+    {
+        var pack = new CB260_tagCSFuncPresetUnlock();
+        pack.FuncPresetType = (byte)funcType;
+        pack.PresetID = (byte)presetID;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
     //瑕佹樉绀虹殑鏂规鏁伴噺; 鏍规嵁鎯呭喌浼氬寘鍚湭瑙i攣
     //a. 鎸夊厓瀹濊В閿佺殑涓洪�愪竴寮�鍚紝榛樿寮�鍚痻涓紝绗瑇+1涓樉绀烘潯浠堕渶瑕併�愭祦娲鹃璁俱�戝姛鑳藉紑鍚�, 鍙В閿佸悗閫愪竴淇濈暀涓�涓攣浣忕殑锛堢洿鍒板叏寮�鍚級锛�
     //b. 鎸夊姛鑳芥潯浠跺紑鍚殑锛屽鏋滈粯璁ゅ彧寮�鍏朵竴涓柟妗堢殑鎯呭喌涓嶆樉绀猴紝杈惧埌涓嬩竴涓柟妗堢殑鏉′欢婊¤冻鍚庡叏鏄剧ず锛涢粯璁ゅぇ浜�1涓殑鎯呭喌鐩存帴鍏ㄦ樉绀�
     public int GetShowFuncPresetCount(int funcType)
     {
-        var showCount = GetUnlockCnt(funcType);
+        var unlockCnt = GetUnlockCnt(funcType);
         var maxCount = PresetUnlockConfig.GetFuncPresetMaxCount(funcType);
         var unlockType = PresetUnlockConfig.GetUnlockType((int)FuncPresetType.Mingge);
-        if (unlockType > 1)
+        if (unlockType == 2)
         {
-            //闈炲厓瀹濊В閿�
+            //鍛芥牸鎸夋帹婕斿鐣岃В閿�
             //鍙湁1涓柟妗堝垯涓嶆樉绀猴紝澶т簬1涓垯鍏ㄦ樉绀�
-            return showCount == 1 ? 0 : maxCount;
+            if (unlockCnt == 1)
+            {
+                var config = PresetUnlockConfig.GetPresetUnlockConfig((int)FuncPresetType.Mingge, 2);
+                if (MinggeManager.Instance.m_GanwuLV >= config.UnlockValue)
+                {
+                    return maxCount;
+                }
+                return 0;
+            }
+            return maxCount;
         }
         if (!IsOpen())
         {
             //鏈紑鍚椂锛岄粯璁ゅぇ浜�1鍒欐樉绀�
-            return showCount == 1 ? 0 : showCount;
+            return unlockCnt == 1 ? 0 : unlockCnt;
         }
 
-        return showCount == maxCount ? showCount : showCount + 1;
+        return unlockCnt == maxCount ? unlockCnt : unlockCnt + 1;
     }
 
     public int GetUnlockCnt(int funcType)
@@ -268,12 +288,49 @@
         }
         return count;
     }
+
+    //閫夋嫨鏂规锛氳В閿佹垨閫変腑
+    // 閫夋嫨鏂规杩斿洖true锛屽惁鍒欒繑鍥瀎alse
+    public bool ClickFuncPreset(int battleType, int funcType, int id)
+    {
+        var config = PresetUnlockConfig.GetPresetUnlockConfig(funcType, id);
+        var data = GetFuncPreset(funcType, id);
+        if (!data.unLock)
+        {
+            // 鏈В閿� 鍒欒喘涔�
+            if (config.UnlockType == 1)
+            {
+                ConfirmCancel.MoneyIconToggleConfirmByType(ToggleCheckType.FuncPreset, config.UnlockValue, 1,
+                            Language.Get("FuncPreset12", UIHelper.GetIconNameWithMoneyType(1), config.UnlockValue), () =>
+                                {
+                                    if (!UIHelper.CheckMoneyCount(1, config.UnlockValue, 2))
+                                        return;
+
+                                    UnLockPreset(funcType, id);
+                                });
+            }
+            else if (config.UnlockType == 2)
+            {
+
+                if (MinggeManager.Instance.m_GanwuLV < config.UnlockValue)
+                {
+                    SysNotifyMgr.Instance.ShowTip("FuncPreset1", config.UnlockValue);
+                    return false;
+                }
+                UnLockPreset(funcType, id);
+            }
+            return false;
+        }
+
+        SaveFuncPresetID(battleType, funcType, id);
+        return true;
+    } 
+
 }
 
 
 public class FuncPreset
 {
-    public int PresetID;        //棰勮鏂规ID
     public bool unLock; //鏄惁瑙i攣
     public string PresetName;        //棰勮鍚嶇О
 }
diff --git a/Main/System/Hero/HeroInfo.cs b/Main/System/Hero/HeroInfo.cs
index 61ab98d..1a83b6c 100644
--- a/Main/System/Hero/HeroInfo.cs
+++ b/Main/System/Hero/HeroInfo.cs
@@ -48,7 +48,12 @@
     {
         get
         {
-            return itemHero.GetUseDataFirstValue(83) != 0;
+            var _list = itemHero.GetUseData(83);
+            // 榛樿娌℃湁棰勮鐨勮瘽灏辨槸鐢熸晥鐨�
+            if (_list == null || _list.Count == 0)
+                return true;
+            var id = FuncPresetManager.Instance.GetFuncPresetID((int)FuncPresetType.Team);
+            return _list.Contains(id);
         }
     }
 
diff --git a/Main/System/ItemTip/ItemTipUtility.cs b/Main/System/ItemTip/ItemTipUtility.cs
index fadcf96..df122a7 100644
--- a/Main/System/ItemTip/ItemTipUtility.cs
+++ b/Main/System/ItemTip/ItemTipUtility.cs
@@ -390,7 +390,7 @@
                 UIManager.Instance.OpenWindow<ChooseItemsWin>();
                 break;
             case TipType.Mingge:
-                // UIManager.Instance.OpenWindow<MinggeWin>();
+                UIManager.Instance.OpenWindow<MinggeSmallTipWin>();
                 break;
             default:
                 UIManager.Instance.OpenWindow<ItemTipWin>();
diff --git a/Main/System/Main/FightPowerManager.cs b/Main/System/Main/FightPowerManager.cs
index d6518d9..f487dcd 100644
--- a/Main/System/Main/FightPowerManager.cs
+++ b/Main/System/Main/FightPowerManager.cs
@@ -734,7 +734,17 @@
             fightPowerVariables.Clear();
             fightPowerVariables[PLAYER_LV] = PlayerDatas.Instance.baseData.LV;
             fightPowerVariables[OFFICIAL_LV] = PlayerDatas.Instance.baseData.realmLevel;
-            fightPowerVariables[SKILL_POWER] = SkillConfig.Get(item.Key + item.Value - 1).FightPower;
+            if (item.Value == 0)
+            {
+                continue;
+            }
+            var skill = SkillConfig.Get(item.Key + item.Value - 1);
+            if (skill == null)
+            {
+                Debug.LogError("skill is null" + (item.Key + item.Value - 1));
+                continue;
+            }
+            fightPowerVariables[SKILL_POWER] = skill.FightPower;
             skillPower += (long)FightPowerFormula.GetSkillsFightPower(fightPowerVariables);
         }
 
diff --git a/Main/System/Mingge/MinggeEquipCell.cs b/Main/System/Mingge/MinggeEquipCell.cs
index 0bd8aad..bec1b09 100644
--- a/Main/System/Mingge/MinggeEquipCell.cs
+++ b/Main/System/Mingge/MinggeEquipCell.cs
@@ -1,6 +1,7 @@
 锘縰sing UnityEngine;
 using UnityEngine.UI;
 using DG.Tweening;
+using System;
 
 
 //瀹炶鐨勬樉绀�
@@ -44,7 +45,8 @@
             if (skillID != 0)
             {
                 skillImage.SetSprite($"MinggeSkill_{skillID}");
-                loopEffect.Play();
+                var index = Array.IndexOf(EffectConfig.Get(loopEffect.effectId).animIndex, skillID);
+                loopEffect.Play(index);
             }
             else
             {
@@ -61,7 +63,7 @@
 
         button.AddListener(() =>
         {
-            ItemTipUtility.Show(itemID);
+            ItemTipUtility.Show(item.guid);
         });
 
         if (lastGuid == "uninit")
diff --git a/Main/System/Mingge/MinggeEquipWin.cs b/Main/System/Mingge/MinggeEquipWin.cs
index 329fd98..2a43dab 100644
--- a/Main/System/Mingge/MinggeEquipWin.cs
+++ b/Main/System/Mingge/MinggeEquipWin.cs
@@ -7,6 +7,7 @@
     [SerializeField] MinggeEquipChangeCell newEquipCell;
     [SerializeField] Transform presetObj;
     [SerializeField] GroupButtonEx[] presetBtns;
+    [SerializeField] Text[] presetNameTexts;
 
     int selectPresetID = 0;
     int lastDropIndex = -1;
@@ -14,9 +15,10 @@
     {
         for (int i = 0; i < presetBtns.Length; i++)
         {
+            int index = i + 1;
             presetBtns[i].AddListener(() =>
             {
-                selectPresetID = i;
+                selectPresetID = index;
                 Display();
             });
         }
@@ -57,9 +59,17 @@
             presetObj.SetActive(true);
             for (int i = 0; i < presetBtns.Length; i++)
             {
-                presetBtns[i].SetActive(i < cnt);
+                if (i < cnt)
+                {
+                    presetBtns[i].SetActive(true);
+                    presetNameTexts[i].text = FuncPresetManager.Instance.GetFuncPreset((int)FuncPresetType.Mingge, i + 1).PresetName;
+                }
+                else
+                {
+                    presetBtns[i].SetActive(false);
+                }
             }
-
+            presetBtns[selectPresetID -1].SelectBtn();
         }
         else
         {
diff --git a/Main/System/Mingge/MinggeManager.cs b/Main/System/Mingge/MinggeManager.cs
index 32efd6c..361fbeb 100644
--- a/Main/System/Mingge/MinggeManager.cs
+++ b/Main/System/Mingge/MinggeManager.cs
@@ -42,6 +42,7 @@
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
         PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
         DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent += OnEquipResult;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOK;
         ParseConfig();
     }
 
@@ -50,6 +51,7 @@
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
         PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
         DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent -= OnEquipResult;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOK;
     }
 
 
@@ -80,6 +82,12 @@
         m_Lingying = 0;
         waitTYOPPack = false;
     }
+
+    void OnPlayerLoginOK()
+    {
+        UpdateRedPoint();
+    }
+
     private void OnEquipResult(HA814_tagMCMakeItemAnswer info)
     {
         if (info.MakeType != (int)MakeType.MinggeTY)
@@ -95,6 +103,11 @@
         {
             waitTYOPPack = false;
             CalcEquip();
+        }
+
+        if (type == PackType.Item && (itemID == tyItemID || itemID == qlItemID))
+        {
+            UpdateRedPoint();
         }
     }
 
@@ -115,7 +128,7 @@
         {
             if (OpenMinggeEquipWin(item))
             {
-                //闇�瑕佺帺瀹跺鐞嗙殑鏃跺�欓��鍑�
+                //闇�瑕佺帺瀹跺鐞嗚澶�
                 return true;
             }
         }
@@ -203,6 +216,11 @@
         selectFloorEquip = equip;
         if (UIManager.Instance.IsOpened<MinggeWin>())
         {
+            if (selectFloorEquip.config.EquipPlace == 0)
+            {
+                Debug.LogError($"閰嶇疆閿欒鐗╁搧 {selectFloorEquip.itemId} 瑁呭浣嶄负0");
+                return true;
+            }
             UIManager.Instance.OpenWindow<MinggeEquipWin>();
         }
         return true;
@@ -216,7 +234,6 @@
 
     public void SendTY(int count)
     {
-
         if (CalcEquip())
         {
             return;
@@ -298,5 +315,25 @@
     Redpoint redpointMG = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 1);
     Redpoint redpointPray = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 2);
     
+    void UpdateRedPoint()
+    {
+
+        redpointMG.state = RedPointState.None;
+        redpointPray.state = RedPointState.None;
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mingge))
+        {
+            return;
+        }
+        if (PackManager.Instance.GetItemCountByID(PackType.Item, tyItemID) > 0)
+        {
+            redpointMG.state = RedPointState.Simple;
+        }
+
+        if (PackManager.Instance.GetItemCountByID(PackType.Item, qlItemID) > 0)
+        {
+            redpointPray.state = RedPointState.Simple;
+        }
+    }
+
     #endregion
 }
\ No newline at end of file
diff --git a/Main/System/Mingge/MinggePrayRateCell.cs b/Main/System/Mingge/MinggePrayRateCell.cs
new file mode 100644
index 0000000..8fa5fbd
--- /dev/null
+++ b/Main/System/Mingge/MinggePrayRateCell.cs
@@ -0,0 +1,39 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+using DG.Tweening;
+using System;
+using System.Collections.Generic;
+
+
+//绁堢伒姒傜巼
+public class MinggePrayRateCell : MonoBehaviour
+{
+    [SerializeField] Text rateText;
+    [SerializeField] Text nextRateText;
+    [SerializeField] Image qualityImg;
+    [SerializeField] Image arrowImg;
+
+    // maxRateNum 姒傜巼鏈�澶у�硷紝鐢ㄤ簬璁$畻鐧惧垎姣斿彇鏈�鍚庝袱浣�
+    public void Display(int index, List<int> bigRateList, List<int> littleRateList, int maxRateNum)
+    {
+        var rate = littleRateList[index];
+        var nextRate = bigRateList[index];
+
+        rateText.text = (rate / (float)maxRateNum * 100).ToString("0.##") + "%";
+        nextRateText.text = (nextRate / (float)maxRateNum * 100).ToString("0.##") + "%";
+        qualityImg.SetSprite("MinggeNameBG" + (index + 1));
+        if (rate == nextRate)
+        {
+            arrowImg.SetActive(false);
+        }
+        else
+        {
+            arrowImg.SetActive(true);
+            arrowImg.SetSprite(rate > nextRate ? "FightPointDown" : "FightPointUP");
+        }
+
+    }
+
+
+}
+
diff --git a/Main/System/Mingge/MinggePrayRateCell.cs.meta b/Main/System/Mingge/MinggePrayRateCell.cs.meta
new file mode 100644
index 0000000..53ddcba
--- /dev/null
+++ b/Main/System/Mingge/MinggePrayRateCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 71422f21c99778c40b1975f8e35aa6e3
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Mingge/MinggePrayWin.cs b/Main/System/Mingge/MinggePrayWin.cs
new file mode 100644
index 0000000..7b57c1a
--- /dev/null
+++ b/Main/System/Mingge/MinggePrayWin.cs
@@ -0,0 +1,157 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+public class MinggePrayWin : UIBase
+{
+    [SerializeField] ItemCell itemCell;
+    [SerializeField] Text itemName;
+    [SerializeField] Text desce;
+    [SerializeField] Text qlValueText;
+    [SerializeField] MinggePrayRateCell[] prayRateCells;
+    [SerializeField] SliderPanel sliderPanel;
+    [SerializeField] Image itemIcon;
+    [SerializeField] Text countText;
+    [SerializeField] Button qlBtn;
+    [SerializeField] UIEffectPlayer qlEffect;
+
+    int useCnt = 1;
+
+    int qualityCnt;
+    int maxRateNum = 0;
+
+    protected override void InitComponent()
+    {
+        qlBtn.AddListener(QL);
+        var rateList = MGLingyingQualityConfig.Get(0).ItemColorWeightList;
+        qualityCnt = rateList.Length;
+        foreach (var rate in rateList)
+        {
+            maxRateNum += rate;
+        }
+    }
+
+    protected override void OnPreOpen()
+    {
+        MinggeManager.Instance.OnMinggeInfoUpdate += Display;
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        MinggeManager.Instance.OnMinggeInfoUpdate -= Display;
+    }
+    
+    public void Display()
+    {
+        var config = ItemConfig.Get(MinggeManager.Instance.qlItemID);
+        itemCell.Init(new ItemCellModel(MinggeManager.Instance.qlItemID, false, 0));
+        itemName.text = config.ItemName;
+        desce.text = config.Description;
+        var maxCnt = PackManager.Instance.GetItemCountByID(PackType.Item, MinggeManager.Instance.qlItemID);
+        useCnt = Math.Max(1, (int)maxCnt);
+        sliderPanel.Init((value) => { OnSliderChange(value); }, useCnt, useCnt);
+        DisplayPrayRate();
+        DisplayCostItem();
+    }
+
+
+    void DisplayPrayRate()
+    {
+        qlValueText.text = MinggeManager.Instance.m_Lingying.ToString();
+        var littleRateList = GetRate(MinggeManager.Instance.m_Lingying);
+        var bigRateList = GetRate(MinggeManager.Instance.m_Lingying + useCnt);
+
+        for (int i = 0; i < prayRateCells.Length; i++)
+        {
+            if (i < qualityCnt)
+            {
+                prayRateCells[i].SetActive(true);
+                prayRateCells[i].Display(i, bigRateList, littleRateList, maxRateNum);
+            }
+            else
+            {
+                prayRateCells[i].SetActive(false);
+            }
+        }
+    }
+
+    void DisplayCostItem()
+    {
+        itemIcon.SetItemSprite(MinggeManager.Instance.qlItemID);
+        countText.text = UIHelper.ShowUseItem(PackType.Item, MinggeManager.Instance.qlItemID, useCnt);
+    }
+
+    void OnSliderChange(int value)
+    {
+        useCnt = Math.Max(1, value);
+        DisplayPrayRate();
+        DisplayCostItem();
+    }
+
+    void QL()
+    {
+        if (useCnt == 0)
+        {
+            return;
+        }
+        if (!ItemLogicUtility.CheckItemCount(PackType.Item, MinggeManager.Instance.qlItemID, useCnt, 2))
+        {
+            return;
+        }
+
+        var pack = new CB253_tagCSMinggeQiling();
+        pack.UseCount = (uint)useCnt;
+
+        GameNetSystem.Instance.SendInfo(pack);
+        qlEffect.Play();
+    }
+
+
+    public List<int> GetRate(int value)
+    {
+        var keys = MGLingyingQualityConfig.GetKeys();
+        keys.Sort();
+
+        int littleValue = 0;
+        int bigValue = 0;
+        for (int i = 0; i < keys.Count; i++)
+        {
+            var key = keys[i];
+            if (value < key)
+            {
+                bigValue = key;
+                littleValue = keys[i - 1];
+                break;
+            }
+            else if (i == keys.Count - 1 && value >= key)
+            {
+                bigValue = key;
+                littleValue = key;
+            }
+        }
+
+        var littleRateList = MGLingyingQualityConfig.Get(littleValue).ItemColorWeightList;
+        if (littleValue == bigValue)
+        {
+            return littleRateList.ToList();
+        }
+        var bigRateList = MGLingyingQualityConfig.Get(bigValue).ItemColorWeightList;
+
+        //瀵规瘮涓嬩竴闃舵鐨勭伒搴斿�奸厤缃紝姣旇緝鍚屽搧璐ㄧ殑鏉冮噸宸�间笌涓や釜闃舵鐨勭伒搴斿樊鍊兼眰鍑烘瘡澧炲姞1鐐圭伒搴斿鏌愪釜鍝佽川鐨勬潈閲嶅彉鍖栧�硷紝鍙樺寲鍊煎彲鑳芥彁鍗囨垨鑰呴檷浣�
+
+        var rateList = new List<int>();
+
+        for (int i = 0; i < littleRateList.Length; i++)
+        {
+            var littleRateValue = littleRateList[i];
+            var bigRateValue = bigRateList[i];
+            var diffRate = littleRateValue + (bigRateValue - littleRateValue) / (bigValue - littleValue) * (value - littleValue);
+            rateList.Add(diffRate);
+        }
+        
+        return rateList;
+    }
+}
+
diff --git a/Main/System/Mingge/MinggePrayWin.cs.meta b/Main/System/Mingge/MinggePrayWin.cs.meta
new file mode 100644
index 0000000..86a6a21
--- /dev/null
+++ b/Main/System/Mingge/MinggePrayWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 35f6dd00232ff4447a857ee3d82bd456
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Mingge/MinggeSmallTipWin.cs b/Main/System/Mingge/MinggeSmallTipWin.cs
index 5c95be5..235c25b 100644
--- a/Main/System/Mingge/MinggeSmallTipWin.cs
+++ b/Main/System/Mingge/MinggeSmallTipWin.cs
@@ -1,29 +1,113 @@
 锘縰sing System;
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
 using UnityEngine;
 using UnityEngine.UI;
 public class MinggeSmallTipWin : UIBase
 {
-    [SerializeField] Text m_text;
-    protected override void InitComponent()
-    {
+    [SerializeField] RectTransform content;
+    [SerializeField] RectTransform arrow;
+    [SerializeField] MinggeItemCell itemCell;
+    [SerializeField] Text itemName;
+    [SerializeField] OutlineEx itemNameOutline;
+    [SerializeField] List<TextEx> fightAttrNames;
+    [SerializeField] List<TextEx> fightAttrValues;
+    [SerializeField] TextEx[] skillDesces;
 
-    }
 
     protected override void OnPreOpen()
     {
 
         Display();
-
     }
-
-    protected override void OnPreClose()
+    protected override void NextFrameAfterOpen()
     {
+        var worldPos = CameraManager.uiCamera.ScreenToWorldPoint(Input.mousePosition);
 
+
+        Vector2 screenAdjustedPos = CameraManager.uiCamera.WorldToScreenPoint(worldPos);
+
+        var beforePos = screenAdjustedPos;
+        var beforeAdjustedPos = CameraManager.uiCamera.ScreenToWorldPoint(beforePos);
+
+        var rectWidth = content.rect.width * Screen.width / canvasScaler.referenceResolution.x;
+        screenAdjustedPos.x = Mathf.Clamp(screenAdjustedPos.x, rectWidth * 0.5f, Screen.width - rectWidth * 0.5f);
+        screenAdjustedPos.y -= 40;
+        var adjustedPos = CameraManager.uiCamera.ScreenToWorldPoint(screenAdjustedPos);
+        adjustedPos.z = 0;
+        content.position = adjustedPos;
+
+        arrow.position = new Vector3(beforeAdjustedPos.x, arrow.position.y, 0);
     }
+    
 
-    void Display()
+    public void Display()
     {
+        var guid = ItemTipUtility.mainTipData.guid;
+        if (string.IsNullOrEmpty(guid))
+        {
+            DelayCloseWindow().Forget();
+            return;
+        }
+        var equip = PackManager.Instance.GetItemByGuid(guid);
+
+        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);
+
         
+
+        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 = "?";
+                fightAttrNames[i].colorType = TextColType.NavyGray;
+                fightAttrValues[i].text = Language.Get("Mingge27", MinggeManager.Instance.unlockAttrLVList[i - 1] - 1);
+                fightAttrValues[i].colorType = TextColType.NavyGray;
+            }
+            else
+            {
+                fightAttrNames[i].text = PlayerPropertyConfig.Get(fightAttrs[i]).Name;
+                fightAttrNames[i].colorType = TextColType.lightYellow;
+                fightAttrValues[i].text = PlayerPropertyConfig.GetValueDescription(fightAttrs[i], fightValues[i]);
+                fightAttrValues[i].colorType = TextColType.lightYellow;
+            }
+        }
+
+        //鎶�鑳芥弿杩� 鎵�鏈夋妧鑳藉叏鏄剧ず
+        var skillID = EquipModel.Instance.GetEquipSkillID(equip);
+        if (skillID == 0)
+        {
+            for (int i = 0; i < skillDesces.Length; i++)
+            {
+                skillDesces[i].SetActive(false);
+            }
+        }
+        else
+        {
+            var dict = MinggeManager.Instance.GetMinggeSkillTypeIDDict();
+            //濡傛灉鏄棫瑁呭 鏄剧ず褰撳墠鏁伴噺锛涙柊瑁呭涓嶅悓鎶�鑳芥暟閲�+1锛屽悓鎶�鑳戒笉鍙�
+            var hasCnt = dict[skillID].Count;
+            for (int i = 0; i < skillDesces.Length; i++)
+            {
+                skillDesces[i].SetActive(true);
+                skillDesces[i].colorType = i == hasCnt - 1 ? TextColType.lightYellow : TextColType.NavyGray;
+                var showCnt = Math.Min(hasCnt, i + 1);
+                skillDesces[i].text = SkillConfig.Get(skillID).Description + " " + Language.Get("HeroFates11", showCnt, i + 1);
+            }
+        }
     }
+
+
+
+
+
 }
 
diff --git a/Main/System/Mingge/MinggeWin.cs b/Main/System/Mingge/MinggeWin.cs
index b1fff9c..2f3da22 100644
--- a/Main/System/Mingge/MinggeWin.cs
+++ b/Main/System/Mingge/MinggeWin.cs
@@ -29,13 +29,14 @@
     [SerializeField] Image tyItemImg;
     [SerializeField] Text tyItemCntText;
 
-
+    FuncPresetChooseCells presetChooseCells;
     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);
+        presetChooseCells = presetObj.GetComponent<FuncPresetChooseCells>();
         seeAttrBtn.AddListener(() =>
         {
             AttributeManager.Instance.OpenTotalAttributeWin(MinggeManager.Instance.minggeAttrDict);
@@ -49,6 +50,10 @@
                 ClickSuite(index);
             });
         }
+        prayBtn.AddListener(()=>
+        {
+            UIManager.Instance.OpenWindow<MinggePrayWin>();
+        });
     }
 
     protected override void OnPreOpen()
@@ -58,6 +63,7 @@
         PackManager.Instance.DeleteItemEvent += DeleteDropItem;
         MinggeManager.Instance.OnMinggeInfoUpdate += OnMinggeInfoUpdate;
         UIManager.Instance.OnCloseWindow += OnCloseWindow;
+        FuncPresetManager.Instance.OnFuncPresetUseDataEvent += OnFuncPresetUseDataEvent;
         lastLV = MinggeManager.Instance.m_GanwuLV;
         lastExp = MinggeManager.Instance.m_GanwuExp;
         Display();
@@ -71,6 +77,7 @@
         PackManager.Instance.DeleteItemEvent -= DeleteDropItem;
         MinggeManager.Instance.OnMinggeInfoUpdate -= OnMinggeInfoUpdate;
         UIManager.Instance.OnCloseWindow -= OnCloseWindow;
+        FuncPresetManager.Instance.OnFuncPresetUseDataEvent -= OnFuncPresetUseDataEvent;
     }
 
     void OnCloseWindow(UIBase win)
@@ -85,6 +92,12 @@
         }
     }
 
+    void OnFuncPresetUseDataEvent()
+    {
+        MinggeManager.Instance.RefrehMinggeAttrs();
+        Display();
+    }
+
     void Display()
     {
         DisplayMGGanwu();
@@ -93,6 +106,7 @@
 
         DisplayCostItem();
         moneyMoveByPathCell.SetActive(false);
+        presetChooseCells.Display((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
     }
     void RefreshItemEvent(PackType type, int index, int itemID)
     {
@@ -185,7 +199,14 @@
 
     void SendTuiyan()
     {
-        MinggeManager.Instance.SendTY(1);
+        if (MinggeManager.Instance.CalcEquip())
+        {
+            return;
+        }
+        tyEffect.onComplete += () =>
+        {
+            MinggeManager.Instance.SendTY(1);
+        };
         tyEffect.Play();
     }
 
@@ -193,6 +214,7 @@
     void OnMinggeInfoUpdate()
     {
         DisplayMGGanwu();
+        presetChooseCells.Display((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
     }
 
     void DisplayMGGanwu()
diff --git a/Main/System/Tip/ConfirmCancel.cs b/Main/System/Tip/ConfirmCancel.cs
index 0b1541d..dfd4ad4 100644
--- a/Main/System/Tip/ConfirmCancel.cs
+++ b/Main/System/Tip/ConfirmCancel.cs
@@ -298,6 +298,7 @@
     }
 
 
+    //璐у竵纭妗�:鏈夋樉绀哄嬀閫夌殑 娑堣�楀厓瀹濆嬀閫夌被鍨�
     public static void MoneyIconToggleConfirmByType(ToggleCheckType type, int moneyCnt, int _moneyType, string fullTip, Action func)
     {
         if (toggleCheckDict.ContainsKey(type) && toggleCheckDict[type])
@@ -358,6 +359,7 @@
     WashCancel = 1, //娲楃粌鍙栨秷
     GoldRush = 2,   //娣橀噾 
     BoneField = 3,   //鐧介鐩堥噹
+    FuncPreset = 4, //鍔熻兘(娴佹淳)棰勮
 }
 
 

--
Gitblit v1.8.0