From 43c7968a67336472d883fb343387b7fba3fc0694 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期二, 17 三月 2026 18:15:05 +0800
Subject: [PATCH] 515 【挑战】PVP群英榜

---
 Main/System/Qunying/QYBattleFailWin.cs.meta                                                     |   11 
 Main/System/Qunying/QYFighterCell.cs.meta                                                       |   11 
 Main/System/Battle/BattleField/QYBattleField.cs.meta                                            |   11 
 Main/System/Battle/BattleConst.cs                                                               |    6 
 Main/System/Qunying/QYPlayerTop3Cell.cs                                                         |   53 +
 Main/System/Qunying/QYBattleWin.cs                                                              |  306 ++++++++++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA924_tagSCQunyingMatchList.cs       |   12 
 Main/System/Qunying/QYPlayerTop3Cell.cs.meta                                                    |   11 
 Main/System/Qunying/QYBattleVictoryWin.cs.meta                                                  |   11 
 Main/System/FuncPreset/FuncPresetManager.cs                                                     |    7 
 Main/System/Qunying/QunyingManager.cs                                                           |  275 +++++++++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA924_tagSCQunyingMatchList.cs.meta  |   11 
 Main/System/Battle/BattleFieldFactory.cs                                                        |    3 
 Main/System/Settlement/BattleSettlementManager.cs                                               |   13 
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA924_tagSCQunyingMatchList.cs.meta            |   11 
 Main/System/Battle/BattleField/QYBattleField.cs                                                 |  106 +++
 Main/Main.cs                                                                                    |    1 
 Main/System/Qunying/QYFighterCell.cs                                                            |  173 ++++++
 Main/System/Store/StoreModel.cs                                                                 |   24 
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA924_tagSCQunyingMatchList.cs                 |   51 +
 Main/System/Qunying/QYBattleVictoryWin.cs                                                       |  141 +++++
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA925_tagSCQunyingPlayerInfo.cs      |   12 
 Main/System/Qunying/QYBattleFailWin.cs                                                          |   99 +++
 Main/System/BillboardRank/RankModel.cs                                                          |   16 
 Main/System/Qunying/QYBattleWin.cs.meta                                                         |   11 
 Main/System/ViewNPC/ViewNPCManager.cs                                                           |   12 
 Main/Utility/EnumHelper.cs                                                                      |    2 
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA925_tagSCQunyingPlayerInfo.cs                |   23 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB210_tagCSQunyingMatch.cs.meta             |   11 
 Main/System/Battle/BattleManager.cs                                                             |    4 
 Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs               |    1 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA925_tagSCQunyingPlayerInfo.cs.meta |   11 
 Main/System/Qunying/QYWin.cs                                                                    |  117 ++++
 Main/System/Qunying/QYWin.cs.meta                                                               |   11 
 Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs                                            |    2 
 Main/System/ChallengeTab/QunyingTabHandler.cs                                                   |   41 
 Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB210_tagCSQunyingMatch.cs                  |   18 
 Main/Core/NetworkPackage/ServerPack/HA9_Function/HA925_tagSCQunyingPlayerInfo.cs.meta           |   11 
 38 files changed, 1,620 insertions(+), 30 deletions(-)

diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB210_tagCSQunyingMatch.cs b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB210_tagCSQunyingMatch.cs
new file mode 100644
index 0000000..b23430e
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB210_tagCSQunyingMatch.cs
@@ -0,0 +1,18 @@
+using UnityEngine;
+using System.Collections;
+
+// B2 10 缇よ嫳姒滃尮閰嶇帺瀹� #tagCSQunyingMatch
+
+public class CB210_tagCSQunyingMatch : GameNetPackBasic {
+    public byte IsRefresh;    // 0-鎵撳紑鐣岄潰鏃舵煡璇紝1-寮哄埗鍒锋柊鍖归厤鍒楄〃
+
+    public CB210_tagCSQunyingMatch () {
+        combineCmd = (ushort)0x03FE;
+        _cmd = (ushort)0xB210;
+    }
+
+    public override void WriteToBytes () {
+        WriteBytes (IsRefresh, NetDataType.BYTE);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB210_tagCSQunyingMatch.cs.meta b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB210_tagCSQunyingMatch.cs.meta
new file mode 100644
index 0000000..68f98bb
--- /dev/null
+++ b/Main/Core/NetworkPackage/ClientPack/CB2_NewFunction/CB210_tagCSQunyingMatch.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 809fff7a1e32fed408b8f79146ede0c5
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs
index ec94251..3790c07 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0320_tagFBEnd.cs
@@ -9,5 +9,6 @@
         H0320_tagFBEnd vNetData = vNetPack as H0320_tagFBEnd;
         BoneFieldManager.Instance.UpdateFBEnd(vNetData);
         TianziBillboradManager.Instance.UpdateFBEnd(vNetData);
+        QunyingManager.Instance.UpdateFBEnd(vNetData);
     }
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA924_tagSCQunyingMatchList.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA924_tagSCQunyingMatchList.cs
new file mode 100644
index 0000000..0ba495d
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA924_tagSCQunyingMatchList.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 24 缇よ嫳姒滃尮閰嶇帺瀹跺垪琛� #tagSCQunyingMatchList
+
+public class DTCA924_tagSCQunyingMatchList : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA924_tagSCQunyingMatchList vNetData = vNetPack as HA924_tagSCQunyingMatchList;
+        QunyingManager.Instance.UpdateQunyingMatchInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA924_tagSCQunyingMatchList.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA924_tagSCQunyingMatchList.cs.meta
new file mode 100644
index 0000000..85fa043
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA924_tagSCQunyingMatchList.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: ff9bbc83b46795c4fa7c9acf79289dcb
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA925_tagSCQunyingPlayerInfo.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA925_tagSCQunyingPlayerInfo.cs
new file mode 100644
index 0000000..4b0759c
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA925_tagSCQunyingPlayerInfo.cs
@@ -0,0 +1,12 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 25 缇よ嫳姒滅帺瀹朵俊鎭� #tagSCQunyingPlayerInfo
+
+public class DTCA925_tagSCQunyingPlayerInfo : DtcBasic {
+    public override void Done(GameNetPackBasic vNetPack) {
+        base.Done(vNetPack);
+        HA925_tagSCQunyingPlayerInfo vNetData = vNetPack as HA925_tagSCQunyingPlayerInfo;
+        QunyingManager.Instance.UpdateQunyingInfo(vNetData);
+    }
+}
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA925_tagSCQunyingPlayerInfo.cs.meta b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA925_tagSCQunyingPlayerInfo.cs.meta
new file mode 100644
index 0000000..099bd81
--- /dev/null
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HA9_Function/DTCA925_tagSCQunyingPlayerInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 960c25e4865aa4d4c894e9bf02f76dd0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
index d8be3e8..e0253d2 100644
--- a/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
+++ b/Main/Core/NetworkPackage/DataToCtl/PackageRegedit.cs
@@ -159,6 +159,8 @@
         Register(typeof(HAA20_tagSCActSignPlayerInfo), typeof(DTCAA20_tagSCActSignPlayerInfo));
         Register(typeof(HAA21_tagSCActHeroAppearInfo), typeof(DTCAA21_tagSCActHeroAppearInfo));
         Register(typeof(HAA22_tagSCActHeroAppearPlayerInfo), typeof(DTCAA22_tagSCActHeroAppearPlayerInfo));
+        Register(typeof(HA924_tagSCQunyingMatchList), typeof(DTCA924_tagSCQunyingMatchList));
+        Register(typeof(HA925_tagSCQunyingPlayerInfo), typeof(DTCA925_tagSCQunyingPlayerInfo));
     }
 
     //涓诲伐绋嬫敞鍐屽皝鍖�
