From bddf4df7cbb292011a974b705d6f6d94c0ac6cc1 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期二, 09 十二月 2025 11:44:17 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts

---
 Main/System/OSActivity/OSRankHeroCallAwardCell.cs.meta                                           |   11 
 Main/System/GeneralConfig/DayRemind.cs                                                           |    2 
 Main/System/OSActivity/OSRankMainLeveAwardWin.cs                                                 |   82 ++
 Main/System/OSActivity/OSRankMainLeveAwardWin.cs.meta                                            |   11 
 Main/System/Redpoint/MainRedDot.cs                                                               |    4 
 Main/Component/UI/Common/FuncOpen.cs                                                             |  187 +++++-
 Main/System/OSActivity/OSRankHeroCallAwardWin.cs.meta                                            |   11 
 Main/System/OSActivity/OSRankHeroCallGiftWin.cs                                                  |   63 ++
 Main/System/Store/StoreModel.cs                                                                  |   17 
 Main/Core/NetworkPackage/ServerPack/HAB_Activity/HAB05_tagSCOSACelebrationInfo.cs.meta           |   11 
 Main/System/FunctionPreview/FunctionPreviewCell.cs.meta                                          |   11 
 Main/System/OSActivity/OSActivityManager.cs.meta                                                 |   11 
 Main/System/BillboardRank/RankModel.cs                                                           |   35 +
 Main/System/FunctionPreview/FunctionPreviewCell.cs                                               |   53 +
 Main/Utility/EnumHelper.cs                                                                       |    4 
 Main/System/OSActivity/OSActivityManager.cs                                                      |  190 ++++++
 Main/System/OSActivity/OSRankMainLeveAwardCell.cs.meta                                           |   11 
 Main/System/BillboardRank/PlayerRankCell.cs                                                      |   17 
 Main/System/FunctionPreview.meta                                                                 |    8 
 Main/System/OSActivity/OSRankHeroCallGiftWin.cs.meta                                             |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity.meta                                    |    8 
 Main/Core/NetworkPackage/ServerPack/HAB_Activity.meta                                            |    8 
 Main/System/OSActivity/OSHeroCallBaseWin.cs                                                      |   46 +
 Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity/DTCAB05_tagSCOSACelebrationInfo.cs      |   11 
 Main/System/HeroUI/HeroListWin.cs                                                                |    3 
 Main/System/OSActivity/OSRankMainLeveAwardCell.cs                                                |   58 ++
 Main/System/OSActivity/OSMainLevelBaseWin.cs.meta                                                |   11 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs                   |    2 
 Main/System/OSActivity/OSRankHeroCallGiftCell.cs                                                 |  120 ++++
 Main/System/FunctionPreview/FunctionPreviewWin.cs                                                |   48 +
 Main/System/HeroUI/HeroCardCell.cs                                                               |    4 
 Main/System/MainLevel/MainBossEnterWin.cs                                                        |    3 
 Main/System/OSActivity/OSHeroCallBaseWin.cs.meta                                                 |   11 
 Main/Core/NetworkPackage/ServerPack/HAB_Activity/HAB05_tagSCOSACelebrationInfo.cs                |   19 
 Main/System/OSActivity/OSRankWin.cs                                                              |   61 ++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity/DTCAB05_tagSCOSACelebrationInfo.cs.meta |   11 
 Main/System/FunctionPreview/FunctionPreviewWin.cs.meta                                           |   11 
 Main/System/BillboardRank/PlayerTop3Cell.cs                                                      |    8 
 Main/System/FirstCharge/FirstChargeWin.cs                                                        |    4 
 Main/System/Hero/HeroManager.cs                                                                  |    5 
 Main/System/Main/HomeWin.cs                                                                      |   41 +
 Main/System/BillboardRank/PlayerRankWin.cs                                                       |   25 
 Main/Main.cs                                                                                     |    1 
 Main/Config/Configs/FuncOpenLVConfig.cs                                                          |    9 
 Main/Config/Configs/StoreConfig.cs                                                               |    5 
 Main/System/OSActivity/OSMainLevelBaseWin.cs                                                     |   53 +
 Main/System/OSActivity/OSRankHeroCallAwardCell.cs                                                |   58 ++
 Main/System/OSActivity/OSRankHeroCallAwardWin.cs                                                 |   83 ++
 Main/System/HeroUI/HeroUIManager.Reborn.cs                                                       |   69 ++
 Main/System/Main/RightFuncInHome.cs                                                              |    9 
 Main/System/OSActivity/OSRankHeroCallGiftCell.cs.meta                                            |   11 
 Main/System/OSActivity.meta                                                                      |    8 
 Main/System/OSActivity/OSRankWin.cs.meta                                                         |   11 
 Main/System/HeroUI/HeroUIManager.cs                                                              |   37 +
 54 files changed, 1,514 insertions(+), 108 deletions(-)

diff --git a/Main/Component/UI/Common/FuncOpen.cs b/Main/Component/UI/Common/FuncOpen.cs
index 52491df..1a575b9 100644
--- a/Main/Component/UI/Common/FuncOpen.cs
+++ b/Main/Component/UI/Common/FuncOpen.cs
@@ -1,8 +1,8 @@
 锘縰sing System;
-using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 using LitJson;
+using System.Linq;
 
 public class FuncOpen
 {
@@ -92,7 +92,7 @@
     {
         for (int i = 0; i < vNetData.FuncCount; i++)
         {
-            
+
             var funcState = vNetData.FuncStateList[i];
 
             bool bPerFuncIsOpen = false;
@@ -109,6 +109,10 @@
                 funcOpenState[funcState.FuncID] = funcState.State == 1;
                 bAfterFuncIsOpen = funcOpenState[funcState.FuncID];
             }
+
+            awardStateDict[funcState.FuncID] = funcState.AwardState == 1;
+            UpdatePreviewRedpoint();
+
             if (OnFuncStateChangeEvent != null)
             {
                 OnFuncStateChangeEvent(funcState.FuncID);
@@ -118,7 +122,7 @@
 
     private bool IsFuncOpen(int key, out int errorCode)
     {
-        
+
         errorCode = 0;
         var config = FuncOpenLVConfig.Get(key);
         if (config == null)
@@ -129,7 +133,7 @@
         if (config.OpenDay > 0)
         {
             if (config.OpenDay > TimeUtility.OpenDay + 1)
-            { 
+            {
                 errorCode = 2;
                 return false;
             }
@@ -218,53 +222,11 @@
                         SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_Mission", TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID)));
                         break;
                     case 5:
-                        SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_ManLevel", config.ManLevel/10000, config.ManLevel/100%100, config.ManLevel%100));
+                        SysNotifyMgr.Instance.ShowStringTip(Language.Get("FuncLimit_ManLevel", config.ManLevel / 10000, config.ManLevel / 100 % 100, config.ManLevel % 100));
                         break;
                 }
             }
         }
-    }
-
-
-    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 Language.Get("FuncLimit_Level", config.LimitLV);
-                case 2:
-                    //寮�鏈嶅灏戝ぉ 涓�鑸槸缁勫悎
-                    if (config.LimitLV != 0)
-                    {
-                        return Language.Get("FuncLimit_OpenDay_LV", config.LimitLV, TimeUtility.OpenDay + 1, config.OpenDay);
-
-                    }
-                    else if (config.LimitMissionID != 0)
-                    {
-                        return Language.Get("FuncLimit_OpenDay_Mission", TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID), TimeUtility.OpenDay + 1, config.OpenDay);
-                    }
-                    else if (config.LimiRealmLV != 0)
-                    {
-                        return Language.Get("FuncLimit_OpenDay_Realm", RealmConfig.Get(config.LimiRealmLV).Name, TimeUtility.OpenDay + 1, config.OpenDay);
-                    }
-                    else
-                    {
-                        return Language.Get("FuncLimit_OpenDay", config.OpenDay);
-                    }
-                case 3:
-                    return Language.Get("FuncLimit_Realm", RealmConfig.Get(config.LimiRealmLV).Name);
-                case 4:
-                    return Language.Get("FuncLimit_Mission", TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID));
-                case 5:
-                    return Language.Get("FuncLimit_ManLevel", config.ManLevel/10000, config.ManLevel/100%100, config.ManLevel%100);
-            }
-        }
-        return string.Empty;
     }
 
     public int GetLimitLv(int key)
@@ -300,6 +262,137 @@
         }
         return true;
     }
