From 1c693485cc0492d78ae4e120bb10f82a4aac9539 Mon Sep 17 00:00:00 2001 From: chenxin <chenxin6991@163.com> Date: Tue, 27 Oct 2020 10:20:47 +0800 Subject: [PATCH] Merge branch 'master' of http://172.16.1.52:8090/r/GemBattle into master --- Assets/Scripts/Data/EndlessPortData.cs | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 151 insertions(+), 22 deletions(-) diff --git a/Assets/Scripts/Data/EndlessPortData.cs b/Assets/Scripts/Data/EndlessPortData.cs index c218560..cbc772f 100644 --- a/Assets/Scripts/Data/EndlessPortData.cs +++ b/Assets/Scripts/Data/EndlessPortData.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System; /** * endless_port 无尽模式关卡配置表数据处理类 @@ -18,6 +19,11 @@ /// 预先随机好的敌人数据,spawnAgent时直接取这个数据,不再动态随机 /// </summary> public endless_enemy EnemyData; + + /// <summary> + /// 掉落概率总权重,即:表中掉落概率那一项全部加起来 + /// </summary> + public int DropTotalWeight; } public class EndlessPortData @@ -27,7 +33,19 @@ /// </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 Random random; /// <summary> /// 最大关卡 @@ -44,10 +62,77 @@ /// </summary> public static void Init() { + random = new Random(); + InitPortConfig(); + InitTeachPortConfig(); + List<List<EndlessPortConfig>> list = GetLevelWaveData(1); + } + + /// <summary> + /// 初始化关卡配置 + /// </summary> + private static void InitPortConfig() + { endlessPortList = JsonDataCenter.GetList<endless_port>(); portConfigList = new List<EndlessPortConfig>(); + InitPortList(portConfigList, endlessPortList); + } - foreach (endless_port data in endlessPortList) + /// <summary> + /// 初始化新手的关卡配置 + /// </summary> + private static void InitTeachPortConfig() + { + List<endless_teachport> list = JsonDataCenter.GetList<endless_teachport>(); + endlessTeachPortList = new List<endless_port>(); + + 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<reward> rewardList = new List<reward>(); + 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<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; @@ -55,24 +140,16 @@ EndlessPortConfig param = new EndlessPortConfig(); param.Config = data; param.EnemyData = EndlessEnemyData.GetDataById(data.enemy_id); - portConfigList.Add(param); - } - } + 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); + } } /// <summary> @@ -84,15 +161,27 @@ { List<List<EndlessPortConfig>> ret = new List<List<EndlessPortConfig>>(); - foreach (EndlessPortConfig data in portConfigList) + for (int i = 0; i < 5; ++i) { - if (data.Config.level != level || data.Config.amount == 0 || data.Config.tunel != 3) - continue; + ret.Add(new List<EndlessPortConfig>()); + } - if (data.Config.wave > ret.Count) - ret.Add(new List<EndlessPortConfig>()); + List<EndlessPortConfig> 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; @@ -120,5 +209,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; + } } } \ No newline at end of file -- Gitblit v1.9.1