北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 16260|回复: 12

武侠mud战斗系统扫盲帖

[复制链接]
发表于 2009-9-8 14:16:19 | 显示全部楼层 |阅读模式
武侠类mud的精髓就在于战斗系统

平砍,busy,物理pfm,化学pfm,buff,大家天天用的,那么这些都是什么,你真的了解吗?

想深入了解武侠mud的战斗系统吗?
来吧,跟我一起来,从代码看起。

先随便去小熊泥苑里去找个武侠类的mud源码下载,能不能跑起来无所谓,我们只是去看看里面的文件。

炎黄为例:
源码解压之后,找到kungfu/skill目录
这个目录下,有很多以技能为名字的.c文件和目录,其中.c文件就是这个技能的平砍描述文件,技能名目录下每个.c文件就是这个技能的一个pfm或者一个exert。
以炎黄的taiji-jian为例
kungfu/skill/taiji-jian.c
里面有很多这样格式的描述:
  1. ……
  2. ([      "action": "$N右腿半屈般蹲,一招「如封似闭」,剑尖虚指,转身撩向$n的$l",
  3.         "force" : 135,
  4.         "attack": 38,
  5.         "dodge" : 185,
  6.         "parry" : 220,
  7.         "damage": 37,
  8.         "lvl"   : 240,
  9.         "damage_type" : "刺伤"
  10. ]),
  11. ……
复制代码

当你在炎黄里用taiji-jian做攻击技能的时候,每次平砍出招的时候,都会随机从这些描述里挑一个满足lvl条件的一招,其中action就是你攻击时的出招描述,force是这一招的加力效果,attack是这一招的attack加成,dodge是这一招的dodge加成,parry是这一招的parry加成,damage是这一招的基本伤害,lvl是出招的技能level要求,damage_type会影响对手中招时的描述,比如刺伤就会是什么对穿而出之类的描述。
每个人物,战斗的时候,都会有一个基本的人物状态,包括attack,dodge,parry,damage等等,战斗平砍的时候,会把随机选出的招式的各种加成效果,加到人物的状态里,用攻击者的某个最终参数,和对手的某个最终参数进行某些算法的判断,判断成功就命中,判断失败就没有命中,命中之后,有一个最终的damage,具体算法,每个mud不同,一般都是在adm/daemons/combatd.c里。大家只要知道,每招的force会影响最终伤害,attack会影响命中和伤害,damage会影响最终伤害,dodge和parry会影响对手对自己的命中等等,数值越大,效果越明显。
炎黄里,taiji-jian的招式很多,但是基本damage都很小,前几招是0,后面的有些是个位数,最高的不过40。
作为对比,看看炎黄里的quanzhen-jian,最小damage是13,最高damage是135。
炎黄的设定和北侠的设定肯定有很大区别,但是taiji-jian作为一种攻弱守强的功夫,在各个mud里都差不多的,伤害非常低……

说完平砍,再来看pfm
pfm一般都是先判断是否满足出招条件,比如技能要求,手里武器要求,内力要求等等,满足条件之后,是命中判断,命中判断之后,是效果计算。
还是以炎黄里的taiji-jian为例:
busy类的chan:kungfu/skill/taiji-jian/chan.c里有这样的代码,其中level是攻击者taiji-jian的级别,可见一般的busy pfm的命中判断都是random(A)> B/C的格式,一般A和B是对等的,比如是双方exp,或者是攻击者的某攻击技能对被攻击者的某防守技能,C是一个系数,决定了同等条件下的命中几率。
  1. if (random(level) > (int)target->query_skill("parry", 1) / 2)
  2.         {
  3.         msg += HIR "结果$p" HIR "被$P" HIR "闹个手忙脚乱,"
  4.                        "惊慌失措,呆在当场,不知如何应对!\n" NOR;
  5.         target->start_busy(level / 16 + 2);
  6.         }
复制代码