diff --git a/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA924_tagSCQunyingMatchList.cs b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA924_tagSCQunyingMatchList.cs
new file mode 100644
index 0000000..4249ee3
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA924_tagSCQunyingMatchList.cs
@@ -0,0 +1,51 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 24 缇よ嫳姒滃尮閰嶇帺瀹跺垪琛� #tagSCQunyingMatchList
+
+public class HA924_tagSCQunyingMatchList : GameNetPackBasic {
+    public byte MatchCount;
+    public  tagSCQunyingMatchInfo[] MatchList;    // 鍖归厤鍒楄〃锛屼粠楂樺垎鍒颁綆鍒�
+
+    public HA924_tagSCQunyingMatchList () {
+        _cmd = (ushort)0xA924;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out MatchCount, vBytes, NetDataType.BYTE);
+        MatchList = new tagSCQunyingMatchInfo[MatchCount];
+        for (int i = 0; i < MatchCount; i ++) {
+            MatchList[i] = new tagSCQunyingMatchInfo();
+            TransBytes (out MatchList[i].Rank, vBytes, NetDataType.WORD);
+            TransBytes (out MatchList[i].PlayerID, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].PlayerName, vBytes, NetDataType.Chars, 33);
+            TransBytes (out MatchList[i].LV, vBytes, NetDataType.WORD);
+            TransBytes (out MatchList[i].RealmLV, vBytes, NetDataType.WORD);
+            TransBytes (out MatchList[i].FightPower, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].FightPowerEx, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].Face, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].FacePic, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].TitleID, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].ModelMark, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].EquipShowSwitch, vBytes, NetDataType.DWORD);
+            TransBytes (out MatchList[i].ServerID, vBytes, NetDataType.DWORD);
+        }
+    }
+
+    public class tagSCQunyingMatchInfo {
+        public ushort Rank;        //鎺掑悕锛屼粠1寮�濮�
+        public uint PlayerID;        //鐩爣鐜╁ID
+        public string PlayerName;
+        public ushort LV;        // 鐜╁绛夌骇
+        public ushort RealmLV;        //澧冪晫锛屾満鍣ㄤ汉璇诲鐣岃〃鍙栫瓑绾у搴斿鐣�
+        public uint FightPower;        //鎴樺姏姹備綑浜块儴鍒�
+        public uint FightPowerEx;        //鎴樺姏鏁撮櫎浜块儴鍒�
+        public uint Face;        //鍩烘湰鑴稿瀷
+        public uint FacePic;        //澶村儚妗�
+        public uint TitleID;        //绉板彿
+        public uint ModelMark;        //鍙樺舰妯″瀷mark
+        public uint EquipShowSwitch;        //鍏朵粬澶栬淇℃伅
+        public uint ServerID;
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA924_tagSCQunyingMatchList.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA924_tagSCQunyingMatchList.cs.meta
new file mode 100644
index 0000000..aea9af1
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA924_tagSCQunyingMatchList.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 641ac365694c83f4db552c0105d7c26f
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA925_tagSCQunyingPlayerInfo.cs b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA925_tagSCQunyingPlayerInfo.cs
new file mode 100644
index 0000000..a58ad17
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA925_tagSCQunyingPlayerInfo.cs
@@ -0,0 +1,23 @@
+using UnityEngine;
+using System.Collections;
+
+// A9 25 缇よ嫳姒滅帺瀹朵俊鎭� #tagSCQunyingPlayerInfo
+
+public class HA925_tagSCQunyingPlayerInfo : GameNetPackBasic {
+    public uint RefreshCnt;    // 鏈懆宸插埛鏂板尮閰嶆鏁�
+    public uint LastRecoverTime;    // 涓婃鍏嶈垂鎭㈠鎸戞垬浠ゆ椂闂存埑锛屼负0鏃跺彲涓嶇敤鍊掕鏃�
+    public ushort RankHighest;    // 鍘嗗彶鏈�楂樺悕娆★紝绗�1鍚嶄负鏈�楂�
+    public uint RankSuccAward;    // 鍘嗗彶鏈�楂樺悕娆℃垚灏遍濂栬褰曪紝鎸夊鍔辫褰曠储寮曚綅杩愮畻璁板綍鏄惁宸查鍙�
+
+    public HA925_tagSCQunyingPlayerInfo () {
+        _cmd = (ushort)0xA925;
+    }
+
+    public override void ReadFromBytes (byte[] vBytes) {
+        TransBytes (out RefreshCnt, vBytes, NetDataType.DWORD);
+        TransBytes (out LastRecoverTime, vBytes, NetDataType.DWORD);
+        TransBytes (out RankHighest, vBytes, NetDataType.WORD);
+        TransBytes (out RankSuccAward, vBytes, NetDataType.DWORD);
+    }
+
+}
diff --git a/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA925_tagSCQunyingPlayerInfo.cs.meta b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA925_tagSCQunyingPlayerInfo.cs.meta
new file mode 100644
index 0000000..f8f6256
--- /dev/null
+++ b/Main/Core/NetworkPackage/ServerPack/HA9_Function/HA925_tagSCQunyingPlayerInfo.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 49ebce4603fc8bd439702371212c21d1
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/Main.cs b/Main/Main.cs
index 76457b0..dfd89dd 100644
--- a/Main/Main.cs
+++ b/Main/Main.cs
@@ -110,6 +110,7 @@
         managers.Add(SmallFuncManager.Instance);
         managers.Add(HeroDebutManager.Instance);
         managers.Add(GeneralActInfoManager.Instance);
+        managers.Add(QunyingManager.Instance);
 
         foreach (var manager in managers)
         {
diff --git a/Main/System/Battle/BattleConst.cs b/Main/System/Battle/BattleConst.cs
index 7d5e8f9..a9d3552 100644
--- a/Main/System/Battle/BattleConst.cs
+++ b/Main/System/Battle/BattleConst.cs
@@ -14,6 +14,7 @@
         typeof(TianziBillboradBattleWin),
         typeof(WarlordPavilionBattleWin),
         typeof(PreviewBattleWin),
+        typeof(QYBattleWin),
     };
 
     // 鎴樺満鍚嶇О
@@ -24,6 +25,7 @@
     public const string TianziBillboradBattleField = "TianziBillboradBattleField";
     public const string WarlordPavilionBattleField = "WarlordPavilionBattleField";
     public const string PriviewBattleField = "PriviewBattleField";  //棰勮鎴樻枟
+    public const string QYBattleField = "QYBattleField";
 
     public static Dictionary<string, string> battleNameToWinName = new Dictionary<string, string>()
     {
@@ -34,6 +36,7 @@
         { TianziBillboradBattleField, "TianziBillboradBattleWin" },
         { WarlordPavilionBattleField, "WarlordPavilionBattleWin" },
         { PriviewBattleField, "PreviewBattleWin" },
+        { QYBattleField, "QYBattleWin" },
     };
 
     // 绱㈠紩閰嶇疆鐢�
@@ -45,6 +48,7 @@
         { TianziBillboradBattleField, 4 },
         { WarlordPavilionBattleField, 5 },
         { PriviewBattleField, 6 },
+        { QYBattleField, 7 },
     };
 
     //鍜� CreateBattleField 閲岀殑瀵瑰簲
@@ -57,12 +61,14 @@
         {30020, TianziBillboradBattleField},
         {30030, WarlordPavilionBattleField},
         {30000, PriviewBattleField},
+        {32000, QYBattleField},
     };
 
     //pvp鎴樻枟鐨勬垬鍦猴紝涓嶅湪杩欎釜鍒楄〃鐨勮涓簆ve绫诲瀷鐨勬垬鍦�
     public static List<string> pvpBattleNameDic = new List<string>()
     {
         ArenaBattleField,
+        QYBattleField,
     };
 
     
diff --git a/Main/System/Battle/BattleField/QYBattleField.cs b/Main/System/Battle/BattleField/QYBattleField.cs
new file mode 100644
index 0000000..23fd32b
--- /dev/null
+++ b/Main/System/Battle/BattleField/QYBattleField.cs
@@ -0,0 +1,106 @@
+using System;
+using LitJson;
+using UnityEngine;
+using System.Collections.Generic;
+
+
+public class QYBattleField : BattleField
+{
+
+
+    public QYBattleField(string _guid) : base(_guid)
+    {
+
+    }
+
+    public override void Init(int MapID, int FuncLineID, JsonData _extendData,
+        List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList, byte turnMax)
+    {
+        base.Init(MapID, FuncLineID, _extendData, _redTeamList, _blueTeamList, turnMax);
+
+        SetBattleMode(BattleMode.Record);
+    }
+    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()
+    {
+        AutoFightModel.Instance.isPause = false;
+        Destroy();
+        // 鍒囧嚭鎴樻枟鐣岄潰涓嶅脊婕旀鍦虹晫闈� 
+        if (UIManager.Instance.IsOpened<QYBattleWin>())
+        {
+            UIManager.Instance.CloseWindow<QYBattleWin>();
+            QunyingManager.Instance.openQYWinNeedRoll = false;
+            UIManager.Instance.OpenWindow<QYWin>();
+        }
+    }
+
+    public override void Run()
+    {
+        if (operationAgent == null)
+        {
+            //闃茶寖寮傚父
+            return;
+        }
+        base.Run();
+    }
+
+    public override void DistributeNextPackage()
+    {
+        if (IsBattleFinish)
+            return;
+
+        //  涓嶈璋冪敤base鐨勫嚱鏁�
+        BattleManager.Instance.DistributeNextReportPackage(guid);
+    }
+
+
+
+    public override void ShowWindow(HB424_tagSCTurnFightInit vNetData)
+    {
+        QYBattleWin fsBattleWin = UIManager.Instance.GetUI<QYBattleWin>();// as FullScreenBattleWin;
+        if (null == fsBattleWin)
+        {
+            fsBattleWin = UIManager.Instance.OpenWindow<QYBattleWin>();
+        }
+        fsBattleWin.SetBattleField(this);
+        if (UIManager.Instance.IsOpened<QYWin>())
+        {
+            UIManager.Instance.CloseWindow<QYWin>();
+        }
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/QYBattleField.cs.meta b/Main/System/Battle/BattleField/QYBattleField.cs.meta
new file mode 100644
index 0000000..a121889
--- /dev/null
+++ b/Main/System/Battle/BattleField/QYBattleField.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3754873d62465ca43987e130db4a0303
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/BattleFieldFactory.cs b/Main/System/Battle/BattleFieldFactory.cs
index 6861958..12c1c9e 100644
--- a/Main/System/Battle/BattleFieldFactory.cs
+++ b/Main/System/Battle/BattleFieldFactory.cs
@@ -35,6 +35,9 @@
             case 30000:
                 battleField = new PriviewBattleField(guid);
                 break;
+            case 32000:
+                battleField = new QYBattleField(guid);
+                break;
             default:
                 break;
         }
diff --git a/Main/System/Battle/BattleManager.cs b/Main/System/Battle/BattleManager.cs
index 1719158..fd52afd 100644
--- a/Main/System/Battle/BattleManager.cs
+++ b/Main/System/Battle/BattleManager.cs
@@ -650,7 +650,7 @@
     //鍙戣繘鍏ユ垬鏂楀寘
     private float lastTime = 0f;
     private float turnCoolDown = 0.5f; // 鍐峰嵈鏃堕棿
-    public void SendTurnFight(uint mapID, uint funcLineID = 0, byte tagType = 0, uint tagID = 0, uint[] valueList = null)
+    public void SendTurnFight(uint mapID, uint funcLineID = 0, byte tagType = 0, uint tagID = 0, uint[] valueList = null, bool showLoading = true)
     {
         // 杩炵画棰戠箒鍙戝寘锛岃Е鍙戞彁绀�
         float currentTime = Time.time;
@@ -673,7 +673,7 @@
         }
         GameNetSystem.Instance.SendInfo(pack);
         Debug.Log("鎴樻枟鏃跺簭 鍙戣捣 " + Time.time);
-        if (mapID != 1)
+        if (mapID != 1 && showLoading)
         {
             UIManager.Instance.OpenWindow<MapLoadingWin>();
         }
diff --git a/Main/System/BillboardRank/RankModel.cs b/Main/System/BillboardRank/RankModel.cs
index 982119a..8f7822f 100644
--- a/Main/System/BillboardRank/RankModel.cs
+++ b/Main/System/BillboardRank/RankModel.cs
@@ -1,5 +1,6 @@
 锘縰sing System;
 using System.Collections.Generic;
+using LitJson;
 using UnityEngine;
 
 // 鏀寔鍒嗛〉鏌ヨ鎺掕姒�, 鏈湇/璺ㄦ湇缁熶竴浣跨敤 鍙傝�僎ueryRankByPage  鏂板皝鍖� DTCA130_tagMCViewBillboardRet
@@ -81,6 +82,13 @@
         data.cmpValue2 = serverData.CmpValue2;
         data.cmpValue3 = serverData.CmpValue3;
         data.userData = serverData.UserData;
+
+        var userData = JsonMapper.ToObject(serverData.UserData);
+        if (userData.ContainsKey("FightPower"))
+        {
+            long.TryParse(userData["FightPower"].ToString(), out data.fightPower);
+        }
+        
         data.rank = serverData.Rank;
         data.type = type;
         data.index = serverData.Index;
@@ -178,6 +186,13 @@
         data.cmpValue2 = serverData.CmpValue2;
         data.cmpValue3 = serverData.CmpValue3;
         data.userData = serverData.UserData;
+
+        var userData = JsonMapper.ToObject(serverData.UserData);
+        if (userData.ContainsKey("FightPower"))
+        {
+            long.TryParse(userData["FightPower"].ToString(), out data.fightPower);
+        }
+        
         data.rank = serverData.Rank;
         data.index = serverData.Index;
         data.type = type;   //涓庢湇鍔$涓�鑷寸殑璺ㄦ湇鎺掕姒滅被鍨嬶紝澶栭儴鑷澶勭悊涓嶅悓鍒嗙粍鍒嗚禌瀛g瓑鎯呭喌
@@ -433,6 +448,7 @@
     public uint cmpValue2;
     public uint cmpValue3;
     public string userData;
+    public long fightPower;
     public int rank;   // 鎺掑悕浠�1寮�濮嬶紝浠h〃绗�1鍚�
     public int index;	//鏁版嵁鍦ㄦ鍗曞垪琛ㄤ腑鐨勭储寮曪紝浠�0寮�濮� 闈炴帓鍚� 鍒嗛〉鏌ヨ浼氱敤鍒� 
 }
