From 68ceec72d78d328f9eaa05fce40caf99fe333ba1 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期六, 11 十月 2025 19:21:30 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/BoneField/AdsManager.cs                                                         |   70 ++
 Main/System/BoneField/AdsManager.cs.meta                                                    |    2 
 Main/System/Redpoint/MainRedDot.cs                                                          |    2 
 Main/Component/UI/Common/FuncOpen.cs                                                        |   53 +
 Main/Component/UI/Common/PopupWindowsProcessor.cs                                           |    4 
 Main/System/BoneField/BoneFieldManager.cs.meta                                              |    2 
 Main/System/Battle/BattleField/StoryBoneBattleField.cs                                      |  124 +++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs       |    2 
 Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA722_tagSCADInfoList.cs.meta           |    2 
 Main/System/Dungeon/DungeonManager.cs.meta                                                  |    0 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagSCFBInfoList.cs.meta    |    2 
 Main/Config/Configs/ADAwardConfig.cs                                                        |   47 +
 Main/Config/Configs/DungeonOpenTimeConfig.cs                                                |   65 +
 Main/System/Tip/ConfirmCancel.cs                                                            |    1 
 Main/System/FirstCharge/FirstChargeManager.cs                                               |   43 
 Main/Config/Configs/DungeonConfig.cs.meta                                                   |    2 
 Main/Config/PartialConfigs/ADAwardConfig.cs.meta                                            |    2 
 Main/Manager/UIManager.cs                                                                   |   28 
 Main/System/ChallengeTab/ChallengeTabWin.cs.meta                                            |    2 
 Main/System/BoneField/BoneFieldWin.cs                                                       |  268 +++++++
 Main/Config/Configs/GuideConfig.cs                                                          |    5 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagSCFBInfoList.cs.meta              |    2 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagSCFBInfoList.cs         |   13 
 Main/Core/NetworkPackage/ClientPack/CA5_Function/CA505_tagCMBeginFBWipeOut.cs               |   24 
 Main/System/BoneField/BoneFieldChallengeButton.cs.meta                                      |    2 
 Main/System/ChallengeTab.meta                                                               |    8 
 Main/System/NewBieGuidance/NewBieCenter.cs                                                  |  197 ++++-
 Main/System/NewBieGuidance/NewBieWin.cs                                                     |   15 
 Main/System/Equip/EquipModel.cs                                                             |    5 
 Main/Core/NetworkPackage/ClientPack/CA5_Function/CA575_tagCMBuyEnterCount.cs.meta           |    2 
 Main/Config/ConfigManager.cs                                                                |    9 
 Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0320_tagFBEnd.cs                     |   19 
 Main/Core/NetworkPackage/ClientPack/CA5_Function/CA505_tagCMBeginFBWipeOut.cs.meta          |    2 
 Main/System/Mail/MailManager.cs                                                             |   14 
 Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagSCFBInfoList.cs                   |   41 +
 Main/System/BoneField/BoneFieldWin.cs.meta                                                  |    2 
 Main/Config/PartialConfigs/ADAwardConfig.cs                                                 |   13 
 Main/System/Battle/BattleField/BattleField.cs                                               |   31 
 Main/System/Battle/BattleFieldFactory.cs                                                    |   15 
 Main/System/BoneField/BoneFieldManager.cs                                                   |  200 +++++
 Main/Config/PartialConfigs/DungeonConfig.cs                                                 |   25 
 Main/Main.cs                                                                                |    7 
 Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA722_tagSCADInfoList.cs                |   29 
 Main/System/ChallengeTab/ChallengeTabButton.cs                                              |   35 +
 Main/System/BoneField.meta                                                                  |    8 
 Main/System/BoneField/BoneFieldChallengeButton.cs                                           |   55 +
 Main/System/Equip/EquipExchangeWin.cs                                                       |    2 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA722_tagSCADInfoList.cs.meta |    2 
 Main/Config/PartialConfigs/DungeonConfig.cs.meta                                            |    2 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA722_tagSCADInfoList.cs      |   13 
 Main/System/Dungeon/DungeonManager.cs                                                       |  108 +++
 Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs           |   12 
 Main/Config/Configs/ADAwardConfig.cs.meta                                                   |    2 
 Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0320_tagFBEnd.cs.meta                |    2 
 Main/System/ChallengeTab/ChallengeTabWin.cs                                                 |   92 ++
 Main/Core/NetworkPackage/ClientPack/CA5_Function/CA575_tagCMBuyEnterCount.cs                |   18 
 Main/System/Dungeon/DungeonData.cs                                                          |   76 +-
 /dev/null                                                                                   |   71 --
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                        |    5 
 Main/Component/UI/Decorate/Graph/CircleHollowImage.cs                                       |    9 
 Main/Config/Configs/DungeonConfig.cs                                                        |   77 ++
 Main/System/Main/MainWin.cs                                                                 |    9 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs.meta      |    2 
 Main/System/Battle/BattleField/StoryBoneBattleField.cs.meta                                 |    2 
 Main/System/ChallengeTab/ChallengeTabButton.cs.meta                                         |    2 
 Main/Config/Configs/DungeonOpenTimeConfig.cs.meta                                           |    2 
 66 files changed, 1,759 insertions(+), 248 deletions(-)

diff --git a/Main/Component/UI/Common/FuncOpen.cs b/Main/Component/UI/Common/FuncOpen.cs
index 84ddee8..15dd64a 100644
--- a/Main/Component/UI/Common/FuncOpen.cs
+++ b/Main/Component/UI/Common/FuncOpen.cs
@@ -220,6 +220,59 @@
         }
     }
 