后面的start_busy(level/16 + 2)就是命中之后的busy效果,一般是技能除以某个系数,然后加一个基本常数。
再来看物理连招,炎黄里的taiji-jian没有lian,有一个zhuan
物理连招的zhuan:kungfu/skill/taiji-jian/zhuan.c里有如下的代码,先是命中判断,这里的命中判断和chan的略微不同,用了A+random(B)>C的格式。命中之后,会计算连招数量,计算attack加成,然后,连续调用combatd.c里的底层攻击函数,连续攻击一定次数,最后,攻击完成之后,attack加成清除掉。因为这里的实际战斗是由combatd.c里计算出来的,所以是物理攻击,在北侠里是可以被挪移的。
  1.         ap = me->query_skill("sword");
  2.         dp = target->query_skill("parry");
  3.         attack_time = 5;
  4.         if (ap / 2 + random(ap * 2) > dp)
  5.         {
  6.                 msg += HIY "结果$p" HIY "被$P" HIY
  7.                        "攻了个措手不及,连连后退不暇!\n" NOR;
  8.                 count = ap / 10;
  9.                 me->add_temp("apply/attack", count);
  10.                 attack_time += random(ap / 45);
  11.         } else
  12.         {
  13.                 msg += HIC "$n" HIC "见$N" HIC "这几剑并无破绽"
  14.                        ",不敢大意,小心应付。\n" NOR;
  15.                 count = 0;
  16.         }
  17.                
  18.         message_combatd(msg, me, target);

  19.         if (attack_time > 10)
  20.                 attack_time = 10;

  21.         me->add("neili", -attack_time * 20);

  22.         for (i = 0; i < attack_time; i++)
  23.         {
  24.                 if (! me->is_fighting(target))
  25.                         break;
  26.                 COMBAT_D->do_attack(me, target, weapon, 0);
  27.         }

  28.         me->add_temp("apply/attack", -count);
  29.         me->start_busy(1 + random(attack_time));
复制代码

再来看看化学类的pfm,炎黄里的taiji-quan的zhen
化学pfm的zhen:kungfu/skill/taiji-quan/zhen.c里有这样的代码,先是命中判断,和busy的类似,然后是伤害计算,这里是直接计算出damage,然后调用底层的函数把伤害apply到被攻击者身上,因为不经过底层的战斗计算,是直接伤害,所以不可以被挪移。
  1. if (random(me->query_skill("force")) > target->query_skill("force") / 2)
  2.         {
  3.                 me->start_busy(3);
  4.                 target->start_busy(random(3));
  5.                
  6.                 damage = (int)me->query_skill("force", 1);
  7.                 damage = damage / 2 + random(damage / 2);
  8.                
  9.                 msg += COMBAT_D->do_damage(me, target, UNARMED_ATTACK, damage, 50,
  10.                                            HIR "只见$N" HIR "这一拳变化无方,气劲"
  11.                                            "封了$n" HIR "所有的退路,一拳正好命中"
  12.                                            "。\n:内伤@?");
  13.         } else
复制代码

最后再看一个buff类的,taiji-jian的sui
buff类pfm,sui:kungfu/skill/taiji-jian/sui.c里有这样的代码,buff类没用命中判断,只有计算效果,计算持续时间。随字诀是加defense,减attack的,状态更新完之后,加一个temp标记,防止重复buff,然后会调用一个call_out函数,这个函数的意思就是延后xx秒执行,也就是过一段时间之后,就执行remove_effect函数,清除buff效果,并且删除temp标记。
  1.         skill = me->query_skill("taiji-jian", 1);

  2.         me->add_temp("apply/defense", skill / 3);
  3.         me->add_temp("apply/attack", -skill / 6);
  4.         me->set_temp("tjj_sui", 1);

  5.         me->start_call_out((: call_other, __FILE__, "remove_effect",
  6.                               me, skill / 3 :), skill / 3);

  7.         me->add("neili", -100);

  8.         if (me->is_fighting())
  9.                 me->start_busy(3);

  10.         return 1;
  11. }

  12. void remove_effect(object me, int amount)
  13. {
  14.         if (me->query_temp("tjj_sui"))
  15.         {
  16.                 me->add_temp("apply/defense", -amount);
  17.                 me->add_temp("apply/attack", amount / 2);
  18.                 me->delete_temp("tjj_sui");
  19.                 tell_object(me, "你的" SUI "运行完毕,将内力收回丹田。\n");
  20.         }
  21. }
