From ddbeb0b7f3277eb6198e1a2e7cb93aab6f5a2d20 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期三, 04 二月 2026 00:10:35 +0800
Subject: [PATCH] 351 【内政】红颜系统

---
 Main/Config/Configs/BeautySkinConfig.cs       |   41 +++---
 Main/System/BeautyMM/BeautyMMSkinCell.cs      |   60 ++++++++++
 Main/System/BeautyMM/BeautyMMSkinWin.cs.meta  |   11 +
 Main/System/BeautyMM/BeautyMMSkinWin.cs       |  188 +++++++++++++++++++++++++++++++
 Main/Config/ConfigManager.cs                  |    3 
 Main/System/BeautyMM/BeautyMMSkinCell.cs.meta |   11 +
 Main/System/BeautyMM/BeautyMMManager.cs       |   31 +++++
 Main/System/BeautyMM/BeautyMMShowWin.cs       |    2 
 8 files changed, 326 insertions(+), 21 deletions(-)

diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index 1cf8a3a..dfac8d5 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -91,6 +91,7 @@
             typeof(PlayerAttrConfig),
             typeof(PlayerFaceConfig),
             typeof(PresetUnlockConfig),
+            typeof(PriorBundleConfig),
             typeof(RandomNameConfig),
             typeof(SignInConfig),
             typeof(StoreConfig),
@@ -361,6 +362,8 @@
         ClearConfigDictionary<PlayerFaceConfig>();
         // 娓呯┖ PresetUnlockConfig 瀛楀吀
         ClearConfigDictionary<PresetUnlockConfig>();
+        // 娓呯┖ PriorBundleConfig 瀛楀吀
+        ClearConfigDictionary<PriorBundleConfig>();
         // 娓呯┖ RandomNameConfig 瀛楀吀
         ClearConfigDictionary<RandomNameConfig>();
         // 娓呯┖ SignInConfig 瀛楀吀
diff --git a/Main/Config/Configs/BeautySkinConfig.cs b/Main/Config/Configs/BeautySkinConfig.cs
index 3407cc1..852b494 100644
--- a/Main/Config/Configs/BeautySkinConfig.cs
+++ b/Main/Config/Configs/BeautySkinConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�12鏈�21鏃�
+//    [  Date ]:           2026骞�2鏈�3鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -17,6 +17,7 @@
     }
 
     public int SkinID;
+	public string Name;
 	public int BeautyID;
 	public int UnlockWay;
 	public int UnlockValue;
@@ -42,25 +43,27 @@
         string[] tables = input.Split('\t');
         int.TryParse(tables[0],out SkinID); 
 
-			int.TryParse(tables[1],out BeautyID); 
+			Name = tables[1];
 
-			int.TryParse(tables[2],out UnlockWay); 
+			int.TryParse(tables[2],out BeautyID); 
 
-			int.TryParse(tables[3],out UnlockValue); 
+			int.TryParse(tables[3],out UnlockWay); 
 
-			int.TryParse(tables[4],out UnlockNeedCnt); 
+			int.TryParse(tables[4],out UnlockValue); 
 
-			int.TryParse(tables[5],out UpNeedCnt); 
+			int.TryParse(tables[5],out UnlockNeedCnt); 
 
-			int.TryParse(tables[6],out StarMax); 
+			int.TryParse(tables[6],out UpNeedCnt); 
 
-			if (tables[7].Contains("["))
+			int.TryParse(tables[7],out StarMax); 
+
+			if (tables[8].Contains("["))
 			{
-				AttrIDList = JsonMapper.ToObject<int[]>(tables[7]);
+				AttrIDList = JsonMapper.ToObject<int[]>(tables[8]);
 			}
 			else
 			{
-				string[] AttrIDListStringArray = tables[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] AttrIDListStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				AttrIDList = new int[AttrIDListStringArray.Length];
 				for (int i=0;i<AttrIDListStringArray.Length;i++)
 				{
@@ -68,13 +71,13 @@
 				}
 			}
 
-			if (tables[8].Contains("["))
+			if (tables[9].Contains("["))
 			{
-				InitAttrValueList = JsonMapper.ToObject<int[]>(tables[8]);
+				InitAttrValueList = JsonMapper.ToObject<int[]>(tables[9]);
 			}
 			else
 			{
-				string[] InitAttrValueListStringArray = tables[8].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] InitAttrValueListStringArray = tables[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				InitAttrValueList = new int[InitAttrValueListStringArray.Length];
 				for (int i=0;i<InitAttrValueListStringArray.Length;i++)
 				{
@@ -82,13 +85,13 @@
 				}
 			}
 
