From 803688798a599ed42477b685ecbede746706eea9 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 11 九月 2025 18:42:55 +0800
Subject: [PATCH] Merge branch 'master' of http://mobile.secondworld.net.cn:10010/r/Project_SG_scripts

---
 Main/System/Battle/SkillEffect/NormalSkillEffect.cs                                                |    6 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs        |   92 ++++++++
 Main/System/Battle/BattleManager.cs                                                                |   62 +++++
 Main/System/Battle/BattleField/StoryBossBattleField.cs                                             |  115 +++++++++++
 Main/System/Battle/Motion/MotionBase.cs                                                            |    9 
 Main/System/Battle/RecordPlayer/RecordActionType.cs                                                |    2 
 Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs                                |    3 
 Main/System/Battle/SkillEffect/BulletSkillEffect.cs                                                |   41 +++
 Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs                                  |   40 ++++
 Main/System/Battle/BattleField/BattleField.cs                                                      |    4 
 Main/System/Battle/BattleFieldFactory.cs                                                           |    4 
 Main/System/Battle/RecordPlayer/RecordPlayer.cs                                                    |    2 
 Main/System/Team/TeamHero.State.cs                                                                 |    8 
 Main/System/Battle/BattleField/StoryBossBattleField.cs.meta                                        |   11 +
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs          |    8 
 Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB418_tagSCObjPropertyRefreshView.cs |   10 
 Main/System/Battle/BattleObject/BattleObject.cs                                                    |   75 +++++-
 Main/System/Battle/Skill/SkillBase.cs                                                              |    5 
 Main/System/Battle/BattleField/OperationAgent/RecordModeOperationAgent.cs                          |   16 +
 Main/System/Battle/UIComp/BattleHeroInfoBar.cs                                                     |   33 ++
 Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs.meta                             |   11 +
 Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs                 |    4 
 Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs                                  |    2 
 23 files changed, 498 insertions(+), 65 deletions(-)

diff --git a/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs b/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
index 3d7bc6b..c8b495b 100644
--- a/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
+++ b/Main/Core/NetworkPackage/CustomServerPack/CustomHB426CombinePack.cs
@@ -197,6 +197,9 @@
             HB427_tagSCUseSkill skill = packList[0] as HB427_tagSCUseSkill;
             packList.Remove(skill);
             BattleObject _caster = battleField.battleObjMgr.GetBattleObject((int)skill.ObjID);
+
+            // BattleDebug.LogError("_caster == null : " + (_caster == null) + " skill.ObjID : " + skill.ObjID);
+
             SkillRecordAction skillAction = new SkillRecordAction(battleField, _caster, skill, packList);
             return skillAction;
         }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
index 3b9b2b4..21af3f4 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/H04_Scene/DTC0418_tagObjInfoRefresh.cs
@@ -9,15 +9,15 @@
         base.Done(vNetPack);
         H0418_tagObjInfoRefresh vNetData = vNetPack as H0418_tagObjInfoRefresh;
 
+        // 0 - NPC锛堟灏嗘垨鎬墿锛�
         // 1 - 鐜╁锛堜富鍏級
