From 096703626e99ff6c9d8db9c3afd12c3ead1c6f8f Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 29 一月 2026 04:18:31 +0800
Subject: [PATCH] 422 子 【内政】命格系统 / 【内政】命格系统-客户端

---
 Main/System/Mingge/MinggeAutoSetCell.cs                 |   58 ++
 Main/System/KnapSack/PackManager.cs                     |    2 
 Main/System/InternalAffairs/AffairBaseWin.cs            |   25 +
 Main/System/Mingge/MinggeWin.cs                         |   51 ++
 Main/System/Mingge/MinggePrayWin.cs                     |   49 -
 Main/System/BoneField/AdsManager.cs                     |    2 
 Main/System/Mingge/MinggeAutoSetWin.cs                  |  530 ++++++++++++++++++++++
 Main/System/BeautyMM/BeautyMMTravelWin.cs               |   11 
 Main/System/PhantasmPavilion/PhantasmPavilionManager.cs |    2 
 Main/System/Main/MainWin.cs                             |    8 
 Main/System/Mingge/MinggeEquipWin.cs                    |   14 
 Main/System/Mingge/MinggeManager.cs                     |  617 +++++++++++++++++++++++++
 Main/System/Mingge/MinggeAutoSetWin.cs.meta             |   11 
 Main/System/Message/GMNotify.cs                         |    4 
 Main/System/Mingge/MinggeAutoSetCell.cs.meta            |   11 
 15 files changed, 1,329 insertions(+), 66 deletions(-)

diff --git a/Main/System/BeautyMM/BeautyMMTravelWin.cs b/Main/System/BeautyMM/BeautyMMTravelWin.cs
index aaf6dab..d7b6fb3 100644
--- a/Main/System/BeautyMM/BeautyMMTravelWin.cs
+++ b/Main/System/BeautyMM/BeautyMMTravelWin.cs
@@ -172,10 +172,21 @@
             {
                 continue;
             }
+            if (index >= rateNameText.Length)
+            {
+                break;
+            }
             rateNameText[index].text = ItemConfig.Get(config.AwardItemID).ItemName + "x" + config.AwardItemCnt;
             rateText[index].text = config.ShowRate;
             index++;
         }
+
+        for (int i = index; i < rateNameText.Length; i++)
+        {
+            rateNameText[i].text = "";
+            rateText[i].text = "";
+        }
+
         horseRateText.text = TravelEventConfig.Get(101).ShowRate;
     }
 
diff --git a/Main/System/BoneField/AdsManager.cs b/Main/System/BoneField/AdsManager.cs
index cdeecb9..1219506 100644
--- a/Main/System/BoneField/AdsManager.cs
+++ b/Main/System/BoneField/AdsManager.cs
@@ -29,7 +29,7 @@
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEvent;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= UpdateRedpoint;
-        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent;
+        DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChangeEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
     }
 
diff --git a/Main/System/InternalAffairs/AffairBaseWin.cs b/Main/System/InternalAffairs/AffairBaseWin.cs
index 70f9f57..e9d19ed 100644
--- a/Main/System/InternalAffairs/AffairBaseWin.cs
+++ b/Main/System/InternalAffairs/AffairBaseWin.cs
@@ -26,6 +26,7 @@
     [SerializeField] HeroSkinModel[] funcNPCs;
     [SerializeField] Transform[] talkRects;
     [SerializeField] Text[] talkTexts;
+    [SerializeField] UIEffectPlayer autoMGEffect;
 
     protected override void InitComponent()
     {
@@ -58,12 +59,14 @@
         GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
         PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent;
         GlobalTimeEvent.Instance.fiveSecondEvent += OnFiveSecondEvent;
+        MinggeManager.Instance.ChangeAutoEvent += ChangeAutoEvent;
         
         Display();
         if (GoldRushManager.Instance.openAutoGoldRush)
-        { 
+        {
             GoldRushManager.Instance.GetAllAward();
         }
+        ChangeAutoEvent();
     }
 
     protected override void OnPreClose()
@@ -73,8 +76,28 @@
         GlobalTimeEvent.Instance.secondEvent -= OnSecondEvent;
         PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent;
         GlobalTimeEvent.Instance.fiveSecondEvent -= OnFiveSecondEvent;
+        MinggeManager.Instance.ChangeAutoEvent -= ChangeAutoEvent;
     }
 
+    void ChangeAutoEvent()
+    {
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mingge))
+        {
+            return;
+        }
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            autoMGEffect.Play();
+            funcNPCs[5].GetModel().PlayAnimation("suanming", true);
+        }
+        else
+        {
+            autoMGEffect.Stop();
+            funcNPCs[5].GetModel().PlayAnimation("idle", true);
+        }
+    }
+
+
     protected override void OnOpen()
     {
         GoldRushManager.Instance.ResumeAutoWorking();
diff --git a/Main/System/KnapSack/PackManager.cs b/Main/System/KnapSack/PackManager.cs
index f9dc130..f7af21d 100644
--- a/Main/System/KnapSack/PackManager.cs
+++ b/Main/System/KnapSack/PackManager.cs
@@ -182,6 +182,8 @@
         {
             refrechPackEvent(packType);
         }
+
+        RefreshItemEvent?.Invoke(packType, -1, -1); //鍙仛涓�娆¢�氱煡鐢�
         
         DelayNotifyPackChange(packType);
     }
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index 27c94bb..130b27a 100644
--- a/Main/System/Main/MainWin.cs
+++ b/Main/System/Main/MainWin.cs
@@ -32,6 +32,7 @@
     [SerializeField] Text multiFightText;
 
     [SerializeField] Transform gameTip; //10杩�
+    [SerializeField] Transform mgTip;
 
     bool isForcePlayFightUIAnim = true; //寮哄埗鎾斁鎴樻枟閿ゅ瓙妗嗗姩鐢�
 
@@ -69,6 +70,7 @@
         EventBroadcast.Instance.AddListener<string>(EventName.BATTLE_START, OnBattleStart);
         base.OnPreOpen();
 
+        mgTip.SetActive(false);
         // 鍒锋柊UI
         Display();
     }
@@ -107,6 +109,8 @@
                 GlobalTimeEvent.Instance.fiveSecondEvent -= OnFiveSecondEvent;
             }
         }
+        
+        mgTip.SetActive(MinggeManager.Instance.isPauseAuto);
     }
 
     void DisplayTopBar()
@@ -120,6 +124,10 @@
         {
             multiFightText.text = Language.Get("MultiFight", AutoFightModel.Instance.fightCost);
         }
+        if (_ui.name == "MinggeWin")
+        {
+            mgTip.SetActive(false);
+        }
     }
 
     //鎴樻枟鎸夐挳鍔ㄧ敾
diff --git a/Main/System/Message/GMNotify.cs b/Main/System/Message/GMNotify.cs
index e541c2e..05d82d6 100644
--- a/Main/System/Message/GMNotify.cs
+++ b/Main/System/Message/GMNotify.cs
@@ -15,8 +15,8 @@
     public override void Release()
     {
         GlobalTimeEvent.Instance.secondEvent -= SecondEvent;
-        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeEventOnRelogin;
-        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeEventOnRelogin;
+        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
     }
 
     public void OnBeforePlayerDataInitializeEventOnRelogin()
