From f236bbc6384c1f4b5a16739e4124ab832090ddc3 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期一, 15 十二月 2025 11:21:30 +0800
Subject: [PATCH] 125 战斗 新增死亡触发技能支持

---
 Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs |  117 ++++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 81 insertions(+), 36 deletions(-)

diff --git a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
index b98b95a..8095661 100644
--- a/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
+++ b/Main/System/Battle/BattleField/RecordActions/DeathRecordAction.cs
@@ -1,14 +1,21 @@
 using UnityEngine;
 using System.Collections.Generic;
 using Cysharp.Threading.Tasks;
+using System;
 
 
 //  濡傛灉杩欎釜Action鍗′綇浜� 澶ф鐜囨槸鍥犱负 鍔ㄤ綔琚叾浠栧姩浣滀腑鏂簡 瀵艰嚧娌℃湁鍥炶皟
 public class DeathRecordAction : RecordAction
 {
-    protected List<HB422_tagMCTurnFightObjDead> deadPackList = new List<HB422_tagMCTurnFightObjDead>();
+    protected List<BattleDeadPack> deadPackList = new List<BattleDeadPack>();
 
-    public DeathRecordAction(BattleField _battleField, List<HB422_tagMCTurnFightObjDead> _deadPackList)
+    protected Dictionary<BattleDeadPack, SkillRecordAction> deathActionDict = new Dictionary<BattleDeadPack, SkillRecordAction>();
+
+    protected Dictionary<BattleDeadPack, Func<bool>> deadActionStatesDict = new Dictionary<BattleDeadPack, Func<bool>>();
+
+    protected Dictionary<int, bool> dropStateDict = new Dictionary<int, bool>();
+
+    public DeathRecordAction(BattleField _battleField, List<BattleDeadPack> _deadPackList)
         : base(RecordActionType.Death, _battleField, null)
     {
         deadPackList = _deadPackList;
@@ -17,61 +24,94 @@
 
     public override void Run()
     {
+        //  璇ユ鐨勬甯告
+        //  鏈夋妧鑳界殑鍒欐寜鐓ч『搴忔挱鏀炬浜℃妧鑳� 鍚庡啀姝e父姝�
         if (isFinish)
-        {
             return;
-        }
 
-        base.Run();
 
         if (!isRunOnce)
         {
             isRunOnce = true;
-            bool isLastOne = false;
-            int index = 0;
-            int total = deadPackList.Count;
 
-            bool canFind = true;
-
-            foreach (var deadPack in deadPackList)
+            foreach (var battleDeadPack in deadPackList)
             {
-                BattleObject deadObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.ObjID);
-                if (null != deadObj)
+                if (battleDeadPack.deadTriggerSkill != null)
                 {
-                    if (deadObj.IsDead())
+                    var skillAction = battleDeadPack.deadTriggerSkill.CreateSkillAction();
+                    if (null != skillAction)
                     {
-                        index++;
-                        continue;
+                        deathActionDict.Add(battleDeadPack, skillAction);
                     }
-                    PerformDrop(deadObj);
-                    // Debug.LogError("start death : " + deadObj.ObjID);
-                    deadObj.OnDeath(() =>
-                    {
-                        // Debug.LogError("death callback : " + deadObj.ObjID);
-                        index++;
-
-                        isLastOne = index >= total;
-
-                        if (isLastOne)
-                        {
-                            // UniTaskExtension.DelayTime((GameObject)null, 0.3f / battleField.speedRatio, () =>
-                            // {
-                            isFinish = true;
-                            // });
-                        }
-                    });
                 }
                 else
                 {
-                    canFind = false;
+                    deadActionStatesDict.Add(battleDeadPack, CreateDeadActionState(battleDeadPack));
+                }
+            }
+        }
+        else
+        {
+            List<BattleDeadPack> finishedKeys = new List<BattleDeadPack>();
+            foreach (var kv in deathActionDict)
+            {
+                if (!kv.Key.isPlaySkill)
+                {
+                    // battleField.recordPlayer.ImmediatelyPlay(kv.Value);
+                    kv.Key.isPlaySkill = true;
+                }
+
+                if (!kv.Value.IsFinished())
+                {
+                    kv.Value.Run();
+                }
+                else
+                {
+                    deadActionStatesDict.Add(kv.Key, CreateDeadActionState(kv.Key, true));
+                    finishedKeys.Add(kv.Key);
+                }
+                break;
+            }
+
+            foreach (var key in finishedKeys)
+            {
+                deathActionDict.Remove(key);
+            }
+
+            int completeNum = 0;
+
+            foreach (var kv in deadActionStatesDict)
+            {
+                if (kv.Value())
+                {
+                    completeNum++;
                 }
             }
 
-            if (!canFind)
+            if (completeNum == deadPackList.Count)
             {
                 isFinish = true;
             }
         }
+    }
+
+    private Func<bool> CreateDeadActionState(BattleDeadPack deadPack, bool withoutAnime = false)
+    {
+        BattleObject deadObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.deadPack.ObjID);
+        if (null == deadObj)
+        {
+            return () => true;
+        }
+
+        PerformDrop(deadObj);
+
+        bool isComplete = false;
+
+        deadObj.OnDeath(() => {
+            isComplete = true;
+        }, withoutAnime);
+
+        return () => isComplete;
     }
 
     public override void ForceFinish()
@@ -81,7 +121,7 @@
         //  鐩存帴缁撴潫
         foreach (var deadPack in deadPackList)
         {
-            BattleObject deadObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.ObjID);
+            BattleObject deadObj = battleField.battleObjMgr.GetBattleObject((int)deadPack.deadPack.ObjID);
             if (null != deadObj)
             {
                 PerformDrop(deadObj);
@@ -97,6 +137,11 @@
         //  鍙湁涓荤嚎鎺夎惤鐗╁搧
         if (battleField.MapID == 1 || battleField.MapID == 2)
         {
+            if (dropStateDict.ContainsKey(deadObj.ObjID))
+            {
+                return;
+            }
+            dropStateDict.Add(deadObj.ObjID, true);
             deadObj.PerformDrop();
         }
     }

--
Gitblit v1.8.0