-        // 2 - NPC锛堟灏嗘垨鎬墿锛�
 
         switch (vNetData.ObjType)
         {
             case 1:
                 Update0418(vNetData);
                 break;
-            case 2:
+            case 0:
                 UpdateBattleField(vNetData);
                 break;
             default:
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB418_tagSCObjPropertyRefreshView.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB418_tagSCObjPropertyRefreshView.cs
index cd37b5c..8f9eab8 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB418_tagSCObjPropertyRefreshView.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB418_tagSCObjPropertyRefreshView.cs
@@ -4,8 +4,16 @@
 // B4 18 瀵硅薄灞炴�у埛鏂板睍绀� #tagSCObjPropertyRefreshView
 
 public class DTCB418_tagSCObjPropertyRefreshView : DtcBasic {
-    public override void Done(GameNetPackBasic vNetPack) {
+    public override void Done(GameNetPackBasic vNetPack)
+    {
         base.Done(vNetPack);
         HB418_tagSCObjPropertyRefreshView vNetData = vNetPack as HB418_tagSCObjPropertyRefreshView;
+        
+        BattleField battleField = BattleManager.Instance.GetBattleField(vNetData.packUID);
+        if (null != battleField)
+        {
+            battleField.ObjPropertyRefreshView(vNetData);
+            battleField.DistributeNextPackage();
+        }
     }
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs
index fabaec0..42d74c0 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB424_tagSCTurnFightInit.cs
@@ -63,5 +63,13 @@
 		BattleField battleField = BattleManager.Instance.CreateBattleField(guid, (int)vNetData.MapID, (int)vNetData.FuncLineID, extendData, redTeamList, blueTeamList);
 		BattleStartAction battleStartAction = new BattleStartAction(battleField);
 		battleField.recordPlayer.PlayRecord(battleStartAction);
+
+		BattleDebug.LogError("鍒涘缓鎴樺満 guid:" + guid + " MapID:" + vNetData.MapID + " FuncLineID:" + vNetData.FuncLineID + "  " + battleField.GetType().ToString());
+
+		BattleWin battleWin = UIManager.Instance.GetUI<BattleWin>();
+		if (null != battleWin)
+		{
+			battleWin.SetBattleField(battleField);
+		}
     }
 }
diff --git a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
index e7d9795..b069477 100644
--- a/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
+++ b/Main/Core/NetworkPackage/DTCFile/ServerPack/HB4_FightDefine/DTCB430_tagSCTurnFightReport.cs
@@ -2,10 +2,12 @@
 using System.Collections;
 using System;
 using System.Text;
+using System.Collections.Generic;
 // B4 30 鏌ョ湅鎴樻姤缁撴灉 #tagSCTurnFightReportRet
 
 
-public class DTCB430_tagSCTurnFightReport : DtcBasic {
+public class DTCB430_tagSCTurnFightReport : DtcBasic
+{
 
     static byte[] vCmdBytes = new byte[2];
 
@@ -24,6 +26,8 @@
             int vLeavingLeng = 0;
             int vBodyLeng = 0;
             int vTotalLeng = vNetData.reportBytes.Length;
+
+            List<GameNetPackBasic> vPackList = new List<GameNetPackBasic>();
 
             while (vReadIndex < vTotalLeng)
             {
@@ -52,10 +56,11 @@
 
                 if (PackageRegedit.Contain(cmd))
                 {
-                    GameNetPackBasic vNetpack = PackageRegedit.TransPack(ServerType.B430, cmd, vPackBytes);
-                    if (vNetpack != null)
+                    GameNetPackBasic npk = PackageRegedit.TransPack(ServerType.B430, cmd, vPackBytes);
+                    if (npk != null)
                     {
-                        BattleManager.Instance.PushPackage(guid, vNetpack);
+                        vPackList.Add(npk);
+                        BattleManager.Instance.PushPackUID(guid, npk.packUID);
                         isRegist = true;
                     }
                 }
@@ -70,10 +75,89 @@
 #endif
                 }
             }
+
+            vPackList = AnalysisPackQueueAndDistribute(guid, vPackList);
+
+            for (int i = 0; i < vPackList.Count; i++)
+            {
+                BattleManager.Instance.PushPackage(guid, vPackList[i]);
+            }
+
+            BattleManager.Instance.DistributeNextReportPackage(guid);
         }
         catch (Exception e)
         {
             Debug.LogErrorFormat("DTCB430_tagSCTurnFightReport 瑙e寘寮傚父锛歿0}", e);
         }
     }
+
+
+    protected List<GameNetPackBasic> AnalysisPackQueueAndDistribute(string guid, List<GameNetPackBasic> vPackList)
+    {
+        // 寤鸿鍓嶇鍋氫竴涓槻鑼冩満鍒讹細褰撹繛缁娆¤姹傚緱鍒扮┖鐨勬垬鏂楃墖娈靛皝鍖呮椂锛堜笉鍖呭惈B425鏍囪鐨勫紑濮嬭窡缁撴潫灏佸寘锛屽嵆寮�濮嬭窡涓棿娌℃湁浠讳綍灏佸寘锛夛紝寮哄埗鑷姩甯帺瀹跺洖鍩庝紤鎭紝
+        // 鍘熷洜鍙兘鍓嶅悗绔暟鎹笉涓�鑷碽ug锛堟瘮濡傛垬閿ゅ彲鑳藉悗绔病鏈変簡锛屽墠绔涓鸿繕鏈夛級鎴栬�� 鍚庣鏈塨ug瀵艰嚧娌℃湁澶勭悊鎴樻枟
+        // 涓洪槻姝㈡寰幆锛屽彲寮哄埗鍥炲煄浼戞伅锛岃鐜╁閲嶆柊鐐瑰嚮鍏冲崱鎴樻枟鎴栨寫鎴榖oss锛�
+        // 姝e父鎯呭喌涓嬪湪鎴橀敜瓒冲鏃剁悊璁轰笂閮藉彲浠ヤ竴鐩村惊鐜埛鎬紝濡傛灉杩炵画澶氭娌℃湁鎴樻枟鐗囨灏佸寘锛屾瘮濡傞檺鍒朵釜杩炵画10娆′互鍐咃紝灏卞彲浠ョ悊瑙d负寮傚父浜�
+
+        const int MaxContinousEmptyCount = 10; // 杩炵画绌哄寘鏈�澶ф鏁�
+
+        List<GameNetPackBasic> packQueueSnapshot = new List<GameNetPackBasic>(vPackList);
+
+        List<GameNetPackBasic> newPackList = new List<GameNetPackBasic>();
+        HashSet<int> skipIndexes = new HashSet<int>();
+
+        // 杩欓噷宸茬粡鏄寜鐓equeue鐨勯『搴忎簡
+        for (int i = 0; i < packQueueSnapshot.Count; i++)
+        {
+            if (skipIndexes.Contains(i)) continue;
+
+            GameNetPackBasic pack = packQueueSnapshot[i];
+
+            // 纰板埌B421 鎴柇 寰�涓嬫敹闆哹421閲岀殑鍏ㄩ儴鍐呭
+            if (pack is HB421_tagMCTurnFightObjAction)
+            {
+                HB421_tagMCTurnFightObjAction b421Pack = pack as HB421_tagMCTurnFightObjAction;
+
+                List<GameNetPackBasic> b421PackList = new List<GameNetPackBasic>();
+                i++;    // 璺宠繃褰撳墠鐨凚421鍖�
+
+                // 鏀堕泦鎵�鏈夐潪B421鍖咃紝鐩村埌閬囧埌涓嬩竴涓狟421鎴栭槦鍒楃粨鏉�
+                for (; i < packQueueSnapshot.Count; i++)
+                {
+                    GameNetPackBasic nextPack = packQueueSnapshot[i];
+                    if (nextPack is HB421_tagMCTurnFightObjAction)
+                    {
+                        i--; // 鍥為��涓�涓綅缃紝鐣欑粰澶栧眰寰幆澶勭悊
+                        break;
+                    }
+                    else
+                    {
+                        b421PackList.Add(nextPack);
+                        skipIndexes.Add(i); // 鏍囪宸茶鍚堝寘
+                    }
+                }
+
+
+
+                // 鍚堝苟鎵�鏈夌浉鍏冲寘
+                CustomB421ActionPack actionPack = CustomB421ActionPack.CreateB421ActionPack(guid, b421PackList);
+
+                newPackList.Add(actionPack);
+            }
+            else
+            {
+                newPackList.Add(pack);
+            }
+        }
+
+
+        List<GameNetPackBasic> returnList = new List<GameNetPackBasic>();
+        for (int i = 0; i < newPackList.Count; i++)
+        {
+            var pack = newPackList[i];
+
+            returnList.Add(pack);
+        }
+        return returnList;
+    }
 }
