From 0d6a2e6d4b9de57a13c2bcb32148e1eb97ef1b1f Mon Sep 17 00:00:00 2001
From: wangguan <wangguan@kt007.com>
Date: Tue, 15 Dec 2020 16:53:34 +0800
Subject: [PATCH] 玩家通关打点位置修改为结算的时候统计

---
 Assets/Scripts/Data/EndlessPortData.cs |  339 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 319 insertions(+), 20 deletions(-)

diff --git a/Assets/Scripts/Data/EndlessPortData.cs b/Assets/Scripts/Data/EndlessPortData.cs
index c218560..fb8d96b 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 无尽模式关卡配置表数据处理类
@@ -15,9 +17,24 @@
         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>
+        /// 掉落概率总权重,即:表中掉落概率那一项全部加起来
+        /// </summary>
+        public float DropTotalWeight;
+
+        /// <summary>
+        /// 关卡等级
+        /// </summary>
+        public int PortLevel;
     }
 
     public class EndlessPortData
@@ -30,10 +47,29 @@
         private static List<EndlessPortConfig> portConfigList;
 
         /// <summary>
+        /// 关卡配置字典
+        /// </summary>
+        private static Dictionary<int, List<EndlessPortConfig>> portDic;
+
+        /// <summary>
+        /// 关卡每波次敌人总血量字典
+        /// </summary>
+        private static Dictionary<int, List<float>> portEnemiesTotalHPDic;
+
+        private static System.Random random;
+
+        /// <summary>
         /// 最大关卡
         /// </summary>
         /// <value></value>
         private static int maxLevel { get; set; }
+
+        /// <summary>
+        /// 新手总关卡数
+        /// </summary>
+        /// <value></value>
+        public static int NewbieTotalLevel { get; private set; }
+
         public static int MaxLevel
         {
             get { return maxLevel; }
@@ -44,35 +80,130 @@
         /// </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();
+            InitPortEnemiesTotalHP();
+        }
+
+        /// <summary>
+        /// 初始化关卡数据
+        /// </summary>
+        public static void InitPortList()
+        {
+            maxLevel = 0;
+            int? preLevel = null;
+            portConfigList.Clear();
+            portDic.Clear();
 
             foreach (endless_port data in endlessPortList)
             {
-                if (data.level > maxLevel)
-                    maxLevel = data.level;
+                if (!GameConfig.IsNewbie && data.level < 0) continue;
+
+                if (preLevel == null || preLevel != data.level)
+                {
+                    preLevel = data.level;
+                    ++maxLevel;
+
+                    if (data.level < 0)
+                        ++NewbieTotalLevel;
+                }
 
                 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;
+
+                for (int i = 0; i < data.drop_rate.Count; ++i)
+                {
+                    totalWeight += data.drop_rate[i];
+                }
+
+                param.DropTotalWeight = (float)data.drop_rate[0] / (float)totalWeight;
                 portConfigList.Add(param);
+
+                if (!portDic.ContainsKey(param.PortLevel))
+                    portDic.Add(param.PortLevel, new List<EndlessPortConfig>());
+
+                portDic[param.PortLevel].Add(param);
             }
         }
 
         /// <summary>
-        /// 根据关卡等级获取boss资源id
+        /// 初始化关卡每波次敌人总血量
         /// </summary>
