From 9e89e605d5429babb4b33df2e47ea86dff9d2ba7 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 20 十一月 2025 11:55:04 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/Component/UI/Core/ButtonEx.cs                    |    2 
 Main/Config/ConfigManager.cs                          |    1 
 Main/System/BoneField/AdsManager.cs                   |   24 
 Main/System/Invest/InvestModel.cs                     |  322 +++++++++++---
 Main/System/Main/AutoFightWin.cs                      |   20 
 Main/System/Redpoint/MainRedDot.cs                    |   10 
 Main/Config/PartialConfigs/ADAwardConfig.cs           |   14 
 Main/System/BoneField/BoneFieldManager.cs             |   25 
 Main/System/BoneField/AdsCell.cs                      |   50 ++
 Main/System/Recharge/PrivilegeCardCell.cs             |  145 ++++++
 Main/System/Recharge/PrivilegeActiveCardWin.cs.meta   |   11 
 Main/Config/ConfigParse.cs                            |   24 +
 Main/System/TianziBillborad/TianziBillboradWin.cs     |    2 
 Main/Config/Configs/ADAwardConfig.cs                  |   97 ++--
 Main/SDK/SDKUtils.cs                                  |    2 
 Main/System/Main/AutoFightModel.cs                    |   97 ++++
 Main/System/KnapSack/PackManager.cs                   |   17 
 Main/System/Recharge/PrivilegeActiveCardWin.cs        |   49 ++
 Main/System/Dungeon/DungeonManager.cs                 |   29 +
 Main/System/HappyXB/HeroCallScoreWin.cs               |    2 
 Main/System/BoneField/BoneFieldWin.cs                 |   74 ++-
 Main/System/Equip/BlessLVADWin.cs                     |    2 
 Main/System/Equip/BlessLVManager.cs                   |    2 
 Main/System/Arena/ArenaManager.cs                     |    2 
 Main/System/Recharge/PrivilegeCardWin.cs              |  125 -----
 Main/System/Recharge/RechargeManager.cs               |    4 
 Main/System/Main/RightFuncInHome.cs                   |    6 
 Main/System/BoneField/AdsCell.cs.meta                 |   11 
 Main/System/Recharge/PrivilegeCardCell.cs.meta        |   11 
 Main/System/ChallengeTab/BoneFieldTabHandler.cs       |    8 
 Main/System/TianziBillborad/TianziBillboradManager.cs |   16 
 Main/System/ChallengeTab/TianziBillboradTabHandler.cs |    8 
 32 files changed, 851 insertions(+), 361 deletions(-)

diff --git a/Main/Component/UI/Core/ButtonEx.cs b/Main/Component/UI/Core/ButtonEx.cs
index 7342ebf..e6e423d 100644
--- a/Main/Component/UI/Core/ButtonEx.cs
+++ b/Main/Component/UI/Core/ButtonEx.cs
@@ -9,7 +9,7 @@
 
     public event Action ableTimeChangeEvent;
 
-    public float interval;
+    public float interval = 0.5f;
     public bool customPositiveSound = false;
     public bool customNegativeSound = false;
     public int positiveSound = 0;
diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index 24f2c12..7866caa 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -271,7 +271,6 @@
         ClearConfigDictionary<HorseClassConfig>();
         // 娓呯┖ HorseSkinConfig 瀛楀吀
         ClearConfigDictionary<HorseSkinConfig>();
-        // 娓呯┖ InvestConfig 瀛楀吀
         // 娓呯┖ ItemCompoundConfig 瀛楀吀
         ClearConfigDictionary<ItemCompoundConfig>();
         // 娓呯┖ ItemConfig 瀛楀吀
diff --git a/Main/Config/ConfigParse.cs b/Main/Config/ConfigParse.cs
index c1461f7..da09db2 100644
--- a/Main/Config/ConfigParse.cs
+++ b/Main/Config/ConfigParse.cs
@@ -320,13 +320,35 @@
         return result;
     }
 