diff --git a/Main/System/Battle/BattleField/BattleField.cs b/Main/System/Battle/BattleField/BattleField.cs
index a745ff9..3ddafd5 100644
--- a/Main/System/Battle/BattleField/BattleField.cs
+++ b/Main/System/Battle/BattleField/BattleField.cs
@@ -439,13 +439,13 @@
 
             if (winFaction == 1)
             {
-                Debug.LogError("鎴樻枟鑳滃埄");
+                Debug.LogError(guid + " : 鎴樻枟鑳滃埄");
                 //  鎴樻枟鑳滃埄
             }
             else
             {
                 //  鎴樻枟澶辫触
-                Debug.LogError("鎴樻枟澶辫触");
+                Debug.LogError(guid + " : 鎴樻枟澶辫触");
             }
 
             IsBattleFinish = true;
diff --git a/Main/System/Battle/BattleField/OperationAgent/RecordModeOperationAgent.cs b/Main/System/Battle/BattleField/OperationAgent/RecordModeOperationAgent.cs
index 99193c5..86aa598 100644
--- a/Main/System/Battle/BattleField/OperationAgent/RecordModeOperationAgent.cs
+++ b/Main/System/Battle/BattleField/OperationAgent/RecordModeOperationAgent.cs
@@ -17,16 +17,22 @@
 	public override void Run()
 	{
 		base.Run();
+
+		DoNext();
 	}
 
 	public override void DoNext()
 	{
 		base.DoNext();
-	
-		// if (!playing())
-		// 	packs.Dequeue();
-		// 	actions = pack.Distribute();
 
-		// recordPlayer.Play(actions);
+		if (battleField.IsBattleEnd())
+		{
+			return;
+		}
+
+		if (!battleField.recordPlayer.IsPlaying())
+		{
+			battleField.DistributeNextPackage();
+		}
 	}
 }
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs b/Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs
new file mode 100644
index 0000000..7a0c033
--- /dev/null
+++ b/Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs
@@ -0,0 +1,40 @@
+using UnityEngine;
+using System.Collections.Generic;
+
+public class DodgeFinishAction : RecordAction
+{
+	private bool isRun = false;
+
+	public DodgeFinishAction(BattleField _battleField, BattleObject _dodgeObj)
+		: base(RecordActionType.DodgeFinish, _battleField, null)
+	{
+
+	}
+
+	public override bool IsFinished()
+	{
+		return isFinish;
+	}
+
+
+	public override void Run()
+	{
+		base.Run();
+
+		if (isRun)
+			return;
+
+		battleObject.OnDodgeEnd();
+		isFinish = true;
+		isRun = true;
+	}
+
+	public override void ForceFinish()
+	{
+		//姝e父寮�濮嬩箣鍚庡埌鐣岄潰鍑虹幇涔嬪墠閮界偣涓嶄簡 鎵�浠ヨ繖杈逛笉鐢ㄥ己鍒跺畬鎴� 鎺ュ彛鐣欑潃
+
+		base.ForceFinish();
+		// 瀹屾垚灏卞紑濮嬫樉绀篣I
+
+    }
+}
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs.meta b/Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs.meta
new file mode 100644
index 0000000..d22f879
--- /dev/null
+++ b/Main/System/Battle/BattleField/RecordActions/DodgeFinishAction.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7099a0a534efb71459ccf57d9a8bc393
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
index 1608714..e98ab16 100644
--- a/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/SkillRecordAction.cs
@@ -10,6 +10,8 @@
 	public SkillRecordAction(BattleField _battleField, BattleObject _caster, HB427_tagSCUseSkill vNetData, List<GameNetPackBasic> packList)
 		: base(RecordActionType.Skill, _battleField, _caster)
 	{
+		// Debug.LogError("_caster == null : " + (_caster == null));
+
 		skillBase = SkillFactory.CreateSkill(_caster, vNetData, packList, _battleField);
 	}
 