diff --git a/Main/System/ChallengeTab/QunyingTabHandler.cs b/Main/System/ChallengeTab/QunyingTabHandler.cs
index f61532a..289f9c8 100644
--- a/Main/System/ChallengeTab/QunyingTabHandler.cs
+++ b/Main/System/ChallengeTab/QunyingTabHandler.cs
@@ -17,33 +17,34 @@
 
     protected override Action GetOnClickAction()
     {
-        return HandleArenaNavigation;
+        return HandleNavigation;
     }
 
-    private void HandleArenaNavigation()
+    private void HandleNavigation()
     {
         if (!FuncOpen.Instance.IsFuncOpen(GetFuncId(), true))
             return;
         UIManager.Instance.CloseWindow<ChallengeTabWin>();
         
-        // BattleField battle = BattleManager.Instance.GetBattleFieldByMapID(32000);
-        // if (battle != null)
-        // {
-        //     ArenaBattleWin battleWin;
-        //     if (!UIManager.Instance.IsOpened<ArenaBattleWin>())
-        //     {
-        //         battleWin = UIManager.Instance.OpenWindow<ArenaBattleWin>();
-        //     }
-        //     else
-        //     {
-        //         battleWin = UIManager.Instance.GetUI<ArenaBattleWin>();
-        //     }
-        //     battleWin.SetBattleField(battle);
-        // }
-        // else
-        // {
-        //     UIManager.Instance.OpenWindow<ArenaWin>();
-        // }
+        BattleField battle = BattleManager.Instance.GetBattleFieldByMapID(QunyingManager.DataMapID);
+        if (battle != null)
+        {
+            QYBattleWin battleWin;
+            if (!UIManager.Instance.IsOpened<QYBattleWin>())
+            {
+                battleWin = UIManager.Instance.OpenWindow<QYBattleWin>();
+            }
+            else
+            {
+                battleWin = UIManager.Instance.GetUI<QYBattleWin>();
+            }
+            battleWin.SetBattleField(battle);
+        }
+        else
+        {
+            QunyingManager.Instance.openQYWinNeedRoll = true;
+            UIManager.Instance.OpenWindow<QYWin>();
+        }
     }
 
     protected override void SubscribeToSpecificEvents()
diff --git a/Main/System/FuncPreset/FuncPresetManager.cs b/Main/System/FuncPreset/FuncPresetManager.cs
index 1652915..5f1059f 100644
--- a/Main/System/FuncPreset/FuncPresetManager.cs
+++ b/Main/System/FuncPreset/FuncPresetManager.cs
@@ -400,9 +400,10 @@
 //鎴樻枟鍔熻兘鍖哄垎瀵瑰簲瀛樺偍鍏ㄥ眬鏂规ID锛屽婕旀鍦洪槻瀹堢敤鍝釜鍏ㄥ眬鏂规ID鐨勫垎绫�
 public enum BattlePreSetType
 {
-	None = 0,
-	Story = 1, //涓荤嚎
-	Arena = 2,  //婕旀鍦洪槻瀹�
+    None = 0,
+    Story = 1, //涓荤嚎
+    Arena = 2,  //婕旀鍦洪槻瀹�
+    Qunying = 3, //缇よ嫳鎴橀槻瀹�
 
 }
 
