using System.Collections.Generic;
using System;
using UnityEngine;
/**
* endless_port 无尽模式关卡配置表数据处理类
* @Author: chenxin
* @Date: 2020-10-10 17:11:23
*/
namespace KTGMGemClient
{
public class EndlessPortConfig
{
///
/// 配置表数据
///
public endless_port Config;
///
/// 预先随机好的敌人数据,spawnAgent时直接取这个数据,不再动态随机
///
public endless_enemy EnemyData;
///
/// 掉落概率总权重,即:表中掉落概率那一项全部加起来
///
public int DropTotalWeight;
///
/// 关卡等级
///
public int PortLevel;
}
public class EndlessPortData
{
///
/// 无尽模式关卡配置表
///
private static List endlessPortList;
private static List portConfigList;
///
/// 关卡配置字典
///
private static Dictionary> portDic;
private static System.Random random;
///
/// 最大关卡
///
///
private static int maxLevel { get; set; }
public static int MaxLevel
{
get { return maxLevel; }
}
///
/// 数据初始化
///
public static void Init()
{
random = new System.Random();
endlessPortList = JsonDataCenter.GetList();
portConfigList = new List();
portDic = new Dictionary>();
InitPortList();
}
///
/// 更新关卡数据的时候也重新初始化一次
///
public static void InitPortList()
{
maxLevel = 0;
int? preLevel = null;
portConfigList.Clear();
portDic.Clear();
foreach (endless_port data in endlessPortList)
{
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);
if (!portDic.ContainsKey(param.PortLevel))
portDic.Add(param.PortLevel, new List());
portDic[param.PortLevel].Add(param);
}
}
///
/// 根据关卡等级获取关卡的所有波数据,如果本波次敌人数量为0,直接忽略掉
///
/// 关卡等级
///
public static List> GetLevelWaveData(int level)
{
List> ret = new List>();
for (int i = 0; i < 5; ++i)
{
ret.Add(new List());
}
List 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;
}
///
/// 根据关卡等级和波次获得该波次的所有敌人数量
///
///
///
///
public static int GetWaveEnemiesCount(int level, int wave)
{
List> list = GetLevelWaveData(level);
if (list.Count == 0) return 0;
List waveData = list[wave];
int ret = 0;
for (int i = 0; i < waveData.Count; ++i)
{
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;
}
///
/// 根据关卡等级、波次、赛道获得击杀敌人掉落的奖励列表
///
/// 关卡等级
/// 波次
/// 第几条赛道
///
public static List GetDropRewardList(int level, int wave, int tunel)
{
List ret = new List();
List> levelData = GetLevelWaveData(level);
if (levelData.Count == 0)
throw new Exception($"当前关卡:{level}, 没有关卡数据");
List 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;
}
}
}