diff --git a/Main/System/Mingge/MinggeAutoSetCell.cs b/Main/System/Mingge/MinggeAutoSetCell.cs
new file mode 100644
index 0000000..2e2d3d9
--- /dev/null
+++ b/Main/System/Mingge/MinggeAutoSetCell.cs
@@ -0,0 +1,58 @@
+锘縰sing UnityEngine;
+using UnityEngine.UI;
+using System;
+
+
+//鍛芥牸鑷姩鐨勫悇涓�夐」鍐呭锛岀粺涓�鐢ㄤ竴涓寜绫诲瀷鍖哄垎
+public class MinggeAutoSetCell : CellView
+{
+    [SerializeField] Text contentText;
+    [SerializeField] Image selectImg;
+    [SerializeField] Button selectBtn;
+
+    //type 婊氬姩鏉$敤閫旂被鍨�
+    //index 鏍规嵁绫诲瀷鑷畾涔�
+    public void Display(int type, int index, MinggeAutoSet autoSet, Action<int> onSelect)
+    {
+        if (type == 1)
+        {
+            //鍝佽川
+            string qualityName = Language.Get("L1039", MGGuayuQualityConfig.Get(index).ColorName);
+            contentText.text = Language.Get("Mingge30", UIHelper.AppendColor(index, qualityName, true, 2));
+            selectImg.SetActive(autoSet.quanlity == index);
+        }
+        else if (type == 2)
+        {
+            //鎴樻枟灞炴��
+            contentText.text = index == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(index).Name;
+            selectImg.SetActive(autoSet.fightAttrID == index);
+        }
+        else if (type == 3)
+        {
+            //鎶楁�у睘鎬�
+            contentText.text = index == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(index).Name;
+            selectImg.SetActive(autoSet.deFightAttrID == index);
+        }
+        else if (type == 4)
+        {
+            //鍛芥牸鎶�鑳�
+            contentText.text = index == 0 ? Language.Get("Mingge33") : Language.Get($"MinggeSkillType_{index}");
+            selectImg.SetActive(autoSet.skillID == index);
+        }
+        else if (type == 5)
+        {
+            //娑堣�楁暟閲�
+            contentText.text = index.ToString();
+            selectImg.SetActive(MinggeManager.Instance.autoCostCount == index);
+        }
+
+        selectBtn.AddListener(() =>
+        {
+            onSelect?.Invoke(index);
+        });
+    }
+
+
+
+}
+
diff --git a/Main/System/Mingge/MinggeAutoSetCell.cs.meta b/Main/System/Mingge/MinggeAutoSetCell.cs.meta
new file mode 100644
index 0000000..fe6b193
--- /dev/null
+++ b/Main/System/Mingge/MinggeAutoSetCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 77c0bb1754a43d14985f5b7a2942530e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Mingge/MinggeAutoSetWin.cs b/Main/System/Mingge/MinggeAutoSetWin.cs
new file mode 100644
index 0000000..5c23717
--- /dev/null
+++ b/Main/System/Mingge/MinggeAutoSetWin.cs
@@ -0,0 +1,530 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+public class MinggeAutoSetWin : UIBase
+{
+    [SerializeField] ScrollRect scrollRect;
+    [SerializeField] GroupButtonEx[] presetBtns;
+    List<Text> presetNameTexts = new List<Text>();
+    [SerializeField] Button selectQualityBtn;   //鍝佽川閫夋嫨
+    [SerializeField] Text qualityText;
+    [SerializeField] ScrollerController qualityScroller;
+    [SerializeField] Toggle startToggle;
+    [SerializeField] Toggle fightPowerToggle;   //鎴樻枟鍔�
+    [SerializeField] Toggle andFPToggle;
+    [SerializeField] Toggle orFPToggle;
+    [SerializeField] Toggle attrToggle;  //灞炴��
+    [SerializeField] Button fightAttrBtn;   //鍏ぇ鎴樻枟灞炴�� + 鍏堟墜
+    [SerializeField] Text fightAttrText;
+    [SerializeField] ScrollerController fightAttrScroller;
+    [SerializeField] Button deFightAttrBtn;   //鍏ぇ鎴樻枟鎶楁�у睘鎬�
+    [SerializeField] Text deFightAttrText;
+    [SerializeField] ScrollerController deFightAttrScroller;
+    [SerializeField] Toggle skillToggle;   //鎶�鑳�
+    [SerializeField] Button skillBtn;
+    [SerializeField] Text skillText;
+    [SerializeField] ScrollerController skillScroller;
+    [SerializeField] Toggle andSkillToggle;
+    [SerializeField] Toggle orSkillToggle;
+    [SerializeField] Toggle useMoreItemToggle;   //浣跨敤鏇村鐗╁搧 涓嶅嬀閫夐粯璁ゆ秷鑰�1涓�
+    [SerializeField] Button useMoreItemBtn;
+    [SerializeField] Text useMoreItemText;
+    [SerializeField] ScrollerController useMoreItemScroller;
+    [SerializeField] Text itemNameText;
+    [SerializeField] Toggle speedUPToggle;   //鍔犻�� 鐗规晥鎾斁鍔犻��
+    [SerializeField] Button startBtn;
+    [SerializeField] Button cancelBtn;
+
+    MinggeAutoSet autoSetData;
+    int selectPresetID = 0;
+
+    protected override void InitComponent()
+    {
+        presetNameTexts.Clear();
+        for (int i = 0; i < presetBtns.Length; i++)
+        {
+            int index = i + 1;
+            presetBtns[i].AddListener(() =>
+            {
+                selectPresetID = index;
+                Display();
+            });
+            presetNameTexts.Add(presetBtns[i].GetComponentInChildren<Text>());
+        }
+        selectQualityBtn.AddListener(() =>
+        {
+            qualityScroller.SetActive(true);
+        });
+        startToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickStartToggle(isOn);
+        });
+        fightPowerToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            autoSetData.fightPowerToggle = isOn;
+            FixAndOrFBToggle();
+            FixAndOrSkillToggle();
+        });
+
+        andFPToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickAndOrFPToggle(isOn);
+        });
+        orFPToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickAndOrFPToggle(isOn);
+        });
+
+        attrToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            autoSetData.fightAttrToggle = isOn;
+            FixAndOrFBToggle();
+            FixAndOrSkillToggle();
+        });
+
+        fightAttrBtn.AddListener(() =>
+        {
+            fightAttrScroller.SetActive(true);
+        });
+        deFightAttrBtn.AddListener(() =>
+        {
+            deFightAttrScroller.SetActive(true);
+        });
+
+        skillToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            autoSetData.skillToggle = isOn;
+            FixAndOrFBToggle();
+            FixAndOrSkillToggle();
+        });
+
+        skillBtn.AddListener(() =>
+        {
+            skillScroller.SetActive(true);
+        });
+        andSkillToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickAndOrSkillToggle(isOn);
+        });
+        orSkillToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            ClickAndOrSkillToggle(isOn);
+        });
+        useMoreItemToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            MinggeManager.Instance.autoCostToggle = isOn;
+        });
+        useMoreItemBtn.AddListener(() =>
+        {
+            useMoreItemScroller.SetActive(true);
+        });
+        speedUPToggle.onValueChanged.AddListener((bool isOn) =>
+        {
+            if (!InvestModel.Instance.IsInvested(InvestModel.monthCardType))
+            {
+                speedUPToggle.SetIsOnWithoutNotify(false);
+                SysNotifyMgr.Instance.ShowTip("MinggeAuto5");
+                UIManager.Instance.OpenWindow<PrivilegeCardWin>();
+                return;
+            }
+            MinggeManager.Instance.autoSpeedUP = isOn;
+        });
+        startBtn.AddListener(() =>
+        {
+            if (!MinggeManager.Instance.qlNotNotify && PackManager.Instance.GetItemCountByID(PackType.Item, MinggeManager.Instance.qlItemID) > 0)
+            {
+                ConfirmCancel.ToggleConfirmCancel(
+                    Language.Get("L1003"),
+                    Language.Get("Mingge31"),
+                    Language.Get("TianziBillborad08"),
+                    Language.Get("Mingge35"),
+                    Language.Get("Mingge34"),
+                    (bool isOK, bool isToggle) =>
+                    {
+                        if (isOK)
+                        {
+                            CloseWindow();
+                            UIManager.Instance.OpenWindow<MinggePrayWin>();
+                        }
+                        else
+                        {
+                            MinggeManager.Instance.StartAuto(true);
+                        }
+
+                        MinggeManager.Instance.qlNotNotify = isToggle;
+                    },
+                    false
+                );
+                return;
+            }
+
+            MinggeManager.Instance.StartAuto(true);
+        });
+        cancelBtn.AddListener(() =>
+        {
+            MinggeManager.Instance.StartAuto(false);
+            cancelBtn.SetActive(false);
+            startBtn.SetActive(true);
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        selectPresetID = FuncPresetManager.Instance.GetFuncPresetID((int)FuncPresetType.Mingge);
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            MinggeManager.Instance.isPauseAuto = true;
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto4");
+        }
+
+        qualityScroller.OnRefreshCell += OnRefreshQualityCell;
+        fightAttrScroller.OnRefreshCell += OnRefreshFightAttrCell;
+        deFightAttrScroller.OnRefreshCell += OnRefreshDeFightAttrCell;
+        skillScroller.OnRefreshCell += OnRefreshSkillCell;
+        useMoreItemScroller.OnRefreshCell += OnRefreshUseMoreItemCell;
+
+
+        CreateScroller();
+        DisplayPresetBtns();
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        MinggeManager.Instance.isPauseAuto = false;
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto3");
+            MinggeManager.Instance.CalcEquip();
+        }
+
+        qualityScroller.OnRefreshCell -= OnRefreshQualityCell;
+        fightAttrScroller.OnRefreshCell -= OnRefreshFightAttrCell;
+        deFightAttrScroller.OnRefreshCell -= OnRefreshDeFightAttrCell;
+        skillScroller.OnRefreshCell -= OnRefreshSkillCell;
+        useMoreItemScroller.OnRefreshCell -= OnRefreshUseMoreItemCell;
+    }
+
+    public void Display()
+    {
+        autoSetData = MinggeManager.Instance.GetMGAutoSet(selectPresetID);
+        if (autoSetData == null)
+        {
+            return;
+        }
+        string qualityName = Language.Get("L1039", MGGuayuQualityConfig.Get(autoSetData.quanlity).ColorName);
+        qualityText.text = Language.Get("Mingge30", UIHelper.AppendColor(autoSetData.quanlity, qualityName, true, 2));
+
+        startToggle.SetIsOnWithoutNotify(autoSetData.startToggle);
+        fightPowerToggle.SetIsOnWithoutNotify(autoSetData.fightPowerToggle);
+        andFPToggle.SetIsOnWithoutNotify(autoSetData.andOrFPToggle == 1);
+        orFPToggle.SetIsOnWithoutNotify(autoSetData.andOrFPToggle == 2);
+        attrToggle.SetIsOnWithoutNotify(autoSetData.fightAttrToggle);
+
+        fightAttrText.text = autoSetData.fightAttrID == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(autoSetData.fightAttrID).Name;
+        deFightAttrText.text = autoSetData.deFightAttrID == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(autoSetData.deFightAttrID).Name;
+
+        skillToggle.SetIsOnWithoutNotify(autoSetData.skillToggle);
+        skillText.text = autoSetData.skillID == 0 ? Language.Get("Mingge33") : Language.Get($"MinggeSkillType_{autoSetData.skillID}");
+        andSkillToggle.SetIsOnWithoutNotify(autoSetData.andOrSkillToggle == 1);
+        orSkillToggle.SetIsOnWithoutNotify(autoSetData.andOrSkillToggle == 2);
+
+        useMoreItemToggle.SetIsOnWithoutNotify(MinggeManager.Instance.autoCostToggle);
+        useMoreItemText.text = MinggeManager.Instance.autoCostCount.ToString();
+
+        itemNameText.text = ItemConfig.Get(MinggeManager.Instance.tyItemID).ItemName;
+        cancelBtn.SetActive(MinggeManager.Instance.isStartAuto);
+        startBtn.SetActive(!MinggeManager.Instance.isStartAuto);
+    }
+
+    public void DisplayPresetBtns()
+    {
+        var cnt = FuncPresetManager.Instance.GetUnlockCnt((int)FuncPresetType.Mingge);
+        if (cnt == 1)
+        {
+            cnt = 0;
+        }
+        if (cnt > 0)
+        {
+            scrollRect.SetActive(true);
+            for (int i = 0; i < presetBtns.Length; i++)
+            {
+                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();
+            //婊氬姩鍒� selectPresetID 浣嶇疆
+            scrollRect.horizontalNormalizedPosition = selectPresetID < 4 ? 0 : selectPresetID * 1f / cnt;
+        }
+        else
+        {
+            scrollRect.SetActive(false);
+        }
+    }
+
+
+    void ClickStartToggle(bool isOn)
+    {
+        autoSetData.startToggle = isOn;
+        if (!isOn)
+        {
+            //妫�鏌ュ鏂规涓嚦灏戜竴涓嬀閫�
+            if (!MinggeManager.Instance.CanChangeStartToFalse(selectPresetID))
+            {
+                startToggle.SetIsOnWithoutNotify(true);
+                autoSetData.startToggle = true;
+                SysNotifyMgr.Instance.ShowTip("MinggeAuto2");
+            }
+        }
+
+    }
+
+    void ClickAndOrFPToggle(bool isOn)
+    {
+        //鍙湁鎴樻枟鍜屽叾浠栫殑婵�娲诲悗鎵嶈兘 鍕鹃��
+        FixAndOrFBToggle();
+
+        
+    }
+
+    void ClickAndOrSkillToggle(bool isOn)
+    {
+        //鎶�鑳藉拰鍏朵粬浠讳竴婵�娲诲悗鎵嶈兘 鍕鹃��
+        FixAndOrSkillToggle();
+
+        
+    }
+
+    void FixAndOrFBToggle()
+    {
+        //鍙湁鎴樻枟鍜屽睘鎬ф縺娲诲悗鎵嶈兘 鍕鹃��
+
+        //甯彇娑堢殑鎯呭喌
+        if (!fightPowerToggle.isOn || !attrToggle.isOn)
+        {
+            if (andFPToggle.isOn)
+            {
+                andFPToggle.SetIsOnWithoutNotify(false);
+                
+            }
+
+            if (orFPToggle.isOn)
+            {
+                orFPToggle.SetIsOnWithoutNotify(false);
+            }
+        }
+
+        //甯嬀閫夌殑鎯呭喌锛岄粯璁ゅ嬀鍚屾椂
+        if (fightPowerToggle.isOn && attrToggle.isOn)
+        {
+            if (!andFPToggle.isOn && !orFPToggle.isOn)
+            {
+                andFPToggle.SetIsOnWithoutNotify(true);
+            }
+        }
+
+        RefreshAndOrFBToggleValue();
+    }
+
+    void FixAndOrSkillToggle()
+    {
+        //鎶�鑳藉拰鍏朵粬浠讳竴婵�娲诲悗鎵嶈兘 鍕鹃��
+
+        //甯彇娑堢殑鎯呭喌
+        if (!skillToggle.isOn || (!attrToggle.isOn && !fightPowerToggle.isOn))
+        {
+            if (andSkillToggle.isOn)
+            {
+                andSkillToggle.SetIsOnWithoutNotify(false);
+            }
+
+            if (orSkillToggle.isOn)
+            {
+                orSkillToggle.SetIsOnWithoutNotify(false);
+            }
+        }
+
+        //甯嬀閫夌殑鎯呭喌锛岄粯璁ゅ嬀鍚屾椂
+        if (skillToggle.isOn && (attrToggle.isOn || fightPowerToggle.isOn))
+        {
+            if (!andSkillToggle.isOn && !orSkillToggle.isOn)
+            {
+                orSkillToggle.SetIsOnWithoutNotify(true);
+            }
+        }
+
+        RefreshAndOrSkillToggleValue();
+    }
+
+
+    void RefreshAndOrFBToggleValue()
+    {
+        if (andFPToggle.isOn)
+        {
+            autoSetData.andOrFPToggle = 1;
+        }
+        else if (orFPToggle.isOn)
+        {
+            autoSetData.andOrFPToggle = 2;
+        }
+        else
+        {
+            autoSetData.andOrFPToggle = 0;
+        }
+    }
+    
+    void RefreshAndOrSkillToggleValue()
+    {
+        if (andSkillToggle.isOn)
+        {
+            autoSetData.andOrSkillToggle = 1;
+        }
+        else if (orSkillToggle.isOn)
+        {
+            autoSetData.andOrSkillToggle = 2;
+        }
+        else
+        {
+            autoSetData.andOrSkillToggle = 0;
+        }
+    }
+
+
+    void CreateScroller()
+    {
+        var rateList = MinggeManager.Instance.GetQLRate(MinggeManager.Instance.m_Lingying);
+        //鍊掑簭鍒犻櫎 姒傜巼涓�0鐨� 鐩村埌鏈夋鐜囧ぇ浜�0鐨�
+        for (int i = rateList.Count - 1; i >= 0; i--)
+        {
+            if (rateList[i] == 0)
+            {
+                rateList.RemoveAt(i);
+            }
+            else
+            {
+                break;
+            }
+        }
+        var rect = qualityScroller.GetComponent<RectTransform>();
+        rect.sizeDelta = new Vector2(rect.sizeDelta.x, rateList.Count * 50);
+        qualityScroller.Refresh();
+        for (int i = 1; i <= rateList.Count; i++)
+        {
+            qualityScroller.AddCell(ScrollerDataType.Header, i);
+        }
+        qualityScroller.Restart();
+
+        fightAttrScroller.Refresh();
+        for (int i = 0; i < MinggeManager.Instance.fightAttrIDList.Length; i++)
+        {
+            fightAttrScroller.AddCell(ScrollerDataType.Header, MinggeManager.Instance.fightAttrIDList[i]);
+        }
+        fightAttrScroller.Restart();
+
+        deFightAttrScroller.Refresh();
+        for (int i = 0; i < MinggeManager.Instance.deFightAttrIDList.Length; i++)
+        {
+            deFightAttrScroller.AddCell(ScrollerDataType.Header, MinggeManager.Instance.deFightAttrIDList[i]);
+        }
+        deFightAttrScroller.Restart();
+
+        skillScroller.Refresh();
+        //鐗规畩澶勭悊 闇�瑕佸姞涓婄涓�涓换鎰�
+        for (int i = 0; i <= MinggeManager.Instance.minggeSkillTypeIDList.Length; i++)
+        {
+            if (i == 0)
+            {
+                skillScroller.AddCell(ScrollerDataType.Header, 0);
+            }
+            else
+            {
+                skillScroller.AddCell(ScrollerDataType.Header, MinggeManager.Instance.minggeSkillTypeIDList[i - 1]);
+            }
+        }
+        skillScroller.Restart();
+
+        useMoreItemScroller.Refresh();
+        for (int i = 0; i < MinggeManager.Instance.autoCostCntList.Length; i++)
+        {
+            useMoreItemScroller.AddCell(ScrollerDataType.Header, MinggeManager.Instance.autoCostCntList[i]);
+        }
+        useMoreItemScroller.Restart();
+    }
+
+
+    void OnRefreshQualityCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(1, cell.index, autoSetData, (value) =>
+        {
+            qualityScroller.SetActive(false);
+            autoSetData.quanlity = value;
+            string qualityName = Language.Get("L1039", MGGuayuQualityConfig.Get(autoSetData.quanlity).ColorName);
+            qualityText.text = Language.Get("Mingge30", UIHelper.AppendColor(autoSetData.quanlity, qualityName, true, 2));
+        });
+    }
+
+
+    void OnRefreshFightAttrCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(2, cell.index, autoSetData, (value) =>
+        {
+            fightAttrScroller.SetActive(false);
+            autoSetData.fightAttrID = value;
+            fightAttrText.text = autoSetData.fightAttrID == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(autoSetData.fightAttrID).Name;
+
+        });
+    }
+
+
+    void OnRefreshDeFightAttrCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(3, cell.index, autoSetData, (value) =>
+        {
+            deFightAttrScroller.SetActive(false);
+            autoSetData.deFightAttrID = value;
+            deFightAttrText.text = autoSetData.deFightAttrID == 0 ? Language.Get("Mingge33") : PlayerPropertyConfig.Get(autoSetData.deFightAttrID).Name;
+
+        });
+    }
+
+    void OnRefreshSkillCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(4, cell.index, autoSetData, (value) =>
+        {
+            skillScroller.SetActive(false);
+            autoSetData.skillID = value;
+            skillText.text = autoSetData.skillID == 0 ? Language.Get("Mingge33") : Language.Get($"MinggeSkillType_{autoSetData.skillID}");
+
+        });
+    }
+
+    void OnRefreshUseMoreItemCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as MinggeAutoSetCell;
+        _cell.Display(5, cell.index, autoSetData, (value) =>
+        {
+            useMoreItemScroller.SetActive(false);
+            MinggeManager.Instance.autoCostCount = value;
+            useMoreItemText.text = MinggeManager.Instance.autoCostCount.ToString();
+        });
+    }
+
+
+
+}
+
diff --git a/Main/System/Mingge/MinggeAutoSetWin.cs.meta b/Main/System/Mingge/MinggeAutoSetWin.cs.meta
new file mode 100644
index 0000000..2b6b90a
--- /dev/null
+++ b/Main/System/Mingge/MinggeAutoSetWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cb3d1b698a5646743b6cab34a223e267
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Mingge/MinggeEquipWin.cs b/Main/System/Mingge/MinggeEquipWin.cs
index efd76e7..f6b84f4 100644
--- a/Main/System/Mingge/MinggeEquipWin.cs
+++ b/Main/System/Mingge/MinggeEquipWin.cs
@@ -7,7 +7,6 @@
 {
     [SerializeField] MinggeEquipChangeCell oldEquipCell;
     [SerializeField] MinggeEquipChangeCell newEquipCell;
-    [SerializeField] Transform presetObj;
     [SerializeField] ScrollRect scrollRect;
     [SerializeField] GroupButtonEx[] presetBtns;
     List<Text> presetNameTexts = new List<Text>();
@@ -41,6 +40,15 @@
     protected override void OnPreClose()
     {
         PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
+        MinggeManager.Instance.equipShowPresetID = 0;
+        MinggeManager.Instance.selectFloorEquip = null;
+
+        if (!UIManager.Instance.IsOpened<MinggeAutoSetWin>())
+        {
+            MinggeManager.Instance.isPauseAuto = false;
+        }
+        MinggeManager.Instance.redpointAuto.state = RedPointState.None;
+
     }
 
     void RefreshItemEvent(PackType packType, int index, int itemID)
@@ -61,7 +69,7 @@
         }
         if (cnt > 0)
         {
-            presetObj.SetActive(true);
+            scrollRect.SetActive(true);
             for (int i = 0; i < presetBtns.Length; i++)
             {
                 if (i < cnt)
@@ -80,7 +88,7 @@
         }
         else
         {
-            presetObj.SetActive(false);
+            scrollRect.SetActive(false);
         }
         if (MinggeManager.Instance.selectFloorEquip == null || MinggeManager.Instance.selectFloorEquip.config == null)
         {
diff --git a/Main/System/Mingge/MinggeManager.cs b/Main/System/Mingge/MinggeManager.cs
index 3cc689d..293ab54 100644
--- a/Main/System/Mingge/MinggeManager.cs
+++ b/Main/System/Mingge/MinggeManager.cs
@@ -2,6 +2,7 @@
 using UnityEngine;
 using LitJson;
 using System;
+using System.Linq;
 
 
 public class MinggeManager : GameSystemManager<MinggeManager>
@@ -20,11 +21,8 @@
     public Dictionary<int, long> minggeAttrDict = new Dictionary<int, long>();
 
 
-    //鑷姩璁剧疆
-    public int autoCostCnt; //鑷姩鎺ㄦ紨娑堣�椾釜鏁�
-    public bool isOpenAuto;
-    
 
+    public bool qlNotNotify;
 
     //閰嶇疆
     public const int TotleEquip = 12; //涓�濂楄澶囩殑鎬绘暟
@@ -39,21 +37,25 @@
 
     public override void Init()
     {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += OnBeforePlayerDataInitializeRelogin;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
         PackManager.Instance.RefreshItemEvent += RefreshItemEvent;
         DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent += OnEquipResult;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOK;
         FuncPresetManager.Instance.OnFuncPresetUseDataEvent += OnFuncPresetUseDataEvent;
+        GlobalTimeEvent.Instance.MSEvent += OnMSEvent;
         ParseConfig();
     }
 
     public override void Release()
     {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin -= OnBeforePlayerDataInitializeRelogin;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
         PackManager.Instance.RefreshItemEvent -= RefreshItemEvent;
         DTCA814_tagMCMakeItemAnswer.MakeItemAnswerEvent -= OnEquipResult;
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOK;
         FuncPresetManager.Instance.OnFuncPresetUseDataEvent -= OnFuncPresetUseDataEvent;
+        GlobalTimeEvent.Instance.MSEvent -= OnMSEvent;
     }
 
 
@@ -69,6 +71,13 @@
         minggeItemTypeList = JsonMapper.ToObject<int[]>(config.Numerical4);
         minggeSkillTypeIDList = JsonMapper.ToObject<int[]>(config.Numerical5);
 
+        config = FuncConfigConfig.Get("MinggeTY2");
+        fightAttrIDList = JsonMapper.ToObject<int[]>(config.Numerical1);
+        deFightAttrIDList = JsonMapper.ToObject<int[]>(config.Numerical2);
+        autoCostCntList = JsonMapper.ToObject<int[]>(config.Numerical3);
+        autoTYCDs = JsonMapper.ToObject<float[]>(config.Numerical4);
+        needOfficialRank = int.Parse(config.Numerical5);
+
         for (int i = 0; i < minggeItemTypeList.Length; i++)
         {
             minggeSkillEquipPlaceList.Add(MGGuayuTypeConfig.Get(minggeItemTypeList[i]).EquipPlace);
@@ -77,17 +86,26 @@
 
     }
 
-    private void OnBeforePlayerDataInitialize()
+    private void OnBeforePlayerDataInitializeRelogin()
     {
         m_GanwuLV = 1;
         m_GanwuExp = 0;
         m_Lingying = 0;
+        isStartAuto = false;
+        isPauseAuto = false;
+        qlNotNotify = false;
+    }
+
+    private void OnBeforePlayerDataInitialize()
+    {
         waitTYOPPack = false;
     }
 
     void OnPlayerLoginOK()
     {
+        InitAutoSet();
         UpdateRedPoint();
+        redpointAuto.state = RedPointState.None; 
     }
 
     private void OnEquipResult(HA814_tagMCMakeItemAnswer info)
@@ -96,7 +114,7 @@
             return;
 
         OnOPCallbackEvent?.Invoke(0);
-        
+
     }
 
     void RefreshItemEvent(PackType type, int index, int itemID)
@@ -141,7 +159,7 @@
 
     public void UpdateMinggeInfo(HB132_tagSCMinggeInfo netPack)
     {
-        var beforeLV= m_GanwuLV;
+        var beforeLV = m_GanwuLV;
         m_GanwuLV = netPack.GanwuLV;
         m_GanwuExp = (int)netPack.GanwuExp;
         m_Lingying = (int)netPack.Lingying;
@@ -220,10 +238,23 @@
         }
 
         //鑷姩澶勭悊锛� 鍒ゆ柇鍒嗚В 鍜屾垬鍔涢珮浣� 鍜屽喅瀹氭槸鍝釜鏂规涓嬬殑瑁呭瀵规瘮
+        int autoPreseetID;
+        if (!AutoCalcMG(equip, out autoPreseetID))
+        {
+            return false;
+        }
 
+        
 
         //闈炶嚜鍔ㄦ儏鍐典笅锛岄粯璁ゅ綋鍓嶆柟妗�
-        equipShowPresetID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
+        if (autoPreseetID == 0)
+        {
+            equipShowPresetID = FuncPresetManager.Instance.GetFuncPresetIDByBattleType((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
+        }
+        else
+        {
+            equipShowPresetID = autoPreseetID;
+        }
         selectFloorEquip = equip;
         if (UIManager.Instance.IsOpened<MinggeWin>())
         {
@@ -236,6 +267,12 @@
             {
                 UIManager.Instance.OpenWindow<MinggeEquipWin>();
             }
+        }
+        else
+        {
+            //鎵撳紑鐣岄潰 涓斿閮ㄦ彁閱掓湁闇�瑕佸鐞嗙殑瑁呭锛屽湪鍏抽棴鐣岄潰鐨勬椂鍊欏垽鏂噸缃爣璇�
+            isPauseAuto = true;
+            redpointAuto.state = RedPointState.Simple;
         }
         return true;
 
@@ -270,6 +307,22 @@
         var pack = new CB250_tagCSMinggeTuiyan();
         pack.Count = (byte)count;
         GameNetSystem.Instance.SendInfo(pack);
+        if (isStartAuto && UIManager.Instance.IsOpened<MinggeWin>())
+        {
+            //鏄剧ず鐗规晥
+            var ui = UIManager.Instance.GetUI<MinggeWin>();
+            ui.tyEffect.onComplete = null;
+            ui.tyEffect.Play();
+            if (autoSpeedUP)
+            {
+                ui.tyEffect.speedRate = autoTYCDs[0] / autoTYCDs[1];
+            }
+            else
+            {
+                ui.tyEffect.speedRate = 1;
+            }
+
+        }
     }
 
     public void SendChangeMingge(int selectMinggePresetID, int dropIndex, bool autodec)
@@ -325,7 +378,50 @@
 
     }
 
+    public List<int> GetQLRate(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) / (float)(bigValue - littleValue) * (value - littleValue);
+            rateList.Add((int)diffRate);
+        }
+        
+        return rateList;
+    }
 
 
     #region 绾㈢偣