+
+    #region 鍔熻兘棰勫憡
+    Dictionary<int, bool> awardStateDict = new Dictionary<int, bool>();
+
+    Dictionary<int, int> funcIndexDict = new Dictionary<int, int>();
+    public Dictionary<int, int> GetFuncIndexDict()
+    {
+        if (funcIndexDict.IsNullOrEmpty())
+        {
+            foreach (var funcId in FuncOpenLVConfig.GetKeys())
+            {
+                FuncOpenLVConfig config = FuncOpenLVConfig.Get(funcId);
+                if (config.PreviewIndex > 0)
+                {
+                    funcIndexDict[config.FuncId] = config.PreviewIndex;
+                }
+            }
+        }
+        return funcIndexDict;
+    }
+
+    public List<int> GetSortShowList()
+    {
+        List<int> sortShowList = new List<int>();
+        Dictionary<int, int> indexDict = GetFuncIndexDict();
+        // 鎸夌姸鎬佷紭鍏堢骇鎺掑簭锛氱姸鎬�1锛堝彲棰嗗彇锛�> 鐘舵��0锛堟湭瑙i攣锛�> 鐘舵��2锛堝凡棰嗗彇锛�
+        // 姣忕鐘舵�佸唴鎸� PreviewIndex 鍗囧簭锛岀浉鍚屽垯鎸� FuncId 鍗囧簭
+        sortShowList = indexDict
+            .Select(kv => new { FuncId = kv.Key, PreviewIndex = kv.Value, State = GetState(kv.Key) })
+                .OrderBy(x => x.State == 1 ? 0 : (x.State == 0 ? 1 : 2)) // 鏄犲皠浼樺厛绾э細1鈫�0, 0鈫�1, 2鈫�2
+                .ThenBy(x => x.PreviewIndex)
+                .ThenBy(x => x.FuncId)
+                .Select(x => x.FuncId)
+                .ToList();
+        return sortShowList;
+    }
+
+
+
+    //绗竴涓彲棰嗗彇鐨勭墿鍝佹墍鍦ㄨ绱㈠紩
+    public bool TryGetJumpIndex(out int index)
+    {
+        index = 0;
+        List<int> list = GetSortShowList();
+        if (list.IsNullOrEmpty())
+            return false;
+        for (int i = 0; i < list.Count; i++)
+        {
+            if (GetState(list[i]) == 1)
+            {
+                index = i;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private bool IsAwardHave(int funcId)
+    {
+        return !awardStateDict.TryGetValue(funcId, out bool state) ? false : state;
+    }
+
+    // 0-鏈В閿� 1-鍙鍙� 2-宸查鍙�
+    public int GetState(int funcId)
+    {
+        if (IsAwardHave(funcId))
+            return 2;
+        return IsFuncOpen(funcId) ? 1 : 0;
+    }
+
+
+
+    public string GetErrorStr(int funcId)
+    {
+        if (!FuncOpenLVConfig.HasKey(funcId))
+            return string.Empty;
+        FuncOpenLVConfig config = FuncOpenLVConfig.Get(funcId);
+        List<string> conditionStrs = new List<string>();
+        if (config.LimitLV > 0)
+        {
+            conditionStrs.Add(Language.Get("FunctionPreviewErr01", config.LimitLV));
+        }
+
+        if (config.LimiRealmLV > 0)
+        {
+            conditionStrs.Add(Language.Get("FunctionPreviewErr02", RealmConfig.Get(config.LimiRealmLV).Name));
+        }
+
+        if (config.LimitMissionID > 0)
+        {
+            conditionStrs.Add(Language.Get("FunctionPreviewErr03", TaskManager.Instance.GetNeedFinishTaskCount(config.LimitMissionID)));
+        }
+
+        if (config.OpenDay > 0)
+        {
+            conditionStrs.Add(Language.Get("FunctionPreviewErr04", config.OpenDay));
+        }
+
+        if (config.ManLevel > 0)
+        {
+            conditionStrs.Add(Language.Get("FunctionPreviewErr05", config.ManLevel / 10000, config.ManLevel / 100 % 100, config.ManLevel % 100));
+        }
+
+        if (conditionStrs.Count == 0)
+        {
+            return string.Empty;
+        }
+        string connector = Language.Get("FunctionPreview01"); // "涓�"
+        string unlockStr = Language.Get("FunctionPreview02"); // "瑙i攣"
+        string result = string.Join(connector, conditionStrs) + unlockStr;
+        return result;
+    }
+
+    public void SendGetAward(int funcId)
+    {
+        var pack = new CA504_tagCMPlayerGetReward();
+        pack.RewardType = 17;
+        pack.DataEx = (uint)funcId;
+        GameNetSystem.Instance.SendInfo(pack);
+    }
+
+    Redpoint redpoint = new Redpoint(MainRedDot.RightFuncRedpoint, MainRedDot.FunctionPreviewRepoint);
+
+    public void UpdatePreviewRedpoint()
+    {
+        redpoint.state = RedPointState.None;
+        if (!TryGetJumpIndex(out int index))
+            return;
+        redpoint.state = RedPointState.Simple;
+    }
+    #endregion
 }
 
 public interface ICheckFuncOpen
diff --git a/Main/Config/Configs/FuncOpenLVConfig.cs b/Main/Config/Configs/FuncOpenLVConfig.cs
index 6c1ca9b..8e930b5 100644
--- a/Main/Config/Configs/FuncOpenLVConfig.cs
+++ b/Main/Config/Configs/FuncOpenLVConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           Thursday, November 27, 2025
+//    [  Date ]:           2025骞�12鏈�8鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -25,7 +25,8 @@
 	public string Name;
 	public string Desc;
 	public string Icon;
-	public Dictionary<int, int[][]> Award;
+	public int PreviewIndex;
+	public int[][] AwardList;
 
     public override int LoadKey(string _key)
     {
@@ -55,7 +56,9 @@
 
 			Icon = tables[8];
 
-			Award = ConfigParse.ParseIntArray2Dict(tables[9].Replace("(", "[").Replace(")", "]")); 
+			int.TryParse(tables[9],out PreviewIndex); 
+
+			AwardList = JsonMapper.ToObject<int[][]>(tables[10].Replace("(", "[").Replace(")", "]")); 
         }
         catch (Exception exception)
         {
diff --git a/Main/Config/Configs/StoreConfig.cs b/Main/Config/Configs/StoreConfig.cs
index 26eb7c6..5f4f915 100644
--- a/Main/Config/Configs/StoreConfig.cs
+++ b/Main/Config/Configs/StoreConfig.cs
@@ -1,6 +1,6 @@
 锘�//--------------------------------------------------------
 //    [Author]:           YYL
-//    [  Date ]:           2025骞�10鏈�28鏃�
+//    [  Date ]:           2025骞�12鏈�8鏃�
 //--------------------------------------------------------
 
 using System.Collections.Generic;
@@ -29,6 +29,7 @@
 	public int MoneyOriginal;
 	public int UnlockType;
 	public int UnlockValue;
+	public string Name;
 
     public override int LoadKey(string _key)
     {
@@ -65,6 +66,8 @@
 			int.TryParse(tables[11],out UnlockType); 
 
 			int.TryParse(tables[12],out UnlockValue); 
+
+			Name = tables[13];
         }
         catch (Exception exception)
         {
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
index 6b5f439..19f1016 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H01_System/DTC0102_tagCDBPlayer.cs
@@ -7,7 +7,7 @@
 
     public static event Action beforePlayerDataInitializeEvent; //閲嶇櫥鍒囨崲璐﹀彿 鎴栬�� 鐭殏鐨勬柇绾块噸杩� 閮戒細瑙﹀彂
     public static event Action beforePlayerDataInitializeEventOnRelogin;    //閲嶇櫥鍒囨崲璐﹀彿瑙﹀彂
-    public static event Action beforePlayerDataInitializeEventOnReconnect;    //鏂嚎閲嶈繛瑙﹀彂
+    public static event Action beforePlayerDataInitializeEventOnReconnect;    //鍚岃处鍙锋柇绾块噸杩炶Е鍙�
     public static event Action afterPlayerDataInitializeEvent;
     public static event Action switchAccountEvent;
     public static bool isAfterPlayerDataInitialize = false; //鍙尯鍒嗘柇绾块噸杩炶繕鏄畬鍏ㄩ噸鐧�; 鍒囧埌鐧诲綍鍦烘櫙浼氶噸缃负false锛屾晠鍙垽鏂柇绾块噸杩�
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity.meta
new file mode 100644
index 0000000..3249a71
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 6941d0f549d09534083b125a3f958bf6
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity/DTCAB05_tagSCOSACelebrationInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity/DTCAB05_tagSCOSACelebrationInfo.cs
new file mode 100644
index 0000000..6715c77
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity/DTCAB05_tagSCOSACelebrationInfo.cs
@@ -0,0 +1,11 @@
+using UnityEngine;
+using System.Collections;
+
+// AB 05 寮�鏈嶅簡鍏镐俊鎭� #tagSCOSACelebrationInfo
+
+public class DTCAB05_tagSCOSACelebrationInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HAB05_tagSCOSACelebrationInfo vNetData = vNetPack as HAB05_tagSCOSACelebrationInfo;
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity/DTCAB05_tagSCOSACelebrationInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity/DTCAB05_tagSCOSACelebrationInfo.cs.meta
new file mode 100644
index 0000000..7250985
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HAB_Activity/DTCAB05_tagSCOSACelebrationInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dde0a532fce9aff41bd468e6a0b87511
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HAB_Activity.meta b/Main/Core/NetworkPackage/ServerPack/HAB_Activity.meta
new file mode 100644
index 0000000..a22ac7b
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HAB_Activity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 87a175e0ef9386646a517dc77118c1ca
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HAB_Activity/HAB05_tagSCOSACelebrationInfo.cs b/Main/Core/NetworkPackage/ServerPack/HAB_Activity/HAB05_tagSCOSACelebrationInfo.cs
new file mode 100644
index 0000000..629eea4
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HAB_Activity/HAB05_tagSCOSACelebrationInfo.cs
@@ -0,0 +1,19 @@
+using UnityEngine;
+using System.Collections;
+
+// AB 05 寮�鏈嶅簡鍏镐俊鎭� #tagSCOSACelebrationInfo
+
+public class HAB05_tagSCOSACelebrationInfo : GameNetPackBasic {
+    public uint PointTotal;    // 绱搴嗗吀绉垎
+    public uint PointAward;    // 绉垎闃舵濂栧姳璁板綍锛屾寜闃舵绉垎鎺掑簭鍚庣储寮曚簩杩涘埗瀛樺偍鏄惁宸查鍙�
+
+    public HAB05_tagSCOSACelebrationInfo () {
+        _cmd = (ushort)0xAB05;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out PointTotal, vBytes, NetDataType.DWORD);
+        TransBytes (out PointAward, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HAB_Activity/HAB05_tagSCOSACelebrationInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HAB_Activity/HAB05_tagSCOSACelebrationInfo.cs.meta
new file mode 100644
index 0000000..a1b87c8
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HAB_Activity/HAB05_tagSCOSACelebrationInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4b88c80b8a2f30e429deefeacba13d72
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Main.cs b/Main/Main.cs
index c01f11b..c8845f3 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -93,6 +93,7 @@
         managers.Add(FuncNPCManager.Instance);
         managers.Add(GuildBossManager.Instance);
         managers.Add(LineupRecommendManager.Instance);
+        managers.Add(OSActivityManager.Instance);
 
         foreach (var manager in managers)
         {
diff --git a/Main/System/BillboardRank/PlayerRankCell.cs b/Main/System/BillboardRank/PlayerRankCell.cs
index e9bc30d..7748a7e 100644
--- a/Main/System/BillboardRank/PlayerRankCell.cs
+++ b/Main/System/BillboardRank/PlayerRankCell.cs
@@ -8,16 +8,15 @@
 //鐜╁閫氱敤鎺掑悕
 public class PlayerRankCell : MonoBehaviour
 {
-    [SerializeField] AvatarCell avatarCell;
+    [SerializeField] AvatarCell avatarCell; // 澶村儚涓偣鍑绘煡璇㈢帺瀹惰鎯�
     [SerializeField] Text rankText;
     [SerializeField] Text rankValueText;    //鎺掑悕姣旇緝鍐呭
     [SerializeField] Text nameText;
     [SerializeField] OfficialTitleCell officialTitleCell;
-    [SerializeField] Button queryPlayerBtn; //鍚庣画娣诲姞鐐瑰嚮鏌ョ湅鐜╁璇︽儏
 
 
     // rank 涓�0 浠h〃鐜╁鑷繁
-    public void Display(int rankType, int rank, string valueFormat)
+    public void Display(int rankType, int rank)
     {
         RankData rankData = null;
         if (rank != 0)
@@ -34,7 +33,7 @@
                                                 PlayerDatas.Instance.baseData.face,
                                                 PlayerDatas.Instance.baseData.facePic));
                 rankText.text = Language.Get("L1045");
-                rankValueText.text = "1-1";//Language.Get("L1125");
+                rankValueText.text = "";//Language.Get("L1125");
                 nameText.text = PlayerDatas.Instance.baseData.PlayerName;
                 officialTitleCell.InitUI(PlayerDatas.Instance.baseData.realmLevel, PlayerDatas.Instance.baseData.TitleID);
                 return;
@@ -46,7 +45,7 @@
             officialTitleCell.SetActive(false);
             avatarCell.SetActive(false);
             nameText.text = Language.Get("L1124");
-            rankValueText.text = "1-1";//Language.Get("L1125");
+            rankValueText.text = "";//Language.Get("L1125");
         }
         else
         {
@@ -55,17 +54,11 @@
             avatarCell.SetActive(true);
             avatarCell.InitUI(AvatarHelper.GetAvatarModel((int)rankData.id, (int)rankData.value3, (int)rankData.value4));
             nameText.text = rankData.name1;
-            rankValueText.text = RankModel.Instance.GetStoryInfo(rankData.cmpValue); ;
+            rankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue); ;
         }
 
         rankText.text = rank.ToString();
-        if (queryPlayerBtn != null)
-        {
-            queryPlayerBtn.AddListener(() =>
-            {
 
-            });
-        }
     }
 }
 
diff --git a/Main/System/BillboardRank/PlayerRankWin.cs b/Main/System/BillboardRank/PlayerRankWin.cs
index c58478c..a4628ca 100644
--- a/Main/System/BillboardRank/PlayerRankWin.cs
+++ b/Main/System/BillboardRank/PlayerRankWin.cs
@@ -9,7 +9,7 @@
 using UnityEngine.UI;
 
 
-//閫氱敤鐜╁涓汉鎺掕姒�
+//閫氱敤鐜╁涓汉鎺掕姒�; cell鏁伴噺鏄浐瀹氱殑 闈炲姩鎬佸彉鍖�
 public class PlayerRankWin : UIBase
 {
     [SerializeField] List<PlayerTop3Cell> playerTop3Cells;
@@ -18,26 +18,23 @@
     [SerializeField] PlayerRankCell myRankCell;
     [SerializeField] Button btnClose;
 
-
-    [HideInInspector] public int rankType;
-    [HideInInspector] public string valueFormat = "{0}";
+    //鏁版嵁鍚庣画浠巑anager涓褰曡幏鍙�
     [HideInInspector] public int groupValue1 = 0;   //涓�鑸敤浜庤法鏈�
     [HideInInspector] public int groupValue2 = 0;   //涓�鑸敤浜庤法鏈�
+    protected int rankType; //浠巉unctionOrder鑾峰彇
 
     protected override void InitComponent()
     {
-        btnClose.AddListener(()=>
-        {
-            CloseWindow();
-        });
+        btnClose?.AddListener(CloseWindow);
     }
 
-    protected override void NextFrameAfterOpen()
+    
+    protected override void OnPreOpen()
     {
+        rankType = functionOrder;
         RankModel.Instance.onRankRefresh += OnRankRefresh;
         scrollerController.OnRefreshCell += OnRefreshCell;
         Refresh();
-        
     }
 
     protected override void OnPreClose()
@@ -53,7 +50,7 @@
 
     public override void Refresh()
     {
-        cmpStrText.text = Language.Get("RankTypeName_1");
+        cmpStrText.text = RankModel.Instance.GetCmpTabStr(rankType);
         ShowTop3();
         CreateScroller();
         ShowMyRank();
@@ -73,7 +70,7 @@
     void OnRefreshCell(ScrollerDataType type, CellView cell)
     {
         var _cell = cell.GetComponent<PlayerRankCell>();
-        _cell.Display(rankType, cell.index + 1, valueFormat);
+        _cell.Display(rankType, cell.index + 1);
         RankModel.Instance.ListenRankPage(rankType, cell.index, groupValue1, groupValue2);
     }
 
@@ -82,13 +79,13 @@
     { 
         for (int i = 0; i < playerTop3Cells.Count; i++)
         {
-            playerTop3Cells[i].Display(functionOrder, i + 1);
+            playerTop3Cells[i].Display(rankType, i + 1);
         }
     }
 
     void ShowMyRank()
     {
-        myRankCell.Display(rankType, 0, valueFormat);
+        myRankCell.Display(rankType, 0);
     }
 
 
diff --git a/Main/System/BillboardRank/PlayerTop3Cell.cs b/Main/System/BillboardRank/PlayerTop3Cell.cs
index 610fe84..d67b702 100644
--- a/Main/System/BillboardRank/PlayerTop3Cell.cs
+++ b/Main/System/BillboardRank/PlayerTop3Cell.cs
@@ -8,26 +8,24 @@
 //鐜╁閫氱敤鐨勫墠3鎺掑悕
 public class PlayerTop3Cell : MonoBehaviour
 {
-    //[SerializeField] Model 鏄剧ずNPC 姝﹀皢妯″瀷
     [SerializeField] Text rankValueText;    //鎺掑悕姣旇緝鍐呭
     [SerializeField] Text nameText;
     [SerializeField] OfficialTitleCell officialTitleCell;
-    [SerializeField] Button queryPlayerBtn; //鍚庣画娣诲姞鐐瑰嚮鏌ョ湅鐜╁璇︽儏
     [SerializeField] HorseController model;
 
-    public void Display(int rankType, int rank, string valueFormat = "{0}")
+    public void Display(int rankType, int rank)
     {
         var rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
         if (rankData == null)
         {
-            rankValueText.text = "1-1";//Language.Get("L1125");
+            rankValueText.text = "";//Language.Get("L1125");
             nameText.text = Language.Get("L1124");
             officialTitleCell.SetActive(false);
             return;
         }
         officialTitleCell.SetActive(true);
         //rankValueText.text = string.Format(valueFormat, UIHelper.ReplaceLargeNum(rankData.cmpValue2 + rankData.cmpValue * Constants.ExpPointValue));
-        rankValueText.text = RankModel.Instance.GetStoryInfo(rankData.cmpValue);
+        rankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue);
         nameText.text = rankData.name1;
         officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
         model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, 1);
diff --git a/Main/System/BillboardRank/RankModel.cs b/Main/System/BillboardRank/RankModel.cs
index 318e713..5e8df5e 100644
--- a/Main/System/BillboardRank/RankModel.cs
+++ b/Main/System/BillboardRank/RankModel.cs
@@ -333,13 +333,36 @@
     }
     #endregion
 
-    public string GetStoryInfo(uint cmpValue)
+    //鑾峰彇鎺掑悕姣旇緝鍊煎瓧绗︿覆
+    public string GetCmpValueStr(int rankType, uint cmpValue)
     {
-        int value = (int)cmpValue;
-        if (!MainLevelConfig.HasKey(value))
-            return string.Empty;
-        MainLevelConfig config = MainLevelConfig.Get(value);
-        return Language.Get("Arena15", config.ChapterID, config.LevelNum);
+        switch (rankType)
+        {
+            case 0:
+            case 3:
+                int value = (int)cmpValue;
+                if (!MainLevelConfig.HasKey(value))
+                    return string.Empty;
+                MainLevelConfig config = MainLevelConfig.Get(value);
+                return Language.Get("Arena15", config.ChapterID, config.LevelNum);
+            case 4:
+                return cmpValue.ToString();
+        }
+        return string.Empty;
+    }
+
+    //鑾峰彇鎺掑悕鏍囩
+    public string GetCmpTabStr(int rankType)
+    {
+        switch (rankType)
+        {
+            case 0:
+            case 3:
+                return Language.Get("RankTypeName_1");
+            case 4:
+                return Language.Get("OSActivity5");
+        }
+        return string.Empty;
     }
 }
 
diff --git a/Main/System/FirstCharge/FirstChargeWin.cs b/Main/System/FirstCharge/FirstChargeWin.cs
index a5daae2..6f2c5fa 100644
--- a/Main/System/FirstCharge/FirstChargeWin.cs
+++ b/Main/System/FirstCharge/FirstChargeWin.cs
@@ -256,7 +256,7 @@
             OrderInfoConfig orderInfoConfig;
             if (model.TryGetOrderInfoConfigByFirstID(firstID, out orderInfoConfig))
             {
-                txtTabTitles[i].text = Language.Get("PayMoneyNum", orderInfoConfig.PayRMBNum);
+                txtTabTitles[i].text = Language.Get("PayMoneyNum", orderInfoConfig.PayRMBNumOnSale);
             }
         }
     }
@@ -279,7 +279,7 @@
         bool isBuy = firstChargeData.IsBuy();
         btnBuy.SetActive(!isBuy);
         btnHave.SetActive(isBuy);
-        txtBuy.text = Language.Get("PayMoneyNum", orderInfo.PayRMBNum);
+        txtBuy.text = Language.Get("PayMoneyNum", orderInfo.PayRMBNumOnSale);
         //棰嗗彇
         int day = firstChargeData.GetNowBuyDay();
         //0: 宸查鍙� 1: 涓嶅彲棰嗗彇 2: 鍙鍙� 
diff --git a/Main/System/FunctionPreview.meta b/Main/System/FunctionPreview.meta
new file mode 100644
index 0000000..ef4d8f5
--- /dev/null
+++ b/Main/System/FunctionPreview.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: e7acf37249ff26f4f85a11d0e3e8f65a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FunctionPreview/FunctionPreviewCell.cs b/Main/System/FunctionPreview/FunctionPreviewCell.cs
new file mode 100644
index 0000000..d1a053a
--- /dev/null
+++ b/Main/System/FunctionPreview/FunctionPreviewCell.cs
@@ -0,0 +1,53 @@
+using UnityEngine;
+
+public class FunctionPreviewCell : MonoBehaviour
+{
+    [SerializeField] ImageEx imgIcon;
+    [SerializeField] TextEx txtName;
+    [SerializeField] TextEx txtDesc;
+    [SerializeField] ItemCell itemCell;
+    [SerializeField] Transform transItemCellMask;
+    [SerializeField] ImageEx imgRed;
+    [SerializeField] Transform transOpenInfo;
+    [SerializeField] RichText txtOpenInfo;
+    [SerializeField] Transform transMask;
+    public void Display(int index, CellView cell)
+    {
+        int funcId = cell.info.Value.infoInt1;
+        if (!FuncOpenLVConfig.HasKey(funcId))
+            return;
+
+        FuncOpenLVConfig config = FuncOpenLVConfig.Get(funcId);
+        // 0-鏈В閿� 1-鍙鍙� 2-宸查鍙�
+        int state = FuncOpen.Instance.GetState(funcId);
+        imgRed.SetActive(state == 1);
+        transOpenInfo.SetActive(state == 0);
+        transMask.SetActive(state != 1);
+        transItemCellMask.SetActive(state == 2);
+
+        imgIcon.SetSprite(config.Icon);
+        imgIcon.SetNativeSize();
+        txtName.text = config.Name;
+        txtDesc.text = config.Desc;
+
+        int[][] awardList = config.AwardList;
+        itemCell.SetActive(!awardList.IsNullOrEmpty() && state != 0);
+        if (!awardList.IsNullOrEmpty())
+        {
+            itemCell.Init(new ItemCellModel(awardList[0][0], true, awardList[0][1]));
+            itemCell.button.SetListener(() =>
+            {
+                if (state == 1)
+                {
+                    FuncOpen.Instance.SendGetAward(funcId);
+                }
+                else
+                {
+                    ItemTipUtility.Show(awardList[0][0]);
+                }
+            });
+        }
+
+        txtOpenInfo.text = FuncOpen.Instance.GetErrorStr(funcId);
+    }
+}
diff --git a/Main/System/FunctionPreview/FunctionPreviewCell.cs.meta b/Main/System/FunctionPreview/FunctionPreviewCell.cs.meta
new file mode 100644
index 0000000..8e196cc
--- /dev/null
+++ b/Main/System/FunctionPreview/FunctionPreviewCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 807ec470632e30e4fbebaad0c81ba631
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/FunctionPreview/FunctionPreviewWin.cs b/Main/System/FunctionPreview/FunctionPreviewWin.cs
new file mode 100644
index 0000000..604b203
--- /dev/null
+++ b/Main/System/FunctionPreview/FunctionPreviewWin.cs
@@ -0,0 +1,48 @@
+using UnityEngine;
+
+public class FunctionPreviewWin : UIBase
+{
+    [SerializeField] ScrollerController scroller;
+
+    protected override void OnPreOpen()
+    {
+        scroller.lockType = EnhanceLockType.KeepVertical;
+        scroller.OnRefreshCell += OnRefreshCell;
+        FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
+        CreateScoller();
+    }
+
+    protected override void OnPreClose()
+    {
+        scroller.OnRefreshCell -= OnRefreshCell;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
+    }
+
+    private void OnFuncStateChangeEvent(int obj)
+    {
+        CreateScoller();
+    }
+
+    private void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<FunctionPreviewCell>();
+        _cell?.Display(cell.index, cell);
+    }
+
+    private void CreateScoller()
+    {
+        scroller.Refresh();
+        var list = FuncOpen.Instance.GetSortShowList();
+        if (!list.IsNullOrEmpty())
+        {
+            for (int i = 0; i < list.Count; i++)
+            {
+                CellInfo info = new CellInfo();
+                info.infoInt1 = list[i];
+                scroller.AddCell(ScrollerDataType.Header, i, info);
+            }
+        }
+        scroller.Restart();
+    }
+}
+
diff --git a/Main/System/FunctionPreview/FunctionPreviewWin.cs.meta b/Main/System/FunctionPreview/FunctionPreviewWin.cs.meta
new file mode 100644
index 0000000..5524bea
--- /dev/null
+++ b/Main/System/FunctionPreview/FunctionPreviewWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e7c6142d362c8194c9cbe93b1d76f904
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/GeneralConfig/DayRemind.cs b/Main/System/GeneralConfig/DayRemind.cs
index 107b885..a1debbd 100644
--- a/Main/System/GeneralConfig/DayRemind.cs
+++ b/Main/System/GeneralConfig/DayRemind.cs
@@ -33,6 +33,7 @@
     }
 
     public const string DJQTip = "DJQTip"; // 浠i噾鍒告彁绀�
