|
楼主 |
发表于 2005-10-8 16:30:45
|
显示全部楼层
Re:“它山之石,可以攻玉”--从某mudlib 透视下战斗伤害计算
-------------------------------------------------------------------------------
六脉神剑的 hot_ob(),看看 6脉打中人会如何
mixed hit_ob(object me, object victim, int damage_bonus, int factor)
{
int damage, i, level, me_power, victim_power;
string weapon, me_weapon, op_skill, *pname,result, str, msg;
object weap;
level = (int)me->query_skill("liumai-shenjian", 1);
weap = victim->query_temp("weapon");
if( level > 200)
{
if((level <= 240) && (me->query("neili") > 200)
&& (me->query_temp("marks/sword_add") != 1) )
{
i = (int)me->query_skill("liumai-shenjian", 1) / 2;
me->add_temp("apply/attack", i);
me->add_temp("apply/defense", i);
me->add_temp("apply/dodge", i);
me->add_temp("apply/damage", i);
me->add("neili", -50);
me->set_temp("marks/sword_add", 1);
call_out("reset_temp", level/10, me);
return 1;
}
if( (level >220) && (me->query("neili") > 1000)
&& (victim->query_temp("weapon"))
&& (random(me->query_str()) > victim->query_str()/3) )
{
if (random((int)weap->query("rigidity"))<5)
{
message_vision(HIW "突然间拍的一声响,$N手中" + weap->name() + HIW"为无形气剑所断,化为寸许的二三十截,飞上半空!\n" NOR, victim );
// add by xuanyuan
//// 这是慕容的斗转星移克制断剑....
if( (int)victim->query_skill("murong-jianfa", 1) > 119
&& (int)victim->query_skill("douzhuan-xingyi", 1) > 119
&& victim->query("neili") > 500
&& victim->query("jingli") > 200){
message_vision(HIG"\n$n猛吃一惊,却不慌乱,右掌急挥,将二三十断刃化作暗器,以满天花雨手法向$N激射去。\n"NOR, me, victim);
victim_power = victim->query_skill("sword") + victim->query_skill("strike") + victim->query_skill("force")
+ victim->query_skill("dodge") + victim->query("combat_exp") / 1000;
me_power = me->query_skill(op_skill) + me->query_skill("dodge") + me->query_skill("force")
+ me->query_skill("parry") + me->query("combat_exp") / 1000;
if ( random(victim_power) > me_power/3 )
{
if ( random(victim->query_kar()) > (me->query_kar())*4/5 )
{
message_vision(HIR "\n$N未曾料到$n还有此招,一呆之下,反应不及,无数断刃透体而过。\n" NOR, me ,victim);
me->receive_damage("qi", me->query("max_qi")/8 + random(me->query("max_qi")/4), me);
str = COMBAT_D->status_msg((int)me->query("qi") * 100 /(int)me->query("max_qi"));
message_vision("($N"+str+")\n", me);
}
else // if ( random(victim->query_kar()) > (me->query_kar())*3/5 )
{
message_vision(HIR "\n$N大叫:“啊哟!”手足无措,慌作一团,急忙伏地。不料动作稍慢,背上被断刃划出几条血痕。\n" NOR, me);
me->receive_damage("qi", me->query("max_qi")/10 + random(me->query("max_qi")/8), me);
str = COMBAT_D->status_msg((int)me->query("qi") * 100 /(int)me->query("max_qi"));
message_vision("($N"+str+")\n", me);
}
}
else
{
if ( objectp(me_weapon = me->query_temp("weapon")))
{
message_vision(WHT"\n$N一惊之下,反应神速,舞开手中兵刃,将断刃一一荡开。\n" NOR, me);
}
else
{
message_vision(HIY "\n$N大叫:“啊哟!”手足无措,慌作一团,急忙伏地。数十枚断刃都从他头顶飞过,高手比武,竟出到形如“狗吃屎”的丢脸招数,实在难看已极。\n" NOR, me);
}
}
victim->add("neili", -200);
victim->add("jingli", -100);
}
weap->move(environment(me));
weap->set("name", "断掉的"+weap->query("name"));
weap->set("value", 0);
weap->set("weapon_prop", 0);
} else {
message_vision(HIW "只听见「当」地一声,$N手中的" + weap->name()
+ HIW"被剑气震落到地上!\n" NOR, victim );
weap->move(environment(me));
}
victim->reset_action();
me->add("neili", -100);
return 1;
}
}
}
-------------------------------------------------------------------------------
--------------------------------------------------------------------------------
来做个计算实例:(注意:所有数据均为虚构,如有雷同,纯属巧合)
某男性人物属性 先天 str(力量) 15 由于下边的 finger 技能,后天 str=25
人物当前状态 内力 300/ 500 (+40) , exp 30w
combat skill = force 100, kurong-shengong 100, finger 100, liumai-shenjian 100, enforce = 40
空手战斗, 战斗开始 powerup 后"apply/damage" 为25,"apply/dodge" 为25
某次随机出 六脉神剑 的 「中冲剑」,「中冲剑」假设数据如下
{"force" : 580, "dodge" : 600, "weapon": "无形剑气", "lvl" : 50, "damage_type" : "刺伤"}
对手 npc 梅剑 dodge 80, yueying-wubu 80, "apply/armor"=0(女生,不像熊皮那么厚),"apply/armor_vs_force"=0,
装甲 "armor/cloth"=doupeng(斗篷,设定 "material"="cloth", "armor_prop/armor"=10)
梅剑当前状态 内力 820/ 1000 (+60) , exp 50w, 没有exert powerup
开始计算:
1,2 行 :: 12 <= damage <= 24
3 行 :: 12 <= damage <= 24 (..... apply/dam 太低,武功效果为零)
4 行 :: 31 <= damage <= 54
5 行 :: damage_bounce = 25
6 行 :: 得到内功打中目标的特效,假设这次返回 ""(空字符串,也有小概率返回3,具体看第二个函数)
7 行 :: 返回消息附加 ""
8 行 :: damage_bonus = 25 (很不幸,enforce 太低的得不到这个加成 ... 就是说低经验者用高强武功效果不明显)
9 行 :: damage_bonus = 47 (有效内功 比 有效攻击 更有效果)
10 行 :: 很明显,通过第三段代码,此人 6脉不够级别,返回""
11 行 :: 返回消息附加 ""
12 行 :: 玩家打中 mei ,返回 ".....中指一竖,一招「中冲剑」,迅疾的向$n的$l划去,大开大合,气势雄伟"
13 行 :: 返回消息附加 " .....中指一竖,一招「中冲剑」,迅疾的向$n的$l划去,大开大合,气势雄伟"
14 行 :: 54 <= damage <= 100
15 行 :: 36 <= damage <= 66 (郁闷,没她经验高,攻击折为2/3,如果此人exp=20w,攻击要减为4/9 ...)
16 行 :: 攻击折1/3同时,防御系数折半 (就是说 exp 是自己5倍的,伤害变为 9/27... chat* sigh)
17 行 :: 得到 月影舞步 这个轻功,当然没有后续伤害。某些功夫克制某些功夫,可以在这里加代码。
18 行 :: 终于伤害到她的 气血了。伤害就是上边的 damage
19 行 :: 加重打击(奋力一击),由于斗篷防御10 而 mei 皮厚0,总防御10(她还没powerup),那么在kill指令有
概率(有武器 1/2,没武器 1/4);其他指令有概率(1/4和1/7)来执行20行
20 行 :: 对气造成wound ,伤害 26 - 56 的 eff_qi(eff_qi 见顶部说明)
21 行 :: 把伤害信息转为描述,例如“造成了轻微刺伤”之类。
以下还有点东西,不过与本题已不相关。
再次声明,代码非北侠的,具体来源是 小熊泥苑(http://www1.nd169.com/nd/mud/) 下载中的 2001北美xkx,
如果有兴趣,可以计算下带武器的伤害,
本人愿意提供虚拟参考数据:
1 顶级武功分两类
1.1 攻击类(玄铁剑法、侠客剑法、6脉神剑、降龙18掌、英雄剑法为代表的)
招式的"force" 在 400-600间, 空手类稍高,在450-650 (高级招式的force比低级的高)
1.2 防御类(独孤9剑,辟邪剑法为代表的)
招式的"force" 在 300-500间
2 中级武功
以达摩剑、回风拂柳剑、华山剑法等
招式的"force" 在 250-450间,个别最强招式也许能到达550, 空手类稍高
3 入门武功
以天山六阳掌、如来千叶手、太极刀等为代表的
招式的"force" 在 100-300间,个别最强招式也许能到达450, 空手类稍高
注意招式的"force" 逢10有效,经常看到有些 wiz 写 42,48 之类的force,chat* fly
不过总的说来,exp高的人,用入门武功,同样可以打 exp 低的人落花流水,这一点上所有mud 好像都是。
到了exp差不多的时候(互相不超过对方4倍?),才去比较功夫伤害的。
另,本文只讨论伤害计算,并不涉及任何 perform ,有很多入门武功的 perform 巨好,当然也是好东东。
附带提一下,这个代码前边写道 busy 时的轻功系数 减为1/3,招架系数减为1/2。还有这段代码是命中目标的代码,
判断命中的,有空再说啦。
……版权问题,参考 LGPL. chat* bow deWolf, Dec.8th,2005
[ Last edited by dewolf on 2005-10-25 at 09:52 AM ] |
|