成就系统框架设计

成就系统配置
成就参数操作类型:1位 8位 16位 32位
AchivementGroup:同一种成就组成一组,比如杀死3个敌人,杀死10个敌人
Param1CheckType: 0:忽略 1:= 2:> 3:< 4:>= 5:<= 6:&
ModifyType:0:忽略 1:8位加 2:16位加 3:32位加 4:位设置 5:8位设置 6:16位设置 7:32位设置
UseEventParam: 0:使用ModifyVal来进行参数设置 1:使用eventParam来作为设置参数
CompareType: 1: _U8比较> 2:_U16比较> 3:_U32比较>  4:Bit位为1的位数   只有比较是否大于该值,没有其他方式
HintType: 1:显示是否完成 2:显示完成的进度

<AchGroupDesc GroupId="组ID" AchType="成就类型" ParamSize="成就参数占用的数据长度">
<EventParamList>
<EventParamDesc>
<EventMatch EventId="事件ID" Param1CheckType="参考前面" Param1="数值" Param2CheckType="" Param2="" Param3CheckType="" Param3="">
<ParamModify ModifyType="参考前面" ParamOffset="该参数在当前Group的buff中的偏移量" UseEventParam="使用ModifyVal还是使用eventParam来作为设置参数" ModifyVal="UseEventParam为0,则为该事件的设置值" MaxValue="参数的最大值">
</EventParamDesc>
<EventParamDesc>
</EventParamDesc>
</EventParamList>
<AchievementList>
<AchDesc AchId="成就ID" Name="成就名" AchCoin="成就奖励" Obsolete="客户端面板相关" CatalogId="客户端面板相关" HintTitle="客户端面板相关">
<CompleteConList>
<CompleteConDesc CompareType="参考前面" ParamOffset="要比较的参数在该GroupBuff中的偏移量" ParamSize="只有当CompareType为4的时候有效,决定需要判定多少个bit" CompareVal="如果比该值大,则完成该成就">
</CompleteConList>
<HintList HintType="参考前面">
客户端面板相关
</HintList>
</AchDesc>
</AchievementList>
</AchGroupDesc>

成就系统的流程
TPlayer::OnLogicEventInternal(_U32 iEventFilterId, _U32 iEventId, _U32 iParam1, _U32 iParam2, _U32 iParam3, _U32 iParam4 = 0)

=> TEventPipe::OnEvent(_U32 iEventFilterId, _U32 iEventId, TEventPipeParam param, void* pKey=NULL)
typedef struct TEventPipeParam {_U32 iParam1; _U32 iParam2; _U32 iParam3; _U32 iParam4}

TEventPipe其实就是一个TEventPipeHandler的容器,存了该角色所有的TEventPipeHandler.完整的成就系统就是一个Handler.
TTAchievementEventHandlerRoot : public TEventPipeHandler

=> TTAchievementEventHandlerRoot::OnEvent(_U32 iEventFilterId, _U32 iEventId, TEventPipeParam param, void* pKey=NULL)

=> TTAchievementEventHandlerRoot是一个TTAchivevementEventHandlerFilter列表。所有的AchievementGroup根据其EventMatch使用的EventId挂在不同的TTAchivevementEventHandlerFilter上。通过iEventFilterId减少Event事件需要判定的成就组个数。

TTAchivevementEventHandlerFilter : public TEventPipeHandler

=> TTAchivevementEventHandlerFilter::OnEvent(_U32 iEventFilterId, _U32 iEventId, TEventPipeParam param, void* pKey=NULL)
TTAchivevementEventHandlerFilter其实是TAchievementGroupBase的容器,里面有所有该事件可能引发的成就列表。

TAchievementGroupBase : public TEventPipeHandler

=>TAchievementGroupBase::OnEvent(_U32 iEventFilterId, _U32 iEventId, TEventPipeParam param, void* pKey=NULL)
a. 先判定是否该成就组所有成就是否已经完成。成就是否完成是一个Bit标识,按照AchId排序的Buff
b. 如果没有完成成就组根据事件修改成就组参数
=>TAchievementGroupBase::OnEvent4EventParamModifyAll(_U32 iEventFilterId, _U32 iEventId, TEventPipeParam param, TPlayer* pKey)
a. 根据配置文件的AchGroupDesc里面的ParamSize来计算出来Buff偏移量,获得该AchievementGroup的Buff起始地址
b. 进行配置文件里面的EventParamDesc配置内容进行比较.比较失败则进行下个EventParamDesc比较
c. 如果比较成功,则进行相应的ParamModify配置操作。根据不同的ParamModify进行不同方式的Param修改
d. 把当前的GroupParam标识,标识成脏

在玩家Tick中对于GroupParam为脏的Group进行定时判定2000ms一次
a.如果该GroupParam标识为脏,则发送GroupParam数据库存储请求
b.判定是否已经完成该AchId,如果是,则下一个
c.遍历配置的CompleteConList判定是否该成就完成
d.如果完成,则发送成就完成消息,修改完成标志位

成就系统的数据存储
1.成就是否完成Buff
2.成就完成状况记录Buff

成就系统的初始化
1.成就的Handler初始化,根据配置内容初始化AchGroup到Filter,然后全部挂到Rooter上
2.Player从数据库初始化其两个Buff内容

成就系统的触发
使用事件系统触发。任何事件的触发有效触发者都是Player
1.Player::OnEventXXXX触发事件。产生OnEvent()底层事件
2.OnEvent调用各个Hander进行处理。并且可能调用Instance::OnEvent产生地图事件
3.Handler里面的成就Rooter调用相关的Filter
4.Filter调用所有的未完成的Group进行相应的记录参数Buff修改,并设定标志位

成就系统的完成
Tick中对于脏事件进行判定,并发送通知
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值