using System.Collections.Generic; using System; using UnityEngine; /** * endless_port 无尽模式关卡配置表数据处理类 * @Author: chenxin * @Date: 2020-10-10 17:11:23 */ namespace KTGMGemClient { public class EndlessPortConfig { /// /// 配置表数据 /// public endless_port Config; /// /// 预先随机好的敌人数据,spawnAgent时直接取这个数据,不再动态随机 /// public endless_enemy EnemyData; /// /// 掉落概率总权重,即:表中掉落概率那一项全部加起来 /// public int DropTotalWeight; /// /// 关卡等级 /// public int PortLevel; } public class EndlessPortData { /// /// 无尽模式关卡配置表 /// private static List endlessPortList; private static List portConfigList; /// /// 关卡配置字典 /// private static Dictionary> portDic; private static System.Random random; /// /// 最大关卡 /// /// private static int maxLevel { get; set; } public static int MaxLevel { get { return maxLevel; } } /// /// 数据初始化 /// public static void Init() { random = new System.Random(); endlessPortList = JsonDataCenter.GetList(); portConfigList = new List(); portDic = new Dictionary>(); InitPortList(); } /// /// 更新关卡数据的时候也重新初始化一次 /// public static void InitPortList() { maxLevel = 0; int? preLevel = null; portConfigList.Clear(); portDic.Clear(); foreach (endless_port data in endlessPortList) { 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); param.PortLevel = maxLevel; int totalWeight = 0; for (int i = 0; i < data.drop_rate.Count; ++i) { totalWeight += data.drop_rate[i]; } param.DropTotalWeight = totalWeight; portConfigList.Add(param); if (!portDic.ContainsKey(param.PortLevel)) portDic.Add(param.PortLevel, new List()); portDic[param.PortLevel].Add(param); } } /// /// 根据关卡等级获取关卡的所有波数据,如果本波次敌人数量为0,直接忽略掉 /// /// 关卡等级 /// public static List> GetLevelWaveData(int level) { List> ret = new List>(); for (int i = 0; i < 5; ++i) { ret.Add(new List()); } List 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; } /// /// 根据关卡等级和波次获得该波次的所有敌人数量 /// /// /// /// public static int GetWaveEnemiesCount(int level, int wave) { List> list = GetLevelWaveData(level); if (list.Count == 0) return 0; List waveData = list[wave]; int ret = 0; for (int i = 0; i < waveData.Count; ++i) { 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; } /// /// 根据关卡等级、波次、赛道获得击杀敌人掉落的奖励列表 /// /// 关卡等级 /// 波次 /// 第几条赛道 /// public static List GetDropRewardList(int level, int wave, int tunel) { List ret = new List(); List> levelData = GetLevelWaveData(level); if (levelData.Count == 0) throw new Exception($"当前关卡:{level}, 没有关卡数据"); List 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; } } }