diff --git a/Main/System/Qunying/QYBattleFailWin.cs b/Main/System/Qunying/QYBattleFailWin.cs
new file mode 100644
index 0000000..95ab80c
--- /dev/null
+++ b/Main/System/Qunying/QYBattleFailWin.cs
@@ -0,0 +1,99 @@
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
+using LitJson;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class QYBattleFailWin : UIBase
+{
+    [SerializeField] AvatarCell myAvatarCell;
+    [SerializeField] AvatarCell enemyAvatarCell;
+    [SerializeField] TextEx txtMyName;
+    [SerializeField] TextEx txtEnemyName;
+    [SerializeField] TextEx txtFuncName;
+    
+    [SerializeField] Button tipHeroCultivateBtn;
+    [SerializeField] Button tipEquipBtn;
+    [SerializeField] Button tipHeroPosBtn;
+    [SerializeField] ButtonEx detailBtn;
+    JsonData jsonData;
+    string battleName = BattleConst.QYBattleField;
+    protected override void InitComponent()
+    {
+        detailBtn.SetListener(() =>
+        {
+            BattleSettlementManager.Instance.OpenBattleDetailWin(battleName);
+        });
+        tipHeroCultivateBtn.AddListener(() =>
+        {
+            CloseWindow();
+        });
+        
+        tipEquipBtn.AddListener(() =>
+        {
+            CloseWindow();
+        });
+
+        tipHeroPosBtn.AddListener(() =>
+        {
+            CloseWindow();
+            UIManager.Instance.OpenWindow<HeroPosWin>();
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        jsonData = BattleSettlementManager.Instance.GetBattleSettlement(battleName);
+        if (jsonData == null)
+        {
+            DelayCloseWindow().Forget();
+            return;
+        }
+        Display();
+        if (!FirstChargeManager.Instance.GetLocalFail())
+        {
+            FirstChargeManager.Instance.SetLocalFail();
+        }
+        FirstChargeManager.Instance.TryPopWin();
+    }
+
+    protected override void OnPreClose()
+    {
+        BattleSettlementManager.Instance.WinShowOver(battleName);
+    }
+
+    // B4 20 鍥炲悎鍒舵垬鏂楃姸鎬� #tagMCTurnFightState  閫氱敤鐨勭粨绠楃姸鎬� State 4-缁撶畻濂栧姳
+    // Msg 涓澶栦俊鎭�
+    // "tagPlayerID":瀵规垬鐨勭洰鏍嘔D,
+    // "atkAddScore":鍙戣捣鏂瑰鍔犵殑绉垎锛屽彲鑳戒负0,
+    // "defDecScore":琚嚮鏂瑰噺灏戠殑绉垎锛屽彲鑳戒负0,
+    // itemInfo:濂栧姳鐗╁搧鍒楄〃锛屽彲鑳戒负绌�
+    void Display()
+    {
+        if (!jsonData.ContainsKey("tagID"))
+            return;
+        uint tagPlayerID = (uint)jsonData["tagID"];
+
+        if (!QunyingManager.Instance.TryGetPlayerInfo(tagPlayerID, out QunyingMatchInfo info))
+            return;
+        uint enemyFace = info.Face;
+        uint enemyFacePic = info.FacePic;
+
+        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
+                                                PlayerDatas.Instance.baseData.face,
+                                                PlayerDatas.Instance.baseData.facePic));
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
+        enemyAvatarCell.SetListener(() =>
+        {
+            AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
+        });
+
+        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
+        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
+
+        int funcId = (int)FuncOpenEnum.Qunying;
+        txtFuncName.text = FuncOpenLVConfig.HasKey(funcId) ? FuncOpenLVConfig.Get(funcId).Name : string.Empty;
+    }
+    
+
+}
\ No newline at end of file
diff --git a/Main/System/Qunying/QYBattleFailWin.cs.meta b/Main/System/Qunying/QYBattleFailWin.cs.meta
new file mode 100644
index 0000000..4726ead
--- /dev/null
+++ b/Main/System/Qunying/QYBattleFailWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 123ef991d6043894482acaa49a2b7776
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Qunying/QYBattleVictoryWin.cs b/Main/System/Qunying/QYBattleVictoryWin.cs
new file mode 100644
index 0000000..bb0650e
--- /dev/null
+++ b/Main/System/Qunying/QYBattleVictoryWin.cs
@@ -0,0 +1,141 @@
+using System.Collections.Generic;
+using Cysharp.Threading.Tasks;
+using LitJson;
+using UnityEngine;
+
+public class QYBattleVictoryWin : UIBase
+{
+    [SerializeField] AvatarCell myAvatarCell;
+    [SerializeField] AvatarCell enemyAvatarCell;
+    [SerializeField] TextEx txtMyName;
+    [SerializeField] TextEx txtEnemyName;
+    [SerializeField] TextEx winInfo;
+    [SerializeField] TextEx quickWinInfo;
+    [SerializeField] TextEx txtFuncName;
+    [SerializeField] ScrollerController scroller;
+    [SerializeField] ButtonEx detailBtn;
+    JsonData jsonData;
+    string battleName = BattleConst.QYBattleField;
+
+    protected override void InitComponent()
+    {
+        detailBtn.SetListener(() =>
+        {
+            BattleSettlementManager.Instance.OpenBattleDetailWin(battleName);
+        });
+    }
+
+    protected override void OnPreOpen()
+    {
+        scroller.OnRefreshCell += OnRefreshCell;
+        jsonData = BattleSettlementManager.Instance.GetBattleSettlement(battleName);
+        if (jsonData == null && QunyingManager.Instance.quickCnt == 0)
+        {
+            DelayCloseWindow().Forget();
+            return;
+        }
+        Display();
+        CreateScroller();
+    }
+
+    protected override void OnPreClose()
+    {
+        scroller.OnRefreshCell -= OnRefreshCell;
+        BattleSettlementManager.Instance.WinShowOver(battleName);
+        QunyingManager.Instance.quickCnt = 0;
+        QunyingManager.Instance.itemInfos.Clear();
+    }
+    // B4 20 鍥炲悎鍒舵垬鏂楃姸鎬� #tagMCTurnFightState  閫氱敤鐨勭粨绠楃姸鎬� State 4-缁撶畻濂栧姳
+    // Msg 涓澶栦俊鎭�
+    // "tagPlayerID":瀵规垬鐨勭洰鏍嘔D,
+    // "atkAddScore":鍙戣捣鏂瑰鍔犵殑绉垎锛屽彲鑳戒负0,
+    // "defDecScore":琚嚮鏂瑰噺灏戠殑绉垎锛屽彲鑳戒负0,
+    // itemInfo:濂栧姳鐗╁搧鍒楄〃锛屽彲鑳戒负绌�
+    void Display()
+    {
+
+        int quickCnt = QunyingManager.Instance.quickCnt;
+        uint tagPlayerID = quickCnt == 0 ? (uint)jsonData["tagPlayerID"] : (uint)QunyingManager.Instance.tagPlayerID;
+        if (!QunyingManager.Instance.TryGetPlayerInfo(tagPlayerID, out QunyingMatchInfo info))
+            return;
+        uint enemyFace = info.Face;
+        uint enemyFacePic = info.FacePic;
+
+        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID,
+                                                PlayerDatas.Instance.baseData.face,
+                                                PlayerDatas.Instance.baseData.facePic));
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)tagPlayerID, (int)enemyFace, (int)enemyFacePic));
+        enemyAvatarCell.SetListener(() =>
+        {
+            AvatarHelper.TryViewOtherPlayerInfo((int)tagPlayerID, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
+        });
+
+        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
+        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
+        if (quickCnt == 0)
+        {
+            winInfo.SetActive(true);
+            quickWinInfo.SetActive(false);
+            winInfo.text = QunyingManager.Instance.tagRank.ToString();
+        }
+        else
+        {
+            winInfo.SetActive(false);
+            quickWinInfo.SetActive(true);
+            quickWinInfo.text = Language.Get("Qunying16", quickCnt);
+        }
+
+        int funcId = (int)FuncOpenEnum.Qunying;
+        txtFuncName.text = FuncOpenLVConfig.HasKey(funcId) ? FuncOpenLVConfig.Get(funcId).Name : string.Empty;
+    }
+
+    List<Item> showItems = new List<Item>();
+    void CreateScroller()
+    {
+
+        showItems.Clear();
+        scroller.Refresh();
+
+        if (QunyingManager.Instance.quickCnt == 0)
+        {
+            if (!jsonData.ContainsKey("itemInfo"))
+            {
+                return;
+            }
+
+            var resultStr = jsonData["itemInfo"];
+            for (int i = 0; i < resultStr.Count; i++)
+            {
+                showItems.Add(new Item((int)resultStr[i]["ItemID"], (long)resultStr[i]["Count"]));
+            }
+        }
+        else
+        {
+            for (int i = 0; i < QunyingManager.Instance.itemInfos.Count; i++)
+            {
+                showItems.Add(QunyingManager.Instance.itemInfos[i]);
+            }
+        }
+
+        showItems.Sort(SortItem);
+        for (int i = 0; i < showItems.Count; i++)
+        {
+            scroller.AddCell(ScrollerDataType.Header, i);
+        }
+        scroller.Restart();
+    }
+
+    int SortItem(Item itemA, Item itemB)
+    {
+        var itemConfigA = ItemConfig.Get(itemA.id);
+        var itemConfigB = ItemConfig.Get(itemB.id);
+        return itemConfigB.ItemColor - itemConfigA.ItemColor;
+    }
+
+    void OnRefreshCell(ScrollerDataType type, CellView cell)
+    {
+        var _cell = cell as SettlementAwardCell;
+        var item = showItems[cell.index];
+        _cell?.Display(item.id, item.countEx);
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Qunying/QYBattleVictoryWin.cs.meta b/Main/System/Qunying/QYBattleVictoryWin.cs.meta
new file mode 100644
index 0000000..b64bbb3
--- /dev/null
+++ b/Main/System/Qunying/QYBattleVictoryWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: cf3dc1591a467cf4a90a3fe1b5a42cc4
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Qunying/QYBattleWin.cs b/Main/System/Qunying/QYBattleWin.cs
new file mode 100644
index 0000000..5c2edec
--- /dev/null
+++ b/Main/System/Qunying/QYBattleWin.cs
@@ -0,0 +1,306 @@
+锘縰sing System.Collections.Generic;
+using LitJson;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class QYBattleWin : BaseBattleWin
+{
+    [SerializeField] Transform transButtons;
+    [SerializeField] HeroCountryComponent myCountry;
+    [SerializeField] TextEx txtMyLV;
+    [SerializeField] TextEx txtMyName;
+    [SerializeField] TextEx txtMyHp;
+    [SerializeField] ImageEx imgMyHp;
+    [SerializeField] TextEx txtMyFightPonit;
+    [SerializeField] AvatarCell myAvatarCell;
+    [SerializeField] List<ArenaHeroHead> myHeroHeads;
+
+    [SerializeField] HeroCountryComponent enemyCountry;
+    [SerializeField] TextEx txtEnemyLV;
+    [SerializeField] TextEx txtEnemyName;
+    [SerializeField] TextEx txtEnemyHp;
+    [SerializeField] ImageEx imgEnemyHp;
+    [SerializeField] TextEx txtEnemyFightPonit;
+    [SerializeField] AvatarCell enemyAvatarCell;
+    [SerializeField] List<ArenaHeroHead> enemyHeroHeads;
+
+    [SerializeField] Text funcName;
+
+    protected override void RegisterBattleEvents()
+    {
+        base.RegisterBattleEvents();
+        EventBroadcast.Instance.AddListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
+    }
+
+    protected override void UnregisterBattleEvents()
+    {
+        base.UnregisterBattleEvents();
+        EventBroadcast.Instance.RemoveListener<string, JsonData>(EventName.BATTLE_END, OnBattleEnd);
+    }
+
+    protected virtual void OnBattleEnd(string guid, JsonData endData)
+    {
+        if (battleField != null && guid == battleField.guid)
+        {
+            DisplayHpInfo();
+        }
+    }
+
+    protected override void OnPreOpen()
+    {
+        base.OnPreOpen();
+        MainWin.TabChangeEvent += OnTabChangeEvent;
+        UIManager.Instance.OnOpenWindow += OnOpenWindow;
+        bool isOpenBattleChangeTab = IsOpenBattleChangeTab();
+        transButtons.localPosition = new Vector3(0, isOpenBattleChangeTab ? 130 : 0, 0);
+        if (isOpenBattleChangeTab)
+        {
+            UIManager.Instance.GetUI<MainWin>()?.CloseSubUI();
+        }
+        else
+        {
+            UIManager.Instance.CloseWindow<MainWin>();
+        }
+        isClickSkip = false;
+
+        int funcId = (int)FuncOpenEnum.Qunying;
+        funcName.text = FuncOpenLVConfig.HasKey(funcId) ? FuncOpenLVConfig.Get(funcId).Name : string.Empty;
+    }
+
+    protected override void OnPreClose()
+    {
+        base.OnPreClose();
+        MainWin.TabChangeEvent -= OnTabChangeEvent;
+        UIManager.Instance.OnOpenWindow -= OnOpenWindow;
+        bool isOpenBattleChangeTab = IsOpenBattleChangeTab();
+        if (isOpenBattleChangeTab)
+        {
+            UIManager.Instance.GetUI<MainWin>()?.RestoreSubUI();
+        }
+        else
+        {
+            UIManager.Instance.OpenWindow<MainWin>();
+        }
+
+        if (isClickSkip)
+        {
+            isClickSkip = false;
+            TryPass();
+        }
+    }
+
+    void OnOpenWindow(UIBase win)
+    {
+        if (win is QYBattleVictoryWin || win is QYBattleFailWin)
+        {
+            isClickSkip = false;
+        }
+    }
+    bool isClickSkip = false;
+    protected override void OnClickPass()
+    {
+        if (!IsPass())
+            return;
+        isClickSkip = true;
+        clickTime = Time.time;  // 璁板綍鐐瑰嚮鏃堕棿
+        battleField.ForceFinish();
+    }
+
+    float stayTime = 2f;
+    float clickTime = 0f;
+    void LateUpdate()
+    {
+        if (isClickSkip && Time.time - clickTime >= stayTime)
+        {
+            isClickSkip = false;
+            TryPass();
+        }
+    }
+
+    private void TryPass()
+    {
+        if (UIManager.Instance.IsOpened<QYBattleVictoryWin>() ||
+            UIManager.Instance.IsOpened<QYBattleFailWin>())
+            return;
+        CloseWindow();
+        Debug.LogError($"OnBattleEnd 寮傚父鍏抽棴");
+        BattleSettlementManager.Instance.WinShowOver(BattleConst.QYBattleField);
+    }
+    private void OnTabChangeEvent()
+    {
+        CloseWindow();
+    }
+
+    protected override void OnDamageTaken(BattleDmgInfo damageInfo)
+    {
+        base.OnDamageTaken(damageInfo);
+        if (battleField == null)
+            return;
+        if (damageInfo.battleFieldGuid == battleField.guid)
+        {
+            DisplayHpInfo();
+        }
+    }
+
+    protected override void OnCreateBattleField(string guid, BattleField field)
+    {
+        if (field is QYBattleField)
+        {
+            SetBattleField(field);
+        }
+    }
+
+    protected override void RefreshSpecific()
+    {
+        DisplayHpInfo();
+        DisplayPlayerInfo();
+    }
+
+    private void DisplayHpInfo()
+    {
+        if (battleField == null)
+            return;
+
+        // 鑾峰彇鎴戞柟锛堢孩鏂癸級闃熶紞鏁版嵁
+        List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
+        // 鑾峰彇鏁屾柟锛堣摑鏂癸級闃熶紞鏁版嵁
+        List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue);
+
+        ulong myMaxHp = GetMaxHP(myTeam);
+        ulong enemyMaxHp = GetMaxHP(enemyTeam);
+
+        ulong myNowHp = GetNowHP(myTeam);
+        ulong enemyNowHp = GetNowHP(enemyTeam);
+        txtMyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeNum(myNowHp), UIHelper.ReplaceLargeNum(myMaxHp));
+        txtEnemyHp.text = Language.Get("BoneField09", UIHelper.ReplaceLargeNum(enemyNowHp), UIHelper.ReplaceLargeNum(enemyMaxHp));
+        imgMyHp.fillAmount = Mathf.Clamp01((myMaxHp > 0) ? (float)myNowHp / myMaxHp : 0f);
+        imgEnemyHp.fillAmount = Mathf.Clamp01((enemyMaxHp > 0) ? (float)enemyNowHp / enemyMaxHp : 0f);
+
+    }
+
+    private long GetFightPonit(List<BattleObject> Team)
+    {
+        if (Team.IsNullOrEmpty())
+        {
+            return 0;
+        }
+        long res = 0;
+        foreach (var obj in Team)
+        {
+            if (obj is not HeroBattleObject)
+                continue;
+            res += obj.GetFightPower();
+        }
+        return res;
+    }
+
+    private void DisplayPlayerInfo()
+    {
+        if (battleField == null)
+            return;
+        if (!QunyingManager.Instance.TryGetPlayerInfo(QunyingManager.Instance.atkPlayerId, out QunyingMatchInfo info))
+            return;
+        // 鑾峰彇鎴戞柟锛堢孩鏂癸級闃熶紞鏁版嵁
+        List<BattleObject> myTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Red);
+        // 鑾峰彇鏁屾柟锛堣摑鏂癸級闃熶紞鏁版嵁
+        List<BattleObject> enemyTeam = battleField.battleObjMgr.GetBattleObjList(BattleCamp.Blue);
+
+
+        txtEnemyLV.text = Language.Get("Arena22", info.LV);
+        txtEnemyName.text = UIHelper.ServerStringTrim(info.PlayerName);
+        txtEnemyFightPonit.text = UIHelper.ReplaceLargeArtNum(GetFightPonit(enemyTeam));
+        enemyAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)info.PlayerID, (int)info.Face, (int)info.FacePic));
+        enemyAvatarCell.SetListener(() =>
+        {
+            AvatarHelper.TryViewOtherPlayerInfo((int)info.PlayerID, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
+        });
+        var team = GetTeamHeroList(enemyTeam);
+        enemyCountry.RefreshOnTeamCountry(team, true);
+
+        txtMyLV.text = Language.Get("Arena22", PlayerDatas.Instance.baseData.LV);
+        txtMyName.text = PlayerDatas.Instance.baseData.PlayerName;
+        long myFightPower = GetFightPonit(myTeam);
+        txtMyFightPonit.text = UIHelper.ReplaceLargeArtNum(myFightPower);
+        myAvatarCell.InitUI(AvatarHelper.GetAvatarModel((int)PlayerDatas.Instance.baseData.PlayerID, PlayerDatas.Instance.baseData.face, PlayerDatas.Instance.baseData.facePic));
+        team = GetTeamHeroList(myTeam);
+        myCountry.RefreshOnTeamCountry(team, true);
+
+        for (int i = 0; i < myHeroHeads.Count; i++)
+        {
+            if (i < myTeam.Count && myTeam[i] is HeroBattleObject heroBattleObject)
+            {
+                myHeroHeads[i].SetActive(true);
+                var teamHero = heroBattleObject.teamHero;
+                myHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level);
+            }
+            else
+            {
+                myHeroHeads[i].SetActive(false);
+            }
+        }
+
+        // 鏁屾柟鑻遍泟鏄剧ず锛堜粠鍙冲埌宸︼級
+        for (int i = enemyHeroHeads.Count - 1; i >= 0; i--)
+        {
+            int teamIndex = enemyHeroHeads.Count - 1 - i;  // 寤虹珛鍙嶅悜鏄犲皠
+
+            if (teamIndex < enemyTeam.Count && enemyTeam[teamIndex] is HeroBattleObject heroBattleObject)
+            {
+                enemyHeroHeads[i].SetActive(true);
+                var teamHero = heroBattleObject.teamHero;  // 浣跨敤鏄犲皠鍚庣殑绱㈠紩
+                enemyHeroHeads[i].Display(teamHero.heroId, teamHero.SkinID, teamHero.level);
+            }
+            else
+            {
+                enemyHeroHeads[i].SetActive(false);
+            }
+        }
+
+    }
+    ulong GetMaxHP(List<BattleObject> battleObjects)
+    {
+        ulong sun = 0;
+        if (!battleObjects.IsNullOrEmpty())
+        {
+            for (int i = 0; i < battleObjects.Count; i++)
+            {
+                sun += (ulong)battleObjects[i].GetMaxHp();
+            }
+        }
+        return sun;
+    }
+
+    ulong GetNowHP(List<BattleObject> battleObjects)
+    {
+        ulong sun = 0;
+        if (!battleObjects.IsNullOrEmpty())
+        {
+            for (int i = 0; i < battleObjects.Count; i++)
+            {
+                sun += (ulong)battleObjects[i].GetCurHp();
+            }
+        }
+        return sun;
+    }
+
+    List<TeamHero> GetTeamHeroList(List<BattleObject> teams)
+    {
+        List<TeamHero> teamHeroes = new List<TeamHero>();
+        if (teams.IsNullOrEmpty())
+            return teamHeroes;
+        foreach (var item in teams)
+        {
+            if (item is HeroBattleObject heroBattleObject)
+            {
+                teamHeroes.Add(heroBattleObject.teamHero);
+            }
+        }
+        return teamHeroes;
+
+    }
+
+    bool IsOpenBattleChangeTab()
+    {
+        return FuncOpen.Instance.IsFuncOpen(ArenaManager.Instance.BattleChangeTabFuncId);
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Qunying/QYBattleWin.cs.meta b/Main/System/Qunying/QYBattleWin.cs.meta
new file mode 100644
index 0000000..4e2aba1
--- /dev/null
+++ b/Main/System/Qunying/QYBattleWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2fea3a4b19e88144eb09b61bf7bc4e78
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Qunying/QYFighterCell.cs b/Main/System/Qunying/QYFighterCell.cs
new file mode 100644
index 0000000..17dd062
--- /dev/null
+++ b/Main/System/Qunying/QYFighterCell.cs
@@ -0,0 +1,173 @@
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+// 缇よ嫳鎸戞垬
+public class QYFighterCell : MonoBehaviour
+{
+    [SerializeField] HorseController model;
+    [SerializeField] OfficialTitleCell officialTitleCell;
+    [SerializeField] Text fightPowerText;
+    [SerializeField] Text nameText;
+    [SerializeField] Text serverText;
+    [SerializeField] Button queryPlayerBtn; //鍚庣画娣诲姞鐐瑰嚮鏌ョ湅鐜╁璇︽儏
+    [SerializeField] Text rankText;
+    [SerializeField] Transform myMark;
+    [SerializeField] Button challengeBtn;
+    [SerializeField] Transform quickObj;
+    [SerializeField] Button quickChallengeBtn;
+    [SerializeField] Button quickChallengeMoreBtn;
+    [SerializeField] Text quickChallengeMoreText;
+
+
+
+    QunyingMatchInfo matchInfo;
+    void Start()
+    {
+        challengeBtn.SetListener(() =>
+        {
+            if (matchInfo == null)
+                return;
+            if (!UIHelper.CheckMoneyCount(QunyingManager.challengeMoneyType, 1, 1))
+            {
+                StoreModel.Instance.ShowBuyItem(QunyingManager.challengeShopID, 0);
+                return;
+            }
+            QunyingManager.Instance.atkPlayerId = matchInfo.PlayerID;
+            QunyingManager.Instance.tagRank = matchInfo.Rank;
+            BattleManager.Instance.SendTurnFight(QunyingManager.DataMapID, 0, 1, matchInfo.PlayerID, new uint[] { matchInfo.Rank, 0 });
+        });
+
+        queryPlayerBtn.AddListener(() =>
+        {
+            if (matchInfo.PlayerID < 1000000) return;
+            AvatarHelper.TryViewOtherPlayerInfo((int)matchInfo.PlayerID, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
+        });
+
+        quickChallengeBtn.AddListener(() =>
+        {
+            if (matchInfo == null)
+                return;
+            if (!UIHelper.CheckMoneyCount(QunyingManager.challengeMoneyType, 1, 1))
+            {
+                StoreModel.Instance.ShowBuyItem(QunyingManager.challengeShopID, 0);
+                return;
+            }
+            QunyingManager.Instance.atkPlayerId = matchInfo.PlayerID;
+            BattleManager.Instance.SendTurnFight(QunyingManager.DataMapID, 0, 1, matchInfo.PlayerID, new uint[] { matchInfo.Rank, 1 }, false);
+        });
+
+        quickChallengeMoreBtn.AddListener(() =>
+        {
+            if (matchInfo == null)
+                return;
+
+            //鏈�浣庢樉绀轰袱娆★紝浣嗗彲浠ユ渶浣庢寫鎴�1娆�
+            var cnt = Math.Max(1, Math.Min(5, UIHelper.GetMoneyCnt(QunyingManager.challengeMoneyType)));
+            if (!UIHelper.CheckMoneyCount(QunyingManager.challengeMoneyType, cnt, 1))
+            {
+                StoreModel.Instance.ShowBuyItem(QunyingManager.challengeShopID, 0);
+                return;
+            }
+            QunyingManager.Instance.atkPlayerId = matchInfo.PlayerID;
+            BattleManager.Instance.SendTurnFight(QunyingManager.DataMapID, 0, 1, matchInfo.PlayerID, new uint[] { matchInfo.Rank, (uint)cnt }, false);
+        });
+    }
+
+    public void Display(int index)
+    {
+        var myMatch = QunyingManager.Instance.GetMyMatchInfo(out int myIndex);
+        var list = QunyingManager.Instance.matchInfoList;
+        if (list.IsNullOrEmpty() || index < 0 || index >= list.Count)
+        {
+            if (myMatch != null)
+            {
+                this.SetActive(false);
+                return;
+            }
+            if (myMatch == null && index != 4)
+            {
+                this.SetActive(false);
+                return;
+            }
+            //鑷繁鏈笂鐗堢殑 鍦ㄧ5浣嶈ˉ
+
+        }
+
+        this.SetActive(true);
+
+        if (myMatch == null && index == 4)
+        {
+            //濉厖鑷繁鐨�
+            matchInfo = new QunyingMatchInfo
+            {
+                Rank = 0,
+                PlayerID = PlayerDatas.Instance.baseData.PlayerID,
+                PlayerName = PlayerDatas.Instance.baseData.PlayerName,
+                LV = PlayerDatas.Instance.baseData.LV,
+                RealmLV = PlayerDatas.Instance.baseData.realmLevel,
+                FightPower = (ulong)PlayerDatas.Instance.baseData.FightPower,
+                TitleID = (uint)PlayerDatas.Instance.baseData.TitleID,
+                ModelMark = (uint)PlayerDatas.Instance.baseData.modelMark,
+                EquipShowSwitch = PlayerDatas.Instance.baseData.equipShowSwitch,
+                ServerID = (uint)ServerListCenter.Instance.currentServer.region_flag,
+            };
+        }
+        else
+        {
+            matchInfo = list[index];
+        }
+
+        nameText.text = UIHelper.ServerStringTrim(matchInfo.PlayerName);
+
+        if (matchInfo.ServerID == 0)
+        {
+            serverText.text = Language.Get("Qunying15");
+        }
+        else
+        {
+            serverText.text = ServerListCenter.Instance.GetServerName((int)matchInfo.ServerID);
+        }
+
+        fightPowerText.text = UIHelper.ReplaceLargeArtNum(matchInfo.FightPower);
+
+        officialTitleCell.InitUI(matchInfo.RealmLV, (int)matchInfo.TitleID);
+        int modelMark = (int)matchInfo.ModelMark;
+        if (modelMark == 0)
+        {
+            modelMark = QunyingManager.Instance.robotModelIDs[matchInfo.PlayerID % QunyingManager.Instance.robotModelIDs.Length];
+        }
+        model.Create((int)matchInfo.EquipShowSwitch % 1000, modelMark, 0.9f);
+        rankText.text = matchInfo.Rank > 0 ? $"{matchInfo.Rank}" : Language.Get("L1125");
+        myMark.SetActive(matchInfo.PlayerID == PlayerDatas.Instance.baseData.PlayerID);
+
+        var ticketCnt = Math.Max(2, Math.Min(5, UIHelper.GetMoneyCnt(QunyingManager.challengeMoneyType)));
+        if (myMatch != null && myMatch.Rank < matchInfo.Rank)
+        {
+            //浣庝簬鑷繁鐨�
+            quickObj.SetActive(true);
+            challengeBtn.SetActive(false);
+            quickChallengeMoreText.text = Language.Get("Qunying9", ticketCnt);
+        }
+        else if ((myMatch == null && index == 4) || (myMatch != null && myMatch.Rank == matchInfo.Rank))
+        {
+            //鏄嚜宸憋紝鍒嗘槸鍚︿笂姒滄儏鍐�
+            quickObj.SetActive(false);
+            challengeBtn.SetActive(false);
+        }
+        else
+        {
+            quickObj.SetActive(false);
+            challengeBtn.SetActive(true);
+        }
+    }
+
+
+
+}
+
+
+
+
diff --git a/Main/System/Qunying/QYFighterCell.cs.meta b/Main/System/Qunying/QYFighterCell.cs.meta
new file mode 100644
index 0000000..45946ea
--- /dev/null
+++ b/Main/System/Qunying/QYFighterCell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 8a72c6bf947ee7e4eab339e27e21d7c7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Qunying/QYPlayerTop3Cell.cs b/Main/System/Qunying/QYPlayerTop3Cell.cs
new file mode 100644
index 0000000..9772f61
--- /dev/null
+++ b/Main/System/Qunying/QYPlayerTop3Cell.cs
@@ -0,0 +1,53 @@
+using UnityEngine;
+using UnityEngine.UI;
+
+
+// 缇よ嫳鎺掕姒� 鐜╁鎺掕姒� 鍓嶄笁鍚�
+public class QYPlayerTop3Cell : MonoBehaviour
+{
+    [SerializeField] HorseController model;
+    [SerializeField] OfficialTitleCell officialTitleCell;
+    [SerializeField] Text fightPowerText;
+    [SerializeField] Text nameText;
+    [SerializeField] Text serverText;
+    [SerializeField] Button queryPlayerBtn; //鍚庣画娣诲姞鐐瑰嚮鏌ョ湅鐜╁璇︽儏
+
+    public void Display(int rankType, int rank)
+    {
+        var rankData = RankModel.Instance.GetRankDataByRank(rankType, rank);
+        if (rankData == null)
+        {
+            serverText.text = "";
+            nameText.text = Language.Get("L1124");
+            officialTitleCell.SetActive(false);
+            fightPowerText.text = "";
+            return;
+        }
+        officialTitleCell.SetActive(true);
+        var sid = UIHelper.GetServerIDByAccount(rankData.name2);
+        if (sid == 0)
+        {
+            serverText.text = Language.Get("Qunying15");
+        }
+        else
+        {
+            serverText.text = ServerListCenter.Instance.GetServerName(UIHelper.GetServerIDByAccount(rankData.name2));
+        }
+            
+        nameText.text = rankData.name1;
+        officialTitleCell.InitUI((int)rankData.value1, (int)rankData.value2);
+        model.Create(HorseManager.Instance.GetOtherPlayerHorseSkinID((int)rankData.value6), (int)rankData.value5, 0.9f);
+        queryPlayerBtn.SetListener(() =>
+        {
+            if (rankData.id < 1000000) return;
+            AvatarHelper.TryViewOtherPlayerInfo((int)rankData.id, viewPlayerLineupType: (int)BattlePreSetType.Qunying);
+        });
+        fightPowerText.text = UIHelper.ReplaceLargeArtNum(rankData.fightPower);
+    }
+
+
+}
+
+
+
+
diff --git a/Main/System/Qunying/QYPlayerTop3Cell.cs.meta b/Main/System/Qunying/QYPlayerTop3Cell.cs.meta
new file mode 100644
index 0000000..2cab6b0
--- /dev/null
+++ b/Main/System/Qunying/QYPlayerTop3Cell.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: dc373890f5310614f894283a67b58cc2
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Qunying/QYWin.cs b/Main/System/Qunying/QYWin.cs
new file mode 100644
index 0000000..496dbbd
--- /dev/null
+++ b/Main/System/Qunying/QYWin.cs
@@ -0,0 +1,117 @@
+using System;
+using Cysharp.Threading.Tasks;
+using UnityEngine;
+using UnityEngine.UI;
+
+
+//缇よ嫳涓荤晫闈�
+//QunyingManager.Instance.openQYWinNeedRoll 榛樿寮�鍚殑鏃跺�欐粴鍔ㄥ睍绀�
+public class QYWin : UIBase
+{
+    [SerializeField] QYPlayerTop3Cell[] playerTop3Cells;
+    [SerializeField] QYFighterCell[] FighterCells;
+    [SerializeField] ScrollRect battleScrollRect;
+    [SerializeField] Button closeBtn;
+
+    protected override void InitComponent()
+    {
+        closeBtn.AddListener(CloseWindow);
+    }
+
+    protected override void OnPreOpen()
+    {
+        if (!QunyingManager.Instance.openQYWinNeedRoll)
+        {
+            var myMatch = QunyingManager.Instance.GetMyMatchInfo(out int index);
+            battleScrollRect.verticalNormalizedPosition = (4 - index) * 0.15f + 0f;
+        }
+        else
+        {
+            battleScrollRect.verticalNormalizedPosition = 1f;
+        }
+        RankModel.Instance.ResetQueryParam();
+        RankModel.Instance.QueryRankByPage(QunyingManager.rankType, 0, 3);
+        QunyingManager.Instance.RequestRefreshFighters(0);
+
+        RankModel.Instance.onRankRefresh += OnRankRefresh;
+        QunyingManager.Instance.OnMatchListEvent += OnMatchListEvent;
+
+        Display();
+    }
+
+
+    async UniTask SmoothScrollToBottom(float targetPos)
+    {
+        //绛夊緟
+        await UniTask.Delay(100);
+        float duration = 0.3f;
+        float elapsed = 0f;
+        float startPos = battleScrollRect.verticalNormalizedPosition;
+
+        while (elapsed < duration)
+        {
+            elapsed += Time.deltaTime;
+            float t = elapsed / duration;
+            battleScrollRect.verticalNormalizedPosition = Mathf.Lerp(startPos, targetPos, t);
+            await UniTask.Yield();
+        }
+
+        battleScrollRect.verticalNormalizedPosition = targetPos;
+    }
+
+
+    protected override void OnPreClose()
+    {
+        RankModel.Instance.onRankRefresh -= OnRankRefresh;
+        QunyingManager.Instance.OnMatchListEvent -= OnMatchListEvent;
+        QunyingManager.Instance.openQYWinNeedRoll = true;
+    }
+
+
+    void Display()
+    {
+        DisplayFighers();
+        DisplayPlayerTop3();
+    }
+
+
+    void DisplayPlayerTop3()
+    {
+        for (int i = 0; i < playerTop3Cells.Length; i++)
+        {
+            playerTop3Cells[i].Display(QunyingManager.rankType, i + 1);
+        }
+    }
+
+    void OnRankRefresh(int type)
+    {
+        if (type != QunyingManager.rankType)
+            return;
+        DisplayPlayerTop3();
+    }
+
+    void DisplayFighers()
+    {
+        for (int i = 0; i < FighterCells.Length; i++)
+        {
+            FighterCells[i].Display(i);
+        }
+    }
+
+    void OnMatchListEvent()
+    {
+        //婊氬姩鍒拌嚜宸辩殑浣嶇疆
+        if (QunyingManager.Instance.openQYWinNeedRoll)
+        {
+            var myMatch = QunyingManager.Instance.GetMyMatchInfo(out int index);
+            SmoothScrollToBottom(myMatch == null ? 0.1f : (4 - index) * 0.15f + 0f).Forget();
+        }
+        DisplayFighers();
+    }
+
+}
+
+
+
+
+
diff --git a/Main/System/Qunying/QYWin.cs.meta b/Main/System/Qunying/QYWin.cs.meta
new file mode 100644
index 0000000..02e9105
--- /dev/null
+++ b/Main/System/Qunying/QYWin.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 252aa1b571920694dba4932aaa4210be
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Qunying/QunyingManager.cs b/Main/System/Qunying/QunyingManager.cs
index 4fc85bf..57306e0 100644
--- a/Main/System/Qunying/QunyingManager.cs
+++ b/Main/System/Qunying/QunyingManager.cs
@@ -6,11 +6,29 @@
 public class QunyingManager : GameSystemManager<QunyingManager>
 {
     public const int challengeMoneyType = 56;
+    public const int challengeShopID = 16;
     public const int rankType = 10;
+    public const int recType = 312;  // 鎸戞垬璁板綍绫诲瀷 
+    public const int DataMapID = 32000;
+
+    public event Action OnMatchListEvent;
+    public List<QunyingMatchInfo> matchInfoList = new List<QunyingMatchInfo>();
+    //鐢ㄤ簬鐢ㄦ潵鎷挎垬鏂楄儨鍒╁け璐ョ殑澶村儚淇℃伅
+    public Dictionary<uint, QunyingMatchInfo> allFaceInfoDict = new Dictionary<uint, QunyingMatchInfo>();
+    public Dictionary<uint, List<QunyingGameRec>> gameRecDict = new Dictionary<uint, List<QunyingGameRec>>(); // <RecID,QunyingGameRec>
+    public uint atkPlayerId;
+    public int tagRank; //鎸戞垬鐩爣鐨勬帓鍚� 缁撴灉鏄剧ず鐢�
+    public event Action OnUpdateGameRecInfo;
+
+    public bool openQYWinNeedRoll = true; //鎵撳紑缇よ嫳鐣岄潰闇�瑕佹粴鍔ㄧ殑鎯呭喌
+
+
+
     public override void Init()
     {
         DTC0102_tagCDBPlayer.beforePlayerDataInitializeEventOnRelogin += BeforePlayerDataInitializeEventOnRelogin;
         PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefresh;
+        InitTable();
     }
 
     public override void Release()
@@ -19,8 +37,44 @@
         PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefresh;
     }
 
+    public int resetOpenDay; //閲嶇疆澶�8锛屽绗竴鍛ㄥ鏋滄槸鍛�5寮�鏈嶇殑涓嶄細閲嶇疆
+    public int[] robotModelIDs;
+    public int challengeMaxCnt;
+    public int restoreTicketMinute;
+    public int refreshMoneyType;
+    public int refreshMoneyValue;
+    public int refreshMaxCnt;
+    public Dictionary<int, int[][]> dayRankAwards = new Dictionary<int, int[][]>();
+    public Dictionary<int, int[][]> weekRankAwards = new Dictionary<int, int[][]>();
+    public Dictionary<int, int[][]> achievementAwards = new Dictionary<int, int[][]>();
+    public Dictionary<int, int> achievementIndexs = new Dictionary<int, int>();
+    
+    void InitTable()
+    {
+        var config = FuncConfigConfig.Get("QunyingSet");
+        resetOpenDay = int.Parse(config.Numerical1);
+        robotModelIDs = JsonMapper.ToObject<int[]>(config.Numerical2);
+
+        config = FuncConfigConfig.Get("QunyingChallenge");
+        challengeMaxCnt = int.Parse(config.Numerical1);
+        restoreTicketMinute = int.Parse(config.Numerical2);
+
+        config = FuncConfigConfig.Get("QunyingMatch");
+        var moneyInfo = ConfigParse.GetMultipleStr<int>(config.Numerical2);
+        refreshMoneyType = moneyInfo[0];
+        refreshMoneyValue = moneyInfo[1];
+        refreshMaxCnt = int.Parse(config.Numerical3);
+
+        config = FuncConfigConfig.Get("QunyingAward");
+        dayRankAwards = ConfigParse.ParseIntArray2Dict(config.Numerical1);
+        weekRankAwards = ConfigParse.ParseIntArray2Dict(config.Numerical2);
+        achievementAwards = ConfigParse.ParseIntArray2Dict(config.Numerical3);
+        achievementIndexs = ConfigParse.ParseIntDict(config.Numerical4);
+    }
+
     public void BeforePlayerDataInitializeEventOnRelogin()
     {
+        matchInfoList.Clear();
     }
     
     private void PlayerDataRefresh(PlayerDataType type)
@@ -33,5 +87,226 @@
 
     }
 
+
+    public void UpdateQunyingMatchInfo(HA924_tagSCQunyingMatchList vNetData)
+    {
+        if (vNetData == null || vNetData.MatchList.IsNullOrEmpty())
+            return;
+
+        matchInfoList.Clear();
+
+        foreach (var item in vNetData.MatchList)
+        {
+            var matchInfo = new QunyingMatchInfo
+            {
+                Rank = item.Rank,
+                PlayerID = item.PlayerID,
+                PlayerName = item.PlayerName,
+                LV = item.LV,
+                RealmLV = item.RealmLV,
+                FightPower = (ulong)item.FightPowerEx * 100000000 + (ulong)item.FightPower,
+                Face = item.Face,
+                FacePic = item.FacePic,
+                TitleID = item.TitleID,
+                ModelMark = item.ModelMark,
+                EquipShowSwitch = item.EquipShowSwitch,
+                ServerID = item.ServerID,
+            };
+            matchInfoList.Add(matchInfo);
+            allFaceInfoDict[item.PlayerID] = matchInfo;
+        }
+        matchInfoList.Sort((a, b) => a.Rank.CompareTo(b.Rank));
+        OnMatchListEvent?.Invoke();
+    }
+
+    public void UpdateQunyingInfo(HA925_tagSCQunyingPlayerInfo vNetData)
+    {
+
+    }
+
+    public void UpdateGameRecInfo(HA009_tagSCGameRecInfo vNetData)
+    {
+        if (vNetData == null || vNetData.RecType != recType)
+            return;
+        gameRecDict.Clear();
+        uint recID = vNetData.RecID;
+        if (!gameRecDict.ContainsKey(recID))
+            gameRecDict[recID] = new List<QunyingGameRec>();
+        foreach (var rec in vNetData.RecList)
+        {
+            try
+            {
+                var userData = JsonMapper.ToObject(rec.UserData);
+                string name = userData["Name"].ToString();
+                int curRank = int.Parse(userData["CurRank"].ToString());
+                int tagRank = int.Parse(userData["TagRank"].ToString());
+
+                var gameRec = new QunyingGameRec
+                {
+                    Time = rec.Time,
+                    Value1 = rec.Value1,
+                    Value2 = rec.Value2,
+                    Value3 = rec.Value3,
+                    Value4 = rec.Value4,
+                    Value5 = rec.Value5,
+                    Value6 = rec.Value6,
+                    Value7 = rec.Value7,
+                    Value8 = rec.Value8,
+                    Name = name,
+                    CurRank = curRank,
+                    TagRank = tagRank
+                };
+
+                gameRecDict[recID].Add(gameRec);
+
+                if (recID == PlayerDatas.Instance.baseData.PlayerID)
+                {
+                    allFaceInfoDict[rec.Value3] = new QunyingMatchInfo
+                    {
+                        Rank = (ushort)tagRank,
+                        PlayerID = rec.Value3,
+                        PlayerName = name,
+                        LV = (ushort)rec.Value8,
+                        RealmLV = (ushort)rec.Value7,
+                        Face = rec.Value5,
+                        FacePic = rec.Value6,
+                        ServerID = rec.Value1,
+
+                    };
+                }
+
+            }
+            catch (Exception ex)
+            {
+                Debug.LogError($"JSON瑙f瀽閿欒: {ex.Message}, UserData: {rec.UserData}");
+                continue;
+            }
+        }
+        OnUpdateGameRecInfo?.Invoke();
+    }
+
+
+    public bool TryGetPlayerInfo(uint playerID, out QunyingMatchInfo info)
+    {
+        return allFaceInfoDict.TryGetValue(playerID, out info);
+    }
+
+    // 鑾峰彇鍖归厤淇℃伅涓垜鐨勯儴鍒�
+    public QunyingMatchInfo GetMyMatchInfo(out int index)
+    {
+        index = 0;
+        for (int i = 0; i < matchInfoList.Count; i++)
+        {
+            if (matchInfoList[i].PlayerID == PlayerDatas.Instance.baseData.PlayerID)
+            {
+                index = i;
+                return matchInfoList[i];
+            }
+        }
+        return null;
+    }
+
+    //鍚戞湇鍔″櫒璇锋眰鍒锋柊鎸戞垬瀵硅薄
+    // 0-鎵撳紑鐣岄潰鏃舵煡璇紝1-寮哄埗鍒锋柊鍖归厤鍒楄〃
+    public void RequestRefreshFighters(int refreshType)
+    {
+        var pack = new CB210_tagCSQunyingMatch();
+        pack.IsRefresh = (byte)refreshType;
+        GameNetSystem.Instance.SendInfo(pack);
+
+    }
+    public List<Item> itemInfos = new List<Item>();
+    public int quickCnt;
+    public int tagPlayerID;
+    public void UpdateFBEnd(H0320_tagFBEnd vNetData)
+    {
+        if (vNetData.Msg == null)
+            return;
+        JsonData jsonData = JsonMapper.ToObject(vNetData.Msg);
+        int dataMapID = int.Parse(jsonData["dataMapID"].ToString());
+        if (dataMapID != DataMapID)
+            return;
+        quickCnt = int.Parse(jsonData["quickCnt"].ToString());
+        tagPlayerID = int.Parse(jsonData["tagID"].ToString());
+
+        itemInfos.Clear();
+        if (jsonData["itemInfo"] != null && jsonData["itemInfo"].IsArray)
+        {
+            for (int i = 0; i < jsonData["itemInfo"].Count; i++)
+            {
+                JsonData itemData = jsonData["itemInfo"][i];
+                Item itemInfo = new Item((int)itemData["ItemID"], (long)itemData["Count"]);
+                itemInfos.Add(itemInfo);
+            }
+        }
+        UIManager.Instance.OpenWindow<QYBattleVictoryWin>();
+    }
+
+    //鏄惁鏈懆寮�鍚紝鍛ㄥ嚑寮�鍚�
+    public bool TryGetOpenWeek(out bool isThisWeek, out int weekDay)
+    {
+        weekDay = 0;
+        var openServerDay = TimeUtility.OpenDay + 1;    //浠婂ぉ鏄鍑犱釜寮�鏈嶅ぉ
+        var openFuncDay = FuncOpenLVConfig.Get((int)FuncOpenEnum.Qunying).OpenDay;  //鍔熻兘寮�鍚湪绗嚑涓紑鏈嶅ぉ寮�鏀�
+
+        //鍒ゆ柇鍔熻兘鏄惁宸插紑鍚�
+        if (openServerDay < openFuncDay - 1)
+        {
+            isThisWeek = false;
+            return true;
+        }
+
+        //璁$畻鏈懆鑷劧鍛ㄥ紑濮嬫槸寮�鏈嶅ぉ鑼冨洿
+        //浠婂ぉ鍛ㄥ嚑
+        int theWeekDay = (int)TimeUtility.ServerNow.DayOfWeek == 0 ? 7 : (int)TimeUtility.ServerNow.DayOfWeek;
+        int currentWeekStart = openServerDay - theWeekDay + 1;
+        int currentWeekEnd = currentWeekStart + 6;
+
+        //鍒ゆ柇鍔熻兘寮�鍚ぉ鏄惁鍦ㄥ綋鍓嶅懆鍐�
+        isThisWeek = openFuncDay >= currentWeekStart && openFuncDay <= currentWeekEnd;
+
+        
+        if (isThisWeek)
+        {
+            weekDay = openFuncDay - currentWeekStart + 1;
+        }
+        
+        return true;
+    }
+
 }
 
