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 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;
}
}
}