+    public const string OSMainLevel = "OSMainLevel"; // 寮�鏈嶄富绾垮叧鍗℃椿鍔ㄦ彁绀�
 
     public Dictionary<string, int[]> dayRemindDic = new Dictionary<string, int[]>();
 
@@ -74,6 +75,7 @@
     private void GetPlayerDayRemind()
     {
         SetDayRemind(DJQTip);
+        SetDayRemind(OSMainLevel);
     }
 
     public void SetDayRemind(string _key)
diff --git a/Main/System/Hero/HeroManager.cs b/Main/System/Hero/HeroManager.cs
index 63dd298..394e012 100644
--- a/Main/System/Hero/HeroManager.cs
+++ b/Main/System/Hero/HeroManager.cs
@@ -83,6 +83,11 @@
         return heroInfoDict.Values.ToList();
     }
 
+    public List<string> GetHeroGuidList()
+    {
+        return heroInfoDict.Keys.ToList();
+    }
+
     /// 鍙傛暟锛� 鑱屼笟锛屽浗瀹讹紝浼ゅ绫诲瀷锛�6澶ф垬鏂楀睘鎬э紝鐗规畩灞炴��
     public List<string> GetHeroGuidList(List<int> selectList = null)
     {
diff --git a/Main/System/HeroUI/HeroCardCell.cs b/Main/System/HeroUI/HeroCardCell.cs
index cd524b9..f273f7e 100644
--- a/Main/System/HeroUI/HeroCardCell.cs
+++ b/Main/System/HeroUI/HeroCardCell.cs
@@ -14,6 +14,7 @@
     [SerializeField] RedpointBehaviour redpoint;
     [SerializeField] Image newImage;    //鏂版爣璇嗗拰绾㈢偣浜掓枼
     [SerializeField] Image trainStateImg;
+    [SerializeField] Image starRedImg;
     [SerializeField] Text nameText;
     [SerializeField] Image awakeImg;
     [SerializeField] Text awakeLVText;
@@ -62,6 +63,9 @@
         {
             trainStateImg.SetActive(false);
         }
+
+        starRedImg.SetActive(funcState == 2);
+
         nameText.text = hero.breakLevel == 0 ? heroConfig.Name : Language.Get("herocardbreaklv", heroConfig.Name, hero.breakLevel);
         awakeImg.SetActive(hero.awakeLevel > 0);
         awakeLVText.text = hero.awakeLevel.ToString();
diff --git a/Main/System/HeroUI/HeroListWin.cs b/Main/System/HeroUI/HeroListWin.cs
index b010d65..1c8360d 100644
--- a/Main/System/HeroUI/HeroListWin.cs
+++ b/Main/System/HeroUI/HeroListWin.cs
@@ -160,6 +160,7 @@
         HeroUIManager.Instance.SortHeroList();
         RefreshEmptyTip();
         CreateScroller();
+        heroListScroller.JumpIndex(0);
     }
 
     //涓婇樀鍔犳垚