+public class QunyingMatchInfo
+{
+    public ushort Rank;        //鎺掑悕锛屼粠1寮�濮�
+    public uint PlayerID;        //鐩爣鐜╁ID
+    public string PlayerName;
+    public ushort LV;        // 鐜╁绛夌骇
+    public ushort RealmLV;        //澧冪晫锛屾満鍣ㄤ汉璇诲鐣岃〃鍙栫瓑绾у搴斿鐣�
+    public ulong FightPower;        //鎴樺姏
+    public uint Face;        //鍩烘湰鑴稿瀷
+    public uint FacePic;        //澶村儚妗�
+    public uint TitleID;        //绉板彿
+    public uint ModelMark;        //鍙樺舰妯″瀷mark
+    public uint EquipShowSwitch;        //鍏朵粬澶栬淇℃伅
+    public uint ServerID;
+
+}
+
+
+public class QunyingGameRec
+{
+    public uint Time;        //鎴樻枟鏃堕棿鎴�
+    public uint Value1;        //鏃�
+    public uint Value2;        //鏀诲嚮绫诲瀷 1-鍙戣捣鏀诲嚮鐨勶紝2-琚敾鍑荤殑
+    public uint Value3;        //鐩稿鏀诲嚮绫诲瀷鐨勭洰鏍囩帺瀹禝D
+    public uint Value4;        //鏄惁鑾疯儨 1-鑾疯儨锛�2-澶辫触
+    public uint Value5;        //鐩爣澶村儚
+    public uint Value6;        //鐩爣澶村儚妗�
+    public uint Value7;        //鐩爣瀹樿亴
+    public uint Value8;        //鐩爣绛夌骇
+    public string Name;         //鐩爣鍚嶇О
+    public int CurRank;
+    public int TagRank;
+
+}
diff --git a/Main/System/Settlement/BattleSettlementManager.cs b/Main/System/Settlement/BattleSettlementManager.cs
index 35e7a8f..48faa4b 100644
--- a/Main/System/Settlement/BattleSettlementManager.cs
+++ b/Main/System/Settlement/BattleSettlementManager.cs
@@ -54,6 +54,9 @@
                 WarlordPavilionManager.Instance.isAutoNext = isWin;
                 PopupWindowsProcessor.Instance.Add(isWin ? "WarlordPavilionVictoryWin" : "WarlordPavilionFailWin", false, BattleConst.WarlordPavilionBattleField);
                 break;