-			if (tables[9].Contains("["))
+			if (tables[10].Contains("["))
 			{
-				AttrPerStarAddList = JsonMapper.ToObject<int[]>(tables[9]);
+				AttrPerStarAddList = JsonMapper.ToObject<int[]>(tables[10]);
 			}
 			else
 			{
-				string[] AttrPerStarAddListStringArray = tables[9].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				string[] AttrPerStarAddListStringArray = tables[10].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
 				AttrPerStarAddList = new int[AttrPerStarAddListStringArray.Length];
 				for (int i=0;i<AttrPerStarAddListStringArray.Length;i++)
 				{
@@ -96,11 +99,11 @@
 				}
 			}
 
-			HeadIcon = tables[10];
+			HeadIcon = tables[11];
 
-			SmallRole = tables[11];
+			SmallRole = tables[12];
 
-			BigRole = tables[12];
+			BigRole = tables[13];
         }
         catch (Exception exception)
         {
diff --git a/Main/System/BeautyMM/BeautyMMManager.cs b/Main/System/BeautyMM/BeautyMMManager.cs
index d7d26c6..98825e8 100644
--- a/Main/System/BeautyMM/BeautyMMManager.cs
+++ b/Main/System/BeautyMM/BeautyMMManager.cs
@@ -16,6 +16,17 @@
 
     public int selectLoveItemID = 0;
 
+    int m_SelectSkinID;
+    public event Action OnSelectSkinIDChange;
+    public int selectSkinID
+    {
+        get { return m_SelectSkinID; }
+        set
+        {
+            m_SelectSkinID = value;
+            OnSelectSkinIDChange?.Invoke();
+        }
+    }
     //閰嶇疆
 
     //閬撳叿ID 瀵瑰簲 濂芥劅搴�
@@ -501,6 +512,17 @@
     }
 
 
+    //鎿嶄綔 1-婵�娲伙紱2-浣╂埓锛�3-鍗囨槦
+    public void SendSkinOP(int mmID, int skinID, int opType)
+    {
+        var pack = new CB221_tagCSBeautySkinOP();
+        pack.BeautyID = (ushort)mmID;
+        pack.SkinID = (ushort)skinID;
+        pack.OPType = (byte)opType;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+
     #region 绾㈢偣
     Redpoint redpoint = new Redpoint(MainRedDot.MainAffairsRedpoint, MainRedDot.Redpoint_BeautyMM);
     Redpoint redpointMM = new Redpoint(MainRedDot.Redpoint_BeautyMM, MainRedDot.Redpoint_BeautyMM * 10 + 1);
@@ -654,7 +676,14 @@
         return 0;
     }
 