@@ -227,6 +228,8 @@
             }
         }
         heroListScroller.Restart();
+        heroListScroller.lockType = EnhanceLockType.KeepVertical;
+        
     }
 
     int GetAttrActiveHeroCount()
diff --git a/Main/System/HeroUI/HeroUIManager.Reborn.cs b/Main/System/HeroUI/HeroUIManager.Reborn.cs
index 44f1843..2156bf8 100644
--- a/Main/System/HeroUI/HeroUIManager.Reborn.cs
+++ b/Main/System/HeroUI/HeroUIManager.Reborn.cs
@@ -100,9 +100,76 @@
     }
 
 
+    //閬f暎鑾峰彇绗﹀悎鏉′欢鐨勬灏嗗垪琛�
+    /// 鍙傛暟锛� 鑱屼笟锛屽浗瀹讹紝浼ゅ绫诲瀷锛�6澶ф垬鏂楀睘鎬э紝鐗规畩灞炴��
+    public List<string> GetHeroGuidListDelectFunc(List<int> selectList = null)
+    {
+        var _list = HeroManager.Instance.GetHeroList();
+        if (selectList.IsNullOrEmpty())
+            return HeroManager.Instance.GetHeroGuidList();
+
+        int job = selectList[0];
+        int country = selectList[1];
+        int hurtType = selectList[2];
+        int fightAttrType = selectList[3];
+        int specialAttrType = selectList[4];
+
+        List<string> retGuidList = new List<string>();
+        foreach (var heroInfo in _list)
+        {
+
+            if (heroInfo.isAttrActive)
+                continue;
+
+            if (heroInfo.heroStar < heroInfo.GetCurMaxStar())
+            {
+                continue;
+            }
+
+            //0浠h〃鍏ㄩ儴, 鍚岀骇鍒槸鍙閫夛紝涓嶅悓绾у埆涓轰笖鐨勫叧绯�
+            bool isMatch = true;
+            if (job != 0)
+            {
+                isMatch = isMatch && (job & (1 << heroInfo.heroConfig.Class)) > 0;
+            }
+            if (country != 0)
+            {
+                isMatch = isMatch && (country & (1 << heroInfo.heroConfig.Country)) > 0;
+            }
+            if (hurtType != 0)
+            {
+                isMatch = isMatch && (hurtType & (1 << heroInfo.heroConfig.HurtType)) > 0;
+            }
+            if (fightAttrType != 0)
+            {
+                isMatch = isMatch && (fightAttrType & (1 << heroInfo.heroConfig.Specialty)) > 0;
+            }
+            if (specialAttrType != 0)
+            {
+                bool isMatch2 = false;
+                for (int i = 0; i < heroInfo.heroConfig.Specialty2.Length; i++)
+                {
+                    isMatch2 = (specialAttrType & (1 << heroInfo.heroConfig.Specialty2[i])) > 0;
+                    if (isMatch2)
+                        break;
+                }
+                isMatch = isMatch && isMatch2;
+            }
+            if (isMatch)
+            {
+                retGuidList.Add(heroInfo.itemHero.guid);
+            }
+
+        }
+        return retGuidList;
+    }
+
+
+
+
     public void SortHeroDeleteList()
     {
-        heroDeleteSortList = HeroManager.Instance.GetHeroGuidList(selectHeroDeleteList);
+        heroDeleteSortList = GetHeroGuidListDelectFunc(selectHeroDeleteList);
         heroDeleteSortList.Sort(CmpDeleteHero);
     }
 
diff --git a/Main/System/HeroUI/HeroUIManager.cs b/Main/System/HeroUI/HeroUIManager.cs
index 84e6627..e8f86b2 100644
--- a/Main/System/HeroUI/HeroUIManager.cs
+++ b/Main/System/HeroUI/HeroUIManager.cs
@@ -467,12 +467,19 @@
     // 涓荤嚎涓婇樀姝﹀皢鎵嶉渶瑕佹彁閱�  瑙夐啋锛炲崌鏄燂紴绐佺牬锛炲崌绾�
     public int GetFuncState(HeroInfo hero)
     {
+        if (!hero.isAttrActive)
+            return 0;
+            
+        var heroCnt = PackManager.Instance.GetItemCountByID(PackType.Hero, hero.heroId);
         if (!hero.IsInTeamByTeamType(TeamType.Story))
         {
+            if (hero.heroStar < hero.GetCurMaxStar() && heroCnt > 1)
+            {
+                return 2;
+            }
             return 0;
         }
 
-        var heroCnt = PackManager.Instance.GetItemCountByID(PackType.Hero, hero.heroId);
         var itemPack = PackManager.Instance.GetSinglePack(PackType.Item);
         //5鏄熷悗鎵嶈兘瑙夐啋
         if (hero.heroStar < starLevelCanAwake)
@@ -493,7 +500,10 @@
             }
         }
 
-        if (heroCnt > 1) return 2;
+        if (hero.heroStar < hero.GetCurMaxStar() && heroCnt > 1)
+        {
+            return 2;
+        }
 
         var maxBreakLV = HeroBreakConfig.GetMaxBreakLv(hero.heroId);
         if (hero.breakLevel < maxBreakLV)
@@ -526,6 +536,8 @@
     List<Redpoint> heroOnTeamRedpointList = new List<Redpoint>();   //涓婇樀鐨勬灏嗙孩鐐�
     List<Redpoint> heroBookRedpointList = new List<Redpoint>(); //鍥鹃壌鎵�鏈夋灏嗙孩鐐�
 
