游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8733|回复: 21

[讨论] neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

[复制链接]

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
发表于 2007-5-26 01:02:00 | 显示全部楼层 |阅读模式
标题党教育我,标题一定要起的很讨打地那种,人气才会高。



继续yy,坚持胡思乱想,努力迈向精神分裂四个现代化~

按照惯例仍然先把问题摆摆

现象描述,问题分析
从很久以前的SLG,到现在的泡菜,无论职业名称怎么叫,基本都可以分为这三大体系——近战,攻击型法师(弓手之类其实都可以归为此类),治愈型法师。

越来越多的游戏引入了仇恨系统,NPC怪从过去的随机揪着一个就打变成有选择地打。在这样的职业体系和仇恨系统下,发展出来的战略自然是:肉盾拉仇恨,攻击法师砸魔法,治愈法师补肉盾。

这样的情况下会有一个后果,就是逼迫战士修炼技能朝着肉盾方向,牧师朝着护士方向,到了最后,(A),发现这样的修炼使得k怪的角色完全不适合PK,(B),pve的战术完全不适合于团队PVP。比如,战士管你怎么拉仇恨都没用,pk的时候,一窝蜂上去先把牧师菜了再说。(C),NPC怪完全无法利用战术配合,比如NPC怪有一个战士+一牧师,大家也是上去几下先轮掉NPC牧师。

总结历史

先看看各个经典作品中的做法

wow,牧师得到很大增强,即使是单p也能独当一面,不过强悍得都不像牧师了。

ffxi,完全不允许Pk。

天堂2。 治愈型角色技能分两系,有治愈技能,同时也有高攻击系法术,主要看玩家朝哪个方向修炼,给玩家修成平衡性角色的机会。不过如果玩家修的是纯护士类型,估计没啥可p的。这个“允许两个以上发展方向”的做法也是大部分游戏的做法。

激战,感悟最深的就是NPC(玩家一方雇佣的)和尚冲得贼猛然后死的贼快 ...[em10]

NPC战术方面,做法都差不多了,NPC法师的血,完全不比NPC战士怪的血少多少,强悍得匪夷所思,非常耐打。

不能说这样有什么不好,只是觉得,既然是角色扮演,要是牧师就像个牧师应该会更好些,尤其是NPC的牧师。

为此我曾经设想了N个方向,以下是最早想到的一个做法,其实这个想法最直接,绕的弯也最早,所以是最容易想到的。读到这里,我估计观众们自己都想到了。

双向仇恨系统

既然NPC能记住谁给予他们最大的伤害,以此为仇恨值来指引他们攻击特定目标,为什么玩家就不能记住仇恨值呢?

因此,我设想玩家的对象中也维护一个列表,保存最近的战斗过程中的敌对目标的仇恨值,其计算方式与NPC计算仇恨值的公式完全一致。

唯一有点区别的就是,NPC的仇恨值是个不断增大的标量,然后AI算法找出标量最大的那个目标,作为攻击目标即可。

而玩家维护的仇恨值列表,每个对象的取值范围都是[0,100]区间之间,是个百分率。初始化的时候,对目标的仇恨是50%。如果对某个目标的仇恨升高了,则必然对另一个目标的仇恨降低。

举例,玩家小明组了一支五人小队,同时跟4个NPC怪物k(跟玩家组成的敌人队伍也是类似),npc中有战士一名,牧师一名,攻击法师2名。初始,小明对每个怪的仇恨都是50%,现在NPC战士来了个重劈,砍掉玩家200点血,玩家很愤怒,因此对这个战士仇恨值上升4点,于是对牧师仇恨降为49,对法师A降为49,法师B降为48(没办法,零头)。

过了一会,那个肉盾NPC战士终于惨死了,当时他的仇恨度为70,法师AB各为55,牧师20.
那么仇恨度会根据剩下三个敌人的当前比例,重新分配。结果就成了法师为64,63,牧师为23.

仇恨度作用

玩家的仇恨度当然不只是拿来看的,它影响玩家对敌人各个不同目标的命中和伤害加成。

对于50%的目标,当然命中和伤害都是默认的。如果对敌人目标的仇恨超过了50%,则命中上升,伤害上升。反之,低于50%,则命中下降,伤害也下降。

UI表现
鉴于玩家的敌对目标个数不定,因此拥挤的HUD上面只能简单显示2到3个仇恨排前的,便于玩家点击来快速切换攻击目标。仇恨度以仇恨槽的方式显示,类似血槽。同时,玩家当前选中的攻击目标,也会显示仇恨槽。低于50%,显示蓝色(或许绿色,这个细节跟UI设计师商量),高于则是红色,并且带渐变(仇恨越深越红)。