diff --git a/Main/System/Battle/BattleField/StoryBossBattleField.cs b/Main/System/Battle/BattleField/StoryBossBattleField.cs
new file mode 100644
index 0000000..d5f4ea2
--- /dev/null
+++ b/Main/System/Battle/BattleField/StoryBossBattleField.cs
@@ -0,0 +1,115 @@
+using System;
+using LitJson;
+using UnityEngine;
+using System.Collections.Generic;
+
+
+public class StoryBossBattleField : BattleField
+{
+    protected int chapter;//   绔犺妭
+    protected int wave;//  娉㈡暟
+    protected int level;// 鍏冲崱
+    protected JsonData extendData;
+
+    protected MainChapterConfig chapterConfig;
+
+    protected MainLevelConfig levelConfig;
+
+
+    public StoryBossBattleField(string _guid) : base(_guid)
+    {
+        
+    }
+
+    public override void Init(int MapID, int FuncLineID, JsonData _extendData,
+        List<TeamBase> _redTeamList, List<TeamBase> _blueTeamList)
+    {
+        base.Init(MapID, FuncLineID, extendData, _redTeamList, _blueTeamList);
+
+        chapter = FuncLineID / 10000;
+        wave = MapID == 1 ? FuncLineID % 100 : 1;//绗嚑娉㈡��
+        level = (FuncLineID % 10000) / 100;
+
+        extendData = _extendData;
+        chapterConfig = MainChapterConfig.Get(chapter);
+        levelConfig = MainLevelConfig.Get(level);
+
+        SetBattleMode(BattleMode.Record);
+    }
+
+    public override void Release()
+    {
+        base.Release();
+    }
+
+
+    public override void AutoSetBattleMode()
+    {
+        SetBattleMode(BattleMode.Record);
+    }
+
+    public override void TurnFightState(int TurnNum, int State,
+        uint FuncLineID, JsonData extendData)
+    {
+        base.TurnFightState(TurnNum, State, FuncLineID, extendData);
+
+        switch (State)
+        {
+            //  璧峰鐘舵�佹爣璁�
+            case 0:
+                break;
+            case 1://鍑嗗瀹屾瘯
+                break;
+            case 2://鎴樻枟涓�
+                break;
+            case 3://鎴樻枟缁撴潫
+                break;
+            case 4://缁撶畻濂栧姳
+                break;
+            case 5://缁撴潫鐘舵�佹爣璁�
+                break;
+            default:
+                BattleDebug.LogError("recieve a unknown State");
+                break;
+        }
+    }
+
+    protected override void OnSettlement(JsonData turnFightStateData)
+    {
+        base.OnSettlement(turnFightStateData);
+    }
+    
+
+    public override void HaveRest()
+    {
+        //  涓荤嚎BOSS鎴樻枟娌℃湁浼戞伅
+    }
+
+
+    // public override void OnBattleEnd(JsonData turnFightStateData)
+    // {
+    //     base.OnBattleEnd(turnFightStateData);
+    //     // HaveRest();
+    // }
+
+    public override void Run()
+    {
+        if (operationAgent == null)
+        {
+            //闃茶寖寮傚父
+            return;
+        }
+        base.Run();
+    }
+
+    public override void DistributeNextPackage()
+    {
+        if (IsBattleFinish)
+            return;
+            
+        //  涓嶈璋冪敤base鐨勫嚱鏁�
+        BattleManager.Instance.DistributeNextReportPackage(guid);
+    }
+
+
+}
\ No newline at end of file
diff --git a/Main/System/Battle/BattleField/StoryBossBattleField.cs.meta b/Main/System/Battle/BattleField/StoryBossBattleField.cs.meta
new file mode 100644
index 0000000..d795534
--- /dev/null
+++ b/Main/System/Battle/BattleField/StoryBossBattleField.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 15d8291560cdd1449be24332792c7379
+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 e5ef680..9177299 100644
--- a/Main/System/Battle/BattleFieldFactory.cs
+++ b/Main/System/Battle/BattleFieldFactory.cs
@@ -15,9 +15,11 @@
         switch (MapID)
         {
         	case 1:
-        	case 2:
         		battleField = new StoryBattleField();
         		break;
+        	case 2:
+                battleField = new StoryBossBattleField(guid);
+                break;
         	default:
         		break;
         }
diff --git a/Main/System/Battle/BattleManager.cs b/Main/System/Battle/BattleManager.cs
index 89499fe..e801634 100644
--- a/Main/System/Battle/BattleManager.cs
+++ b/Main/System/Battle/BattleManager.cs
@@ -289,6 +289,7 @@
         if (!battleReportDict.TryGetValue(guid, out queue))
         {
             queue = new Queue<GameNetPackBasic>();
+            battleReportDict.Add(guid, queue);
         }
 
         queue.Enqueue(vNetPack);
@@ -301,7 +302,26 @@
             battlePackRelationList.Add(guid, uidList);
         }
 
-        uidList.Add(vNetPack.packUID);
+        if (!uidList.Contains(vNetPack.packUID))
+        {
+            uidList.Add(vNetPack.packUID);
+        }
+    }
+
+    public void PushPackUID(string guid, ulong packUID)
+    {
+        List<ulong> uidList = null;
+
+        if (!battlePackRelationList.TryGetValue(guid, out uidList))
+        {
+            uidList = new List<ulong>();
+            battlePackRelationList.Add(guid, uidList);
+        }
+
+        if (!uidList.Contains(packUID))
+        {
+            uidList.Add(packUID);
+        }
     }
 
     public BattleField GetBattleField(ulong packUID)
