第一次接触MUD应该是在2000年左右,偶然看到了血海飘香这一款MUD,给我留下了深刻的印象。但因为时间关系并没有玩多久。09年第一次下载了夕阳再现MUD的源码,当时只是抱着玩玩单机的态度,没有深入研究。今年陆陆续续又下载了终极地狱完整版的源码以及海洋2007的源码,自己试着改了一些东西,放在这里留作备忘,一方面也是想抛砖引玉,让MUD更加方便,更容易入手。
玩夕阳再现时使用的是TOMUD客户端,我很喜欢TOMUD显示物品快捷栏、环境快捷栏的功能,以及右键自动菜单,还有非常方便的快捷方向键,可惜后来玩终极地狱和海洋时,这两款MUD都不支持TOMUD,逼着我去研究ZMUD的使用方法。后来发现虽然ZMUD没有TOMUD的那些快捷显示和操作功能,可在其他功能上却更为强大,所以也渐渐喜欢上了这一款工具。
现在还在研究如何让MUD支持TOMUD客户端,虽然有点头绪,但进展很慢,以后若是有什么发现再写吧。今天只先写一下使用ZMUD客户端的情况下的一些心得。
我手里的三个MUD,夕阳再现、终极地狱、海洋2007,应该说夕阳的系统最简单,地狱其次,海洋最为复杂。可是这三个MUD里的一些功能却各有千秋,并不是最复杂的MUD就最好用,下面先说第一点,look
look指令,应该是MUD中最重要的指令吧,看物品、看人、看环境、看路全靠他。三个MUD中look指令最好用的是夕阳,因为只有夕阳的look会自动显示当前地点的小地图,即显示出和当前所在地连接的相邻地点。我觉得这对新手非常方便,可不知道为什么许多最新的网上MUD中都没有这个功能,让我很不习惯。
其实这个也好改,只要将夕阳再现源码中/cmds/std/look.c中的realtime_map函数,以及look_room函数中相应调用realtime_map的语句添加进自己MUD的look.c文件中就可以实现了,几乎不用修改。
第二点是夕阳中的look指令可以看到装备的属性,其实这一点倒不是很重要,要实现也挺麻烦,要修改不少语句,放到以后再写吧。
第三个功能则是我自己的一点想法,还在研究怎么实现。就是总觉得作任务太难上手了,总要不停的看help,如果help文档不全那就要了老命了,ask 某人 about XXX,这XXX该填什么完全靠猜,为什么不能在look 某人/某物 时,显示能对他/它进行的特殊操作呢(当然这可能使解谜变得简单,但既然是谜题,程序完全可以另写嘛)。要实现应该也是容易的,比如人物,其创建文件中一般都有这样的语句:set("inquiry", (["秘籍" : (: ask_me :),]));这句的意思就是可以进行操作:ask 人物 about 秘籍。
那只要在look.c文件的look_living函数中作一些修改,对人物的功能就可以实现了。
下一个功能则是set prompt函数,夕阳是没有这个功能的,地狱和海洋有。地狱中set prompt hp可以实时显示当前的气和精,海洋中set prompt 4可以在每次输入命令时显示当前气、精、经验、潜能。两种应该说各有利弊。我后来对海洋的/feature/message.c文件进行了修改,使set prompt 4可以显示当前气、精、内力、精力、经验和潜能,并且根据气、精(等等)和最大气、精的比例来改变颜色。
其实我更想做的是把地狱中实时显示的功能移植到海洋,可惜还有点问题没解决。
折腾了一下,总算把显示解谜的语句搞出来了,只要在look_living的最后加入下面的语句就可以了,至于要加的变量定义为
mixed inq;
string *gks;
int i;
语句为
inq = obj->query("inquiry");
if (arrayp(inq) || mapp(inq)) {
gks = mapp(inq) ? keys(inq) : inq;
for (i = 0; i < sizeof(gks); i++)
printf("你可以询问%s关于"+HIC+"%s"+HIW"的问题。\n", obj->query("name"),gks[i]);
}
看一下效果吧:
戚老板最近是爆发横财,所谓是三年不开张,开张管三年。
他看起来有四十多岁。
他看起来气血充盈,并没有受伤。
你可以询问戚长发关于我的钱的问题。
你可以询问戚长发关于宝物的问题。
你可以询问戚长发关于higgling的问题。
你可以询问戚长发关于买卖的问题。
你可以询问戚长发关于翡翠兰的问题。
你可以询问戚长发关于钱的问题。
你可以询问戚长发关于生意的问题。
你可以询问戚长发关于东西的问题。
你可以询问戚长发关于朱睛冰蟾的问题。
你可以询问戚长发关于我的东西的问题。
你可以询问戚长发关于赎的问题。
你可以询问戚长发关于还我钱的问题。
你可以询问戚长发关于讨价还价的问题。
你可以询问戚长发关于天王保命丹的问题。
今天下午终于把实时显示当前数值的代码搞出来了,当然都是借鉴的地狱的代码来修改海洋。
首先要在/include/下增加一个message.h文件,直接把地狱的拷贝过去就可以了。
然后要修改/inherit/char/char.c文件,在void heart_beat()的开始增加下面的语句:
if (userp(me) && living(me) && mapp(my["env"]))
{
prompt = my["env"]["prompt"];
if (((int)prompt == 1 || (int)prompt == 2 || (int)prompt == 3 || (int)prompt == 4) &&is_waiting_command() && ! me->is_attach_system())
{ write_prompt();}
}
这个是设定自动取得信息的语句。
然后需要修改/clone/user/user.c文件,加入以下语句:
static int attach_flag = 0; // 是否正在和系统联络
int is_attach_system()
{return attach_flag;}
int attach_system()
{ attach_flag = 1;}
int detach_system()
{attach_flag = 0;}
这个是判断用户是否正在连接系统。
最后的修改最麻烦,需要修改/feature/message.c文件,大段的代码需要从地狱里抄,主要是这么几个函数:string prompt(),void clear_written(),int is_waiting_command(),void receive_snoop(string msg),void write_prompt(),void receive_message(string msgclass, string msg),但这几个函数都不能简单的抄,需要进行一些修改,调试了一下午终于成功了。
最后就可以对prompt()中喜欢的函数进行随意修改了,比如我就把参数4改成了实时显示气、精、内力、精力、经验、潜能等所有战斗信息,很方便,因为会每秒自动取得最新数据显示,
而且只占用最下面一行,所以很清楚及时,而且屏幕上很干净,比原来效果好多了。
效果图,注意最下面一栏是输入栏,上面显示的精和上面hp指令查出来的已经不一样了
≡——————————————————————————————————≡
· 精 气 · 10301/ 21601 (100%) · 精 力 · 4003 / 4003 (+0)
· 气 血 · 20272/ 20272 (100%) · 内 力 · 345 / 345 (+0)
·精力上限·22500 / 15000 ·内力上限·75000 / 25000
『 食 物 』 298/ 300[正常] 『 潜 能 』 5456 上限[73500]
『 饮 水 』 298/ 300[正常] 『 经 验 』 10000
『 灵药药性 』:无
『 普通药性 』:无
≡———————————————————————————海 洋 II———≡
[气:20272|精:16101|内力:345|精力:4003|经验:10000|潜能:5456]⊙