+    //鐢熸晥鏈笂闃电殑 鍙悶鍣殑鍏辩敤涓�涓孩鐐�
+    Redpoint heroEatRedPoint = new Redpoint(MainRedDot.HeroCardRedpoint, MainRedDot.HeroCardRedpoint * 10 + 8);
     //鏂版爣璇嗙殑绾㈢偣 鎵�鏈夋灏嗙粺涓�涓�
     Redpoint newMarkRedPoint = new Redpoint(MainRedDot.HeroCardRedpoint, MainRedDot.HeroCardRedpoint * 10 + 9);
     void InitHeroOnTeamRedpointList()
@@ -566,6 +578,27 @@
         }
 
         newMarkRedPoint.state = newHeroIDList.Count > 0 ? RedPointState.New : RedPointState.None;
+
+        heroEatRedPoint.state = RedPointState.None;
+        var _list = HeroManager.Instance.GetHeroList();
+        foreach (var hero in _list)
+        {
+            if (!hero.isAttrActive)
+            {
+                continue;
+            }
+            if (hero.heroStar >= hero.GetCurMaxStar())
+            {
+                continue;
+            }
+
+            if (HeroManager.Instance.GetHeroCountByID(hero.heroId) > 1)
+            {
+                heroEatRedPoint.state = RedPointState.Simple;
+                break;
+            }
+        }
+
     }
 
 
diff --git a/Main/System/Main/HomeWin.cs b/Main/System/Main/HomeWin.cs
index bdd24a0..599bafc 100644
--- a/Main/System/Main/HomeWin.cs
+++ b/Main/System/Main/HomeWin.cs
@@ -61,6 +61,8 @@
     [SerializeField] RightFuncInHome rightFuncInHome;
 
     [SerializeField] Button FirstChargeBtn;
+    [SerializeField] Button osMainLevelBtn;
+    [SerializeField] Button osHeroCallBtn;
 
     //鍧愰獞
     [SerializeField] Image horseBGImg;
@@ -187,6 +189,15 @@
             UpdateSendButton();
             inputFastChat.text = string.Empty;
         });
+
+        osMainLevelBtn.AddListener(() =>
+        {
+            UIManager.Instance.OpenWindow<OSMainLevelBaseWin>();
+        });
+        osHeroCallBtn.AddListener(() =>
+        {
+            UIManager.Instance.OpenWindow<OSHeroCallBaseWin>();
+        });
     }
 
 
@@ -234,8 +245,10 @@
         HorseManager.Instance.OnHorseUpdateEvent += DisplayHorse;
         ChatManager.Instance.OnChatTabChangeEvent += OnChatTabChangeEvent;
         GuildManager.Instance.EnterOrQuitGuildEvent += EnterOrQuitGuildEvent;
+        TimeMgr.Instance.OnDayEvent += OnDayEvent;
         Display();
         DisplayFirstChargeBtn();
+        DisplayOSActivity();
 
         // var battleWin = UIManager.Instance.OpenWindow<BattleWin>();
         // battleWin.SetBattleField(BattleManager.Instance.storyBattleField);
@@ -264,6 +277,7 @@
         HorseManager.Instance.OnHorseUpdateEvent -= DisplayHorse;
         ChatManager.Instance.OnChatTabChangeEvent -= OnChatTabChangeEvent;
         GuildManager.Instance.EnterOrQuitGuildEvent -= EnterOrQuitGuildEvent;
+        TimeMgr.Instance.OnDayEvent -= OnDayEvent;
 
         //  鍏抽棴鐨勬椂鍊欐妸鎴樻枟鐣岄潰涔熺粰鍏充簡 铏界劧鏄湪澶栭潰寮�鐨�
         UIManager.Instance.CloseWindow<BattleWin>();
@@ -277,6 +291,7 @@
         txtFastChatSend.text = isCanSend ? Language.Get("Chat11") : Language.Get("Chat14", remainingSeconds);
         txtFastChatSend.colorType = isCanSend ? TextColType.NavyBrown : TextColType.LightWhite;
     }
+
 
 
     private void EnterOrQuitGuildEvent(bool obj)
@@ -319,11 +334,10 @@
 
     async UniTask DelayPlayMusic()
     {
-        await UniTask.Delay(2000);
+        await UniTask.Delay(1200);
         if (!SoundPlayer.Instance.IsPlayBackGroundMuisic())
             SoundPlayer.Instance.PlayBackGroundMusic(38);
     }
-
 
 
     private void OnClickEnterBoss()
@@ -597,6 +611,10 @@
         }
     }
 
+
+
+
+
     private void OnFirstChargeTaskUpdateEvent()
     {
         DisplayFirstChargeBtn();
@@ -611,6 +629,10 @@
         else if (funcId == (int)FuncOpenEnum.Horse)
         {
             DisplayHorse();
+        }
+        else if (funcId == (int)FuncOpenEnum.OSMainLevl || funcId == (int)FuncOpenEnum.OSHeroCall)
+        {
+            DisplayOSActivity();
         }
     }
 
@@ -654,4 +676,17 @@
             UIManager.Instance.OpenWindow<HorseWin>();
         }
     }
-}
\ No newline at end of file
+
+    void DisplayOSActivity()
+    {
+        osMainLevelBtn.SetActive(OSActivityManager.Instance.IsOpened(3));
+        osHeroCallBtn.SetActive(OSActivityManager.Instance.IsOpened(4));
+    }
+
+    void OnDayEvent()
+    {
+        DisplayOSActivity();
+    }
+}
+
+
diff --git a/Main/System/Main/RightFuncInHome.cs b/Main/System/Main/RightFuncInHome.cs
index 93f0490..d8f3617 100644
--- a/Main/System/Main/RightFuncInHome.cs
+++ b/Main/System/Main/RightFuncInHome.cs
@@ -17,6 +17,7 @@
     [SerializeField] Button battlePassBtn;
     [SerializeField] Button llmjBtn; //鍘嗙粌绉樼瑘
     [SerializeField] Button signBtn;
+    [SerializeField] Button previewBtn;
 
     static string listenWindowName = "";   //鐩戝惉鍏抽棴鏃跺啀鏄剧ず
 
@@ -79,6 +80,13 @@
             ListenWindow("SignWin");
             UIManager.Instance.OpenWindow<SignWin>();
         });
+
+        previewBtn.AddListener(() =>
+        {
+            //鐢ㄤ簬鐩戝惉鐣岄潰锛屾墦寮�鏃剁缉杩涘彸杈瑰姛鑳芥爮锛屽叧闂椂鏄剧ず
+            ListenWindow("FunctionPreviewWin");
+            UIManager.Instance.OpenWindow<FunctionPreviewWin>();
+        });
     }
 
     void ShowBtns()
@@ -89,6 +97,7 @@
         llmjBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.LLMJ));
         signBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.DaySign));
         monthCardBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.PrivilegeCard));
+        previewBtn.SetActive(FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.FunctionPreview));
     }
 
 
diff --git a/Main/System/MainLevel/MainBossEnterWin.cs b/Main/System/MainLevel/MainBossEnterWin.cs
index c86b5d5..c65170b 100644
--- a/Main/System/MainLevel/MainBossEnterWin.cs
+++ b/Main/System/MainLevel/MainBossEnterWin.cs
@@ -34,8 +34,7 @@
         {
             RankModel.Instance.ResetQueryParam();
             RankModel.Instance.QueryRankByPage(0, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
-            var win = UIManager.Instance.OpenWindow<PlayerRankWin>();
-            win.rankType = 0;
+            UIManager.Instance.OpenWindow<PlayerRankWin>(0);
 
         });
 
