玩mud有数据库和无数据库对游戏体验个人感觉是巨大的,以前没数据库知识,机器人的很多功能很难实现,经过近2个星期的努力也算做了个半成品出来,以此留念以备以后查找。
对于数据库,论坛里有不少关于数据库的介绍,大多数是外部数据库的使用,个人觉得721自带的数据库足够用了。要使用数据库必须的有数据,因此最开始就是数据的获取。里面的代码很多借鉴了论坛里其他人的代码,自己加以修改。
房间信息的获取,开启log记录文件,把想要录取的房间走一遍,关闭log。在离线模式下,命令行输入#send /xxx/room.log 该命令可以把名字为room的log文件在zmud窗口全部逐行显示,xxx为文件夹,可以使用相对路径。
#REGEX "test0" {^(\S+)\s\-\s+$} {#t+ catchroom;#var roomName %1}
#COND {(.*)} {#if (%regex( "%1", "^\s*(\S+)$")!=0) {#var roomDesc %1;#state test0 0} {#STATE test0 1}} {regex}
这条tri是多行触发器,第一行 ^(\S+)\s\-\s+$是抓取房间名,匹配后打开catchroom这个类,将房间名赋值给变量roomName。第二行(.*)是获取匹配房间名后出现的所有行,当满足出现的行不为空行时停止抓取,并将该行赋值给roomDesc,其实就是房间描述的第一行。到此抓取房间名和房间描述完成,房间描述取一行个人认为足以。
#CLASS {catchroom}
#TRIGGER {^%s这里*的*{有|是} (*)。$} {#var dir {%1};#if (%pos( " ", @dir)!=0) {#var dir {%replace( @dir, " ", "")}};#if (%pos( "、", @dir)!=0) {#var dir {%replace( @dir, "、", "|")}};#if (%pos( "和", @dir)!=0) {#var dir {%replace( @dir, "和", "|")}};#var dir {%replace( %sort( @dir), "|", "-")};#var roomDesc @roomDesc;#var roomDesc %replace( @roomDesc, ",", "");#var roomFull @roomName++@roomDesc**@dir;#if (%ismember( @roomFull, @roomFullList)!=0) {#var successFlag 1} {#var successFlag 0};#if (@successFlag=0) {#var roomDirsList %additem( @dir, @roomDirsList);#var roomNameList %additem( @roomName, @roomNameList);#var roomDescList %additem( @roomDesc, @roomDescList);#var roomFullList %additem( @roomFull, @roomFullList)} {};#t- catchroom}
#CLASS 0
看着挺乱,粘贴上去就是这样的,没办法,慢慢解释吧。这个就刚才抓取房间名后打开的那个类catchroom里的tri.
#var dir {%1}
#if (%pos( " ", @dir)!=0) {#var dir {%replace( @dir, " ", "")}}
#if (%pos( "、", @dir)!=0) {#var dir {%replace( @dir, "、", "|")}}
#if (%pos( "和", @dir)!=0) {#var dir {%replace( @dir, "和", "|")}}
#var dir {%replace( %sort( @dir), "|", "-")}
这几行是将出口信息抓取出来,通过去“空格” 去“、” 去"和",最后在每个方向之间用-隔开,想用什么做分隔符可以自己定。
#var roomDesc @roomDesc
#var roomDesc %replace( @roomDesc, ",", "")
#var roomFull @roomName++@roomDesc**@dir
前2个命令是将房间描述自己给自己赋值转成乱码,然后去掉转成乱码后里面的,,为什么要去掉这个,,因为我发现在数据导入excel时会很麻烦,难以说清,自己可以去测试。
第3个命令将房间名、房间描述和出口方向组合成一个字符串,基本上这三者组合就可以唯一确定一个方向,有人会说如果这三者都一样呢?办法也是有的,只是没测试,不能证实正确性。
#if (%ismember( @roomFull, @roomFullList)!=0) {#var successFlag 1} {#var successFlag 0}
#if (@successFlag=0) {
#var roomDirsList %additem( @dir, @roomDirsList)
#var roomNameList %additem( @roomName, @roomNameList)
#var roomDescList %additem( @roomDesc, @roomDescList)
#var roomFullList %additem( @roomFull, @roomFullList)
} {}
#t- catchroom
该段代码是通过三者组合的变量roomFull去查找roomFullList这个list变量里面是否存在,如果存在,说明之前这个房间信息已经抓取,如果不存在,则将当前的房间名、房间描述、房间出口方向、房间三和一信息加入到roomNameList、roomDescList、roomDirsList和roomFullList。其实只需要加三和一信息就可以了,其他三个都可以从这个里面分隔出来。加这三个变量是为了验证和roomFullList数量是否一致。我的测试是描述List、方向List和roomFullList数量一致,房间名的数量少了,经过检查,发现有多个房间名合在了一起。为什么这样,不清楚,但十有八九是乱码搞的鬼,合在一起的都是有乱码的房间,所以说721的乱码问题是永远的痛啊。
所有的房间信息都加入到roomFullList这个list变量后,下一步就是将里面的信息分隔出来。- #ALIAS splitRoomList {#var roomNameList {};#var roomDescList {};#var roomDirsList {};#var temp {};#forall @roomFullList {#if (%regex( %i, "(\S+)\++(\S+)\*+(\S+)", roomName, roomDesc, dir)) {#var roomNameList %additem( %replace( @roomName, "+", ""), @roomNameList);#var roomDescList %additem( %replace( @roomDesc, "*", ""), @roomDescList);#var roomDirsList %additem( @dir, @roomDirsList)} {#var temp %additem( %i, @temp)}}}
复制代码 这个alias是将roomFullList里面的每一项逐个取出赋值给相应的房间名list、描述list、方向list.有了相应的list,就把这些信息写入文本文件里进行下一步处理。
#file 1 roomtable.txt
#loop %numitems( @roomFullList) {#wri 1 {%item( @roomNameList, %i)|%item( @roomDescList, %i)|%item( @roomDirsList, %i)|%item( @roomFullList, %i)|扬州:yz}}
#close 1
第1条命令,打开磁盘上名字叫roomtable.txt的文件,把它称呼为1.这个file命令,经测试,相对路径不能用,绝对路径不好使,不带路径,该文件在zmud.exe同路径下。
第2条命令是循环roomFullList变量list的数量次数,以此将各个list里的值写入到txt文本里。最后那个扬州:yz是新加的,说明这些信息属于扬州这个区域,属于额外信息,以备以后使用。
最后close 1关掉打开的文件。这样最初的房间信息可以拿到了。
北大侠客行MUD,中国最好的MUD |