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(); } /// /// 技能类型 /// public EndlessBossSkillType SkillType { get; set; } /// /// 技能配置表数据 /// public boss_skill SkillData { get; protected set; } /// /// 技能AI /// public EndlessBossSkillAI SkillAI { get; protected set; } /// /// 冷却是否完成 /// public bool IsCDCompleted { get; set; } /// /// 是否满足AI条件 /// /// public bool IsConditionOK { get; set; } /// /// 技能cd的计时器 /// protected Timer cdTimer; protected System.Random random; /// /// 帧刷新 /// public virtual void Update(float deltaTime) { SkillAI.Update(deltaTime); if (SkillAI.IsActived) { if (!IsCDCompleted && cdTimer.Tick(deltaTime)) IsCDCompleted = true; IsConditionOK = SkillAI.CanRelease(); } } /// /// 后面根据类型来获得 /// /// /// private EndlessBossSkillAI GetSkillAI(boss_skill param) { return new NormalBossSkillAI(param); } /// /// 释放技能 /// public virtual void ReleaseSkill() { IsCDCompleted = false; ResetCD(); } /// /// 技能初始化 /// public virtual void Init() { AddEvent(); SkillAI.Init(); // 技能第一次的cd直接就是好的 cdTimer = new Timer(0); } /// /// 重置cd时间 /// 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(); } /// /// 清理方法 /// public virtual void Clear() { RemoveEvent(); IsCDCompleted = false; cdTimer = null; SkillAI.Clear(); } protected virtual void AddEvent() { } protected virtual void RemoveEvent() { } /// /// 获取赛道列表 /// protected virtual List GetTunelList() { List tunelIdList = new List(); int count = 0; // 剩余没有用到的赛道 List remainList = new List() { 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; } } }