diff --git a/Main/System/OSActivity.meta b/Main/System/OSActivity.meta
new file mode 100644
index 0000000..8a7b5ba
--- /dev/null
+++ b/Main/System/OSActivity.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c825c294184518b419d9d9fc80996f01
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSActivityManager.cs b/Main/System/OSActivity/OSActivityManager.cs
new file mode 100644
index 0000000..3c24867
--- /dev/null
+++ b/Main/System/OSActivity/OSActivityManager.cs
@@ -0,0 +1,190 @@
+
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+public class OSActivityManager : GameSystemManager<OSActivityManager>
+{
+    Dictionary<int, int[]> rankOpenDays = new Dictionary<int, int[]>();  //鎺掕姒滅被鍨嬶細銆愬紑濮嬪紑鏈嶅ぉ, 缁撴潫寮�鏈嶅ぉ銆�
+    public Dictionary<int, int[][]> mainLevelRankAwards = new Dictionary<int, int[][]>();  //涓荤嚎鍏冲崱鍚嶆锛氬鍔�
+    public Dictionary<int, int[][]> heroCallRankAwards = new Dictionary<int, int[][]>();  //姝﹀皢鎷涘嫙鍚嶆锛氬鍔�
+
+    public List<int> osHeroCallGiftSortList = new List<int>();    //寮�鏈嶆嫑鍕熺ぜ鍖� 鍏呭�糏D + 100000000
+
+    Dictionary<int, int> rankTypeToFuncID = new Dictionary<int, int>()
+    {
+        {3, 45},
+        {4, 46},
+    };
+
+    public override void Init()
+    {
+
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent += BeforePlayerDataInitialize;
+        StoreModel.Instance.RefreshBuyShopLimitEvent += RefreshStore;
+        FuncOpen.Instance.OnFuncStateChangeEvent += FuncStateChange;
+
+        ParseConfig();
+    }
+
+    public override void Release()
+    {
+        DTC0102_tagCDBPlayer.beforePlayerDataInitializeEvent -= BeforePlayerDataInitialize;
+        StoreModel.Instance.RefreshBuyShopLimitEvent -= RefreshStore;
+        FuncOpen.Instance.OnFuncStateChangeEvent -= FuncStateChange;
+    }
+
+    void BeforePlayerDataInitialize()
+    {
+    }
+
+    void ParseConfig()
+    {
+        var config = FuncConfigConfig.Get("OSABillboard");
+        rankOpenDays = ConfigParse.ParseIntArrayDict(config.Numerical1);
+        mainLevelRankAwards = ConfigParse.ParseIntArray2Dict(config.Numerical2);
+        heroCallRankAwards = ConfigParse.ParseIntArray2Dict(config.Numerical3);
+
+        var list = StoreModel.Instance.storeTypeDict[(int)StoreFunc.OSHeroCall];
+        var _list = RechargeManager.Instance.GetCTGIDListByType(18);
+
+        for (int i = 0; i < list.Count; i++)
+        {
+            var item = list[i];
+            osHeroCallGiftSortList.Add(item.shopId);
+        }
+        for (int i = 0; i < _list.Count; i++)
+        {
+            osHeroCallGiftSortList.Add(_list[i] + 100000000);
+        }
+
+    }
+
+    // 寮�鏈嶆帓琛屾椿鍔ㄦ槸鍚﹀紑鍚�
+    public bool IsOpened(int rankType)
+    {
+        if (!rankTypeToFuncID.ContainsKey(rankType))
+        {
+            return false;
+        }
+
+        if (!FuncOpen.Instance.IsFuncOpen(rankTypeToFuncID[rankType]))
+        {
+            return false;
+        }
+
+        //鍔熻兘寮�鍚噷鏈夊紑濮嬪ぉ浠ュ紑鍚负鍑嗭紝娲诲姩缁撴潫鍚庡欢杩熶竴澶╁叧闂睍绀�
+        if (!rankOpenDays.ContainsKey(rankType))
+        {
+            return false;
+        }
+
+        var openDays = rankOpenDays[rankType];
+        if (TimeUtility.OpenDay > openDays[1])
+        {
+            return false;
+        }
+
+        return true;
+    }
+
+    public int GetEndTime(int rankType)
+    {
+        if (!rankOpenDays.ContainsKey(rankType))
+        {
+            return 0;
+        }
+        var openDays = rankOpenDays[rankType];
+
+        return TimeUtility.GetRemindTimeByOpenDay(openDays[1]);
+    }
+
+    int CmpGift(int a, int b)
+    {
+        bool isSaleOutA = false;
+        bool isSaleOutB = false;
+
+        if (a < 100000000)
+        {
+            //鍟嗗簵
+            isSaleOutA = StoreModel.Instance.GetShopIDState(a) == 1;
+        }
+        else
+        {
+            RechargeManager.Instance.TryGetRechargeCount(a % 100000000, out RechargeCount countData);
+            if (countData.totalCount >= CTGConfig.Get(a % 100000000).DailyBuyCount)
+            {
+                isSaleOutA = true;
+            }
+        }
+        if (b < 100000000)
+        {
+            isSaleOutB = StoreModel.Instance.GetShopIDState(b) == 1;
+        }
+        else
+        {
+            RechargeManager.Instance.TryGetRechargeCount(b % 100000000, out RechargeCount countData);
+            if (countData.totalCount >= CTGConfig.Get(b % 100000000).DailyBuyCount)
+            {
+                isSaleOutB = true;
+            }
+        }
+        if (isSaleOutA != isSaleOutB)
+        {
+            return isSaleOutA ? 1 : -1;
+        }
+
+        return a.CompareTo(b);
+    }
+
+    public void RefreshGiftSortList()
+    {
+        osHeroCallGiftSortList.Sort(CmpGift);
+    }
+
+    void RefreshStore()
+    {
+        UpdateRedpoint();
+    }
+
+
+    Redpoint osMainLevelRedpoint = new Redpoint(MainRedDot.RedPoint_OSMainLevel);
+    Redpoint osHeroCallRedpoint = new Redpoint(MainRedDot.RedPoint_OSHeroCard);
+
+    public void UpdateRedpoint()
+    {
+        osMainLevelRedpoint.state = !DayRemind.Instance.GetDayRemind(DayRemind.OSMainLevel) ? RedPointState.Simple : RedPointState.None;
+        osHeroCallRedpoint.state = RedPointState.None;
+
+        if (StoreModel.Instance.freeShopDict.Count == 0) return;
+
+        if (StoreModel.Instance.freeShopDict.ContainsKey((int)StoreFunc.OSHeroCall))
+        {
+            var shopList = StoreModel.Instance.freeShopDict[(int)StoreFunc.OSHeroCall];
+
+            for (int i = 0; i < shopList.Count; i++)
+            {
+                var shopID = shopList[i];
+                var config = StoreConfig.Get(shopID);
+                if (StoreModel.Instance.GetShopLimitBuyCount(shopID) < config.LimitCnt)
+                {
+                    osHeroCallRedpoint.state = RedPointState.Simple;
+                    break;
+                }
+            }
+        }
+    }
+
+    private void FuncStateChange(int funcId)
+    {
+        switch ((FuncOpenEnum)funcId)
+        {
+            case FuncOpenEnum.OSMainLevl:
+            case FuncOpenEnum.OSHeroCall:
+                UpdateRedpoint();
+                break;
+        }
+    }
+}
diff --git a/Main/System/OSActivity/OSActivityManager.cs.meta b/Main/System/OSActivity/OSActivityManager.cs.meta
new file mode 100644
index 0000000..8a4d24f
--- /dev/null
+++ b/Main/System/OSActivity/OSActivityManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c7dec13c51efdd541a8b7cfedcdc9d09
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSHeroCallBaseWin.cs b/Main/System/OSActivity/OSHeroCallBaseWin.cs
new file mode 100644
index 0000000..516b9ff
--- /dev/null
+++ b/Main/System/OSActivity/OSHeroCallBaseWin.cs
@@ -0,0 +1,46 @@
+锘�//--------------------------------------------------------
+//    [Author]:           鐜╀釜娓告垙
+//    [  Date ]:           Tuesday, July 24, 2018
+//--------------------------------------------------------
+
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+////寮�鏈嶆椿鍔�-姝﹀皢鎷涘嫙娲诲姩
+public class OSHeroCallBaseWin : FunctionsBaseWin
+{
+    [SerializeField] Button closBtn;
+
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        closBtn.AddListener(CloseWindow);
+    }
+    
+
+    protected override void OpenSubUIByTabIndex()
+    {
+        switch (functionOrder)
+        {
+            case 0:
+                RankModel.Instance.ResetQueryParam();
+                RankModel.Instance.QueryRankByPage(4, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
+                currentSubUI = UIManager.Instance.OpenWindow<OSRankWin>(4);
+                break;
+            case 1:
+                currentSubUI = UIManager.Instance.OpenWindow<OSRankHeroCallAwardWin>();
+                break;
+            case 2:
+                currentSubUI = UIManager.Instance.OpenWindow<OSRankHeroCallGiftWin>();
+                break;
+        }
+    }
+
+}
+
+
+
+
diff --git a/Main/System/OSActivity/OSHeroCallBaseWin.cs.meta b/Main/System/OSActivity/OSHeroCallBaseWin.cs.meta
new file mode 100644
index 0000000..d81f8ef
--- /dev/null
+++ b/Main/System/OSActivity/OSHeroCallBaseWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 625a00313ed577e44b0fc884be1e90f2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSMainLevelBaseWin.cs b/Main/System/OSActivity/OSMainLevelBaseWin.cs
new file mode 100644
index 0000000..fb630d4
--- /dev/null
+++ b/Main/System/OSActivity/OSMainLevelBaseWin.cs
@@ -0,0 +1,53 @@
+锘�//--------------------------------------------------------
+//    [Author]:           鐜╀釜娓告垙
+//    [  Date ]:           Tuesday, July 24, 2018
+//--------------------------------------------------------
+
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+////寮�鏈嶆椿鍔�-涓荤嚎鍏冲崱娲诲姩
+public class OSMainLevelBaseWin : FunctionsBaseWin
+{
+    [SerializeField] Button closBtn;
+
+    protected override void InitComponent()
+    {
+        base.InitComponent();
+        closBtn.AddListener(CloseWindow);
+    }
+    
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        if (!DayRemind.Instance.GetDayRemind(DayRemind.OSMainLevel))
+        {
+            DayRemind.Instance.SetDayRemind(DayRemind.OSMainLevel, true);
+            OSActivityManager.Instance.UpdateRedpoint();
+        }
+    }
+
+    protected override void OpenSubUIByTabIndex()
+    {
+        switch (functionOrder)
+        {
+            case 0:
+                RankModel.Instance.ResetQueryParam();
+                RankModel.Instance.QueryRankByPage(3, watchID: (int)PlayerDatas.Instance.baseData.PlayerID);
+                currentSubUI = UIManager.Instance.OpenWindow<OSRankWin>(3);
+                break;
+            case 1:
+                currentSubUI = UIManager.Instance.OpenWindow<OSRankMainLeveAwardWin>();
+                break;
+        }
+    }
+
+
+}
+
+
+
+
diff --git a/Main/System/OSActivity/OSMainLevelBaseWin.cs.meta b/Main/System/OSActivity/OSMainLevelBaseWin.cs.meta
new file mode 100644
index 0000000..7797c91
--- /dev/null
+++ b/Main/System/OSActivity/OSMainLevelBaseWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2e7af1c80e7f0cb4e803121c8107b934
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSRankHeroCallAwardCell.cs b/Main/System/OSActivity/OSRankHeroCallAwardCell.cs
new file mode 100644
index 0000000..bef253b
--- /dev/null
+++ b/Main/System/OSActivity/OSRankHeroCallAwardCell.cs
@@ -0,0 +1,58 @@
+锘縰sing System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class OSRankHeroCallAwardCell : CellView
+{
+    [SerializeField] Text rankText;
+    [SerializeField] Image rankImg;
+    [SerializeField] ItemCell[] itemCells;
+
+    public void Display(int index)
+    {
+        var rank = index + 1;
+        if (index < 3)
+        {
+            rankImg.SetActive(true);
+            rankText.SetActive(false);
+            rankImg.SetSprite(StringUtility.Contact("Rank", index + 1));
+        }
+        else
+        {
+            rankImg.SetActive(false);
+            rankText.SetActive(true);
+            var keys = OSActivityManager.Instance.heroCallRankAwards.Keys.ToList();
+            keys.Sort();
+            var startRank = keys[index - 1] + 1;
+            var endRank = keys[index];
+            rank = endRank;
+            if (startRank == endRank)
+            {
+                rankText.text = startRank.ToString();
+            }
+            else
+            {
+                rankText.text = startRank + "-" + endRank;
+            }
+        }
+
+        var award = OSActivityManager.Instance.heroCallRankAwards[rank];
+        for (int i = 0; i < itemCells.Length; i++)
+        {
+            var itemCell = itemCells[i];
+            if (i < award.Length)
+            {
+                itemCell.SetActive(true);
+                int itemID = award[i][0];
+                itemCell.Init(new ItemCellModel(itemID, true, award[i][1]));
+                itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+            }
+            else
+            {
+                itemCell.SetActive(false);
+            }
+        }
+    }
+
+}
diff --git a/Main/System/OSActivity/OSRankHeroCallAwardCell.cs.meta b/Main/System/OSActivity/OSRankHeroCallAwardCell.cs.meta
new file mode 100644
index 0000000..691a197
--- /dev/null
+++ b/Main/System/OSActivity/OSRankHeroCallAwardCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3efefc256362c9e4a9538ad84e522737
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSRankHeroCallAwardWin.cs b/Main/System/OSActivity/OSRankHeroCallAwardWin.cs
new file mode 100644
index 0000000..911aa93
--- /dev/null
+++ b/Main/System/OSActivity/OSRankHeroCallAwardWin.cs
@@ -0,0 +1,83 @@
+锘�//--------------------------------------------------------
+//    [Author]:           鐜╀釜娓告垙
+//    [  Date ]:           Tuesday, July 24, 2018
+//--------------------------------------------------------
+
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+////寮�鏈嶆椿鍔�-姝﹀皢鎷涘嫙鎺掕姒滃鍔�
+public class OSRankHeroCallAwardWin : UIBase
+{
+    [SerializeField] ScrollerController scrollerController;
+    [SerializeField] Text myRankText;
+    [SerializeField] Text myRankValueText;
+
+
+    protected override void OnPreOpen()
+    {
+        scrollerController.OnRefreshCell += OnRefreshCell;
+        CreateScroller();
+        DisplayMyRank(4);
+    }
+
+    protected override void OnPreClose()
+    {
+        scrollerController.OnRefreshCell -= OnRefreshCell;
+    }
+
+
+
+
+    void CreateScroller()
+    {
+        var keys = OSActivityManager.Instance.heroCallRankAwards.Keys;
+
+        scrollerController.Refresh();
+        for (int i = 0; i < keys.Count; i++)
+        {
+            scrollerController.AddCell(ScrollerDataType.Header, i);
+        }
+        scrollerController.Restart();
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<OSRankHeroCallAwardCell>();
+        _cell.Display(cell.index);
+    }
+
+    public void DisplayMyRank(int rankType)
+    {
+        RankData rankData = null;
+        rankData = RankModel.Instance.GetMyRank(rankType);
+        if (rankData == null)
+        {
+            myRankText.text = Language.Get("L1045");
+            myRankValueText.text = "";//Language.Get("L1125");
+            return;
+        }
+        int rank = rankData.rank;
+
+        if (rankData == null)
+        {
+            myRankValueText.text = "";//Language.Get("L1125");
+        }
+        else
+        {
+            myRankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue); ;
+        }
+
+        myRankText.text = Language.Get("L1126") + Language.Get("L1096") + rank.ToString();
+
+    }
+
+
+}
+
+
+
+
diff --git a/Main/System/OSActivity/OSRankHeroCallAwardWin.cs.meta b/Main/System/OSActivity/OSRankHeroCallAwardWin.cs.meta
new file mode 100644
index 0000000..f64d305
--- /dev/null
+++ b/Main/System/OSActivity/OSRankHeroCallAwardWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 4c95333a39a8daa4da8ab42140cda281
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSRankHeroCallGiftCell.cs b/Main/System/OSActivity/OSRankHeroCallGiftCell.cs
new file mode 100644
index 0000000..6d66404
--- /dev/null
+++ b/Main/System/OSActivity/OSRankHeroCallGiftCell.cs
@@ -0,0 +1,120 @@
+锘縰sing System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class OSRankHeroCallGiftCell : CellView
+{
+    [SerializeField] Text nameText;
+    [SerializeField] ItemCell[] itemCells;
+    [SerializeField] Button buyBtn;
+    [SerializeField] Text moneyText;
+    [SerializeField] Image moneyIcon;
+    [SerializeField] Transform saleOutRect;
+    [SerializeField] Image redImg;
+    [SerializeField] Text buyLimitText;
+    [SerializeField] Image maskImg;
+
+    public void Display(int index)
+    {
+        var id = OSActivityManager.Instance.osHeroCallGiftSortList[index];
+        if (id > 100000000)
+        {
+            //鍏呭��
+            id -= 100000000;
+            var ctgConfig = CTGConfig.Get(id);
+            nameText.text = ctgConfig.Title;
+            for (int i = 0; i < itemCells.Length; i++)
+            {
+                var itemCell = itemCells[i];
+                if (i < ctgConfig.GainItemList.Length)
+                {
+                    itemCell.SetActive(true);
+                    int itemID = ctgConfig.GainItemList[i][0];
+                    itemCell.Init(new ItemCellModel(itemID, true, ctgConfig.GainItemList[i][1]));
+                    itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                }
+                else
+                {
+                    itemCell.SetActive(false);
+                }
+            }
+            RechargeManager.Instance.TryGetRechargeCount(id, out var rechargeCount);
+            var limitCnt = ctgConfig.DailyBuyCount;
+            if (rechargeCount.todayCount < limitCnt)
+            {
+                saleOutRect.SetActive(false);
+                maskImg.SetActive(false);
+                buyBtn.SetActive(true);
+                buyBtn.SetListener(() =>
+                {
+                    RechargeManager.Instance.CTG(id);
+                });
+
+                RechargeManager.Instance.TryGetOrderInfo(id, out var orderInfo);
+
+                moneyText.text = Language.Get("PayMoneyNum", orderInfo.PayRMBNumOnSale);
+                moneyIcon.SetActive(false);
+            }
+            else
+            {
+                saleOutRect.SetActive(true);
+                maskImg.SetActive(true);
+                buyBtn.SetActive(false);
+            }
+            buyLimitText.text = Language.Get("storename6", limitCnt - rechargeCount.todayCount, limitCnt);
+            redImg.SetActive(false);
+
+        }
+        else
+        {
+            //鍟嗗簵
+            var storeConfig = StoreConfig.Get(id);
+            nameText.text = storeConfig.Name;
+            var awards = StoreModel.Instance.GetShopItemlistEx(storeConfig);
+            for (int i = 0; i < itemCells.Length; i++)
+            {
+                var itemCell = itemCells[i];
+                if (i < awards.Count)
+                {
+                    itemCell.SetActive(true);
+                    int itemID = awards[i][0];
+                    itemCell.Init(new ItemCellModel(itemID, true, awards[i][1]));
+                    itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+                }
+                else
+                {
+                    itemCell.SetActive(false);
+                }
+            }
+
+            var state = StoreModel.Instance.GetShopIDState(id);
+            if (state == 1)
+            {
+                saleOutRect.SetActive(true);
+                maskImg.SetActive(true);
+                buyBtn.SetActive(false);
+                redImg.SetActive(false);
+            }
+            else
+            {
+                saleOutRect.SetActive(false);
+                maskImg.SetActive(false);
+                buyBtn.SetActive(true);
+                buyBtn.SetListener(() =>
+                {
+                    StoreModel.Instance.SendBuyShopItemWithPopCheck(storeConfig, 1);
+                });
+                moneyText.text = storeConfig.MoneyNum == 0 ? Language.Get("L1127") : storeConfig.MoneyNum.ToString();
+                moneyIcon.SetActive(storeConfig.MoneyNum != 0);
+                moneyIcon.SetIconWithMoneyType(storeConfig.MoneyType);
+                redImg.SetActive(storeConfig.MoneyNum == 0);
+            }   
+            var buyCnt = StoreModel.Instance.GetShopLimitBuyCount(id);
+            buyLimitText.text = Language.Get("storename6", storeConfig.LimitCnt - buyCnt, storeConfig.LimitCnt);
+
+        }
+
+    }
+
+}
diff --git a/Main/System/OSActivity/OSRankHeroCallGiftCell.cs.meta b/Main/System/OSActivity/OSRankHeroCallGiftCell.cs.meta
new file mode 100644
index 0000000..88f7b73
--- /dev/null
+++ b/Main/System/OSActivity/OSRankHeroCallGiftCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 002c4b8249e5e3c419d7146aaaa716b9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSRankHeroCallGiftWin.cs b/Main/System/OSActivity/OSRankHeroCallGiftWin.cs
new file mode 100644
index 0000000..e2deacd
--- /dev/null
+++ b/Main/System/OSActivity/OSRankHeroCallGiftWin.cs
@@ -0,0 +1,63 @@
+锘�//--------------------------------------------------------
+//    [Author]:           鐜╀釜娓告垙
+//    [  Date ]:           Tuesday, July 24, 2018
+//--------------------------------------------------------
+
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+//寮�鏈嶆椿鍔�-姝﹀皢鎷涘嫙绀煎寘
+public class OSRankHeroCallGiftWin : UIBase
+{
+    [SerializeField] ScrollerController scrollerController;
+
+    protected override void OnPreOpen()
+    {
+        scrollerController.OnRefreshCell += OnRefreshCell;
+        StoreModel.Instance.RefreshBuyShopLimitEvent += RefreshStore;
+        RechargeManager.Instance.rechargeCountEvent += OnRechargeCountEvent;
+        OSActivityManager.Instance.RefreshGiftSortList();
+        Display();
+    }
+
+    protected override void OnPreClose()
+    {
+        scrollerController.OnRefreshCell -= OnRefreshCell;
+        StoreModel.Instance.RefreshBuyShopLimitEvent -= RefreshStore;
+        RechargeManager.Instance.rechargeCountEvent -= OnRechargeCountEvent;
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as OSRankHeroCallGiftCell;
+        _cell.Display(cell.index);
+    }
+
+    void Display()
+    {
+        scrollerController.Refresh();
+        for (int i = 0; i < OSActivityManager.Instance.osHeroCallGiftSortList.Count; i++)
+        {
+            scrollerController.AddCell(ScrollerDataType.Header, i);
+        }
+        scrollerController.Restart();
+
+    }
+
+    void RefreshStore()
+    {
+        scrollerController.m_Scorller.RefreshActiveCellViews();
+    }
+
+    void OnRechargeCountEvent(int id)
+    {
+        scrollerController.m_Scorller.RefreshActiveCellViews();
+    }
+}
+
+
+
+
diff --git a/Main/System/OSActivity/OSRankHeroCallGiftWin.cs.meta b/Main/System/OSActivity/OSRankHeroCallGiftWin.cs.meta
new file mode 100644
index 0000000..4754706
--- /dev/null
+++ b/Main/System/OSActivity/OSRankHeroCallGiftWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: a2f6ca07e3517cf4aac0abab1ce8a454
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSRankMainLeveAwardCell.cs b/Main/System/OSActivity/OSRankMainLeveAwardCell.cs
new file mode 100644
index 0000000..f367c7f
--- /dev/null
+++ b/Main/System/OSActivity/OSRankMainLeveAwardCell.cs
@@ -0,0 +1,58 @@
+锘縰sing System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class OSRankMainLeveAwardCell : CellView
+{
+    [SerializeField] Text rankText;
+    [SerializeField] Image rankImg;
+    [SerializeField] ItemCell[] itemCells;
+
+    public void Display(int index)
+    {
+        var rank = index + 1;
+        if (index < 3)
+        {
+            rankImg.SetActive(true);
+            rankText.SetActive(false);
+            rankImg.SetSprite(StringUtility.Contact("Rank", index + 1));
+        }
+        else
+        {
+            rankImg.SetActive(false);
+            rankText.SetActive(true);
+            var keys = OSActivityManager.Instance.mainLevelRankAwards.Keys.ToList();
+            keys.Sort();
+            var startRank = keys[index - 1] + 1;
+            var endRank = keys[index];
+            rank = endRank;
+            if (startRank == endRank)
+            {
+                rankText.text = startRank.ToString();
+            }
+            else
+            {
+                rankText.text = startRank + "-" + endRank;
+            }
+        }
+
+        var award = OSActivityManager.Instance.mainLevelRankAwards[rank];
+        for (int i = 0; i < itemCells.Length; i++)
+        {
+            var itemCell = itemCells[i];
+            if (i < award.Length)
+            {
+                itemCell.SetActive(true);
+                int itemID = award[i][0];
+                itemCell.Init(new ItemCellModel(itemID, true, award[i][1]));
+                itemCell.button.SetListener(() => ItemTipUtility.Show(itemID));
+            }
+            else
+            {
+                itemCell.SetActive(false);
+            }
+        }
+    }
+
+}
diff --git a/Main/System/OSActivity/OSRankMainLeveAwardCell.cs.meta b/Main/System/OSActivity/OSRankMainLeveAwardCell.cs.meta
new file mode 100644
index 0000000..3ddceb6
--- /dev/null
+++ b/Main/System/OSActivity/OSRankMainLeveAwardCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c7c89cdc2160945468c6bc1420bbf405
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSRankMainLeveAwardWin.cs b/Main/System/OSActivity/OSRankMainLeveAwardWin.cs
new file mode 100644
index 0000000..4e083fc
--- /dev/null
+++ b/Main/System/OSActivity/OSRankMainLeveAwardWin.cs
@@ -0,0 +1,82 @@
+锘�//--------------------------------------------------------
+//    [Author]:           鐜╀釜娓告垙
+//    [  Date ]:           Tuesday, July 24, 2018
+//--------------------------------------------------------
+
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+//寮�鏈嶆椿鍔�-涓荤嚎鍏冲崱鎺掕濂栧姳
+public class OSRankMainLeveAwardWin : UIBase
+{
+    [SerializeField] ScrollerController scrollerController;
+    [SerializeField] Text myRankText;
+    [SerializeField] Text myRankValueText;
+
+
+    protected override void OnPreOpen()
+    {
+        scrollerController.OnRefreshCell += OnRefreshCell;
+        CreateScroller();
+        DisplayMyRank(3);
+    }
+
+    protected override void OnPreClose()
+    {
+        scrollerController.OnRefreshCell -= OnRefreshCell;
+    }
+
+
+
+
+    void CreateScroller()
+    {
+        var keys = OSActivityManager.Instance.mainLevelRankAwards.Keys;
+
+        scrollerController.Refresh();
+        for (int i = 0; i < keys.Count; i++)
+        {
+            scrollerController.AddCell(ScrollerDataType.Header, i);
+        }
+        scrollerController.Restart();
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell.GetComponent<OSRankMainLeveAwardCell>();
+        _cell.Display(cell.index);
+    }
+
+    public void DisplayMyRank(int rankType)
+    {
+        RankData rankData = null;
+        rankData = RankModel.Instance.GetMyRank(rankType);
+        if (rankData == null)
+        {
+            myRankText.text = Language.Get("L1045");
+            myRankValueText.text = "";//Language.Get("L1125");
+            return;
+        }
+        int rank = rankData.rank;
+
+        if (rankData == null)
+        {
+            myRankValueText.text = "";//Language.Get("L1125");
+        }
+        else
+        {
+            myRankValueText.text = RankModel.Instance.GetCmpValueStr(rankType, rankData.cmpValue); ;
+        }
+
+        myRankText.text = Language.Get("L1126") + Language.Get("L1096") + rank.ToString();
+
+    }
+
+}
+
+
+
+
diff --git a/Main/System/OSActivity/OSRankMainLeveAwardWin.cs.meta b/Main/System/OSActivity/OSRankMainLeveAwardWin.cs.meta
new file mode 100644
index 0000000..db10689
--- /dev/null
+++ b/Main/System/OSActivity/OSRankMainLeveAwardWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 70dab80b73c888a4f9342841075f2c98
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/OSActivity/OSRankWin.cs b/Main/System/OSActivity/OSRankWin.cs
new file mode 100644
index 0000000..273e303
--- /dev/null
+++ b/Main/System/OSActivity/OSRankWin.cs
@@ -0,0 +1,61 @@
+锘�//--------------------------------------------------------
+//    [Author]:           鐜╀釜娓告垙
+//    [  Date ]:           Tuesday, July 24, 2018
+//--------------------------------------------------------
+
+
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+//寮�鏈嶆椿鍔�-鎺掕姒�  3 - 寮�鏈嶅叧鍗℃ 锛� 4 - 寮�鏈嶆嫑鍕熸
+public class OSRankWin : PlayerRankWin
+{
+
+    [SerializeField] Text timeText;
+    [SerializeField] Text overTimeText;
+
+
+
+
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        GlobalTimeEvent.Instance.secondEvent += OnSecond;
+        ShowTime();
+
+    }
+
+    void ShowTime()
+    {
+        var seconds = OSActivityManager.Instance.GetEndTime(rankType);
+        if (seconds > 0)
+        {
+            timeText.SetActive(true);
+            overTimeText.SetActive(false);
+            timeText.text = TimeUtility.SecondsToShortDHMS(seconds);
+        }
+        else
+        {
+            timeText.SetActive(false);
+            overTimeText.SetActive(true);
+        }
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        GlobalTimeEvent.Instance.secondEvent -= OnSecond;
+    }
+
+    void OnSecond()
+    {
+        ShowTime();
+    }
+
+}
+
+
+
+
diff --git a/Main/System/OSActivity/OSRankWin.cs.meta b/Main/System/OSActivity/OSRankWin.cs.meta
new file mode 100644
index 0000000..2e0b234
--- /dev/null
+++ b/Main/System/OSActivity/OSRankWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0a29b5ea6f0229e45afdfecebbab816e
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Redpoint/MainRedDot.cs b/Main/System/Redpoint/MainRedDot.cs
index 13ef6ee..b3d9398 100644
--- a/Main/System/Redpoint/MainRedDot.cs
+++ b/Main/System/Redpoint/MainRedDot.cs
@@ -70,7 +70,8 @@
     //鑷姩鎴樻枟
     public const int RedPoint_AutoBattleKey = 110;
     Redpoint autoBattleRedpoint = new Redpoint(RedPoint_AutoBattleKey);
