chenxin
2020-11-19 998ebc0dc00c103b365e36797c1a1ac4a6a2afa5
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
using System.Collections.Generic;
using Core.Utilities;
 
/**
 * 无尽模式boss技能基类
 * @Author: chenxin
 * @Date: 2020-11-02 16:47:31
 */
namespace KTGMGemClient
{
    public abstract class EndlessBossSkill
    {
        public EndlessBossSkill(boss_skill param)
        {
            SkillData = param;
            SkillType = (EndlessBossSkillType)param.skill_class;
            SkillAI = GetSkillAI(param);
            random = new System.Random();
        }
 
        /// <summary>
        /// 技能类型
        /// </summary>
        public EndlessBossSkillType SkillType { get; set; }
 
        /// <summary>
        /// 技能配置表数据
        /// </summary>
        public boss_skill SkillData { get; protected set; }
 
        /// <summary>
        /// 技能AI
        /// </summary>
        public EndlessBossSkillAI SkillAI { get; protected set; }
 
        /// <summary>
        /// 冷却是否完成
        /// </summary>
        public bool IsCDCompleted { get; set; }
 
        /// <summary>
        /// 是否满足AI条件
        /// </summary>
        /// <value></value>
        public bool IsConditionOK { get; set; }
 
        /// <summary>
        /// 技能cd的计时器
        /// </summary>
        protected Timer cdTimer;
 
        protected System.Random random;
 
        /// <summary>
        /// 帧刷新
        /// </summary>
        public virtual void Update(float deltaTime)
        {
            SkillAI.Update(deltaTime);
 
            if (SkillAI.IsActived)
            {
                if (!IsCDCompleted && cdTimer.Tick(deltaTime))
                    IsCDCompleted = true;
                IsConditionOK = SkillAI.CanRelease();
            }
        }
 
        /// <summary>
        /// 后面根据类型来获得
        /// </summary>
        /// <param name="param"></param>
        /// <returns></returns>
        private EndlessBossSkillAI GetSkillAI(boss_skill param)
        {
            return new NormalBossSkillAI(param);
        }
 
        /// <summary>
        /// 释放技能
        /// </summary>
        public virtual void ReleaseSkill()
        {
            IsCDCompleted = false;
            ResetCD();
        }
 
        /// <summary>
        /// 技能初始化
        /// </summary>
        public virtual void Init()
        {
            AddEvent();
            SkillAI.Init();
            // 技能第一次的cd直接就是好的
            cdTimer = new Timer(0);
        }
 
        /// <summary>
        /// 重置cd时间
        /// </summary>
        protected void ResetCD()
        {
            cdTimer.SetTime(SkillData.cool_down / 1000f);
            cdTimer.Reset();
        }
 
        public virtual void Reset()
        {
            if (cdTimer != null)
            {
                cdTimer.SetTime(0);
                cdTimer.Reset();
            }
            SkillAI.Reset();
        }
 
        /// <summary>
        /// 清理方法
        /// </summary>
        public virtual void Clear()
        {
            RemoveEvent();
            IsCDCompleted = false;
            cdTimer = null;
            SkillAI.Clear();
        }
 
        protected virtual void AddEvent()
        {
 
        }
 
        protected virtual void RemoveEvent()
        {
 
        }
 
        /// <summary>
        /// 获取赛道列表
        /// </summary>
        protected List<int> GetTunelList()
        {
            List<int> tunelIdList = new List<int>();
            int count = 0;
            // 剩余没有用到的赛道
            List<int> remainList = new List<int>() { 1, 2, 3, 4, 5 };
 
            for (int i = 0; i < SkillData.tunnel.Count; ++i)
            {
                // 统计6这种类型的数量
                if (SkillData.tunnel[i] == 6)
                {
                    ++count;
                    continue;
                }
 
                tunelIdList.Add(SkillData.tunnel[i]);
                remainList.Remove(SkillData.tunnel[i]);
            }
 
            for (int i = 0; i < count; ++i)
            {
                int num = random.Next(remainList.Count);
                tunelIdList.Add(remainList[num]);
                remainList.Remove(remainList[num]);
            }
 
            return tunelIdList;
        }
    }
}