chenxin
2020-10-21 146e39c5ef6bb29927cb7c00d7708fceab30a724
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
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;
 
        private static List<EndlessPortConfig> portConfigList;
 
        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()
        {
            endlessPortList = JsonDataCenter.GetList<endless_port>();
            portConfigList = new List<EndlessPortConfig>();
            random = new Random();
 
            foreach (endless_port data in endlessPortList)
            {
                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;
                portConfigList.Add(param);
            }
        }
 
        /// <summary>
        /// 根据关卡等级获取boss资源id
        /// </summary>
        /// <param name="level">关卡等级</param>
        /// <returns>如果返回-1查找失败</returns>
        public static int GetResIdByLevel(int level)
        {
            foreach (endless_port data in endlessPortList)
            {
                if (data.level == level)
                    return data.resource;
            }
 
            return -1;
        }
 
        /// <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>());
            }
 
            foreach (EndlessPortConfig data in portConfigList)
            {
                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;
        }
    }
}