总结
在玩家一方也引入了仇恨系统后,玩家如果执意要先轮死低仇恨的牧师,不得不冒着高miss和低伤害的风险。这样,一定程度上可以让pk或者npc的队伍中,肉盾也像个肉盾,牧师也专心做好个牧师了。

不过这样一来,很有可能使得pk的过程加长(比起以前,牧师有更多机会加血了)所以需要数值很好的调整每个技能(尤其是加血技能)所导致的仇恨度。

攻略心得

战斗开始之初,敌人每个都是50%的仇恨度(牧师也是),趁着对方的战士没有反应过来之前(还没开始拉仇恨),赶紧多轮几下那些孱弱的法师牧师吧。  
[em20] [em21]

3

主题

645

帖子

673

积分

高级会员

Rank: 4

积分
673
发表于 2007-5-26 01:28:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

极大增加数据量和计算量啊兄弟。。。而且于游戏乐趣方面并无明显效果

7

主题

752

帖子

756

积分

高级会员

Rank: 4

积分
756
QQ
发表于 2007-5-26 03:08:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

以人性的正常状态下,杀红了眼的时候,哪还有时间分辨敌人的仇恨度?是敌人都杀了~~所以我认为怒值共用一条就行了(敌人亦同),一如格斗游戏一样,到一定程度就能使用爆击或者什麽特殊攻击,这样你要的效果有了,也能有效减少SERVER的运算负荷。

20

主题

903

帖子

977

积分

高级会员

Rank: 4

积分
977
QQ
发表于 2007-5-26 13:49:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

其实是ai不够造成的,以后算法改进了会解决的,双向仇恨...基本上没有玩家会理会的

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
 楼主| 发表于 2007-5-26 13:55:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

回二楼,我也知道初一看的人就会认为极大的增加了计算量。其实没有这回事。玩家这边的仇恨计算量跟怪物那边的仇恨计算量是差不多的。所以只是增加了一倍而已。
假如游戏有3000人在一个gameserver里面,在某一秒内,正在战斗的有多少呢?估计顶多2000人。然后每一次攻击——即便是间隔时间最短的普通攻击——间隔也有1秒左右。

1秒内,有2000人发动了一次攻击,导致修正仇恨值,这样的计算量对服务器来说基本是没有任何感觉的。顶多不到100万个时钟
周期,不到千分1的消耗。

然后说到server2client通信,很好,仍然可以按每秒send一个仇恨值update的数据包就ok了。

最后再来看,如果对面的敌人只有1个,很显然仇恨永远都是50%,不需要任何仇恨值update操作。

单k一个怪,1v1pk是游戏里面最常见的行为,保守估计,50%属于这种行为。
再这么一看,原先的系统消耗的估算都是太悲观了。

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
 楼主| 发表于 2007-5-26 14:07:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

回四楼。改进Ai算法,那个对服务器的资源占用比仇恨系统要高得多。

现在,并不是AI算法太烂(大家玩过quake4,cs2的可以对比一下)。现在网游采用的AI算法,即便是初学者
也能写出来,代码用不了100行。大家觉得RTS的电脑还比较傻,不过RTS的AI复杂度至少是mmorpg的100倍以上。
所以问题并不在于能不能改进算法,而是服务器能不能扛得住。

如果是单机游戏,我可以让怪物NPC每人拥有10个以上的技能,然后随机应变,根据敌人的职业,抗性,移动速度,技能侧重等等随机应变采用不同的技能进行攻击,甚至可以完全拟真
玩家的操作,比如弓手和法师的hit and run,放风筝。既然我能把外挂写成那样,那么我把NPC写成那样也没啥奇怪的。不过这样一来,维护两百个NPC的AI估计已经100%cpu了。


在硬件能力上去以前,采用更复杂更拟真的AI算法是完全不现实的东西。

52

主题

637

帖子

1420

积分

金牌会员

Rank: 6Rank: 6

积分
1420
 楼主| 发表于 2007-5-26 14:59:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统


//class CharObject;
//class NPCObject:public CharObject;
//class PlayerObject:public CharObject;

