【数值范例】仇恨列表设计

发表于2015-06-10
评论1 3.3k浏览

仇恨系统


仇恨的概念:


  仇恨是游戏中的怪物和NPC用于记录、更换战斗目标的参考数值,是配合怪物和NPC执行AI功能的重要辅助机制。


  1、仇恨值表:只存在于怪物和NPC身上,用于记录已经产生仇恨的玩家角色、怪物和NPC的ID以及对应的仇恨值。如下表:


游戏中某怪物的仇恨列表



仇恨列表辅助参数(每次仇恨表产生变动,该表内的参数都会刷新计算)


  注:一旦怪物身上的仇恨表不为空,怪物就将进入战斗状态,调用战斗AI;一旦怪物身上的仇恨表清空,不但怪物的被仇恨表将清空(告知仇恨该怪物的其他怪物和 NPC 清除仇恨数据),怪物也将脱离战斗状态返回出生点,身上的所有数据也都将返回初始值;在返回出生点的途中,怪物将保持无敌且仇恨表不会有任何操作的状态,直到返回到出生点位置该状态才会消失。



  2、被仇恨表:存在于任何游戏目标身上,用于记录仇恨该目标的怪物和 NPC 的 ID(不记录玩家 ID)如下表:




仇恨自身规则


(一) 仇恨建立


  1、被动建立-主动怪发现:当玩家角色进入到一个主动怪的视野范围,且角色的阵营与主动怪有冲突时,该主动怪的仇恨列表中将自动生成一条该角色的仇恨数据,初始仇恨值=仇恨初值。同样道理,当一个主动攻击的NPC或怪物发现另一个与自身阵营有冲突的NPC或怪物进入自己的视野范围时,也会将该NPC或怪物纳入自身的仇恨列表,初始仇恨值=仇恨初值


  2、被动建立-怪物呼救或召集:游戏中的部分怪物具有“呼救”和“召集”的技能。


  呼救:怪物将自身仇恨列表中的对象ID(不考虑ID所具备的仇恨值),每个赋予仇恨初值点仇恨值,复制添加到一定范围内所有响应该技能的怪物、NPC的仇恨列表中去。此时,若产生响应的怪仇恨列表中本身已经具有被复制对象的仇恨数据,则只是将仇恨初值和原仇恨值叠加;若产生响应的怪仇恨列表中还不具备被复制对象的仇恨数据,则会建立该对象的仇恨数据


  召集:该技能则仅限于具有团队AI的怪物来使用,当怪物使用“召集”技能后,该怪物的仇恨列表将原封不动的复制成为团队内其他怪物、NPC组员当前的仇恨表(将ID和仇恨值同时复制)。此时,视同将这些响应怪的仇恨列表清空一次(实际上并未清空,所以不会使怪物返回初始状态),然后重建一次仇恨表数据


  3、主动建立-普通攻击、伤害或损益技能:当角色(怪物、NPC)对一个暂未建立自身仇恨数据的怪物、NPC进行普通攻击、使用伤害技能或者使用损益技能(包括挑衅类技能)时,该怪物、NPC会主动建立该角色的仇恨数据。


  普通攻击:初始仇恨值=普通攻击对怪物造成的伤害值;


  伤害技能:初始仇恨值=伤害技能对怪物造成的伤害值+技能本身产生的仇恨;


  损益技能:初始仇恨值=技能本身产生的仇恨。


  4、主动建立-恢复或增益技能:当辅助角色A(怪物、NPC)对一个已经被周围怪物仇恨的角色B(怪物、NPC)使用恢复或增益技能时,且若仇恨角色B的怪物身上并没有带有角色A的仇恨数据,那么就将建立角色A的仇恨数据。这可以通过调取角色B的被仇恨表来实现。


  恢复技能:初始仇恨值=治疗技能为对象治疗的值+技能本身产生的仇恨;


  增益技能:初始仇恨值=技能本身产生的仇恨。



  仇恨建立的意义:


  游戏中的怪物、NPC一旦对某角色(怪物、NPC)建立仇恨,就将向该目标发送一条消息,告知该目标仇恨数据已经建立,于是会在该目标的被仇恨表中添加自身的ID。

  与单纯的增加仇恨不同,一旦建立仇恨,都会产生至少1点仇恨初值。