@@ -332,6 +352,7 @@
     {
         Queue<GameNetPackBasic> queue = null;
 
+
         if (!battleReportDict.TryGetValue(guid, out queue))
         {
             BattleDebug.LogError("DistributeNextReportPackage could not find queue for guid : " + guid);
@@ -340,7 +361,32 @@
 
         var pack = queue.Dequeue();
 
-        PackageRegedit.Distribute(pack);
+        // Debug.LogError("DistributeNextReportPackage for guid : " + guid + " pack type : " + pack.GetType());
+
+        try
+        {
+            if (pack is CustomHB426CombinePack combinePack)
+            {
+                combinePack.Distribute();
+            }
+            else if (pack is CustomB421ActionPack actionPack)
+            {
+                actionPack.Distribute();
+            }
+            else
+            {
+                PackageRegedit.Distribute(pack);
+            }
+        }
+        catch (Exception ex)
+        {
+            Debug.LogError("DistributeNextPackage: 鍒嗗彂鍖呭紓甯� " + ex);
+            // 鍑洪敊鏃朵富鍔ㄧЩ闄ゅ綋鍓嶅寘锛岄槻姝㈡寰幆
+            if (packQueue.Count > 0)
+            {
+                packQueue.Dequeue();
+            }
+        }
 
         if (queue.Count <= 0)
         {
@@ -397,14 +443,13 @@
             return;
         }
 
-        onBattleFieldDestroy?.Invoke(battleField.guid, battleField);
+        battleField.Release();
 
         string guid = battleField.guid;
 
-        if (battleFields.ContainsKey(guid))
-        {
-            battleFields.Remove(guid);
-        }
+        battleFields.Remove(guid);
+        battleReportDict.Remove(guid);
+        battlePackRelationList.Remove(guid);
 
         if (storyBattleField == battleField)
         {
@@ -412,6 +457,9 @@
         }
 
         GameObject.DestroyImmediate(battleField.battleRootNode.gameObject);
+
+        onBattleFieldDestroy?.Invoke(battleField.guid, battleField);
+
     }
 
 
diff --git a/Main/System/Battle/BattleObject/BattleObject.cs b/Main/System/Battle/BattleObject/BattleObject.cs
index 110afc0..c9766a1 100644
--- a/Main/System/Battle/BattleObject/BattleObject.cs
+++ b/Main/System/Battle/BattleObject/BattleObject.cs
@@ -97,7 +97,8 @@
         var heroInfoBarScale = heroInfoBar.transform.localScale;
         heroInfoBarScale.x *= Camp == BattleCamp.Red ? 1 : -1;
         heroInfoBar.transform.localScale = heroInfoBarScale;
-
+        
+        heroInfoBar.SetActive(true);
     }
 
 
@@ -144,14 +145,39 @@
                 break;
             case PlayerDataType.MaxHP:
                 teamHero.maxHp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
+                heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp);
                 break;
             case PlayerDataType.XP:
                 long toXp = GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
-                heroInfoBar.UpdateHP(teamHero.rage, toXp, 100);
+                heroInfoBar.UpdateXP(teamHero.rage, toXp, 100);
                 teamHero.rage = (int)GeneralDefine.GetFactValue(_refreshInfo.Value, _refreshInfo.ValueEx);
                 break;
             default:
                 Debug.LogError("BattleObject.ObjInfoRefresh 鍑虹幇鎰忓绫诲瀷 " + _refreshInfo.RefreshType.ToString());
+                break;
+        }
+    }
+
+    public void ObjPropertyRefreshView(HB418_tagSCObjPropertyRefreshView vNetData)
+    {
+        switch ((PlayerDataType)vNetData.RefreshType)
+        {
+            case PlayerDataType.HP:
+                long toHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+                heroInfoBar.UpdateHP(teamHero.curHp, toHp, teamHero.maxHp);
+                teamHero.curHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+                break;
+            case PlayerDataType.MaxHP:
+                teamHero.maxHp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+                heroInfoBar.UpdateHP(teamHero.curHp, teamHero.curHp, teamHero.maxHp);
+                break;
+            case PlayerDataType.XP:
+                long toXp = GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+                heroInfoBar.UpdateXP(teamHero.rage, toXp, 100);
+                teamHero.rage = (int)GeneralDefine.GetFactValue(vNetData.Value, vNetData.ValueEx);
+                break;
+            default:
+                Debug.LogError("BattleObject.ObjPropertyRefreshView 鍑虹幇鎰忓绫诲瀷 " + vNetData.RefreshType.ToString());
                 break;
         }
     }
@@ -241,12 +267,10 @@
 
     public virtual void Hurt(List<long> damageValues, long _totalDamage, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig)
     {
-        PopDamage(damageValues, hurt, skillConfig);
+        PopDamage(damageValues, _totalDamage, hurt, skillConfig);
 
         motionBase.PlayAnimation(MotionName.hit, false);
 
-        //  鎵h娴佺粰鍒殑鏁屾柟鍒锋柊濂戒簡
-        teamHero.curHp -= _totalDamage;
     }       
 
     public void SuckHp(uint suckHP, SkillConfig skillConfig)
