精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>已关闭版区>>● MUD>>MUD制作>>制造房间的问题

主题:制造房间的问题
发信人: qiu_feng()
整理人: dreamwing(1999-11-19 09:51:16), 站内信件
    一个房间必定继承了 ROOM (inherit ROOM), 这是在
<mudlib.h中被 #define 好的一个档案, 它表示一个特别的档案, 所
有的房间都必须继承它. 才能拥有属於房间的一切特性 
一个房间有三个非常重要的函式: create(), init(), 与 refresh()
这三个函数会在某些特定的时机被系统所呼叫, 并且可以由你自行改写
, 以达成千变万化的效果 
[create 函数]
  create() 是房间在一被创造出来时必定要呼叫的一个函数, 通常我
们都在里面做一大堆设定初值的动作 随便找一个房间来看, 我们可以
发现 create() 函数中总是有一大堆的 set("something", somevalue);
这些 set 的意义在此不详述, 你可以自己猜, 也可以问问较资深的巫
师 
有时你的房间并不直接继承 ROOM 而是继承了一个有继承 ROOM 的
特别房间, 像是商店或是公会房间什麽的 这时候你所写的 create()
函数会覆盖掉原先继承来的房间中的 create() 函数, 而导致不能正常
的动作 这时候你最好在你的 create() 函数中加入 ::create(); 这
行指令, 它表示要去执行原先继承来的那个 ROOM 中的 create() 函数
如果你有写 refresh() 函数, 那麽在 create() 函数的最後加上
一行 refresh(); 来呼叫它会是个好主意 
[init 函数]
init() 函数被呼叫的时机在於有生物 (怪物及玩家) 进入这个房
间的时候 这时有个常用的函数 this_player() 会传回走进房间的这
个人, 或是怪物 this_player() 的概念容後再谈, 你现在只要记住这
个函数在每个生物走进来时都会被呼叫一次就可以了 
在 init() 中最常见的的函数莫过於 add_action("function", "action");
了,它的作用是在进来的生物身上添加上一个指令 (注意, 系统只认指
令的第一个字), 并在玩家下达这个指令时去呼叫 "function" 中所给
定名称的函数 举例而言, 如果我们写了这样的 init():
init() {
add_action("do_climb", "climb");
}
当玩家走进这个房间时, 系统会帮他多出 climb 这个指令 当他下达
了 climb tree 这个指令时, 系统会去寻找 do_climb() 这个函数, 并
加以执行 同时, 系统会将玩家所输入的 "climb" 这个指令後的所有
文字以字串型别的引数传给 do_climb()  你可以将 do_climb 这个函
数宣告为 int do_climb(string s)  这样一来, 当玩家下达 climb
tree, 或是 climb the red wall 这种指令时, "tree" 或是 "the red
wall" 就会被存进字串变数 s 之中供你处理 
由 add_action() 所宣告的函数必定要是一个整数型别的函数, 因
为系统会根据这个函数的传回值采取不同的动作 如果你传回的是 0,
那麽系统会认定这个命令与你这个处理函数无关, 而对其他也有 climb
命令的函数一个一个尝试著去执行, 直到所有的 climb 命令都传回 0
时, 系统会当这个指令不合法, 而丢出一个错误讯息(what?) 给玩家 
若你的函数传回值为 1, 表示这个指令已经由你所写的函数处理掉
了, 系统不会再尝试著往下面继续寻找其他的 climb 指令 
在你的函式侦测到玩家输入的引数有问题时 (例如你要他们 climb
tree, 但他们却输入了一些错误的指令如 climb three 之类的)  想
给他们一些特别的错误讯息时, 你可以用 notify_fail(string errormsg)
来写这个讯息, 如 notify_fail("climb what?\n"); notify_fail()
这个函数也是 int 型别, 固定会传回 0, 所以我们最常用的写法是:
if (条件不合)
return notify_fail(错误讯息);
if (另一个条件不合)
return notify_fail(另一个错误讯息);
.............................
<所有可能导致错误的输入都过滤光了>
开始真正干活的部份....
return 1;
  [refresh() 函数]
        refresh 呼叫的时机是系统定时 (约每半个小时一次) 呼叫 主
要的用途在於房间中怪物 物品的再生 如果你改写了 refresh()
函数, 千万记得要串接 ::refresh(), 否则可能导致严重的後果 (门
一打开就不会自动关上, 怪物打死後也不会再生...
    由於有 set("objects", (["name1" : "file1", "name2" :
"file2",... ]) ); 这种写法的存在 (在 create() 里面这麽写) 所
以 refresh() 被用到的机会不多了  (因为 set("objects", ) 这
个写法可以帮你作出自动定时 refresh 怪物 物品)  但是在制作一
些必须定时回复原始状态的小机关时, 仍然有必要用到这个函数 
有关房间的部份就写到这里, 接下来是物品

[关闭][返回]