mud吧 关注:20,934贴子:98,978
  • 8回复贴,共1

mudlib中/adm/daemons/weapond.c文件里一段代码疑问求解

只看楼主收藏回复

一般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,怀疑自己,我开始怀疑人生……
求解:这里的这段代码到底是几个意思啊???


IP属地:上海1楼2014-09-05 13:58回复
    前人自定的逻辑和算法而已,不必纠结,这种东西就在于自己,本身用力量,武器重量,武器质地三个数值加权计算后,简单比较就得出是否击飞打断就不怎么高明


    IP属地:黑龙江来自iPhone客户端2楼2014-09-05 16:05
    收起回复
      2025-06-13 01:55:58
      广告
      你可以参考下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);
      }
      }
      }


      IP属地:新疆3楼2014-09-12 16:36
      回复
        贴吧看代码太坑了。


        IP属地:广东4楼2016-06-16 09:12
        回复
          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 还是文字,没毛用
          }
          这下清楚了吧。


          IP属地:美国5楼2018-01-12 10:16
          回复
            我想知道,楼下怎么看?


            IP属地:江苏来自iPhone客户端6楼2018-01-18 05:10
            回复
              我想知道为什么wap判定为自己的武器判定数值?
              wdp是敌人的武器判定数值?
              看懵圈了


              7楼2018-12-30 22:55
              收起回复