@@ -264,14 +288,14 @@
     {
         float pingpongTime = 0.2f;
         RectTransform rectTrans = heroRectTrans;
-        var tween = rectTrans.DOAnchorPos(new Vector3(-50, 50, 0), pingpongTime)
+        var tween = rectTrans.DOAnchorPos(new Vector3(-30, 0, 0), pingpongTime)
             .SetEase(Ease.OutCubic);
 
         battleField.battleTweenMgr.OnPlayTween(tween);
     }
 
     //  闂伩缁撴潫
-    public virtual void OnDodgeEnd()
+    public virtual void OnDodgeEnd(Action _complete = null)
     {
         float pingpongTime = 0.2f;
         RectTransform rectTrans = heroRectTrans;
@@ -279,23 +303,28 @@
         var tween = rectTrans.DOAnchorPos(Vector3.zero, pingpongTime)
                             .SetEase(Ease.OutCubic);
 
+        tween.onComplete += () =>
+        {
+            _complete?.Invoke();
+        };
+
         battleField.battleTweenMgr.OnPlayTween(tween);
     }
 
     public virtual void OnDeath(Action _onDeathAnimationComplete)
     {
-        onDeathAnimationComplete = _onDeathAnimationComplete;
-        motionBase.PlayAnimation(MotionName.dead, false);
+        motionBase.PlayAnimation(MotionName.dead, false, () =>
+        {
+            teamHero.isDead = true;
+            OnDeadAnimationComplete();
+            _onDeathAnimationComplete?.Invoke();
+        });
     }
 
+    //  涓嶄竴瀹氬彲闈� 鏈夋椂鍊欎細鎻掑叆鍏朵粬鍔ㄤ綔灏卞畬浜�
     protected virtual void OnAnimationComplete(string motionName)
     {
-        if (motionName == MotionName.dead.ToString().ToLower())
-        {
-            OnDeadAnimationComplete();
-            onDeathAnimationComplete?.Invoke();
-            onDeathAnimationComplete = null;
-        }
+
     }
 
     protected virtual void OnDeadAnimationComplete()
@@ -313,9 +342,19 @@
     }
 
     // 浼ゅ杩樿鐪� 鏄惁闂伩 鏆村嚮 and so on 闇�瑕佹湁涓�涓狣amageType 鏈嶅姟鍣ㄥ簲璇ヤ細缁�
-    protected virtual void PopDamage(List<long> damageValues, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig)
+    protected virtual void PopDamage(List<long> damageValues, long _totalDamage, HB427_tagSCUseSkill.tagSCUseSkillHurt hurt, SkillConfig skillConfig)
     {
         BattleDmgInfo battleDmgInfo = new BattleDmgInfo(battleField.guid, damageValues, this, hurt, skillConfig);
+
+        if (battleDmgInfo.IsType(DamageType.Dodge))
+        {
+            OnDodgeBegin();
+            DodgeFinishAction dodgeFinish = new DodgeFinishAction(battleField, this);
+            battleField.recordPlayer.InsertRecord(dodgeFinish);
+        }
+
+        heroInfoBar.UpdateHP(teamHero.curHp, Math.Max(0, teamHero.curHp - _totalDamage), teamHero.maxHp);
+        teamHero.curHp = Math.Max(0, teamHero.curHp - _totalDamage);
 
         // YYL TODO 鏄惁闇�瑕佹寕鍦ㄥ湪鑷韩鐨刦ollow鐐逛笂
         EventBroadcast.Instance.Broadcast(EventName.BATTLE_DAMAGE_TAKEN, battleDmgInfo);
@@ -342,8 +381,10 @@
         //  浼戞伅鐘舵��
         //  澶氫竴涓獄zz鐨勪竴涓壒鏁�
         heroGo.SetActive(true);
-        motionBase.PlayAnimation(MotionName.idle, true);
+        motionBase.HaveRest();
         heroRectTrans.anchoredPosition = Vector2.zero;
+
+        heroInfoBar.SetActive(false);
     }
 
     public void PushDropItems(BattleDrops _battleDrops)
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 41a1931..3f81ccf 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -83,6 +83,7 @@
     
     public virtual void Release()
     {
+        trackEntryCompleteDict.Clear();
         if (spineAnimationState != null)
         {
             spineAnimationState.Complete -= OnAnimationComplete;
@@ -348,6 +349,12 @@
         skeletonGraphic.timeScale = MotionTimeScale;
     }
 
+    public void HaveRest()
+    {
+        trackEntryCompleteDict.Clear();
+        PlayAnimation(MotionName.idle, true);
+    }
+
     #endregion
-    
+
 }
\ No newline at end of file
diff --git a/Main/System/Battle/RecordPlayer/RecordActionType.cs b/Main/System/Battle/RecordPlayer/RecordActionType.cs
index 3cb84d7..a2ee241 100644
--- a/Main/System/Battle/RecordPlayer/RecordActionType.cs
+++ b/Main/System/Battle/RecordPlayer/RecordActionType.cs
@@ -8,4 +8,6 @@
     BuffMount,//鎸傝浇澧炵泭
 
     BattleStart,//鎴樻枟寮�濮�
