using System.Collections.Generic; using System; /** * 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 class EndlessPortData { /// /// 无尽模式关卡配置表 /// private static List endlessPortList; /// /// 无尽模式新手关卡配置表 /// private static List endlessTeachPortList; private static List portConfigList; /// /// 新手用 /// private static List teachPortConfigList; private static Random random; /// /// 最大关卡 /// /// private static int maxLevel { get; set; } public static int MaxLevel { get { return maxLevel; } } /// /// 数据初始化 /// public static void Init() { random = new Random(); InitPortConfig(); InitTeachPortConfig(); List> list = GetLevelWaveData(1); } /// /// 初始化关卡配置 /// private static void InitPortConfig() { endlessPortList = JsonDataCenter.GetList(); portConfigList = new List(); InitPortList(portConfigList, endlessPortList); } /// /// 初始化新手的关卡配置 /// private static void InitTeachPortConfig() { List list = JsonDataCenter.GetList(); endlessTeachPortList = new List(); foreach (endless_teachport data in list) { endless_port newData = new endless_port(); newData.id = data.id; newData.level = data.level; newData.boss_name = data.boss_name; newData.resource = data.resource; newData.wave = data.wave; newData.tunel = data.tunel; newData.enemy_id = data.enemy_id; newData.amount = data.amount; newData.interval = data.interval; newData.b_hp = data.b_hp; newData.b_speed = data.b_speed; newData.b_coin = data.b_coin; newData.cooldown = data.cooldown; List rewardList = new List(); foreach (reward r in rewardList) { reward nr = new reward(); nr.type = r.type; nr.id = r.id; nr.count = r.count; rewardList.Add(nr); } newData.drop = rewardList; List rateList = new List(); foreach (int r in rateList) { rateList.Add(r); } newData.drop_rate = rateList; newData.tunel_bg = data.tunel_bg; endlessTeachPortList.Add(newData); } teachPortConfigList = new List(); InitPortList(teachPortConfigList, endlessTeachPortList); } private static void InitPortList(List list, List srcList) { foreach (endless_port data in srcList) { if (data.level > maxLevel) maxLevel = data.level; EndlessPortConfig param = new EndlessPortConfig(); param.Config = data; param.EnemyData = EndlessEnemyData.GetDataById(data.enemy_id); int totalWeight = 0; for (int i = 0; i < data.drop_rate.Count; ++i) { totalWeight += data.drop_rate[i]; } param.DropTotalWeight = totalWeight; list.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 list = GameConfig.IsNewbie ? teachPortConfigList : portConfigList; foreach (EndlessPortConfig data in list) { if (data.Config.level != level || 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) { ret += waveData[i].Config.amount; } 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; } } }