|
楼主 |
发表于 2010-4-2 01:23:09
|
显示全部楼层
/*这里放了两个常用的用法,共同之处,就是“:”的左边是物品名(其实不是物品,也就是一个记号而已)或者叫可以让玩家用look指令看的字符,一旦look men后,就会由右边的来显现信息。第一种情况:右边直接是描述的语句,比如"look men"就会出现“一座高大的城门......”。第二种情况后面是(: 函数名 ,就调用这个函数。而这个函数名必须在文件头声明了,比如我们这里的"pai"就是调用(: look_pai ,在后面要对该个函数进行设置*/
set("exits", ([ //设这个房间的出口
"east" : __DIR__"dajie1", //该方向要连到的房间文件名,注意不需加.c后缀
"west" : __DIR__"yidao1", //__DIR__的意思就是这个文件所在的当前目录
"northeast":__DIR__"qiangdong",
]));
set("objects", ([ //设这个房间里东东,npc和物品
__DIR__"npc/bing":2, //后面的2,也可是1、3 表示数量
]));
create_door("northeast", "小门", "southwest", DOOR_CLOSED);
/*这是定义门,注意它的格式是:
create_door("入口方向","门的名称","出口方向","预设状态")
预设状态有两种,也就是DOOR_CLOSED和DOOR_OPENED,分别表示初始状时是关着或开着。因为这些都是写在/include/room.h文件里,所以我们一定在这个文件头加上inherit <room.h>。*/
set("outdoors", "wuxi"); //指出它是室外,并在wuxi(区域目录名)这一区域
setup(); //设置结束
}
/*注意:关于“replace_program(ROOM);”的用法,由于在房间的标准物件中有定义了如 init() 等**的函式,而一个简单的没有机关的房间根本没有用到,所以就用replace_program() 来将原本的被继承的标准物件「重置」(或说取代)掉,以便最大限度地节约系统内存的耗用。但是一旦房间中用到了 init() 来编写时,就绝对不可以用 replace_program(),因为如果你写的是一个复杂的房间,就会在很多触发函数的地方,而这个文件加了这行后,又会把那些多于简单房间定义的函数清除掉了。于是一旦这些地方开始触发了,系统到时就会找不到那些触发的函数。一般地情况下,系统就随便呼叫一个记忆体中的位址而随便传进一些乱七八糟的东西,而情况严重时,可以让整个 mud宕机。我们现在这的这个例子中需要用到一些其它的函数,那当然不能用它喽。对于新巫师来说,这一行在不能确定是是否要加的情况下,还是选择不加为好,毕竟,浪费些空间与当机的比较是很明显的。
接下来我们来定义前面提到了look_pai的函数了*/
string look_pai(object me) /*me是一个对象,指作动作人,也就是this_player(),如果在这里不定义,那么就要在函数里用 object me; me = this_player();进行定义*/
{
if( wizardp(me) ) //wizardp(me)是一个efun函数,判断me是否是巫师
return "大木牌写着:无锡城门。正在建设中,叮当留。\n";/*根据上面的条件,这句话只有me是巫师时才能看到*/
else //如果不是巫师
return "大木牌写着:无锡城。\n";
}
这个程序到此结束。
接下来是一个较为复杂的人物例子
// /kungfu/class/baituo/ouyang-feng.c 白驼开山祖师欧阳锋
#include <ansi.h> //表明这个文件要用到颜色
#inherit NPC; //继承NPC的属性
inherit F_MASTER; //继承可收徒的NPC属性
int check_self(); //声明,文件中有战斗行为函数的定义
int learn_message(object ob,string skill);//声明:文件中有learn_message()函数的定义
string ask_zhang(); //声明:文件中有谜题函数的定义
void create()
{
set_name("欧阳锋", ({ "ouyang feng", "ouyang", "feng" }));
//注意,不要用set("name","")直接set_name
set("long", "他是白驼山庄主,号称"HIW"“西毒”"NOR"的欧阳锋。\n"
+"虽然由于习练「九阴真经」走火入魔,变得精神错乱,但\n"
+"是他那额头上的层层紫晕,令人不得不服他是一代高手!\n");
//这就是不用@LONG&LONG的例子,所以就必须在每句尾加上“\n”的换行标志
set("nickname", HIW"西毒"NOR); //外号,用到了颜色,所以开头没有include <ansi.h>这里会出错
set("gender", "男性"); //性别,太监是无性
set("age", 53); //年龄
set("shen_type",-1); //神的正负,如果没有set默认是1,用这个乘以exp/10得到神值
set("attitude", "peaceful"); //指这个人物的好战态度
set("str", 30); //膂力,
set("int", 29); //悟性
set("con", 30); //根骨
set("dex", 28); //身法,这些先天属性,可设可不设,但要符合原著精神
set("qi", 2500); //当前气
set("max_qi", 2500); //最大气,就是恢复满时
set("jing", 900); //当前精
set("max_jing", 900); //最大精
set("neili", 2000); //当前内力
set("max_neili", 2000); //最大内力
set("jiali", 50); //相当于玩家的加力jiali *
set("combat_exp", 1500000); //经验
set_skill("force", 200); //设置武功,这是基本内功
set_skill("unarmed", 170); //反正一项项设,略.......
......
set_skill("nilian-shengong", 200);
......
map_skill("force", "nilian-shengong"); //相当于玩家的jifa
......
create_family("白驼山派",1, "开山祖师");//门派头衔
set("inquiry" ,([
"欧阳克":"欧阳锋嘿嘿一笑:“那是我的乖侄子,你见过他了吗?”\n",
"蛇杖":ask_zhang,
]));
/*这个是设置当玩家ask sb about sth时的信息,“:”前就是sth,后面
则是返回的信息。这有点与房间里的set("desc_item")相似。所以也有关
于 (:ask_zhang的函数调用,这个函数我们在文件头已经定义过了,后
面将会有具体的内容。*/
set("chat_chance",2); //设置随机动作的机率,这是指2%
set("chat_msg",({ //设置随机动动作
"欧阳锋自言自语道:“我白驼山派神功一成,定能重霸江湖!!”\n",
"欧阳锋道:“我儿欧阳克聪慧过人,必能够重振白驼山派雄风!”\n",
"欧阳锋道:“江湖险恶,困难重重,我才是天下第一!”\n",
}));
set("chat_chance_combat", 100); //这是指战斗中的随机行为,注意区别。
set("chat_msg_combat", ({
(: command("wield zhang") ,
(: command("wield zhang") , //装备武器
(: perform_action, "staff.shewu" ,
(: perform_action, "staff.shewu" ,//使用绝招
(: command("unwield zhang") ,
(: check_self , //这是我们自定义的一个函数,在后面写着
}) );
setup();
carry_object("/d/baituo/obj/shezhang");//身上的东西,加上“->wield”就是装备好了,如果没有这个,就会在身上,但没装备起来
carry_object("/clone/misc/cloth")->wear();//这件衣服就是穿上的,也可不穿
add_money("silver",50); //设置他身上的钱,可以gold,coin
}
void init()
{
::init();
add_action("do_skills","skills");
add_action("do_skills","cha"); //两个动作调用同一个函数do_skills
}
int do_skills(string arg)//定义do_skills函数,并表明其类型
{
object ob ;
ob = this_player () ; //定义ob是指的执行这个动作的人
if( !arg && arg!="ouyang feng"&& arg!="ouyang"&& arg!="feng" )
return 0; //如果对象不是欧阳锋,则返回调用skills的cmds指令
if(wizardp(ob)) //return 0; 是巫师的话返回调用skills的cmds指令
if (ob->query("family/master_name")!="欧阳锋")
return 0; //师父不是欧阳锋的话返回调用skills的cmds指令
if(!ob->query_skill("nilian-shengong",1))//如果没学过逆练神功
{
write("欧阳锋目前所学过的技能:\n"+
" 基本内功 (force) - 深不可测 200/ 0\n"+
"□蛤蟆功 (hamagong) - 深不可测 200/ 0\n"+
......\n"); //略
return 1; //参考前面的懂了这里retrun 0和return 1的意思吗?
}
else //相反则是学过
{
write("欧阳锋目前所学过的技能:\n"+
" 基本内功 (force) - 深不可测 200/ 0\n"+
"□逆练神功 (nilian-shengong) - 深不可测 200/ 0\n"+
.......
\n"); //这时才让他的徒弟能查看欧的逆练神功级别 |
|