lcy
2 天以前 ca577b96e0022e0ddaa8e106e147e53d8166df1c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
 
 
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;
    }
 
}