我好像误入歧途了
自从用了mush,我好像一直在写lua文件,几乎所有的触发都用wait.regexp
来做
现在仔细想想,我是不是做错了?
wait.regexp等待的时候会漏掉很多信息
不如用mush里的触发做比较好
lua只是用来做比较复杂的地方,大部分地方还留给mush里的触发
大家说哪种方式对呢?
多谢
北大侠客行MUD,中国最好的MUD 比如渡江渡河
我如果用wait.regexp来作,那么等待的时候很难做其他事情,如果再碰到个杀手,就不知道怎么处理了
用触发则可以多个模块并行,然后互相制约,是不是比较好呢? 我的机器一般是用状态机来做的。
所有的正则之类只变更状态。
然后根据当前状态来确认要做什么。 还有就是理论上用mush的正则比较好点。
应为可以分组。 另外如果我没猜错的话。
你的wait.regexp是按照异步+callback的方式来做的。
这种情况下,没有很好的控制库,如js的async/q这样库的话,要死人的。 回复 5# jarlyyn
抱歉,看不太懂你的意思
状态机是什么意思?比如我目前要渡河,同时还在等杀手,同时还要打坐,请问这个情况下你是怎么处理的?
异步+callback是啥意思?我完全不懂......
我用wait.regexp的方式很简单,发出某个指令,然后wait.regexp等反馈,我希望能得到所有可能得到的反馈,然后根据反馈计算下一步动作
这样做的问题在于,我没法同时获得多个方面的反馈,除非我把所有的模块都合到一起,否则我等这个反馈的时候,那个反馈也许会来 比如,我目前写的渡江模块
if what == "渡江" then
local dujiangok="^>* *[%s]*你一提内息,看准了江中渡船位置,使出「一苇渡江」轻功想要飞越.*。[%s]*$"
local dujiangboathere="^>* *[%s]*有船不坐,你想扮Cool啊?[%s]*$"
local dujiangboatthere="^>* *[%s]*江面太宽了,如果没有中途借力的地方根本没法飞越过去![%s]*$"
local dujiangboatgo="^>* *[%s]*艄公们把踏脚板收了起来,长篙一点,渡船向江心驶去。[%s]*$"
while true do
Execute("dujiang")
l,w = wait.regexp(dujiangok .. "|" .. dujiangboathere .. "|" .. dujiangboatthere);
if string.find(l,dujiangok)then
waitfree(0.5)
return
end
if string.find(l,dujiangboathere) then
wait.regexp(dujiangboatgo)
end
if string.find(l,dujiangboatthere) then
wait.time(2)
end
end
end 回复 5# jarlyyn
但是,我这么写,好像要想在等待的时候打坐,就很麻烦:又要保证能打坐,又要保证能随时准备渡江,我不可能把打坐模块写到这里面吧?所以我觉得我误入歧途了。
所以,我目前打算,回归zmud的写法,在游戏里的触发器里建立几个触发器:
你一提内息,看准了江中渡船位置,使出「一苇渡江」轻功想要飞越.*。
就输出渡船结束,然后让走路模块继续进行
有船不坐,你想扮Cool啊?
就打开打坐类(#t+的那种),然后同时打坐,同时等待这句
艄公们把踏脚板收了起来,长篙一点,渡船向江心驶去。
江面太宽了,如果没有中途借力的地方根本没法飞越过去!
就打开打坐类,然后打坐一次后再进行dujiang命令
这是回归了zmud的写法。
请问是不是有更好的办法啊?正经的程序员是怎么个思路呢?我一直是野路子 目前我的地图渡河部分节点是这样的
比如:
= {
area = "扬州城",
descriptions = {
= "面前是一条波涛翻滚的大江(river)。 浊流滚滚,万舟竞发。两岸渡船来",
= "来往往,江边一长溜摆满了鱼摊,渔家就将船泊在岸边,支一块木板,板上摆",
= "满了活蹦乱跳的鲤鱼。不远处是一个摆渡,不少过江客都在这里等待渡船。",
},
exits = {
east = {
cmd = "e",
gto = 1627,
},
enter = {
cmd = "enter",
gto = 1626,
move = 1,
},
south = {
cmd = "s",
gto = 1628,
},
todujiangs = {
alias = "渡江",
cmd = "dujiang",
gto = 138,
needtime = 30,
},
west = {
cmd = "w",
gto = 1625,
},
},
location = {
= "anything",
= "anything",
= "长江南岸---长江南岸---长江南岸",
= "|",
= "江南官道",
},
name = "长江南岸",
}, 行走命令函数的解码部分大概是这样的
if map].exits].alias then
alias(map].exits].alias)
table.insert(shouldbehere,way.waygo)
else
就是说,如果这个节点的这个方向的alias不为空(绝大部分节点,99.9%都为空),那么调用alias函数,这样整个走路暂停,等alias函数解决之后,再继续走下一步
这是我目前的做法,实际上已经完全可以做到定点到达了,渡江渡河都不是问题,但是感觉这么写太“独”了,只是走路的话,这样应该可行,但很多时候我不仅仅走路,就完蛋了。
另外,我一直没弄懂lua的”协程“到底是怎么个概念。我某个协程正在wait.regexp的时候,其他mush里的触发,可以再新建一个协程,然后两个协程同时运行吗?还是说,协程只有一个,新建协程原有协程就不会再运行了?