发信人: 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 怪物 物品) 但是在制作一 些必须定时回复原始状态的小机关时, 仍然有必要用到这个函数 有关房间的部份就写到这里, 接下来是物品
|
|