From 18f96c9313bf24d2296e615f44fc0ca005f2e872 Mon Sep 17 00:00:00 2001
From: liuzhiwei <liuzhiwei@qq.com>
Date: Thu, 12 Nov 2020 16:05:44 +0800
Subject: [PATCH] Merge branch 'master' of http://172.16.1.52:8090/r/GemBattle into master

---
 Assets/Scripts/Data/EndlessPortData.cs |  121 +++++++++++++++++++++++++++++++++++++---
 1 files changed, 111 insertions(+), 10 deletions(-)

diff --git a/Assets/Scripts/Data/EndlessPortData.cs b/Assets/Scripts/Data/EndlessPortData.cs
index 6a8c4cf..6d45576 100644
--- a/Assets/Scripts/Data/EndlessPortData.cs
+++ b/Assets/Scripts/Data/EndlessPortData.cs
@@ -17,9 +17,14 @@
         public endless_port Config;
 
         /// <summary>
-        /// 预先随机好的敌人数据,spawnAgent时直接取这个数据,不再动态随机
+        /// 预先随机好的敌人数据,spawnAgent时直接取这个数据,不再动态随机,
+        /// id > 0:获取指定id的小怪,
+        /// id = -1:从类型为1(小怪)随机,
+        /// id = -2:从类型为2(精英怪)随机
+        /// id = -3:从所有小怪中随机
+        /// 当前 id = -1, id = -2, id = -3时,EnemyDataList列表的数量就是敌人数量, id > 0 时因为是指定id所以敌人是重复的,EnemyDataList长度为1
         /// </summary>
-        public endless_enemy EnemyData;
+        public List<endless_enemy> EnemyDataList;
 
         /// <summary>
         /// 掉落概率总权重,即:表中掉落概率那一项全部加起来
@@ -46,6 +51,11 @@
         /// </summary>
         private static Dictionary<int, List<EndlessPortConfig>> portDic;
 
+        /// <summary>
+        /// 关卡每波次敌人总血量字典
+        /// </summary>
+        private static Dictionary<int, List<float>> portEnemiesTotalHPDic;
+
         private static System.Random random;
 
         /// <summary>
@@ -53,6 +63,7 @@
         /// </summary>
         /// <value></value>
         private static int maxLevel { get; set; }
+
         public static int MaxLevel
         {
             get { return maxLevel; }
@@ -68,10 +79,12 @@
             portConfigList = new List<EndlessPortConfig>();
             portDic = new Dictionary<int, List<EndlessPortConfig>>();
             InitPortList();
+            InitPortEnemiesTotalHP();
+            int score = GetLevelScore(1);
         }
 
         /// <summary>
-        /// 更新关卡数据的时候也重新初始化一次
+        /// 初始化关卡数据
         /// </summary>
         public static void InitPortList()
         {
@@ -92,7 +105,18 @@
 
                 EndlessPortConfig param = new EndlessPortConfig();
                 param.Config = data;
-                param.EnemyData = EndlessEnemyData.GetDataById(data.enemy_id);
+                param.EnemyDataList = new List<endless_enemy>();
+
+                if (param.Config.id > 0)
+                    param.EnemyDataList.Add(EndlessEnemyData.GetDataById(data.enemy_id));
+                else
+                {
+                    for (int i = 0; i < data.amount; ++i)
+                    {
+                        param.EnemyDataList.Add(EndlessEnemyData.GetDataById(data.enemy_id));
+                    }
+                }
+
                 param.PortLevel = maxLevel;
                 int totalWeight = 0;
 
@@ -112,6 +136,69 @@
         }
 
         /// <summary>
+        /// 初始化关卡每波次敌人总血量
+        /// </summary>
+        private static void InitPortEnemiesTotalHP()
+        {
+            portEnemiesTotalHPDic = new Dictionary<int, List<float>>();
+
+            for (int i = 1; i <= MaxLevel; ++i)
+            {
+                List<List<EndlessPortConfig>> levelData = GetLevelWaveData(i);
+
+                if (levelData.Count == 0) continue;
+
+                portEnemiesTotalHPDic.Add(i, new List<float>());
+
+                // levelData.Count 就是 i关卡的总波次数
+                for (int j = 0; j < levelData.Count; ++j)
+                {
+                    float total = 0;
+
+                    // levelData[j].Count 是这一波的所有可出怪的赛道数量
+                    for (int k = 0; k < levelData[j].Count; ++k)
+                    {
+                        // > 0,生成的敌人是重复的,直接 × 数量就行
+                        if (levelData[j][k].Config.enemy_id > 0)
+                        {
+                            float add = levelData[j][k].Config.amount * levelData[j][k].Config.b_hp * levelData[j][k].EnemyDataList[0].hp_rate;
+
+                            // 木属性小怪一次性生成两个
+                            if (levelData[j][k].EnemyDataList[0].resource == 103)
+                                total += 2 * add;
+                            else
+                                total += add;
+                        }
+                        else
+                        {
+                            for (int n = 0; n < levelData[j][k].EnemyDataList.Count; ++n)
+                            {
+                                float add = levelData[j][k].Config.b_hp * levelData[j][k].EnemyDataList[n].hp_rate;
+
+                                if (levelData[j][k].EnemyDataList[n].resource == 103)
+                                    total += 2 * add;
+                                else
+                                    total += add;
+                            }
+                        }
+                    }
+
+                    portEnemiesTotalHPDic[i].Add(total);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 根据关卡,波次获得该波次敌人总血量
+        /// </summary>
+        /// <param name="level"></param>
+        /// <param name="wave"></param>
+        public static float GetWaveEnemiesTotalHP(int level, int wave)
+        {
+            return portEnemiesTotalHPDic[level][wave];
+        }
+
+        /// <summary>
         /// 根据关卡等级获取关卡的所有波数据,如果本波次敌人数量为0,直接忽略掉
         /// </summary>
         /// <param name="level">关卡等级</param>
@@ -119,17 +206,18 @@
         public static List<List<EndlessPortConfig>> GetLevelWaveData(int level)
         {
             List<List<EndlessPortConfig>> ret = new List<List<EndlessPortConfig>>();
-
-            for (int i = 0; i < 5; ++i)
-            {
-                ret.Add(new List<EndlessPortConfig>());
-            }
-
             List<EndlessPortConfig> allLevelData = portDic[level];
+            int wave = 0;
 
             foreach (EndlessPortConfig data in allLevelData)
             {
                 if (data.Config.amount == 0) continue;
+
+                if (data.Config.wave != wave)
+                {
+                    ret.Add(new List<EndlessPortConfig>());
+                    wave = data.Config.wave;
+                }
 
                 ret[data.Config.wave - 1].Add(data);
             }
@@ -239,5 +327,18 @@
 
             return ret;
         }
+
+        /// <summary>
+        /// 根据关卡获得关卡奖励分数
+        /// </summary>
+        /// <param name="level"></param>
+        public static int GetLevelScore(int level)
+        {
+            List<List<EndlessPortConfig>> list = GetLevelWaveData(level);
+
+            if (list.Count == 0) return 0;
+
+            return list[0][0].Config.bonus;
+        }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.1