本文主要从程序员角度来描述一下MMORPG游戏服务器数值系统的设计,怎么样设计才能好扩展,策划变更需求加一个数值字段,或者调试数值,怎么样才能基本上不需要改动程序,或者少改程序就可以满足策划的需求。
MMORPG服务器的数值系统分为几大块:角色数值,技能数值,物品数值,经济数值等等。可能还有其他数值,在这里我们暂且不讨论。我们只讨论一下 角色数值 和 技能数值,这两个数值系统和游戏的战斗系统息息相关,游戏的平衡性,可玩性就靠他了。数值系统还可以规划为两类,即 数值存储 和 数值计算,我们主要从这两方面来描述数值系统
角色数值系统:
角色的数据比较多,如图
虽然战斗属性比较多,但是需要存储的并不多,我们只需要存储角色当前HP,MP,EXP, 角色装备即可,为什么这样说呢,我们来看一下处理流程图
图中有2个计算表:
EXP表:根据角色数据库中读出的当前EXP,计算出当前等级,力量,体质,耐力等等
Property_table表:这个是最核心的计算表,设计结构看下图
property_table表中只有两项:
属性名: 角色属性名称
计算公式:改属性的计算公式
那我们要怎么样来设计property_table的程序,才能好扩展呢
hash_map<property_node, vector<property_node>> g_property;
数据结构类似于g_property, 每一个属性节点property_node对应一个property_node数组,这个property_node数组记录了该属性节点影响了哪些节点。property_node数组也是一个如下图树形结构
当某一个节点数值改变了后,遍历property_node数组树,调用property_table中的计算公式进行计算
PS:这个树的设计有一个缺陷,如上图节点1不能影响节点2的下层节点,这个可以通过策划进行规避
这样,我们设计好程序后,策划需要增加一个属性,只需要在property_table中增加一个节点,并写出计算公式即可,无需增加额外的代码,至少计算这块是这样的
技能数值系统:
技能数值前期推荐用脚本来做,主要是策划对数值有个调试的过程,数值会经常有改变,如果数据改变后要重启exe的话,那无疑是灾难性的,当然也可以通过其他方式实现,只是脚本更容易嵌入c++中,如lua脚本,和C语法很接近,程序员的学习成本较低,脚本还可以写一些特殊的技能
技能的计算也是依赖于property_table
后期游戏制作完毕后,为了提高服务器效率,可以将脚本直接翻译成c++代码
本文仅仅是粗略的讲了一些设计思路,供大家讨论,如有不足或错误,请指正!