chenxin
2020-10-27 38136a34de9aa36bf15ec7471abd56e2cba6c26f
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>
@@ -89,9 +120,11 @@
                ret.Add(new List<EndlessPortConfig>());
            }
            foreach (EndlessPortConfig data in portConfigList)
            List<EndlessPortConfig> allLevelData = portDic[level];
            foreach (EndlessPortConfig data in allLevelData)
            {
                if (data.Config.level != level || data.Config.amount == 0) continue;
                if (data.Config.amount == 0) continue;
                ret[data.Config.wave - 1].Add(data);
            }
@@ -130,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;
        }
    }
}