-        /// <param name="level">关卡等级</param>
-        /// <returns>如果返回-1查找失败</returns>
-        public static int GetResIdByLevel(int level)
+        private static void InitPortEnemiesTotalHP()
         {
-            foreach (endless_port data in endlessPortList)
-            {
-                if (data.level == level)
-                    return data.resource;
-            }
+            portEnemiesTotalHPDic = new Dictionary<int, List<float>>();
 
-            return -1;
+            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>
@@ -83,19 +214,74 @@
         public static List<List<EndlessPortConfig>> GetLevelWaveData(int level)
         {
             List<List<EndlessPortConfig>> ret = new List<List<EndlessPortConfig>>();
+            List<EndlessPortConfig> allLevelData = portDic[level];
+            int wave = 0;
 
-            foreach (EndlessPortConfig data in portConfigList)
+            foreach (EndlessPortConfig data in allLevelData)
             {
-                if (data.Config.level != level || data.Config.amount == 0 || data.Config.tunel != 3)
-                    continue;
+                if (data.Config.amount == 0) continue;
 
-                if (data.Config.wave > ret.Count)
+                if (data.Config.wave != wave)
+                {
                     ret.Add(new List<EndlessPortConfig>());
+                    wave = data.Config.wave;
+                }
 
                 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;
+        }
+
+        /// <summary>
+        /// 根据关卡等级和波次获得该波次的掉落概率
+        /// </summary>
+        /// <param name="level"></param>
+        /// <param name="wave"></param>
+        /// <returns></returns>
+        public static float GetDropRate(int level, int wave)
+        {
+            List<List<EndlessPortConfig>> list = GetLevelWaveData(level);
+            if (list.Count == 0) return 0;
+            Debug.Log($"level:{level}  wave:{wave}");
+            List<EndlessPortConfig> waveData = list[wave];
+
+            EndlessPortConfig tmpConfig = waveData[0];
+            if (tmpConfig != null)
+            {
+                return tmpConfig.DropTotalWeight;
+            }
+            return 0;
+        }
+
+        /// <summary>
+        /// 根据关卡等级和波次获得该波次的掉落BOX
+        /// </summary>
+        /// <param name="level"></param>
+        /// <param name="wave"></param>
+        /// <returns></returns>
+        public static reward GetDropReward(int level, int wave)
+        {
+            List<List<EndlessPortConfig>> list = GetLevelWaveData(level);
+            if (list.Count == 0) return null;
+
+            List<EndlessPortConfig> waveData = list[wave];
+
+            EndlessPortConfig tmpConfig = waveData[0];
+            if (tmpConfig != null)
+            {
+                return tmpConfig.Config.drop;
+            }
+            return null;
         }
 
         /// <summary>
@@ -115,7 +301,120 @@
 
             for (int i = 0; i < waveData.Count; ++i)
             {
-                ret += waveData[i].Config.amount;
+                int count = waveData[i].Config.amount;
+                endless_enemy enemyData = EndlessEnemyData.GetDataById(waveData[i].Config.enemy_id);
+
+                // WTF...
+                if (enemyData.resource == 103)
+                    count *= 2;
+
+                ret += count;
+            }
+
+            return ret;
+        }
+
+        /// <summary>
+        /// 根据关卡等级和波次获得该波次敌人的血量
+        /// </summary>
+        /// <param name="level"></param>
+        /// <param name="wave"></param>
+        /// <param name="tunel">赛道</param>
+        public static float GetWaveEnemiesHP(int level, int wave, int tunel)
+        {
+            List<List<EndlessPortConfig>> list = GetLevelWaveData(level);
+            List<EndlessPortConfig> waveData = list[wave];
+            float hp = 0;
+
+            for (int i = 0; i < waveData.Count; ++i)
+            {
+                if (waveData[i].Config.tunel == tunel)
+                {
+                    hp = waveData[i].Config.b_hp;
+                    break;
+                }
+            }
+
+            return hp;
+        }
+
+        /// <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;
+
+                //     float val = UnityEngine.Random.Range(0, waveData[i].DropTotalWeight);
+
+                //     if (val <= waveData[i].Config.drop_rate[j])
+                //         // 命中
+                //         ret.Add(waveData[i].Config.drop[j]);
+                // }
+            }
+
+            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;
+        }
+
+        /// <summary>
+        /// 根据关卡等级和波次获得该波次可出怪的所有赛道(1~5)
+        /// </summary>
+        /// <param name="level"></param>
+        /// <param name="wave"></param>
+        /// <returns></returns>
+        public static List<int> GetAllTunelByLevelWave(int level, int wave)
+        {
+            List<int> ret = new List<int>();
+            List<List<EndlessPortConfig>> list = GetLevelWaveData(level);
+
+            if (list.Count == 0) return ret;
+
+            List<EndlessPortConfig> waveData = list[wave];
+
+            if (waveData == null)
+            {
+                Debug.LogError($"---- 找不到该波次信息,关卡:{level} 波次索引:{wave} ----");
+                return ret;
+            }
+
+            for (int i = 0; i < waveData.Count; ++i)
+            {
+                ret.Add(waveData[i].Config.tunel);
             }
 
             return ret;

--
Gitblit v1.9.1