基本所有MMO游戏无论是回合制、策略类、即时战斗等等类型都需要有相应的技能系统,所以技能系统有一定的通用性和可复用性,但每种类型的游戏也会有自己的特点,不过万变不离其宗,本文结合自己参与开发并在公网运营两年以上的两款游戏,分别为一款SLG策略游戏和一款即时战斗类游戏,阐述下技能系统的实现方法,方法并不是最优的,但已经实现并经过外网运营几年时间的检验,相信会有一定的参考性。重点讲述即时战斗类的技能实现方法,因为即时战斗类的技能实现相对来说更加复杂和需要考虑的地方更多
技能系统都会有多样性,如果都是一样类型的技能那可玩性必然太低,大体上分类包括、1、立即触发类 2、火球、飞弹类(需要经过一定的飞行距离:火球术、冰箭术)3、触发相应的状态(如:战吼,施放后增加自身的攻击力) 4、回城类 5、骑乘类 6、捕捉宠物 7、采集类等生活技能 8、复活类 9、飞行类(施放成功后传送到指定的地点或者召唤某人到自己身边)等等,其中根据游戏类型有些技能可以合并和再细分,目前先以这个做为讨论
技能虽然需要划分为不同的种类,但同时基本会有一些通用的属性,尽量提取更多的属性进行基础熟悉的定义,例如做技能基础表格的定义。
(1)所属职业(战士、法师)
(2)技能自我否定类型(魔法是否足够、是否冷却中、是否被沉默、是否被致盲….)
(3)技能目标否定类型(施法距离是否合法、宠物否决、公会成员否决、BOSS否决)
(3)关系过滤(0对所有关系都有效,1只对夫妻有效2只对队友有效果…)
(4)技能施放目标(1自己2宠物技能跳向主人3夫妻传送等)
(5)技能种类
(6)打断方式:0移动,1死亡,2普通攻击,3技能攻击,4被攻击,5使用物品
(7)移动锁定
(8)技能主被动类型(0主动攻击技能,1主动辅助(加BUFFER)2攻击时触发的技能3被击时触发的技能4被动辅助5替宠物施放技能)
技能一般都会有不断学习进化的过程,所以需要定义技能等级学习需要消耗的资源,以及每一等级技能提升的效果
(1)冷却时间
(2)吟唱时间
(3)触发机率
(4)结算公式(下面再详细说明)
定义好技能的种类和基础属性以及等级属性之后,自然需要实现技能的施放和施放后带来的各种状态的管理,例如buffer和Debuffer等等的变化
定义技能施放基础的属性和方法
基础方法:开始施放,施放过程每次循环触发,施放完成,被打断
基础属性:打断方式、延迟时间,基础属性通过上面的读表获取
所有技能可以承该类进行特化,定义技能特有的逻辑
例如
复活技能:CSkill_Relive:public cSkillBase
施放前触发DoStart()通知目标玩家是否同意被复活;DoFinish复活目标玩家
飞行技能:class CSkill_FlytoOther : public cSkillBase
施放前触发DoStart()检查目标玩家和施放源是否存在;DoFinish根据目标玩家的位置, 传送到目标玩家身边
技能施放流程:
基础状态类:状态属性定义
最大个数
状态效果(不能移动1,禁魔不能施法2,隐身3,不能攻击4,无敌5,GM无敌6强行攻击状态的释放者7,变身状态8,次数盾9,伤害盾10,附加伤害11,附加被伤12,13魔法盾,14完全闪避)
是否允许打断
是否需要保存
打断方式
效果类型(一般技能0,DOTHOT状态1,控制状态2,经验4,挂机BUFF5,骑乘BUFF6,变身BUFF7,回血8,回魔9,无敌10,嘲讽11,盾12,法器BUFF13,沉默14;怪物一般技能20,DOTHOT状态21,控制状态22,经验24,挂机BUFF25,骑乘BUFF26,变身BUFF27,回血28,回魔29,无敌30,嘲讽31,盾32,沉默34,隐身35,公会技能)
持续时间
持续次数
间隔时间
结算方式(0下标结算,1公式结算,2间隔释放技能)
属性变化:(状态改变人物的属性)
状态管理(定时轮循)
定时刷新人物身上的状态,根据状态的间隔时间计算触发每次状态的结算,并且根据结算的类型进行相应的计算:每次触发EachTime例如(目标玩家踩到了陷阱则中了陷阱状态,每隔5秒钟扣取5%的血量),状态结束触发DoFinish
有了技能的施放和状态属性之后,可以进行技能的施放。
DoSkill基本的检查(例如:职业匹配、读者技能表格基础属性、寻找范围内目标、触发打断其他技能)
检查通过后,加入技能施放管理状态(根据DoSkill搜寻的目标设置状态的目标群、设置状态的表格数据、持续次数等)
之后由3.2的状态管理器定时进行状态的结算
一般结算公式是数值策划发挥的地方,技能数值是否平衡,关系到整个游戏的可玩性,
使用Xml格式,打造技能公式编辑器,然后为了效率,生成cpp代码,这样可以有编辑性的同时也不牺牲效率
例如战士冲锋结算公式:分别代表
扣取技能释放者指定的魔法值
增加技能释放者xp(大招的能量值)
增加技能承受者xp