小妖精的完美游戏教室——buff系统
作者:小妖精Balous,未经作者允许,任何个人与单位不得将此源代码用于商业化项目
#region buff
/// <summary>
/// 是否魔法免疫,魔法免疫的生物不会受到除自己以外的生物施放的buff
/// </summary>
public bool isMagicalImmunity
{
set;
get;
}
/// <summary>
/// 添加buff前触发
/// </summary>
public event AddBuff OnAddBuff;
/// <summary>
/// 增益buff集合
/// </summary>
private LinkedList<Buff> buffList;
/// <summary>
/// 减益buff集合
/// </summary>
private LinkedList<Buff> debuffList;
/// <summary>
/// 执行所有buff效果
/// </summary>
private void buffExecute()
{
if (buffList.Count != 0)
{
for (var item = buffList.First; item != null;)
{
//如果buff有效时间结束,移除buff,否则执行buff效果
if (item.Value.activeTime <= 0)
{
item.Value.Exit();
var next = item.Next;
buffList.Remove(item);
item = next;
continue;
}
else
{
item.Value.Execute();
item.Value.activeTime -= Time.deltaTime;
}
item = item.Next;
}
}
if (debuffList.Count != 0)
{
for (var item = debuffList.First; item != null;)
{
//如果buff有效时间结束,移除buff,否则执行buff效果
if (item.Value.activeTime <= 0)
{
item.Value.Exit();
var next = item.Next;
debuffList.Remove(item);
item = next;
continue;
}
else
{
item.Value.Execute();
item.Value.activeTime -= Time.deltaTime;
}
item = item.Next;
}
}
}
/// <summary>
/// 驱散除击退型硬直外的所有buff
/// </summary>
public void dispellAll()
{
dispellBuff();
dispellDebuff();
}
/// <summary>
/// 驱散所有增益buff
/// </summary>
public void dispellBuff()
{
foreach (Buff buff in buffList) buff.Exit();
buffList.Clear();
}
/// <summary>
/// 驱散除击退型硬直外的所有减益buff
/// </summary>
public void dispellDebuff()
{
LinkedList<Buff> KnockBuffs = new LinkedList<Buff>();
foreach (Buff debuff in debuffList)
{
if (debuff.GetType() == typeof(KnockbackByHit))
{
KnockBuffs.AddLast(debuff);
continue;
}
debuff.Exit();
}
debuffList.Clear();
debuffList = KnockBuffs;
}
/// <summary>
/// 添加不能重叠的buff
/// </summary>
/// <param name="newBuff">新buff</param>
public void buffAddSingle(Buff newBuff)
{
//禁止添加击退型硬直buff
if (newBuff.GetType() == typeof(KnockbackByHit)) return;
//触发添加buff事件
if (OnAddBuff != null)
{
BuffAddingEventArgs e = new BuffAddingEventArgs(newBuff);
OnAddBuff(this, e);
//如果添加buff被撤销,不能添加
if (e.Cancel) return;
}
//如果魔法免疫,不能添加其它生物施放的buff
if (isMagicalImmunity && newBuff.source.gameObject != gameObject) return;
//如果是增益buff,添加进buffList
if (newBuff.buffType == BuffType.Buff)
{
//如果新buff已经存在,则刷新buff
if (buffList.Count != 0)
{
for (var buff = buffList.First; buff != buffList.Last.Next; buff = buff.Next)
{
//如果类型跟施法者相同,视为同一个buff
if (buff.Value.GetType() == newBuff.GetType() && buff.Value.source.gameObject == newBuff.source.gameObject)
{
//如果新buff强度更高,则刷新整个buff
if (buff.Value.level <= newBuff.level)
{
buff.Value.Exit();
buff.Value = newBuff;
newBuff.owner = this;
newBuff.Enter();
newBuff.activeTime = newBuff.initialActiveTime;
}
return;
}
}
}
buffList.AddLast(newBuff);
newBuff.owner = this;
newBuff.Enter();
newBuff.activeTime = newBuff.initialActiveTime;
}
//如果是减益buff,添加进debuffList
else
{
if (debuffList.Count != 0)
{
for (var debuff = debuffList.First; debuff != debuffList.Last.Next; debuff = debuff.Next)
{
//如果类型跟施法者相同,视为同一个buff
if (debuff.Value.GetType() == newBuff.GetType() && debuff.Value.source.gameObject == newBuff.source.gameObject)
{
//如果新buff强度更高,则刷新整个buff
if (debuff.Value.level <= newBuff.level)
{
debuff.Value.Exit();
debuff.Value = newBuff;
newBuff.owner = this;
newBuff.Enter();
newBuff.activeTime = newBuff.initialActiveTime;
}
return;
}
}
}
debuffList.AddLast(newBuff);
newBuff.owner = this;
newBuff.Enter();
newBuff.activeTime = newBuff.initialActiveTime;
}
}
/// <summary>
/// 添加可以重叠的buff
/// </summary>
/// <param name="newBuff">新buff</param>
public void buffAddMult(Buff newBuff)
{
//禁止添击退型硬直buff
if (newBuff.GetType() == typeof(KnockbackByHit)) return;
//触发添加buff事件
if (OnAddBuff != null)
{
BuffAddingEventArgs e = new BuffAddingEventArgs(newBuff);
OnAddBuff(this, e);
//如果添加buff被撤销,不能添加
if (e.Cancel) return;
}
//如果魔法免疫,不能添加其它生物施放的buff
if (isMagicalImmunity && newBuff.source.gameObject != gameObject) return;
//如果是增益buff,添加进buffList
if (newBuff.buffType == BuffType.Buff)
{
buffList.AddLast(newBuff);
newBuff.owner = this;
newBuff.Enter();
newBuff.activeTime = newBuff.initialActiveTime;
}
//如果是减益buff,添加进debuffList
else
{
debuffList.AddLast(newBuff);
newBuff.owner = this;
newBuff.Enter();
newBuff.activeTime = newBuff.initialActiveTime;
}
}
#endregion
小妖精的完美游戏教室——buff系统的更多相关文章
- 小妖精的完美游戏教室——人工智能,A*算法,引言
今天也要直播魔法,求科学的! 欢迎来到小妖精Balous的完美游戏教室! 经过前两周的学习,相信米娜桑已经对状态机有所了解了呢~虽然状态机能够实现几乎所有的人工智能,但是,在实践中,你们有没有发现,自 ...
- 小妖精的完美游戏教室——东方PROJECT,同人,符卡系统
//================================================================//// Copyright (C) 东方同人社// All Rig ...
- 小妖精的完美游戏教室——人工智能,A*算法,启发因子篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
- 小妖精的完美游戏教室——人工智能,A*算法,导航网络篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
- 小妖精的完美游戏教室——人工智能,A*算法,结点篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
- 小妖精的完美游戏教室——人工智能,A*算法,实现篇
//================================================================//// Copyright (C) 2017 Team Saluk ...
- 小妖精的完美游戏教室——东方PROJECT,同人,墙
//================================================================//// Copyright (C) 东方同人社// All Rig ...
- 小妖精的完美游戏教室——东方PROJECT,同人,th12灵梦A
╮(╯▽╰)╭没办法,小妖精Balous也很讨厌学院化的教育呀,一点意义都没有. 这次就上传东方地灵殿灵梦A逻辑部分的核心代码吧,估计连老师都看不懂.动画部分的代码就不放上来了. //======== ...
- 小妖精的完美游戏教室——东方PROJECT,同人,子机
//================================================================//// Copyright (C)// All Rights Re ...
随机推荐
- idea的破解及相关安装
---- idea的破解 -javaagent:../bin/JetbrainsCrack-2.7-release-str.jar 复制到相关的idea配置文件 并将该Jar包复制到idea的bin目 ...
- Python正则表达式的re库一些用法(上)
1.查找文本中的模式 search()函数取模式和要扫描的文本作为输入,找到这个模式时就返回一个match对象.如果没有找到模式,search()就返回None. 每个match对象包含有关匹配性质的 ...
- imx6 工具链下载地址
http://downloads.yoctoproject.org/releases/yocto/yocto-1.7.1/toolchain/
- ava、Python和PHP三者的区别
Java.Python和PHP三者的区别 2017年07月15日 22:09:21 书生_AABB 阅读数:18994 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- 开通blog,记录学习历程
2017.12.15日,开通blog,用于回忆知识点的记录和整理. 开通本blog主要做以下几点事情: 1.巩固知识点,基础打牢: 2.在基础牢固的基础上,学习流行的框架: 3.在框架牢固的基础上学习 ...
- mongo-2ds索引对超过半球范围的适用性测试
以下测试均基于mongo v4.0 win10 一.GeoJSON GeoJSON是一种基于json的经纬度描述数据格式.在这里主要服务于2dsphere索引查询. 基本格式 <type:&q ...
- list练习
usernames = ['cwl','pn','gxn','hyp']passwords = ['123456','abc123','324234','23423']#pn#sdfsdf #需要校验 ...
- 运行caffe自带的mnist实例教程
运行caffe自带的mnist实例教程 本文结合几篇博文总结下来的,附上其中一篇原博文链接以供参考:http://blog.sina.com.cn/s/blog_168effc7e0102xjr1.h ...
- better-scroll无法滚动的问题。
better-scroll无法滚动的问题.1遇见better-scroll(以下简称:BS)无法滚动,可从两方面去考虑.一是层级关系出错,二是计算高度出错.###1,层级关系BS的基本结构是:一个wr ...
- Ubuntu中的出现:主文件夹的内容跑在桌面显示解决方案。同时 vim编辑器的操作
在终端窗口进入中文件夹 输入命令:cd .config/ 然后找到user-dirs.dirs 输入命令:vim user-dirs.dirs 在vim中安 i 即可进行插入操作 把对应的中文件中的文 ...