wangguan
2020-11-26 9af945552ac077706c175c00ad99dc4dfc662e9d
Assets/Scripts/Data/EndlessPortData.cs
@@ -17,14 +17,19 @@
        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 int DropTotalWeight;
        public float DropTotalWeight;
        /// <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; }
@@ -67,15 +78,21 @@
            endlessPortList = JsonDataCenter.GetList<endless_port>();
            portConfigList = new List<EndlessPortConfig>();
            portDic = new Dictionary<int, List<EndlessPortConfig>>();
            InitPortList(portConfigList, endlessPortList);
            InitPortList();
            InitPortEnemiesTotalHP();
        }
        private static void InitPortList(List<EndlessPortConfig> list, List<endless_port> srcList)
        /// <summary>
        /// 初始化关卡数据
        /// </summary>
        public static void InitPortList()
        {
            maxLevel = 0;
            int? preLevel = null;
            portConfigList.Clear();
            portDic.Clear();
            foreach (endless_port data in srcList)
            foreach (endless_port data in endlessPortList)
            {
                if (!GameConfig.IsNewbie && data.level < 0) continue;
@@ -87,7 +104,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;
@@ -96,14 +124,77 @@
                    totalWeight += data.drop_rate[i];
                }
                param.DropTotalWeight = totalWeight;
                list.Add(param);
                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>
        /// 初始化关卡每波次敌人总血量
        /// </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>
@@ -114,17 +205,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);
            }
@@ -139,6 +231,48 @@
            }
            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>
@@ -158,10 +292,41 @@
            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>
@@ -188,20 +353,33 @@
            {
                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;
                // 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);
                //     float val = UnityEngine.Random.Range(0, waveData[i].DropTotalWeight);
                    if (val <= waveData[i].Config.drop_rate[j])
                        // 命中
                        ret.Add(waveData[i].Config.drop[j]);
                }
                //     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;
        }
    }
}