mudlib中/adm/daemons/weapond.c文件里一段代码疑问求解
mud吧
全部回复
仅看楼主
level 8
xiuliinlove 楼主
一般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,怀疑自己,我开始怀疑人生……
求解:这里的这段代码到底是几个意思啊???[抓狂]
2014年09月05日 05点09分 1
level 15
前人自定的逻辑和算法而已,不必纠结,这种东西就在于自己,本身用力量,武器重量,武器质地三个数值加权计算后,简单比较就得出是否击飞打断就不怎么高明[吐舌]
2014年09月05日 08点09分 2
也不算简单比较。招架时武器相交,然后取的随机数比较,有概率的。如果是不取随机数直接比较那才叫坑。感谢解答,我可以按我的理解来修改了。主要是代码不熟,改起来心里没底,总担心一不注意把原有的体系改崩溃了- -
2014年09月05日 10点09分
level 8
你可以参考下FY4的
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() * 10;
wdp = (int)ob->weight() / 500
+ (int)ob->query("rigidity")
+ (int)victim->query_str() * 10;
wap = random(wap);
if( wap > 2 * wdp ) {
message_vision(HIW "只听见「啪」地一声,$N手中的" +
ob->name()
+ "已经断为两截!\n" NOR, victim );
ob->unequip();
ob->set("name", "断掉的" + ob->query("name"));
ob->set("value", 0);
ob->set("weapon_prop", 0);
ob->set("no_get",0);
ob->set("no_drop",0);
ob->save();
victim->reset_action();
} else if( wap > wdp ) {
message_vision(HIW "$N只觉得手中" + ob->name() +
"把持不定,脱手飞出!\n" NOR,
victim);
ob->unequip();
ob->move(environment(victim));
victim->reset_action();
} else if( wap > wdp / 2 ) {
message_vision("$N只觉得手中" + ob->name() +
"一震,险些脱手!\n", victim);
} else {
message_vision("$N的" + weapon->name() + "和$n的" +
ob->name()
+ "相击,冒出点点的火星。\n", me, victim);
}
}
}
2014年09月12日 08点09分 3
level 9
贴吧看代码太坑了。
2016年06月16日 01点06分 4
level 1
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() * 10;
wdp = (int)ob->weight() / 500 + (int)ob->query("rigidity") + (int)victim->query_str() * 10;
wap = random(wap);
if( wap > 2 * wdp ) {
message_vision(HIW "只听见「啪」地一声,$N手中的" + ob->name() + "已经断为两截!\n" NOR, victim );
ob->unequip();
ob->set("name", "断掉的" + ob->query("name"));
ob->set("value", 0);
ob->set("weapon_prop", 0);
ob->set("no_get",0);
ob->set("no_drop",0);
ob->save();
victim->reset_action();
} else if( wap > wdp ) {
message_vision(HIW "$N只觉得手中" + ob->name() + "把持不定,脱手飞出!\n" NOR,
victim);
ob->unequip();
ob->move(environment(victim));
victim->reset_action();
} else if( wap > wdp / 2 ) {
message_vision("$N只觉得手中" + ob->name() + "一震,险些脱手!\n", victim);
} else {
message_vision("$N的" + weapon->name() + "和$n的" + ob->name() + "相击,冒出点点的火星。\n", me, victim);
}
}
}
这个挺清楚的
if(你有武器 + 敌人有武器 + 武器被格挡){
wap = 你的武器重量/500 + 你的武器质量 + 你的臂力 × 10;
wdp = 你的敌人的武器属性(见上);
if ( wap > 2 * wdp) 敌人武器断裂,武器落地
else if ( wap > wdp) 敌人武器脱手,武器unwield
else if ( wap > wdp / 2 ) 就是显示文字。没冒用
else 还是文字,没毛用
}
这下清楚了吧。
2018年01月12日 02点01分 5
level 12
我想知道,楼下怎么看?
2018年01月17日 21点01分 6
level 3
我想知道为什么wap判定为自己的武器判定数值?
wdp是敌人的武器判定数值?
看懵圈了
2018年12月30日 14点12分 7
a是指攻击者,d是指防御者
2019年01月14日 06点01分
1