@@ -333,7 +429,7 @@
     Redpoint redpointMG = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 1);
     Redpoint redpointPray = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 2);
     Redpoint redpointPreset = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 3);
-    
+    public Redpoint redpointAuto = new Redpoint(MainRedDot.RedPoint_Mingge, MainRedDot.RedPoint_Mingge * 10 + 4);
     void UpdateRedPoint()
     {
 
@@ -344,7 +440,7 @@
         {
             return;
         }
-        if (PackManager.Instance.GetItemCountByID(PackType.Item, tyItemID) > 0)
+        if (PackManager.Instance.GetItemCountByID(PackType.Item, tyItemID) > 0 && !isStartAuto)
         {
             redpointMG.state = RedPointState.Simple;
         }
@@ -360,4 +456,505 @@
     }
 
     #endregion
+
+
+    #region 鑷姩璁剧疆
+
+    public int[] fightAttrIDList;
+    public int[] deFightAttrIDList;
+    public int[] autoCostCntList;
+    public float[] autoTYCDs;    //绉�
+    public float autoTYTime;
+    public int needOfficialRank;
+
+    //鍏叡閮ㄥ垎
+    public bool autoCostToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGCost_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGCost_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int autoCostCount
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGCostCnt_{PlayerDatas.Instance.baseData.PlayerID}", 1);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGCostCnt_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public bool autoSpeedUP
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGSpeedUP_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGSpeedUP_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+
+
+    public event Action ChangeAutoEvent;
+
+    bool m_IsStartAuto;
+    //鏄惁寮�鍚嚜鍔�
+    public bool isStartAuto
+    {
+        get
+        {
+            return m_IsStartAuto;
+        }
+        private set
+        {
+            m_IsStartAuto = value;
+            isPauseAuto = false;
+            UpdateRedPoint();
+            ChangeAutoEvent?.Invoke();
+        }
+    }
+    public bool isPauseAuto;    //寮�鍚殑鎯呭喌涓嬶紝鍥犱负鏌愪簺鍘熷洜鏆傚仠鑷姩
+
+
+    //姣忓鏂规鍚勮嚜鐨勪俊鎭�
+    public List<MinggeAutoSet> autoSetList = new List<MinggeAutoSet>();
+
+    public void InitAutoSet()
+    {
+        autoSetList.Clear();
+        if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Mingge))
+        {
+            return;
+        }
+        var maxCnt = PresetUnlockConfig.GetFuncPresetMaxCount((int)FuncPresetType.Mingge);
+        for (int i = 1; i <= maxCnt; i++)
+        {
+            var autoSet = new MinggeAutoSet();
+            autoSet.presetID = i;
+            autoSetList.Add(autoSet);
+        }
+    }
+
+    public MinggeAutoSet GetMGAutoSet(int presetID)
+    {
+        for (int i = 0; i < autoSetList.Count; i++)
+        {
+            if (autoSetList[i].presetID == presetID)
+            {
+                return autoSetList[i];
+            }
+        }
+        return null;
+    }
+
+    //妫�鏌ヨ嚦灏戣鏈変竴涓惎鍔ㄤ腑
+    public bool CanChangeStartToFalse(int presetID)
+    {
+        for (int i = 0; i < autoSetList.Count; i++)
+        {
+            if (autoSetList[i].presetID != presetID && autoSetList[i].startToggle)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public void StartAuto(bool isStart)
+    {
+        if (isStart)
+        {
+            bool canStart = false;
+            for (int i = 0; i < autoSetList.Count; i++)
+            {
+                if (autoSetList[i].startToggle)
+                {
+                    canStart = true;
+                }
+            }
+
+            if (!canStart)
+            {
+                SysNotifyMgr.Instance.ShowTip("MinggeAuto2");
+                isStartAuto = false;
+                return;
+            }
+
+
+            if (!ItemLogicUtility.CheckItemCount(PackType.Item, tyItemID, autoCostCount, 2))
+            {
+                isStartAuto = false;
+                return;
+            }
+        }
+        UIManager.Instance.CloseWindow<MinggeAutoSetWin>();
+        isStartAuto = isStart;
+        if (isStartAuto)
+        {
+            //鍏堝鐞嗚澶囦竴娆★紝鍚庣画閫氳繃鐗╁搧鍖呰嚜鍔ㄥ鐞�
+            CalcEquip();
+        }
+        else
+        {
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto1");
+        }
+    }
+
+    //鑷姩澶勭悊瑁呭锛岃繑鍥炴垚鍔熶唬琛ㄩ渶瑕佹墜鍔ㄥ鐞嗚澶囷紝鍏朵粬鎯呭喌涓�寰嬭繑鍥瀎alse濡傚垎瑙� 鎴栭槻鑼�
+    bool AutoCalcMG(ItemModel mgEquip, out int autoPreseetID)
+    {
+        autoPreseetID = 0;
+        if (mgEquip == null)
+        {
+            return false;
+        }
+
+        if (!isStartAuto)
+            return true;
+
+        //浼樺厛鍒ゆ柇褰撳墠鏂规鍛芥牸
+        var curPresetID = FuncPresetManager.Instance.GetFuncPresetID((int)FuncPresetType.Mingge);
+        var autoSet = GetMGAutoSet(curPresetID);
+
+
+        if (!CanDecomposeMG(mgEquip, autoSet))
+        {
+            autoPreseetID = curPresetID;
+            return true;
+        }
+        //鍒ゆ柇鍏朵粬鏂规
+        for (int i = 0; i < autoSetList.Count; i++)
+        {
+            if (autoSetList[i].presetID == curPresetID)
+            {
+                continue;
+            }
+            if (!CanDecomposeMG(mgEquip, autoSetList[i]))
+            {
+                autoPreseetID = autoSetList[i].presetID;
+                return true;
+            }
+        }
+
+        SendDecompose(new byte[] { (byte)mgEquip.gridIndex });
+        return false;
+    }
+
+    //鍗曟柟妗堝垽鏂紝鏈紑鍚殑涔熷綋浣滃彲鍒嗚В锛屽灞傚濂楀垽鏂湁涓�濂楅渶瑕佸氨鏄渶瑕佺┛鎴�
+    bool CanDecomposeMG(ItemModel mgEquip, MinggeAutoSet autoSet)
+    {
+        if (!autoSet.startToggle)
+        {
+            return true;
+        }
+        if (mgEquip.config.ItemColor < autoSet.quanlity)
+        {
+            //鍝佽川涓嶆弧瓒�
+            return true;
+        }
+        if (!autoSet.fightPowerToggle && !autoSet.fightAttrToggle && !autoSet.skillToggle)
+        {
+            //閮戒笉鍕鹃��
+            return true;
+        }
+
+
+        //鍏堝垽鏂妧鑳斤紝鍐嶅垽鏂睘鎬� 鏈�鍚庢垬鍔涳紙姣旇緝娑堣�楋級
+
+        //鎶�鑳藉嬀閫夌殑鎯呭喌
+        if (autoSet.skillToggle && !autoSet.fightPowerToggle && !autoSet.fightAttrToggle)
+        {
+            return !IsSkillOK(mgEquip, autoSet);
+        }
+
+        if (autoSet.skillToggle && autoSet.fightAttrToggle && !autoSet.fightPowerToggle)
+        {
+            if (autoSet.andOrSkillToggle == 1)
+            {
+                return !(IsSkillOK(mgEquip, autoSet) && IsFightAttrOK(mgEquip, autoSet));
+            }
+            else
+            {
+                return !(IsSkillOK(mgEquip, autoSet) || IsFightAttrOK(mgEquip, autoSet));
+            }
+        }
+
+        if (autoSet.skillToggle && autoSet.fightPowerToggle && !autoSet.fightAttrToggle)
+        {
+            if (autoSet.andOrSkillToggle == 1)
+            {
+                return !(IsSkillOK(mgEquip, autoSet) && IsFightPowerOK(mgEquip, autoSet));
+            }
+            else
+            {
+                return !(IsSkillOK(mgEquip, autoSet) || IsFightPowerOK(mgEquip, autoSet));
+            }
+        }
+
+        if (autoSet.skillToggle && autoSet.fightPowerToggle && autoSet.fightAttrToggle)
+        {
+            if (autoSet.andOrSkillToggle == 1 && autoSet.andOrFPToggle == 1)
+            {
+                return !(IsSkillOK(mgEquip, autoSet) && IsFightAttrOK(mgEquip, autoSet) && IsFightPowerOK(mgEquip, autoSet));
+            }
+            else if (autoSet.andOrSkillToggle == 1 && autoSet.andOrFPToggle == 2)
+            {
+                return !((IsSkillOK(mgEquip, autoSet) && IsFightAttrOK(mgEquip, autoSet)) || IsFightPowerOK(mgEquip, autoSet));
+            }
+            else if (autoSet.andOrSkillToggle == 2 && autoSet.andOrFPToggle == 1)
+            {
+                return !((IsFightAttrOK(mgEquip, autoSet) && IsFightPowerOK(mgEquip, autoSet)) || IsSkillOK(mgEquip, autoSet));
+            }
+            else
+            {
+                return !(IsSkillOK(mgEquip, autoSet) || IsFightAttrOK(mgEquip, autoSet) || IsFightPowerOK(mgEquip, autoSet));
+            }
+        }
+
+        //灞炴�у嬀閫夌殑鎯呭喌
+        if (autoSet.fightAttrToggle && !autoSet.fightPowerToggle)
+        {
+            return !IsFightAttrOK(mgEquip, autoSet);
+        }
+        if (autoSet.fightAttrToggle && autoSet.fightPowerToggle)
+        {
+            if (autoSet.andOrFPToggle == 1)
+            {
+                return !(IsFightAttrOK(mgEquip, autoSet) && IsFightPowerOK(mgEquip, autoSet));
+            }
+            else
+            {
+                return !(IsFightAttrOK(mgEquip, autoSet) || IsFightPowerOK(mgEquip, autoSet));
+            }
+        }
+
+        //鎴樺姏鍕鹃�夌殑鎯呭喌
+        if (autoSet.fightPowerToggle)
+        {
+            return !IsFightPowerOK(mgEquip, autoSet);
+        }
+
+        return false;
+    }
+
+    //鎶�鑳芥槸鍚︽弧瓒虫潯浠�
+    bool IsSkillOK(ItemModel mgEquip, MinggeAutoSet autoSet)
+    {
+        var skillID = EquipModel.Instance.GetEquipSkillID(mgEquip);
+        if (skillID == 0)
+        {
+            return false;
+        }
+        if (autoSet.skillID == 0)
+        {
+            //浠绘剰
+            return true;
+        }
+        if (skillID != autoSet.skillID)
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    //灞炴�ф槸鍚︽弧瓒虫潯浠�
+    bool IsFightAttrOK(ItemModel mgEquip, MinggeAutoSet autoSet)
+    {
+        var fightAttrs = EquipModel.Instance.GetEquipFightAttrs(mgEquip);
+
+        // 濡傛灉鎸囧畾浜嗗睘鎬э紝鍒欐鏌ヨ澶囨槸鍚﹀寘鍚灞炴��
+        bool deFightAttrOK = autoSet.deFightAttrID == 0 || fightAttrs.Contains(autoSet.deFightAttrID);
+        bool fightAttrOK = autoSet.fightAttrID == 0 || fightAttrs.Contains(autoSet.fightAttrID);
+
+        return deFightAttrOK && fightAttrOK;
+    }
+    
+    bool IsFightPowerOK(ItemModel mgEquip, MinggeAutoSet autoSet)
+    {
+        long showFightPower = FightPowerManager.Instance.GetFightPowerMinggeChange(mgEquip, autoSet.presetID);
+        if (showFightPower >= 0)
+        {
+            return true;
+        }
+        return false;
+    }
+
+
+    public void AutoTY()
+    {
+        //鍏堝鐞嗚澶囷紝鍐嶆帹婕�
+        // 姣忎竴濂楁柟妗堥兘瑕佺患鍚堝垽鏂�
+        // if (CalcEquip())
+        // {
+        //     return;
+        // }
+        if (UIManager.Instance.IsOpened<MinggeEquipWin>())
+        {
+            return;
+        }
+
+        if (!PackManager.Instance.GetItems(PackType.MinggeDrop).IsNullOrEmpty())
+        {
+            return;
+        }
+
+        if (!ItemLogicUtility.CheckItemCount(PackType.Item, tyItemID, autoCostCount, 1))
+        {
+            isStartAuto = false;
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto1");
+            return;
+        }
+        SendTY(autoCostCount);
+        autoTYTime = Time.time;
+    }
+
+    void OnMSEvent()
+    {
+        if (isPauseAuto)
+        {
+            return;
+        }
+        if (!isStartAuto)
+        {
+            return;
+        }
+        if (Time.time - autoTYTime < autoTYCDs[autoSpeedUP ? 1 : 0])
+        {
+            return;
+        }
+
+        AutoTY();
+    }
+
+    #endregion
+}
+
+public class MinggeAutoSet
+{
+    public int presetID;
+    public bool startToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGStart{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGStart{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int quanlity
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGQuanlity{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 1);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGQuanlity{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public bool fightPowerToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGFightPower{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGFightPower{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    //0 閮戒笉鍕鹃�� 1鍚屾椂 2 鎴栬��
+    public int andOrFPToggle
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGAndOrFP{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGAndOrFP{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+
+    public bool fightAttrToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGFightAttr{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGFightAttr{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int fightAttrID
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGFightAttrID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGFightAttrID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int deFightAttrID
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGDeFightAttrID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGDeFightAttrID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public bool skillToggle
+    {
+        get
+        {
+            return LocalSave.GetBool($"MGSkill{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", false);
+        }
+        set
+        {
+            LocalSave.SetBool($"MGSkill{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    public int skillID
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGSkillID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGSkillID{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+    //0 閮戒笉鍕鹃�� 1鍚屾椂 2 鎴栬��
+    public int andOrSkillToggle
+    {
+        get
+        {
+            return LocalSave.GetInt($"MGAndOrSkill{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", 0);
+        }
+        set
+        {
+            LocalSave.SetInt($"MGAndOrSkill{presetID}_{PlayerDatas.Instance.baseData.PlayerID}", value);
+        }
+    }
+
+
+    
 }
\ No newline at end of file
diff --git a/Main/System/Mingge/MinggePrayWin.cs b/Main/System/Mingge/MinggePrayWin.cs
index cb54675..e91f3f9 100644
--- a/Main/System/Mingge/MinggePrayWin.cs
+++ b/Main/System/Mingge/MinggePrayWin.cs
@@ -60,8 +60,8 @@
     void DisplayPrayRate()
     {
         qlValueText.text = MinggeManager.Instance.m_Lingying.ToString();
-        var littleRateList = GetRate(MinggeManager.Instance.m_Lingying);
-        var bigRateList = GetRate(MinggeManager.Instance.m_Lingying + useCnt);
+        var littleRateList = MinggeManager.Instance.GetQLRate(MinggeManager.Instance.m_Lingying);
+        var bigRateList = MinggeManager.Instance.GetQLRate(MinggeManager.Instance.m_Lingying + useCnt);
 
         for (int i = 0; i < prayRateCells.Length; i++)
         {
@@ -109,49 +109,6 @@
     }
 
 
-    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) / (float)(bigValue - littleValue) * (value - littleValue);
-            rateList.Add((int)diffRate);
-        }
-        
-        return rateList;
-    }
+    
 }
 
diff --git a/Main/System/Mingge/MinggeWin.cs b/Main/System/Mingge/MinggeWin.cs
index 9c3d6a6..0bbe61b 100644
--- a/Main/System/Mingge/MinggeWin.cs
+++ b/Main/System/Mingge/MinggeWin.cs
@@ -7,7 +7,7 @@
 {
     [SerializeField] Button seeAttrBtn;
     [SerializeField] MinggeEquipCell[] equipCells;
-    [SerializeField] UIEffectPlayer tyEffect;   //鎺ㄦ紨鐗规晥
+    [SerializeField] public UIEffectPlayer tyEffect;   //鎺ㄦ紨鐗规晥
     [SerializeField] Image dropIcon;
     [SerializeField] Image dropSkillIcon;
     [SerializeField] MoneyMoveByPath moneyMoveByPathCell;     //鎺夎惤鐗╅噾閽�
@@ -78,6 +78,7 @@
         MinggeManager.Instance.OnMinggeInfoUpdate += OnMinggeInfoUpdate;
         UIManager.Instance.OnCloseWindow += OnCloseWindow;
         FuncPresetManager.Instance.OnFuncPresetUseDataEvent += OnFuncPresetUseDataEvent;
+        MinggeManager.Instance.ChangeAutoEvent += ChangeAutoEvent;
         lastLV = MinggeManager.Instance.m_GanwuLV;
         lastExp = MinggeManager.Instance.m_GanwuExp;
         Display();
@@ -92,7 +93,17 @@
         MinggeManager.Instance.OnMinggeInfoUpdate -= OnMinggeInfoUpdate;
         UIManager.Instance.OnCloseWindow -= OnCloseWindow;
         FuncPresetManager.Instance.OnFuncPresetUseDataEvent -= OnFuncPresetUseDataEvent;
+        MinggeManager.Instance.ChangeAutoEvent -= ChangeAutoEvent;
     }
+
+    protected override void NextFrameAfterOpen()
+    {
+        if (MinggeManager.Instance.isPauseAuto)
+        {
+            MinggeManager.Instance.CalcEquip();
+        }
+    }
+
 
     void OnCloseWindow(UIBase win)
     {
@@ -112,6 +123,20 @@
         Display();
     }
 
+    void ChangeAutoEvent()
+    {
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            autoImg.SetActive(false);
+            autoEffect.Play();
+        }
+        else
+        {
+            autoImg.SetActive(true);
+            autoEffect.Stop();
+        }
+    }
+
     void Display()
     {
         DisplayMGGanwu();
@@ -123,6 +148,8 @@
         presetChooseCells.Display((int)BattlePreSetType.Story, (int)FuncPresetType.Mingge);
 
         funPresetBtn.SetActive(FuncPresetManager.Instance.IsPreShow());
+        ChangeAutoEvent();
+        
     }
     void RefreshItemEvent(PackType type, int index, int itemID)
     {
@@ -216,6 +243,10 @@
 
     void SendTuiyan()
     {
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            MinggeManager.Instance.StartAuto(false);
+        }
         if (MinggeManager.Instance.CalcEquip())
         {
             return;
@@ -231,7 +262,12 @@
             return;
         }
 
-        tyEffect.onComplete += () =>
+        if (MinggeManager.Instance.isStartAuto)
+        {
+            MinggeManager.Instance.StartAuto(false);
+        }
+        tyEffect.speedRate = 1;
+        tyEffect.onComplete = () =>
         {
             MinggeManager.Instance.SendTY(1);
         };
@@ -295,7 +331,16 @@
 
     void AutoTY()
     {
-        
+        if (InvestModel.Instance.IsInvested(InvestModel.monthCardType) ||
+        PlayerDatas.Instance.baseData.realmLevel >= MinggeManager.Instance.needOfficialRank)
+        {
+            UIManager.Instance.OpenWindow<MinggeAutoSetWin>();
+        }
+        else
+        {
+            SysNotifyMgr.Instance.ShowTip("MinggeAuto6", RealmConfig.Get(PlayerDatas.Instance.baseData.realmLevel).Name);
+            UIManager.Instance.OpenWindow<PrivilegeCardWin>();
+        }
     }
 }
 
diff --git a/Main/System/PhantasmPavilion/PhantasmPavilionManager.cs b/Main/System/PhantasmPavilion/PhantasmPavilionManager.cs
index b373111..52ce53f 100644
--- a/Main/System/PhantasmPavilion/PhantasmPavilionManager.cs
+++ b/Main/System/PhantasmPavilion/PhantasmPavilionManager.cs
@@ -84,6 +84,8 @@
     {
         if (type != PackType.Item)
             return;
+        if (itemID <= 0)
+            return;
         if (ItemConfig.Get(itemID).Type != 146)
             return;
         UpdateRedPoint();

--
Gitblit v1.8.0