| | |
| | | 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> |
| | | private static Dictionary<int, List<EndlessPortConfig>> portDic; |
| | | |
| | | /// <summary> |
| | | /// 关卡每波次敌人总血量字典 |
| | | /// </summary> |
| | | private static Dictionary<int, List<float>> portEnemiesTotalHPDic; |
| | | |
| | | private static System.Random random; |
| | | |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | /// <value></value> |
| | | private static int maxLevel { get; set; } |
| | | |
| | | public static int MaxLevel |
| | | { |
| | | get { return maxLevel; } |
| | |
| | | endlessPortList = JsonDataCenter.GetList<endless_port>(); |
| | | portConfigList = new List<EndlessPortConfig>(); |
| | | portDic = new Dictionary<int, List<EndlessPortConfig>>(); |
| | | InitPortList(portConfigList, endlessPortList); |
| | | InitPortList(); |
| | | InitPortEnemiesTotalHP(); |
| | | } |
| | | |
| | | private static void InitPortList(List<EndlessPortConfig> list, List<endless_port> srcList) |
| | | /// <summary> |
| | | /// 初始化关卡数据 |
| | | /// </summary> |
| | | public static void InitPortList() |
| | | { |
| | | maxLevel = 0; |
| | | int? preLevel = null; |
| | | portConfigList.Clear(); |
| | | portDic.Clear(); |
| | | |
| | | foreach (endless_port data in srcList) |
| | | foreach (endless_port data in endlessPortList) |
| | | { |
| | | if (!GameConfig.IsNewbie && data.level < 0) continue; |
| | | |
| | |
| | | |
| | | 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; |
| | | |
| | |
| | | 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> |
| | |
| | | public static List<List<EndlessPortConfig>> GetLevelWaveData(int level) |
| | | { |
| | | List<List<EndlessPortConfig>> ret = new List<List<EndlessPortConfig>>(); |
| | | |
| | | for (int i = 0; i < 5; ++i) |
| | | { |
| | | ret.Add(new List<EndlessPortConfig>()); |
| | | } |
| | | |
| | | List<EndlessPortConfig> allLevelData = portDic[level]; |
| | | int wave = 0; |
| | | |
| | | foreach (EndlessPortConfig data in allLevelData) |
| | | { |
| | | if (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); |
| | | } |
| | |
| | | } |
| | | |
| | | 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> |
| | |
| | | |
| | | 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> |
| | |
| | | { |
| | | 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; |
| | | } |
| | | } |
| | | } |