+    //json鏍煎紡锛� {"1":{"1":1,"2":2},"2":{"3":3,"4":4}}
+    public static Dictionary<int, Dictionary<int, int>> ParseDictInDict(string jsonStr)
+    {
+        if (jsonStr == "{}" || string.IsNullOrEmpty(jsonStr))
+        {
+            return new Dictionary<int, Dictionary<int, int>>();
+        }
+        var dict = JsonMapper.ToObject<Dictionary<string, Dictionary<string, int>>>(jsonStr);
+        Dictionary<int, Dictionary<int, int>> result = new Dictionary<int, Dictionary<int, int>>();
+
+        foreach (var item in dict)
+        {
+            Dictionary<int, int> subDict = new Dictionary<int, int>();
+            foreach (var subItem in item.Value)
+            {
+                subDict[int.Parse(subItem.Key)] = subItem.Value;
+            }
+            result[int.Parse(item.Key)] = subDict;
+        }
+        
+        return result;
+    }
 
     //涓囧垎鐜囪浆涓烘瘡涓猧d瀵瑰簲鐨勬鐜� [[涓囧垎姒傜巼锛宨d1],[涓囧垎姒傜巼锛宨d2]]
     public static Dictionary<int, int> GetRateDict(int[][] rateArray)
     {
         Dictionary<int, int> dic = new Dictionary<int, int>();
         //姒傜巼涓� 鍑忓幓涓婁竴涓鐜囩殑鍊煎嵆涓哄綋鍓岻D姒傜巼
-        for (int i = 0;i< rateArray.Length; i++)
+        for (int i = 0; i < rateArray.Length; i++)
         {
             if (i > 0)
             {
diff --git a/Main/Config/Configs/ADAwardConfig.cs b/Main/Config/Configs/ADAwardConfig.cs
index 6d15479..2ff9a2c 100644
--- a/Main/Config/Configs/ADAwardConfig.cs
+++ b/Main/Config/Configs/ADAwardConfig.cs
@@ -1,47 +1,50 @@
-锘�//--------------------------------------------------------
-//    [Author]:           YYL
-//    [  Date ]:           2025骞�10鏈�9鏃�
-//--------------------------------------------------------
-
-using System.Collections.Generic;
-using System;
-using UnityEngine;
-using LitJson;
-
-public partial class ADAwardConfig : ConfigBase<int, ADAwardConfig>
-{
-    static ADAwardConfig()
-    {
-        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
-        visit = true; 
-    }
-
-    public int ADID;
-	public int ADCntMax;
-	public int[][] ADAwardItemList;
-	public int ADMapID;
-
-    public override int LoadKey(string _key)
-    {
-        int key = GetKey(_key);
-        return key;
-    }
-
-    public override void LoadConfig(string input)
-    {
-        try {
-        string[] tables = input.Split('\t');
-        int.TryParse(tables[0],out ADID); 
-
-			int.TryParse(tables[1],out ADCntMax); 
-
-			ADAwardItemList = JsonMapper.ToObject<int[][]>(tables[2].Replace("(", "[").Replace(")", "]")); 
-
-			int.TryParse(tables[3],out ADMapID); 
-        }
-        catch (Exception exception)
-        {
-            Debug.LogError(exception);
-        }
-    }
-}
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           Wednesday, November 19, 2025
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class ADAwardConfig : ConfigBase<int, ADAwardConfig>
+{
+    static ADAwardConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int ADID;
+	public int ADCntMax;
+	public int[][] ADAwardItemList;
+	public int ADAwardType;
+	public int ADAwardValue;
+
+    public override int LoadKey(string _key)
+    {
+        int key = GetKey(_key);
+        return key;
+    }
+
+    public override void LoadConfig(string input)
+    {
+        try {
+        string[] tables = input.Split('\t');
+        int.TryParse(tables[0],out ADID); 
+
+			int.TryParse(tables[1],out ADCntMax); 
+
+			ADAwardItemList = JsonMapper.ToObject<int[][]>(tables[2].Replace("(", "[").Replace(")", "]")); 
+
+			int.TryParse(tables[3],out ADAwardType); 
+
+			int.TryParse(tables[4],out ADAwardValue); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Config/PartialConfigs/ADAwardConfig.cs b/Main/Config/PartialConfigs/ADAwardConfig.cs
index fb03ed8..b962c80 100644
--- a/Main/Config/PartialConfigs/ADAwardConfig.cs
+++ b/Main/Config/PartialConfigs/ADAwardConfig.cs
@@ -1,13 +1,19 @@
 using System.Collections.Generic;
 public partial class ADAwardConfig : ConfigBase<int, ADAwardConfig>
 {
-    private static Dictionary<int, int> idDict = new Dictionary<int, int>();
+    private static Dictionary<Int2, ADAwardConfig> idDict = new Dictionary<Int2, ADAwardConfig>();
     protected override void OnConfigParseCompleted()
     {
-        idDict[ADMapID] = ADID;
+
+        idDict[new Int2(ADAwardType, ADAwardValue)] = this;
     }
-    public static bool TryGetADIDByADMapID(int ADMapID, out int ADID)
+
+    public static bool TryGetADIDByTypeValue(int type, int value, out ADAwardConfig config)
     {
-        return idDict.TryGetValue(ADMapID, out ADID) && ADID > 0;
+        if (idDict.TryGetValue(new Int2(type, value), out config))
+        {
+            return true;
+        }
+        return false;
     }
 }
diff --git a/Main/SDK/SDKUtils.cs b/Main/SDK/SDKUtils.cs
index 5b80525..d944353 100644
--- a/Main/SDK/SDKUtils.cs
+++ b/Main/SDK/SDKUtils.cs
@@ -966,7 +966,7 @@
             }
             else
             {
-                ConfirmCancel.ToggleConfirmCancel(Language.Get("Mail101"), Language.Get("GameCashRule1", money), Language.Get("TodayNoNotify"), (bool isOk, bool isToggle) =>
+                ConfirmCancel.ToggleConfirmCancel(Language.Get("Mail101"), Language.Get("GameCashRule1", money, title), Language.Get("TodayNoNotify"), (bool isOk, bool isToggle) =>
                 {
                     if (isOk)
                     {
diff --git a/Main/System/Arena/ArenaManager.cs b/Main/System/Arena/ArenaManager.cs
index 70c9467..7428ad2 100644
--- a/Main/System/Arena/ArenaManager.cs
+++ b/Main/System/Arena/ArenaManager.cs
@@ -121,7 +121,7 @@
 
     public int GetMaxChallengeCount()
     {
-        return challengeTicketLimit;
+        return challengeTicketLimit + InvestModel.Instance.GetArenaAddMaxCount();
     }
 
     public void OnArenaMatchList(HA922_tagSCArenaMatchList vNetData)
diff --git a/Main/System/BoneField/AdsCell.cs b/Main/System/BoneField/AdsCell.cs
new file mode 100644
index 0000000..97c4233
--- /dev/null
+++ b/Main/System/BoneField/AdsCell.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Events;
+using UnityEngine.UI;
+
+//骞垮憡灏忕粍浠讹紝鍙鍒惰嫳闆勬嫑鍕熼噷鐨�
+public class AdsCell : MonoBehaviour
+{
+    [SerializeField] Button adBtn;
+    [SerializeField] Text cntText;
+
+    public int adID;
+    public int type;
+    public int value;
+
+    protected void OnEnable()
+    {
+        AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
+        adBtn.AddListener(OnClickAds);
+        OnAdsInfoListUpdateEvent(adID, type, value);
+    }
+
+    protected void OnDisable()
+    {
+        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
+    }
+
+    private void OnAdsInfoListUpdateEvent(int _adID, int _type, int _value)
+    {
+        if (adID != _adID)
+            return;
+        int adsCnt = AdsManager.Instance.GetADCntByADID(adID);
+        var aDAwardConfig = ADAwardConfig.Get(adID);
+        bool isShowAds = adsCnt < aDAwardConfig.ADCntMax;
+        int remainAdsCount = aDAwardConfig.ADCntMax - adsCnt;
+        adBtn.SetActive(isShowAds);
+        cntText.text = $"{remainAdsCount}/{aDAwardConfig.ADCntMax}";
+    }
+
+    // public void AddListener(UnityAction action)
+    // {
+    //     adBtn.AddListener(action);
+    // }
+
+    void OnClickAds()
+    {
+        AdsManager.Instance.PlayAds(adID);
+    }
+}
\ No newline at end of file
diff --git a/Main/System/BoneField/AdsCell.cs.meta b/Main/System/BoneField/AdsCell.cs.meta
new file mode 100644
index 0000000..ca606ea
--- /dev/null
+++ b/Main/System/BoneField/AdsCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 20f5dfb2172d4004aa743824abe77f84
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/BoneField/AdsManager.cs b/Main/System/BoneField/AdsManager.cs
index 5033fc5..f0a3142 100644
--- a/Main/System/BoneField/AdsManager.cs
+++ b/Main/System/BoneField/AdsManager.cs
@@ -4,7 +4,7 @@
 {
     //<骞垮憡ID,浠婃棩宸查鍙栧箍鍛婂鍔辨鏁�>
     private Dictionary<int, int> adsInfoDict = new Dictionary<int, int>();
-    public event Action<int, int> OnAdsInfoListUpdateEvent;//ADID ADMapID
+    public event Action<int, int, int> OnAdsInfoListUpdateEvent;//ADID type value
     public override void Init()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
@@ -20,7 +20,7 @@
         adsInfoDict.Clear();
     }
 
-    public void SendGetReward(int ADID)
+    void SendGetReward(int ADID)
     {
         var pack = new CA504_tagCMPlayerGetReward();
         pack.RewardType = 81;       //  骞垮憡濂栧姳 81
@@ -28,6 +28,7 @@
         GameNetSystem.Instance.SendInfo(pack);
     }
 
+    //濡傛灉鏈夊箍鍛奡DK鎺ュ叆锛岃鍑芥暟鏀规垚鍥炶皟瑙﹀彂
     public void PlayAds(int ADID)
     {
         switch (ADID)
@@ -39,15 +40,19 @@
                 BoneFieldManager.Instance.SendBBeginFBWipeOut(BoneFieldManager.Instance.DataMapID, (int)fbInfo1.PassLineID);
                 break;
             case 2:
-            
+
                 if (!DungeonManager.Instance.TryGetFBInfoByMapID(TianziBillboradManager.Instance.DataMapID, out var fbInfo2))
                     return;
                 SendGetReward(ADID);
-                BoneFieldManager.Instance.SendBBeginFBWipeOut(TianziBillboradManager.Instance.DataMapID, (int)fbInfo2.PassLineID);
+                break;
+            case 3:
+            case 4:
+                SendGetReward(ADID);
                 break;
         }
     }
 
+    //宸茶幏鍙栧箍鍛婂鍔辨鏁�
     public int GetADCntByADID(int ADID)
     {
         if (adsInfoDict.IsNullOrEmpty() || !adsInfoDict.ContainsKey(ADID))
@@ -63,13 +68,14 @@
         {
             adsInfoDict[item.ADID] = item.ADCnt;
 
-            int mapID = 0;
-            if (ADAwardConfig.HasKey(item.ADID))
+            if (!ADAwardConfig.HasKey(item.ADID))
             {
-                ADAwardConfig aDAwardConfig = ADAwardConfig.Get(item.ADID);
-                mapID = aDAwardConfig.ADMapID;
+                continue;
             }
-            OnAdsInfoListUpdateEvent?.Invoke(item.ADID, mapID);
+            ADAwardConfig aDAwardConfig = ADAwardConfig.Get(item.ADID);
+            var value = aDAwardConfig.ADAwardValue;
+            var type = aDAwardConfig.ADAwardType;
+            OnAdsInfoListUpdateEvent?.Invoke(item.ADID, type, value);
         }
     }
 }
diff --git a/Main/System/BoneField/BoneFieldManager.cs b/Main/System/BoneField/BoneFieldManager.cs
index 3305407..80a6ed5 100644
--- a/Main/System/BoneField/BoneFieldManager.cs
+++ b/Main/System/BoneField/BoneFieldManager.cs
@@ -10,7 +10,7 @@
     public override void Init()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
-        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChangeEvent;
+        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent;
         AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
         TimeMgr.Instance.OnDayEvent += OnDayEvent;
@@ -19,7 +19,7 @@
     public override void Release()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
-        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
+        DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChangeEvent;
         AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
         TimeMgr.Instance.OnDayEvent -= OnDayEvent;
@@ -37,17 +37,16 @@
         UpdateRedPoint();
     }
 
-    private void OnUpdateFBInfoChangeEvent(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange)
+    private void OnUpdateFBInfoChangeEvent(int mapID)
     {
         int dataMapID = DataMapID;
         if (mapID != dataMapID)
             return;
-        if (isADAddCntChange)
-            return;
+
         UpdateRedPoint();
     }
 
-    private void OnAdsInfoListUpdateEvent(int id, int mapId)
+    private void OnAdsInfoListUpdateEvent(int id, int type, int mapId)
     {
         if (mapId != DataMapID)
             return;
@@ -114,21 +113,9 @@
 
     public bool TryGetShowSweepCount(out int showSweepMaxCount, out int showrealRemainSweepCount)
     {
-        showSweepMaxCount = 0;
-        showrealRemainSweepCount = 0;
-        int dataMapID = BoneFieldManager.Instance.DataMapID;
-        if (!DungeonOpenTimeConfig.HasKey(dataMapID))
+        if (!DungeonManager.Instance.TryGetDungeonCount(DataMapID, out showSweepMaxCount, out showrealRemainSweepCount))
             return false;
-        if (!DungeonManager.Instance.TryGetFBInfoByMapID(dataMapID, out FBInfo fbInfo))
-            return false;
-        DungeonOpenTimeConfig dungeonOpenTimeConfig = DungeonOpenTimeConfig.Get(dataMapID);
 
-        int baseCount = dungeonOpenTimeConfig.DayTimes + dungeonOpenTimeConfig.PayCntMax;
-        int realMaxCount = baseCount + fbInfo.ADAddCnt + fbInfo.BuyAddCnt + fbInfo.ItemAddCnt;
-        int realRemainSweepCount = realMaxCount - fbInfo.EnterCnt;
-
-        showSweepMaxCount = realMaxCount - fbInfo.ADAddCnt - fbInfo.BuyAddCnt;
-        showrealRemainSweepCount = realRemainSweepCount - fbInfo.BuyAddCnt;
         return true;
     }
 
diff --git a/Main/System/BoneField/BoneFieldWin.cs b/Main/System/BoneField/BoneFieldWin.cs
index b57d699..c84dbc9 100644
--- a/Main/System/BoneField/BoneFieldWin.cs
+++ b/Main/System/BoneField/BoneFieldWin.cs
@@ -43,7 +43,7 @@
     protected override void OnPreOpen()
     {
         base.OnPreOpen();
-        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChangeEvent;
+        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent;
         AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
         TimeMgr.Instance.OnDayEvent += OnDayEvent;
         Display();
@@ -52,36 +52,30 @@
     protected override void OnPreClose()
     {
         base.OnPreClose();
-        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
+        DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChangeEvent;
         AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
         TimeMgr.Instance.OnDayEvent -= OnDayEvent;
     }
 
-    private void OnUpdateFBInfoChangeEvent(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange)
+    private void OnUpdateFBInfoChangeEvent(int mapID)
     {
         int dataMapID = BoneFieldManager.Instance.DataMapID;
         if (mapID != dataMapID)
             return;
-        if (!ADAwardConfig.TryGetADIDByADMapID(BoneFieldManager.Instance.DataMapID, out adID) || !ADAwardConfig.HasKey(adID))
+        ADAwardConfig aDAwardConfig;
+        if (!ADAwardConfig.TryGetADIDByTypeValue(2, BoneFieldManager.Instance.DataMapID, out aDAwardConfig))
             return;
-        ADAwardConfig aDAwardConfig = ADAwardConfig.Get(adID);
-        if (isADAddCntChange)
-        {
-            DisplayAdsButton(aDAwardConfig);
-        }
-        else
-        {
-            Display();
-        }
+
+        Display();
     }
 
-    private void OnAdsInfoListUpdateEvent(int id, int mapId)
+    private void OnAdsInfoListUpdateEvent(int id, int type, int mapId)
     {
         if (mapId != BoneFieldManager.Instance.DataMapID)
             return;
-        if (!ADAwardConfig.TryGetADIDByADMapID(BoneFieldManager.Instance.DataMapID, out adID) || !ADAwardConfig.HasKey(adID))
+        ADAwardConfig aDAwardConfig;
+        if (!ADAwardConfig.TryGetADIDByTypeValue(2, BoneFieldManager.Instance.DataMapID, out aDAwardConfig))
             return;
-        ADAwardConfig aDAwardConfig = ADAwardConfig.Get(adID);
         DisplayAdsButton(aDAwardConfig);
     }
 
@@ -107,6 +101,12 @@
 
         if (showrealRemainSweepCount == showSweepMaxCount)
         {
+            BoneFieldManager.Instance.SendBBeginFBWipeOut(dataMapID, (int)fbInfo.PassLineID);
+            return;
+        }
+        if (InvestModel.Instance.GetFBIsFree(dataMapID))
+        {
+            BoneFieldManager.Instance.SendBuyEnterCount(dataMapID);
             BoneFieldManager.Instance.SendBBeginFBWipeOut(dataMapID, (int)fbInfo.PassLineID);
             return;
         }
@@ -153,10 +153,10 @@
         if (bossId == 0 || !NPCConfig.HasKey(bossId))
             return;
         NPCConfig nPCConfig = NPCConfig.Get(bossId);
-        if (!ADAwardConfig.TryGetADIDByADMapID(dataMapID, out adID) || !ADAwardConfig.HasKey(adID))
+        ADAwardConfig aDAwardConfig;
+        if (!ADAwardConfig.TryGetADIDByTypeValue(2, BoneFieldManager.Instance.DataMapID, out aDAwardConfig))
             return;
-        ADAwardConfig aDAwardConfig = ADAwardConfig.Get(adID);
-
+        adID = aDAwardConfig.ADID;
 
         DisplayFBInfo(nPCConfig, dungeonConfig, nowPassLineID);
         DisplayChallengeButton(dungeonConfig, fbInfo);
@@ -206,22 +206,32 @@
         imgSweep.gray = !isSweepCountOk;
         long myFightPower = PlayerDatas.Instance.baseData.FightPower;
         imgSweepRed.SetActive(isSweepCountOk && myFightPower < dungeonConfig.FightPower);
-        txtFirstFree.SetActive(showSweepMaxCount == showrealRemainSweepCount);
         txtTodaySweepCount.SetActive(showSweepMaxCount > showrealRemainSweepCount);
         txtTodaySweepCount.text = UIHelper.AppendColor(isSweepCountOk ? TextColType.LightGreen : TextColType.Red, Language.Get("BoneField08", showrealRemainSweepCount, showSweepMaxCount));
-        imgMoneyCount.SetActive(showSweepMaxCount != showrealRemainSweepCount && isSweepCountOk);
-        txtNeedMoneyCount.SetActive(showSweepMaxCount != showrealRemainSweepCount && isSweepCountOk);
-        if (showSweepMaxCount != showrealRemainSweepCount && isSweepCountOk)
+
+        if (InvestModel.Instance.GetFBIsFree(BoneFieldManager.Instance.DataMapID))
         {
-            int dataMapID = BoneFieldManager.Instance.DataMapID;
-            DungeonOpenTimeConfig config = DungeonOpenTimeConfig.Get(dataMapID);
-            int index = Mathf.Min(Mathf.Max(0, showSweepMaxCount - showrealRemainSweepCount - 1), config.PayMoneyValues.Length - 1);
-            int payMoneyValue = config.PayMoneyValues[index];
-            int payMoneyType = config.PayMoneyType;
-            imgMoneyCount.SetIconWithMoneyType(payMoneyType);
-            txtNeedMoneyCount.text = payMoneyValue.ToString();
+            txtFirstFree.text = Language.Get("PrivilegeCard1");
+            imgMoneyCount.SetActive(false);
+            txtNeedMoneyCount.SetActive(false);
         }
-    }
+        else
+        {
+            txtFirstFree.text = showSweepMaxCount == showrealRemainSweepCount ? Language.Get("BoneField10") : "";
+            imgMoneyCount.SetActive(showSweepMaxCount != showrealRemainSweepCount && isSweepCountOk);
+            txtNeedMoneyCount.SetActive(showSweepMaxCount != showrealRemainSweepCount && isSweepCountOk);
+            if (showSweepMaxCount != showrealRemainSweepCount && isSweepCountOk)
+            {
+                int dataMapID = BoneFieldManager.Instance.DataMapID;
+                DungeonOpenTimeConfig config = DungeonOpenTimeConfig.Get(dataMapID);
+                int index = Mathf.Min(Mathf.Max(0, showSweepMaxCount - showrealRemainSweepCount - 1), config.PayMoneyValues.Length - 1);
+                int payMoneyValue = config.PayMoneyValues[index];
+                int payMoneyType = config.PayMoneyType;
+                imgMoneyCount.SetIconWithMoneyType(payMoneyType);
+                txtNeedMoneyCount.text = payMoneyValue.ToString();
+            }
+        }
+    }        
 
     public void DisplayAdsButton(ADAwardConfig aDAwardConfig)
     {
@@ -229,7 +239,7 @@
         bool isShowAds = adsCnt < aDAwardConfig.ADCntMax;
         int remainAdsCount = aDAwardConfig.ADCntMax - adsCnt;
         btnAds.SetActive(isShowAds);
-        txtTodayAdsCount.text = UIHelper.AppendColor(isShowAds ? TextColType.LightGreen : TextColType.Red, Language.Get("BoneField09", remainAdsCount, aDAwardConfig.ADCntMax)); ;
+        txtTodayAdsCount.text = Language.Get("BoneField09", remainAdsCount, aDAwardConfig.ADCntMax); ;
     }
 
     public void DisplayItemCellList(List<ItemCell> itemCells, int[][] items)
diff --git a/Main/System/ChallengeTab/BoneFieldTabHandler.cs b/Main/System/ChallengeTab/BoneFieldTabHandler.cs
index 36ad21d..bb0c18c 100644
--- a/Main/System/ChallengeTab/BoneFieldTabHandler.cs
+++ b/Main/System/ChallengeTab/BoneFieldTabHandler.cs
@@ -50,17 +50,17 @@
     protected override void SubscribeToSpecificEvents()
     {
 
-        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChange;
+        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChange;
         AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdate;
     }
 
     protected override void UnsubscribeFromSpecificEvents()
     {
-        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChange;
+        DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChange;
         AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdate;
     }
 
-    private void OnUpdateFBInfoChange(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange)
+    private void OnUpdateFBInfoChange(int mapID)
     {
         if (mapID == BoneFieldManager.Instance.DataMapID)
         {
@@ -68,7 +68,7 @@
         }
     }
 
-    private void OnAdsInfoListUpdate(int adID, int mapID)
+    private void OnAdsInfoListUpdate(int adID, int type, int mapID)
     {
         if (mapID == BoneFieldManager.Instance.DataMapID)
         {
diff --git a/Main/System/ChallengeTab/TianziBillboradTabHandler.cs b/Main/System/ChallengeTab/TianziBillboradTabHandler.cs
index 490547d..a432e2a 100644
--- a/Main/System/ChallengeTab/TianziBillboradTabHandler.cs
+++ b/Main/System/ChallengeTab/TianziBillboradTabHandler.cs
@@ -47,17 +47,17 @@
 
     protected override void SubscribeToSpecificEvents()
     {
-        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChange;
+        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChange;
         AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdate;
     }
 
     protected override void UnsubscribeFromSpecificEvents()
     {
-        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChange;
+        DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChange;
         AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdate;
     }
 
-    private void OnUpdateFBInfoChange(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange)
+    private void OnUpdateFBInfoChange(int mapID)
     {
         if (mapID == TianziBillboradManager.Instance.DataMapID)
         {
@@ -65,7 +65,7 @@
         }
     }
 
-    private void OnAdsInfoListUpdate(int adID, int mapID)
+    private void OnAdsInfoListUpdate(int adID, int type, int mapID)
     {
         if (mapID == TianziBillboradManager.Instance.DataMapID)
         {
diff --git a/Main/System/Dungeon/DungeonManager.cs b/Main/System/Dungeon/DungeonManager.cs
index bbfbb11..d1bd6c2 100644
--- a/Main/System/Dungeon/DungeonManager.cs
+++ b/Main/System/Dungeon/DungeonManager.cs
@@ -9,7 +9,6 @@
 {
     private Dictionary<int, FBInfo> fbInfoDict = new Dictionary<int, FBInfo>();
     public event Action<int> UpdateFBInfoListEvent;//int mapID
-    public event Action<int, bool, bool, bool> UpdateFBInfoChangeEvent;
     Dictionary<int, DungeonRecord> dungeonRecords = new Dictionary<int, DungeonRecord>();
     public event Action updateDungeonBuyCnt;
 
@@ -31,6 +30,33 @@
     public bool TryGetFBInfoByMapID(int mapID, out FBInfo info)
     {
         return fbInfoDict.TryGetValue(mapID, out info);
+    }
+
+    //鑾峰緱鍓湰鐨勬渶澶ф鏁板拰鍓╀綑鍙敤娆℃暟
+    
+    //maxCount 鏈�澶ф鏁帮細鍙兘浼氬洜鍚勪釜鍓湰灞曠ず瑙勫垯涓嶅悓鑰屼笉鍚�
+    //            榛樿涓轰粠鍔熻兘鎿嶄綔褰掑睘鍑哄彂璐拱娆℃暟灞炰簬姣忔棩涓婇檺娆℃暟 姣忔棩娆℃暟 + 鍙渶澶ц喘涔版鏁� + 鐗规潈娆℃暟
+    //useCount 鍓╀綑鍙敤娆℃暟锛氫粖鏃ユ�荤殑鍙敤娆℃暟 - 浠婃棩宸茶繘鍏ユ鏁�
+    //          浠婃棩鎬荤殑鍙敤娆℃暟锛氭瘡鏃ユ鏁� + 鍙喘鎬讳拱娆℃暟 + 骞垮憡娆℃暟 + 閬撳叿娆℃暟 + 鐗规潈娆℃暟
+    //          榛樿涓轰粠鍔熻兘鎿嶄綔褰掑睘鍑哄彂璐拱娆℃暟灞炰簬鍙敤娆℃暟鍐�
+    public bool TryGetDungeonCount(int dataMapID, out int maxCount, out int useCount)
+    {
+        maxCount = 0;
+        useCount = 0;
+        if (!TryGetFBInfoByMapID(dataMapID, out FBInfo fbInfo))
+            return false;
+            
+        DungeonOpenTimeConfig dungeonOpenTimeConfig = DungeonOpenTimeConfig.Get(dataMapID);
+        if (dungeonOpenTimeConfig == null)
+        {
+            return false;
+        }
+        //鎬荤殑鍙敤娆℃暟锛氭瘡鏃ユ鏁� + 鍙喘鎬讳拱娆℃暟 + 骞垮憡娆℃暟 + 閬撳叿娆℃暟 + 鐗规潈娆℃暟
+        int totalCount = dungeonOpenTimeConfig.DayTimes + dungeonOpenTimeConfig.PayCntMax + InvestModel.Instance.GetAddFBBuyCount(dataMapID) + fbInfo.ADAddCnt + fbInfo.ItemAddCnt;
+        maxCount = dungeonOpenTimeConfig.DayTimes + dungeonOpenTimeConfig.PayCntMax + InvestModel.Instance.GetAddFBBuyCount(dataMapID);
+        useCount = totalCount - fbInfo.EnterCnt;
+
+        return true;
     }
 
     public void UpdateFBInfoList(HA320_tagSCFBInfoList vNetData)
@@ -63,7 +89,6 @@
             fbInfoDict[mapID].PassGrade = item.PassGrade;
 
             UpdateFBInfoListEvent?.Invoke(mapID);
-            UpdateFBInfoChangeEvent?.Invoke(mapID, isADAddCntChange, isBuyAddCntChange, isItemAddCntChange);
         }
     }
 
diff --git a/Main/System/Equip/BlessLVADWin.cs b/Main/System/Equip/BlessLVADWin.cs
index 534e71d..c97e1cf 100644
--- a/Main/System/Equip/BlessLVADWin.cs
+++ b/Main/System/Equip/BlessLVADWin.cs
@@ -31,7 +31,7 @@
 
     void OnAD()
     {
-        AdsManager.Instance.SendGetReward(4);
+        AdsManager.Instance.PlayAds(4);
         CloseWindow();
     }
     
diff --git a/Main/System/Equip/BlessLVManager.cs b/Main/System/Equip/BlessLVManager.cs
index 3b31a00..5861a29 100644
--- a/Main/System/Equip/BlessLVManager.cs
+++ b/Main/System/Equip/BlessLVManager.cs
@@ -100,7 +100,7 @@
 
     public int GetMaxEnergyCnt()
     {
-        return freeEnergyMax;
+        return freeEnergyMax + InvestModel.Instance.GetBlessAddEnergyMax();
     }
 
     //鍏呰兘鏃堕棿鍊掕鏃�, 鐢ㄤ簬瀹㈡埛绔富鍔ㄩ鍙� 鎴栬�� 鍙湁浠�0鍒�1鎵嶆樉绀虹敤
diff --git a/Main/System/HappyXB/HeroCallScoreWin.cs b/Main/System/HappyXB/HeroCallScoreWin.cs
index 5d72886..9d57df1 100644
--- a/Main/System/HappyXB/HeroCallScoreWin.cs
+++ b/Main/System/HappyXB/HeroCallScoreWin.cs
@@ -50,7 +50,7 @@
         {
             scoreProcessText.color = UIHelper.GetUIColor(TextColType.Red);
         }
-        if (InvestModel.Instance.IsInvested(InvestModel.monthCardType))
+        if (InvestModel.Instance.IsActiveHeroScoreCall())
         {
             tryLockText.SetActive(false);
             call1Btn.SetColorful(null, true);
diff --git a/Main/System/Invest/InvestModel.cs b/Main/System/Invest/InvestModel.cs
index 1634716..a11b019 100644
--- a/Main/System/Invest/InvestModel.cs
+++ b/Main/System/Invest/InvestModel.cs
@@ -12,26 +12,45 @@
 
     //鎶曡祫瀵瑰簲濂栧姳
     Dictionary<int, int[][]> m_InvestItems = new Dictionary<int, int[][]>();
+    Dictionary<int, int> m_InvestDays = new Dictionary<int, int>(); //鎶曡祫瀵瑰簲澶╂暟
+    Dictionary<int, int> m_InvestMaxDays = new Dictionary<int, int>();  //鎶曡祫瀵瑰簲鏈�澶ц喘涔扮疮鍔犲ぉ鏁�
+
     //鎶曡祫瀵瑰簲鍏呭�糏D
     Dictionary<int, int[]> m_InvestRechargeIds = new Dictionary<int, int[]>();
+    Dictionary<int, int> m_InvestCTGIDToType = new Dictionary<int, int>();
+
     //鎶曡祫瀵瑰簲璐拱鎯呭喌
     Dictionary<int, InvestInfo> m_InvestInfos = new Dictionary<int, InvestInfo>();
     //鎶曡祫绫诲瀷
-    public List<int> investTypes = new List<int>();
 
+    //--鐗规潈--
+    //澧炲姞鍓湰璐拱娆℃暟
+    Dictionary<int, Dictionary<int, int>> m_InvestAddFBCount = new Dictionary<int, Dictionary<int, int>>();
+    //鍓湰璐拱娆℃暟鍏嶈垂鐨勫壇鏈琁D 鍜� m_InvestAddFBCount 閰嶅悎浣跨敤 鐩稿綋浜� 鐗规潈澧炲姞鍓湰涓婇檺浣嗘槸鍙戝寘娴佺▼闇�鍜屾湇鍔$鍟嗛噺
+    Dictionary<int, int[]> m_InvestFreeFBID = new Dictionary<int, int[]>();
+    //婕旀鍦哄鍔犱笂闄�
+    Dictionary<int, int> m_InvestArenaMaxCnt = new Dictionary<int, int>();
+    //绁濈鏍戣兘閲忓鍔犱笂闄�
+    Dictionary<int, int> m_InvestAddBlessEnergyCount = new Dictionary<int, int>();
+
+    // 鐗规潈鏉冮檺鏁伴噺
+    Dictionary<int, int> m_PrivilegeLins = new Dictionary<int, int>();
+    // 鎴樻枟鍊嶆暟寮�鍚搴旂壒鏉�
+    Dictionary<int, int> m_PrivilegeFightSpeed = new Dictionary<int, int>();
+    // 鑻遍泟绉垎鎷涘嫙寮�鍚殑鐗规潈绫诲瀷
+    int[] heroScoreCallOpenType;
+        
 
     public event Action<int> onInvestUpdate;
 
-    public const int redpointID = 20931;
-    public Redpoint redpoint = new Redpoint(redpointID);
+    public Redpoint redpoint1 = new Redpoint(MainRedDot.RedPoint_PrivilegeCard, MainRedDot.RedPoint_PrivilegeCard * 10 + 1);
+    public Redpoint redpoint2 = new Redpoint(MainRedDot.RedPoint_PrivilegeCard, MainRedDot.RedPoint_PrivilegeCard * 10 + 2);
 
 
     public override void Init()
     {
-        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitialize;
-        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
-
+        RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent;
         //閫氳繃閰嶇疆鍐冲畾鏄惁鏈夋鎶曡祫椤癸紝濡傛腐鍙版病鏈夌櫥褰曟姇璧�
         ParseConfig();
 
@@ -41,9 +60,8 @@
 
     public override void Release()
     {
-        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitialize;
-        DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent -= OnPlayerLoginOk;
+        RechargeManager.Instance.rechargeCountEvent -= OnRechargeCountEvent;
     }
 
     public bool IsOpen()
@@ -55,86 +73,88 @@
     public void OnBeforePlayerDataInitialize()
     {
         m_InvestInfos.Clear();
+        lastTotalBuyCountDict.Clear();
     }
 
-    public void OnPlayerLoginOk()
-    {
-        UpdateRedpoint();
-    }
 
 
     void ParseConfig()
     {
         var funcConfig = FuncConfigConfig.Get("InvestCost");
         m_InvestRechargeIds = ConfigParse.ParseIntArrayDict(funcConfig.Numerical1);
+        foreach (var item in m_InvestRechargeIds)
+        {
+            m_InvestCTGIDToType[item.Value[0]] = item.Key;
+        }
 
         funcConfig = FuncConfigConfig.Get("InvestDay");
+        m_InvestDays = ConfigParse.ParseIntDict(funcConfig.Numerical1);
+        m_InvestMaxDays = ConfigParse.ParseIntDict(funcConfig.Numerical2);
         m_InvestItems = ConfigParse.ParseIntArray2Dict(funcConfig.Numerical3);
 
-        investTypes = m_InvestRechargeIds.Keys.ToList();
-        investTypes.Sort();
 
+        funcConfig = FuncConfigConfig.Get("InvestPower");
+        m_InvestAddFBCount = ConfigParse.ParseDictInDict(funcConfig.Numerical1);
+        m_InvestFreeFBID = ConfigParse.ParseIntArrayDict(funcConfig.Numerical2);
+        m_InvestArenaMaxCnt = ConfigParse.ParseIntDict(funcConfig.Numerical3);
+        m_InvestAddBlessEnergyCount = ConfigParse.ParseIntDict(funcConfig.Numerical4);
+
+        funcConfig = FuncConfigConfig.Get("PrivilegeCard");
+        m_PrivilegeLins = ConfigParse.ParseIntDict(funcConfig.Numerical1);
+        m_PrivilegeFightSpeed = ConfigParse.ParseIntDict(funcConfig.Numerical2);
+        heroScoreCallOpenType = JsonMapper.ToObject<int[]>(funcConfig.Numerical3);
         
     }
 
-    public OrderInfoConfig GetOrderInfoId(int type)
+    Dictionary<int, int> lastTotalBuyCountDict = new Dictionary<int, int>();
+    void OnRechargeCountEvent(int ctgID)
     {
-        var ids = m_InvestRechargeIds[type];
-        for (int i = 0; i < ids.Length; i++)
+
+        if (m_InvestCTGIDToType.ContainsKey(ctgID))
         {
-            OrderInfoConfig config;
-            if (RechargeManager.Instance.TryGetOrderInfo(ids[i], out config))
+            var type = m_InvestCTGIDToType[ctgID];
+            RechargeManager.Instance.TryGetRechargeCount(ctgID, out var rechargeCount);
+            if (!DTC0403_tagPlayerLoginLoadOK.finishedLogin)
             {
-                return config;
+                lastTotalBuyCountDict[type] = rechargeCount.totalCount;
+                return;
+            }
+            var count = 0;
+            lastTotalBuyCountDict.TryGetValue(type, out count);
+            if (count < rechargeCount.totalCount)
+            {
+                lastTotalBuyCountDict[type] = rechargeCount.totalCount;
+                UIManager.Instance.OpenWindow<PrivilegeActiveCardWin>(type);
             }
         }
-        return null;
     }
 
 
-    public bool hasInvestType(int type)
+
+    //鑾峰彇鎶曡祫鍓╀綑鏃堕棿 绉�
+    public int GetInvestLeftTime(int type)
     {
-        return investTypes.Contains(type);
+        if (type == 1 && m_InvestInfos[type].InvestEndTime > 0)
+        {
+            //鏈堝崱 闄愭椂绫诲瀷鐨勬姇璧� 鏈埌鏈熷氨绠楁姇璧�
+            return m_InvestInfos[type].InvestEndTime - TimeUtility.AllSeconds;
+        }
+        return 0;
     }
 
 
-    // public int GetInvestPassDays(int type)
-    // {
-    //     return m_InvestInfos.ContainsKey(type) ? m_InvestInfos[type].days : 0;
-    // }
 
-
-
-    //id 涓鸿〃閲岀殑ID
-    //0-鏈姇璧� 1-鏈揪鎴� 2-鍙鍙� 3-宸查鍙�
-    public int GetSingleInvestState(int type, int id)
+    //0-鏈姇璧� 1-鍙鍙� 2-宸查鍙�
+    public int GetInvestState(int type)
     {
-        // if (IsInvested(type))
-        // {
-        //     var day = GetInvestPassDays(type);
-        //     if (m_InvestItems.ContainsKey(type)
-        //         && m_InvestItems[type].ContainsKey(id))
-        //     {
-        //         if (IsRewardGot(type, id))
-        //         {
-        //             return 3;
-        //         }
-        //         var config = InvestConfig.Get(id);
-
-        //         if (!m_InvestSingleInfos.ContainsKey(type))
-        //         {
-        //             return 0;
-        //         }
-
-        //         var index = id % 100;
-        //         //姣忎釜鏁版寜浣嶅瓨31涓縺娲荤储寮�
-        //         var listIndex = index / 31;
-        //         var bitIndex = index % 31;
-
-
-        //         return day < config.needDay ? 1 : 2;
-        //     }
-        // }
+        if (IsInvested(type))
+        {
+            if (m_InvestInfos[type].AwardState == 0)
+            {
+                return 1;
+            }
+            return 2;
+        }
         return 0;
     }
 
@@ -149,7 +169,7 @@
         if (type == 1)
         {
             //鏈堝崱 闄愭椂绫诲瀷鐨勬姇璧� 鏈埌鏈熷氨绠楁姇璧�
-            return m_InvestInfos[type].InvestEndTime > 0 && m_InvestInfos[type].InvestEndTime < TimeUtility.AllSeconds;
+            return m_InvestInfos[type].InvestEndTime > 0 && m_InvestInfos[type].InvestEndTime > TimeUtility.AllSeconds;
         }
         
         //姘镐箙绫诲瀷鐨勬姇璧� 鍙璐拱浜嗗氨绠楁姇璧�
@@ -157,19 +177,8 @@
     }
 
 
-
-    private void OnFuncStateChangeEvent(int id)
-    {
-        if (id == (int)FuncOpenEnum.PrivilegeCard)
-        {
-            UpdateRedpoint();
-        }
-
-    }
-
-    
-
-    public void SendGetReward(int type, int id)
+    //type 鎶曡祫绫诲瀷
+    public void SendGetReward(int type, int id = 0)
     {
         var pak = new CA541_tagCMGetInvestReward();
         pak.InvestType = (byte)type;
@@ -180,15 +189,12 @@
     //璐拱鎶曡祫
     public void BuyInvest(int type)
     {
-        RechargeManager.Instance.CTG(GetOrderInfoId(type));
+        RechargeManager.Instance.CTG(GetOrderInfo(type));
     }
+
 
     public void UpdateInvestInfo(HA338_tagSCInvestInfo package)
     {
-        if (!investTypes.Contains(package.InvestType))
-        {
-            return;
-        }
 
         m_InvestInfos[package.InvestType] = new InvestInfo()
         {
@@ -197,7 +203,7 @@
             AwardState = package.AwardState
         };
 
-        
+
         UpdateRedpoint();
 
         if (onInvestUpdate != null)
@@ -213,9 +219,167 @@
             return;
         }
 
+        redpoint1.state = GetInvestState(monthCardType) == 1 ? RedPointState.Simple : RedPointState.None;
+        redpoint2.state = GetInvestState(foreverCardType) == 1 ? RedPointState.Simple : RedPointState.None;
+
     }
 
-    
+    #region 鐗规潈鎺ュ彛
+
+    //鍓湰澧炲姞鐨勮喘涔版鏁颁笂闄�
+    public int GetAddFBBuyCount(int _mapID)
+    {
+        int addCount = 0;
+        foreach (var item in m_InvestAddFBCount)
+        {
+            if (!IsInvested(item.Key))
+            {
+                continue;
+            }
+            foreach (var mapID in item.Value.Keys)
+            {
+                if (mapID == _mapID)
+                {
+                    addCount += item.Value[mapID];
+                }
+            }
+        }
+
+        return addCount;
+    }
+
+    //鍓湰鍏嶈垂鐨勮喘涔版鏁�
+    public bool GetFBIsFree(int _mapID)
+    {
+        foreach (var item in m_InvestFreeFBID)
+        {
+            if (!IsInvested(item.Key))
+            {
+                continue;
+            }
+            foreach (var mapID in item.Value)
+            {
+                if (mapID == _mapID)
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+
+    public int GetPrivilegeLins(int type)
+    {
+        if (m_PrivilegeLins.ContainsKey(type))
+        {
+            return m_PrivilegeLins[type];
+        }
+        return 0;
+    }
+
+    public OrderInfoConfig GetOrderInfo(int type)
+    {
+        var ids = m_InvestRechargeIds[type];
+        for (int i = 0; i < ids.Length; i++)
+        {
+            OrderInfoConfig config;
+            if (RechargeManager.Instance.TryGetOrderInfo(ids[i], out config))
+            {
+                return config;
+            }
+        }
+        return null;
+    }
+
+    public int GetCTGID(int type)
+    {
+        return m_InvestRechargeIds[type][0];
+    }
+
+    public int[][] GetDayAwards(int type)
+    {
+        return m_InvestItems[type];
+    }
+
+    //婕旀鍦哄嚟璇佷笂闄�
+    public int GetArenaAddMaxCount()
+    {
+        int addCount = 0;
+        foreach (var item in m_InvestArenaMaxCnt)
+        {
+            if (!IsInvested(item.Key))
+            {
+                continue;
+            }
+            addCount += item.Value;
+        }
+
+        return addCount;
+    }
+
+    //璐拱澶╂暟鏄惁杈句笂闄�
+    public bool IsBuyMaxDay(int type)
+    {
+        if (m_InvestMaxDays.ContainsKey(type) && m_InvestInfos.ContainsKey(type))
+        {
+            if (m_InvestInfos[type].InvestEndTime > 0)
+            {
+                return (m_InvestInfos[type].InvestEndTime - TimeUtility.AllSeconds) / 60 / 60 / 24 + m_InvestDays[type] >= m_InvestMaxDays[type];
+            }
+        }
+        return false;
+    }
+
+    //绁濈鑳介噺涓婇檺
+    public int GetBlessAddEnergyMax()
+    {
+        int addCount = 0;
+        foreach (var item in m_InvestAddBlessEnergyCount)
+        {
+            if (!IsInvested(item.Key))
+            {
+                continue;
+            }
+            addCount += item.Value;
+        }
+
+        return addCount;
+    }
+
+    //鏄惁婵�娲昏嫳闆勭Н鍒嗗彫鍞�
+    public bool IsActiveHeroScoreCall()
+    {
+        foreach (var type in heroScoreCallOpenType)
+        {
+            if (IsInvested(type))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public bool IsActiveFightSpeed(int speed)
+    {
+        foreach (var item in m_PrivilegeFightSpeed)
+        {
+            if (!IsInvested(item.Key))
+            {
+                continue;
+            }
+            if (item.Value == speed)
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    #endregion
+
+
+
 
     public struct InvestInfo
     {
diff --git a/Main/System/KnapSack/PackManager.cs b/Main/System/KnapSack/PackManager.cs
index a66d931..d538894 100644
--- a/Main/System/KnapSack/PackManager.cs
+++ b/Main/System/KnapSack/PackManager.cs
@@ -43,12 +43,8 @@
     public Dictionary<int, int> openGirdMoneyDict = new Dictionary<int, int>(); //鑳屽寘绫诲瀷锛氭秷鑰楄揣甯佺被鍨�
     public Dictionary<int, int[]> openGirdMoneyValueDict = new Dictionary<int, int[]>(); //鑳屽寘绫诲瀷锛氭秷鑰楄揣甯佸��(鎸夋鏁板畾浠�)
     public Dictionary<int, int[]> openGirdCountDict = new Dictionary<int, int[]>(); //鑳屽寘绫诲瀷锛氭瘡娆″紑鐨勬牸瀛愭暟閲�
-    public static string StrengthAttrShift_RecordKey = "";
-    public const string RecordKnapsackTitle = "RecordKnapsackTitle";
 
 
-    string RoleEquipLocalSave = "";
-    List<int> LocalSavePlaceArray { get; set; }
     Dictionary<int, List<int>> sharedUseCountItemDict { get; set; }
     // bool isUpdatePlayerLv = false;
     bool isItemChange = false;  //寤惰繜澶勭悊鐗╁搧鍙樺寲
@@ -105,7 +101,6 @@
     {
         GlobalTimeEvent.Instance.secondEvent -= UpdateSecond;
         // PlayerDatas.Instance.playerDataRefreshEvent -= UpdatePlayerLv;
-        LocalSave.DeleteKey(RecordKnapsackTitle);
         playerPackDict.Clear();
         itemDayUseCntDict.Clear();
         itemSumUseCntDict.Clear();
@@ -117,17 +112,7 @@
 
     public void OnPlayerLoginOk()
     {
-        //ItemOperateUtility.Instance.RequestWarehouseData();
-        RoleEquipLocalSave = StringUtility.Contact("RoleEquipLocalSave", PlayerDatas.Instance.baseData.PlayerID);
-        StrengthAttrShift_RecordKey = StringUtility.Contact(PlayerDatas.Instance.baseData.PlayerID, "StrengthAttrShift");
-        if (LocalSave.GetIntArray(RoleEquipLocalSave) != null)
-        {
-            LocalSavePlaceArray = LocalSave.GetIntArray(RoleEquipLocalSave).ToList();
-        }
-        else
-        {
-            LocalSavePlaceArray = null;
-        }
+
         GlobalTimeEvent.Instance.secondEvent += UpdateSecond;
         // PlayerDatas.Instance.playerDataRefreshEvent += UpdatePlayerLv;
         // isUpdatePlayerLv = true;
diff --git a/Main/System/Main/AutoFightModel.cs b/Main/System/Main/AutoFightModel.cs
index 27b651a..b3bf9e9 100644
--- a/Main/System/Main/AutoFightModel.cs
+++ b/Main/System/Main/AutoFightModel.cs
@@ -88,14 +88,16 @@
     public int maxCost; //鏈�楂樻秷鑰�
     public int[] autoCostWithBlessLV; //鑷姩鎴樻枟娑堣�楀�嶆暟鍏宠仈绁濈绛夌骇
     public int speed2UnlockMissionID;
-    public int speed3UnlockCTGID;
-    
+
     public override void Init()
     {
         ParseConfig();
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerInit;
         BattleManager.Instance.onBattleFieldCreate += OnCreateBattleField;
         EventBroadcast.Instance.AddListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
+        BlessLVManager.Instance.OnBlessLVUpdateEvent += UpdateRedpint;
+        TaskManager.Instance.OnTaskUpdate += OnTaskUpdate;
+        InvestModel.Instance.onInvestUpdate += OnInvestUpdate;
 
     }
 
@@ -104,6 +106,9 @@
         BattleManager.Instance.onBattleFieldCreate -= OnCreateBattleField;
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerInit;
         EventBroadcast.Instance.RemoveListener<string, SkillConfig, TeamHero>(EventName.BATTLE_CAST_SKILL, OnSkillCast);
+        BlessLVManager.Instance.OnBlessLVUpdateEvent -= UpdateRedpint;
+        TaskManager.Instance.OnTaskUpdate -= OnTaskUpdate;
+        InvestModel.Instance.onInvestUpdate -= OnInvestUpdate;
 
     }
 
@@ -112,7 +117,6 @@
         var config = FuncConfigConfig.Get("AutoGuaji");
         autoCostWithBlessLV = JsonMapper.ToObject<int[]>(config.Numerical1);
         speed2UnlockMissionID = int.Parse(config.Numerical2);
-        speed3UnlockCTGID = int.Parse(config.Numerical3);
         maxCost = autoCostWithBlessLV.Length;
     }
 
@@ -263,5 +267,92 @@
 
     #endregion
 
+    //鏂板娑堣�楀�嶆暟绾㈢偣
+    Redpoint redpoint1 = new Redpoint(MainRedDot.RedPoint_AutoBattleKey, MainRedDot.RedPoint_AutoBattleKey * 10 + 1);
+    //鏂板鎴樻枟鍊嶆暟绾㈢偣
+    Redpoint redpoint2 = new Redpoint(MainRedDot.RedPoint_AutoBattleKey, MainRedDot.RedPoint_AutoBattleKey * 10 + 2);
+    void UpdateRedpint()
+    {
+        //鎻愮ず绾㈢偣璁板綍鍒扮鍑犱釜绱㈠紩锛屾瘡娆¤В閿佹柊鐨勬秷鑰楃孩鐐归兘鎻愮ず
+        var costIndex = LocalSave.GetInt("redcost" + PlayerDatas.Instance.baseData.PlayerID);
+        if (costIndex + 1 < autoCostWithBlessLV.Length)
+        {
+            redpoint1.state = autoCostWithBlessLV[Math.Min(costIndex + 1, autoCostWithBlessLV.Length - 1)] <= BlessLVManager.Instance.m_TreeLV ?
+                                RedPointState.Simple : RedPointState.None;
+        }
+        else
+        {
+            redpoint1.state = RedPointState.None;
+        }
 
+        var speedIndex = LocalSave.GetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID);
+        redpoint2.state = RedPointState.None;
+        if (speedIndex == 0 && TaskManager.Instance.mainTask.TaskID > speed2UnlockMissionID &&
+            !InvestModel.Instance.IsActiveFightSpeed(3))
+        {
+            redpoint2.state = RedPointState.Simple;
+        }
+        else if (speedIndex < 2 && InvestModel.Instance.IsActiveFightSpeed(3))
+        {
+            redpoint2.state = RedPointState.Simple;
+        }
+    }
+
+    public void ClickCostRed()
+    {
+        int index = 0;
+        for (int i = 0; i < autoCostWithBlessLV.Length; i++)
+        {
+            if (autoCostWithBlessLV[i] <= BlessLVManager.Instance.m_TreeLV)
+            {
+                index = i;
+            }
+            else
+            {
+                break;
+            }
+        }
+        LocalSave.SetInt("redcost" + PlayerDatas.Instance.baseData.PlayerID, index);
+        UpdateRedpint();
+    }
+
+    public void ClickSpeedRed()
+    {
+        int index = 0;
+        if (!InvestModel.Instance.IsActiveFightSpeed(3))
+        {
+            if (TaskManager.Instance.mainTask.TaskID > speed2UnlockMissionID)
+            {
+                index = 1;
+            }
+        }
+        else
+        {
+            index = 2;
+        }
+        LocalSave.SetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID, index);
+        UpdateRedpint();
+
+    }
+
+    void OnTaskUpdate()
+    {
+        //浠诲姟鍒锋柊姣旇緝棰戠箒
+        if (TaskManager.Instance.mainTask.TaskID < speed2UnlockMissionID)
+        {
+            return;
+        }
+        if (LocalSave.GetInt("redspeed" + PlayerDatas.Instance.baseData.PlayerID) > 0)
+            return;
+        if (redpoint2.state == RedPointState.Simple)
+            return;
+        UpdateRedpint();
+    }
+
+    void OnInvestUpdate(int type)
+    {
+        if (type > 2)
+            return;
+        UpdateRedpint();
+    }
 }
diff --git a/Main/System/Main/AutoFightWin.cs b/Main/System/Main/AutoFightWin.cs
index ab08e19..4971fbf 100644
--- a/Main/System/Main/AutoFightWin.cs
+++ b/Main/System/Main/AutoFightWin.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -38,12 +39,14 @@
             isOpenCostScroll = !isOpenCostScroll;
             costScroll.SetActive(isOpenCostScroll);
             costArrow.transform.localRotation = Quaternion.Euler(0, 0, isOpenCostScroll ? 180 : 0);
+            AutoFightModel.Instance.ClickCostRed();
         });
         changeSpeedBtn.AddListener(() =>
         {
             isOpenSpeedScroll = !isOpenSpeedScroll;
             speedScroll.SetActive(isOpenSpeedScroll);
             speedArrow.transform.localRotation = Quaternion.Euler(0, 0, isOpenSpeedScroll ? 180 : 0);
+            AutoFightModel.Instance.ClickSpeedRed();
         });
 
         betterEquipToggle.AddListener((bool value) =>
@@ -115,6 +118,10 @@
             costScroll.AddCell(ScrollerDataType.Header, i + 1);
         }
         costScroll.Restart();
+        if (BlessLVManager.Instance.m_TreeLV >= AutoFightModel.Instance.autoCostWithBlessLV[Math.Min(AutoFightModel.Instance.autoCostWithBlessLV.Length - 1, 2)])
+        {
+            costScroll.JumpIndex(2);
+        }
     }
     
     void CreateSpeedScroll()
@@ -166,19 +173,14 @@
     {
         var btn = cell.GetComponent<Button>();
         var needtaskCount = TaskManager.Instance.GetNeedFinishTaskCount(AutoFightModel.Instance.speed2UnlockMissionID);
-        RechargeCount _rechargeCount;
-        bool isbuy = false;
-        if (RechargeManager.Instance.TryGetRechargeCount(AutoFightModel.Instance.speed3UnlockCTGID, out _rechargeCount))
-        {
-            isbuy = _rechargeCount.totalCount > 0;
-        }
- 
+        bool isbuy = InvestModel.Instance.IsActiveFightSpeed(3);
+        bool isActiveSpeed2 = needtaskCount <= 0 || isbuy;
  
         btn.AddListener(() =>
         {
             if (cell.index == 2)
             {
-                if (needtaskCount > 0)
+                if (!isActiveSpeed2)
                 {
                     SysNotifyMgr.Instance.ShowTip("autofight2", needtaskCount);
                     return;
@@ -201,7 +203,7 @@
         var cntText = cell.GetComponentInChildren<Text>();
         if (cell.index == 2)
         {
-            cntText.text = UIHelper.AppendColor(needtaskCount > 0 ? TextColType.Gray : TextColType.LightWhite, cell.index.ToString());
+            cntText.text = UIHelper.AppendColor(!isActiveSpeed2 ? TextColType.Gray : TextColType.LightWhite, cell.index.ToString());
         }
         else if (cell.index == 3)
         {
diff --git a/Main/System/Main/RightFuncInHome.cs b/Main/System/Main/RightFuncInHome.cs
index 156b5a6..93f0490 100644
--- a/Main/System/Main/RightFuncInHome.cs
+++ b/Main/System/Main/RightFuncInHome.cs
@@ -26,8 +26,8 @@
         monthCardBtn.AddListener(() =>
         {
             //鐢ㄤ簬鐩戝惉鐣岄潰锛屾墦寮�鏃剁缉杩涘彸杈瑰姛鑳芥爮锛屽叧闂椂鏄剧ず
-            // ListenWindow("");
-            InvestModel.Instance.BuyInvest(InvestModel.monthCardType);
+            ListenWindow("PrivilegeCardWin");
+            UIManager.Instance.OpenWindow<PrivilegeCardWin>();
         });
         storeBtn.AddListener(() =>
         {
@@ -88,7 +88,7 @@
         battlePassBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.BattlePass));
         llmjBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.LLMJ));
         signBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.DaySign));
-        // monthCardBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.MonthCard));
+        monthCardBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.PrivilegeCard));
     }
 
 
diff --git a/Main/System/Recharge/PrivilegeActiveCardWin.cs b/Main/System/Recharge/PrivilegeActiveCardWin.cs
new file mode 100644
index 0000000..8046174
--- /dev/null
+++ b/Main/System/Recharge/PrivilegeActiveCardWin.cs
@@ -0,0 +1,49 @@
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+using UnityEngine.UI;
+
+//鐗规潈鍗℃縺娲绘垚鍔�
+public class PrivilegeActiveCardWin : UIBase
+{
+    [SerializeField] Transform[] tqLines;
+    [SerializeField] Text[] tqTexts;
+
+    [SerializeField] RectTransform bg;
+
+
+    protected override void OnPreOpen()
+    {
+        if (functionOrder == 0)
+            return;
+        int type = functionOrder;
+        var lines = InvestModel.Instance.GetPrivilegeLins(type);
+        for (int i = 0; i < tqLines.Length; i++)
+        {
+            if (i < lines)
+            {
+                tqLines[i].SetActive(true);
+                tqTexts[i].text = Language.Get($"PrivilegeCard{type}_{i + 1}");
+            }
+            else
+            {
+                tqLines[i].SetActive(false);
+            }
+        }
+    }
+
+    protected override void NextFrameAfterOpen()
+    {
+        ForceRefreshLayout().Forget();
+    }
+    
+    /// <summary>
+    /// 寮哄埗鍒锋柊Layout锛岃В鍐冲祵濂桳ayout鍜孋ontentSizeFitter鐨勯噸鍙犻棶棰�
+    /// </summary>
+    async UniTask ForceRefreshLayout()
+    {
+        LayoutRebuilder.ForceRebuildLayoutImmediate(bg);
+        await UniTask.DelayFrame(2);
+        LayoutRebuilder.ForceRebuildLayoutImmediate(bg);
+    }
+}
diff --git a/Main/System/Recharge/PrivilegeActiveCardWin.cs.meta b/Main/System/Recharge/PrivilegeActiveCardWin.cs.meta
new file mode 100644
index 0000000..843864a
--- /dev/null
+++ b/Main/System/Recharge/PrivilegeActiveCardWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 056b3f69baabf6b418cdcd0705c849a2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Recharge/PrivilegeCardCell.cs b/Main/System/Recharge/PrivilegeCardCell.cs
new file mode 100644
index 0000000..3daacc2
--- /dev/null
+++ b/Main/System/Recharge/PrivilegeCardCell.cs
@@ -0,0 +1,145 @@
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+//鐗规潈鍗�
+public class PrivilegeCardCell : MonoBehaviour
+{
+    [SerializeField] Transform[] tqLines;
+    [SerializeField] Text[] tqTexts;
+    [SerializeField] ItemCell[] itemCells;
+    [SerializeField] ItemCell[] dayItemCells;
+    [SerializeField] Text timeText;
+    [SerializeField] Button opBtn;
+    [SerializeField] Text opBtnText;
+
+
+
+    public void Display(int type)
+    {
+        var lines = InvestModel.Instance.GetPrivilegeLins(type);
+        for (int i = 0; i < tqLines.Length; i++)
+        {
+            if (i < lines)
+            {
+                tqLines[i].SetActive(true);
+                tqTexts[i].text = Language.Get($"PrivilegeCard{type}_{i+1}");
+            }
+            else
+            {
+                tqLines[i].SetActive(false);
+            }
+        }
+
+        var ctgID = InvestModel.Instance.GetCTGID(type);
+        var ctgConfig = CTGConfig.Get(ctgID);
+        for (int i = 0; i < itemCells.Length; i++)
+        {
+            if (i < ctgConfig.GainItemList.Length)
+            {
+                itemCells[i].SetActive(true);
+                int itemID = ctgConfig.GainItemList[i][0];
+                itemCells[i].Init(new ItemCellModel(itemID, false, ctgConfig.GainItemList[i][1]));
+                itemCells[i].button.AddListener(() =>
+                {
+                    ItemTipUtility.Show(itemID);
+                });
+            }
+            else
+            {
+                itemCells[i].SetActive(false);
+            }
+        }
+
+        var dayAwards = InvestModel.Instance.GetDayAwards(type);
+        for (int i = 0; i < dayItemCells.Length; i++)
+        {
+            if (i < dayAwards.Length)
+            {
+                dayItemCells[i].SetActive(true);
+                int itemID = dayAwards[i][0];
+                dayItemCells[i].Init(new ItemCellModel(itemID, false, dayAwards[i][1]));
+                dayItemCells[i].button.AddListener(() =>
+                {
+                    ItemTipUtility.Show(itemID);
+                });
+            }
+            else
+            {
+                dayItemCells[i].SetActive(false);
+            }
+        }
+
+        var state = InvestModel.Instance.GetInvestState(type);
+
+        if (timeText != null)
+        {
+            if (state == 0)
+            {
+                timeText.text = "";
+            }
+            else
+            {
+                timeText.text = Language.Get("GoldRush29") + TimeUtility.SecondsToShortDHMS(InvestModel.Instance.GetInvestLeftTime(type));
+            }   
+        }
+
+        if (state == 0)
+        {
+            var orderInfo = InvestModel.Instance.GetOrderInfo(type);
+            opBtnText.text = Language.Get("PayMoneyNum", orderInfo.PayRMBNumOnSale);
+            opBtn.SetInteractable(true);
+            opBtn.AddListener(() =>
+            {
+                RechargeManager.Instance.CTG(ctgID);
+            });
+        }
+        else if (state == 1)
+        {
+            opBtnText.text = Language.Get("Mail09");
+            opBtn.SetInteractable(true);
+            opBtn.AddListener(() =>
+            {
+                InvestModel.Instance.SendGetReward(type);
+            });
+        }
+        else
+        {
+            if (type == 1)
+            {            
+                var orderInfo = InvestModel.Instance.GetOrderInfo(type);
+                opBtnText.text = Language.Get("PayMore", orderInfo.PayRMBNumOnSale);
+                opBtn.SetInteractable(true);
+                opBtn.AddListener(() =>
+                {
+                    if (InvestModel.Instance.IsBuyMaxDay(type))
+                    {
+                        SysNotifyMgr.Instance.ShowTip("BuyIsMax");
+                        return;
+                    }
+                    RechargeManager.Instance.CTG(ctgID);
+                });
+            }
+            else
+            {
+                opBtn.SetInteractable(false);
+                opBtnText.text = Language.Get("L1129_2");
+            }            
+        }
+    }
+
+
+    public void UpdateTime(int type)
+    {
+        var state = InvestModel.Instance.GetInvestState(type);
+        if (state == 0)
+        {
+            return;
+        }
+        if (timeText != null)
+        {
+            timeText.text = Language.Get("GoldRush29") + TimeUtility.SecondsToShortDHMS(InvestModel.Instance.GetInvestLeftTime(type));
+        }
+    }
+
+}
diff --git a/Main/System/Recharge/PrivilegeCardCell.cs.meta b/Main/System/Recharge/PrivilegeCardCell.cs.meta
new file mode 100644
index 0000000..7e75322
--- /dev/null
+++ b/Main/System/Recharge/PrivilegeCardCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c8b475974a10df4408f0ffd29402e7e9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Recharge/PrivilegeCardWin.cs b/Main/System/Recharge/PrivilegeCardWin.cs
index 16606a1..96fde90 100644
--- a/Main/System/Recharge/PrivilegeCardWin.cs
+++ b/Main/System/Recharge/PrivilegeCardWin.cs
@@ -5,129 +5,36 @@
 //鐗规潈鍗�
 public class PrivilegeCardWin : UIBase
 {
-
-    [SerializeField] GroupButtonEx djqBtn;
-    [SerializeField] GroupButtonEx goldBtn;
-
-    [SerializeField] ScrollerController djqScroller;
-    [SerializeField] ScrollerController goldScroller;
-    [SerializeField] Transform djqInfo;
-
-    List<int> _list = new List<int>();
-    protected override void InitComponent()
-    {
-        djqBtn.AddListener(() => { OnSelectFuncType(0); });
-        goldBtn.AddListener(() => { OnSelectFuncType(1); });
-    }
+    //鏈堝崱
+    [SerializeField] PrivilegeCardCell monthObj;
+    [SerializeField] PrivilegeCardCell foreverObj;
 
 
     protected override void OnPreOpen()
     {
-        djqScroller.OnRefreshCell += OnDjqRefreshCell;
-        goldScroller.OnRefreshCell += OnGoldRefreshCell;
-        RechargeManager.Instance.rechargeCountEvent += RechargeEvent;
-        
-        if (RechargeManager.Instance.selectTabIndex == 0)
-        {
-            djqBtn.SelectBtn();
-        }
-        else if (RechargeManager.Instance.selectTabIndex == 1)
-        {
-            goldBtn.SelectBtn();
-        }
-
-        Display();
+        InvestModel.Instance.onInvestUpdate += OnInvestUpdate;
+        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
+        monthObj.Display(1);
+        foreverObj.Display(2);
     }
 
     protected override void OnPreClose()
     {
-        djqScroller.OnRefreshCell -= OnDjqRefreshCell;
-        goldScroller.OnRefreshCell -= OnGoldRefreshCell;
-        RechargeManager.Instance.rechargeCountEvent -= RechargeEvent;
-    }
+        InvestModel.Instance.onInvestUpdate -= OnInvestUpdate;
+        GlobalTimeEvent.Instance.secondEvent += OnSecondEvent;
 
-    void RechargeEvent(int id)
-    {
-        Display();
-    }
-
-    void Display()
-    {
-        CreateScroller();
-    }
-
-
-    void CreateScroller()
-    {
-        if (RechargeManager.Instance.selectTabIndex == 0)
-        {
-            _list = RechargeManager.Instance.GetCTGIDListByType(17);
-            djqScroller.SetActive(true);
-            djqInfo.SetActive(true);
-            goldScroller.SetActive(false);
-            if (djqScroller.GetCellTotalCount() == 0)
-            {
-                djqScroller.Refresh();
-                for (int i = 0; i < _list.Count; i++)
-                {
-                    if (i % 3 == 0)
-                    {
-                        djqScroller.AddCell(ScrollerDataType.Header,i);
-                    }
-                }
-                djqScroller.Restart();
-            }
-            else
-            {
-                djqScroller.m_Scorller.RefreshActiveCellViews();
-            }
-        }
-        else if (RechargeManager.Instance.selectTabIndex == 1)
-        {
-            _list = RechargeManager.Instance.GetCTGIDListByType(2);
-            djqScroller.SetActive(false);
-            djqInfo.SetActive(false);
-            goldScroller.SetActive(true);
-
-            if (goldScroller.GetCellTotalCount() == 0)
-            {
-                goldScroller.Refresh();
-                for (int i = 0; i < _list.Count; i++)
-                {
-                    if (i % 3 == 0)
-                    {
-                        goldScroller.AddCell(ScrollerDataType.Header, i);
-                    }
-                }
-                goldScroller.Restart();
-            }
-            else
-            {
-                goldScroller.m_Scorller.RefreshActiveCellViews();
-            }
-        }
-    }
-
-
-    void OnDjqRefreshCell(ScrollerDataType type, CellView cell)
-    {
-        var _cell = cell as RechargeDJQLineCell;
-        _cell.Display(cell.index, _list);
-    }
-
-    void OnGoldRefreshCell(ScrollerDataType type, CellView cell)
-    {
-        var _cell = cell as RechargeGoldLineCell;
-        _cell.Display(cell.index, _list);
     }
 
 
 
-
-    void OnSelectFuncType(int index)
+    void OnInvestUpdate(int type)
     {
+        monthObj.Display(1);
+        foreverObj.Display(2);
+    }
 
-        RechargeManager.Instance.selectTabIndex = index;
-        Display();
+    void OnSecondEvent()
+    {
+        monthObj.UpdateTime(1);
     }
 }
diff --git a/Main/System/Recharge/RechargeManager.cs b/Main/System/Recharge/RechargeManager.cs
index 99d840c..860d6f1 100644
--- a/Main/System/Recharge/RechargeManager.cs
+++ b/Main/System/Recharge/RechargeManager.cs
@@ -107,8 +107,8 @@
 
     #region 閰嶇疆
     private static string[] lineSplit = new string[] { "</r>" };
-    private int m_CTGDelayTime = 1;   // 鍏呭�肩殑鍏叡闂撮殧锛岃閰嶇疆ChargeDelayTime
-    private int m_CTGLimitDelayTime = 1; // 闄愯喘鍟嗗搧鐨勫厖鍊奸棿闅旓紝瑙侀厤缃瓹hargeDelayTime
+    private int m_CTGDelayTime = 0;   // 鍏呭�肩殑鍏叡闂撮殧锛岃閰嶇疆ChargeDelayTime
+    private int m_CTGLimitDelayTime = 0; // 闄愯喘鍟嗗搧鐨勫厖鍊奸棿闅旓紝瑙侀厤缃瓹hargeDelayTime
 
     //澶氬�嶅浘鐗�
     public Dictionary<int, string> MultiRechageImageDict = new Dictionary<int, string>();
diff --git a/Main/System/Redpoint/MainRedDot.cs b/Main/System/Redpoint/MainRedDot.cs
index 4648c11..de318a3 100644
--- a/Main/System/Redpoint/MainRedDot.cs
+++ b/Main/System/Redpoint/MainRedDot.cs
@@ -58,9 +58,17 @@
     
     //绛惧埌
     public const int RedPoint_SignKey = 107;
-    
+
     //鍧愰獞
     public const int RedPoint_HorseKey = 108;
+    //鐗规潈鍗�
+    public const int RedPoint_PrivilegeCard = 109;
+    Redpoint pcardRedpoint = new Redpoint(RedPoint_PrivilegeCard);
+    
+    //鑷姩鎴樻枟
+    public const int RedPoint_AutoBattleKey = 110;
+    Redpoint autoBattleRedpoint = new Redpoint(RedPoint_AutoBattleKey);
+
     
     //姝﹀皢鍗�
     public const int HeroCardRedpoint = 200;
diff --git a/Main/System/TianziBillborad/TianziBillboradManager.cs b/Main/System/TianziBillborad/TianziBillboradManager.cs
index cd29526..bfb9910 100644
--- a/Main/System/TianziBillborad/TianziBillboradManager.cs
+++ b/Main/System/TianziBillborad/TianziBillboradManager.cs
@@ -22,7 +22,7 @@
         EventBroadcast.Instance.AddListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
         EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnSettlement);
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
-        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChangeEvent;
+        DungeonManager.Instance.UpdateFBInfoListEvent += OnUpdateFBInfoChangeEvent;
         AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
         TimeMgr.Instance.OnDayEvent += OnDayEvent;
@@ -37,7 +37,7 @@
         EventBroadcast.Instance.RemoveListener<BattleDmgInfo>(EventName.BATTLE_DAMAGE_TAKEN, OnDamageTaken);
         EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnSettlement);
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
-        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
+        DungeonManager.Instance.UpdateFBInfoListEvent -= OnUpdateFBInfoChangeEvent;
         AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
         TimeMgr.Instance.OnDayEvent -= OnDayEvent;
@@ -148,17 +148,16 @@
         UpdateRedPoint();
     }
 
-    private void OnUpdateFBInfoChangeEvent(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange)
+    private void OnUpdateFBInfoChangeEvent(int mapID)
     {
         int dataMapID = DataMapID;
         if (mapID != dataMapID)
             return;
-        if (isADAddCntChange)
-            return;
+
         UpdateRedPoint();
     }
 
-    private void OnAdsInfoListUpdateEvent(int id, int mapId)
+    private void OnAdsInfoListUpdateEvent(int id, int type, int mapId)
     {
         if (mapId != DataMapID)
             return;
@@ -209,12 +208,11 @@
         }
         return res;
     }
+
     public bool TryGetADAwardConfigByMapId(int dataMapID, out ADAwardConfig adAwardConfig)
     {
-        adAwardConfig = null;
-        if (!ADAwardConfig.TryGetADIDByADMapID(dataMapID, out int adID) || !ADAwardConfig.HasKey(adID))
+        if (!ADAwardConfig.TryGetADIDByTypeValue(2, dataMapID, out adAwardConfig))
             return false;
-        adAwardConfig = ADAwardConfig.Get(adID);
         return true;
     }
 
diff --git a/Main/System/TianziBillborad/TianziBillboradWin.cs b/Main/System/TianziBillborad/TianziBillboradWin.cs
index e69ed39..c8943c1 100644
--- a/Main/System/TianziBillborad/TianziBillboradWin.cs
+++ b/Main/System/TianziBillborad/TianziBillboradWin.cs
@@ -123,7 +123,7 @@
         Display();
     }
 
-    private void OnAdsInfoListUpdateEvent(int id, int mapId)
+    private void OnAdsInfoListUpdateEvent(int id, int type, int mapId)
     {
         if (mapId != model.DataMapID)
             return;

--
Gitblit v1.8.0