using RichCreator.Utility.InputControl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace RichCreator.Utility.Skills
{
///
/// 技能释放队列
///
public class SkillQueue
{
private List callTimes = new List();//可调用的技能列表
private SkillInfo lastSkill = null;//最后一个调用的技能
private DateTime lastSkillCallTime = DateTime.MinValue;//最后一个技能的调用时间
public SkillQueue()
{
}
public SkillQueue(HIDCode[] skillCodes)
{
for (int i = 0; i < skillCodes.Length; i++)
{
EnQueue(false, skillCodes[i]);
}
}
///
/// 向可队列添加技能
///
///
///
public void EnQueue(bool isOnce, HIDCode skillCode)
{
SkillInfo skill = SkillInfo.GetSkillInfo(skillCode);
SKillCallTime time = new SKillCallTime(skill,isOnce);
this.callTimes.Add(time);
}
private SkillInfo nextSkill;
///
/// 阻塞查看队列,但不从队列中删除
///
///
public SkillInfo SyncPeek()
{
if (nextSkill == null)
{
nextSkill = FindOk();
}
return nextSkill;
}
///
/// 阻塞出队列
///
///
public SkillInfo SyncDeQueue()
{
SkillInfo result = null;
if (nextSkill != null)
{
result = nextSkill;
nextSkill = null;
}
else
{
result = FindOk();
}
for (int i = 0; i < this.callTimes.Count; i++)
{
if (this.callTimes[i].Skill == result)
{
this.callTimes[i].CallCount++;
this.callTimes[i].LastCallTime = DateTime.Now;
break;
}
}
return result;
}
///
/// 查找可以调用的技能
///
///
private SkillInfo FindOk()
{
SKillCallTime callTime = null;
while (true)
{
for (int i = 0; i < callTimes.Count; i++)
{
callTime = callTimes[i];
double dimMS = (DateTime.Now - callTime.LastCallTime).TotalMilliseconds;
if (dimMS > (callTime.Skill.WaitTime * 1000))
{
//已经过了技能等待时间
if (!callTime.IsOnce || callTime.CallCount <= 0)
{
//不是限制只调用一次,或一次也没调用过
return callTime.Skill;
}
}
}
//Thread.Sleep(100);
}
}
///
/// 技能调用时间
///
private class SKillCallTime
{
public SKillCallTime( SkillInfo skill,bool isOnce)
{
this.Skill = skill;
this.IsOnce = isOnce;
this.LastCallTime = DateTime.MinValue;
this.CallCount = 0;
}
///
/// 技能
///
public SkillInfo Skill;
///
/// 上次调用时间
///
public DateTime LastCallTime;
///
/// 是否只能调用一次
///
public bool IsOnce;
///
/// 调用次数
///
public Int32 CallCount;
}
}
}