ZMUD的终极讲座
作者:过儿
高级的编辑:
除了从命令输入栏里输入单独的命令行外,zmud还支持由ANSI构成的复杂信息。
你可以按ctrl-enter或在window菜单里选择editor来激活它。
在zmud的命令行编辑器里,你可以象使用大多数的编辑器一样使用他。
你可以键入很长的文本,可以让光标全屏幕移动。可以剪贴,拷贝,等操作。
在16位版本的zmud里。文本的最大限制为16000行。
编辑器的菜单使你可以从一个文件中读取文本,或将当前的文本储存起来。
Import 的菜单是插入一个文件在当前的光标位置。Send 菜单是将编辑器里
的内容发送到mud里去。你可以在options里选择strings来改变在文本发送到mud前,
你是否要在每一行的开始加上一段相同的文本或用一段文本代替你文本里所有的空行。
Capture 命令是使你可以将mud输出的多行信息输入到你的编辑器里。
#capture 命令可以在触发器里使用以便于将mud的输出调入编辑器。
在编辑器里你还可以改变字体大小格式及其颜色等等。
高级的程序设计:
在前面的变量和触发器里我们讲了一些zmud基本的编程技术。
实际上zmud本身带有一种有力的程序语言,你仅仅是接触到了他的表面而已。
在下面的章节里我们将要详细的讲述zmud编程的每一个细节和大量的函数,
如果你真正读懂了他们,你就会发现zmud可以为你做任何你想让他做的事情。
命令和语法:
每当你输入一行命令按下enter键时,这行命令就将被进行语法分析。一般分析分为下面几步:
检测语句分隔符号";" ,然后将语句分隔;
检测语句的中心;
执行语句。
当命令行被执行,每一类的参数都将被定义,而不管他是否已经被赋值,改变或求值。
比如:我们用 #var 的命令得到一个已经被扩充的字符串的参数,
#var temp 6 赋值6给变量temp
#var hp {100/@temp}
#show @hp 将会显示 100/6;
可是,#math 命令将会得到一个可以估计的表达式的数:
#var temp 5
#math hp 100/@temp
#show @hp 将会显示20
而#func 命令将会得到一个独自在定义变量时左边的字符。
#var temp 5
#func hp 100/@temp
#show @hpp
关于变量的最后一句话:每一个变量必须由空格分开,比如@a如果要被使用,
@a ing 是合法的,@aling 将会被认为是一个新的变量。不过你可以用{}括号
将变量名括起来,比如@{a}ing就合法了。
你可以用以上的语法去完成间接的变量寻址。比如@b的值为a,提交@{@b}将会
扩展变量@b,结果就是@{a}被接受。
如果你老是想使用zmud内定的特殊符号,比如@ 或%你可以使用符号(~)来解释他,
比如zugg ~@zuggsoft.com就是告诉zmud 不要再去将@做为一个变量的定义来解释
。
函数:
在变量之外,zmud 还容许你定义函数,函数很象一个带有参数的变量。
除了函数可以在命令行扩充外,在调用的语法上也有一点不同。
定义函数和定义变量一样,使用#VARIABLE ,在定义时,
我们可以使用%1,%2,....比如#VARIABLE kk {kill %1;kick %1}
定义了一个函数叫@kk,现在我们输入所需的参数在括号里,
@kk{kid}将会执行kill kid和kick kid 两个指令。
讲到这里大家一定觉得这和我们前面定义的别名kk没什么区别,
但实际上,两者是不同的,这里的函数@kk 可以在命令行的任何地方调用。
为了使zmud更有用,zmud预定义了一些函数,
他们提供了一些很有力的触发器处理工具;
在你自己的函数里再加上这些特殊的函数,还有什么zmud的天空能阻止你的飞翔呢?!
预定义的函数:
%abs(i) 返回i的绝对值;
%additem(s,list) 增加字符串s到指定的字符串list里;
%alias(s) 展开(得到)别名s的值;
%ansi(fore,back) 返回fore和back颜色的ansi 代码;
例如:#show %ansi(high,red)hello %ansi(blink.blue,w
hite)word
将会显示亮红色的hello 和在一个白色的底上闪烁的蓝字word
%begins(s1,s2) 如果s1开始时含有s2,值为ture;
%btncol(button,back,fore) 改变按钮的颜色;
%btnimage(button,filename)改变按钮上的图象;
%case(i,s1,s2,s3..) 如果i=1,返回s1;如果i=2,返回s2...最多可以
有8个;
%char(i) 返回i的ascII代码,也用于将系统字符(;:@%!.)转化为他们最近的值。
%color(fore,back) 把颜色的描写转换为属性值;
%concat(s1,s2,s3..) 返回所有的字符串并将其连接在一起,最多有9个;
%copy(s,i,n) 返回字符串s的一部分;规则是从字符i处开始,返回n个字符;
%ddeopen(serv,topic) 打开一个DDE连接到服务器serv,提交名为topic
;
%ddeclose 关闭DDE连接;
%dde(serv,topic,item) 从一个DDE服务器serv上接受数据;
%ddemacro(serv,topic,s) 告诉DDE服务器serv执行s所包含的宏;
%ddepoke(serv,topic,item,value) 从value里poke出数据到D
DE服务器;
%delete(p,i,n) 返回一个被从位置i删除了n个字符的字符串s;
%delitem(s,list) 删除项目s从字符串list中;
%ends(s1,s2) 如果s1以s2结束返回ture;
%exec(s) 把s当作命令来执行,返回得到的结果并将其用|字符隔开;
%expand(s) 用s来扩展一个变量或函数;
%eval(p) 将p作为表达式评估,返回结果;
%format(f,a,b,c,d,..) 使用一字符串的格式来规范a,b,c..的值;
格式的限定有一些特殊字符(%w.dx),w是指长度;d表示小数点后的位数;
x是格式的类型(s表示字符串,n表示数字(每3格打个逗号),f表示小数点,m表示钱)
例如:#show %format('&10.0n),123456) 将会显示有3个空格的123,
456
#show %format('&3.of &s',123,"coins")将会显示123 coi
ns
%getglobal(name) 返回name这个通用变量的值(储存在INI文件里);
%grep(i,s) 搜索文件i,并返回和s图案相匹配的一行;
%if(expression,true-value,false-value)如果expressi
ong(语句或表达示)是ture;
返回true-value;相反返回false-value;
%insert(p,s,i) 返回在位置i插入了图案p的字符串s;
%ismember(s,list) 如果s在list中,,返回值ture;
%isnumber(s) 如果s是个有效的数字则返回ture;
%left(s,n) 从字符串s里返回最左边的n个字符;
%leftback(s,n) 返回s最左边的一部分,从末尾开始的n个字符;
%len(s) 返回字符串s的长度;
%lower(s) 将字符串s全部转化为小写;
%max(a,b,c,...) 返回a,b,c...等中最大的一个值;
%min(a,b,c,...) ..................小........;
%mod(a,b) 给a取模b;
%null(s) 如果s是空,则返回ture;
%numwords(s,d) 返回在字符串s里的单词数,用字符d做间隔,默认的d是空格;
%number(s) 将一个字符串转成数字;
%pick(s1,s2,s3,...) 显示一个选择列表,让使用者可以单选或多选,
如果多选,则返回的值用|隔开;详细请看#pick的介绍;
%pos(p,s) 返回图案p在字符s里的位置,如果没有返回0或false;
%proper(s) 转换s为合适的格式(除第一个字母外,全是小写);
%prompt(v,p) 提示用户变量 v的值;如果p是在场的,就使用不显示的的方式输入;
%random(i,j) 返回一个大于等于i小于等于j的随机的整数,如果j省略了,
那么i就是最大值,0是最小值;
%read(i,rec) 从i文件里读入指定的record ,如果rec被省略,
零就作为假定的,在文本文件里,rec就是每行的行数(0就读下一行)
%remove(p,s) 从字符串s里返回子字符串p;
%repeat(s,n) 重复返回n次s;
%replace(s,p,r) 当所有的p的事件被r所代替,返回s;
%right(s,n) 返回s最右边部分的n个字符;
%rightback(s,n) 返回s最右边的n个字符;
%setglobal(name,value) 设置通用的变量名(储存在ini文件里)
%time(format) 返回当前的日期或时间,如果format被忽略,一个长的格式将被使用,
另外使用字符dd,mm,mmm,yy,hh,mm,ss等在format字符串里将会返回当前时间或
日期的一部分;
%trigger(class) 如果特定的触发器class被激活,则返回ture;
%trim(s) 清理s开始和末尾的空格;
%trimleft(s) 清理s最左边(最开始)的空格;
%trimright(s)...... 右边 末尾........;
%upper(s) 转化s为大写字母;
%word(s,i,d) 返回ith 的单词在字符串s里,用字符d隔开,如果d忽略,就是空格
%write(i,s,rec) 以记录号rec写字符串s进ith文件,在文本文件里,记录号被忽略
,
s将被填加到文件,如果rec=0,s被写到文件的末尾。
%yesno(s) 显示一个问题当用户点击yes或no按钮后,返回ture或false.参照#y
esno
阅读更多的信息。注意如果你建立两个以上的按钮,返回的将是按钮的数字,
你可以将他与#case 语句连用;如果是两个按钮,0或1会被返回,
你可以将他与#if 语句连用你会发现会出现多么强大的功能。
以下的函数是特定在地图中使用的。[]内的项目表示可选的,
%roomname(room,) 返回或设置一个房间的名字到字符串s
%roomdesc(room,) ....................描写......
..
%roomnum(room) 返回一个房间数
%roomid(room,) ....或设置一个房间的短名(id)到字符串s;
%roomcom(room,) ..........到一个房间时指定的命令到字符串s;
%roomnote(room,) ..........一个房间的注释到字符串s;
%roomexit(room,) ....................出口描写到字符串
s,
在s里这串字符每个方向用|来分隔;
%roomobj(room,) 返回或设置一个房间里的物体数到i;
%roommob(room,) ......................npc数...
;
%roomcost(room,) ..........进入一个房间时的花费到i;
%roomkind(room,) ..........一个房间的类型到i;0=正常,1=水
里,2=天空,3=陷阱,
128表示不要进入的标志;
%roomflag(room,) ..........一个房间重做的标志到i(0=fals
e,1=true)
%roomlink(room,dir,) 用方向dir返回或设置房间数为i的这个房间的连接
,
删除连接用i=-1,如果是一个未知的连接用i=-2;
%roomportal(room,s,,[z]) 返回或设置一个不标准的出口或入口,
将房间号i和区域号z赋值给不标准的出口字符串s;
%numrooms() 返回当前区域内的房间数;
%numzones() ........地图....区域..;
%parsemode(i) 返回或设置当前的地图分析模式,i=0表full模式,i=1表示bri
ef模式,
i=2表示look模式;
%walk(i) 返回如果到房间i所得到的快速行走的字符串;
%zonename(zone,) 返回或设置一个区域的名字到字符串s;
%zonenum (zone) ....一个区域数。
zmud 的命令说明:
下面是zmud的命令,在使用中全部用#开头,大写的部分表示这个命令的缩写:
[number] 重复后面跟随的文本number次;例如:#10 study shu
将会重复执行study shu这个命令10次;
ABort 中断当前命令行其他的语法分析;
例如:look corpse;#ab;get all from corpse
将会只执行look corpse这个命令,get all from corpse 将会被忽略
ACtion 建立或显示一个一个触发器;
例如:#ac {^您的密码是:} {#pw}
将会自动为你输入密码;
ADd 增加一个值到一个变量;
例如:#ac {你捡起(%d)两黄金} {#ad gold %1}
当你捡起2两黄金时,2将会被增加到@gold 变量里
ALArm 建立一个记时器;
例如:#ala -1:30:00 {save} 每隔1小时30分钟自动存一次盘;
#ala -59:(55|56|57|58|59) {#show 60-%1}
在每个小时的最后5秒,在屏幕上显示5,4,3,2,1
------------------------------------------------
--
ALias 建立或显示一个别名;
------------------------------------------------
--
ALL 发送一个命令行到所有的窗口;
例如:#all quit 发送quit到所有活动的窗口;
------------------------------------------------
--
BAckup 移走最后一次的移动;
例如:如果当前的路是.nsew ,那么键入#ba 将会改变其为.nse
------------------------------------------------
--
BEep 响铃或播放wav文件;
------------------------------------------------
--
BUtton 触发一个按钮;
例如:#bu 1 将激活第一个按钮;
------------------------------------------------
--
C+ 开始记录到一个窗口;
例如 #c+ temp 将开始拷贝所有收到的文本到一个叫temp的窗口;
------------------------------------------------
--
C- 停止...........;
------------------------------------------------
--
CAPture 记录一行并发送到编辑器或一个窗口;
例如:#trigger {[闲聊]} {#cap chat}
开一个叫chat的窗口供你看mud里的闲聊频道;
------------------------------------------------
--
CAse 从列表中选择一个命令;
例如:#case @hp {study}{sleep}
如果@hp是1(或3,5,7...)study 将被执行;否则sleep将被执行;
------------------------------------------------
--
CHaracter 返回你扮演的人物的名字;
CLose 关闭一个文件;
CLR 清屏;
------------------------------------------------
--
COlor 改变最近一行文本的颜色;
颜色代码值是:
黑色=0;兰色=1;绿色=2;紫色=3;红色=4;紫红色=5
棕褐色=6;灰色=7;黄色=14;白色=15;粗黑=128
如果想让一个颜色更亮丽一些,就在它原来的值上加8,比如9就表示更亮的兰色;
如果是想改变背景的颜色,就将它原来的值乘16;
比如要想得到红色的背景则使用的颜色代码为64;改变前景的字体要再加上128
比如:
#co 159 设置最后接受的一行文本是蓝底粗黑白体(1*16+15+128)
#co red {告诉你}当收到告诉你时将变成红色,不过只是这个短语变红,
如果你想让收到的整句话都如此则:#trigger {告诉你} {#color red};
------------------------------------------------
--
CONnect 重新连接当前任务;
CR 发送新的一行(后面无东西就是一个空行);
------------------------------------------------
--
CW 把最近一行里匹配的字符上颜色;
例如:#trigger {告诉你}{#cw red}
当收到的一行文本里有“告诉你”时,“告诉你”将变成红色;和#co red {告诉你}一样;
------------------------------------------------
--
DDE 发送一个DDE的宏到服务器
例如:#dde netscape www_openurl {http://www.tanfo.c
om/~~guoer}
打开你的netscape 浏览器并载入一个网页,注意这里用了两个~~来回避zmud内定的符号。
------------------------------------------------
--
DEfault 储存和重新设置特殊的字符的默认值;
有9个默认字符分别为:#;@!%.:~<100) {say 我好穷啊} {say 我有的是钱}
如果变量@gold 小于100,你将会说“我好穷啊”;否则你会说:
“我有的是钱”#if (@line=~"给你(%d)两银子") {deposit %d silv
er}
如果某人给了你钱,你就会将钱存起来;
------------------------------------------------
----
IGnore 开关所有触发器动作的处理;
INput 将文本放入命令行;
KEy 定义一个快捷键;
KILLALL 删除所有的别名,快捷键,触发器,标签等
LMap 循环通过地图上的房间;
LOAd 读入一个配置文件;
LOOK 重读一个房间的场景描写给地图;
------------------------------------------------
---
LOOp 循环执行命令行数次;
例如:#loo 3 north 朝北走三步;(默认最小值为1)
#loo 2,4 {get %i coins}
会循环三次,get 2 coins;get 3 coin;get 4 coins;
其中%i是zmud预定义的储存当前循环次数的变量
#loo 3,@num {drink jiudai}
执行drink jiudai(酒袋) @num-3次
------------------------------------------------
---
LOg 开始一个记录文件或固定记录;
MAP 增加一个方向到当前的路径;
------------------------------------------------
---
MATh 执行一个复杂的运算和表达式;
例如: #math test (1+3)*4 将会给变量@test 赋值16;
#alias add {#math add %1+%2}
add 3 4 将会把7赋值给@add;
------------------------------------------------
---
MArk 标记一个路名的开始;
MEdia 发送一个命令给你的多媒体设备;
MEMory 显示内存;
MENu 执行一个菜单命令;
MESsage 在一个小窗口里显示一条信息;
NAme 改变当前窗口的名字;
NOop 什么也不做;
NODef 和#DEF命令一起恢复特殊的字符;
------------------------------------------------
---
NOMAP 预防地图分析从mud传来的匹配行;
例如:#nomap {[闲聊]} 使你的地图避开[闲聊]里的内容;
------------------------------------------------
---
OK 确认一步步的行走;
例如: #trigger {^这是成都的中心} {#ok}
如果从mud接受的图案相匹配时,在慢走模式的下一步
才会分析和执行;
------------------------------------------------
----
PAth 储存或显示当前的路名;
------------------------------------------------
---
PIck 从列表中选择命令;
格式为: #pi v1 [v2 v3 ....]
显示一个列表窗口,v1 v2...等在每一行上(最多可以定义99个),
用户可以选择一个或一个以上的行,被选的行之间将会用;
分隔并作为命令来执行,如果用户按ESC键,将取消这个列表不做任何事.
#pick可以识别两个参数:一个是p:字符串(给列表加标题);一个是o:1(表示只能单选)。
例如:
#pi {p:请选择一个} {o:1} {wear armor}{wear shield} {*
wear beixin}
显示一个列表,表题为“请选择一个”,默认的选择是wear beixin,用户只能选择一项。
(注:在某些版本的zmud里不可用。)
------------------------------------------------
---
PLay 播放一个wav,avi,midi,cd等;
PRompt 出现窗口提示并让你为一个变量或别名赋值;
PW 返回你当前的密码
REAd 从一个文件里读入和执行一段脚本;或读入一个记录
RECALL 传送到地图前一次的位置;
RECord 记录一个别名(允许你采用和记录路名相似的方式记录别名)
RESet 重新设置一个文件为开始
REtrace 反方向走一段路;
SAy 回应一段文本到屏幕;(=echo)
SAVe 储存当前的设定;
SCroll 在有滚动条的缓存区里显示匹配的行;
SEnd 发送一个文本文件到mud,并指定一个前缀命令;
SESsion 打开一个新的任务;
SHow 回应文本到屏幕;
SLow 以慢走模式执行一个路名;
------------------------------------------------
----
STatus 设置定义的状态栏;
例如#st {hp:@hp} 会在当前窗口的状态栏里显示hp:变量hp的值
------------------------------------------------
----
STEp 恢复一个中断的慢走朝前走;
STOp 中断一个慢走;
------------------------------------------------
----
STW 设置一个状态窗口;
例如 #stw {hp: @hp %cr %ansi(red)exp: @exp}
会出现一个小的状态窗口里面包括两行:一行显示你的hp,一行为红色显示你的exp
------------------------------------------------
----
T+ 打开一个触发器;
T- 关闭一个触发器;
T? 显示记时器里剩下的时间;
TAb 增加一个单词到tab键的记忆列表里;
TEleport 传送到地图上指定的房间;
TImer 开关一个记时器;
TRigger 建立或显示触发器;
TS 设置记时器或记时器开始;
TYpe 显示整个或部分文本到屏幕;
TZ 将记时器清零;
UNAlias 移走一个别名;
------------------------
UNGag 不移走一行;
例如:#trigger {告诉你} {#gag}
#trigger {杨过} {#ungag}
将使你只看到杨过告诉你的话
-------------------------
UNKey 移走一个快捷键;
UNTrigger .......触发器;
UNVar .......变量;
--------------------------
UNtil 执行一个命令直到表达式为真;
例如:#var a 10
#until (a=0) {#show @a;#add a-1}
显示一个10到1的倒记数;(注:在某些版本的zmud里不可用)
------------------------------------------------
----
URL 用你的浏览器打开一个网址;
VAriable 给一个变量赋值;
VErsion 显示当前的zmud版本;
VERBatim 选择命令分析方式;
------------------------------------------------
----
WAit 延缓更多处理直到下一行命令被接受;
例如:w;#wa;n; 向西走,当mud返回了信息时再向北走;
#wa 2000;停顿两秒钟再执行下一条指令(每1000=1秒)
------------------------------------------------
----
WALk 快速行走到地图上标记的区域;
------------------------------------------------
---
WHile 执行命令当表达式为真;
例如 a=10
#while (a<>0) {#show @a ;#add a -1}
(注:在某些版本的zmud里不可用)
------------------------------------------------
----
WINdow 打开一个新的窗口;
WIzlist 显示zmud的广告;
WRap 设置显示版面的安排;
WRIte 写一个记录到文件;
------------------------------------------------
---
YEsno 显示一个带按钮的需确认窗口
你可以用 按钮名:要执行的命令方式定义按钮;如果按钮名前带有*号,
将被认为是默认的按钮。按Esc则当作no来处理。
例如: #yesno 你饿了吗?{drink tea;eat leg}
#yesno 你想装备什么武器? {*鸡腿:wield jitui}{剑:wield sword
}{刀:wield blade}
将会出现一个带三个按钮的窗口供你选择,默认的是装备鸡腿
(注:在某些版本的zmud里不可用)
好了,终于要结束了,我的手都打酸了。常常有人拿“泥潭”来形容mud,
的确如此,这里完全是一个崭新的充满活力的世界,不管你在现实社会中是什么,
在这里你刚开始都是白纸一张,你自己的命运完全在你手中,
由你自己决定着自己成长的道路,可以是大侠,可以是大魔头,可以是亦正亦邪;
可以是乞丐,可以是采石工人,可以是看家护院,也可以是为官从政。
我们不是常说“如果生命可以重来,我......”
那么到mud里来吧,到这里来实现你的愿望吧,在这里你可以结婚成家,
也可以成仙得道;总之在现实社会中发生的事在这里一样会发生,
毕竟和你一起玩的都是真正的人啊,他们有的乐于助人(比如在下 :)~),
有的喜怒无常,有的干脆就是一个杀人狂(在现实社会里说不定是个女的呢),
你一样要学会保护自己学会反击敌人学会结交朋友,很多很多。
(最简单的反击方法当然是干掉敌人,不过在你武功不强时,
用rumor 散布对他不利的谣言不失为一种好办法,什么,你觉得太卑鄙了!
那么去客栈吧,在那里是禁止战斗的,在那里chat 吧,
你可以声泪具下的控诉敌人,反正mud内定义了丰富的表情emote)
好了,讲了怎么多,口水也干了,我去喝口水先。
(嘘!...... 不象话,分明是混稿费嘛!)你们在说什么,
我本人虽然去喝水了,但我编了机器人在这里听着呢。
好了,最后祝大家: "陷" 入 泥 潭 ! ^L^
|