西游记功夫浅析(上)
村长(shamash)
一点废话
第一次接触这个游戏的时候是2000年,当时正是大二,随同学一起在清华站玩。那时还没有图形界面的网游,这个已然是当时最先进的网络游戏。玩了不到两年吧,清华站关了,以后就没再碰过mud。之后沉迷了一阵子everquest和world of warcraft,但是mud的那种感觉却始终萦绕心头。经常有朋友看到我摆弄一屏幕的文字感到不可理解,我的解释是,人的想象岂是几个3D模型就可以表现的?06年来到美国,无意中发现西游记总站还在运营,而且人还不少,高兴之余就注册了号。后来因为太忙就没怎么玩,最近才又开始捡起来,但是练得挺慢,现在才练到100来级。这一阵子看到多了些新人,很是高兴,这个古老的游戏,如果不是曾经玩过,真是太难吸引人了。平时喜欢翻看源码,有点心得,希望能对大家有点借鉴。这篇东西,主要是从我自己认知的角度来谈一下各种功夫,欢迎大家批评指正。这里面除了月宫的功夫,如果没有提到的,基本都是我觉得比较普通,不值一提的。
方寸
方寸最有名的当然就是地球人都知道的......小无相功,想当年,鸠摩志凭借此功模拟少林七十二绝技,威震武林......错了错了,说走嘴了,是千钧棒。千钧棒,真叫好,一头大了一头小,霹雳打出跑不了,乾坤一下好不了。千钧棒的妙处虽然基本尽人皆知,但我还是想啰嗦两句。qianjun-bang的perform霹雳三大和乾坤一棒都没有busy,后面可以接其他的perform或者cast,这就是最流行酷招p6的来历,想当年我在清华站混得时候,就没学会这个,用的pili+sheshen,也还对付。网上关于千钧棒有一种说法,说pili是打busy的招,就是平时用没多大效果,但是对方一旦busy了,就很有效。确实是这么回事,下面来看一下pili的源码。
message_vision(HIC"\n$N运足精神,身形一转,霹雳间连续向$n攻出了三招!\n"NOR,me,target);
me->set_temp("QJB_perform", 4);
COMBAT_D->do_attack(me, target, me->query_temp("weapon"));
me->set_temp("QJB_perform", 1);
COMBAT_D->do_attack(me, target, me->query_temp("weapon"));
me->set_temp("QJB_perform", 6);
COMBAT_D->do_attack(me, target, me->query_temp("weapon"));
(“QJB_perform", 4)是指用千钧棒里面的第四招(从零开始算的),就是这句("$N使出「醉闹蟠桃会」,脚步跄踉,左一棒,右一棒,\n打得$n手忙脚乱,招架不迭",)。下面(COMBAT_D->do_attack(me, target, me->query_temp("weapon"));)调用战斗函数,对对手做一次攻击。那霹雳三打的功能就很明显了,就是在瞬间连续普通攻击三次而已。下面看看combatd这个战斗函数,这个函数比较长且复杂,读起来很累,只需要注意这个就行
ap = skill_power(me, attack_skill, SKILL_USAGE_ATTACK);
dp = skill_power(victim, "dodge", SKILL_USAGE_DEFENSE);
if( victim->is_busy() ) dp /= 3;
在后面的判断中,经常用if( random(ap + dp) < mod_val ) 来判断击中否,就是说,如果对方在busy,那么普通攻击的命中就会提高,那连续三下普通攻击的命中当然高了。这就是为什么说pili是用来打busy的。
至于qiankun,类似,
me->set_temp("QJB_perform", 7);
COMBAT_D->do_attack(me, target, me->query_temp("weapon"));
调用了千钧棒法第7招
"$N将手中$w迎风一挥,幻出万千虚影,蓄力劲发,高举过顶,
$w对准$n的脑门就砸了下去。这一下要是打中,恐怕连大罗金仙也难逃一命",
"parry": -50,
"dodge": -50,
"damage": 200,
"damage_type": "砸伤"
伤害恐怖。
类似的“打busy效果”还有不少,p6剩下的一半perform three, jjf的perform qianjian等等。但是这些perform本身都有busy,所以性价比跟pili差了十万八千里。
两仪剑
没有perform,伤害低,但是practice的时候能升force
菩提指
普普通通的unarmed skill
龙宫和无底洞
作为不少老妖怪的归宿,龙宫的功夫自然有其变态的一面。风波叉和枯骨刀作为西游记2000两大busy技,更是受到无数受害者的唾弃。这里我将龙宫和无底洞放在一块,就是为了讨论一下风波叉和枯骨刀这两大busy技的特点
先看风波叉
mypot=(int)me->query_skill("fork");
mypot=mypot*mypot*mypot/10 + (int)me->query("combat_exp");
自己的数据是有效叉法的立方除10然后加上武学
tapot=(int)target->query_skill("parry");
tapot=tapot*tapot*tapot/10 + (int)target->query("combat_exp");
对方的数据是有效招架的立方除10然后加上武学
if ( random( mypot + tapot ) > tapot )
在自己数据与对方数据的和中取随即数,如果这个数大于对方的数,成功。否则失败。
从上面可以看出,风波叉要求有效叉法技能高和武学高。
那让我们计算一下风波叉的成功率。为了简化分析,这里假设双方的武学都是技能要求的下限,即技能的3次方/10。自己的武学为x,从上面的源码可以知道,自己参与判断的数据就是2x (技能的3次方/10+x=2x)。同样道理,对手的数据是2y,这样判断的关系就是
if ( random( 2x + 2y ) > 2y )
然后假设对手的武学是我的k倍(k>0),即y=kx 那么成功率就是 2x/(2x+2Kx),即 1/(1+k)
从这个可以看出,对手的武学如果跟你一样,成功率0.5 但是就算是比你小很多,成功率也不会是100%。同样,对手的武学即使比你高很多,成功率也不会是0
然后看看枯骨刀
if( ((random(me->query("combat_exp"))*3/4 + (me->query("combat_exp")/4) > (int)target->query("combat_exp")*5/8 )))
自己武学为x,对手为y,这句话就是
random(0.75x)+0.25x>0.625y,就成功,否则失败。这里,枯骨刀成功率与级别无关,完全看武学。
现在来计算一下成功率
假设对手的武学是自己的k倍,y=kx, 那么成功率为 (0.75x+0.25x-0.625kx)/0.75x 即(8-5k)/6
从这个可以看出,对手的武学如果跟你一样,成功率0.5 如果对手武学小于你的0.4倍武学,成功率100%,如果对手武学大于你的1.6倍武学,成功率0
如果把这两个成功率画成函数图就可以清楚地看出,当对方武学小于你,枯骨刀成功率高,当对方武学高于你,风波叉成功率高。双方武学一样,成功率一样。当然这个结论是在假设双方的武学都是技能要求的下限的情况下的,具体情况还要具体分析。
至于busy长短,最高都是busy对方10秒,但是风波叉如果不成功,自己最多busy3秒,枯骨刀最多busy5秒。
至于枯骨刀的另外一个perform,perform sword,就是根据你的七修剑级别加上些攻击和伤害,然后攻击一下。要是能在对方中了破绽以后用可能还算可以,但是这个perform不能在对方busy时使用,我感觉比较鸡肋。
龙形搏击
原来最猛地空手功夫,现在没练过千手,不好比较。龙形搏击从源码上看,不光有perform,普通的攻击也要比其他的空手功夫高很多(摩云手除外)
龙形搏击的perform sheshen在西游记2000之前十分强悍,后来削弱了好多。我以前就是用的pili+sheshen组合。
其实这个舍身的判断我不是十分明白,主要就是有一些数据我没概念,就是下面这些
ap=COMBAT_D->skill_power(me, "unarmed", SKILL_USAGE_ATTACK);
我到combatd的函数中找到这句话,但还有个
level += ob->query_temp("apply/attack");
我一直对query_temp("apply/attack")的大小没概念,搞不清楚是多少
不过没关系,其实舍身技能否命中基本就是看你有效unarmed的级数和对手有效dodge和有效unarmed的级数。
判断的时候第一次判断dodge,看是否躲开,然后判断你的unarmed级别,看是否打中。
这里有一点很有意思,就是如果对手拿着兵器,命中率就会上升。
pp=COMBAT_D->skill_power(target,"unarmed", SKILL_USAGE_DEFENSE);
ob=target->query_temp("weapon");
if(objectp(ob)) pp/=2;
if(random(ap+pp)>pp) {
msg += "结果正铲在$n的小腿上。\n" NOR;
if(random(ap+pp)>pp) {
msg += "结果正中$n。\n" NOR;
if(random(ap+pp)>pp) {
msg += "结果$n一跟头摔在地上。\n" NOR;
效果应该会比较明显。
至于伤害,计算的比较复杂,今天先不说了,以后如果有需要在仔细说下吧。
混天锤
huntian-hammer的perform比较烂,杀妖,杀钱,擂台,基本没什么地方可以用,当真是害人害己。但是,这个技能的闪光点不在perform,在于普通攻击上。huntian-hammer的普通攻击带有特效,可以击飞,打断对手兵器
wap = (int)weapon->weight() / 500
+ (int)weapon->query("rigidity")
+ (int)me->query("str");
wdp = (int)ob->weight() / 500
+ (int)ob->query("rigidity")
+ (int)victim->query("str");
自己武器的重量除500加上自己的力量再加上武器的rigidity(不知道啥参数)
对手也作相同处理
wap = random(wap);
然后在自己的数据中取随机数
if( wap > 2 * wdp ) {
message_vision(HIW "$N只觉得手中" + ob->name() + "把持不定,脱手飞出!\n" NOR,
victim);
如果这个随机数大于对手的2倍,击飞
} else if( wap > wdp / 2 ) {
message_vision(HIW "只听见「啪」地一声,$N手中的" + ob->name()
+ "已经断为两截!\n" NOR, victim );
如果这个随机数大于对手的一半,打断。
一般来说锤子的分量都挺重,所以击飞,打断的概率还是挺高的。
七修剑
现在这个技能加了个PERFORM叫做perform shuang,没用过,不好评论。就技能的普通伤害来说,七修剑是剑法中最高的,但是出了无底洞不能再升级了。
阴风爪
普普通通的unarmed技能,但是可以enable到parry。unarmed技能不够高可以用parry来parctice升级
将军府
将军府最有名的莫过于三板斧了,三板斧威力确实巨大。就论普通攻击,如果我没有漏掉哪个的话,三板斧最高。
perform sanban,大幅度伤气血上限,虽然没用过,但想必杀妖很爽。
三板斧的busy设定很有意思,跟自身福渊有关
if(success)
{
me->start_busy(1+random(4-(mykar+5)/10));
msg+=hit[random(sizeof(hit))];
}
else
{
me->start_busy(random(4-(mykar+5)/10));
msg+=miss[random(sizeof(miss))];
如果福渊能达到25,成功的busy只有1,失败为0(random(x)的意思是从0到x-1取个数,所以福渊是25)
判师没法用三板斧,三板斧需要mapped force是冷泉心法,就是必须enable上。
霸王枪有个perform qiangjian,需要wusi-mace配合,自己busy3秒,跟perform three类似,但是伤害不如perform three,而且要提高命中同时还得练mace技能,浪费潜能啊,这个技能感觉很鸡肋。