-
+    public BeautyMMSkinData GetSkinData(int skinID)
+    {
+        if (beautyMMSkinDataDict.ContainsKey(skinID))
+        {
+            return beautyMMSkinDataDict[skinID];
+        }
+        return new BeautyMMSkinData();
+    }
 
     public bool IsMMSkinRed(int mmID)
     {
diff --git a/Main/System/BeautyMM/BeautyMMShowWin.cs b/Main/System/BeautyMM/BeautyMMShowWin.cs
index 0f5802e..2984751 100644
--- a/Main/System/BeautyMM/BeautyMMShowWin.cs
+++ b/Main/System/BeautyMM/BeautyMMShowWin.cs
@@ -87,7 +87,7 @@
 
         skinBtn.AddListener(() =>
         {
-            // UIManager.Instance.OpenWindow<BeautyMMListWin>();
+            UIManager.Instance.OpenWindow<BeautyMMSkinWin>(mmID);
         });
 
         seeAttrBtn.AddListener(() =>
diff --git a/Main/System/BeautyMM/BeautyMMSkinCell.cs b/Main/System/BeautyMM/BeautyMMSkinCell.cs
new file mode 100644
index 0000000..0311c1e
--- /dev/null
+++ b/Main/System/BeautyMM/BeautyMMSkinCell.cs
@@ -0,0 +1,60 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class BeautyMMSkinCell : CellView
+{
+    [SerializeField] Image headBG;
+    [SerializeField] Image headImg;
+    [SerializeField] Transform lockObj;
+    [SerializeField] Image unLockImg;
+    [SerializeField] Image selectImg;
+    [SerializeField] Text usedText;
+    [SerializeField] Image redImg;
+    [SerializeField] Button btn;
+
+
+
+    public void Display(int mmID, int skinID)
+    {
+        var mmConfig = BeautyConfig.Get(mmID);
+        var skinConfig = BeautySkinConfig.Get(skinID);
+        headBG.SetSprite("heroheadBG" + mmConfig.BeautyQuality);
+        headImg.SetOrgSprite(skinConfig.HeadIcon, "BeautyMMHead");
+
+        var redState = BeautyMMManager.Instance.GetMMSkinStateBySkinID(skinConfig);
+        var skinData = BeautyMMManager.Instance.GetSkinData(skinID);
+        var mmData = BeautyMMManager.Instance.GetBeautyMMData(mmID);
+        var state = skinData.State;
+        if (mmData != null && mmData.State != 0 && skinConfig.UnlockWay == 1)
+        {
+            state = 1;
+        }
+        if (state != 0)
+        {
+            lockObj.SetActive(false);
+        }
+        else
+        {
+            lockObj.SetActive(true);
+            unLockImg.SetActive(redState > 0);
+        }
+        usedText.SetActive(skinData.Used == 1);
+        selectImg.SetActive(BeautyMMManager.Instance.selectSkinID == skinID);
+        redImg.SetActive(redState > 0);
+
+        btn.AddListener(() =>
+        {
+            BeautyMMManager.Instance.selectSkinID = skinID;
+        });
+
+        
+        // 鏈嶅姟绔病鏈夐粯璁よВ閿侊紝鑾峰緱瑙i攣鐨勯粯璁� 甯墜鍔ㄨВ閿佸彂閫�
+        // if (mmData != null && mmData.State != 0 && skinData.State == 0 && skinConfig.UnlockWay == 1)
+        // {
+        //     BeautyMMManager.Instance.SendSkinOP(mmID, BeautyMMManager.Instance.selectSkinID, 1);
+        // }
+    }
+
+
+}
diff --git a/Main/System/BeautyMM/BeautyMMSkinCell.cs.meta b/Main/System/BeautyMM/BeautyMMSkinCell.cs.meta
new file mode 100644
index 0000000..540365f
--- /dev/null
+++ b/Main/System/BeautyMM/BeautyMMSkinCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dd24658dabbf575428047614fe16ca9d
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/BeautyMM/BeautyMMSkinWin.cs b/Main/System/BeautyMM/BeautyMMSkinWin.cs
new file mode 100644
index 0000000..16a3e97
--- /dev/null
+++ b/Main/System/BeautyMM/BeautyMMSkinWin.cs
@@ -0,0 +1,188 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+public class BeautyMMSkinWin : UIBase
+{
+    [SerializeField] ImageEx roleImg;
+    [SerializeField] Text nameText;
+    [SerializeField] Text wayText;
+    [SerializeField] Text attrTipText;  //瑙i攣鎴栬�呭姞鎴愭晥鏋�
+    [SerializeField] Text attrValueText;
+    [SerializeField] ScrollerController clothesScroller;
+    [SerializeField] Button unlockBtn;
+    [SerializeField] Text cntText;
+    [SerializeField] Image itemIcon;
+    [SerializeField] Transform opObjs;
+    [SerializeField] Button lvUPBtn;
+    [SerializeField] Text lvUPCntText;
+    [SerializeField] Image lvUPItemIcon;
+    [SerializeField] Button putOnBtn;
+    [SerializeField] Image putOnYetImg;
+    [SerializeField] UIEffectPlayer lvUPEffect;
+
+
+    int mmID;
+
+
+    protected override void InitComponent()
+    {
+        unlockBtn.AddListener(UnLockSkin);
+        lvUPBtn.AddListener(LvUpSkin);
+        putOnBtn.AddListener(PutOnSkin);
+
+    }
+
+
+    protected override void OnPreOpen()
+    {
+        mmID = functionOrder;
+        BeautyMMManager.Instance.selectSkinID = BeautyMMManager.Instance.GetUsedSkinID(mmID);
+        clothesScroller.OnRefreshCell += OnRefreshCell;
+        BeautyMMManager.Instance.OnSelectSkinIDChange += Display;
+        CreateScroller();
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        clothesScroller.OnRefreshCell -= OnRefreshCell;
+        BeautyMMManager.Instance.OnSelectSkinIDChange -= Display;
+    }
+
+
+    void Display()
+    {
+        var skinConfig = BeautySkinConfig.Get(BeautyMMManager.Instance.selectSkinID);
+        roleImg.SetOrgSprite(skinConfig.BigRole, "BeautyMMBigRole");
+        roleImg.SetNativeSize();
+        var skinData = BeautyMMManager.Instance.GetSkinData(BeautyMMManager.Instance.selectSkinID);
+        if (skinData.Star != 0)
+        {
+            nameText.text = skinConfig.Name + " " + Language.Get("L1113", skinData.Star);
+        }
+        else
+        {
+            nameText.text = skinConfig.Name;
+        }
+
+        var config = BeautyConfig.Get(mmID);
+        if (skinConfig.UnlockWay == 1)
+        {
+            wayText.text = Language.Get("BeautyMMSkin1", config.Name);
+        }
+        else if (skinConfig.UnlockWay == 2)
+        {
+            var itemConfig = ItemConfig.Get(skinConfig.UnlockValue);
+            if (itemConfig.GetWay.IsNullOrEmpty())
+            {
+                wayText.text = "";
+            }
+            else
+            {
+                wayText.text = GetItemWaysConfig.Get(itemConfig.GetWay[0]).Name;
+            }
+        }
+
+        if (skinConfig.InitAttrValueList.IsNullOrEmpty())
+        {
+            attrTipText.text = "";
+            attrValueText.text = "";
+        }
+        else
+        {
+            if (skinData.State == 0)
+            {
+                attrTipText.text = Language.Get("PhantasmPavilion11");
+                attrValueText.text = UIHelper.AppendColor(TextColType.lightYellow, PlayerPropertyConfig.GetFullDescription(skinConfig.AttrIDList[0], skinConfig.InitAttrValueList[0]));
+            }
+            else
+            {
+                attrTipText.text = Language.Get("PhantasmPavilion07");
+                var value = skinConfig.InitAttrValueList[0] + skinData.Star * skinConfig.AttrPerStarAddList[0];
+
+                attrValueText.text = UIHelper.AppendColor(TextColType.lightYellow, PlayerPropertyConfig.GetFullDescription(skinConfig.AttrIDList[0], value)) +
+                    Language.Get("PhantasmPavilion12", UIHelper.AppendColor(TextColType.Green, "+" + PlayerPropertyConfig.GetValueDescription(skinConfig.AttrIDList[0], skinConfig.AttrPerStarAddList[0])));
+            }
+        }
+
+
+
+        if (skinData.State == 0)
+        {
+            if (skinConfig.UnlockWay == 2)
+            {
+                unlockBtn.SetActive(true);
+                cntText.text = UIHelper.ShowUseItem(PackType.Item, skinConfig.UnlockValue, skinConfig.UnlockNeedCnt);
+                itemIcon.SetItemSprite(skinConfig.UnlockValue);
+            }
+            else
+            {
+                unlockBtn.SetActive(false);
+            }
+            opObjs.SetActive(false);
+        }
+        else
+        {
+            unlockBtn.SetActive(false);
+            opObjs.SetActive(true);
+            if (skinConfig.StarMax != 0 && skinData.Star < skinConfig.StarMax)
+            {
+                lvUPBtn.SetActive(true);
+                lvUPCntText.text = UIHelper.ShowUseItem(PackType.Item, skinConfig.UnlockValue, skinConfig.UpNeedCnt);
+                lvUPItemIcon.SetItemSprite(skinConfig.UnlockValue);
+            }
+            else
+            {
+                lvUPBtn.SetActive(false);
+            }
+
+            putOnBtn.SetActive(skinData.Used == 0);
+            putOnYetImg.SetActive(skinData.Used == 1);
+
+        }
+    }
+
+
+    void CreateScroller()
+    {
+        clothesScroller.Refresh();
+        var _list = BeautySkinConfig.GetSkinListByMMID(mmID);
+        for (int i = 0; i < _list.Count; i++)
+        {
+            clothesScroller.AddCell(ScrollerDataType.Header, _list[i].SkinID);
+        }
+        clothesScroller.Restart();
+
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as BeautyMMSkinCell;
+        _cell.Display(mmID, cell.index);
+    }
+
+    void UnLockSkin()
+    {
+        var skinConfig = BeautySkinConfig.Get(BeautyMMManager.Instance.selectSkinID);
+        if (!ItemLogicUtility.CheckItemCount(PackType.Item, skinConfig.UnlockValue, skinConfig.UnlockNeedCnt, 2))
+        {
+            return;
+        }
+        BeautyMMManager.Instance.SendSkinOP(mmID, BeautyMMManager.Instance.selectSkinID, 1);
+    }
+
+    void LvUpSkin()
+    {
+        var skinConfig = BeautySkinConfig.Get(BeautyMMManager.Instance.selectSkinID);
+        if (!ItemLogicUtility.CheckItemCount(PackType.Item, skinConfig.UnlockValue, skinConfig.UpNeedCnt, 2))
+        {
+            return;
+        }
+        BeautyMMManager.Instance.SendSkinOP(mmID, BeautyMMManager.Instance.selectSkinID, 3);
+    }
+
+    void PutOnSkin()
+    {
+        BeautyMMManager.Instance.SendSkinOP(mmID, BeautyMMManager.Instance.selectSkinID, 2);
+    }
+}
diff --git a/Main/System/BeautyMM/BeautyMMSkinWin.cs.meta b/Main/System/BeautyMM/BeautyMMSkinWin.cs.meta
new file mode 100644
index 0000000..d0786e3
--- /dev/null
+++ b/Main/System/BeautyMM/BeautyMMSkinWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: df1fcdd540c50e8478e77bb8f88ce8fb
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

--
Gitblit v1.8.0