chenxin
2020-10-27 8d10b61b215a3fad7eb53a7e7ee4dc9e9987d262
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
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
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;
 
        /// <summary>
        /// 无尽模式新手关卡配置表
        /// </summary>
        private static List<endless_port> endlessTeachPortList;
 
        private static List<EndlessPortConfig> portConfigList;
 
        /// <summary>
        /// 新手用
        /// </summary>
        private static List<EndlessPortConfig> teachPortConfigList;
 
        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()
        {
            random = new Random();
            InitPortConfig();
            InitTeachPortConfig();
            List<List<EndlessPortConfig>> list = GetLevelWaveData(1);
        }
 
        /// <summary>
        /// 初始化关卡配置
        /// </summary>
        private static void InitPortConfig()
        {
            endlessPortList = JsonDataCenter.GetList<endless_port>();
            portConfigList = new List<EndlessPortConfig>();
            InitPortList(portConfigList, endlessPortList);
        }
 
        /// <summary>
        /// 初始化新手的关卡配置
        /// </summary>
        private static void InitTeachPortConfig()
        {
            List<endless_teachport> list = JsonDataCenter.GetList<endless_teachport>();
            endlessTeachPortList = new List<endless_port>();
 
            foreach (endless_teachport data in list)
            {
                endless_port newData = new endless_port();
                newData.id = data.id;
                newData.level = data.level;
                newData.boss_name = data.boss_name;
                newData.resource = data.resource;
                newData.wave = data.wave;
                newData.tunel = data.tunel;
                newData.enemy_id = data.enemy_id;
                newData.amount = data.amount;
                newData.interval = data.interval;
                newData.b_hp = data.b_hp;
                newData.b_speed = data.b_speed;
                newData.b_coin = data.b_coin;
                newData.cooldown = data.cooldown;
 
                List<reward> rewardList = new List<reward>();
                foreach (reward r in rewardList)
                {
                    reward nr = new reward();
                    nr.type = r.type;
                    nr.id = r.id;
                    nr.count = r.count;
                    rewardList.Add(nr);
                }
 
                newData.drop = rewardList;
 
                List<int> rateList = new List<int>();
                foreach (int r in rateList)
                {
                    rateList.Add(r);
                }
 
                newData.drop_rate = rateList;
                newData.tunel_bg = data.tunel_bg;
                endlessTeachPortList.Add(newData);
            }
 
            teachPortConfigList = new List<EndlessPortConfig>();
            InitPortList(teachPortConfigList, endlessTeachPortList);
        }
 
        private static void InitPortList(List<EndlessPortConfig> list, List<endless_port> srcList)
        {
            foreach (endless_port data in srcList)
            {
                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;
                list.Add(param);
            }
        }
 
        /// <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>());
            }
 
            List<EndlessPortConfig> list = GameConfig.IsNewbie ? teachPortConfigList : portConfigList;
 
            foreach (EndlessPortConfig data in list)
            {
                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;
        }
    }
}