+
+    DodgeFinish,//闂伩瀹屾垚
 }
diff --git a/Main/System/Battle/RecordPlayer/RecordPlayer.cs b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
index 8f2ae83..769415f 100644
--- a/Main/System/Battle/RecordPlayer/RecordPlayer.cs
+++ b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -13,7 +13,7 @@
 
     private bool isWaitingNextAction = false;
     private float waitTimer = 0f;
-    private const float waitInterval = 0.2f;
+    private const float waitInterval = 0f;
 
     public void Init(BattleField _battleField)
     {
diff --git a/Main/System/Battle/Skill/SkillBase.cs b/Main/System/Battle/Skill/SkillBase.cs
index 474444e..f5a834c 100644
--- a/Main/System/Battle/Skill/SkillBase.cs
+++ b/Main/System/Battle/Skill/SkillBase.cs
@@ -120,8 +120,8 @@
 				DashCast(OnAttackFinish);
 				break;
 			default:
-				Debug.LogError("鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
-				OnSkillFinished();
+				Debug.LogError("寮哄埗缁撴潫鎶�鑳� 鏆傛椂涓嶆敮鎸佸叾浠栫殑鏂瑰紡閲婃斁 鏈夐渶姹傝鑱旂郴绛栧垝 鎶�鑳絠d:" + skillConfig.SkillID + " cast position " + skillConfig.CastPosition);
+				ForceFinished();
 				break;
 		}
 
@@ -131,6 +131,7 @@
 	protected void DashCast(Action _onComplete)
 	{
 		Debug.LogError("DashCast 杩樻病瀹炵幇");
+		ForceFinished();
 		//	YYL TODO
 
 		// var entry = caster.motionBase.PlayAnimation(skillConfig.GetMotionName(), false);
diff --git a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
index 612bc47..db0c383 100644
--- a/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/BulletSkillEffect.cs
@@ -66,6 +66,10 @@
                     case 5:
                         SelfShoting();
                         break;
+                    default:
+                        Debug.LogError("瀛愬脊鐗规晥娌℃湁閰嶇疆姝g‘鐨凾agAim锛屽己鍒剁粨鏉熷瓙寮圭壒鏁� TagAim: " + skillConfig.TagAim);
+                        ForceFinished();
+                        break;
                 }
             }
         }
@@ -176,8 +180,8 @@
 
             BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
             //  棣栧厛鏄洰鏍囪韩涓婄垎鐐�
-            PlayExplosionEffect(skillConfig.ExplosionEffectId, targetTransform, battleCamp);
-            PlayExplosionEffect(skillConfig.ExplosionEffect2, targetTransform, battleCamp);
+            PlayExplosionEffect(skillConfig.ExplosionEffectId, targetTransform, caster.Camp);
+            PlayExplosionEffect(skillConfig.ExplosionEffect2, targetTransform, caster.Camp);
 
             foreach (var hurt in hitList)
             {
@@ -188,7 +192,7 @@
                     continue;
                 }
 
-                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, targetObj.Camp);
+                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, caster.Camp);
             }
 
             // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
@@ -253,8 +257,31 @@
     private void VerticalRowShoting()
     {
         // 绾垫帓鍒嗗埆涓�1銆�4锛�2銆�5锛�3銆�6锛屼笁缁勭旱鎺掞紝鎸夊浣嶈鍒欓�夋嫨锛岄粯璁�1鍙枫��2鍙锋垨3鍙蜂负涓荤洰鏍囷紝鍓嶆帓1銆�2銆�3鍙蜂綅缃叏閮ㄦ瀹屽悗锛�4鍙枫��5鍙锋垨6鍙蜂负涓荤洰鏍�
+        BattleCamp battleCamp = skillConfig.TagFriendly != 0 ? caster.Camp : caster.GetEnemyCamp();
+        //  鏀诲嚮mininumIndex鐩爣
+        int minimumIndex = int.MaxValue;
+        foreach (var hurt in tagUseSkillAttack.HurtList)
+        {
+            BattleObject target = caster.battleField.battleObjMgr.GetBattleObject((int)hurt.ObjID);
+            if (target == null)
+            {
+                Debug.LogError("鐗规晥鐩爣涓虹┖ target == null ObjId : " + hurt.ObjID);
+                continue;
+            }
 
-        ShotEachTargets();
+            minimumIndex = Mathf.Min(target.teamHero.positionNum, minimumIndex);
+        }
+
+        if (minimumIndex != int.MaxValue)
+        {
+            ShotToIndex(battleCamp, minimumIndex);
+        }
+        else
+        {
+            Debug.LogError("绾垫帓鏀诲嚮娌℃湁鐩爣 寮哄埗缁撴潫瀛愬脊鐗规晥");
+            ForceFinished();
+        }
+
 
     }
 
@@ -284,9 +311,9 @@
                     continue;
                 }
 
-                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, targetObj.Camp);
-                PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.heroGo.transform, targetObj.Camp);
-                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, targetObj.Camp);
+                PlayExplosionEffect(skillConfig.ExplosionEffectId, targetObj.heroGo.transform, caster.Camp);
+                PlayExplosionEffect(skillConfig.ExplosionEffect2, targetObj.heroGo.transform, caster.Camp);
+                PlayExplosionEffect(skillConfig.ExplosionEffect3, targetObj.heroGo.transform, caster.Camp);
             }
 
             // 琛ㄧ幇瀛愬脊椋炶鍒扮洰鏍囦綅缃�
