From ae487b742c792c43b81cce6f060b881e5609d160 Mon Sep 17 00:00:00 2001 From: liuzhiwei <liuzhiwei@qq.com> Date: Tue, 08 Dec 2020 11:48:26 +0800 Subject: [PATCH] Merge branch 'master' of http://172.16.1.52:8090/r/GemBattle into master --- Assets/Scripts/Data/EndlessPortData.cs | 358 ++++++++++++++++++++++++++++++++++++++++++++--------------- 1 files changed, 264 insertions(+), 94 deletions(-) diff --git a/Assets/Scripts/Data/EndlessPortData.cs b/Assets/Scripts/Data/EndlessPortData.cs index cbc772f..fb8d96b 100644 --- a/Assets/Scripts/Data/EndlessPortData.cs +++ b/Assets/Scripts/Data/EndlessPortData.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System; +using UnityEngine; /** * endless_port 无尽模式关卡配置表数据处理类 @@ -16,14 +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 int DropTotalWeight; + public float DropTotalWeight; + + /// <summary> + /// 关卡等级 + /// </summary> + public int PortLevel; } public class EndlessPortData @@ -33,25 +44,32 @@ /// </summary> private static List<endless_port> endlessPortList; - /// <summary> - /// 无尽模式新手关卡配置表 - /// </summary> - private static List<endless_port> endlessTeachPortList; - private static List<EndlessPortConfig> portConfigList; /// <summary> - /// 新手用 + /// 关卡配置字典 /// </summary> - private static List<EndlessPortConfig> teachPortConfigList; + private static Dictionary<int, List<EndlessPortConfig>> portDic; - private static Random random; + /// <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; } @@ -62,84 +80,52 @@ /// </summary> public static void Init() { - random = new Random(); - InitPortConfig(); - InitTeachPortConfig(); - List<List<EndlessPortConfig>> list = GetLevelWaveData(1); - } - - /// <summary> - /// 初始化关卡配置 - /// </summary> - private static void InitPortConfig() - { + random = new System.Random(); endlessPortList = JsonDataCenter.GetList<endless_port>(); portConfigList = new List<EndlessPortConfig>(); - InitPortList(portConfigList, endlessPortList); + portDic = new Dictionary<int, List<EndlessPortConfig>>(); + InitPortList(); + InitPortEnemiesTotalHP(); } /// <summary> - /// 初始化新手的关卡配置 + /// 初始化关卡数据 /// </summary> - private static void InitTeachPortConfig() + public static void InitPortList() { - List<endless_teachport> list = JsonDataCenter.GetList<endless_teachport>(); - endlessTeachPortList = new List<endless_port>(); + maxLevel = 0; + int? preLevel = null; + portConfigList.Clear(); + portDic.Clear(); - foreach (endless_teachport data in list) + foreach (endless_port data in endlessPortList) { - 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; + if (!GameConfig.IsNewbie && data.level < 0) continue; - List<reward> rewardList = new List<reward>(); - foreach (reward r in rewardList) + if (preLevel == null || preLevel != data.level) { - reward nr = new reward(); - nr.type = r.type; - nr.id = r.id; - nr.count = r.count; - rewardList.Add(nr); + preLevel = data.level; + ++maxLevel; + + if (data.level < 0) + ++NewbieTotalLevel; } - - newData.drop = rewardList; - - List<int> rateList = new List<int>(); - foreach (int r in rateList) - { - rateList.Add(r); - } - - newData.drop_rate = rateList; - newData.tunel_bg = data.tunel_bg; - endlessTeachPortList.Add(newData); - } - - teachPortConfigList = new List<EndlessPortConfig>(); - InitPortList(teachPortConfigList, endlessTeachPortList); - } - - private static void InitPortList(List<EndlessPortConfig> list, List<endless_port> 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); + 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) @@ -147,9 +133,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> @@ -160,17 +214,18 @@ public static List<List<EndlessPortConfig>> GetLevelWaveData(int level) { List<List<EndlessPortConfig>> ret = new List<List<EndlessPortConfig>>(); + List<EndlessPortConfig> allLevelData = portDic[level]; + int wave = 0; - for (int i = 0; i < 5; ++i) + foreach (EndlessPortConfig data in allLevelData) { - ret.Add(new List<EndlessPortConfig>()); - } + if (data.Config.amount == 0) continue; - List<EndlessPortConfig> list = GameConfig.IsNewbie ? teachPortConfigList : portConfigList; - - foreach (EndlessPortConfig data in list) - { - if (data.Config.level != level || 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); } @@ -185,6 +240,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> @@ -204,10 +301,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> @@ -234,17 +362,59 @@ { 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; + } + + /// <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