From bf95bda39d99eac1d8fc1ec4c8a987586a99e422 Mon Sep 17 00:00:00 2001
From: liuzhiwei <liuzhiwei@qq.com>
Date: Tue, 08 Dec 2020 14:50:14 +0800
Subject: [PATCH] 火精灵攻击特效

---
 Assets/Scripts/TowerDefense/Level/EndlessWave.cs |  107 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 84 insertions(+), 23 deletions(-)

diff --git a/Assets/Scripts/TowerDefense/Level/EndlessWave.cs b/Assets/Scripts/TowerDefense/Level/EndlessWave.cs
index e1d73ae..098d330 100644
--- a/Assets/Scripts/TowerDefense/Level/EndlessWave.cs
+++ b/Assets/Scripts/TowerDefense/Level/EndlessWave.cs
@@ -1,10 +1,12 @@
-using System;
+using UnityEngine;
+using System;
 using System.Collections.Generic;
 using Core.Utilities;
 using KTGMGemClient;
 using TowerDefense.Agents;
 using TowerDefense.Agents.Data;
 using TowerDefense.Nodes;
+using TowerDefense.UI.HUD;
 
 namespace TowerDefense.Level
 {
@@ -49,11 +51,6 @@
         /// 有新的敌人生成
         /// </summary>
         public event Action SpawnNewAgent;
-
-        /// <summary>
-        /// 波次发生改变
-        /// </summary>
-        public event Action WaveChanged;
 
         /// <summary>
         /// 怪出生开始节点
@@ -107,21 +104,32 @@
         public void PauseWave()
         {
             PauseTimer(spawnTimer);
-            isWaveStoped = true;
         }
 
         public void RestartWave()
         {
-            StartTimer(spawnTimer);
-            isWaveStoped = false;
+            if (spawnTimer != null)
+                StartTimer(spawnTimer);
         }
 
-        /// <summary>
-        /// Handles spawning the current agent and sets up the next agent for spawning
-        /// 在场景内孵化出来一个Boss,这个核心函数最后被规则性的数据接管
-        /// </summary>
         protected virtual void SpawnCurrent()
         {
+            if (EndlessGameUI.instance.state == EndlessGameUI.State.GameOver)
+            {
+                StopWave();
+                // 让所有兵线上已经生成的所有agent播放一个死亡动画然后销毁
+                WaveLineAgentInsMgr[] waveLineAgentIns = AgentInsManager.instance.GetWaveLineList();
+
+                for (int i = 0; i < waveLineAgentIns.Length; ++i)
+                {
+                    while (waveLineAgentIns[i].listAgent.Count > 0)
+                    {
+                        waveLineAgentIns[i].listAgent[0].PlayDeath();
+                    }
+                }
+                return;
+            }
+
             if (isWaveStoped) return;
 
             if (!TrySetupNextSpawn())
@@ -133,8 +141,15 @@
             else
             {
                 ++spawnedEnemies;
+
                 if (SpawnNewAgent != null)
                     SpawnNewAgent();
+
+                if (spawnedEnemies >= waveData.Config.amount)
+                {
+                    StopWave();
+                    SafelyBroadcastWaveCompletedEvent();
+                }
             }
         }
 
@@ -142,31 +157,77 @@
         /// 生成agent
         /// </summary>
         /// <returns>Agent</returns>
-        protected virtual Agent SpawnAgent()
+        protected virtual void SpawnAgent()
         {
-            int index = GetIndexByResId(waveData.EnemyData.resource);
+            endless_enemy enemyData = waveData.EnemyDataList[waveData.Config.enemy_id > 0 ? 0 : spawnedEnemies];
 
-            Poolable agentPoolable = Poolable.TryGetPoolable<Poolable>(AgentConfigurationList[index].agentPrefab.gameObject);
-            Agent newAgent = agentPoolable.GetComponent<Agent>();
+            int index = GetIndexByResId(enemyData.resource);
 
+            // 木属性小怪需要同时生成两个,先这么写吧(WTF)
+            bool isDouble = enemyData.resource == 103;
+            GameObject prefab = Resources.Load<GameObject>($"Prefabs/Enemies/{enemyData.resource}");
+            GameObject obj = Instantiate(prefab);
+            Agent newAgent = obj.GetComponent<Agent>();
+            newAgent.EnemyData = enemyData;
             newAgent.transform.position = StartingNode.transform.position;
+
+            if (isDouble)
+            {
+                Vector3 pos = newAgent.transform.position;
+                pos.x -= 2f;
+                newAgent.transform.position = pos;
+            }
+
             newAgent.transform.rotation = StartingNode.transform.rotation;
             newAgent.SetNode(StartingNode, WaveLineId - 1);
             newAgent.opponentAgent = false;
             newAgent.Initialize();
 
             // 最终血量 = 基础血量 * 血量增幅,速度和金币都是一个公式
-            float hp = waveData.Config.b_hp * waveData.EnemyData.hp_rate;
-            float speed = waveData.Config.b_speed * waveData.EnemyData.speed_rate;
-            int gold = waveData.Config.b_coin * waveData.EnemyData.coin_rate;
+            float hp = waveData.Config.b_hp * enemyData.hp_rate;
+            float speed = waveData.Config.b_speed * enemyData.speed_rate;
+            int gold = waveData.Config.b_coin * enemyData.coin_rate;
 
             newAgent.SetAgentData(hp, speed, gold);
-            // todo 这里先填1级后面需要修改
-            newAgent.healthBar.SetHealthLevel(1);
             // 加入Manager统一管理.
             AgentInsManager.instance.addAgent(newAgent);
 
-            return newAgent;
+            if (isDouble)
+            {
+                obj = Instantiate(prefab);
+                Agent doubleAgent = obj.GetComponent<Agent>();
+                doubleAgent.EnemyData = enemyData;
+                doubleAgent.transform.position = StartingNode.transform.position;
+
+                Vector3 pos = doubleAgent.transform.position;
+                pos.x += 2f;
+                doubleAgent.transform.position = pos;
+
+                doubleAgent.transform.rotation = StartingNode.transform.rotation;
+                doubleAgent.SetNode(StartingNode, WaveLineId - 1);
+                doubleAgent.opponentAgent = false;
+                doubleAgent.Initialize();
+
+                doubleAgent.SetAgentData(hp, speed, gold);
+                AgentInsManager.instance.addAgent(doubleAgent);
+            }
+        }
+
+        /// <summary>
+        /// 从Tower的AttributeId获取到怪物的数据
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        protected List<int> GetMonsterDataFromAttributeId(int id)
+        {
+            geminfo tgem = new geminfo();
+            if (JsonDataCenter.gemInfoDic.TryGetValue(id, out tgem))
+                return tgem.summon;
+            else
+            {
+                Debug.Log("找不到对应ID的Gem:" + id);
+                return null;
+            }
         }
 
         /// <summary>

--
Gitblit v1.9.1