+
+    public string GetErrorTip(int key)
+    {
+        if (!FuncOpenLVConfig.HasKey(key))
+            return string.Empty;
+        FuncOpenLVConfig config = FuncOpenLVConfig.Get(key);
+        if (!IsFuncOpen(key, out int errorCode))
+        {
+            switch (errorCode)
+            {
+                case 1:
+                    return StringUtility.Contact(
+                        Language.Get("FuncLimit_Level", config.LimitLV),
+                        Language.Get("FuncLimitOpen1"));
+                case 2:
+                    //寮�鏈嶅灏戝ぉ 涓�鑸槸缁勫悎
+                    if (config.LimitLV != 0)
+                    {
+                        return StringUtility.Contact(
+                            Language.Get("FuncLimit_OpenDay", config.OpenDay),
+                            Language.Get("FuncLimitOpen2"),
+                        Language.Get("FuncLimit_Level", config.LimitLV),
+                        Language.Get("FuncLimitOpen1"));
+
+                    }
+                    else if (config.LimitMissionID != 0)
+                    {
+                        return StringUtility.Contact(
+                            Language.Get("FuncLimit_OpenDay", config.OpenDay),
+                            Language.Get("FuncLimitOpen2"),
+                        Language.Get("FuncLimit_Mission",
+                        TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID)),
+                        Language.Get("FuncLimitOpen1"));
+                    }
+                    else
+                    {
+                        return StringUtility.Contact(
+                            Language.Get("FuncLimit_OpenDay", config.OpenDay),
+                            Language.Get("FuncLimitOpen1"));
+                    }
+                case 3:
+                    return StringUtility.Contact(
+                            Language.Get("FuncLimit_Realm", RealmConfig.Get(config.LimiRealmLV).Name),
+                            Language.Get("FuncLimitOpen1"));
+                case 4:
+                    return StringUtility.Contact(
+                            Language.Get("FuncLimit_Mission", TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID)),
+                            Language.Get("FuncLimitOpen1"));
+            }
+        }
+        return string.Empty;
+    }
+
     public int GetLimitLv(int key)
     {
         // FuncOpenLVConfig tagFuncOpenLVModel = FuncOpenLVConfig.Get(key);
diff --git a/Main/Component/UI/Common/PopupWindowsProcessor.cs b/Main/Component/UI/Common/PopupWindowsProcessor.cs
index 480b430..413d3be 100644
--- a/Main/Component/UI/Common/PopupWindowsProcessor.cs
+++ b/Main/Component/UI/Common/PopupWindowsProcessor.cs
@@ -95,12 +95,16 @@
         if (!UIManager.Instance.IsOpened<HomeWin>())
             return;
 
+
         if (UIManager.Instance.IsOpened(popupWindowQueue[0].window))
         {
             //褰撳墠妯″紡鍙互鎵撳紑澶氫釜鐩稿悓绐楀彛锛屽鍔犻槻鑼�
             return;
         }
 
+        if (UIManager.Instance.ExistAnyFullScreenOrMaskWin(popupWindowQueue[0].window))
+            return;
+
         if (currentWindow.window != null)
         {
             //鍒ゆ柇涓婁竴涓帹閫佹槸鍚﹀叧闂�
diff --git a/Main/Component/UI/Decorate/Graph/CircleHollowImage.cs b/Main/Component/UI/Decorate/Graph/CircleHollowImage.cs
index f2e1b7f..012f902 100644
--- a/Main/Component/UI/Decorate/Graph/CircleHollowImage.cs
+++ b/Main/Component/UI/Decorate/Graph/CircleHollowImage.cs
@@ -58,13 +58,14 @@
 
         var width = image.rectTransform.rect.width;
         var height = image.rectTransform.rect.height;
-        var outerArea = new Vector2(0.5f * width,0.5f * height);
+        var outerArea = new Vector2(0.5f * width, 0.5f * height);
 
-        var realCenter = new Vector2(Mathf.Clamp(center.x,-width * 0.5f + cell.x,width * 0.5f - cell.x),
-            Mathf.Clamp(center.y,-height * 0.5f + cell.y,height * 0.5f - cell.y));
+        // var realCenter = new Vector2(Mathf.Clamp(center.x,-width * 0.5f + cell.x,width * 0.5f - cell.x),
+        //     Mathf.Clamp(center.y,-height * 0.5f + cell.y,height * 0.5f - cell.y));
+        
+        var realCenter = center;
 
         var uv = image.overrideSprite != null ? DataUtility.GetOuterUV(image.overrideSprite) : Vector4.zero;
-
         var uvCenterX = (uv.x + uv.z) * 0.5f;
         var uvCenterY = (uv.y + uv.w) * 0.5f;
         var uvScaleX = (uv.z - uv.x) / width;
diff --git a/Main/Config/ConfigManager.cs b/Main/Config/ConfigManager.cs
index 96b0275..11a4bcf 100644
--- a/Main/Config/ConfigManager.cs
+++ b/Main/Config/ConfigManager.cs
@@ -38,10 +38,13 @@
 
         // 鍔犺浇閰嶇疆鏂囦欢
         HashSet<Type> configTypes = new HashSet<Type>() {
+            typeof(ADAwardConfig),
             typeof(ChestsAwardConfig),
             typeof(CTGConfig),
             typeof(DamageNumConfig),
             typeof(DirtyWordConfig),
+            typeof(DungeonConfig),
+            typeof(DungeonOpenTimeConfig),
             typeof(FaceConfig),
             typeof(FightPowerRatioConfig),
             typeof(FirstChargeConfig),
@@ -218,6 +221,8 @@
 
     public override void Release()
     {
+        // 娓呯┖ ADAwardConfig 瀛楀吀
+        ClearConfigDictionary<ADAwardConfig>();
         // 娓呯┖ ChestsAwardConfig 瀛楀吀
         ClearConfigDictionary<ChestsAwardConfig>();
         // 娓呯┖ CTGConfig 瀛楀吀
@@ -226,6 +231,10 @@
         ClearConfigDictionary<DamageNumConfig>();
         // 娓呯┖ DirtyWordConfig 瀛楀吀
         ClearConfigDictionary<DirtyWordConfig>();
+        // 娓呯┖ DungeonConfig 瀛楀吀
+        ClearConfigDictionary<DungeonConfig>();
+        // 娓呯┖ DungeonOpenTimeConfig 瀛楀吀
+        ClearConfigDictionary<DungeonOpenTimeConfig>();
         // 娓呯┖ FaceConfig 瀛楀吀
         ClearConfigDictionary<FaceConfig>();
         // 娓呯┖ FightPowerRatioConfig 瀛楀吀
diff --git a/Main/Config/Configs/ADAwardConfig.cs b/Main/Config/Configs/ADAwardConfig.cs
new file mode 100644
index 0000000..6d15479
--- /dev/null
+++ b/Main/Config/Configs/ADAwardConfig.cs
@@ -0,0 +1,47 @@
+锘�//--------------------------------------------------------
+//    [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);
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Config/Configs/ADAwardConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Config/Configs/ADAwardConfig.cs.meta
index 0ec0b24..aa1216b 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Config/Configs/ADAwardConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 58245db2532a8194bb46fcdd9c7cb783
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Config/Configs/DungeonConfig.cs b/Main/Config/Configs/DungeonConfig.cs
new file mode 100644
index 0000000..9c1aafa
--- /dev/null
+++ b/Main/Config/Configs/DungeonConfig.cs
@@ -0,0 +1,77 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           Thursday, October 9, 2025
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class DungeonConfig : ConfigBase<int, DungeonConfig>
+{
+    static DungeonConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int ID;
+	public int DataMapID;
+	public int LineID;
+	public int LVLimitMin;
+	public int[][] PassAwardList;
+	public int[][] SweepAwardList;
+	public int[] LineupIDList;
+	public int NPCLV;
+	public float Difficulty;
+	public long FightPower;
+
+    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 ID); 
+
+			int.TryParse(tables[1],out DataMapID); 
+
+			int.TryParse(tables[2],out LineID); 
+
+			int.TryParse(tables[3],out LVLimitMin); 
+
+			PassAwardList = JsonMapper.ToObject<int[][]>(tables[4].Replace("(", "[").Replace(")", "]")); 
+
+			SweepAwardList = JsonMapper.ToObject<int[][]>(tables[5].Replace("(", "[").Replace(")", "]")); 
+
+			if (tables[6].Contains("["))
+			{
+				LineupIDList = JsonMapper.ToObject<int[]>(tables[6]);
+			}
+			else
+			{
+				string[] LineupIDListStringArray = tables[6].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				LineupIDList = new int[LineupIDListStringArray.Length];
+				for (int i=0;i<LineupIDListStringArray.Length;i++)
+				{
+					 int.TryParse(LineupIDListStringArray[i],out LineupIDList[i]);
+				}
+			}
+
+			int.TryParse(tables[7],out NPCLV); 
+
+			float.TryParse(tables[8],out Difficulty); 
+
+			long.TryParse(tables[9],out FightPower); 
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Config/Configs/DungeonConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Config/Configs/DungeonConfig.cs.meta
index 0ec0b24..ecb8405 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Config/Configs/DungeonConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 9ae93b5f387064c48a7145a724c1cb1d
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Config/Configs/DungeonOpenTimeConfig.cs b/Main/Config/Configs/DungeonOpenTimeConfig.cs
new file mode 100644
index 0000000..7408a8f
--- /dev/null
+++ b/Main/Config/Configs/DungeonOpenTimeConfig.cs
@@ -0,0 +1,65 @@
+锘�//--------------------------------------------------------
+//    [Author]:           YYL
+//    [  Date ]:           2025骞�10鏈�9鏃�
+//--------------------------------------------------------
+
+using System.Collections.Generic;
+using System;
+using UnityEngine;
+using LitJson;
+
+public partial class DungeonOpenTimeConfig : ConfigBase<int, DungeonOpenTimeConfig>
+{
+    static DungeonOpenTimeConfig()
+    {
+        // 璁块棶杩囬潤鎬佹瀯閫犲嚱鏁�
+        visit = true; 
+    }
+
+    public int DataMapID;
+	public string FBName;
+	public int DayTimes;
+	public int PayCntMax;
+	public int PayMoneyType;
+	public int[] PayMoneyValues;
+
+    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 DataMapID); 
+
+			FBName = tables[1];
+
+			int.TryParse(tables[2],out DayTimes); 
+
+			int.TryParse(tables[3],out PayCntMax); 
+
+			int.TryParse(tables[4],out PayMoneyType); 
+
+			if (tables[5].Contains("["))
+			{
+				PayMoneyValues = JsonMapper.ToObject<int[]>(tables[5]);
+			}
+			else
+			{
+				string[] PayMoneyValuesStringArray = tables[5].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
+				PayMoneyValues = new int[PayMoneyValuesStringArray.Length];
+				for (int i=0;i<PayMoneyValuesStringArray.Length;i++)
+				{
+					 int.TryParse(PayMoneyValuesStringArray[i],out PayMoneyValues[i]);
+				}
+			}
+        }
+        catch (Exception exception)
+        {
+            Debug.LogError(exception);
+        }
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Config/Configs/DungeonOpenTimeConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Config/Configs/DungeonOpenTimeConfig.cs.meta
index 0ec0b24..c11dba8 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Config/Configs/DungeonOpenTimeConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 70933c16af3ce7c4e8465995422fdc20
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Config/Configs/GuideConfig.cs b/Main/Config/Configs/GuideConfig.cs
index 422390e..6ae4012 100644
--- a/Main/Config/Configs/GuideConfig.cs
+++ b/Main/Config/Configs/GuideConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�10鏈�9鏃�
+//    [  Date ]:           2025骞�10鏈�11鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -23,6 +23,7 @@
 	public string WinName;
 	public int PreGuideId;
 	public int[] Steps;
+	public int NoRecord;
 
     public override int LoadKey(string _key)
     {
@@ -59,6 +60,8 @@
 					 int.TryParse(StepsStringArray[i],out Steps[i]);
 				}
 			}
+
+			int.TryParse(tables[7],out NoRecord); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/PartialConfigs/ADAwardConfig.cs b/Main/Config/PartialConfigs/ADAwardConfig.cs
new file mode 100644
index 0000000..fb03ed8
--- /dev/null
+++ b/Main/Config/PartialConfigs/ADAwardConfig.cs
@@ -0,0 +1,13 @@
+using System.Collections.Generic;
+public partial class ADAwardConfig : ConfigBase<int, ADAwardConfig>
+{
+    private static Dictionary<int, int> idDict = new Dictionary<int, int>();
+    protected override void OnConfigParseCompleted()
+    {
+        idDict[ADMapID] = ADID;
+    }
+    public static bool TryGetADIDByADMapID(int ADMapID, out int ADID)
+    {
+        return idDict.TryGetValue(ADMapID, out ADID) && ADID > 0;
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Config/PartialConfigs/ADAwardConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Config/PartialConfigs/ADAwardConfig.cs.meta
index 0ec0b24..70bab71 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Config/PartialConfigs/ADAwardConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: d2ce6f478897b7f448e77181bfe1c30c
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Config/PartialConfigs/DungeonConfig.cs b/Main/Config/PartialConfigs/DungeonConfig.cs
new file mode 100644
index 0000000..2c1bab2
--- /dev/null
+++ b/Main/Config/PartialConfigs/DungeonConfig.cs
@@ -0,0 +1,25 @@
+
+
+using System.Collections.Generic;
+
+public partial class DungeonConfig : ConfigBase<int, DungeonConfig>
+{
+    private static Dictionary<int, Dictionary<int, int>> dungeonIndexDict = new Dictionary<int, Dictionary<int, int>>();
+    protected override void OnConfigParseCompleted()
+    {
+        if (!dungeonIndexDict.ContainsKey(DataMapID))
+            dungeonIndexDict[DataMapID] = new Dictionary<int, int>();
+        dungeonIndexDict[DataMapID][LineID] = ID;
+    }
+
+    public static bool TryGetDungeonID(int mapID, int lineID, out int dungeonID)
+    {
+        dungeonID = 0;
+        return dungeonIndexDict.TryGetValue(mapID, out var dict) && dict.TryGetValue(lineID, out dungeonID);
+    }
+
+    public static Dictionary<int, Dictionary<int, int>> GetDungeonIndexDict()
+    {
+        return dungeonIndexDict;
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Config/PartialConfigs/DungeonConfig.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Config/PartialConfigs/DungeonConfig.cs.meta
index 0ec0b24..92da8e4 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Config/PartialConfigs/DungeonConfig.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 772733fef93f97a44a533b8a0cb581d8
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA505_tagCMBeginFBWipeOut.cs b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA505_tagCMBeginFBWipeOut.cs
new file mode 100644
index 0000000..3174492
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA505_tagCMBeginFBWipeOut.cs
@@ -0,0 +1,24 @@
+using UnityEngine;
+using System.Collections;
+
+//A5 05 鐜╁寮�濮嬪壇鏈壂鑽� #tagCMBeginFBWipeOut
+
+public class CA505_tagCMBeginFBWipeOut : GameNetPackBasic {
+    public uint MapID;
+    public ushort LineID;
+    public byte Cnt;    // 鎵崱娆℃暟
+    public uint DataEx;    //闄勫甫淇℃伅
+
+    public CA505_tagCMBeginFBWipeOut () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA505;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (MapID, NetDataType.DWORD);
+        WriteBytes (LineID, NetDataType.WORD);
+        WriteBytes (Cnt, NetDataType.BYTE);
+        WriteBytes (DataEx, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA505_tagCMBeginFBWipeOut.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Core/NetworkPackage/ClientPack/CA5_Function/CA505_tagCMBeginFBWipeOut.cs.meta
index 0ec0b24..9decb0f 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA505_tagCMBeginFBWipeOut.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 84b77d2d7dc7a8a4c8b7444ad736fb32
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA575_tagCMBuyEnterCount.cs b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA575_tagCMBuyEnterCount.cs
new file mode 100644
index 0000000..c160bb9
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA575_tagCMBuyEnterCount.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+//A5 75 璐拱鍓湰杩涘叆娆℃暟#tagCMBuyEnterCount
+
+public class CA575_tagCMBuyEnterCount : GameNetPackBasic {
+    public uint FBID;    // 鍓湰ID
+
+    public CA575_tagCMBuyEnterCount () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xA575;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (FBID, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA575_tagCMBuyEnterCount.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Core/NetworkPackage/ClientPack/CA5_Function/CA575_tagCMBuyEnterCount.cs.meta
index 0ec0b24..44a3acf 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Core/NetworkPackage/ClientPack/CA5_Function/CA575_tagCMBuyEnterCount.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 7429b3dc8036bc14683b9b61fd99b5ce
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs
new file mode 100644
index 0000000..18410c3
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+//03 20 鍓湰缁撴潫鐣岄潰#tagFBEnd
+
+public class DTC0320_tagFBEnd : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        H0320_tagFBEnd vNetData = vNetPack as H0320_tagFBEnd;
+        BoneFieldManager.Instance.UpdateFBEnd(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs.meta
index 0ec0b24..ac8c6d7 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 54b386c0b723a164e91c93600ecb8711
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs
deleted file mode 100644
index 9ceefea..0000000
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs
+++ /dev/null
@@ -1,13 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-// A3 20 鐜╁鍓湰鐩稿叧淇℃伅 #tagMCPlayerFBInfoData
-
-public class DTCA320_tagMCPlayerFBInfoData : DtcBasic {
-    public override void Done(GameNetPackBasic vNetPack)
-    {
-        base.Done(vNetPack);
-        HA320_tagMCPlayerFBInfoData vNetData = vNetPack as HA320_tagMCPlayerFBInfoData;
-        DungeonModel.Instance.UpdateRecords(vNetData.FBDataList);
-    }
-}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagSCFBInfoList.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagSCFBInfoList.cs
new file mode 100644
index 0000000..9aa0cd4
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagSCFBInfoList.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 20 鐜╁鍓湰鐩稿叧淇℃伅 #tagSCFBInfoList
+
+public class DTCA320_tagSCFBInfoList : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA320_tagSCFBInfoList vNetData = vNetPack as HA320_tagSCFBInfoList;
+        DungeonManager.Instance.UpdateFBInfoList(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagSCFBInfoList.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagSCFBInfoList.cs.meta
index 0ec0b24..819a00d 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagSCFBInfoList.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 84dc35982f18cad45aac9a2b90869ebd
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs
index baa3dc1..f790254 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA3BD_tagMCBuyEnterInfo.cs
@@ -8,6 +8,6 @@
     {
         base.Done(vNetPack);
         HA3BD_tagMCBuyEnterInfo vNetData = vNetPack as HA3BD_tagMCBuyEnterInfo;
-        DungeonModel.Instance.UpdateRecords(vNetData.FBInfo);
+        DungeonManager.Instance.UpdateRecords(vNetData.FBInfo);
     }
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA722_tagSCADInfoList.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA722_tagSCADInfoList.cs
new file mode 100644
index 0000000..33d437c
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA722_tagSCADInfoList.cs
@@ -0,0 +1,13 @@
+using UnityEngine;
+using System.Collections;
+
+// A7 22 骞垮憡淇℃伅鍒楄〃 #tagSCADInfoList
+
+public class DTCA722_tagSCADInfoList : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
+        base.Done(vNetPack);
+        HA722_tagSCADInfoList vNetData = vNetPack as HA722_tagSCADInfoList;
+        AdsManager.Instance.UpdateAdsInfoList(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA722_tagSCADInfoList.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA722_tagSCADInfoList.cs.meta
index 0ec0b24..3df859a 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA7_Interaction/DTCA722_tagSCADInfoList.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: abc4ee77ef8582c41a1af696e0b18ea4
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index a853f2c..05bed4d 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -57,7 +57,7 @@
         Register(typeof(HAA02_tagSCFirstChargeInfo), typeof(DTCAA02_tagSCFirstChargeInfo));
         Register(typeof(HAA03_tagMCDailyPackBuyGiftInfo), typeof(DTCAA03_tagMCDailyPackBuyGiftInfo));
         Register(typeof(HA302_tagMCFuncOpenStateList), typeof(DTCA302_tagMCFuncOpenStateList));
-        Register(typeof(HA320_tagMCPlayerFBInfoData), typeof(DTCA320_tagMCPlayerFBInfoData));
+        Register(typeof(HA320_tagSCFBInfoList), typeof(DTCA320_tagSCFBInfoList));
         Register(typeof(H0F03_tagRoleFamilyInfo), typeof(DTC0F03_tagRoleFamilyInfo));
         Register(typeof(H0F05_tagFamilyChange), typeof(DTC0F05_tagFamilyChange));
         Register(typeof(H0F07_tagFamilyRenameResult), typeof(DTC0F07_tagFamilyRenameResult));
@@ -116,6 +116,9 @@
         Register(typeof(HB123_tagSCDropBootyInfo), typeof(DTCB123_tagSCDropBootyInfo));
         Register(typeof(HB036_tagSCGoldRushInfo), typeof(DTCB036_tagSCGoldRushInfo));
         Register(typeof(HB037_tagSCGoldRushCampInfo), typeof(DTCB037_tagSCGoldRushCampInfo));
+        Register(typeof(HA722_tagSCADInfoList), typeof(DTCA722_tagSCADInfoList));
+        Register(typeof(H0320_tagFBEnd), typeof(DTC0320_tagFBEnd));
+
     }
 
     //涓诲伐绋嬫敞鍐屽皝鍖�
diff --git a/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0320_tagFBEnd.cs b/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0320_tagFBEnd.cs
new file mode 100644
index 0000000..0d6c6c9
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0320_tagFBEnd.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+//03 20 鍓湰缁撴潫鐣岄潰#tagFBEnd
+
+public class H0320_tagFBEnd : GameNetPackBasic {
+    public ushort Len;
+    public string Msg;    //size = Len
+
+    public H0320_tagFBEnd () {
+        _cmd = (ushort)0x0320;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Len, vBytes, NetDataType.WORD);
+        TransBytes (out Msg, vBytes, NetDataType.Chars, Len);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0320_tagFBEnd.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0320_tagFBEnd.cs.meta
index 0ec0b24..9efe7fc 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/H03_MainCharacter/H0320_tagFBEnd.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 937362d4f44267349a0e6caf03f53599
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs
deleted file mode 100644
index 96136b4..0000000
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using UnityEngine;
-using System.Collections;
-
-// A3 20 鐜╁鍓湰鐩稿叧淇℃伅 #tagMCPlayerFBInfoData
-
-public class HA320_tagMCPlayerFBInfoData : GameNetPackBasic {
-    public byte FBDataCnt;    // 鍓湰鏁版嵁涓暟
-    public  tagMCFBInfo[] FBDataList;    // 鍓湰鏁版嵁鍒楄〃
-
-    public HA320_tagMCPlayerFBInfoData () {
-        _cmd = (ushort)0xA320;
-    }
-
-    public override void ReadFromBytes (byte[] vBytes) {
-        TransBytes (out FBDataCnt, vBytes, NetDataType.BYTE);
-        FBDataList = new tagMCFBInfo[FBDataCnt];
-        for (int i = 0; i < FBDataCnt; i ++) {
-            FBDataList[i] = new tagMCFBInfo();
-            TransBytes (out FBDataList[i].FBID, vBytes, NetDataType.DWORD);
-            TransBytes (out FBDataList[i].EnterCnt, vBytes, NetDataType.WORD);
-            TransBytes (out FBDataList[i].RecoverCnt, vBytes, NetDataType.WORD);
-            TransBytes (out FBDataList[i].ItemAddCnt, vBytes, NetDataType.WORD);
-            TransBytes (out FBDataList[i].PassGradeCnt, vBytes, NetDataType.BYTE);
-            TransBytes (out FBDataList[i].PassGrade, vBytes, NetDataType.DWORD, FBDataList[i].PassGradeCnt);
-            TransBytes (out FBDataList[i].EnterCntTotal, vBytes, NetDataType.DWORD);
-            TransBytes (out FBDataList[i].PassLineID, vBytes, NetDataType.DWORD);
-        }
-    }
-
-    public class tagMCFBInfo {
-        public uint FBID;        //fbId
-        public ushort EnterCnt;        //褰撴棩杩涘叆娆℃暟
-        public ushort RecoverCnt;        //鎵惧洖娆℃暟
-        public ushort ItemAddCnt;        //鐗╁搧澧炲姞娆℃暟
-        public byte PassGradeCnt;        //鏄熺骇鍊煎搴斾釜鏁�, 姣忎釜key瀛�9涓猯ineID
-        public  uint[] PassGrade;        //鍓湰绾胯矾瀵瑰簲鏄熺骇鍊煎垪琛�
-        public uint EnterCntTotal;        //绱杩涘叆娆℃暟
-        public uint PassLineID;        //宸茶繃鍏冲埌鐨刲ineID
-    }
-
-}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs.meta
deleted file mode 100644
index 6edd4e2..0000000
--- a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagMCPlayerFBInfoData.cs.meta
+++ /dev/null
@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 708297d42528f9040923687ac7ad8ed8
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagSCFBInfoList.cs b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagSCFBInfoList.cs
new file mode 100644
index 0000000..1cfe366
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagSCFBInfoList.cs
@@ -0,0 +1,41 @@
+using UnityEngine;
+using System.Collections;
+
+// A3 20 鐜╁鍓湰鐩稿叧淇℃伅 #tagSCFBInfoList
+
+public class HA320_tagSCFBInfoList : GameNetPackBasic {
+    public byte FBDataCnt;    // 鍓湰鏁版嵁涓暟
+    public  tagSCFBInfo[] FBDataList;    // 鍓湰鏁版嵁鍒楄〃
+
+    public HA320_tagSCFBInfoList () {
+        _cmd = (ushort)0xA320;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out FBDataCnt, vBytes, NetDataType.BYTE);
+        FBDataList = new tagSCFBInfo[FBDataCnt];
+        for (int i = 0; i < FBDataCnt; i ++) {
+            FBDataList[i] = new tagSCFBInfo();
+            TransBytes (out FBDataList[i].MapID, vBytes, NetDataType.DWORD);
+            TransBytes (out FBDataList[i].EnterCnt, vBytes, NetDataType.WORD);
+            TransBytes (out FBDataList[i].ADAddCnt, vBytes, NetDataType.BYTE);
+            TransBytes (out FBDataList[i].BuyAddCnt, vBytes, NetDataType.BYTE);
+            TransBytes (out FBDataList[i].ItemAddCnt, vBytes, NetDataType.WORD);
+            TransBytes (out FBDataList[i].PassLineID, vBytes, NetDataType.DWORD);
+            TransBytes (out FBDataList[i].PassGradeCnt, vBytes, NetDataType.BYTE);
+            TransBytes (out FBDataList[i].PassGrade, vBytes, NetDataType.DWORD, FBDataList[i].PassGradeCnt);
+        }
+    }
+
+    public class tagSCFBInfo {
+        public uint MapID;
+        public ushort EnterCnt;        //浠婃棩绱杩涘叆娆℃暟
+        public byte ADAddCnt;        //骞垮憡澧炲姞娆℃暟
+        public byte BuyAddCnt;        //璐拱澧炲姞娆℃暟
+        public ushort ItemAddCnt;        //鐗╁搧澧炲姞娆℃暟
+        public uint PassLineID;        //宸茶繃鍏冲埌鐨刲ineID
+        public byte PassGradeCnt;        //鏄熺骇鍊煎搴斾釜鏁�, 姣忎釜key瀛�9涓猯ineID
+        public  uint[] PassGrade;        //鍓湰绾胯矾瀵瑰簲鏄熺骇鍊煎垪琛�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagSCFBInfoList.cs.meta
similarity index 83%
rename from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
rename to Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagSCFBInfoList.cs.meta
index 0ec0b24..11b9af6 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA3_Function/HA320_tagSCFBInfoList.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 09d1d01f36bbc4642bf12e6e209dc82f
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA722_tagSCADInfoList.cs b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA722_tagSCADInfoList.cs
new file mode 100644
index 0000000..2404dcb
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA722_tagSCADInfoList.cs
@@ -0,0 +1,29 @@
+using UnityEngine;
+using System.Collections;
+
+// A7 22 骞垮憡淇℃伅鍒楄〃 #tagSCADInfoList
+
+public class HA722_tagSCADInfoList : GameNetPackBasic {
+    public byte Count;
+    public  tagSCADInfo[] ADInfoList;
+
+    public HA722_tagSCADInfoList () {
+        _cmd = (ushort)0xA722;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out Count, vBytes, NetDataType.BYTE);
+        ADInfoList = new tagSCADInfo[Count];
+        for (int i = 0; i < Count; i ++) {
+            ADInfoList[i] = new tagSCADInfo();
+            TransBytes (out ADInfoList[i].ADID, vBytes, NetDataType.WORD);
+            TransBytes (out ADInfoList[i].ADCnt, vBytes, NetDataType.BYTE);
+        }
+    }
+
+    public class tagSCADInfo {
+        public ushort ADID;        //骞垮憡ID
+        public byte ADCnt;        //浠婃棩宸查鍙栧箍鍛婂鍔辨鏁�
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA722_tagSCADInfoList.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA722_tagSCADInfoList.cs.meta
index 0ec0b24..8078962 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/Core/NetworkPackage/ServerPack/HA7_Interaction/HA722_tagSCADInfoList.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 8c08b65a13f9abc4d852129082d6615c
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/Main.cs b/Main/Main.cs
index c6c398f..bb8628f 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -65,7 +65,7 @@
         managers.Add(GMCmdManager.Instance);
         managers.Add(FairyEmblemModel.Instance);
         managers.Add(EquipModel.Instance);
-        managers.Add(DungeonModel.Instance);
+        managers.Add(DungeonManager.Instance);
         managers.Add(DailyQuestModel.Instance);
         managers.Add(CustomizedRechargeModel.Instance);
         managers.Add(CustomizedGiftModel.Instance);
@@ -81,10 +81,11 @@
         managers.Add(MainLevelManager.Instance);
         managers.Add(BattleSettlementManager.Instance);
         managers.Add(GoldRushManager.Instance);
-        managers.Add(MailManager.Instance);
         managers.Add(FirstChargeManager.Instance);
         managers.Add(NewBieCenter.Instance);
-        
+        managers.Add(AdsManager.Instance);
+        managers.Add(BoneFieldManager.Instance);
+
         foreach (var manager in managers)
         {
             manager.Init();
diff --git a/Main/Manager/UIManager.cs b/Main/Manager/UIManager.cs
index b5e58a4..7fab3ba 100644
--- a/Main/Manager/UIManager.cs
+++ b/Main/Manager/UIManager.cs
@@ -317,15 +317,39 @@
     public bool IsOpened(string uiName)
     {
         UIBase ui = GetUI(uiName);
-        
+
         if (null != ui)
         {
             return ui.IsActive();
         }
-        
+
         return false;
     }
     
+    // 妫�鏌ユ槸鍚﹀瓨鍦ㄤ换浣曞叏灞忔垨閬僵绐楀彛, 鏆傛湭瀹氫箟鍏ㄥ睆鍙互缁熶竴鍕鹃�塷penMask
+    public bool ExistAnyFullScreenOrMaskWin(string excludeUIName)
+    {
+        var exist = false;
+        foreach (var uiList in uiDict.Values)
+        {
+            // 閬嶅巻璇ョ被鍨嬬殑鎵�鏈塙I瀹炰緥
+            foreach (var ui in uiList)
+            {
+                // 鍒锋柊UI
+                if (ui.IsActive() && ui.name != excludeUIName)
+                {
+                    if (ui.openMask)
+                    {
+                        exist = true;
+                        break;
+                    }
+                }
+            }
+        }
+
+        return exist;
+    }
+    
     // 鑾峰彇鎸囧畾绫诲瀷鐨勬墍鏈塙I瀹炰緥
     public List<T> GetAllUI<T>() where T : UIBase
     {
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index 7f4353d..dfc7948 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -45,18 +45,22 @@
         }
         set
         {
-            m_IsPause = value;
 
-            if (m_IsPause)
+            if (value)
             {
+                m_IsPause = value;
                 PauseGame();
+                OnBattlePause?.Invoke(m_IsPause);
             }
             else
             {
-                ResumeGame();
+                if (CanResumeGame())
+                {
+                    m_IsPause = value;
+                    ResumeGame();
+                    OnBattlePause?.Invoke(m_IsPause);
+                }
             }
-
-            OnBattlePause?.Invoke(m_IsPause);
         }
     }
 
@@ -545,4 +549,21 @@
     {
         recordPlayer.ForceFinish();
     }
+    
+
+    //鏆傚仠鐨勫師鍥犳湁寰堝锛岄渶瑕佹鏌ュ悇绉嶇姸鎬�
+    bool CanResumeGame()
+    {
+        if (UIManager.Instance.IsOpened<NewBieWin>())
+        {
+            return false;
+        }
+
+        if (UIManager.Instance.IsOpened<EquipExchangeWin>())
+        {
+            return false;
+        }
+
+        return true;
+    }
 }
diff --git a/Main/System/Battle/BattleField/StoryBoneBattleField.cs b/Main/System/Battle/BattleField/StoryBoneBattleField.cs
new file mode 100644
index 0000000..8b2eff5
--- /dev/null
+++ b/Main/System/Battle/BattleField/StoryBoneBattleField.cs
@@ -0,0 +1,124 @@
+using System;
+using LitJson;
+using UnityEngine;
+using System.Collections.Generic;
+
+
+public class StoryBoneBattleField : BattleField
+{
+    protected int chapter;//   绔犺妭
+    protected int wave;//  娉㈡暟
+    protected int level;// 鍏冲崱
+    protected JsonData extendData;
+
+    protected MainChapterConfig chapterConfig;
+
+    protected MainLevelConfig levelConfig;
+
+
+    public StoryBoneBattleField(string _guid) : base(_guid)
+    {
+
+    }
+
+    public override void Init(int MapID, int FuncLineID, JsonData _extendData,
+        List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList)
+    {
+        base.Init(MapID, FuncLineID, extendData, _redTeamList, _blueTeamList);
+
+        chapter = FuncLineID / 10000;
+        wave = MapID == 1 ? FuncLineID % 100 : 1;//绗嚑娉㈡��
+        level = (FuncLineID % 10000) / 100;
+
+        extendData = _extendData;
+        chapterConfig = MainChapterConfig.Get(chapter);
+        levelConfig = MainLevelConfig.Get(level);
+
+        SetBattleMode(BattleMode.Record);
+    }
+
+    public override void Release()
+    {
+        base.Release();
+    }
+
+
+    public override void AutoSetBattleMode()
+    {
+        SetBattleMode(BattleMode.Record);
+    }
+
+    public override void TurnFightState(int TurnNum, int State,
+        uint FuncLineID, JsonData extendData)
+    {
+        base.TurnFightState(TurnNum, State, FuncLineID, extendData);
+
+        switch (State)
+        {
+            //  璧峰鐘舵�佹爣璁�
+            case 0:
+                break;
+            case 1://鍑嗗瀹屾瘯
+                break;
+            case 2://鎴樻枟涓�
+                break;
+            case 3://鎴樻枟缁撴潫
+                break;
+            case 4://缁撶畻濂栧姳
+                break;
+            case 5://缁撴潫鐘舵�佹爣璁�
+                break;
+            default:
+                BattleDebug.LogError("recieve a unknown State");
+                break;
+        }
+    }
+
+    protected override void OnSettlement(JsonData turnFightStateData)
+    {
+        base.OnSettlement(turnFightStateData);
+    }
+
+    public override void WhaleFall()
+    {
+        UIManager.Instance.CloseWindow<FullScreenBattleWin>();
+        AutoFightModel.Instance.isPause = false;
+        UIManager.Instance.OpenWindow<BoneFieldWin>();
+        Destroy();
+    }
+
+
+
+    public override void HaveRest()
+    {
+        //  涓荤嚎BOSS鎴樻枟娌℃湁浼戞伅
+    }
+
+
+    // public override void OnBattleEnd(JsonData turnFightStateData)
+    // {
+    //     base.OnBattleEnd(turnFightStateData);
+    //     // HaveRest();
+    // }
+
+    public override void Run()
+    {
+        if (operationAgent == null)
+        {
+            //闃茶寖寮傚父
+            return;
+        }
+        base.Run();
+    }
+
+    public override void DistributeNextPackage()
+    {
+        if (IsBattleFinish)
+            return;
+
+        //  涓嶈璋冪敤base鐨勫嚱鏁�
+        BattleManager.Instance.DistributeNextReportPackage(guid);
+    }
+
+
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/System/Battle/BattleField/StoryBoneBattleField.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/System/Battle/BattleField/StoryBoneBattleField.cs.meta
index 0ec0b24..4b47868 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/System/Battle/BattleField/StoryBoneBattleField.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 9e1d86ce80ddb05498e956a42cef8b33
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Battle/BattleFieldFactory.cs b/Main/System/Battle/BattleFieldFactory.cs
index 9177299..3cdfca1 100644
--- a/Main/System/Battle/BattleFieldFactory.cs
+++ b/Main/System/Battle/BattleFieldFactory.cs
@@ -14,14 +14,17 @@
 
         switch (MapID)
         {
-        	case 1:
-        		battleField = new StoryBattleField();
-        		break;
-        	case 2:
+            case 1:
+                battleField = new StoryBattleField();
+                break;
+            case 2:
                 battleField = new StoryBossBattleField(guid);
                 break;
-        	default:
-        		break;
+            case 30010:
+                battleField = new StoryBoneBattleField(guid);
+                break;
+            default:
+                break;
         }
 
         return battleField;
diff --git a/Main/System/BoneField.meta b/Main/System/BoneField.meta
new file mode 100644
index 0000000..c3cb2f6
--- /dev/null
+++ b/Main/System/BoneField.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2771fb42327cbe54ab2401a146d7e659
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/BoneField/AdsManager.cs b/Main/System/BoneField/AdsManager.cs
new file mode 100644
index 0000000..b3974b9
--- /dev/null
+++ b/Main/System/BoneField/AdsManager.cs
@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+public class AdsManager : GameSystemManager<AdsManager>
+{
+    //<骞垮憡ID,浠婃棩宸查鍙栧箍鍛婂鍔辨鏁�>
+    private Dictionary<int, int> adsInfoDict = new Dictionary<int, int>();
+    public event Action<int,int> OnAdsInfoListUpdateEvent;//ADID ADMapID
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
+    }
+
+    public void OnBeforePlayerDataInitializeEvent()
+    {
+        adsInfoDict.Clear();
+    }
+
+    public void SendGetReward(int ADID)
+    {
+        var pack = new CA504_tagCMPlayerGetReward();
+        pack.RewardType = 81;       //  骞垮憡濂栧姳 81
+        pack.DataEx = (uint)ADID;   // 骞垮憡濂栧姳ID
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void PlayAds(int ADID)
+    {
+        if (ADID == 1)
+        {
+
+            int dataMapID = BoneFieldManager.Instance.DataMapID;
+            if (!DungeonManager.Instance.TryGetFBInfoByMapID(dataMapID, out var fbInfo))
+                return;
+            SendGetReward(ADID);
+            BoneFieldManager.Instance.SendBBeginFBWipeOut(dataMapID, (int)fbInfo.PassLineID);
+        }
+
+    }
+
+    public int GetADCntByADID(int ADID)
+    {
+        if (adsInfoDict.IsNullOrEmpty() || !adsInfoDict.ContainsKey(ADID))
+            return 0;
+        return adsInfoDict[ADID];
+    }
+
+    public void UpdateAdsInfoList(HA722_tagSCADInfoList vNetData)
+    {
+        if (vNetData == null || vNetData.ADInfoList.IsNullOrEmpty())
+            return;
+        foreach (var item in vNetData.ADInfoList)
+        {
+            adsInfoDict[item.ADID] = item.ADCnt;
+
+            int mapID = 0;
+            if (ADAwardConfig.HasKey(item.ADID))
+            {
+                ADAwardConfig aDAwardConfig = ADAwardConfig.Get(item.ADID);
+                mapID = aDAwardConfig.ADMapID;
+            }
+            OnAdsInfoListUpdateEvent?.Invoke(item.ADID, mapID);
+        }
+    }
+}
+
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/System/BoneField/AdsManager.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/System/BoneField/AdsManager.cs.meta
index 0ec0b24..ca5cd4c 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/System/BoneField/AdsManager.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: fd600b8da29646b4a8aa0cb5dabdb5f8
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/BoneField/BoneFieldChallengeButton.cs b/Main/System/BoneField/BoneFieldChallengeButton.cs
new file mode 100644
index 0000000..86be514
--- /dev/null
+++ b/Main/System/BoneField/BoneFieldChallengeButton.cs
@@ -0,0 +1,55 @@
+using UnityEngine;
+
+public class BoneFieldChallengeButton : MonoBehaviour
+{
+    [SerializeField] ButtonEx btnChallenge;
+    [SerializeField] TextEx txtChallengeLv;
+    [SerializeField] TextEx txtChallengeYes;
+    [SerializeField] TextEx txtChallengeNo;
+    [SerializeField] ImageEx imgChallengeLVYes;
+    [SerializeField] ImageEx imgChallengeLVNo;
+    [SerializeField] ImageEx imgChallengeIcon;
+    [SerializeField] ImageEx imgChallengeRed;
+    bool isLvOk;
+    int lvLimitMin;
+    bool isHasNextLineID;
+    public void Awake()
+    {
+        btnChallenge.SetListener(OnClickChallenge);
+    }
+    public void Display(int lvLimitMin, bool isHasNextLineID, long bossFightPower)
+    {
+        this.isHasNextLineID = isHasNextLineID;
+        this.lvLimitMin = lvLimitMin;
+        isLvOk = PlayerDatas.Instance.baseData.LV >= lvLimitMin;
+        long myFightPower = PlayerDatas.Instance.baseData.FightPower;
+        imgChallengeRed.SetActive(isLvOk && isHasNextLineID && myFightPower >= bossFightPower);
+        txtChallengeLv.SetActive(!isLvOk);
+        txtChallengeLv.text = Language.Get("BoneField07", lvLimitMin);
+        txtChallengeYes.SetActive(isLvOk && isHasNextLineID);
+        txtChallengeNo.SetActive(!isLvOk || !isHasNextLineID);
+        imgChallengeLVYes.SetActive(isLvOk && isHasNextLineID);
+        imgChallengeLVNo.SetActive(!isLvOk || !isHasNextLineID);
+        imgChallengeIcon.SetActive(isLvOk && isHasNextLineID);
+    }
+    private void OnClickChallenge()
+    {
+        if (!isLvOk)
+        {
+            // %s0绾у彲鎸戞垬
+            SysNotifyMgr.Instance.ShowTip("BoneField01", lvLimitMin);
+            return;
+        }
+        if (!isHasNextLineID)
+        {
+            // 宸插埌杈炬渶楂樺眰
+            SysNotifyMgr.Instance.ShowTip("BoneField02", lvLimitMin);
+            return;
+        }
+        if (!DungeonManager.Instance.TryGetFBInfoByMapID(BoneFieldManager.Instance.DataMapID, out var fbInfo))
+            return;
+        int nowPassLineID = BoneFieldManager.Instance.GetNowPassLineID(fbInfo);
+        BoneFieldManager.Instance.SendTurnFight(BoneFieldManager.Instance.DataMapID, nowPassLineID);
+        UIManager.Instance.CloseWindow<BoneFieldWin>();
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/System/BoneField/BoneFieldChallengeButton.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/System/BoneField/BoneFieldChallengeButton.cs.meta
index 0ec0b24..20b3f78 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/System/BoneField/BoneFieldChallengeButton.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 7d146ab81b1eaa9429ab8f0a53fb5485
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/BoneField/BoneFieldManager.cs b/Main/System/BoneField/BoneFieldManager.cs
new file mode 100644
index 0000000..d7fc492
--- /dev/null
+++ b/Main/System/BoneField/BoneFieldManager.cs
@@ -0,0 +1,200 @@
+using System.Collections.Generic;
+using DG.DemiEditor;
+using LitJson;
+public class BoneFieldManager : GameSystemManager<BoneFieldManager>
+{
+
+    public readonly int DataMapID = 30010;  // 鐧介鐩堥噹(鎴橀敜绉樺)
+    public readonly int MinStartLineID = 1;    // funcLineID浠�1寮�濮�
+    public readonly int funcId = 9;  //鍔熻兘ID 
+    public Redpoint parentRedpoint = new Redpoint(MainRedDot.MainChallengeRedpoint, MainRedDot.BoneFieldRepoint);
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
+        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChangeEvent;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+        TimeMgr.Instance.OnDayEvent += OnDayEvent;
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
+        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
+    }
+
+    private void OnFuncStateChangeEvent(int obj)
+    {
+        if (obj != funcId)
+            return;
+        UpdateRedPoint();
+    }
+
+    private void OnDayEvent()
+    {
+        UpdateRedPoint();
+    }
+
+    private void OnUpdateFBInfoChangeEvent(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange)
+    {
+        int dataMapID = DataMapID;
+        if (mapID != dataMapID)
+            return;
+        if (isADAddCntChange)
+            return;
+        UpdateRedPoint();
+    }
+
+    private void OnAdsInfoListUpdateEvent(int id, int mapId)
+    {
+        if (mapId != DataMapID)
+            return;
+        UpdateRedPoint();
+    }
+
+    public void OnBeforePlayerDataInitializeEvent()
+    {
+        //mailDataDict.Clear();
+    }
+
+    public void UpdateRedPoint()
+    {
+        parentRedpoint.state = RedPointState.None;
+        if (!FuncOpen.Instance.IsFuncOpen(funcId))
+            return;
+        if (!DungeonManager.Instance.TryGetFBInfoByMapID(DataMapID, out var fbInfo))
+            return;
+        bool isHasNextLineID = IsHasNextLineID(fbInfo);
+        int nowPassLineID = GetNowPassLineID(fbInfo);
+        DungeonConfig.TryGetDungeonID(DataMapID, nowPassLineID, out int dungeonID);
+        if (!DungeonConfig.HasKey(dungeonID))
+            return;
+        DungeonConfig dungeonConfig = DungeonConfig.Get(dungeonID);
+        bool isLvOk = PlayerDatas.Instance.baseData.LV >= dungeonConfig.LVLimitMin;
+        long myFightPower = PlayerDatas.Instance.baseData.FightPower;
+        if (myFightPower >= dungeonConfig.FightPower)
+        {
+            if (isLvOk && isHasNextLineID)
+            {
+                parentRedpoint.state = RedPointState.Simple;
+            }
+        }
+        else
+        {
+            if (TryGetShowSweepCount(out int showSweepMaxCount, out int showrealRemainSweepCount))
+            {
+                bool isSweepCountOk = showrealRemainSweepCount > 0;
+                if (isSweepCountOk)
+                {
+                    parentRedpoint.state = RedPointState.Simple;
+                }
+            }
+        }
+    }
+
+    public bool IsHasNextLineID(FBInfo fBInfo)
+    {
+        int passLineID = (int)fBInfo.PassLineID;
+        int nextPassLineID = passLineID + 1;
+        return DungeonConfig.TryGetDungeonID(DataMapID, nextPassLineID, out int dungeonID);
+    }
+
+    public int GetNowPassLineID(FBInfo fBInfo)
+    {
+        int passLineID = (int)fBInfo.PassLineID;
+        if (passLineID < MinStartLineID)
+            return MinStartLineID;
+        int nextPassLineID = passLineID + 1;
+        if (!DungeonConfig.TryGetDungeonID(DataMapID, nextPassLineID, out int nextDungeonID))
+            return passLineID;
+        return nextPassLineID;
+    }
+
+    public bool TryGetShowSweepCount(out int showSweepMaxCount, out int showrealRemainSweepCount)
+    {
+        showSweepMaxCount = 0;
+        showrealRemainSweepCount = 0;
+        int dataMapID = BoneFieldManager.Instance.DataMapID;
+        if (!DungeonOpenTimeConfig.HasKey(dataMapID))
+            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;
+    }
+
+    public void SendTurnFight(int mapID, int funcLineID)
+    {
+        CB410_tagCMTurnFight pack = new CB410_tagCMTurnFight();
+        pack.MapID = (uint)mapID;
+        pack.FuncLineID = (uint)funcLineID;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void SendBBeginFBWipeOut(int mapID, int lineID)
+    {
+        CA505_tagCMBeginFBWipeOut pack = new CA505_tagCMBeginFBWipeOut();
+        pack.MapID = (uint)mapID;
+        pack.LineID = (ushort)lineID;
+        pack.Cnt = 1;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+
+
+    public void SendBuyEnterCount(int FBID)
+    {
+        var pack = new CA575_tagCMBuyEnterCount();
+        pack.FBID = (uint)FBID;       // 鍓湰ID
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    public void UpdateFBEnd(H0320_tagFBEnd vNetData)
+    {
+        if (vNetData.Msg.IsNullOrEmpty())
+            return;
+        ChallengeResultData result = ChallengeResultData.FromJson(vNetData.Msg);
+        if (result == null || result.itemInfo.IsNullOrEmpty())
+            return;
+        if (result.dataMapID != DataMapID)
+            return;
+        List<Item> showItems = new List<Item>();
+        foreach (var item in result.itemInfo)
+        {
+            Item tempItem = new Item(item.ItemID, item.Count);
+            showItems.Add(tempItem);
+        }
+        ItemLogicUtility.Instance.ShowGetItem(showItems);
+    }
+
+    public class ItemInfo
+    {
+        public int ItemID { get; set; }
+        public int Count { get; set; }
+    }
+
+    public class ChallengeResultData
+    {
+        public int dataMapID { get; set; }
+        public List<ItemInfo> itemInfo { get; set; }
+        public int lineID { get; set; }
+        public int isPass { get; set; }
+        public int isSweep { get; set; }
+
+        public static ChallengeResultData FromJson(string json)
+        {
+            return JsonMapper.ToObject<ChallengeResultData>(json);
+        }
+    }
+}
+
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/System/BoneField/BoneFieldManager.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/System/BoneField/BoneFieldManager.cs.meta
index 0ec0b24..890c90e 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/System/BoneField/BoneFieldManager.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 77bb3f7eaa082d34ea9ec3678a728a06
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/BoneField/BoneFieldWin.cs b/Main/System/BoneField/BoneFieldWin.cs
new file mode 100644
index 0000000..8a05b7a
--- /dev/null
+++ b/Main/System/BoneField/BoneFieldWin.cs
@@ -0,0 +1,268 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+public class BoneFieldWin : UIBase
+{
+    [SerializeField] TextEx txtDifficulty;
+    [SerializeField] TextEx txtBossName;
+    [SerializeField] TextEx txtTodaySweepCount;
+    [SerializeField] TextEx txtTodayAdsCount;
+    [SerializeField] TextEx txtFirstFree;
+    [SerializeField] TextEx txtFightPower;
+    [SerializeField] ImageEx imgMaxLineID;
+    [SerializeField] Transform transChallengeItemCells;
+    [SerializeField] List<ItemCell> challengeItemCells1;
+    [SerializeField] List<ItemCell> challengeItemCells2;
+    [SerializeField] List<ItemCell> sweepItemCells;
+    [SerializeField] List<SkillWordCell> skillWords;
+    [SerializeField] ButtonEx btnClose;
+    [SerializeField] Transform transNoChallenge;
+    [SerializeField] Transform transHasChallenge;
+    [SerializeField] BoneFieldChallengeButton btnChallenge1;
+    [SerializeField] BoneFieldChallengeButton btnChallenge2;
+    [SerializeField] ButtonEx btnSweep;
+    [SerializeField] ImageEx imgSweepNo;
+    [SerializeField] ButtonEx btnAds;
+    [SerializeField] ImageEx imgSweepRed;
+    bool isHasNextLineID;
+    int adID;
+
+    int showSweepMaxCount;
+    int showrealRemainSweepCount;
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        btnClose.SetListener(OnClickClose);
+        btnSweep.SetListener(OnClickSweep);
+        btnAds.SetListener(OnClickAds);
+    }
+
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChangeEvent;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
+        TimeMgr.Instance.OnDayEvent += OnDayEvent;
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
+        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
+    }
+
+    private void OnUpdateFBInfoChangeEvent(int mapID, bool isADAddCntChange, bool isBuyAddCntChange, bool isItemAddCntChange)
+    {
+        int dataMapID = BoneFieldManager.Instance.DataMapID;
+        if (mapID != dataMapID)
+            return;
+        if (!ADAwardConfig.TryGetADIDByADMapID(BoneFieldManager.Instance.DataMapID, out adID) || !ADAwardConfig.HasKey(adID))
+            return;
+        ADAwardConfig aDAwardConfig = ADAwardConfig.Get(adID);
+        if (isADAddCntChange)
+        {
+            DisplayAdsButton(aDAwardConfig);
+        }
+        else
+        {
+            Display();
+        }
+    }
+
+    private void OnAdsInfoListUpdateEvent(int id, int mapId)
+    {
+        if (mapId != BoneFieldManager.Instance.DataMapID)
+            return;
+        if (!ADAwardConfig.TryGetADIDByADMapID(BoneFieldManager.Instance.DataMapID, out adID) || !ADAwardConfig.HasKey(adID))
+            return;
+        ADAwardConfig aDAwardConfig = ADAwardConfig.Get(adID);
+        DisplayAdsButton(aDAwardConfig);
+    }
+
+
+    private void OnDayEvent()
+    {
+        Display();
+    }
+
+    private void OnClickClose()
+    {
+        UIManager.Instance.CloseWindow<BoneFieldWin>();
+    }
+
+    private void OnClickSweep()
+    {
+        int dataMapID = BoneFieldManager.Instance.DataMapID;
+        if (!DungeonManager.Instance.TryGetFBInfoByMapID(dataMapID, out var fbInfo))
+            return;
+        if (!DungeonOpenTimeConfig.HasKey(dataMapID))
+            return;
+        DungeonOpenTimeConfig config = DungeonOpenTimeConfig.Get(dataMapID);
+
+        if (showrealRemainSweepCount == showSweepMaxCount)
+        {
+            BoneFieldManager.Instance.SendBBeginFBWipeOut(dataMapID, (int)fbInfo.PassLineID);
+            return;
+        }
+
+        int index = Mathf.Min(Mathf.Max(0, showSweepMaxCount - showrealRemainSweepCount - 1), config.PayMoneyValues.Length - 1);
+        int payMoneyValue = config.PayMoneyValues[index];
+        int payMoneyType = config.PayMoneyType;
+        ConfirmCancel.MoneyIconToggleConfirmByType(ToggleCheckType.BoneField, payMoneyValue, payMoneyType,
+                    Language.Get("BoneField11", UIHelper.GetIconNameWithMoneyType(payMoneyType), payMoneyValue), () =>
+                        {
+                            if (!UIHelper.CheckMoneyCount(payMoneyType, payMoneyValue, 2))
+                                return;
+                            BoneFieldManager.Instance.SendBuyEnterCount(dataMapID);
+                            BoneFieldManager.Instance.SendBBeginFBWipeOut(dataMapID, (int)fbInfo.PassLineID);
+                        });
+
+
+    }
+
+    private void OnClickAds()
+    {
+        AdsManager.Instance.PlayAds(adID);
+    }
+    public void Display()
+    {
+        int dataMapID = BoneFieldManager.Instance.DataMapID;
+        if (!DungeonManager.Instance.TryGetFBInfoByMapID(dataMapID, out var fbInfo))
+            return;
+
+        int nowPassLineID = BoneFieldManager.Instance.GetNowPassLineID(fbInfo);
+        isHasNextLineID = BoneFieldManager.Instance.IsHasNextLineID(fbInfo);
+        DungeonConfig.TryGetDungeonID(dataMapID, nowPassLineID, out int dungeonID);
+        if (!DungeonConfig.HasKey(dungeonID))
+            return;
+        DungeonConfig dungeonConfig = DungeonConfig.Get(dungeonID);
+        int[] lineupIDList = dungeonConfig.LineupIDList;
+        if (lineupIDList.IsNullOrEmpty())
+            return;
+        int LineupID = lineupIDList[0];
+        if (!NPCLineupConfig.HasKey(LineupID))
+            return;
+        NPCLineupConfig lineupConfig = NPCLineupConfig.Get(LineupID);
+        int bossId = lineupConfig.BossID;
+        if (bossId == 0 || !NPCConfig.HasKey(bossId))
+            return;
+        NPCConfig nPCConfig = NPCConfig.Get(bossId);
+        if (!ADAwardConfig.TryGetADIDByADMapID(dataMapID, out adID) || !ADAwardConfig.HasKey(adID))
+            return;
+        ADAwardConfig aDAwardConfig = ADAwardConfig.Get(adID);
+
+
+        DisplayFBInfo(nPCConfig, dungeonConfig, nowPassLineID);
+        DisplayChallengeButton(dungeonConfig, fbInfo);
+        DisplaySweepButton(dungeonConfig);
+        DisplayAdsButton(aDAwardConfig);
+        DisplaySkillWordsList(lineupConfig);
+        DisplayItemCellList(challengeItemCells1, dungeonConfig.PassAwardList);
+        DisplayItemCellList(challengeItemCells2, dungeonConfig.PassAwardList);
+
+        if (fbInfo.PassLineID > 0)
+        {
+            DungeonConfig.TryGetDungeonID(dataMapID, (int)fbInfo.PassLineID, out int sweepDungeonID);
+            if (!DungeonConfig.HasKey(dungeonID))
+                return;
+            DungeonConfig sweepDungeonConfig = DungeonConfig.Get(sweepDungeonID);
+            DisplayItemCellList(sweepItemCells, sweepDungeonConfig.SweepAwardList);
+        }
+
+    }
+
+    public void DisplayFBInfo(NPCConfig nPCConfig, DungeonConfig dungeonConfig, int nowPassLineID)
+    {
+        imgMaxLineID.SetActive(!isHasNextLineID);
+        transChallengeItemCells.SetActive(isHasNextLineID);
+        txtBossName.text = nPCConfig.NPCName;
+        txtDifficulty.text = nowPassLineID.ToString();
+        txtFightPower.text = UIHelper.ReplaceLargeArtNum(dungeonConfig.FightPower);
+    }
+
+    public void DisplayChallengeButton(DungeonConfig dungeonConfig, FBInfo fBInfo)
+    {
+        transNoChallenge.SetActive(fBInfo.PassLineID <= 0);
+        transHasChallenge.SetActive(fBInfo.PassLineID > 0);
+        btnChallenge1.Display(dungeonConfig.LVLimitMin, isHasNextLineID, dungeonConfig.FightPower);
+        btnChallenge2.Display(dungeonConfig.LVLimitMin, isHasNextLineID, dungeonConfig.FightPower);
+    }
+
+
+
+    public void DisplaySweepButton(DungeonConfig dungeonConfig)
+    {
+        if (!BoneFieldManager.Instance.TryGetShowSweepCount(out showSweepMaxCount, out showrealRemainSweepCount))
+            return;
+        bool isSweepCountOk = showrealRemainSweepCount > 0;
+        imgSweepNo.SetActive(!isSweepCountOk);
+        btnSweep.interactable = 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.Green : TextColType.Red, Language.Get("BoneField08", showrealRemainSweepCount, showSweepMaxCount));
+    }
+
+    public void DisplayAdsButton(ADAwardConfig aDAwardConfig)
+    {
+        int adsCnt = AdsManager.Instance.GetADCntByADID(adID);
+        bool isShowAds = adsCnt < aDAwardConfig.ADCntMax;
+        int remainAdsCount = aDAwardConfig.ADCntMax - adsCnt;
+        btnAds.SetActive(isShowAds);
+        txtTodayAdsCount.text = UIHelper.AppendColor(isShowAds ? TextColType.Green : TextColType.Red, Language.Get("BoneField09", remainAdsCount, aDAwardConfig.ADCntMax)); ;
+    }
+
+    public void DisplayItemCellList(List<ItemCell> itemCells, int[][] items)
+    {
+        if (itemCells.IsNullOrEmpty() || items.IsNullOrEmpty())
+            return;
+        for (int i = 0; i < itemCells.Count; i++)
+        {
+            if (i < items.Length)
+            {
+                int index = i;
+                itemCells[i].SetActive(true);
+                itemCells[i].Init(new ItemCellModel(items[i][0], true, items[i][1]));
+                itemCells[i].button.SetListener(() =>
+                {
+                    ItemTipUtility.Show(items[index][0], true);
+                });
+            }
+            else
+            {
+                itemCells[i].SetActive(false);
+            }
+        }
+    }
+
+    public void DisplaySkillWordsList(NPCLineupConfig lineUPConfig)
+    {
+        if (skillWords.IsNullOrEmpty())
+            return;
+        for (int i = 0; i < skillWords.Count; i++)
+        {
+            if (i < lineUPConfig.SkillIDExList.Length)
+            {
+                skillWords[i].SetActive(true);
+                int skillID = lineUPConfig.SkillIDExList[i];
+                skillWords[i].Init(skillID, () =>
+                {
+                    SmallTipWin.showText = Language.Get("SmallTipFomat", SkillConfig.Get(skillID)?.SkillName, SkillConfig.Get(skillID)?.Description);
+                    SmallTipWin.worldPos = CameraManager.uiCamera.ScreenToWorldPoint(Input.mousePosition);
+                    SmallTipWin.isDownShow = true;
+                    UIManager.Instance.OpenWindow<SmallTipWin>();
+                });
+            }
+            else
+            {
+                skillWords[i].SetActive(false);
+            }
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/System/BoneField/BoneFieldWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/System/BoneField/BoneFieldWin.cs.meta
index 0ec0b24..095bb71 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/System/BoneField/BoneFieldWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 018d0a5414867a143940ae53fd9a10c4
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/ChallengeTab.meta b/Main/System/ChallengeTab.meta
new file mode 100644
index 0000000..09c6f75
--- /dev/null
+++ b/Main/System/ChallengeTab.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: b05faf55c2deb764eaf44f27a0deb3d4
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/ChallengeTab/ChallengeTabButton.cs b/Main/System/ChallengeTab/ChallengeTabButton.cs
new file mode 100644
index 0000000..0d31545
--- /dev/null
+++ b/Main/System/ChallengeTab/ChallengeTabButton.cs
@@ -0,0 +1,35 @@
+using System;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class ChallengeTabButton : MonoBehaviour
+{
+    [SerializeField] Button btnTab;
+    [SerializeField] ImageEx imgIcon;
+    [SerializeField] TextEx txtName;
+    [SerializeField] TextEx txtCount;
+    [SerializeField] TextEx txtLockInfo;
+    [SerializeField] Transform transUnlock;
+    [SerializeField] RedpointBehaviour redpointBehaviour;
+    Action action;
+    void Awake()
+    {
+        btnTab.SetListener(() =>
+        {
+            action?.Invoke();
+        });
+    }
+
+    public void Display(int index, int redpointId, bool isLock, string countInfo, string lockInfo, Action action)
+    {
+        redpointBehaviour.redpointId = redpointId;
+        transUnlock.SetActive(!isLock);
+        txtCount.SetActive(isLock);
+        txtLockInfo.SetActive(!isLock);
+        imgIcon.SetSprite(StringUtility.Contact("ChallengeTab", index));
+        txtName.text = Language.Get(StringUtility.Contact("ChallengeTab", index));
+        txtCount.text = countInfo;
+        txtLockInfo.text = lockInfo;
+        this.action = action;
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/System/ChallengeTab/ChallengeTabButton.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/System/ChallengeTab/ChallengeTabButton.cs.meta
index 0ec0b24..d65b722 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/System/ChallengeTab/ChallengeTabButton.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 3bb48932e6ad9904b85d4dbab69a6553
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/ChallengeTab/ChallengeTabWin.cs b/Main/System/ChallengeTab/ChallengeTabWin.cs
new file mode 100644
index 0000000..d71ad40
--- /dev/null
+++ b/Main/System/ChallengeTab/ChallengeTabWin.cs
@@ -0,0 +1,92 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks.Triggers;
+using UnityEngine;
+
+public class ChallengeTabWin : UIBase
+{
+    [SerializeField] ClickScreenOtherSpace clickScreenOtherSpace;
+    [SerializeField] ChallengeTabButton btnBoneField;
+    public static Action OnCloseChallengeTabWin;
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        clickScreenOtherSpace.RemoveAllListeners();
+        clickScreenOtherSpace.AddListener(() =>
+        {
+            UIManager.Instance.CloseWindow<ChallengeTabWin>();
+        });
+
+    }
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        DungeonManager.Instance.UpdateFBInfoChangeEvent += OnUpdateFBInfoChangeEvent;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent += OnAdsInfoListUpdateEvent;
+        TimeMgr.Instance.OnDayEvent += OnDayEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+
+        Display();
+    }
+
+    private void OnDayEvent()
+    {
+        Display();
+    }
+
+    private void OnAdsInfoListUpdateEvent(int id, int mapId)
+    {
+        Display();
+    }
+
+    private void OnUpdateFBInfoChangeEvent(int arg1, bool arg2, bool arg3, bool arg4)
+    {
+        if (arg1 == BoneFieldManager.Instance.DataMapID)
+        {
+            DisplayBoneFieldButton();
+        }
+
+    }
+    public void OnFuncStateChangeEvent(int funcId)
+    {
+        if (funcId == BoneFieldManager.Instance.funcId)
+        {
+            DisplayBoneFieldButton();
+        }
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        DungeonManager.Instance.UpdateFBInfoChangeEvent -= OnUpdateFBInfoChangeEvent;
+        AdsManager.Instance.OnAdsInfoListUpdateEvent -= OnAdsInfoListUpdateEvent;
+        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+        OnCloseChallengeTabWin?.Invoke();
+    }
+    public void Display()
+    {
+        DisplayBoneFieldButton();
+    }
+
+
+    public void DisplayBoneFieldButton()
+    {
+        int index = 2;
+        int funcId = BoneFieldManager.Instance.funcId;
+        int redpointId = MainRedDot.BoneFieldRepoint;
+        bool isLock = FuncOpen.Instance.IsFuncOpen(funcId);
+        if (!BoneFieldManager.Instance.TryGetShowSweepCount(out int showSweepMaxCount, out int showrealRemainSweepCount))
+            return;
+        string countInfo = UIHelper.AppendColor(showrealRemainSweepCount > 0 ? TextColType.Green : TextColType.Red, Language.Get("Challenge01", showrealRemainSweepCount));
+        string lockInfo = !isLock ? FuncOpen.Instance.GetErrorTip(funcId) : string.Empty;
+        btnBoneField.Display(index, redpointId, isLock, countInfo, lockInfo, () =>
+        {
+            if (!FuncOpen.Instance.IsFuncOpen(funcId, true))
+                return;
+            UIManager.Instance.OpenWindow<BoneFieldWin>();
+        });
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta b/Main/System/ChallengeTab/ChallengeTabWin.cs.meta
similarity index 83%
copy from Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
copy to Main/System/ChallengeTab/ChallengeTabWin.cs.meta
index 0ec0b24..1c50849 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA320_tagMCPlayerFBInfoData.cs.meta
+++ b/Main/System/ChallengeTab/ChallengeTabWin.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: 56cd057c8501b0246b3887eaa785e5f4
+guid: 97c14b01c5b4b344794d9cf10855b050
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Main/System/Dungeon/DungeonData.cs b/Main/System/Dungeon/DungeonData.cs
index bba8148..e2ba073 100644
--- a/Main/System/Dungeon/DungeonData.cs
+++ b/Main/System/Dungeon/DungeonData.cs
@@ -235,26 +235,26 @@
 
     public int passLineID;
 
-    public DungeonRecord(HA320_tagMCPlayerFBInfoData.tagMCFBInfo _serverInfo)
-    {
-        this.id = (int)_serverInfo.FBID;
-        this.enterTimes = (int)_serverInfo.EnterCnt;
-        this.recoverTimes = (int)_serverInfo.RecoverCnt;
-        this.extraTimes = (int)_serverInfo.ItemAddCnt;
-        this.lineGrades = new Dictionary<int, int>();
-        this.passLineID = (int)_serverInfo.PassLineID;
-        for (int i = 0; i < _serverInfo.PassGrade.Length; i++)
-        {
-            var tempValue = (int)_serverInfo.PassGrade[i];
-            for (int j = 0; j < 9; j++)
-            {
-                var a = MathUtility.Power(10, j);
-                var b = MathUtility.Power(10, j + 1);
-                this.lineGrades[i * 9 + j] = (tempValue % b) / a;
-            }
-        }
-        this.enterCntTotal = (int)_serverInfo.EnterCntTotal;
-    }
+    // public DungeonRecord(HA320_tagMCPlayerFBInfoData.tagMCFBInfo _serverInfo)
+    // {
+    //     this.id = (int)_serverInfo.FBID;
+    //     this.enterTimes = (int)_serverInfo.EnterCnt;
+    //     this.recoverTimes = (int)_serverInfo.RecoverCnt;
+    //     this.extraTimes = (int)_serverInfo.ItemAddCnt;
+    //     this.lineGrades = new Dictionary<int, int>();
+    //     this.passLineID = (int)_serverInfo.PassLineID;
+    //     for (int i = 0; i < _serverInfo.PassGrade.Length; i++)
+    //     {
+    //         var tempValue = (int)_serverInfo.PassGrade[i];
+    //         for (int j = 0; j < 9; j++)
+    //         {
+    //             var a = MathUtility.Power(10, j);
+    //             var b = MathUtility.Power(10, j + 1);
+    //             this.lineGrades[i * 9 + j] = (tempValue % b) / a;
+    //         }
+    //     }
+    //     this.enterCntTotal = (int)_serverInfo.EnterCntTotal;
+    // }
 
     public DungeonRecord(HA3BD_tagMCBuyEnterInfo.tagMCBuyInfo _serverInfo)
     {
@@ -262,24 +262,24 @@
         this.buyTimes = _serverInfo.BuyCount;
     }
 
-    public void UpdateRecord(HA320_tagMCPlayerFBInfoData.tagMCFBInfo _serverInfo)
-    {
-        this.enterTimes = (int)_serverInfo.EnterCnt;
-        this.recoverTimes = (int)_serverInfo.RecoverCnt;
-        this.extraTimes = (int)_serverInfo.ItemAddCnt;
-        this.passLineID = (int)_serverInfo.PassLineID;
-        for (int i = 0; i < _serverInfo.PassGrade.Length; i++)
-        {
-            var tempValue = (int)_serverInfo.PassGrade[i];
-            for (int j = 0; j < 9; j++)
-            {
-                var a = MathUtility.Power(10, j);
-                var b = MathUtility.Power(10, j + 1);
-                this.lineGrades[i * 9 + j] = (tempValue % b) / a;
-            }
-        }
-        this.enterCntTotal = (int)_serverInfo.EnterCntTotal;
-    }
+    // public void UpdateRecord(HA320_tagMCPlayerFBInfoData.tagMCFBInfo _serverInfo)
+    // {
+    //     this.enterTimes = (int)_serverInfo.EnterCnt;
+    //     this.recoverTimes = (int)_serverInfo.RecoverCnt;
+    //     this.extraTimes = (int)_serverInfo.ItemAddCnt;
+    //     this.passLineID = (int)_serverInfo.PassLineID;
+    //     for (int i = 0; i < _serverInfo.PassGrade.Length; i++)
+    //     {
+    //         var tempValue = (int)_serverInfo.PassGrade[i];
+    //         for (int j = 0; j < 9; j++)
+    //         {
+    //             var a = MathUtility.Power(10, j);
+    //             var b = MathUtility.Power(10, j + 1);
+    //             this.lineGrades[i * 9 + j] = (tempValue % b) / a;
+    //         }
+    //     }
+    //     this.enterCntTotal = (int)_serverInfo.EnterCntTotal;
+    // }
 
     public void UpdateRecord(HA3BD_tagMCBuyEnterInfo.tagMCBuyInfo _serverInfo)
     {
diff --git a/Main/System/Dungeon/DungeonManager.cs b/Main/System/Dungeon/DungeonManager.cs
new file mode 100644
index 0000000..d696272
--- /dev/null
+++ b/Main/System/Dungeon/DungeonManager.cs
@@ -0,0 +1,108 @@
+锘縰sing System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using System;
+using LitJson;
+
+
+public class DungeonManager : GameSystemManager<DungeonManager>
+{
+    private Dictionary<int, FBInfo> fbInfoDict = new Dictionary<int, FBInfo>();
+    public event Action<int> UpdateFBInfoListEvent;//int mapID
+    public event Action<int, bool, bool, bool> UpdateFBInfoChangeEvent;
+    public event Action<int> UpdateFBInfoListEventByADAddCnt;//int mapID  骞垮憡澧炲姞娆℃暟鏈夋洿鏂�
+    public event Action<int> UpdateFBInfoListEventNotByADAddCnt;//int mapID  涓嶆槸骞垮憡澧炲姞娆℃暟瀵艰嚧鐨勬洿鏂�
+    Dictionary<int, DungeonRecord> dungeonRecords = new Dictionary<int, DungeonRecord>();
+    public event Action updateDungeonBuyCnt;
+
+    public override void Init()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= OnBeforePlayerDataInitializeEvent;
+    }
+
+    public void OnBeforePlayerDataInitializeEvent()
+    {
+        fbInfoDict.Clear();
+    }
+
+    public bool TryGetFBInfoByMapID(int mapID, out FBInfo info)
+    {
+        return fbInfoDict.TryGetValue(mapID, out info);
+    }
+
+    public void UpdateFBInfoList(HA320_tagSCFBInfoList vNetData)
+    {
+        if (vNetData == null || vNetData.FBDataList.IsNullOrEmpty())
+            return;
+        bool isADAddCntChange = false;
+        bool isBuyAddCntChange = false;
+        bool isItemAddCntChange = false;
+
+        foreach (var item in vNetData.FBDataList)
+        {
+            if (!fbInfoDict.ContainsKey((int)item.MapID))
+                fbInfoDict[(int)item.MapID] = new FBInfo();
+            int mapID = (int)item.MapID;
+            fbInfoDict[mapID].MapID = item.MapID;
+            fbInfoDict[mapID].EnterCnt = item.EnterCnt;
+
+            isADAddCntChange = fbInfoDict[mapID].ADAddCnt != item.ADAddCnt;
+            fbInfoDict[mapID].ADAddCnt = item.ADAddCnt;
+
+            isBuyAddCntChange = fbInfoDict[mapID].BuyAddCnt != item.BuyAddCnt;
+            fbInfoDict[mapID].BuyAddCnt = item.BuyAddCnt;
+
+            isItemAddCntChange = fbInfoDict[mapID].ItemAddCnt != item.ItemAddCnt;
+            fbInfoDict[mapID].ItemAddCnt = item.ItemAddCnt;
+
+            fbInfoDict[mapID].PassLineID = item.PassLineID;
+            fbInfoDict[mapID].PassGradeCnt = item.PassGradeCnt;
+            fbInfoDict[mapID].PassGrade = item.PassGrade;
+
+            UpdateFBInfoListEvent?.Invoke(mapID);
+            UpdateFBInfoChangeEvent?.Invoke(mapID, isADAddCntChange, isBuyAddCntChange, isItemAddCntChange);
+        }
+    }
+
+    public void UpdateRecords(HA3BD_tagMCBuyEnterInfo.tagMCBuyInfo[] vNetDatas)
+    {
+        for (int i = 0; i < vNetDatas.Length; i++)
+        {
+            var info = vNetDatas[i];
+            var dungeonId = (int)info.FBID;
+            if (dungeonRecords.ContainsKey(dungeonId))
+            {
+                dungeonRecords[dungeonId].UpdateRecord(info);
+            }
+            else
+            {
+                dungeonRecords[dungeonId] = new DungeonRecord(info);
+            }
+        }
+        if (updateDungeonBuyCnt != null)
+        {
+            updateDungeonBuyCnt();
+        }
+    }
+
+
+
+}
+
+public class FBInfo
+{
+    public uint MapID;
+    public ushort EnterCnt;        //浠婃棩绱杩涘叆娆℃暟
+    public byte ADAddCnt;        //骞垮憡澧炲姞娆℃暟
+    public byte BuyAddCnt;        //璐拱澧炲姞娆℃暟
+    public ushort ItemAddCnt;        //鐗╁搧澧炲姞娆℃暟
+    public uint PassLineID;        //宸茶繃鍏冲埌鐨刲ineID
+    public byte PassGradeCnt;        //鏄熺骇鍊煎搴斾釜鏁�, 姣忎釜key瀛�9涓猯ineID
+    public uint[] PassGrade;        //鍓湰绾胯矾瀵瑰簲鏄熺骇鍊煎垪琛�
+}
+
diff --git a/Main/System/Dungeon/DungeonModel.cs.meta b/Main/System/Dungeon/DungeonManager.cs.meta
similarity index 100%
rename from Main/System/Dungeon/DungeonModel.cs.meta
rename to Main/System/Dungeon/DungeonManager.cs.meta
diff --git a/Main/System/Dungeon/DungeonModel.cs b/Main/System/Dungeon/DungeonModel.cs
deleted file mode 100644
index c6942c9..0000000
--- a/Main/System/Dungeon/DungeonModel.cs
+++ /dev/null
@@ -1,71 +0,0 @@
-锘縰sing System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using System;
-using LitJson;
-
-
-public class DungeonModel : GameSystemManager<DungeonModel>
-{
-
-    Dictionary<int, DungeonRecord> dungeonRecords = new Dictionary<int, DungeonRecord>();
-
-    public event Action<int> dungeonRecordChangeEvent;
-    public event Action updateDungeonBuyCnt;
-
-    public override void Init()
-    {
-
-    }
-
-    public override void Release()
-    {
-    }
-
-    public void UpdateRecords(HA320_tagMCPlayerFBInfoData.tagMCFBInfo[] _serverInfos)
-    {
-        for (int i = 0; i < _serverInfos.Length; i++)
-        {
-            var info = _serverInfos[i];
-            var dungeonId = (int)info.FBID;
-            if (dungeonRecords.ContainsKey(dungeonId))
-            {
-                dungeonRecords[dungeonId].UpdateRecord(info);
-            }
-            else
-            {
-                dungeonRecords[dungeonId] = new DungeonRecord(info);
-            }
-
-            if (dungeonRecordChangeEvent != null)
-            {
-                dungeonRecordChangeEvent(dungeonId);
-            }
-        }
-
-    }
-    
-    public void UpdateRecords(HA3BD_tagMCBuyEnterInfo.tagMCBuyInfo[] vNetDatas)
-    {
-        for (int i = 0; i < vNetDatas.Length; i++)
-        {
-            var info = vNetDatas[i];
-            var dungeonId = (int)info.FBID;
-            if (dungeonRecords.ContainsKey(dungeonId))
-            {
-                dungeonRecords[dungeonId].UpdateRecord(info);
-            }
-            else
-            {
-                dungeonRecords[dungeonId] = new DungeonRecord(info);
-            }
-        }
-        if (updateDungeonBuyCnt != null)
-        {
-            updateDungeonBuyCnt();
-        }
-    }
-
-}
-
-
diff --git a/Main/System/Equip/EquipExchangeWin.cs b/Main/System/Equip/EquipExchangeWin.cs
index fb3c1c2..ba25835 100644
--- a/Main/System/Equip/EquipExchangeWin.cs
+++ b/Main/System/Equip/EquipExchangeWin.cs
@@ -31,7 +31,7 @@
 
 
 
-    protected override void OnPreClose()
+    protected override void OnClose()
     {
         EquipModel.Instance.OnEquipOPResultAction -= OnRefreshItem;
         // 閫氱煡涓绘垬鍦�
diff --git a/Main/System/Equip/EquipModel.cs b/Main/System/Equip/EquipModel.cs
index f6f2ead..b8c4317 100644
--- a/Main/System/Equip/EquipModel.cs
+++ b/Main/System/Equip/EquipModel.cs
@@ -283,8 +283,11 @@
         if (waitEquipOP.Count == 0)
             return null;
 
-        return PackManager.Instance.GetItemByIndex(PackType.DropItem, waitEquipOP.Dequeue());
+        // 鏂版墜寮曞涓紝涓嶅厑璁稿垏鎹㈣澶囩晫闈�
+        if (NewBieCenter.Instance.inGuiding)
+            return null;
 
+        return PackManager.Instance.GetItemByIndex(PackType.DropItem, waitEquipOP.Dequeue());
     }
 
 
diff --git a/Main/System/FirstCharge/FirstChargeManager.cs b/Main/System/FirstCharge/FirstChargeManager.cs
index 8c5cb99..353ddd8 100644
--- a/Main/System/FirstCharge/FirstChargeManager.cs
+++ b/Main/System/FirstCharge/FirstChargeManager.cs
@@ -30,7 +30,8 @@
         DTC0403_tagPlayerLoginLoadOK.playerLoginOkEvent += OnPlayerLoginOk;
         RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent;
         FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
-
+        InitClickTabDict();
+        InitRedPoint();
     }
 
     public override void Release()
@@ -110,15 +111,15 @@
     {
         firstChargeInfoDict.Clear();
     }
+
     public void OnPlayerLoginOk()
     {
-        InitClickTabDict();
-        InitRedPoint();
-        if (FuncOpen.Instance.IsFuncOpen(FuncID)&& TryGetUnBuyFirstId(out int firstId))
+        if (FuncOpen.Instance.IsFuncOpen(FuncID) && TryGetUnBuyFirstId(out int firstId))
         {
             PopupWindowsProcessor.Instance.Add("FirstChargeWin");
         }
     }
+
     public bool TryGetFirstChargeDataByFirstId(int firstId, out FirstChargeData firstChargeData)
     {
         return firstChargeInfoDict.TryGetValue(firstId, out firstChargeData);
@@ -254,7 +255,7 @@
         UpdateRedPoint();
         OnUpdateFirstChargeInfo?.Invoke();
     }
-    
+
     /// <summary>
     /// 妫�鏌ユ槸鍚︽墍鏈夐鍏呭鍔遍兘宸查鍙栵紝濡傛灉鏄紝鍒欏皢褰撳墠鏈嶅姟鍣ㄦ椂闂翠繚瀛樺埌鏈湴
     /// </summary>
@@ -355,7 +356,7 @@
             }
         }
     }
-    
+
     // 妫�鏌ユ槸鍚︽墍鏈夐鍏呭鍔遍兘宸茬粡棰嗗彇
     public bool IsAllFirstChargeRewardsClaimed()
     {
@@ -363,17 +364,17 @@
         var firstChargeIds = FirstChargeConfig.GetKeys();
         if (firstChargeIds == null || firstChargeIds.Count == 0)
             return false;
-            
+
         foreach (var firstId in firstChargeIds)
         {
             // 灏濊瘯鑾峰彇棣栧厖鏁版嵁
             if (!TryGetFirstChargeDataByFirstId(firstId, out var firstChargeData))
                 return false;
-                
+
             // 妫�鏌ユ槸鍚﹁喘涔�
             if (!firstChargeData.IsBuy())
                 return false;
-                
+
             // 妫�鏌ユ槸鍚︽墍鏈夊鍔遍兘宸查鍙�
             if (!firstChargeData.IsAllHave())
                 return false;
@@ -383,32 +384,32 @@
         // 妫�鏌ユ槸鍚﹀凡缁忚繃浜嗙浜屽ぉ0鐐�
         return true;
     }
-    
+
     // 妫�鏌ユ槸鍚﹀凡缁忚繃浜嗘墍鏈夊鍔遍鍙栧畬姣曞悗鐨勭浜屽ぉ0鐐�
     public bool IsNextDayAfterAllClaimed()
     {
         // 鐢熸垚涓�涓敮涓�鐨勯敭鏉ヨ幏鍙栨椂闂�
         string key = $"FirstCharge_AllRewardsClaimed_Time_{PlayerDatas.Instance.baseData.PlayerID}";
-        
+
         // 妫�鏌ユ槸鍚﹀瓨鍦ㄨ褰曠殑鏃堕棿鎴�
         if (!LocalSave.HasKey(key))
             return false;
-        
+
         // 鑾峰彇璁板綍鐨勬椂闂存埑
         string timeString = LocalSave.GetString(key);
         if (string.IsNullOrEmpty(timeString))
             return false;
-        
+
         // 瑙f瀽鏃堕棿鎴�
         if (!long.TryParse(timeString, out long ticks))
             return false;
-        
+
         // 灏嗘椂闂存埑杞崲涓篋ateTime
         DateTime allRewardsClaimedTime = new DateTime(ticks);
-        
+
         // 璁$畻绗簩澶�0鐐圭殑鏃堕棿
         DateTime nextDayStart = allRewardsClaimedTime.Date.AddDays(1);
-        
+
         // 鍒ゆ柇褰撳墠鏈嶅姟鍣ㄦ椂闂存槸鍚﹀凡缁忚繃浜嗙浜屽ぉ0鐐�
         DateTime serverNow = TimeUtility.ServerNow;
         return serverNow >= nextDayStart;
@@ -458,8 +459,8 @@
         }
         return true;
     }
-    
-   // ... existing code ...
+
+    // ... existing code ...
     /// <summary>
     /// 鑾峰彇褰撳墠鏃堕棿鏄喘涔拌繖妗e厖鍊肩ぜ鍖呯殑绗嚑澶�
     /// 璐拱鐨勫綋澶╃畻浣滅涓�澶╋紝绗簩澶�0鐐瑰悗绠楃浜屽ぉ锛屼互姝ょ被鎺�
@@ -469,15 +470,15 @@
     {
         DateTime serverNow = TimeUtility.ServerNow;
         DateTime chargeTime = TimeUtility.GetTime(ChargeTime);
-      
+
         DateTime chargeDate = chargeTime.Date;
         DateTime serverDate = serverNow.Date;
-        
+
         // 璁$畻浠庡厖鍊兼棩鏈熷埌褰撳墠鏃ユ湡鐨勫畬鏁村ぉ鏁�
         // 璐拱鐨勫綋澶╃畻绗竴澶╋紝绗簩澶�0鐐瑰悗绠楃浜屽ぉ
         TimeSpan timeSpan = serverDate - chargeDate;
         int days = (int)timeSpan.TotalDays + 1; // +1 鍥犱负褰撳ぉ绠楃涓�澶�
-        
+
         int maxDay = FirstChargeManager.Instance.maxDay;
 
         return Mathf.Min(maxDay, Mathf.Max(1, days));
diff --git a/Main/System/Mail/MailManager.cs b/Main/System/Mail/MailManager.cs
index 2c3a8ff..477112c 100644
--- a/Main/System/Mail/MailManager.cs
+++ b/Main/System/Mail/MailManager.cs
@@ -22,16 +22,12 @@
     public readonly string dateFormat = "yyyy.MM.dd";
     public string nowUuid = string.Empty;
     public int personalMailMaxLimitCount;
+
+
     public override void Init()
     {
-        if (tabRedpoint0 == null)
-        {
-            tabRedpoint0 = new Redpoint(MainRedDot.MailRepoint, GetTabRedpointId(MailCategory.Personal));
-        }
-        if (tabRedpoint1 == null)
-        {
-            tabRedpoint1 = new Redpoint(MainRedDot.MailRepoint, GetTabRedpointId(MailCategory.Global));
-        }
+        tabRedpoint0 = new Redpoint(MainRedDot.MailRepoint, GetTabRedpointId(MailCategory.Personal));
+        tabRedpoint1 = new Redpoint(MainRedDot.MailRepoint, GetTabRedpointId(MailCategory.Global));
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += OnBeforePlayerDataInitializeEvent;
         personalMailMaxLimitCount = int.Parse(FuncConfigConfig.Get("PersonalMail").Numerical1);
     }
@@ -143,7 +139,7 @@
         {
             // 灏忎簬1澶╋紙浣嗘湭杩囨湡锛夛細鎸夌簿纭殑灏忔椂/鍒嗛挓鏄剧ず銆�
             TimeSpan t = TimeSpan.FromDays(days);
-            result = Language.Get("Mail12",StringUtility.Contact( " ", Language.Get("Mail13", t.Hours, t.Minutes)));
+            result = Language.Get("Mail12", StringUtility.Contact(" ", Language.Get("Mail13", t.Hours, t.Minutes)));
         }
         else
         {
diff --git a/Main/System/Main/MainWin.cs b/Main/System/Main/MainWin.cs
index 06de8d3..993e17d 100644
--- a/Main/System/Main/MainWin.cs
+++ b/Main/System/Main/MainWin.cs
@@ -1,3 +1,4 @@
+using System;
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
@@ -49,6 +50,7 @@
     {
         PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
         AutoFightModel.Instance.OnFightEvent += OnSkillCast;
+        ChallengeTabWin.OnCloseChallengeTabWin += OnCloseChallengeTabWin;
         base.OnPreOpen();
 
         // 鍒锋柊UI
@@ -59,15 +61,22 @@
     {
         PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
         AutoFightModel.Instance.OnFightEvent -= OnSkillCast;
+        ChallengeTabWin.OnCloseChallengeTabWin -= OnCloseChallengeTabWin;
         base.OnPreClose();
     }
 
+    private void OnCloseChallengeTabWin()
+    {
+        tabButtons[3].state = TitleBtnState.Normal;
+        tabButtons[3].UpdateButtonState();
+    }
 
     protected override void SelectBottomTab(int index)
     {
         if (index == 3)
         {
             //鎸戞垬鐗规畩鏄剧ず閫昏緫
+            UIManager.Instance.OpenWindow<ChallengeTabWin>();
             return;
         }
 
diff --git a/Main/System/NewBieGuidance/NewBieCenter.cs b/Main/System/NewBieGuidance/NewBieCenter.cs
index 4ea2df5..63fd9a6 100644
--- a/Main/System/NewBieGuidance/NewBieCenter.cs
+++ b/Main/System/NewBieGuidance/NewBieCenter.cs
@@ -30,12 +30,15 @@
     List<int> allGuides = new List<int>();
     public List<int> completeGuidesBuf = new List<int>();
 
+    //鍥犲叾浠栧師鍥犲鑷寸殑绛夊緟鏄剧ず鐨勫紩瀵肩獥鍙o紝鍦∣penWindow鏃朵細瑙﹀彂澶嶆煡锛屼絾鏃舵満澶櫄澧炲姞鍏抽棴鐣岄潰鏃惰Е鍙�
+    List<string> waitGuideWinNames = new List<string>();    
 
     bool inited = false;
 
     public event Action guideStepChangeEvent;
     public event Action guideBeginEvent;
     public event Action<int> guideCompletedEvent;
+    
 
     public override void Init()
     {
@@ -44,6 +47,7 @@
         FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
         PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
         UIManager.Instance.OnOpenWindow += OnOpenWindow;
+        UIManager.Instance.OnCloseWindow += OnCloseWindow;
     }
 
     public override void Release()
@@ -53,6 +57,7 @@
         FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
         PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
         UIManager.Instance.OnOpenWindow -= OnOpenWindow;
+        UIManager.Instance.OnCloseWindow -= OnCloseWindow;
     }
 
     void OnOpenWindow(UIBase _ui)
@@ -61,6 +66,22 @@
         if (guides != null)
         {
             TryStartNewBieGuides(guides);
+        }
+    }
+
+    //鍏抽棴鍏朵粬鐣岄潰鏃跺鏌ユ湁娌¢渶瑕佺瓑寰呯殑寮曞
+    void OnCloseWindow(UIBase _ui)
+    {
+        foreach (var winName in waitGuideWinNames)
+        {
+            var guides = GuideConfig.GetGuideListByWinName(winName);
+            if (guides != null)
+            {
+                if (TryStartNewBieGuides(guides))
+                {
+                    break;
+                }
+            }
         }
     }
 
@@ -78,7 +99,7 @@
         var guides = GuideConfig.GetGuideListByType((int)GuideTriggerType.MissionClick);
         if (guides != null)
         {
-            TryStartNewBieGuides(guides);
+            TryStartNewBieGuides(guides, true);
         }
     }
 
@@ -142,7 +163,8 @@
     }
 
     //鎵惧嚭鍙繘琛岀殑寮曞
-    public void TryStartNewBieGuides(List<int> _guides)
+    //isOrgTrigger 鏄惁鏄師鐢熻Е鍙戯紝濡傜偣鍑荤殑鍙兘鏄師鐢熻Е鍙戯紝鍏朵粬鐨勯兘涓嶈兘
+    public bool TryStartNewBieGuides(List<int> _guides, bool isOrgTrigger = false)
     {
         if (!inited)
         {
@@ -157,15 +179,14 @@
 
         if (_guides == null)
         {
-            return;
+            return false;
         }
 
         if (currentGuide != 0)
         {
-            return;
+            return false;
         }
 
-        var ok = false;
         for (int i = 0; i < _guides.Count; i++)
         {
             var guideId = _guides[i];
@@ -181,33 +202,57 @@
                 continue;
             }
 
-            ok = CheckGuideCondition(guideId);
-            if (ok && currentGuide != guideId)
+            if (currentGuide != guideId && CheckGuideCondition(guideId, isOrgTrigger))
             {
-                StartNewBieGuide(guideId);
-                break;
+                return StartNewBieGuide(guideId);
             }
         }
-
+        
+        return false;
     }
 
 
-    public void StartNewBieGuide(int _id)
+    bool WaitGuide(int _id)
+    {
+        var config = GuideConfig.Get(_id);
+        if (UIManager.Instance.ExistAnyFullScreenOrMaskWin(config.WinName))
+        {
+            if (!waitGuideWinNames.Contains(config.WinName))
+            {
+                waitGuideWinNames.Add(config.WinName);
+            }
+            return true;
+        }
+
+
+        return false;
+    }
+
+    public bool StartNewBieGuide(int _id)
     {
         if (_id == 0)
         {
             Debug.LogError("璇锋鏌ュ紩瀵糹d = 0 鐨勬儏鍐�");
-            return;
+            return false;
         }
 
         var config = GuideConfig.Get(_id);
         if (config == null)
         {
             Debug.LogError($"娌℃湁璇ュ紩瀵糏D锛岃妫�鏌ュ紩瀵糹d = {_id} 鐨勬儏鍐�");
-            return;
+            return false;
         }
 
-        AutoFightModel.Instance.isPause = true;
+        if (WaitGuide(_id))
+        {
+            return false;
+        }
+        if (waitGuideWinNames.Contains(config.WinName))
+        {
+            waitGuideWinNames.Remove(config.WinName);
+        }
+
+        BattleManager.Instance.storyBattleField.IsPause = true;
         currentGuide = _id;
 
         guideStep = config.Steps.Length > 0 ? config.Steps[0] : 0;
@@ -226,7 +271,13 @@
             guideStepChangeEvent?.Invoke();
         }
         UIManager.Instance.CloseWindow<ChatWin>();
+        return true;
 
+    }
+
+    bool IsNeedRecord(int _id)
+    {
+        return GuideConfig.Get(_id).NoRecord == 0;
     }
 
     public void FinishNewBieGuide(int _id)
@@ -235,54 +286,67 @@
         currentGuide = 0;
 
         UIManager.Instance.CloseWindow<NewBieWin>();
-        if (!completeGuidesBuf.Contains(guideRecord))
+        if (IsNeedRecord(_id))
         {
-            completeGuidesBuf.Add(guideRecord);
-        }
+            if (!completeGuidesBuf.Contains(guideRecord))
+            {
+                completeGuidesBuf.Add(guideRecord);
+            }
 
-        var send = new CA222_tagCMSetGuideOK();
-        send.GuideIndex = (byte)_id;
-        send.IsOK = 1;
-        GameNetSystem.Instance.SendInfo(send);
+            var send = new CA222_tagCMSetGuideOK();
+            send.GuideIndex = (byte)_id;
+            send.IsOK = 1;
+            GameNetSystem.Instance.SendInfo(send);
+        }
 
         if (guideCompletedEvent != null)
         {
             guideCompletedEvent(guideRecord);
         }
 
-        AutoFightModel.Instance.isPause = false;
+        BattleManager.Instance.storyBattleField.IsPause = false;
     }
 
     public void RemoveNewBieGuide(int _id)
     {
-        if (!completeGuidesBuf.Contains(_id))
+        if (IsNeedRecord(_id))
         {
-            completeGuidesBuf.Add(_id);
-        }
+            if (!completeGuidesBuf.Contains(_id))
+            {
+                completeGuidesBuf.Add(_id);
+            }
 
-        var send = new CA222_tagCMSetGuideOK();
-        send.GuideIndex = (byte)_id;
-        send.IsOK = 1;
-        GameNetSystem.Instance.SendInfo(send);
+            var send = new CA222_tagCMSetGuideOK();
+            send.GuideIndex = (byte)_id;
+            send.IsOK = 1;
+            GameNetSystem.Instance.SendInfo(send);
+        }
     }
 
     public void FinishCurrentGuideWithoutCloseWin()
     {
         var guideRecord = currentGuide;
         currentGuide = 0;
-        completeGuidesBuf.Add(guideRecord);
 
-        var send = new CA222_tagCMSetGuideOK();
-        send.GuideIndex = (byte)guideRecord;
-        send.IsOK = 1;
-        GameNetSystem.Instance.SendInfo(send);
+        if (IsNeedRecord(guideRecord))
+        {
+            if (!completeGuidesBuf.Contains(guideRecord))
+            {
+                completeGuidesBuf.Add(guideRecord);
+            }
+
+            var send = new CA222_tagCMSetGuideOK();
+            send.GuideIndex = (byte)guideRecord;
+            send.IsOK = 1;
+            GameNetSystem.Instance.SendInfo(send);
+        }
 
         if (guideCompletedEvent != null)
         {
             guideCompletedEvent(guideRecord);
         }
 
-        AutoFightModel.Instance.isPause = false;
+        BattleManager.Instance.storyBattleField.IsPause = false;
     }
 
     public void ReportGuideStepComplete(int _step)
@@ -315,8 +379,8 @@
     }
 
 
-
-    public bool CheckGuideCondition(int _guideId)
+    //isOrgTrigger 鏄惁鏄師鐢熻Е鍙戯紝濡傜偣鍑荤殑鍙兘鏄師鐢熻Е鍙戯紝鍏朵粬鐨勯兘涓嶈兘
+    public bool CheckGuideCondition(int _guideId, bool isOrgTrigger)
     {
         var config = GuideConfig.Get(_guideId);
         if (config == null)
@@ -324,34 +388,41 @@
             return false;
         }
         if (!UIManager.Instance.IsOpened(config.WinName))
-        { 
+        {
             return false;
         }
 
         switch ((GuideTriggerType)config.TriggerType)
-            {
-                case GuideTriggerType.None:
-                    return true;
-                case GuideTriggerType.FunctionOpen:
-                    return FuncOpen.Instance.IsFuncOpen(config.Condition);
-                case GuideTriggerType.Level:
-                    return PlayerDatas.Instance.baseData.LV >= config.Condition;
-                case GuideTriggerType.OpenWindow:
-                    return UIManager.Instance.IsOpened(config.WinName);
-                case GuideTriggerType.MainLineQuestCanDo:
-                    if (config.SupplementCondition == 2)
-                    {
-                        return TaskManager.Instance.mainTask.TaskID == config.Condition && TaskManager.Instance.GetMainTaskState() == 2;
-                    }
-                    return TaskManager.Instance.mainTask.TaskID == config.Condition;
-                case GuideTriggerType.Map:
-                    return PlayerDatas.Instance.baseData.ExAttr1 >= config.Condition;
-                case GuideTriggerType.MissionClick:
-                    return TaskManager.Instance.GetMainTaskType() == config.Condition;
-                default:
-                    return false;
-            }
+        {
+            case GuideTriggerType.None:
+                return true;
+            case GuideTriggerType.FunctionOpen:
+                return FuncOpen.Instance.IsFuncOpen(config.Condition);
+            case GuideTriggerType.Level:
+                return PlayerDatas.Instance.baseData.LV >= config.Condition;
+            case GuideTriggerType.OpenWindow:
+                return UIManager.Instance.IsOpened(config.WinName);
+            case GuideTriggerType.MainLineQuestCanDo:
+                if (config.SupplementCondition == 2)
+                {
+                    return TaskManager.Instance.mainTask.TaskID == config.Condition && TaskManager.Instance.GetMainTaskState() == 2;
+                }
+                return TaskManager.Instance.mainTask.TaskID == config.Condition;
+            case GuideTriggerType.Map:
+                return PlayerDatas.Instance.baseData.ExAttr1 >= config.Condition;
+            case GuideTriggerType.MissionClick:
+                //鍙湁鐪熸鐐瑰嚮鎵嶅彲浠ヨЕ鍙�
+                if (isOrgTrigger)
+                {
+                    return TaskManager.Instance.GetMainTaskType() == config.Condition && TaskManager.Instance.GetMainTaskState() != 2;
+                }
+                return false;
+            default:
+                return false;
+        }
     }
+
+
 
     public void CompleteAllGuides()
     {
@@ -363,10 +434,14 @@
         currentGuide = 0;
         UIManager.Instance.CloseWindow<NewBieWin>();
 
+        completeGuidesBuf.Clear();
         var allGuideKeys = GuideConfig.GetKeys();
         for (int i = 0; i < allGuideKeys.Count; i++)
         {
-            completeGuidesBuf.Add(allGuideKeys[i]);
+            if (IsNeedRecord(allGuideKeys[i]))
+            {
+                completeGuidesBuf.Add(allGuideKeys[i]);
+            }
         }
 
     }
diff --git a/Main/System/NewBieGuidance/NewBieWin.cs b/Main/System/NewBieGuidance/NewBieWin.cs
index 19c9656..4239c72 100644
--- a/Main/System/NewBieGuidance/NewBieWin.cs
+++ b/Main/System/NewBieGuidance/NewBieWin.cs
@@ -62,7 +62,7 @@
         NewBieCenter.Instance.guideStepChangeEvent += OnStepChange;
     }
 
-    protected override void OnPreClose()
+    protected override void OnClose()
     {
         NewBieCenter.Instance.guideStepChangeEvent -= OnStepChange;
         if (NewBieCenter.Instance.currentGuide != 0)
@@ -102,8 +102,15 @@
         {
             m_ClickTarget = FindTransform(stepConfig.UIElementPath);
             if (m_ClickTarget != null)
-            { 
+            {
                 m_lastTargetPosition = m_ClickTarget.position;
+            }
+            else
+            {
+                #if UNITY_EDITOR
+                if (!string.IsNullOrEmpty(stepConfig.UIElementPath))
+                    Debug.LogError($"寮曞姝ラ{step}鎵句笉鍒扮洰鏍噞stepConfig.UIElementPath}, 鑻ヤ笉闇�瑕佽鍒犻櫎璺緞");
+                #endif
             }
         }
         catch (Exception ex)
@@ -249,6 +256,10 @@
     {
         if (Input.GetMouseButtonUp(0))
         {
+            if (stepConfig == null)
+            {
+                return;
+            }
             if (stepConfig.clickAnyWhereComplete || m_NewBieMask.mask.IsInCirleArea(Input.mousePosition, CameraManager.uiCamera))
             {
                 if (m_ClickTarget == null)
diff --git a/Main/System/Redpoint/MainRedDot.cs b/Main/System/Redpoint/MainRedDot.cs
index 315913f..4f3fec5 100644
--- a/Main/System/Redpoint/MainRedDot.cs
+++ b/Main/System/Redpoint/MainRedDot.cs
@@ -96,7 +96,7 @@
     public const int FairySiegeRepoint = 466; //浠欑洘鏀诲煄鎴�
     public const int MailRepoint = 467; //閭
     public const int FirstChargeRepoint = 468; //棣栧厖
-
+    public const int BoneFieldRepoint = 469; //鐧介鐩堥噹
 
 
     public void Register()
diff --git a/Main/System/Tip/ConfirmCancel.cs b/Main/System/Tip/ConfirmCancel.cs
index 58b15e0..88c0465 100644
--- a/Main/System/Tip/ConfirmCancel.cs
+++ b/Main/System/Tip/ConfirmCancel.cs
@@ -336,6 +336,7 @@
     Auction = 0, //鎷嶅崠琛�
     WashCancel = 1, //娲楃粌鍙栨秷
     GoldRush = 2,   //娣橀噾 
+    BoneField = 3,   //鐧介鐩堥噹
 }
 
 

--
Gitblit v1.8.0