MUD游戏系统刷新与内存清除分析
2021/4/7 11:43:08

有关系统更新一直是玩家乃至于新巫师们关心的问题。比如,为何每隔15分钟大多数房间里杀死的NPC会重生?跑到别处或被玩家背到别处的NPC怎么会跑回去?为什么有的NPC跑不回去?什么有的东西会重生?为什么又有的东西只要别的玩家放在身上?等等。
  目前主流MUDLIB都是ES系列的。从ES系列沿袭下来的更新都是通过ROOM的更新实现的。而ROOM的更新则是由MUDOS里的设置每隔一定时间(一般是15分钟)调用一次所有的有reset()函数的房间。而这个reset()函数则写在ROOM的标准继承文件里面。下面我们则来看看ROOM是如何实现房间里的生物、物品的重生或更新:
  在写这篇文章之前,正好在网上看到darks兄写的《ROOM的结构》,于是我这篇文章的不少地方也就写得很顺畅了,有些直接引用了《ROOM》一文的一些内容。为了尊重原作者,凡是引用或出自darks兄的原文内容我都用“”与绿色标出:
  ROOM的标准文件由于MUDLIB的不同,放在目录路径也不同,但大多情况下也就是/inherit/room/下或者与/obj/room/下两种可能而已。反正不检查一下在/include/下的globals.h,看这个文件里ROOM是定义在哪里就可以了,下面来看一看room.c的程序详解:
inherit F_DBASE;
//“这个是继承dbase标准继承,有了它,你才可使用set等函数为这个物件设定变数”(此问题日后做专题说明)。
inherit F_CLEAN_UP;
//“这个用来定时清除很久没被访问的room”,这个概念我们要在后面谈到。
static mapping doors;
//“这是一个有关房间里的门的全局变量,不是我们今天讨论的范围之内,你只要知道就行,我们在这个文件里还能找到与门相关的几个函数:”
mixed set_door(string dir, string prop, mixed data)
mixed query_door(string dir, string prop)
mapping query_doors()
string look_door(string dir)
varargs int open_door(string dir, int from_other_side)
varargs int close_door(string dir, int from_other_side)
varargs int lock_door(string dir, string key, int from_other_side)
varargs int unlock_door(string dir, string key, int from_other_side)
int check_door(string dir, mapping door)
varargs void create_door(string dir, mixed data, string other_side_dir, int status)
int valid_leave(object me, string dir)
int query_max_encumbrance() { return 100000000000; }
//设置可容纳的重量,以上这些函数大多与门有关,我们今天都一一略过,下面才是我们今天要研究的与系统房间刷新相关的函数:
object make_inventory(string file)
{
  object ob;
  ob = new(file);
//根据传递来的路径名,将ob复制出来
  ob->move(this_object());
//复制出来的ob移于目的地
  ob->set("startroom", base_name(this_object()));
  return ob;
}
//这个函数用来产生一个房间里的物品。首先它需要别的函数在调用它的时候要传递给它一个需要产生的物件的路径。然后用new()复制出来,接着move到这个房间里,再接着给它设上startroom这个标记,这个标记就可以在这个房间定时呼叫自己房间里产生的npc可以使用return_home()这个函数时,正确回到原来的地方。
void reset()
{
  mapping ob_list, ob;
  string *list;
  int i,j;
  set("no_clean_up", 0);
//“这个标记为零,即允许系统到了规定时间将这个文件扫出内存,那么这个文件内的所有东西都会消失。由于room标准继承有这句,似乎发现只要继承它的房间文件无论写为0/1都是无效的,因为都会在这里被清除成零。”
  ob_list = query("objects");
//先取出一个这个房间初始设定的objects的映射集
 

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