北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 44982|回复: 115

我好像误入歧途了

[复制链接]
发表于 2015-4-21 07:40:11 | 显示全部楼层 |阅读模式
自从用了mush,我好像一直在写lua文件,几乎所有的触发都用
wait.regexp
来做

现在仔细想想,我是不是做错了?
wait.regexp等待的时候会漏掉很多信息
不如用mush里的触发做比较好
lua只是用来做比较复杂的地方,大部分地方还留给mush里的触发

大家说哪种方式对呢?
多谢

北大侠客行MUD,中国最好的MUD
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 07:41:11 | 显示全部楼层
比如渡江渡河
我如果用wait.regexp来作,那么等待的时候很难做其他事情,如果再碰到个杀手,就不知道怎么处理了
用触发则可以多个模块并行,然后互相制约,是不是比较好呢?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-4-21 11:42:50 | 显示全部楼层
我的机器一般是用状态机来做的。

所有的正则之类只变更状态。

然后根据当前状态来确认要做什么。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-4-21 11:43:29 | 显示全部楼层
还有就是理论上用mush的正则比较好点。

应为可以分组。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-4-21 11:52:43 | 显示全部楼层
另外如果我没猜错的话。

你的wait.regexp是按照异步+callback的方式来做的。

这种情况下,没有很好的控制库,如js的async/q这样库的话,要死人的。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 12:56:50 | 显示全部楼层
回复 5# jarlyyn


抱歉,看不太懂你的意思

状态机是什么意思?比如我目前要渡河,同时还在等杀手,同时还要打坐,请问这个情况下你是怎么处理的?

异步+callback是啥意思?我完全不懂......
我用wait.regexp的方式很简单,发出某个指令,然后wait.regexp等反馈,我希望能得到所有可能得到的反馈,然后根据反馈计算下一步动作
这样做的问题在于,我没法同时获得多个方面的反馈,除非我把所有的模块都合到一起,否则我等这个反馈的时候,那个反馈也许会来
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 12:58:15 | 显示全部楼层
比如,我目前写的渡江模块

        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
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 13:03:06 | 显示全部楼层
回复 5# jarlyyn


但是,我这么写,好像要想在等待的时候打坐,就很麻烦:又要保证能打坐,又要保证能随时准备渡江,我不可能把打坐模块写到这里面吧?所以我觉得我误入歧途了。
所以,我目前打算,回归zmud的写法,在游戏里的触发器里建立几个触发器:

你一提内息,看准了江中渡船位置,使出「一苇渡江」轻功想要飞越.*。
就输出渡船结束,然后让走路模块继续进行

有船不坐,你想扮Cool啊?
就打开打坐类(#t+的那种),然后同时打坐,同时等待这句
艄公们把踏脚板收了起来,长篙一点,渡船向江心驶去。

江面太宽了,如果没有中途借力的地方根本没法飞越过去!
就打开打坐类,然后打坐一次后再进行dujiang命令

这是回归了zmud的写法。
请问是不是有更好的办法啊?正经的程序员是怎么个思路呢?我一直是野路子
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 13:10:45 | 显示全部楼层
目前我的地图渡河部分节点是这样的
比如:
[1624] = {
        area = "扬州城",
        descriptions = {
            [1] = "面前是一条波涛翻滚的大江(river)。 浊流滚滚,万舟竞发。两岸渡船来",
            [2] = "来往往,江边一长溜摆满了鱼摊,渔家就将船泊在岸边,支一块木板,板上摆",
            [3] = "满了活蹦乱跳的鲤鱼。不远处是一个摆渡,不少过江客都在这里等待渡船。",
        },
        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 = {
            [1] = "anything",
            [2] = "anything",
            [3] = "长江南岸---长江南岸---长江南岸",
            [4] = "|",
            [5] = "江南官道",
        },
        name = "长江南岸",
    },
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 13:15:43 | 显示全部楼层
行走命令函数的解码部分大概是这样的

if map[way.waygo[i]].exits[way.waycmd[i]].alias then
                        alias(map[way.waygo[i]].exits[way.waycmd[i]].alias)
                        table.insert(shouldbehere,way.waygo[i+1])
                else

就是说,如果这个节点的这个方向的alias不为空(绝大部分节点,99.9%都为空),那么调用alias函数,这样整个走路暂停,等alias函数解决之后,再继续走下一步

这是我目前的做法,实际上已经完全可以做到定点到达了,渡江渡河都不是问题,但是感觉这么写太“独”了,只是走路的话,这样应该可行,但很多时候我不仅仅走路,就完蛋了。

另外,我一直没弄懂lua的”协程“到底是怎么个概念。我某个协程正在wait.regexp的时候,其他mush里的触发,可以再新建一个协程,然后两个协程同时运行吗?还是说,协程只有一个,新建协程原有协程就不会再运行了?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-14 10:40 AM , Processed in 0.015613 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表