+            case BattleConst.QYBattleField:
+                PopupWindowsProcessor.Instance.Add(isWin ? "QYBattleVictoryWin" : "QYBattleFailWin", false, BattleConst.QYBattleField);
+                break;
             default:
                 PopupWindowsProcessor.Instance.Add(isWin ? "BattleVictoryWin" : "BattleFailWin", false, BattleConst.StoryBossBattleField);
                 break;
@@ -103,6 +106,16 @@
             case BattleConst.PriviewBattleField:
                 UIManager.Instance.CloseWindow<PreviewBattleWin>();
                 break;
+            case BattleConst.QYBattleField:
+                if (isWin)
+                {
+                    UIManager.Instance.OpenWindow<QYBattleVictoryWin>();
+                }
+                else
+                {
+                    UIManager.Instance.OpenWindow<QYBattleFailWin>();
+                }
+                break;
             default:
                 if (isWin)
                 {
diff --git a/Main/System/Store/StoreModel.cs b/Main/System/Store/StoreModel.cs
index e782e62..ba391f2 100644
--- a/Main/System/Store/StoreModel.cs
+++ b/Main/System/Store/StoreModel.cs
@@ -583,6 +583,30 @@
         }
         return true;
     }
+
+    // 寮瑰嚭璐拱妗嗭紝涓嶈冻鍒欐彁绀哄凡鍞絼
+    public void ShowBuyItem(int shopID, int tipType = 0)
+    {
+        var cfg = StoreConfig.Get(shopID);
+        if (!TryGetIsSellOut(cfg, out var cnt))
+        {
+            buyShopID = shopID;
+            UIManager.Instance.OpenWindow<BuyItemWin>();
+        }
+        else
+        {
+            if (tipType == 0)
+            {
+                //鍞絼
+                SysNotifyMgr.Instance.ShowTip("StoreTip1");
+            }
+            else if (tipType == 1)
+            {
+                //鐗╁搧涓嶈冻鎻愮ず
+                SysNotifyMgr.Instance.ShowTip("ItemNotEnough", ItemConfig.Get(cfg.ItemID).ItemName);
+            }
+        }
+    }
 }
 
 public enum StoreFunc
