_list就是代表的这个房间里的的query("objects"),是一个字符串内容的映射集,而ob就是代表的这个房间里的query_temp("objects")它实际上一个object型的映射集。
}
  reset()函数结束了,其实在ROOM里,除了这两个函数,还有一个在一开始编译进内存后进行首次调用reset()函数的setup()函数之外,其它的函数都是有关门的,都是可以去掉并影响房间的主要功能的,ROOM标准继承的最主要功能就是定时检查自己房间里的物品是否还在?是否需要更新等等。而这个定时则就是由MUDOS定义并按时呼叫房间里的reset(),这个时间绝大多数被定义为十五分钟。
  我们通过上面的程序详解可以看出,当一个房间被编译成功进入内存之后,那么这个房间就将自身产生出来的各个物体(假如它有的话)记入一个query_temp("objects")的物件映射变量中,这个变量与我们写程序里的query("objects")是一一对应的,只不过query("objects")里记的是这此物件的
文件路径,而query_temp("objects")里记的是这些具体的物件。关于这两个映射的区别,有兴趣的新巫师可以找一个有很多NPC的房间按下面分别call两次,看看区别:
call here->query("objects")
call here->query_temp("objects")
  在reset()被调用时,程序就会循环地一个个地查找这些物件是否还在MUD中?如果这些物件都已经不存在了,那么,reset()函数就会通过呼叫make_inventory()函数将其再次制造出来,也就是我们看到了,更新时间一到,很多被杀死的NPC,用掉的东西都会在原处产生出来。
  而如果这些物件都还在MUD中,就会检查它们是否还在原处?如果不在的话,只要是生物,就呼叫它的return_home()函数(这个函数在所有NPC的标准继承
/inherit/char/npc.c里),叫它回来。并且要把这个房间作为参数传递过去,否则NPC会回不来。如果不是生物只得作罢(这就是房间产生出的物品如果被某一玩家放在身上,就再也不能重生的原因)。那么下面我们就来看一下npc.c里的return_home()函数:
int return_home(object home)
//注意,括号里的home就是呼叫它回家的那个房间,当时是叫this_object()
{
  if( !environment()|| environment()==home ) return 1;
//再次检查:是否在一个存在的环境里?是否已经回来了?如果是,则什么也不做,返回!
  if( !living(this_object())|| is_fighting()) return 0;
//如果NPC处于昏迷或战斗状态,则不回来,返回值是0,综合room.c,原房间会增加no_clean_up记号;
  message("vision", this_object()->name() + "急急忙忙地离开了。\n",environment(), this_object());
  return move(home);
}
  谈到这里,大家可以发现,所谓房间的更新,实际上只是房间里的物体进行更新,这个房间没有任的变化。也就是说,如果在房间更新的时候,我们站在这个房间里,或者我们扔了一个不属于任何房的物品在这个房间里,都不会受到影响,这些物品与我们在更新前后都不会消失。这个与我们巫师进update here是本质性的两回事(updata here就是更新了房间)。
  那么,有时有的玩家就会说,我曾得到一个很好的宝物,离线不能保存,我就把它扔在一个很少有去的地方,结果,每次再去连线再去找的时候,大多数时候都找不到,不会是被别人捡去吧?这里就及到另一个概念:MUD里的资源清除。
 
  大家知道,在LPMUD里,所有的程序都必须装载进内存里才会工作。因此,MUD的内存资源便就是最主要的资源。更合理地分配和使用内存便成为一个MUD效率高低的体现。
  MUDOS为了节约内存的耗用,对于每一个占用内存的对象,包括是房间、物品、人物、指令等等,如果相当长的时间内没有被其它程序参考到(参考的含义:就是包括别人进入、看到、或者使用到这个房间、

下一页 上一页
返回列表
返回首页
©2024 MUD游戏网_文字mud 电脑版
Powered by iwms