From 09bc892c7283df8757a07b646d5af21ddaa263d1 Mon Sep 17 00:00:00 2001
From: lcy <1459594991@qq.com>
Date: 星期四, 06 十一月 2025 18:22:34 +0800
Subject: [PATCH] 164 天子的考验-客户端

---
 Main/System/Battle/RecordPlayer/RecordPlayer.cs |  123 +++++++++++++++++++++++++++++++++++++++-
 1 files changed, 119 insertions(+), 4 deletions(-)

diff --git a/Main/System/Battle/RecordPlayer/RecordPlayer.cs b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
index d25115e..1281256 100644
--- a/Main/System/Battle/RecordPlayer/RecordPlayer.cs
+++ b/Main/System/Battle/RecordPlayer/RecordPlayer.cs
@@ -9,23 +9,37 @@
     private Queue<RecordAction> recordActionQueue = new Queue<RecordAction>();
     protected RecordAction currentRecordAction;
 
+    protected List<RecordAction> immediatelyActionList = new List<RecordAction>();
+
     private bool isWaitingNextAction = false;
     private float waitTimer = 0f;
     private const float waitInterval = 0.2f;
 
+    private float speedRatio = 1.5f;
+
+    private bool isForceFinish = false;
+
     public void Init(BattleField _battleField)
     {
+        Release();
         battleField = _battleField;
     }
 
     public bool IsPlaying()
     {
-        return currentRecordAction != null || recordActionQueue.Count > 0;
+        bool isPlaying = currentRecordAction != null || recordActionQueue.Count > 0 || immediatelyActionList.Count > 0;
+        //BattleDebug.LogError("IsPlaying " + isPlaying + " currentRecordAction " + (currentRecordAction != null) + " recordActionQueue.Count " + recordActionQueue.Count + " immediatelyActionList.Count " + immediatelyActionList.Count);
+        return isPlaying;
     }
 
     public void PlayRecord(RecordAction recordAction)
     {
         BattleDebug.LogError("Enqueue record action " + recordAction.GetType());
+        if (isForceFinish)
+        {
+            recordAction.ForceFinish();
+            return;
+        }
         recordActionQueue.Enqueue(recordAction);
     }
 
@@ -37,12 +51,77 @@
         }
     }
 
+    public void InsertRecord(RecordAction recordAction)
+    {
+        if (isForceFinish)
+        {
+            recordAction.ForceFinish();
+            return;
+        }
+
+        BattleDebug.LogError("Insert record action " + recordAction.GetType());
+        if (currentRecordAction != null)
+        {
+            Queue<RecordAction> tempQueue = new Queue<RecordAction>();
+            tempQueue.Enqueue(recordAction);
+            while (recordActionQueue.Count > 0)
+            {
+                tempQueue.Enqueue(recordActionQueue.Dequeue());
+            }
+            recordActionQueue = tempQueue;
+        }
+        else
+        {
+            recordActionQueue.Enqueue(recordAction);
+        }
+    }
+
+    public void ImmediatelyPlay(RecordAction recordAction)
+    {
+        if (isForceFinish)
+        {
+            recordAction.ForceFinish();
+            return;
+        }
+        immediatelyActionList.Add(recordAction);
+    }
+
+    protected void ImmediatelyPlayRun()
+    {
+        if (immediatelyActionList.Count > 0)
+        {
+            List<int> removeIndexList = new List<int>();
+
+            for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
+            {
+                var action = immediatelyActionList[i];
+                if (!action.IsFinished())
+                {
+                    action.Run();
+                    continue;
+                }
+
+                removeIndexList.Add(i);
+            }
+
+            for (int i = removeIndexList.Count - 1; i >= 0; i--)
+            {
+                int index = removeIndexList[i];
+                if (index < 0 || index >= immediatelyActionList.Count)
+                    continue;
+                immediatelyActionList.RemoveAt(index);
+            }
+        }
+    }
+
     public virtual void Run()
     {
+        ImmediatelyPlayRun();
+
         // 绛夊緟涓嬩竴涓猘ction
         if (isWaitingNextAction)
         {
-            waitTimer += Time.deltaTime;
+            waitTimer += Time.deltaTime * speedRatio;
             if (waitTimer >= waitInterval)
             {
                 isWaitingNextAction = false;
@@ -70,10 +149,12 @@
 
         if (currentRecordAction != null && currentRecordAction.IsFinished())
         {
+            var guid = currentRecordAction.GetBattleFieldGuid();
             BattleDebug.LogError("record action " + currentRecordAction.GetType() + " play finished");
             currentRecordAction = null;
             isWaitingNextAction = true;
             waitTimer = 0f;
+            EventBroadcast.Instance.Broadcast<string>(EventName.RECORDPLAYER_END, guid);
             return;
         }
 
@@ -98,15 +179,49 @@
 
     }
 
+
     public void HaveRest()
     {
-        currentRecordAction = null;
-        recordActionQueue.Clear();
+        ForceFinish();
+    }
+
+    public void ForceFinish()
+    {
+        isForceFinish = true;
+        for (int i = immediatelyActionList.Count - 1; i >= 0; i--)
+        {
+            var action = immediatelyActionList[i];
+            action.ForceFinish();
+            immediatelyActionList.Remove(action);
+        }
+
+        while (currentRecordAction != null)
+        {
+            var temp = currentRecordAction;
+            currentRecordAction = null;
+            temp.ForceFinish();
+        }
+
+        while (recordActionQueue.Count > 0)
+        {
+            recordActionQueue.Dequeue().ForceFinish();
+        }
     }
 
     public void Release()
     {
+        if (null != currentRecordAction)
+        {
+            currentRecordAction.ForceFinish();
+        }
         currentRecordAction = null;
         recordActionQueue.Clear();
+        immediatelyActionList.Clear();
+        isForceFinish = false;
+    }
+
+    public void SetSpeedRatio(float ratio)
+    {
+        speedRatio = ratio;
     }
 }
\ No newline at end of file

--
Gitblit v1.8.0