diff --git a/Main/System/ViewNPC/ViewNPCManager.cs b/Main/System/ViewNPC/ViewNPCManager.cs
index 4a0e255..0104e29 100644
--- a/Main/System/ViewNPC/ViewNPCManager.cs
+++ b/Main/System/ViewNPC/ViewNPCManager.cs
@@ -67,7 +67,11 @@
             {
                 case BattleConst.ArenaBattleField:
                     int playerId = (int)ArenaManager.Instance.atkPlayerId;
-                    OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerId, 0, (int)ViewPlayerType.viewArenaBattleEnemyHero, (int)BattlePreSetType.Arena);
+                    OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerId, 0, (int)ViewPlayerType.viewPVPBattleEnemyHero, (int)BattlePreSetType.Arena);
+                    break;
+                case BattleConst.QYBattleField:
+                    playerId = (int)QunyingManager.Instance.atkPlayerId;
+                    OtherPlayerDetailManager.Instance.ViewPlayerDetail(playerId, 0, (int)ViewPlayerType.viewPVPBattleEnemyHero, (int)BattlePreSetType.Qunying);
                     break;
             }
             return;
@@ -89,13 +93,13 @@
     {
         switch (viewPlayerType)
         {
-            case (int)ViewPlayerType.viewArenaBattleEnemyHero:
-                ViewArenaBattleEnemyHero(playerID);
+            case (int)ViewPlayerType.viewPVPBattleEnemyHero:
+                ViewPVPBattleEnemyHero(playerID);
                 break;
         }
     }
 