(二) 仇恨变化


  1、主动增加-普通攻击、伤害和损益技能:如果一个角色(怪物、NPC)已经在一个怪物或NPC仇恨表中建立了仇恨数据,那么角色(怪物、NPC)对该怪物或NPC继续进行攻击、使用伤害技能或损益技能(包括挑衅技能),都将主动增加该角色(怪物、NPC)在怪物或NPC仇恨表中的仇恨值。


  普通攻击:增加仇恨值=普通攻击对怪物造成的伤害值;


  伤害技能:增加仇恨值=伤害技能对怪物造成的伤害值+技能本身产生的仇恨;


  损益技能:增加仇恨值=技能本身产生的仇恨。


  2、主动增加-恢复和增益技能:如果一个角色(怪物、NPC)已经在一个怪物或NPC仇恨表中建立了仇恨数据,那么角色(怪物、NPC)对该怪物或NPC仇恨的任何目标使用恢复或增益技能,都将主动增加该角色(怪物、NPC)在怪物或NPC仇恨表中的仇恨值。这可以通过调取目标的被仇恨表来实现。


  恢复技能:初始仇恨值=治疗技能为对象治疗的值+技能本身产生的仇恨;


  增益技能:初始仇恨值=技能本身产生的仇恨。


  3、被动增加-呼救:怪物将自身仇恨列表中的对象ID(不考虑ID所具备的仇恨值),每个赋予仇恨初值点仇恨值,复制添加到一定范围内所有响应该技能的怪物、NPC的仇恨列表中去。此时,若产生响应的怪仇恨列表中本身已经具有被复制对象的仇恨数据,则只是将仇恨初值和原仇恨值叠加;若产生响应的怪仇恨列表中还不具备被复制对象的仇恨数据,则会建立该对象的仇恨数据


  4、主动衰减-特殊技能:角色(怪物、NPC)可以使用一些特殊技能来主动减少怪物或NPC对自身的仇恨值。但技能最多只能将仇恨值降低到1。


  5、极限衰减:所有角色(怪物、NPC)在怪物或NPC处可存储的仇恨值上限均为65535。一旦某个角色(怪物、NPC)的仇恨值达到仇恨上限,仇恨表会执行一次“极限衰减”操作——将仇恨表中所有仇恨对象的仇恨值减半(包括达到上限的仇恨值)并向上取整。


  6、



(三) 仇恨清除


  1、自身清除:当怪物或NPC自身死亡时,会清除自身仇恨表中所有的仇恨ID以及对应的仇恨值。然后给所有仇恨ID发出信息,告知它们清除被仇恨表里的自身ID。



  2、死亡清除:当怪物或NPC仇恨表中某个角色(怪物、NPC)死亡时,会向该怪物发出一条信息(以被仇恨表来实现),让怪物或NPC清除当前仇恨表内自身的仇恨数据。这种类型的仇恨清除同时也包括下线、传送等异常情况。



  3、区域清除:当怪物或NPC当前的仇恨目标——即攻击目标,超出了怪物最大巡视范围时,该目标在怪物或NPC仇恨列表中的仇恨数据将被直接清除。



  4、时间清除:当怪物或NPC当前的仇恨目标——即攻击目标,在一定时间内(初定为10秒)没有让怪物或NPC对自己的仇恨值产生任何增幅(一旦产生增幅或怪物切换战斗目标,该时间就会重置),该目标在怪物或NPC仇恨表中的仇恨数据也将被直接清除。



  5、特殊清除-技能:有一些比较特殊的技能,例如“愤怒嘲讽”,可以对怪物产生极为特殊的仇恨表清除效果——使怪物仇恨表中除当前目标之外的其他仇恨目标的仇恨完全清除。再例如“假死”、“隐身”等技能,可以立刻清除自身的仇恨值等等。


