新巫师学习
2007/5/5 20:53:18
这篇说明是为了新上任的巫师所写的, 我假设读著这篇说明文件的
新巫师已经读过 help new_wiz 中的内容, 并对巫师专有的指令如 clone,
update, cd, ls, cp... 等能熟练地加以使用, 但对如何开始写作自己
的区域感到茫然, 不知所措的新进巫师 [在开始制作之前]
让我们大略看一下在 LP MUD 中, 世界的构成方式 这个世界是由
一个个的物件 (object) 所组成, 每个物件有一个对应的程式档案来描
述它的特性 我们可以藉由写作一段程式来创造出一个全新的物件, 可
以利用 update 来更新物件所属的程式, 用 clone 来实际造出一个可
用的物件
在这里, 我们有各式各样的物件, 但是可以将之区分为三大类: 房
间 (ROOM), 物品 (OBJECT), 与生物 (LIVING) 在我们制作区域的惯
例上, 我们习惯将房间的档案直接摆在区域的目录下, 生物与物品则摆
在这个区域中名为 monster 及 obj (也有人喜欢用 object 或 item
为名, 看个人习惯 ) 的子目录中
以下我将以这三大类物件来分别说明该如何实作出区域 但在这之
前先提出一个忠告: 最好让你的每个档案都 #include 一个自定的 .h
档, 然後在这个 .h 档内做一些 #define 来定义档案的绝对目录 例
如
#define EGA="/u/e/ega/"
#define MOB="/u/e/ega/monster/"
如此一来在有需要用到房间或是怪物档名时, 可以用 EGA"chat_room"
或是 MOB"troll" 的形式来表示 这除了可以让你少打不少字以外, 对
於以後要将整个区域搬家搬到某个目录下时会产生相当大的便利
如何制作房间]
一个房间必定继承了 ROOM (inherit ROOM), 这是在
有的房间都必须继承它. 才能拥有属於房间的一切特性
一个房间有三个非常重要的函式: 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
下一页
返回列表
返回首页
©2025 MUD游戏网_文字mud 电脑版
Powered by iwms