-    private void ViewArenaBattleEnemyHero(int playerID)
+    private void ViewPVPBattleEnemyHero(int playerID)
     {
         int presetID = otherPlayerManager.GetFuncPresetID(playerID, OtherPlayerDetailManager.Instance.viewPreSetType, (int)FuncPresetType.Global);
         var heroList = otherPlayerManager.GetHeroDataSortList(playerID, presetID);
diff --git a/Main/Utility/EnumHelper.cs b/Main/Utility/EnumHelper.cs
index 28ba0f9..455d620 100644
--- a/Main/Utility/EnumHelper.cs
+++ b/Main/Utility/EnumHelper.cs
@@ -1831,5 +1831,5 @@
 {
     viewPlayerData = 0,  //鏌ョ湅鐜╁鍩烘湰淇℃伅锛屽叕鐢ㄦ墦寮�鐣岄潰
     viewGuildLeader = 1,  //鏌ョ湅鐜╁鐨勫叕浼氭棌闀夸俊鎭�
-    viewArenaBattleEnemyHero = 2,  //鏌ョ湅绔炴妧鍦烘垬鏂楁晫鏂硅嫳闆勪俊鎭�
+    viewPVPBattleEnemyHero = 2,  //鏌ョ湅绔炴妧鍦烘垬鏂楁晫鏂硅嫳闆勪俊鎭�
 }

--
Gitblit v1.8.0