From 00451158ba904571b1c6c755f34292dc76e25d80 Mon Sep 17 00:00:00 2001
From: River Jiang <546213258@qq.com>
Date: Wed, 28 Oct 2020 14:47:51 +0800
Subject: [PATCH] 替换新的充能条特效

---
 Assets/Scripts/Data/EndlessPortData.cs |  131 +++++++++++++++++++++++++++++++++++--------
 1 files changed, 107 insertions(+), 24 deletions(-)

diff --git a/Assets/Scripts/Data/EndlessPortData.cs b/Assets/Scripts/Data/EndlessPortData.cs
index c218560..5a18a97 100644
--- a/Assets/Scripts/Data/EndlessPortData.cs
+++ b/Assets/Scripts/Data/EndlessPortData.cs
@@ -1,4 +1,6 @@
 using System.Collections.Generic;
+using System;
+using UnityEngine;
 
 /**
  * endless_port 无尽模式关卡配置表数据处理类
@@ -18,6 +20,16 @@
         /// 预先随机好的敌人数据,spawnAgent时直接取这个数据,不再动态随机
         /// </summary>
         public endless_enemy EnemyData;
+
+        /// <summary>
+        /// 掉落概率总权重,即:表中掉落概率那一项全部加起来
+        /// </summary>
+        public int DropTotalWeight;
+
+        /// <summary>
+        /// 关卡等级
+        /// </summary>
+        public int PortLevel;
     }
 
     public class EndlessPortData
@@ -28,6 +40,13 @@
         private static List<endless_port> endlessPortList;
 
         private static List<EndlessPortConfig> portConfigList;
+
+        /// <summary>
+        /// 关卡配置字典
+        /// </summary>
+        private static Dictionary<int, List<EndlessPortConfig>> portDic;
+
+        private static System.Random random;
 
         /// <summary>
         /// 最大关卡
@@ -44,35 +63,47 @@
         /// </summary>
         public static void Init()
         {
+            random = new System.Random();
             endlessPortList = JsonDataCenter.GetList<endless_port>();
             portConfigList = new List<EndlessPortConfig>();
+            portDic = new Dictionary<int, List<EndlessPortConfig>>();
+            InitPortList(portConfigList, endlessPortList);
+        }
 
-            foreach (endless_port data in endlessPortList)
+        private static void InitPortList(List<EndlessPortConfig> list, List<endless_port> srcList)
+        {
+            maxLevel = 0;
+            int? preLevel = null;
+
+            foreach (endless_port data in srcList)
             {
-                if (data.level > maxLevel)
-                    maxLevel = data.level;
+                if (!GameConfig.IsNewbie && data.level < 0) continue;
+
+                if (preLevel == null || preLevel != data.level)
+                {
+                    preLevel = data.level;
+                    ++maxLevel;
+                }
 
                 EndlessPortConfig param = new EndlessPortConfig();
                 param.Config = data;
                 param.EnemyData = EndlessEnemyData.GetDataById(data.enemy_id);
-                portConfigList.Add(param);
-            }
-        }
+                param.PortLevel = maxLevel;
+                int totalWeight = 0;
 
-        /// <summary>
-        /// 根据关卡等级获取boss资源id
-        /// </summary>
-        /// <param name="level">关卡等级</param>
-        /// <returns>如果返回-1查找失败</returns>
-        public static int GetResIdByLevel(int level)
-        {
-            foreach (endless_port data in endlessPortList)
-            {
-                if (data.level == level)
-                    return data.resource;
-            }
+                for (int i = 0; i < data.drop_rate.Count; ++i)
+                {
+                    totalWeight += data.drop_rate[i];
+                }
 
-            return -1;
+                param.DropTotalWeight = totalWeight;
+                list.Add(param);
+                
+                if (!portDic.ContainsKey(param.PortLevel))
+                    portDic.Add(param.PortLevel, new List<EndlessPortConfig>());
+                
+                portDic[param.PortLevel].Add(param);
+            }
         }
 
         /// <summary>
@@ -84,15 +115,27 @@
         {
             List<List<EndlessPortConfig>> ret = new List<List<EndlessPortConfig>>();
 
-            foreach (EndlessPortConfig data in portConfigList)
+            for (int i = 0; i < 5; ++i)
             {
-                if (data.Config.level != level || data.Config.amount == 0 || data.Config.tunel != 3)
-                    continue;
+                ret.Add(new List<EndlessPortConfig>());
+            }
 
-                if (data.Config.wave > ret.Count)
-                    ret.Add(new List<EndlessPortConfig>());
+            List<EndlessPortConfig> allLevelData = portDic[level];
+
+            foreach (EndlessPortConfig data in allLevelData)
+            {
+                if (data.Config.amount == 0) continue;
 
                 ret[data.Config.wave - 1].Add(data);
+            }
+
+            for (int i = 0; i < ret.Count; ++i)
+            {
+                if (ret[i].Count == 0)
+                {
+                    ret.Remove(ret[i]);
+                    --i;
+                }
             }
 
             return ret;
@@ -120,5 +163,45 @@
 
             return ret;
         }
+
+        /// <summary>
+        /// 根据关卡等级、波次、赛道获得击杀敌人掉落的奖励列表
+        /// </summary>
+        /// <param name="level">关卡等级</param>
+        /// <param name="wave">波次</param>
+        /// <param name="tunel">第几条赛道</param>
+        /// <returns></returns>
+        public static List<reward> GetDropRewardList(int level, int wave, int tunel)
+        {
+            List<reward> ret = new List<reward>();
+            List<List<EndlessPortConfig>> levelData = GetLevelWaveData(level);
+
+            if (levelData.Count == 0)
+                throw new Exception($"当前关卡:{level}, 没有关卡数据");
+
+            List<EndlessPortConfig> waveData = levelData[wave - 1];
+
+            if (waveData.Count == 0)
+                throw new Exception($"当前关卡:{level},当前波次:{wave},没有波次数据");
+
+            for (int i = 0; i < waveData.Count; ++i)
+            {
+                if (waveData[i].Config.tunel != tunel) continue;
+
+                for (int j = 0; j < waveData[i].Config.drop.Count; ++j)
+                {
+                    // 概率为0
+                    if (waveData[i].Config.drop_rate[j] == 0) continue;
+
+                    int val = random.Next(waveData[i].DropTotalWeight);
+
+                    if (val <= waveData[i].Config.drop_rate[j])
+                        // 命中
+                        ret.Add(waveData[i].Config.drop[j]);
+                }
+            }
+
+            return ret;
+        }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.1