|
|
using System.Collections.Generic;
|
using System.Linq;
|
|
public partial class TianziConfig : ConfigBase<int, TianziConfig>
|
{
|
//<BossID<HPNum,TianziConfig>>
|
private static Dictionary<int, Dictionary<int, TianziConfig>> bossIDAllInfoDict = new Dictionary<int, Dictionary<int, TianziConfig>>();
|
protected override void OnConfigParseCompleted()
|
{
|
if (!bossIDAllInfoDict.ContainsKey(BossID))
|
{
|
bossIDAllInfoDict[BossID] = new Dictionary<int, TianziConfig>();
|
}
|
bossIDAllInfoDict[BossID][HPNum] = this;
|
}
|
|
public static bool TryGetAllInfoDictByBossID(int BossID, out Dictionary<int, TianziConfig> dict)
|
{
|
return bossIDAllInfoDict.TryGetValue(BossID, out dict);
|
}
|
|
public static bool TryGetTianziConfigByBossIDAndHPNum(int BossID, int HPNum, out TianziConfig tianziConfig)
|
{
|
tianziConfig = null;
|
if (bossIDAllInfoDict.TryGetValue(BossID, out var hpDict))
|
{
|
if (hpDict.TryGetValue(HPNum, out tianziConfig))
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
|
public static bool TryGetTianziConfigByBossIDAndMaxHP(int BossID, long MaxHP, out TianziConfig tianziConfig)
|
{
|
tianziConfig = null;
|
if (bossIDAllInfoDict.TryGetValue(BossID, out var hpDict))
|
{
|
foreach (var item in hpDict.Values)
|
{
|
if (item.MaxHP == MaxHP)
|
{
|
tianziConfig = Get(item.ID);
|
return true;
|
}
|
}
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 根据传入的伤害计算当前是哪个血条,返回对应的TianziConfig
|
/// </summary>
|
/// <param name="BossID">Boss ID</param>
|
/// <param name="damage">累计伤害值</param>
|
/// <param name="tianziConfig">返回的TianziConfig</param>
|
/// <returns>是否成功找到对应的血条配置</returns>
|
public static bool TryGetTianziConfigByBossIDAndDamage(int BossID, ulong damage, out TianziConfig tianziConfig)
|
{
|
tianziConfig = null;
|
|
if (!bossIDAllInfoDict.TryGetValue(BossID, out var hpDict))
|
return false;
|
|
// 按血条编号排序,从小到大计算累计生命值
|
var sortedHPNums = hpDict.Keys.ToList();
|
sortedHPNums.Sort();
|
|
ulong accumulatedHP = 0;
|
foreach (int hpNum in sortedHPNums)
|
{
|
if (!hpDict.TryGetValue(hpNum, out var config))
|
continue;
|
|
// 累计生命值
|
accumulatedHP += (ulong)config.MaxHP;
|
|
// 如果伤害 <= 累计生命值,说明当前血条就是这个
|
if (damage <= accumulatedHP)
|
{
|
tianziConfig = Get(config.ID);
|
return true;
|
}
|
}
|
|
// 如果伤害 >= 所有血条的总生命值,返回最后一个血条
|
if (sortedHPNums.Count > 0)
|
{
|
var lastHPNum = sortedHPNums[sortedHPNums.Count - 1];
|
if (hpDict.TryGetValue(lastHPNum, out var lastConfig))
|
{
|
tianziConfig = Get(lastConfig.ID);
|
return true;
|
}
|
}
|
|
return false;
|
}
|
|
|
public static ulong GetCurrentHPDamage(int BossID, ulong totalDamage)
|
{
|
|
if (!bossIDAllInfoDict.TryGetValue(BossID, out var hpDict))
|
return 0;
|
|
var sortedHPNums = hpDict.Keys.ToList();
|
sortedHPNums.Sort();
|
|
ulong accumulatedHP = 0;
|
ulong previousAccumulatedHP = 0;
|
|
foreach (int hpNum in sortedHPNums)
|
{
|
if (!hpDict.TryGetValue(hpNum, out var config))
|
continue;
|
|
// 累计生命值
|
previousAccumulatedHP = accumulatedHP;
|
accumulatedHP += (ulong)config.MaxHP;
|
|
// 如果总伤害 <= 累计生命值,说明当前血条就是这个
|
if (totalDamage <= accumulatedHP)
|
{
|
// 对当前血条造成的伤害 = 总伤害 - 之前血条的总生命值
|
ulong currentHPDamage = totalDamage - previousAccumulatedHP;
|
return currentHPDamage;
|
}
|
}
|
return totalDamage - accumulatedHP;
|
}
|
|
}
|