一般mudlib中/adm/daemons/weapond.c文件里都有一段关于判断兵器打断和击飞的代码,先附上这段代码:
void bash_weapon(object me, object victim, object weapon, int damage)
{
object ob;
int wap, wdp;
if (objectp(weapon) &&
damage == RESULT_PARRY &&
ob = victim->query_temp("weapon"))
{
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");
wap = random(wap);
if( wap > 2 * wdp )
{
message_vision(HIW "$N" HIW "只觉得手中" + ob->name() +
HIW "把持不定,脱手飞出!\n" NOR, victim);
ob->unequip();
ob->move(environment(victim));
victim->reset_action();
} else
if (wap > wdp)
{
message_vision(HIY "$N" HIY "只觉得手中" + ob->name() +
HIY "一震,险些脱手!\n" NOR, victim);
} else
if (wap > wdp / 2)
{
message_vision(HIW "只听见「啪」地一声,$N" HIW "手中的"
+ ob->name() + HIW "已经断为两截!\n" NOR,
victim );
ob->unequip();
ob->move(environment(victim));
ob->set("name", "断掉的" + ob->query("name"));
ob->set("value", 0);
ob->set("weapon_prop", 0);
victim->reset_action();
} else
{
message_vision(HIY "$N" HIY "的" + weapon->name() + HIY
"和$n" HIY "的" + ob->name() + HIY "相击"
",冒出点点的火星。\n" NOR, me, victim);
}
}
}
里面的一个if else就把我绕半天,好不容易像个说法把自己说服了,又发现这段代码的逻辑和我的理解很不一致,初步判断可能是代码出错,但我又查看了其它N个mudlib的该文件,发现该段代码都是一样的,于是我凌乱了,我已经不相信人生了……
上述代码简化理解如下:
wap:招架方强力度(武器强度+臂力,简称强力度,下同。)
wdp:进攻方强力度
然后wap=random(wap)取随机数进行下面的计算。
if( wap > 2 * wdp ) 招架方把进攻方武器击飞;记为击飞效果。
else
if (wap > wdp) 差点击飞;但实际上是没任何效果,记为零效果。
else
if (wap > wdp / 2) 招架方把进攻方武器打断;记为打断效果。
继续精简【个人理解random(100)和100/2=50大致相当】:
强力度远大于对方,击飞;
强力度大致是对方2倍,零效果;
强力度与对方大致相当,打断;
这里暂不讨论击飞和打断哪种情况需求条件更高的问题。我不理解的是:为什么强力度大致相当的时候可以打断兵器,但强力度提升到大致是对方的2倍时反而没效果了呢?一般来说应该强力度越大越好吧,但这里强力度的提高在某个阶段是负收益(由打断特效变为零特效)???个人认为应该把后两句的结果对换一下,改为
if( wap > 2 * wdp ) 击飞效果;
else
if (wap > wdp) 打断效果;
else
if (wap > wdp / 2) 零效果;
但是天底下的wiz会一起出错么?不会一起出错么?怀疑wiz,怀疑自己,我开始怀疑人生……
求解:这里的这段代码到底是几个意思啊???
void bash_weapon(object me, object victim, object weapon, int damage)
{
object ob;
int wap, wdp;
if (objectp(weapon) &&
damage == RESULT_PARRY &&
ob = victim->query_temp("weapon"))
{
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");
wap = random(wap);
if( wap > 2 * wdp )
{
message_vision(HIW "$N" HIW "只觉得手中" + ob->name() +
HIW "把持不定,脱手飞出!\n" NOR, victim);
ob->unequip();
ob->move(environment(victim));
victim->reset_action();
} else
if (wap > wdp)
{
message_vision(HIY "$N" HIY "只觉得手中" + ob->name() +
HIY "一震,险些脱手!\n" NOR, victim);
} else
if (wap > wdp / 2)
{
message_vision(HIW "只听见「啪」地一声,$N" HIW "手中的"
+ ob->name() + HIW "已经断为两截!\n" NOR,
victim );
ob->unequip();
ob->move(environment(victim));
ob->set("name", "断掉的" + ob->query("name"));
ob->set("value", 0);
ob->set("weapon_prop", 0);
victim->reset_action();
} else
{
message_vision(HIY "$N" HIY "的" + weapon->name() + HIY
"和$n" HIY "的" + ob->name() + HIY "相击"
",冒出点点的火星。\n" NOR, me, victim);
}
}
}
里面的一个if else就把我绕半天,好不容易像个说法把自己说服了,又发现这段代码的逻辑和我的理解很不一致,初步判断可能是代码出错,但我又查看了其它N个mudlib的该文件,发现该段代码都是一样的,于是我凌乱了,我已经不相信人生了……
上述代码简化理解如下:
wap:招架方强力度(武器强度+臂力,简称强力度,下同。)
wdp:进攻方强力度
然后wap=random(wap)取随机数进行下面的计算。
if( wap > 2 * wdp ) 招架方把进攻方武器击飞;记为击飞效果。
else
if (wap > wdp) 差点击飞;但实际上是没任何效果,记为零效果。
else
if (wap > wdp / 2) 招架方把进攻方武器打断;记为打断效果。
继续精简【个人理解random(100)和100/2=50大致相当】:
强力度远大于对方,击飞;
强力度大致是对方2倍,零效果;
强力度与对方大致相当,打断;
这里暂不讨论击飞和打断哪种情况需求条件更高的问题。我不理解的是:为什么强力度大致相当的时候可以打断兵器,但强力度提升到大致是对方的2倍时反而没效果了呢?一般来说应该强力度越大越好吧,但这里强力度的提高在某个阶段是负收益(由打断特效变为零特效)???个人认为应该把后两句的结果对换一下,改为
if( wap > 2 * wdp ) 击飞效果;
else
if (wap > wdp) 打断效果;
else
if (wap > wdp / 2) 零效果;
但是天底下的wiz会一起出错么?不会一起出错么?怀疑wiz,怀疑自己,我开始怀疑人生……
求解:这里的这段代码到底是几个意思啊???
