Re:ZMUD知识
zmud使用详解(续)这套trigger我主要介绍两个重点:
第一、class应区分开,这样用#T+、#T-时才不会混乱,当逃跑时关闭escape,睡醒后再打开,就可以防止多次激活trigger;
第二、如果有的trigger这句你既没有加上颜色也没法在前面加^,那就最好当不用时就#T-关上,比如,我们fight时最好把"你一觉醒来"之类的关上,等跑去睡觉时再打开以防混乱。
#IF语句的精华在于判断变量的大小而做出不同的反映,比如:
#IF {@a>100} {haha} {sigh}
这句话就表示当变量a>100时haha大笑,不大于100时(包括小于和等于)就sigh叹气,如果我们用前面讲的方法把体力或内力从屏幕上取下赋值为a,那就可以做一个判断气血内力多少的trigger来打npc。有不少人用增加自己的延时的方法打npc,当被npc打出来时就发呆10-20秒,因真气高气血恢复得多所以很快能恢复满继续冲进去战斗,这种简便易行的办法足以应付简单的战斗进程。而应用了#IF和变量取值等高级trigger后反而会出现种种问题我自己就曾做了用变量判断内力多少来决定是否中止战斗出去循环,可也死在上面两次,都是
trigger混乱导致的。所以,告诫大家,应用变量和函数是trigger中的高级做法,如果不是trigger大法深不可测之人,切忌舍易求难,一切应从实用出发。
忽然想起这样一个小问题,有的朋友曾问我,当同时fight10个同名的npc时,如何只打后面5个,放过前面5个不打。我们可以用#loop语句轻松完成,如例:
#loop {5,10} kill dizi %i
这个例子中的5和10可以换成变量来操作,配合背dizi的trigger,可以几个人在一起练功不互相干扰,比如#loop {@a,@a+5} kill dizi %i。还有朋友曾问起我如何制作自动打招呼的trigger,关键是如何获取player的英文id,这是有一定难度,下面进行讲解。
1、Class --- come (enable)
Pattern:(%1)走了过来。
Commands:#t- come;#t+ come1;#var cname %remove(> ,%1);id here
此trigger中关键是用id here来将玩家的中文名字转换成英文id,因为在mud中顶头经常出现“>”符号,所以用%remove函数将“>”去掉,值得注意的是,在“>”后应多加一个空格然后才是“,%1”,这样才能准确获得玩家的中文名字,以便准确激活下面的trigger。
2、Class --- come1 (disable)
Pattern:@cname (%s) = %1
Commands:#var ename %1;l @ename;#t+ come2
打“id here”后,同一房间内玩家的中文名字和英文id都显示出来,但应注意的是在中文名字后的空格长短不一,需要用%s来替代,而在“=”后面的英文id就不需要考虑空格的问题了。另外,我在这里介绍另一个函数%trim(@a),这个变量可以消去变量a两旁的空格,用%trimleft(@a)是去掉左边的空格,%trimright(@a)是去掉右边的,这个函数在某些因空格数不一定的trigger中能起到非常好的作用。
3、Class --- come2 (disable)
Pattern:他看起来约(%x)多岁。
Commands:#var sex male;#var cage %1
此句取来者年龄性别。
4、Class --- come2 (disable)
Pattern:她看起来约(%x)多岁。
Commands:#var sex female;#var cage %1
性别本来应该可以做了变量取下来用#if {%1=~"他"} {#var sex nan} {#var sex female}来判断识别,可我在trigger中反复调试竟然不成,这是我一直没有解决的问题,哪位高手知道希望能不吝赐教。似乎问题在于=~" "引号里面的内容不能是汉字,是英文就可以,搞不懂怎么回事。
5、Class --- come2 (disable)
Pattern:武功(%1)
Commands:#var wugong %1;#if {@sex=~"female"} {#case %random {xixi @ename;
#wa 3000;say @cname妹妹,你刚@cage几岁,武功都练到@wugong啦!} {pat @ename;#wa 3000;
say @cname,@cname2都等了你好久啦,怎么才来!;#var @cname2 @cname} {kiss @ename;
#wa 3000;say 大功告成,亲个嘴儿!}}
{#case %random {pig @ename;#wa 3000;say @cname,你的武功怎么还是@wugong呀,@cage
多年真是白活了!} {jump;#wa 3000;say @cname大哥来啦,@cname2呢,快给上茶!;#var @cname2
@cname} {heng @ename;#wa 3000;say @cname,你还有脸来见我,快自己了断了吧!}}
这句比较长,请大家仔细看清楚语法结构。主要用了#case和%random函数,在cake的文章中已经有比较详细的论述,我这里不再多说了。主要用#case可以使打招呼的话变各种花样,把player的id,中文名字,性别,武功等级都取下来做在trigger中,显得更生动有趣,还可以把player的容貌、身体状况和穿戴也取下来,我这里也不多讲了。
本想写一篇关于如何制作回答审判官(judge,注SDXL没有判官,其他很多MUD里都有)问题的文章,我自己也苦心制作了trigger,可我看了一个朋友给我的trigger后,无论怎样也无法超越前人的杰作了。并且,我也并不赞成judge triger的推广,因为如果那样的话,巫师也许会制作更难缠的judge来抓玩家,或者将指令数限制的更严。
下面我再讲讲一个 trigger中一个有趣的设计,就是做一个玩家描述的文本档案,当别人ask xxx about id时,xxx会说出与所问id有关的一段话。
1、Class --- ask
Pattern --- 向你打听有关『%1』的消息。
Commands:#if {%1=@askname} {#math dask @dask+1} {#var dask 0};#if {@dask>6}{heng;say 你别老问个不停好不好?不理你了!;#t- ask;#wa 60000;#t+ ask;say 好吧,再跟你们聊一会儿吧,别老问个不停呦。} {#t+ ask1;askname=%1;#if {%len(@askname)<3} {shake;say 你听说过有人叫@askname么?} {#sh %grep(1,"@askname");#var aass %grep(1,"@askname");#if {@aass=~""} {#case %random {shake;say 不太清楚...}{?;say 天龙有这号人么?我怎么不知道?} {heng;say 我不想谈他,换个话题吧...}{sigh;say 我脑子里也记不住这么多人呀!} {blink;say sorry,我不知道,不过,你可以tell我“记录 <id> <描述>”,我就可以记住啦,try!}}}}
这个trigger比较复杂,前面部分在于防止有人连续ask捣乱,让你被KICKOUT出去,所以如果同一人连续ask6遍以上,就会停止trigger一分钟。中间部分是防止所问id过短(少于3个字母),如果过短会出现混乱。第三部分#sh %grep(1,"@askname");#var aass %grep(1,"@askname")是关键内容。用%grep函数来找出与所问id匹配的描述。最后部分是防止所问id为中文或者在文本档案中没有记录的部分。
2、Class --- ask1
Pattern --- (@askname)(%s)(%1)
Commands:#t- ask1;askname2=%1;say @askname2
当找到匹配的描述后,会在屏幕上显示出来,就用这个trigger取下id后面的中文描述剩下的就简单了。
我知道我讲解的过于简单了,可实际上很多东西是难于在字面上解释清楚的,你自己实际操作一下,会发现很容易,而且理解的更透。
Trigger在练功中可以省去我们很多指令输入,是玩Mud的一个重要帮手,其实能迅速准确的激发,完成你要达到的目的就可以了。我这篇文章从浅入深谈zMUD的函数与变量,到后面其实已经脱离了练功trigger的范畴。做一个智能的机器人,用trigger来模仿真人的说话和emote,甚至完成一个完整的事件,已成为了一些trigger高手的趣向。如果我们再给机器人加上具有个性的言谈和emote,并且自动寻找出口四处走动,那几乎可以“以假乱真”。
Re:ZMUD知识
zmud机器人制作特殊符号在触发器钟的应用 西瓜太郎(Xyan) (Sat Jun 29)以下特殊符号是触发器中经常要用到的,我把它们列在下面。
* 匹配任何字符或数字。
? 匹配任意的一个字符。
%d 匹配任何数量的数字。
%w 匹配任何单词。
%a 匹配任何数字或字母(a-z,0-9)
%s 匹配任何数量的空格或制表符。
%x 匹配任何数量的非空格。
匹配任何已经列出的字符。
^ 强制句型必须在行首出现。
$ 强制句型必须在行尾出现。
(句型) 把匹配的句型保存在参数%1到%9中。
~ 引用符号,避免Mud把下一个字符当成特殊字符。
~~ 匹配一个“~”。
{val1|val2|val3|...} 匹配任何指定的字符串。
{^字符串} 使句型不匹配指定的字符串。
&nn 匹配n个字符。(这是一个长度句型)
可能大家光看了上面的不大懂,我再说具体一点吧,*是代表任意字符,包括什么空格啊,
什么数字啊,什么英文啊,统统都可以用这个东西来代替,比如* 两白银,就可以代表一两
银,二两白银,许多两白银,我不晓得好多两白银,这些句型。
?可以代替一个字符,如??lver可以代替:silver,Silver,Oplver,啊lver,都可以,需
要注意的时汉字要占两个字符,因此一个汉字要用两个?。
%s代表任意的空格(Space嘛)。这个就不管多少空格了,使用时要加括号,例如:(%s) 捕
快的尸体,这个句型就可以代替: 捕快的尸体,捕快的尸体, 捕快的尸体。
%x和上面一个%s恰好相反,他代表的是任意的非空格,但是,这个使用时照样要加括号;
这个和*号是有区别的,因为*可以代替空格。
^这个命令可以强制文字必须在句首才执行!有用哦!例如,^【悄语】程药发~((%w)~)告
诉你:有一个强盗在北京附近为非作歹,你去干掉他!这个句型就必须是程药发告诉你才能
行,如果是:某某人说:【悄语】程药发告诉你:有一个强盗在北京附近为非作歹,你去干
他!是不会执行的。这就可以减少我们许多麻烦,用在其他方面:^你被奖励了:也再也不用
怕别人在任务完成的地方不停地说这句话了!问题是,许多Mud在前面会自动加上一个>或你
状态,使这个句型失效,关于这个,很多文章都做了介绍,你也可以使用颜色Trigger。不?
我打的Mud 游戏——武林争霸,虽然前面还是有你的状态,但是,只要一出现上面的那些关
的文字,都是从句首开始的!
和^相反的是$号,他的作用是强制句型在句尾,比如:你被奖励了:$这个句型,必须要以?
字结尾的才匹配。
%w可以代替任意的英文,有的时候,人物的英文名字前面第一个字母是大写的,你可以用%
Lower()函数来改变他。如:全真教第二代弟子 狂客~((%w)~),这个句型中,%1获得的是Ku
ke,要获得狂客真正的id就应该是%lower(%1)。
%d可以代替任意的数字,要想自己的内力小于70000 时就睡觉怎么办呢?你可以输入:~『内力~』(%s)(%d),在命令里输入:#if (%2<70000) {sleep}就可以了。