找回密码
 注册
搜索
查看: 1942|回复: 0

巫师编程三

[复制链接]
门派:不明
发表于 2010-5-9 10:19:48 | 显示全部楼层 |阅读模式
二、进阶篇
要让你的区域中富有变化,生动有趣,除了文字叙述的丰富度以外,你更可以
利用 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() 等其他的函式,而一个简单的房间根本没有用到,所以我们用
replace_program() 来将原本的被继承的标准物件「重置」(或说取代)掉,但是一
旦房间中用到了 init() 来编写时,就绝对不可以用 replace_program(),因为系统
届时找不到 init() 便会随便呼叫一个记忆体中的位址而随便传进一些乱七八糟的东
西,情况严重时,甚至可以让整个 mud crash。但是,我们自不可因噎废食,该用的
时候还是要用,这些应该是一个好的程式写作人员自己必须留意的,发生状况要自己
负责。
7) 定义在人物物件中的附加函数(apply functions)
void defeated_enemy(object victim)
当这名人物打昏一个敌人的时候会呼叫这个附加函数,victim 即是被打昏的的
敌人物件。
呼叫者: COMBAT_D
有预设定义此一函数的系统物件: none
void killed_enemy(object victim)
当这名人物杀死一个敌人的时候会呼叫这个附加函数,victim 是即将要被杀死
的敌人物件。
呼叫者: COMBAT_D
有预设定义此一函数的系统物件: none
int accept_fight(object who)
当有其他生物对这个人物下 fight 指令的时候,会呼叫这个附加函数,who 是
下 fight 指令的生物,如果是对 player 下,"fight" 指令会直接显示讯息徵
求被挑战一方的同意,如果是对 NPC 下这个指令,则当这个附加函数传回 1
时才会接受挑战,否则显示某某不想跟你较量的讯息。
呼叫者: "fight" 指令
有预设定义此一函数的系统物件: NPC
int accept_object(object who, object item)
当有人用 give 指令给这个非玩家人物东西时,会呼叫这个附加函数,传回 1
表示愿意接受这个东西,传回 0 表示不接受。
呼叫者: "give" 指令
有预设定义此一函数的系统物件: none
void recruit_apprentice(objct apprentice)
当一个人物收了另一个人物做弟子时会呼叫这个附加函数,你可以在这个函数里
修改弟子的 rank 或其他东西。
呼叫者: "apprentice" 指令
有预设定义此一函数的系统物件: none
8) 房间属性
"short" (string)
房间的短叙述。
"long" (string)
房间的长叙述。
"item_desc" (mapping)
房间中个别景物的叙述,格式为:([ <景物名称>:<景物叙述>, …. ])。
其中<景物叙述>可以是字串或 function type。
"exits" (mapping)
房间的出口,包括有门的方向,格式为:([ <出口>:<房间档名>, …. ])。
"objects" (mapping)
房间中的物品、生物,格式:([ <物品或生物档名>:<数量>, …. ])。
"outdoors" (string)
房间是否为「户外」,户外房间可以看到天色变化与气候影响。字串的意义
表示房间的气候区,通常和该区域的 domain (即 /d 下的目录名称) 同。
"no_fight" (int)
房间是为禁止作战区域。
"no_magic" (int)
房间是为禁止施法区域。
9) 物品属性
"name" (string)
物品的中文名称。
"id" (string)
物品的英文名称。
"long" (string)
物品的详细描述。
"value" (int)
物品的价值,单位是「钱」(coin)。
"unit" (string)
物品的单位,如:个、把、枝…..
"no_get" (int)
表示物品是否可被捡起来。
"no_drop" (int string)
表示物品是否可被丢弃,如果型态是 string, 则当有人企图丢弃这个物品时
会将该字串用 notify_fail 传回去。
□ 武器属性
"skill_type" (string)
这个武器所属的技能种类,如 "sword"、"blade" 等,要注意在 /d/skill
下必须有一个定义该武器技能的物件,否则装备这个武器战斗时会有错误
讯息。
"rigidity" (int)
武器的硬度,当使用武器相斗时,硬度、武器的重量、持用者的力量将会影
响武器受损的机率。
武器受损机会所用的强度值计算公式如下:
重量/500 + 硬度 + 力量
"weapon_prop" (mapping)
武器对持用者的状态影响,通常武器只影响 "damage",这些状态影响会在
武器被装备时用 add_temp() 加到持用者的 apply 上,并於卸除或 dest
时减回来。
"flag" (int)
武器的一些型态旗标,详见 的定义。

编程中要注意的小问题

1.一些重要的单词可别写错喔:象create,environment,gender,……

2.LONG 描述的要点: 这是很重要的,一旦出错就很惨了…..
请注意:long <长叙述>,其格式为:

set("long", @LONG

room or npc 的叙述…….

LONG
);

其中 @LONG 和 LONG 是互相对应的,你可以用任何字接在 @ 後面,但是前
後两个字一定要一样,这样系统才能判别,而房间的叙述写完时,一定要换行後再

^^^^^^^^^^^^^^^^
接第二个 LONG ,且同一行不能再有其他任何的字元,不然系统无法判定叙述是否
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
该结束了,会造成编译时的错误。

3.一些结构要有始有终,象函数的{ } 啦,还有mapping([ ]) ,array({ }) 啦,
要是忘记写后面的那个就…….

4.__DIR__ 的用法,一般来说__DIR__ 是指该NPC OR ROOM 的当前目录。所以要弄
什么物件的话就用这个__DIR__的相对目录做好了。

嗯,就想起这么多了,以后再写别的吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|书剑永恒MUD ( 闽ICP备14012032号|闽公网安备 35050202000162号 )

GMT+8, 2025-7-27 08:25 , Processed in 0.026851 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表