-
+    public const int RedPoint_OSMainLevel = 111;
+    public const int RedPoint_OSHeroCard = 112;
     public const int RedPoint_Download = 116;
 
     //姝﹀皢鍗�
@@ -131,6 +132,7 @@
     public const int TianziBillboradRepoint = 471; //澶╁瓙鐨勮�冮獙
     public const int PhantasmPavilionRepoint = 472; //骞诲闃�
     public const int LineupRecommendRepoint = 473; //闃靛鎺ㄨ崘
+     public const int FunctionPreviewRepoint = 474; //鍔熻兘棰勫憡
     public void Register()
     {
 
diff --git a/Main/System/Store/StoreModel.cs b/Main/System/Store/StoreModel.cs
index d0b8220..35e8337 100644
--- a/Main/System/Store/StoreModel.cs
+++ b/Main/System/Store/StoreModel.cs
@@ -22,7 +22,7 @@
 
 public class StoreModel : GameSystemManager<StoreModel>
 {
-    public Dictionary<int, List<StoreData>> storeTypeDict { get; private set; } //鎵�鏈夋樉绀哄晢鍝�
+    public Dictionary<int, List<StoreData>> storeTypeDict { get; private set; } //鎵�鏈夋樉绀哄晢鍝� 鍟嗗簵绫诲瀷锛氬晢鍝佸垪琛�
     public Dictionary<int, int> shopRefreshCntDict = new Dictionary<int, int>();    //鍒锋柊娆℃暟
     private Dictionary<int, int> shopItemlimitDict = new Dictionary<int, int>();    //宸茶喘涔版鏁�
     public event Action RefreshBuyShopLimitEvent;
@@ -38,7 +38,7 @@
     public int heroSoulRefreshMoney;
     public int heroSoulRefreshFreeCount;
 
-    Dictionary<int, List<int>> freeShopDict = new Dictionary<int, List<int>>();
+    public Dictionary<int, List<int>> freeShopDict = new Dictionary<int, List<int>>();  //鍏嶈垂鍟嗗搧 鍟嗗簵绫诲瀷锛氬晢鍝佸垪琛�
     public Dictionary<int, int> shopMoneyTypeDict = new Dictionary<int, int>();
 
     public override void Init()
@@ -320,7 +320,7 @@
 
         if (storeConfig.ItemID != 0)
         {
-            ShopItemInfo shopItem = new ShopItemInfo(storeConfig.ID, storeConfig.ItemCnt);
+            ShopItemInfo shopItem = new ShopItemInfo(storeConfig.ItemID, storeConfig.ItemCnt);
             shopItemlist.Add(shopItem);
         }
         var extraItem = storeConfig.ItemListEx;
@@ -343,7 +343,7 @@
         List<int[]> shopItemlist = new List<int[]>();
         if (storeConfig.ItemID != 0)
         {
-            shopItemlist.Add(new int[] { storeConfig.ID, storeConfig.ItemCnt});
+            shopItemlist.Add(new int[] { storeConfig.ItemID, storeConfig.ItemCnt});
         }
         var extraItem = storeConfig.ItemListEx;
         for (int i = 0; i < extraItem.Length; i++)
@@ -372,8 +372,10 @@
 
     }
 
-    //浠欑帀璐拱鐗╁搧鐨勪簩娆$‘璁ゆ锛屼竴绾ц揣甯佸彧鏈変粰鐜� 榛樿涓轰粰鐜夊嵆鍙�
+    //璐у竵璐拱鐨勪簩娆$‘璁ゆ鐨勭‘璁よ褰�
     Dictionary<int, bool> buyItemCheckDict = new Dictionary<int, bool>();   //璁板綍鍕鹃�変俊鎭�
+    
+    //璐拱鍟嗗簵鐗╁搧鐨勪簩娆$‘璁ゆ
     //eventType 浜屾纭妗嗙被鍨嬶紝瀵瑰簲鏋氫妇 BuyStoreItemCheckType
     public void SendBuyShopItemWithPopCheck(StoreConfig model, int count, int eventType = 0)
     {
@@ -390,7 +392,7 @@
             return;
         }
 
-        ConfirmCancel.ToggleConfirmCancel(Language.Get("Mail101"), Language.Get("CostMoney", model.MoneyNum, model.MoneyType),
+        ConfirmCancel.ToggleConfirmCancel(Language.Get("Mail101"), Language.Get("BuyStoreItem", model.MoneyNum, model.MoneyType, model.Name),
         Language.Get("ConfirmCancel102"), (bool isOk, bool isToggle) =>
         {
             if (isOk)
@@ -567,7 +569,8 @@
     Normal = 1, //1锛氬潑甯�
     Guild = 2, //2锛氬叕浼�
     Hero = 3, //3锛氬皢榄�
-    
+    OSHeroCall = 4, //4锛氬紑鏈嶆嫑鍕熺ぜ鍖�
+
 }
 
 
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index 2843097..2a51539 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -837,7 +837,9 @@
     Horse = 37,  //鍧愰獞
     BattlePass = 40, //鍩洪噾锛堟垬浠わ級
     LLMJ = 41,  //鍘嗙粌绉樼瑘
-
+    OSMainLevl = 45, //寮�鏈嶅叧鍗℃娲诲姩
+    OSHeroCall = 46, //寮�鏈嶆灏嗗彫鍞ゆ娲诲姩
+    FunctionPreview = 48, //鍔熻兘棰勮
 }
 
 

--
Gitblit v1.8.0