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
using System.Collections.Generic;
using System.Linq;
public partial class FBDJGLevelConfig : ConfigBase<int, FBDJGLevelConfig>
{
    //<层数,<关卡编号,关卡ID>>
    static Dictionary<int, Dictionary<int, int>> idDict = new Dictionary<int, Dictionary<int, int>>();
 
    protected override void OnConfigParseCompleted()
    {
        if (!idDict.ContainsKey(LayerNum))
        {
            idDict[LayerNum] = new Dictionary<int, int>();
        }
        idDict[LayerNum][LevelNum] = LevelID;
    }
 
    public static bool TryGetLayerNumDict(int layerNum, out Dictionary<int, int> dict)
    {
        dict = null;
        return idDict != null && idDict.TryGetValue(layerNum, out dict);
    }
 
    public static bool TryGetLevelID(int layerNum, int levelNum, out int levelID)
    {
        levelID = 0;
        return idDict != null && idDict.TryGetValue(layerNum, out var dict) && dict.TryGetValue(levelNum, out levelID);
    }
 
    public static bool TryGetFBDJGLevelConfig(int layerNum, int levelNum, out FBDJGLevelConfig config)
    {
        config = null;
        if (TryGetLevelID(layerNum, levelNum, out var levelID) && HasKey(levelID))
        {
            config = Get(levelID);
            return true;
        }
        return false;
    }
 
    public static bool TryGetFBDJGLevelConfig(int levelID, out FBDJGLevelConfig config)
    {
        config = null;
        if (HasKey(levelID))
        {
            config = Get(levelID);
            return true;
        }
        return false;
    }
 
    public static bool TryGetMinFBDJGLevelConfig(out FBDJGLevelConfig minConfig)
    {
        minConfig = null;
        if (idDict.IsNullOrEmpty())
            return false;
        int layerNum = idDict.Keys.Min();
        if (!TryGetLayerNumDict(layerNum, out var dict) || dict.IsNullOrEmpty())
            return false;
        int levelNum = dict.Keys.Min();
        if (!TryGetFBDJGLevelConfig(layerNum, levelNum, out minConfig) || minConfig == null)
            return false;
        return true;
    }
    public static bool TryGetMaxFBDJGLevelConfig(out FBDJGLevelConfig maxConfig)
    {
        maxConfig = null;
        if (idDict.IsNullOrEmpty())
            return false;
        int layerNum = idDict.Keys.Max();
        if (!TryGetLayerNumDict(layerNum, out var dict) || dict.IsNullOrEmpty())
            return false;
        int levelNum = dict.Keys.Max();
        if (!TryGetFBDJGLevelConfig(layerNum, levelNum, out maxConfig) || maxConfig == null)
            return false;
        return true;
    }
 
    // 获取指定层的最大关卡编号
    public static bool TryGetMaxLevelNumInLayer(int layerNum, out int maxLevelNum)
    {
        maxLevelNum = 0;
        if (!TryGetLayerNumDict(layerNum, out var dict) || dict.IsNullOrEmpty())
            return false;
        maxLevelNum = dict.Keys.Max();
        return true;
    }
 
    // 获取下一关
    public static bool TryGetNextLevel(int layerNum, int levelNum, out int nextLayerNum, out int nextLevelNum)
    {
        nextLayerNum = 0;
        nextLevelNum = 0;
        if (!TryGetMaxLevelNumInLayer(layerNum, out int maxLevelNum))
            return false;
 
        // 层数相同,下一关
        if (maxLevelNum > 0 && levelNum < maxLevelNum)
        {
            nextLayerNum = layerNum;
            nextLevelNum = levelNum + 1;
            return true;
        }
 
        // 下一层的第1关
        nextLayerNum = layerNum + 1;
 
        // 如果没有下一层
        if (!idDict.ContainsKey(nextLayerNum))
        {
            nextLayerNum = 0;
            nextLevelNum = 0;
            return false;
        }
 
        nextLevelNum = idDict[nextLayerNum].Keys.Min();
        return true;
    }
 
}