1. 指令格式为:edit <档名>,只加文件名,默认为当前目录,加here,表示编辑你当前所处的房间, 回车后即进入线上编辑系统。
2. 如果这是一个已经有的档案,你可以使用 z 或 Z 来看档案。z表示一次显示20行,Z表示一次显示40行。为了编辑方便,最好在开始时用 n 表示每一行在开头处显示它的行数,再用一次 n 取消行数显示;
3. 还有一种方法 ,就是直接打入行数,则会跳至那行的内容上;
4. 如果你开始没打 n ,却想知道现在是第几行请打 = , 想知道内容请打 p ;
5 如果想直接到档案的结尾可输入 $;
6. 五种编辑命令 a i c m d :
a = 从此各行之下插入编辑;
i = 从此行之上插入编辑;
c = 修改此行并插入编辑;
m = 把本行移到特定的行号去
d = 删除;
这些命令也可以和行数结合使用。如 :
7a = 在第7行后插入编辑;
6i = 在第6行前插入编辑;
4c = 直接编辑第4行;
5,8m1 = 将第 5~8 行移至原第 1 行之下。
3d = 删去第 3 行 ;
2,10d = 删去第 2~10 行;
7. 如果这是一个新命名的档案, 这里面当然是没有行数了,一般你应该用 a 来开始编辑第一行;
8. 如果你对某一行或某几行编辑完毕后, 请在编辑结尾的次列开头处打 . 即可退出行编辑状态;
9. 如果想存档请打 x 表示存档退出。 否则请打 q 或 Q 表示放弃编辑退出。
10.其余功能可打 h 参考。由于有的MUDOS汉化不太好,下面列出 h 的中文注释:
/ 前向查找你后面所跟着的字符,比如/酒袋
? 后向查找你后面所跟着的字符
= 显示当前行是第几行
a 在当前行后新增加一行
A 类似'a'命令,但是将翻转自动缩进模式
c 将当前行内容覆盖掉输入新编辑内容
d 删除指定范围的行
e 退出当前档案, 开始编辑另一档(档案改变过未存盘无效)
E 类似'e'命令,但是文件被修改过也有效
f 显示或改变文件名
g 查找匹配行并对其执行相应命令
h 帮助文件(就是显示你现在看到的这些信息,可能是英文)
i 在当前行前面插入一行
I 排版整个代码 (Qixx version 1.0)
j 合并行,系统默认是将后续行连接到当前行
k 标记当前行- later referenced as 'a
l 显示指定行(可显示控制字符)
m 移动指定行(或几行)到指定位置
n 行号显示切换开关
O 同命令'i'
o 同命令'a'
p 输出指定范围行
q 退出编辑器
Q 退出编辑器,即使文件已经被修改且未存盘
r 在文件尾或指定行后读进另一文件
s 查找并替换(只对当前行第一个查找的字符串进行替换)
set 查询,改变和保存编辑器的设定值
t 复制指定行到指定位置
v 搜索并对不匹配行执行指定命令
x 保存文件并退出
w 将编辑的内容写到当前文件或指定的文件里
W 类似'w'命令,但是是将编辑的内容附加到指定或当前文件后
z 显示20行,可用参数 . + -
Z 显示40行,可用参数 . + -
前面一章讲过,当你成功地编写了一个程序后,只是意味着这个程序已经在硬盘了,只有在别的使用者调用到它的时候,才会被呼叫出来,进入内存。文件本身是否有错误,将首先会在这时被发现。对于巫师来说,消极地等待别人去调用它时再去发现有没有错是十分不明智的,这时最好的就是先update它。
update <文档名>
注意了:如果系统显示:“重新编译 ***.c:成功!”的信息,并不就表示你的这个程序就完全正确了,它只是表示你的程序的基本语法没有错误,如果程序里还有一些由其它的条件或文件才能触发呼叫的函数的话,还有有可能存在一些隐患,保险的做法就是按照设计时的条件把它们一一触发,进行尝试,直到完全通过。比如象一些NPC里有是否接受拜师的函数,你则想法不同的条件的人去拜它试试,把每一种可能都试过,看看是否执行正常。有的房间里加了add_action(),你则一一试试这些add_action(),看一下后果。
如果文档中有错误,一般系统会唰地一下子出来一大串的错误信息,对于新巫师来说,只要去看看第一行的出错内容就行了,后面的很多错误都是由前面的带来的。还有许多信息还显示其它的与一些重要的系统文件也出错,也大抵是如此,首先还是找出关于这个文档里的第一个出错的行数,再到这个文档里去查找,仔细查看该行数,以及前后几行,有没有少写多写括号、漏记多添逗号、定义变量类型错误等等,如果显示出错的行数在最后一行,甚至更后的话,那就要看看是不是函数声明出错,或者定义了无效的函数。每改一次,再update一次,直至编译成功。有关于各种出错信息的意思和处理办法,还是要在实践中多多尝试,但是,在此要忠告各位新巫师,如果你所工作实习的MUD是一个正在开放中的MUD,希望对于没有任何把握的文件的编译工作最好先在自己的单机版进行,有些恶性的错误严重时会导致整个游戏宕机。
接下来就是任何一个新巫师一上任就十分感兴趣的命令----call!call就是直接呼叫(执行)函数的意思。在某种程度上,它就象征着巫师手中的神杖。这个对于玩家来说威力无比的功能,既是一种巫师利器,更是一种危险器械。因此,在大多数的MUDLIB中都对于call的命令的使用进行了记录,以备天神的查看和监督。call的命令格式如下:
call <物件>-><函数>(<参数>, ...... )
从其理论上来说,它可以呼叫任何没有被protect的函数。具体我们可以看这个程序: /adm/daemons/emoted.c d 在这个程序里面有一个这样的函数:
string *query_all_emote()
{
return keys(emote);
}
那么。我们就可使用call命令直接呼叫它:
call /adm/daemons/emoted.c->query_all_emote()
~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
(物件) (物件的函数)
由于这个函数本身没有要传参数,就不用再加参数了。那么执行后,程序本身就会返回一个字符串的数组回来。而显示在我们屏幕上面的内容就是所有的emote的英文名字。
在实际工作中,上面的这种用得还是很少的,大部分的修改和查看我们都可以用more或edit去完成,但是对于尤其象玩家档案这些以.o形式储存的文件用edit编辑则有些费劲了,所以这时使用call的命令来得更为方便些。
巫师们常常会call me(或者id)->set("combat_exp",10000)
在这里,me就是自己,其实它对应着一个物件程序:/obj/user.c,后面的set()也是系统放在一个文件里最基本的函数。后面的括号里面便是这个set函数的参数。它的意思就是在me这个物件里执行set()函数,通过set()函数将combat_exp这个参数设为10000。如果。要改变别的人,就可以在call后面加上这个人的id。set()这个函数可以执行什么呢?其实很简单,打开一个复杂一点的NPC,它里面所具有的参数,我们一般都能用call命令进行。
call命令可以调用的函数非常多,一般由你call的物件有关。但在一般使用中,我们大多使用三种函数,一是set,也就相当于我们做程序中的set一样,你可以set这个物件任何可以set的参数;第二个就是query,用它可以查看你所call的物件有没有这个参数,这个参数内容是什么?第三个就是delete,顾名思义,它正与set相反,用以删除物件上的这个参数。其它一些固定的函数,例如武功的set_skill,设定姓名的set_name等等就不一一叙述了。
一共四章的《新巫师入门手册》写出去以后,叮当一直有一种诚惶诚恐的感觉。因为我无论在接触MUD之前还是之后,都未接触过任何的编程语言学习,更别提什么C了。象我这样的人写出的教材,是否会误人子弟呢?但叮当也相信,在网上,也一定会有许许多多与当初的叮当一样,对于已有的一些巫师教材看得云里雾里的感觉。不是责怪这些教材写得太深,而是确实自己的基础太差。正是基于这点,叮当才决定依据网上已有的一些教材为基础,从自身的体会与理解出发,编了这册不成样子的《新巫师入门手册》。但是上网后,想不到竟会收到了很多新巫师朋友的感谢、赞扬与鼓励。他们对手册的肯定,也增强了叮当的信心。于是决定在加上一篇补遗篇,补充说明LPC编程中的一些基本概念,完成这册入门教材。并斗胆考虑起中级教材的布局。
同时,叮当也声明,所有的概念都是从我自己的理解出发,请勿与专业教材中的定义相提并论,若有贻笑大方之处,还望各路高手多多指点。
第 五 章
补 遗 篇
第一节:变量
首先,我发现新巫师们编程结束后,一旦update就呼啦啦地出现一大群的编译错误,其90%以上都是一些逗号,分号,括弧的基本错误。到底这些符号应该怎样使用呢?它们之间有何规律呢?但是在解释它们之前,我们必须来理解LPC中的变量与变量类型。
变量是什么?我觉得你应该把它理解为一种不确定的替代值,有点象现实中的经纪人。其代表的人只要在第一次出来一下:声明某某是我的经纪人后,就可完全由变量