| | |
| | | using System.Collections.Generic; |
| | | using System; |
| | | using UnityEngine; |
| | | |
| | | /** |
| | | * endless_port 无尽模式关卡配置表数据处理类 |
| | |
| | | /// 预先随机好的敌人数据,spawnAgent时直接取这个数据,不再动态随机 |
| | | /// </summary> |
| | | public endless_enemy EnemyData; |
| | | |
| | | /// <summary> |
| | | /// 掉落概率总权重,即:表中掉落概率那一项全部加起来 |
| | | /// </summary> |
| | | public int DropTotalWeight; |
| | | |
| | | /// <summary> |
| | | /// 关卡等级 |
| | | /// </summary> |
| | | public int PortLevel; |
| | | } |
| | | |
| | | public class EndlessPortData |
| | |
| | | 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> |
| | | /// 最大关卡 |
| | |
| | | /// </summary> |
| | | public static void Init() |
| | | { |
| | | random = new System.Random(); |
| | | endlessPortList = JsonDataCenter.GetList<endless_port>(); |
| | | portConfigList = new List<EndlessPortConfig>(); |
| | | portDic = new Dictionary<int, List<EndlessPortConfig>>(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新关卡数据的时候也重新初始化一次 |
| | | /// </summary> |
| | | public static void InitPortList() |
| | | { |
| | | maxLevel = 0; |
| | | int? preLevel = null; |
| | | portConfigList.Clear(); |
| | | portDic.Clear(); |
| | | |
| | | foreach (endless_port data in endlessPortList) |
| | | { |
| | | 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); |
| | | 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); |
| | | } |
| | | } |
| | | |
| | | /// <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; |
| | | } |
| | | if (!portDic.ContainsKey(param.PortLevel)) |
| | | portDic.Add(param.PortLevel, new List<EndlessPortConfig>()); |
| | | |
| | | return -1; |
| | | portDic[param.PortLevel].Add(param); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | { |
| | | 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> 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; |
| | |
| | | |
| | | 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> |
| | | /// <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; |