RCode NeGameEventManager::OnAttackMsg(AttackInfo* info,DWORD srcid, DWORD destid)
{
      CharObject* src  = CharManager::GetSingleton()->GetObjByID(srcid);
      if(NULL == src) return R_SKIP_OPERATION;
      CharObject* dest = CharManager::GetSingleton()->GetObjByID(destid);
      if(dest==NULL ) return R_SKIP_OPERATION;
        HateObject* ho= dest->FindHateObject(src);
        if (NULL == ho)
        {
                ho=dest->AppendHateObject(src);
                NeGameEventManager::GetSingleton()->RegisterNotify(ENEMY_DEAD_NOTIFY,dest->GetID(),src->GetID());
                DWORD nHateCnt =  dest->GetHateObjectCnt();
                ho->SetHateVal(ho,50 );       
        }
        if (1>=nHateCnt) return R_OK;

        DWORD hv= SkillManager::GetSingleton()->SkillToHate(info);

        ho->UpdateHateVal(ho, hv);

        return R_OK;
}



struct HateObject
{
    CharObject pEnemy;
        DWORD dwHate;
};
void CharObject::UpdateHateVal(HateObject* ho,int hv)
{
        if (1 >= GetHateObjectCnt() ) return ;
        NeList<HateObject>::Iterator it= m_hateList->Begin();

        DWORD avr= hv / (GetHateObjectCnt()-1);
        ho->dwHate += hv;
        while(it!=m_hateList->end())
        {
                if (it->Second!=ho)
                {
                        hv-=avr;
                        it->Second.dwHate-=avr;
                }
        }
        ho->dwHate-=hv;
}

3

主题

645

帖子

673

积分

高级会员

Rank: 4

积分
673
发表于 2007-5-26 15:48:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

首先做新东西的时候,你需要确认这个东西真的能解决一些问题,而且这些问题真的是个问题。你的问题有3个:(A),发现这样的修炼使得k怪的角色完全不适合PK,(B),pve的战术完全不适合于团队PVP。比如,战士管你怎么拉仇恨都没用,pk的时候,一窝蜂上去先把牧师菜了再说。(C),NPC怪完全无法利用战术配合,比如NPC怪有一个战士+一牧师,大家也是上去几下先轮掉NPC牧师。

但是,你这些问题的提出本来就不合适。A,K怪的角色不适合PK,这是角色发展的可选择性,本身就是一个用来延长游戏生命周期的玩点,这和你的双向仇恨有什么关系,双向仇恨能让K怪的角色适合PK?即便可以,那你这个系统也首先要被砍掉,因为他让游戏短命,他在塑造全能型的玩家。

B、C:你的双向仇恨产生的效果倒是使PVP不得不象PVE了,PVE也不得不按部就班了,但这么一来到底游戏得到了什么好处?除了让战斗单一,降低了PVP战斗的技巧性外,没有带来乐趣。而且,PVE之所以不让怪物有类似于玩家的AI,不仅仅是计算量问题,还是一个对玩家的包容性问题。你要让怪物面对玩家时优先攻击牧师,简单得很,规定仇恨列表中牧师职业永远在最顶端就是了,为什么不这么做?高技巧的精英玩家永远是金字塔顶的一小撮,如果一上来就碰到一个高AI的怪物硬盯牧师而对仇恨控制视而不见,你猜几个玩家能生存下来?PVP和PVE定位是不一样的,PVE要让大部分玩家都能赢以获得成就感,但PVP两边都是玩家,就需要各凭本事,硬性把两个根本不同性质的东西放在一个定位上实在是大错特错。

另外说说数据量和计算量的问题,首先在每个玩家身上多了张仇恨表除了你说的每次攻击的更新外,还有怪物的死亡,AOE技能的影响,怪物脱离战斗,都需要对表进行操作,如果组队玩,与队友发生战斗的对象也可能要加到表里去。更麻烦的是,你让每个怪物的仇恨变化都直接影响其他怪物,意味着哪怕是最基本的一个怪物对你进行一次攻击,也需要遍历整个仇恨表,而且你这样的算法非常不精确,你自己也说了“对牧师仇恨降为49,对法师A降为49,法师B降为48(没办法,零头)”而实际上这三个对象的仇恨应该是一样的,一般仇恨都采用整数数值累计的形式,而不会采用总量固定的百分比分配。

3

主题

645

帖子

673

积分

高级会员

Rank: 4

积分
673
发表于 2007-5-26 16:07:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

楼主你向往标新立异本来没有错,但需要更多得了解游戏。

比如之前你的两个设计,连咒系统可以作为小玩点,但你开发他的意义却不大,因为CD可以很好得解决你提出的初级技能无用的问题。而自虐系统,则很有成为游戏毁灭者的潜质。

28

主题

3250

帖子

3262

积分

论坛元老

Rank: 8Rank: 8

积分
3262
QQ
发表于 2007-5-26 16:53:00 | 显示全部楼层

Re:neelkey 惊天地泣鬼神YY 第三节 双向仇恨系统

同意8楼的,没必要把PVE和PVP往一样那弄,这本来就是选择的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-4 13:28

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表