背景:
阅读文章

combatd.c是如何算出damage 的新手谈

[日期:2007-05-12] 来源:  作者: [字体: ]

注:以奈何的单机版(xkx单机)为参考,并不保证所有资料的正确性。
请参阅您的MUD内的 combatd.c ,对着看或许会有些帮助。


// ##############################################################
// damage 处理全过程:
// 1, damage = me->query_temp("apply/damage")


// 即临时攻击力。此值一般是武器的攻击力,又或者是 pfm 时被
//  临时增加的攻击力。
//
// 2, damage = (damage + random(damage)) / 2;
// 好,这里有个随机!!!此时最少 damage 需要 2,否则将会
// 得到 0 的结果。
//
// 2-1, damage += (me->query_temp("apply/attack")+1) /10 * (damage /10);
// 这是 NPC 的加成,玩家跳过这一步。
//
// 3, damage += action["damage"] /10 * (damage / 30);
// 注意!!!!!!这里的情况是,如果招式里设置的 damage < 10,
//         无加成;或者之前两步统计下来的 damage 不足30的话,
// 任你剑招里设置的 damage 比天还高,都是白废,无加成。
//
// 4, damage += (me->query_skill(attack_skill)+1)/10 * (damage /10);
// 好,开始进行 skill level 加成了,以下情况不加成:
//  1 -- skill level 为9或以下时,无加成
//  2 -- 之前的几步统计下来, damage < 10,无加成
//
// 5, damage_bonus = me->query_str();
// 然后,开始计算 "damage_bonus",这个值初始是后天膂力
//
// 6, 如果有 加力,将执行一个 mixed 型的函数,damage_bonus 将
//    会在该函数的返回值中,可能得到加成。这要视各 skill 而定,
//    各 skill 可以 mixed hit_ob() 函数返回一个 int ,或返回
//    一个带有 ["damage"] 的 mapping ,来达到更改 damage_bonus
//    的效果。
//    加成时,若是无兵器的招式,damage_bonus 将直接加入该值,
//    如有兵器,则只加上 1/3 .
//
// 7, 如果招式里定义了 "force" ----- 就是skill 文件招式里的 action["force"] 啦
//    那么来点加成。不过,如果 force<10 ,又或者自己的 query_str() 不足
//    100 的话,毫无用处,我晕。可以看出,这个东西在空手攻击时加成比较大。
// if( !objectp(weapon) )
//  damage_bonus += action["force"] /10 * (damage_bonus / 100);
// else damage_bonus += action["force"] /10 * (damage_bonus/300);
//
// 8, 接下来进行 skill level 额外加成,
// if (!objectp(weapon))
//  damage_bonus += (me->query_skill(attack_skill)/4
//   + me->query_skill("force")/2+1)/10* (damage_bonus /10);
// else damage_bonus += (me->query_skill(attack_skill)/4+1) /10* (damage_bonus /10);
//    意思是,空手攻击时,加成为:
//         ("攻击skill的等级" 的 1/4) + (内功等级的约 1/20 * damage_bonus 的 1/10)
//    那么说,一个 100 lv 的 skill, 内功即使为 0, 这里也可以得到 25 点的加成
//    但是如果是兵器类的 skill, 就只能得到几点的加成,如 100 lv sks, 甚至可能得到
//    两三点的加成而已,反差巨大。
//
// 9, 接下来看兵器里有没有特殊的加成。将调用兵器文件中的 hit_ob()
//    函数,该函数若返回一个 int, 则直接加入这个值到 damage_bonus 中。
//
// 10, 接着看看 加劲 的加成。简易公式如下:
// foo = my["jingli"]/20 + my["jiajin"] - your["jingli"]/25;
//     当 foo > 0 时,直接加入 damage_bonus 中。
//     例如我的精力 1000,对手精力2000,那么就是:
//     50 + 最大加劲二十分之一即50 - 对手的精力/25即80  == 20 点
//
// 11, 如果攻击模式是 "快速攻击",攻击力减半
//
// 12, 将 damage 与 damage_bonus 组合起来。这时将进行一个
//     计算,最多时可以得到全部的 damage_bonus ,最少时可以得到
//     一半的 damage_bonus.
//     而如果 damage_bonus 的值为负的话,同理, damage 减去同样
//     随机范围的 damage_bonus 值。
//
//     此时进行一个强制判断,以保证组合后的 damage 值最小为 0。
//
// 13, 进行一个循环!以彼此的 combat_exp 作判断:
//        取一个 random(攻击者的exp), 如果比 被攻击者的 exp 大,
//     那么 damage 削减为原来的三分之二(2/3),并将作判断的 "攻击
//     者的exp" 值降半,重新循环
//
// 14, 这里是一个呕吐级的判断,如果被攻击者身穿特别的防具(该防具文件
//     内以mixed is_special() 函数返回任意非零值即可),那么,调用其
//     文件的 mixed hit_ob() 函数,若此函数返回 int 或 mapping 型
//     的值,damage 将直接赋予该值(int or mapping["damage"])。
//     此时,前面所做一切均告作废,yeah,真是高章,高,实在是高
//
// 15, 此时再作一个判断,如果被攻击者身备(jifa)特别的轻功(该轻功
//    文件内以 mixed is_special() 函数返回任意非零值即可),那么,
//    原理同 14 ,也是让前面所做一切均告无效的一个步骤, yeah
//
//
//     到了这时,终于得到 damage 的最终值了!但是很郁闷的是,
//     它不作是否非0的判断,就直接对对手进行伤害,系统偶尔会
//     报出 “攻击力为负”的 bug, 大概是 special armor 或
//     special dodge 造成的吧。
//
//     接下来就暂时不关 damage 的事喽。
// ##############################################################

 


尊重作者 转载请注明出处52mud.com

收藏 推荐 打印 | 录入:sbso | 阅读:
相关内容      
内容推送
52mud提供
一起回忆泥巴游戏QQ群68186072
52mud官方微信公众平台
热门评论