diff --git a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
index b185387..0fa8e87 100644
--- a/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
+++ b/Main/System/Battle/SkillEffect/NormalSkillEffect.cs
@@ -29,12 +29,12 @@
 
         if (skillConfig.ExplosionEffectId > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(0, skillConfig.ExplosionEffectId, targetTransform, battleCamp);
+            caster.battleField.battleEffectMgr.PlayEffect(0, skillConfig.ExplosionEffectId, targetTransform, caster.Camp);
         }
 
         if (skillConfig.ExplosionEffect2 > 0)
         {
-            caster.battleField.battleEffectMgr.PlayEffect(0, skillConfig.ExplosionEffect2, targetTransform, battleCamp);
+            caster.battleField.battleEffectMgr.PlayEffect(0, skillConfig.ExplosionEffect2, targetTransform, caster.Camp);
         }
 
         for (int i = 0; i < tagUseSkillAttack.HurtList.Length; i++)
@@ -49,7 +49,7 @@
 
             if (skillConfig.ExplosionEffect3 > 0)
             {
-                caster.battleField.battleEffectMgr.PlayEffect(target.ObjID, skillConfig.ExplosionEffect3, target.heroGo.transform, target.Camp);
+                caster.battleField.battleEffectMgr.PlayEffect(target.ObjID, skillConfig.ExplosionEffect3, target.heroGo.transform, caster.Camp);
             }
         }
 
diff --git a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
index f1a37a6..fe46ec2 100644
--- a/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
+++ b/Main/System/Battle/UIComp/BattleHeroInfoBar.cs
@@ -23,7 +23,7 @@
     protected List<string> messages = new List<string>();
 
     public BasicHeroInfoContainer heroInfoContainer;
-
+ 
     public BattleTips textTips;
 
     protected Tween hpTween;
@@ -41,6 +41,8 @@
         battleObject = _battleObject;
         heroInfoContainer.SetHeroInfo(battleObject.teamHero);
         RefreshBuff(buffList);
+        UpdateHP(battleObject.teamHero.curHp, battleObject.teamHero.curHp, battleObject.teamHero.maxHp, false);
+        UpdateXP(battleObject.teamHero.rage, battleObject.teamHero.rage, 100, false);
     }
 
     public void RefreshBuff(List<HB428_tagSCBuffRefresh> datas)
@@ -114,7 +116,7 @@
     }
 
 
-    public void UpdateHP(long fromHp, long toHp, long maxHp)
+    public void UpdateHP(long fromHp, long toHp, long maxHp,  bool tween = true)
     {
         //  鍋歨p澧炲姞鎴栬�呭噺灏戠殑鍔ㄧ敾
         // sliderHp.value = ((float)fromHp) / ((float)maxHp);
@@ -122,13 +124,21 @@
         {
             battleObject.battleField.battleTweenMgr.OnKillTween(hpTween);
         }
-        hpTween = sliderHp.DOValue((float)toHp / maxHp, 0.3f);
-        battleObject.battleField.battleTweenMgr.OnPlayTween(hpTween);
+
+        if (tween)
+        {
+            hpTween = sliderHp.DOValue((float)toHp / (float)maxHp, 0.3f);
+            battleObject.battleField.battleTweenMgr.OnPlayTween(hpTween);
+        }
+        else
+        {
+            sliderHp.value = ((float)toHp) / ((float)maxHp);
+        }
 
         BattleDebug.LogError("update hp from " + fromHp + " to " + toHp + " maxHp " + maxHp);
     }
 
-    public void UpdateXP(long fromXp, long toXp, long maxXp)
+    public void UpdateXP(long fromXp, long toXp, long maxXp, bool tween = true)
     {
         //  鍋歑p澧炲姞鎴栬�呭噺灏戠殑鍔ㄧ敾
         // sliderXp.value = ((float)fromXp) / ((float)maxXp);
@@ -136,8 +146,17 @@
         {
             battleObject.battleField.battleTweenMgr.OnKillTween(xpTween);
         }
-        xpTween = sliderHp.DOValue((float)toXp / maxXp, 0.2f);
-        battleObject.battleField.battleTweenMgr.OnPlayTween(xpTween);
+
+        if (tween)
+        {
+            xpTween = sliderXp.DOValue((float)toXp / (float)maxXp, 0.2f);
+            battleObject.battleField.battleTweenMgr.OnPlayTween(xpTween);
+        }
+        else
+        {
+            sliderXp.value = ((float)toXp) / ((float)maxXp);
+        }
+
         BattleDebug.LogError("update xp from " + fromXp + " to " + toXp + " maxXp " + maxXp);
     }
 
diff --git a/Main/System/Team/TeamHero.State.cs b/Main/System/Team/TeamHero.State.cs
index 17d64d6..7bd110c 100644
--- a/Main/System/Team/TeamHero.State.cs
+++ b/Main/System/Team/TeamHero.State.cs
@@ -24,10 +24,8 @@
 
 	public bool isDead
 	{
-		get
-		{
-			return curHp <= 0;
-		}
-	}
+		get;
+		set;
+	} = false;
 
 }
\ No newline at end of file

--
Gitblit v1.8.0