Buff系统框架设计
BufType: 1: 精神类Buf 2: 物理类Buf 3.元素类Buf 4.其他类Buf 5.被动类Buf
BufSubType: 1000-1999 精神子类 2000-2999.物理子类 3000-3999.元素子类 4000-4999.其他子类 5000-5999.被动子类。所以子类可以唯一标识一个Buff的类别
OppGroupId: 表明该GroupBuff互斥的BuffGroup.玩家身上只可能两种BuffSubType存在一种
RawBufDesc.xml
<RawBufDesc RawBuffId="RawBuff的ID" bProBaseDerivedWXImp="是否有基础参数" bCalcImp="是否影响公式计算" bEquipImp="是否影响装备限制计算" bNeedTick="是否需要被Tick"></RawBufDesc>
BufDesc.xml
<BufDesc BuffId="Buf的Id" Name="Buff名" BufType="技能大类,其实没什么用,只是用来进行额外索引。" BufSubType="Buff类别,类别写死了该类别的Buff是替代、叠加、同时存在" LifeCycleTime="Buff存在时间" bRemoveOnDead="是否死亡消失" bDebuf="是否损益Buff" bGoodBuf="是否增益Buff" bOnlyInFight="是否战斗中有效" bVisible="是否显示效果" bSaveDB="是否需要存数据库" BufLv="Buff的等级,决定替代、叠加关系" bManualRemove="是否手动移除" ViewOrder="图标顺序">
<RawBufInsList>
<RawBufInsDesc RawBuffId="产生的RawBuff序列" P1="RawBuff参数" P2="RawBuff参数">
</RawBufInsList>
</BufDesc>
BufGroupDesc.xml
<BufGroupDesc GroupId="BuffGroupId,基本无效" BufSubType="参考前面,这个就可以索引BuffGroup" OppGroupId="对抗的BuffGroupId(其实可以不要GroupId,只要BuffSubType)" Name="Buff组名">
<buf bufId="" level=""></buf>
<buf ...></buf>
</BufGroupDesc>
PropertiesDesc.xml 记录了所有游戏使用的属性内容,已经其对应的宏
<PropertiesDesc ProId="属性ID" name="宏参数" displayerName="" bVisible="" desc="">
Buff系统构成
RawBuff构成了Buff
Buff相同SubType的内容构成了BufGroup,如果没有BuffGroup的SubType可以相互替代
BuffGroup记录了可以叠加的SubType组,和叠加的Buff关系
Buff的流程
判定是否Buff能够Attach
=> TFightActor::GetFirstBufBySubType(iSubType) 获取身上该SubType的Buff
=> 比较需要添加的Buff和已经有的Buff的 BuffLevel.如果已经有更强大的则不能添加
Attach Buff流程
=> AttachBufWithCalc(_U32 iBuffId, _U32 iBuffInstanceId, _U32 iPeriod, TActorRecalcContext* pCtx)
=> CalcBufChangeWhenAttachBufById(_U32 iBuffId, U32& iAttachBufId, _U32& iPeriod, _U32& iDetachBufId, _U32& iDetachInstanceId) 该函数会调整最后生成的BuffId, 生存周期 和Detach的BuffId, BuffInstanceId
通过iBuffId的SubType判定该Buff是有BuffGroup还是没有。如果有BuffGroup获取其在组里面的BuffLevel,否则BuffLevel为1
=> CalcBufChangeWhenAttachBufBySubType(_U16 iBufSubType, _U32 iBufId, _U32 iBufLevelInc, _U32& iAttachBufId, _U32& iPeriod, _U32 iDetachBufId, _U32& iDetachInsId)
SubType的替换类别是
a.同Bufid替换
查找身上第一个同个Buffid的Buffer,
如果有,
则Detach原来的Attach现在的,
否则只Attach现在的
b.同SubType替换
查找身上第一个同SubType的Buffer,
如果有,
则Detach原来的Attach现在的,
否则只attach现在的
c.同SubType同Level替换
查找身上第一个同SubType的Buffer,
如果没有,
则直接attach现在的;
如果有,而且新的Buffer BuffLevel更高,
则Detach原来的Attach现在的,
否则无法Attach
d.叠加
查找该SubType的BuffGroup,
如果不存在则无法attach
如果存在,则获取当前SubType的Buff的BuffLevel
如果存在,则Detach当前Buff, 计算当前BuffLevel+添加Buff的newBuffLevel计算出新的Buff.添加新的Buff
如果不存在,直接Attach当前Buff
e.叠加、对抗
查找是否存在该SubType对抗的SubType的Buff
如果不存在,则走叠加的逻辑
如果存在,则Detach对抗的Buff, 把newBuff的new BuffLevel和对抗的BuffLevel相减。Attach剩下的BuffLevel的BuffId
f.时间叠加
如果存在该BuffId则detach原来的,attach新的,但是period时间是新的+原来的剩余时间
g.直接添加
不管任何情况,直接添加
=> DetachBuf(_U32 iBuffId, _U32 iBuffInstanceId, TUpdateBufContext* pCtx)
遍历m_listBuff, if(pBuf->m_iId == iBuffId && (iBufInstance == 0 || pBuf->m_iInstanceId == iBufInstanceId)) DetachBuf(TBuff* pBuff, TUpdateBufContext* pCtx)
=>DetachBuf(TBuff* pBuff, TUpdateBufContext* pCtx)
pCtx记录Detach的BuffInstanceId, BuffDesc, DetachBuffCount
如果RawBuff列表在TFight的战斗Process中,删除
=>TFight::RemoveProcessRequeest(TRawBuff* pRawBuff)
把pRawBuff的Process从战斗的m_listProcessReqCtx里面移除,释放Process. RawBuff的内存资源还在哦
=> TFightActor::DetachBufInternal(TBuff* pBuf)Buff释放逻辑,(RawBuff没有内存释放哦)
遍历Buff的RawBuff里面
RawBuff::OnDetach()
从m_listRawBuffList清除RawBuff
从m_listBuffList清除Buff
=> TBuf::DestroyBuf(TBuf* pBuf)
释放Rawbuff内存
释放Buff内存
=> 如果Alive AttachBuf(_U32 iBufId, _U32 iBufInstanceId, _U32 iPeriod, TUpdateBufContext* pCtx)
=> TBuff::CreateBuf(_U32 iBuffId, _U32 iBuffInstanceId)
创建RawBuff对象
创建Buff对象
pBuff->m_iPeriod = iPeriod
pBuff->m_iCurrTime = 0
=>TFightActor::AttachBufInternal(TBuff* pBuf)
把pBuff放入m_listBuff
把pBuff的RawBuff数组放入m_listRawBuff
=>TBuf::OnAttach(TFightActor* pActor)
设置TBuff::m_pActor
设置TRawBuff::m_pActor
pCtx->m_arAttachBuf记录pBuff
=> TFightActor::RecalcPlayerSkillEquipBufProByCtx(TActorRecalcContext* pCtx, TActorRecalcContext* pPetCtx)
计算BuF属性影响
计算属性
校验属性
TickBuff流程
=> TFightActor::Tick
对需要进行Tick的RawBuff进行Tick操作
=>TRawBuff::Tick()
生成对应的客户端通知,跟技能是一样的,就是一个特效ID,还有相关参数,放入队列。
方式队列到客户端播放效果
服务器客户端同步协议
与技能相同的数据,是一个Process数组
Buff系统框架设计的更多相关文章
- 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)
AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...
- 基于WPF系统框架设计(1)-为什么要仿Office2010 Ribbon?
为什么系统框架设计使用Ribbon导航模式? 这得从Office软件的演变说起.微软为什么最后选择使用Ribbon,也许就是很多系统设计要使用Ribbon做功能导航的原因. 你是否还记得曾经使用过的M ...
- 基于WPF系统框架设计(3)-Fluent Ribbon界面布局
一个系统框架除了功能菜单导航,有系统内容显示区域,系统状态栏. Silver: Blue: Black: 系统界面设计,就不进行技术细节介绍了,主题以框架设计为主,Xaml源码参考: <Flue ...
- 基于WPF系统框架设计(4)-Ribbon整合Avalondock 2.0实现多文档界面设计(一)
前些时间研究了WPF的一些框架,感觉基于Prism框架的MVVM模式对系统的UI与逻辑分离很好,所以就按照之前Winform的框架设计,用WPF做了一套,感觉比Winform要强很多. MVVM模式和 ...
- Android源码分析(三)-----系统框架设计思想
一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...
- 基于WPF系统框架设计(6)-整合MVVM框架(Prism)
应用场景 我们基础的框架已经搭建起来了,现在整合MVVM框架Prism,在ViewModel做一些逻辑处理,真正把界面设计分离出来. 这样方便我们系统开发分工合作,同时提高系统可维护性和灵活性. 具体 ...
- 基于WPF系统框架设计(2)-Fluent Ribbon之HelloWorld
Fluent/Ribbon是微软在其最新桌面操作系统Windows 7中使用的图形用户界面. Windows平台的进化,伴随着系统图形界面的重新设计.从Windows XP到Windows Vista ...
- 基于WPF系统框架设计(10)-分页控件设计
背景 最近要求项目组成员开发一个通用的分页组件,要求是这个组件简单易用,通用性,兼容现有框架MVVM模式,可是最后给我提交的成果勉强能够用,却欠少灵活性和框架兼容性. 设计的基本思想 传入数据源,总页 ...
- 基于WPF系统框架设计(8)-PasswordBox传值到ViewMode
应用场景 我要做一个系统登录功能,需要传用户名和密码到ViewModel中,可是PasswordBox传值到ViewModel中好像跟TextBox等控件不一样.这里需要用到附加属性. 附加属性:一个 ...
随机推荐
- 关于locate这个NB命令我不得不深入的学习
先看看locate的安装包和生成的文件: [root@NB mlocate]# which locate /usr/bin/locate [root@NB mlocate]# rpm -qf /usr ...
- CSocket类网络编程 MFC
Visual C++的MFC提供了CSocket类用来实现网络通信. 下面介绍VC++在Windows 95中实现Socket的 CSocket 类相关成员函数(这些成员函数实际上是从CAsyncSo ...
- bootstrap中模态框的大小设置
<!-- 大模态框的调节 --> <button type="button" class="btn btn-primary" data-tog ...
- gson 转换 List<Map> 注意事项
如果list泛型显示指定Map类型, 这时的Map 不能直接转换为 jre自带的 map类型 gson封装了 StringMap 进行转换
- Java web 项目读取src或者tomcat下class文件夹下的xml文件或者properties文件
//生成一个文件对象: File file = new File(getClass().getClassLoader().getResource("test.xml").getPa ...
- Hadoop的体系结构之MapReduce的体系结构
MapReduce的体系结构 Hadoop MapReduce是一个使用简易的软件框架,基于它写出来的应用程序能够运行在上千个商用机器组成的大型集群上,并以一种可靠容错的方式并行处理上TB的数据集. ...
- java日期工具类DateUtil-续二
该版本是一次较大的升级,农历相比公历复杂太多(真佩服古人的智慧),虽然有规律,但涉及到的取舍.近似的感念太多,况且本身的概念就已经很多了,我在网上也是查阅了很多的资料,虽然找到一些计算的方法,但都有些 ...
- Ubuntu下安装Apache
Ubuntu为我们提供了 su apt-get install 命令,通过它你可以很方便地安装一些软件,这些软件是放在Ubuntu放置在各个地方的服务器上面,如果你想安装的软件是比较常见的,一般都可以 ...
- EMC检测标准
- yaffs2文件镜像制作工具yaffs2image
1. 不同nand容量,工具不一样. 首先使用的是mkyaffs2image,编译生成根文件系统的镜像之后,下载到板子上,启动的时候报错,错误代码这里没有上传.问题出在工具使用的不正确,查看工具目录 ...