洛克精灵战记战斗系统实现
一丶概述
洛克精灵战记是一款战斗冒险类社区游戏,属于全区全服的页游架构, 其战斗系统类似于刀塔传奇形式的, 战斗由C++实现为核心逻辑库,前端采用flash的alchemy技术转成flash库,驱动前端战斗表现,并在战斗结束后在服务器重算战斗过程并校验作弊。本文主要针对其战斗系统的实现阐述,也是笔者的一种学习总结。
二、后台架构介绍与战斗流程
洛克精灵战记后台架构:
战斗服务器部署在大区服务器,无状态,支持水平扩容,为缓存落在该大区的玩家服务。反作弊战斗流程如下:
从上图中可以看到客户端需要进行战斗表现,并且可以接受玩家的输入内容进行正确的战斗逻辑计算。而战斗结束后将对阵信息、玩家的输入内容提交到战斗服务器进行复盘校验。如果校验通过则认可其战斗结果。这里有一个问题, 由于服务器需要做完整的复盘运算,客户端与服务器采用完全不同的语言编写,战斗表现如何才能与服务器的计算结果完全一致?答案将在本文第三部分阐述..
下图是战斗时序图:
这里可以看到客户端与服务器都存在业务逻辑层, 实际上这是开发运营活动与应用时需要面对的内容,而战斗模块是为其服务的具体战斗核心部分。
三、战斗系统框架
上文中提到为了防止玩家作弊,服务器会对每个单局进行完整的复盘运算,我们遇到两个问题:
1. 服务器复盘强校验,客户端与服务器采用不同的编程语言,如何保证演算的一致性
2. 每个战斗逻辑都需要前后台编写,大量重复工作
我们将战斗核心逻辑和战斗表现进行剥离,战斗核心逻辑使用C++编写以保证性能,服务器与客户端使用同一份代码逻辑以保证双方的计算结果一致,并且也避免了相同逻辑的再次重复实现。使用flash的alchemy技术将战斗核心库编译成flash支持的swc库。
3.1. flash, alchemy
FlasCC 提供了一个完整的类 BSD、基于 GCC 的C/C++开发环境,允许开发者将C/C++代码编译为可在 Flash 平台(Flash Player 和 AIR)上运行的应用程序。通过 alchemy,可以将大部分现有的C/C++代码移植到网络中,并实现跨浏览器,关于alchemy的环境搭建这里不做过多阐述。
战斗核心中只涉及到逻辑运算,不做任何表现相关的处理。为了让flash客户端进行展现正确的表现展示,我们在每一帧计算中抛出相应的事件,比如技能释放、buff效果、血量变化等。客户端每进行完一帧计算后获取事件列表进行完整的表现。
典型宠物技能流程涉及的事件列表如下:
/*
* 1.PET_ACTION_CHANGE: ACTION_SKILL,开始起手动画
* 2.(远程或无锁定技能)CREATE_ITEM(1):
* 3.PET_ACTION_CHANGE: ACTION_HURT:命中。播放受击动画(如果是伤害类),技能命中特效
* 4.(技能效果有buff)ADD_BUFF, (技能效果修改数值)PET_ATTR_CHANGE
* 5.PET_ACTION_CHANGE:IDLE,技能动作完成
*/
移动流程涉及的事件列表如下:
* 1.PET_ACTION_CHANGE:ACTION_WALK,开始移动
* 2.PET_ATTR_CHANGE: MOVE_SP,通知移动速度
* 3.PET_ACTION_CHANGE:IDLE,停止移动
3.2.技能与buff系统
战斗系统的组成部分是技能与buff系统, 其处理流程如上图所示。 为了快速验证与修改技能,我们制作了技能编辑器,编辑器链接和游戏相同的战斗核心库, 使用编辑器进行战斗模拟以反复修正数值和战斗逻辑,编辑器导出相应的技能数据提供给游戏前后台运行时使用。
四、结语
精灵战记的战斗系统是一种典型的卡牌类战斗,将战斗核心的逻辑与表现分离,使用 alchemy使得同样的战斗逻辑能被同时用于客户端与服务器以及技能编辑器,解决了前后台运算的一致性问题,同时也避免了重复的代码编写工作。