复制代码


这样,各种基本pfm就讲完了,北侠里有些pfm是综合类的,比如yinfeng,比如kuang,无非就是这些基本pfm的组合而已。

讲完pfm,讲讲pfm里的bug,很多bug,都是因为pfm的文件里漏了东西,或者call_out的调用有问题。
用了pfm自身没busy的,那是因为代码里忘了加自身的busy惩罚

某些pfm必中的,那是因为命中判断里忘了加random
某些buff效果,用了以后没有call_out或者call_out的参数和开始加的参数不一致,或者没有加temp标记的,就造成了无穷buff的bug
等等等等
本文只是一个武侠类mud的战斗系统的基本介绍,只是一个参考,看不到北侠的代码,没法具体讲解,所以,看看就行了,请不要拿炎黄的代码来评论北侠……

评分

参与人数 1精华 +30 收起 理由
icer + 30

查看全部评分

北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-9-8 14:31:02 | 显示全部楼层
不错,他山之石,可以攻玉。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-9-8 14:33:44 | 显示全部楼层
怎么不以北侠为例呢??
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2009-9-8 14:47:22 | 显示全部楼层
如果我知道北侠的代码,如果我把北侠的代码泄漏出来,你说icer会不会杀人灭口?
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-9-8 15:48:05 | 显示全部楼层
原帖由 liangyijian 于 2009-9-8 02:47 PM 发表
如果我知道北侠的代码,如果我把北侠的代码泄漏出来,你说icer会不会杀人灭口?

其实这是令我比较困惑的
不知道有没有人玩星际争霸,呵呵
星际争霸里面,兵种攻击、科技树、建筑时间、攻防加成、各种参数,都有写得清清楚楚,玩家还是很多
游戏也生存了10多年了,照样玩的人很多。
mud把所有战斗参数、武功参数隐藏起来,10年下来,已经玩者寥寥。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-9-8 16:04:18 | 显示全部楼层
逻辑错误,玩mud的人少是因为人们更喜欢图形界面,现在玩mud的都是有点知识分子的臭风雅的。
玩图形游戏讲究的是反应,追求的是刺激,所以技术性的参数什么的可以公开。
        玩mud讲究的是反展路线和功夫组合,追求的是文字之外的意境,要是都告诉你了还有什么意思?毕竟玩mud跟玩图形游戏的方法是不一样的,你用玩图形游戏的方法玩mud,肯定觉得约束多多,缺少乐趣。
          话说回来,象图形游戏那样,人物发展路线都是一样的,到最后就拼装备,拼rmb,也确实没什么意思。

原帖由 liss 于 2009-9-8 03:48 PM 发表

其实这是令我比较困惑的
不知道有没有人玩星际争霸,呵呵
星际争霸里面,兵种攻击、科技树、建筑时间、攻防加成、各种参数,都有写得清清楚楚,玩家还是很多
游戏也生存了10多年了,照样玩的人很多。
mud把所有 ...
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-9-8 16:26:46 | 显示全部楼层
原帖由 liangyijian 于 2009-9-8 14:47 发表
如果我知道北侠的代码,如果我把北侠的代码泄漏出来,你说icer会不会杀人灭口?

咱虽然没泄露,但话有点多,picewolf已经有灭口的倾向了,flee……
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-9-8 16:52:00 | 显示全部楼层
虾米意思哦
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-9-8 17:31:54 | 显示全部楼层
我抗议!我抗议楼主这种无视我们这些电脑盲的自尊心的行为!!!!!
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2009-9-8 19:40:24 | 显示全部楼层
原帖由 ajump 于 2009-9-8 05:31 PM 发表
我抗议!我抗议楼主这种无视我们这些电脑盲的自尊心的行为!!!!!

严重同意!!!
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-30 08:08 PM , Processed in 0.016640 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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