Mush,怎么抓取带有换行的房间描述
请问在Mush里面怎么把带有换行的房间描述抓出来吗?我试了向下面这样写的触发器
(.+) \- \n (.+)
setVar("room_desc","%0")
但提示报错
:1: unfinished string near '"东门 - '
试过了 string.gsub("%0","\n","")也不行
北大侠客行MUD,中国最好的MUD 新人看不懂啊
.+应该是任一信息
\-是啥?就是-是么......
\n是换行?
然后你就是抓了一个房间名,一个描述,是吗?
可是这个没看到多行,只有一个换行符是吧?
应该是\n (.+)好几个是吧?描述多行啊
另外,为什么有这么几个空格呢?不能用\s\s之类的吗?不确定了 2012年的代码,现在应该不能直接用了。只提供个思路,其他请自行领悟。room={
new = function ()
local _R = {}
setmetatable(_R, {__index = room})
return _R
end,
relations={},
name = "",
descriptions = {},
exits = {},
items = {},
}
function look (direction)
--~ 得到direction方向上房间的look信息并返回,如果direction为空则look当前房间。返回信息举例:
--~ "items":
--~ 1="店小二(xiao er)"
--~ "name"="醉仙楼"
--~ "descriptions":
--~ 1="方圆数百里内提起醉仙楼可以说是无人不知,无人不晓。当年苏学士云游到"
--~ 2="此,对醉仙楼的花雕酒赞不绝口,欣然为其题匾,留下一段传遍海内的佳话,从"
--~ 3="此醉仙楼名声大震。楼下布置简易,顾客多是匆匆的行人,买点包子、鸡腿、米"
--~ 4="酒就赶路去了。楼上是雅座。"
--~ "exits":
--~ 1="up"
--~ 2="west"
--~ "relations":
--~ 1="醉仙楼二楼"
--~ 2="〓"
--~ 3="北大街----醉仙楼"
R = room.new()
R.relations = {}
R.descriptions = {}
R.exits = {}
R.items = {}
r = {}
Send("set action draw_room")
if direction then
run("look " .. direction)
else
run("look")
end
Send("set action q")
Send("set action draw_end")
l,w = wait.regexp('设定环境变量:action = "draw_room"')
while true do
l,w = wait.regexp(".*")
if string.find(l, "风景要慢慢的看。") then
wait.time(2)
return look(direction)
end
if string.find(l,'设定环境变量:action = "draw_end"') or string.find(l,'设定环境变量:action = "q"') then break end
table.insert(r, l)
end
--处理房间信息
local m = { name = rex.new("^(\\S+) \\- $"),
exits = rex.new("这里.*的出口是(.*)"),
ex = rex.new("(\\w+)"),
weather = rex.new("「.*」: .*。"),
}
for i, v in pairs(r) do
if string.sub(v,1,1) == ">" then
r = string.sub(v, 3, string.len(v))
end
if m.name:match(v) then
_, _, R.name = m.name:match(v)
R.name = R.name
for j = 1, i-1 do
if string.sub(r,3,5) == " " then
r = trim(r)
if r ~= nil and r ~= "" then
table.insert(R.relations,r)
end
end
end
for j = i+1, #r do
if m.exits:match(r) then
while m.ex:match(r) do
local _, _, ex = m.ex:match(r)
if ex == nil then break end
ex = ex
--~ print(ex)
local pos_start, pos_end = string.find(r,ex)
--~ r, _ = string.gsub(r, ex, "")
r = string.sub(r, pos_end + 1, string.len(r))
if not is_Special_exits(ex) then
table.insert(R.exits,ex)
end
end
--武当广场的出口太多会被分成两行
if R.name == "武当广场" then
print("对武当广场的特殊处理!")
table.insert(R.exits, "southeast")
table.insert(R.exits, "southdown")
end
table.sort(R.exits, function (v1,v2) return precede_exits<precede_exits end)
for k = i+1, j-1 do
r=trim(r)
if r ~= nil and r ~= "" then
table.insert(R.descriptions, r)
end
end
if #R.descriptions - 1 > 0 and m.weather:match(R.descriptions[#R.descriptions - 1]) then
table.remove(R.descriptions, #R.descriptions - 1)
end
if m.weather:match(R.descriptions[#R.descriptions]) then
table.remove(R.descriptions, #R.descriptions)
end
for k = j+1, #r do
r=trim(r)
if r ~= nil and r ~= "" then
table.insert(R.items, string.lower(r))
end
end
end
end
break
end
end
return R
end 思路大概知道,代码看不懂啊......
一点点问哈
开头部分,room部分,是定义了一个类,有个构造函数,但里面的就不懂了
setmetatable是干什么?百度了一下,看不懂啊...... 44行:l,w = wait.regexp('设定环境变量:action = "draw_room"')
以上的部分基本明白,初始化对象(其实可以放进构造函数里吧?),然后发送游戏命令l+方向,如果没方向就只l。
但44行,wait.regexp命令就不是很明白了,貌似是等待这条消息回来之后(记得还有个参数是最高等待时间吧?如果省略是不是就是无限等下去?),把内容存到l,w里去?
可是l,w是啥意思啊?为什么可以有两个变量后面加赋值的?难道后面的也是两个?没发现啊,奇怪的lua 还有,wait.regexp是mush的函数,不是lua的函数是吗?两者没有冲突的关键字吗?
44行的意思是,等待到这行出来之后,程序才开始继续执行是吗? 还有,wait.regexp是mush的函数,不是lua的函数是吗?两者没有冲突的关键字吗?
44行的意思是,等待到这行出来之后,程序才开始继续执行是吗? 回复 4# ltblue
我也不懂,生搬的。lua的一个特性吧,这里借助它实现面向对象。。想具体了解可以翻翻《lua程序设计》 一直到52行,table.insert(r, l)基本明白意识了
刚才想了一下,隐约记得好像是l,w=XXX,就是两者都=XXX的意思是吗?
这段的意思,大概就是读入信息,直到输出的结束语句
然后把信息插入链表r?这个52行命令是这个意思吧? 回复 5# ltblue
这个函数有两个返回值。就像a, b = 1, 2那样——lua是这么支持的