本文主要从一个程序员的角度阐述一下mmorpg服务器技能系统的程序框架设计,最近在做这个,就当做一个总结吧,其中某些概念可能没有解释清楚,欢迎大家拍砖讨论
1.Anlysis
1.1技能的概念
技能其实是战斗系统的一个组成部分,战斗基本上都可以由技能触发,技能系统实际上就是一套完整的逻辑,
我们用Table(表格)来设计,将技能的 逻辑用属性 字段 抽象出来,然后依据属性字段来控制逻辑,策划人员可以通过更改属性字段来配置出不同的逻辑属性
2.Desgin (设计技能)
2.1设计时需要关注的东西:
1. 数据调整灵活性:
技能中存在不少的数据,如吟唱时间,CD时间,伤害, 防御等等.这些内容也并不是策划依靠经验一次就可以设定好的,需要在游戏测试或运营时做不断的调整,这部分数据将可能经常变动.
这里我把策划提供的数据分为两个部分,一个是基本数据,这里包含技能的基础数据相对来说比较稳定,这部分将以文本的形式体现,二是可变数据,这里是最容易发生变化的内容.并且会涉及技能的相关计算.这部分以脚本形式体现,并且技能脚本涉及部分逻辑运算,如学习技能条件,释放技能条件及技能释放结果等
2. 服务器的性能:
服务器性能这里包括两方面的内容,一个是网络流量的影响,第二个是运行的效率
针对减少网络流量我采用以下方式: 技能基础数据和技能脚本在服务器和客户端都会保存一份,其中客户端技能脚本是服务器端的子集,这样的话我们初始化的时候,客户端和服务器都会把技能基础数据先读取进来,注册进游戏逻辑中,这样保证了客户端和服务器技能信息的交流只通过ID就可以完成,将大大减少网络传输.技能脚本在客户端存在的意义在于对于我们需要执行技能的时候,比如说学习,释放等.客户端先验证是否能够执行.如果不能执行就在本地做相应处理,这样也可以将数据传输量尽量减少.
在技能相关逻辑运算方面我采用下面方式: 玩家或NPC等身上都挂有技能列表,每个技能都是对已注册的技能的引用,技能脚本只提供部分逻辑运算,大部分在C++中完成,脚本涉及的函数以回调C++中函数的方式实现
3. 安全性:
这方面内容主要涉及如何保证数据的完整性,正确性与统一性,如何防止用户做弊等等相关内容.
技能逻辑必须在服务器执行.
2.2技能属性 与 表格属性字段的设计
为了减少冗余,我们将技能属性字段设计在4个不同的表中
Skill表: 技能表的入口表,包括cast表,buffer表,op表,技能的释放需求,伤害
Cast表: 技能的释放过程表,包括技能吟唱时间,技能命中距离等等
Buffer表:各种人物状态,静态和动态的光环,效果等等
Status表:角色状态表,角色在状态下能使用或被使用的技能或者buffer
op表: 技能的伤害计算公式
skill表字段设计:
名称:技能名称,如火球术
技能id:技能id值
技能名称id:技能系,id一样表示一个系技能
技能类型:加血、物理攻击、魔法攻击、buffer、地图技能
公共CD时间:多个技能可以共cd,比如所有吃药技能
CD时间:cd时间
CD保存类型:cd时间在人物下线后是否保存数据库
需要角色等级:角色等级需求
角色状态限制:使用技能的角色状态限制,这个字段需要斟酌以后重新设计成一个表格
需要武器:技能释放需要的武器类型,如弓,刀,剑等等
消耗类型:需要消耗,如hp,mp,xp等等
消耗数量:hp,mp,xp的消耗数量
是否有益:是否是有益技能
技能属于:生活技能、装备技能、职业技能等等
升级技能:改技能的升级技能
调用cast表:调用cast表的id号
调用describe表:调用技能描述表id号
影响形状:范围技能的影响范围,直线、圆、扇形
影响个数:范围技能影响的npc个数
Buffer1:技能触发的buffer1
概率1:技能触发buffer1的概率
Buffer2:技能触发的buffer2
概率2:技能触发buffer2的概率
伤害效果:技能产生的伤害
调用op表计算效果:op表中数值计算的公式
是否产生伤害仇恨:是否产生仇恨值
携带仇恨:技能产生的仇恨值
cast表字段设计:
名称:cast表对应技能名称
是否对地释放:是否对地释放
是否对他人释放:是否可以对他人释放该技能
是否对自己释放:是否可以对自己释放该技能
是否前摇打断:前腰是否可以打断
前摇时间:动画前摇的时间
飞行时间:魔法的飞行时间
持续施法时间:技能的施法时间
吟唱时间:吟唱时间
释放距离:释放技能距离目标的距离
技能命中:技能命中率
命中最大距离:指向型技能当目标出了fire区域就不受攻击了
buffer表字段设计:
名称:对应skill表中的技能名称
Id:buffer id
效果nameID:表示一个系列的buffer
类型:静态、动态、状态buffer
是否有益:是否有益处
角色状态:加了buffer后角色处于的状态,如沉默,天神下凡,嗜血等等
伤害效果:buffer的伤害
调用op表:指向op表中的公式id
动态次数:对应动态buffer生效次数,对静态buffer无效
生效间隔:对应动态buffer每次生效的间隔时间,静态buffer无效
持续时间:对应静态buffer的持续时间,-1表示永久buffer
产生buffer:某些 buffer可以给队友或敌人加
影响范围:buffer影响的范围
是否可以移除:对应驱散技能
移除类型:对应驱散技能等级
是否可以覆盖:同类型buffer是否可以覆盖,还是效果叠加
覆盖类型:大的覆盖小的
是否需要from:计算效果时是否需要buffer来源
status表字段设计:
状态名称:角色的状态名称,如沉默,死亡,天神下凡等等
状态id:角色状态的id号
角色动作最大值:在该状态下可以使用或者被使用的技能的最大值,如无敌不能受伤害
角色动作最小值:在该状态下可以使用或者被使用的技能的最小值,如无敌不能受伤害
状态最大值:在该状态下,可以被使用buffer的最大值
状态最小值:在该状态下,可以被使用buffer的最小值
不涉及数值计算的模块的话,技能系统的表格属性字段基本上设计好了,下一篇文章我们讨论一下技能程序框架的设计