mud吧 关注:20,800贴子:95,206
  • 5回复贴,共1

求高手帮忙解读mud程式

只看楼主收藏回复

很多地方出现clonep这个函数
查了下:
定义
名称:
clonep() - 检查给定的一个变数是否为复制的物件.
语法:
int clonep( void | mixed arg );
整数 clonep( 无参数 | 混合 arg );
用法:
如果参数 arg 有设定 objectp() 和 O_CLONE 旗标 (flag),
此函式就传回「真」 (true) 的值 (也就是 1). MUD 的
驱动程式 (driver) 会对经由 new(3) (clone_object(3))
创造出来的物件, 设定 O_CLONE 旗标. clonep() 函式
对於主物件 (master copy, 经由 call_other(3) 载入) 不
会传回「真」值. 请注意, 如果 clonep() 传回「真」值,
则 file_name() 对此物件传回的档案名称会加上 #n ( n
为整数). clonep() 不加上参数则预定物件为 this_object().
参考:
virtualp(3), userp(3), wizardp(3), objectp(3), new(3),
clone_object(3), call_other(3), file_name(3)
翻译:
Spock @ FF 97.Jan.27. (printed 3/16/95)
还是对其理解不透,谁能结合下面的代码,说下clonep函数到底起了什么作用?
void create()
{
set_name("巨蟒", ({ "ju mang", "mang" }));
set("race", "野兽");
set("long", "一条庞大无比, 色彩斑斓的巨蟒。 浑身发出阵阵强烈的腥臭味。\n");
set("attitude", "aggressive");
set("str", 70);
set("con", 50);
set("max_qi", 800);
set("no_get","巨蟒对你而言太重啦,你无法拿动");
set("combat_exp", 200000);
set_temp("apply/attack", 50);
set_temp("apply/damage", 50);
set_temp("apply/armor", 50);
setup();
if (clonep() && !random(2)) carry_object(MEDICINE_D("renshen-guo"));
}


1楼2014-11-04 00:45回复
    如果是复制品则执行if里的


    IP属地:辽宁来自Android客户端2楼2014-11-04 07:30
    回复
      这个问题要从物件在内存中存储的形式来说,按照我的理解,一般来说一个物件在载入内存的时候会形成一个master copy,多数物件(例如物品、人物)会通过new()方式创造出来并且以该物件master copy的clone的形式存储,这种clone可以有很多个,分别进行不同的属性赋值和操作。
      举例来说,比如你的lib中有一个/obj/ghost-blade.c,是一个鬼头刀,游戏中可能很多人都拿着这个鬼头刀的克隆,有的人在战斗中造成了刀的损坏,有的通过磨刀使刀伤害更高,无论哪个,在内存中都是这个鬼头刀(/obj/ghost-blade.c)的master copy(/obj/ghost-blade)的某个clone(/obj/ghost-blade#32423)。
      我想应该可以理解为,一个物件载入内存后形成一个master copy样例,当你需要在游戏中运用这个物件的实例时,会使用new()函数,driver会先检验该物件是否载入了内存(是否存在master copy),如果没有则载入。然后从已经存在的master copy复制一个clone返回给你。
      也就是说,clonep()就是用来判断一个物件到底是不是一个clone,如果是的话,即可进行实例操作(例如你列举代码的carry_object)。这是对master copy的一个保护。
      个人理解,希望对你有所帮助:)


      IP属地:北京3楼2014-11-04 14:49
      回复
        这个函数不是用在创建的时候的,物件创建的时候的内存存储master copy,clone之类的操作是driver进行的,不需要lib端进行。这种master copy的保护机制也是在driver处理时进行的,lib端不需要你进行其他操作。
        至于这个efun的用处嘛,我想可以这样理解:
        1.很多物件(比如我列举的人物、物品)在游戏中都需要形成实例来进行操作,但是还有些物件不能存在clone,比如各种控制精灵,传统mud的room,甚至技能、留言板等,他们以master copy的形式在内存中运转(如果多个clone进行运转那就天下大乱了。。。)。
        2.你在进行某些操作时需要仅对上述两类中的一类物件进行操作,那么就可以用clonep()来判断。
        比如精灵经常在create()的时候会判断,如果是clone那么立刻destruct。。。


        IP属地:北京5楼2014-11-04 23:22
        回复
          如果全是英文也许我还能帮你。中文的是在读不懂。


          IP属地:美国6楼2018-01-12 09:43
          回复
            我想知道,楼下怎么看?


            IP属地:江苏来自iPhone客户端7楼2018-01-18 05:10
            回复