场景设计怎么写( 三 )


当然,有时候为了某些目的,比如一个迷宫,你可能会相邻的几个房间都用到一样的叙述,那自然不在此限 。2. 一个房间的出口则以下列格式赋予: set("exits",([ "方向" : "连接到的房间之档名",。
.. ]); 在这里,为了一个以后区域开放后搬移目录的便利性,建议采用__DIR__ 这个由系统提供的巨集来写路径,比如说: "west" : __DIR__"path3",和 "west" : "/u/d/davidoff/goathill/path3",是完全一样的 。但前者显然在以后目录的搬移上方便的多 。
而在下面会提到设定房间中的物品或生物时,也建议采用这种方式写作 。3. item_desc 这是用来设定个别景物的描述,当玩家用 look 这个指令时就会作用 。
其格式为: set("item_desc",([ "景物名称" : "景物叙述",。
.. ]); 其中景物叙述可以是字串或是一个 function,所以你可以利用这个功能加以变化,当玩家 look 一个景物时,可能看到叙述,也可能发生一些特殊的事件,而你就可以在被呼叫的函式中写下这些事件 。
4. objects 可以让这个房间在每次 reset 时载入某些生物或某些物品: set("objects",([ "物品或生物的档名" : 数量,。
.. ]); 如同前面所提到的,建议采用 __DIR__来编写你的路径,而数量则要用整数 。
5. 要为这个房间添上门户时,记得前面必须先 #include。而格式为: create_door("出口方向","门的名称","进入方向",预设状态); 比如说,这里明显的出口有 west、east 和 up 。
而你要让西边有一个关上的红木门,你可以这样写: create_door("west","红木门","east", DOOR_CLOSED); 当玩家进入这个房间时,他会看到:这里明显的出口有 east 和 up 。而当他 look west 时,会看到:这个红木门是关上的 。
其他的一些属性,你可以参考 /doc/build/room_prop 或是读一下标准物件的 room.c 。也建议你可以多用 more here来观看一间特殊的 room 。
二、进阶篇 要让你的区域中富有变化,生动有趣,除了文字叙述的丰富度以外,你更可以利用 init() 这个函式为你的房间增加一些「机关」或「秘密」 。这里,先让我们了解一下 init() 的用途为何,和为什麽要用到它 。
每一个房间的 create() 只有当 reset 时才会被呼叫到,而 init() 则是在 B 物件进入到 A 物件时都会呼叫到 A物件的 init()。看到这,你应该可以看出差别了,我们希望当一个物件(此处较多是玩家)进到一个房间时,能够经由某个动作启动这个房间的机关的话,自然是利用 init() 来编写 。
一般的使用方式,是在 init() 中利用 add_action() 来呼叫你写的函式,其格式为: add_action("function type", "action"); function type 即是被呼叫的函式名 action 是启动的动作 而你就可以将被 action 启动后要发生的事,都写在被呼叫的函式里面 。理论上来说,利用这个方式我们可以做到任何事,当然,能不能达成就看写程式的功力了 。
下面举个简单的例子: void init() { add_action("do_pick", "pick"); } int do_pick(string arg) { object me; me = this_player(); if ( !arg || ( arg != "flower" ) ) return notify_fail("你要摘什麽?\n"); else if ( random((int)me->query("kar")) < 7 ) message_vision("$N将花摘了下来,但一不小心被刺了一下 。\n", me); else message_vision("$N摘下一朵美丽的血红色鲜花 。
\n", me); return 1; } 当玩家利用 pick 这个指令时就会呼叫到 do_pick() 这个 function,而启动了这个房间的机关 。这里特别提到一点,一个简单的 room 我们为了使记忆体的使用量降到最低,会在 create() 最后加上一行 replace_program(ROOM);。
这是因为在房间的标准物件中有定义了如 init() 等其他 。