using System.Collections.Generic;
|
using System;
|
|
/**
|
* endless_port 无尽模式关卡配置表数据处理类
|
* @Author: chenxin
|
* @Date: 2020-10-10 17:11:23
|
*/
|
namespace KTGMGemClient
|
{
|
public class EndlessPortConfig
|
{
|
/// <summary>
|
/// 配置表数据
|
/// </summary>
|
public endless_port Config;
|
|
/// <summary>
|
/// 预先随机好的敌人数据,spawnAgent时直接取这个数据,不再动态随机
|
/// </summary>
|
public endless_enemy EnemyData;
|
|
/// <summary>
|
/// 掉落概率总权重,即:表中掉落概率那一项全部加起来
|
/// </summary>
|
public int DropTotalWeight;
|
}
|
|
public class EndlessPortData
|
{
|
/// <summary>
|
/// 无尽模式关卡配置表
|
/// </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>
|
/// 最大关卡
|
/// </summary>
|
/// <value></value>
|
private static int maxLevel { get; set; }
|
public static int MaxLevel
|
{
|
get { return maxLevel; }
|
}
|
|
/// <summary>
|
/// 数据初始化
|
/// </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);
|
}
|
|
/// <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;
|
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 根据关卡等级获取关卡的所有波数据,如果本波次敌人数量为0,直接忽略掉
|
/// </summary>
|
/// <param name="level">关卡等级</param>
|
/// <returns></returns>
|
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> 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;
|
}
|
|
/// <summary>
|
/// 根据关卡等级和波次获得该波次的所有敌人数量
|
/// </summary>
|
/// <param name="level"></param>
|
/// <param name="wave"></param>
|
/// <returns></returns>
|
public static int GetWaveEnemiesCount(int level, int wave)
|
{
|
List<List<EndlessPortConfig>> list = GetLevelWaveData(level);
|
|
if (list.Count == 0) return 0;
|
|
List<EndlessPortConfig> waveData = list[wave];
|
int ret = 0;
|
|
for (int i = 0; i < waveData.Count; ++i)
|
{
|
ret += waveData[i].Config.amount;
|
}
|
|
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;
|
}
|
}
|
}
|