(四) 仇恨表置满


  每个怪物和NPC所携带的仇恨表最多只能同时记录20条仇恨数据;被仇恨表也是一样。一旦仇恨表或被仇恨表置满,那么就不再建立新的仇恨和被仇恨数据,直到其中有数据被清除。(是否考虑在仇恨表里使用排序替换机制?也就是说,每一次发生仇恨表数据变更时,都对所有的仇恨数据进行一次排序,那么如果有新的仇恨建立,可以对仇恨表末端仇恨数据进行替换。)


  仇恨控制目标的规则


  理论上,怪物总是会取仇恨列表中仇恨值最大的目标(角色、怪物或NPC)作为自身的攻击目标。但在实际游戏中,这样的做法会使玩家很快就找到仇恨所产生的BUG,所以我们将采用一套“目标更换事件”机制来加强仇恨的控制作用。该机智主要包括以下一些规则:


  1、仇恨值的变化不会直接导致怪物更换战斗目标,而是间接的通过“目标更换事件”来指导怪物或NPC更换战斗目标;


  2、一旦触发“目标更换事件”,怪物或NPC会选择仇恨列表最顶端(也就是仇恨数值最高)的目标作为自身的战斗目标;


  3、当“目标更换事件”触发时,如果怪物或NPC仇恨列表最顶端有多个目标(即多个目标的仇恨值相同),则会从中随机的抽选一个目标作为战斗目标;


  4、“目标更换事件”触发条件一:一旦怪物的仇恨表中开始有数据存在(即不为空),就会触发一次“目标更换事件”;


  5、“目标更换事件”触发条件二:如果怪物或NPC仇恨列表中“当前战斗目标”和“当前最大仇恨值目标”不同,且“当前第一、第二仇恨值比值”>110%,则会触发“目标更换事件”;


  6、“目标更换事件”触发条件三:一旦怪物或NPC仇恨列表中有一个目标仇恨值达到仇恨上限,即65535时,则会触发“目标更换事件”(注意:该事件会在“极限衰减”过程之前完成);


  7、“目标更换事件”触发条件四:怪物或NPC仇恨列表中,“当前战斗目标”的仇恨值发生衰减或清除事件(不管是因为什么原因),都会触发“目标更换事件”;


  8、“目标更换事件”触发条件五:怪物或NPC在响应“呼救”和“召集”技能或者怪物在受到“愤怒嘲讽”技能时,会立刻触发一次“目标更换事件”(可以通过让技能携带一个具有“目标更换事件”触发功能的脚本来实现)。


  仇恨列表的复制添加和取代


  当怪物响应“呼救”和“召集”技能时,虽然都是对它人仇恨列表的复制操作,但操作方法却是不相同的,下面就来详细说明一下。


  1、呼救响应-复制添加:


  当某个怪物B响应怪物A的呼救时,会复制怪物A仇恨表中所有目标的ID,给每一个ID赋予100点仇恨以后,添加到自身的仇恨表内——如果是自身表内已有ID,则执行“仇恨变化”操作;如果是自身内没有的ID,则执行“仇恨建立”操作,操作完,向该目标ID发出信息,将自身ID添加到目标ID的被仇恨表中。




  2、召集响应-复制取代:


  当某个怪物B响应怪物A的召集时,会复制怪物A仇恨表中所有目标的ID以及ID的仇恨值,然后取代自身仇恨列表——此时,需先向B原有仇恨表内的所有ID发出信息,将自身ID从目标ID的被仇恨表中清除,然后再给B新仇恨表内的所有ID发出信息,将自身ID添加到目标ID的被仇恨表中清楚。(注意:执行第一步时,不能视为完全清除B的仇恨表,避免B因为仇恨表清空而发生数据重置的过程)。




程序需求


  1、所有战斗对象携带被仇恨列表;


  2、仇恨表新增导出参数;


  3、仇恨自身规则运作逻辑;


  4、仇恨控制目标规则运作逻辑;


  5、“目标更换事件”机制判定流程;


  6、仇恨数据的建立和改变判定;


  7、仇恨表建立、清除数据消息发送机制;


  8、恢复、增益技能通过被仇恨列表建立、改变仇恨的机制;


  9、死亡、掉线、传送等情况下,通过被仇恨列表清除仇恨数据的机制。






转载请注明出处


微信公众号:史晓林




你关不关注,好文章都在这里,不离不弃!


你看与不看,我依旧每天发文,无怨无悔!


中国游戏策划界最权威的干货微信公众号!


长按上图二维码也可以关注哦


或者搜索微信公众号:史晓林

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引