jarlyyn
发表于 2021-9-7 01:40:11
下一个要处理的部分就是重头戏,游戏基础信息了。
这个可以说是做mud的重中之重,所以我把它单独的抽了一层出来。
对于一个好的机器人来说,这一块应该是会经常变动,不停补充的
所以,这一块应该尽量解耦合,尽量以提供接口的形式和 mod部分进行交互 以便发生大更新时,只需要替换游戏基础信息,不需要大的重构。
jarlyyn
发表于 2021-9-7 01:49:11
本帖最后由 jarlyyn 于 2021-9-7 01:50 AM 编辑
游戏基础信息里比较重要的就是 位置信息和路径了。
由于这次我们做的是符合北侠标准的绿色机器人,不收集复杂的 信息。
我第一步先收集了扬州的一些重要位置。
位置信息
https://github.com/hellclient-sc ... cript/info/rooms.js
addroom("yzgc","扬州广场",{Landmark:"Rong shu"})
addroom("yzqz","扬州钱庄",{Station:"扬州钱庄"})
addroom("yzdp","扬州当铺",{Landmark:"Tang nan"})
addroom("yztj","扬州铁匠",{Landmark:"Wang tiejiang"})
addroom("yzzxl","扬州醉仙楼",{Station:"醉仙楼"})
addroom("yzcg","春来茶馆",{Station:"春来茶馆"})
addroom("yzyp","扬州药铺",{Landmark:"Ping yizhi"})
addroom("yzsy","扬州书院",{Landmark:"Fu zi"})
addroom("yzkd","扬州客店",{Landmark:"Song shengyi"})
其中Station指独一无二的房间名
Landmark指固定的独一无二的房间内元素
路径信息
https://github.com/hellclient-sc ... cript/info/paths.js
"yzqz":"yzgc|n;w|e;s",
"yzdp":"yzgc|s;e|w;n",
"yztj":"yzgc|e;e;s|n;w;w",
"yzzxl":"yzgc|n;n;e|w;s;s",
"yzzxl":"yzgc|s;s;w|e;n;n",
"yzyp":"yzgc|e;e;n|s;w;w",
"yzsy":"yzgc|e;e;n|s;w;w",
"yzkd":"yzgc|n;e|w;s",
|分割,提前,前往的路径,回来的路径
同时,我还绑定了两个事件,用于在进入新房间或者look查看信息时判断是否为独特房间,进行定位。
那么最终的效果是,当我移动到能识别出的房间时,会自动定位并进行提醒,比如
> 扬州钱庄 - [大宋国] [城市]
这里明显的出口有 east 和 south。
定位成功,位于 扬州钱庄(yzqz)
钱庄老板「铁公鸡」钱眼开(Qian yankai)
善人 大轮寺第十一代弟子「傣族首领快点给我人世间」橘右京(Ukyo)
全真派 散仙「22ok」无痕心(Xiaobaichi)
日月神教 教众「三分毒七分奶亲戚是黑白子」毒奶扁鹊(Bianque)
那么,很好。
能定位,有路径,下一步就是自动行走了。
我们的机器人马上就要动起来了。
不过时间不早了,等下次再更新行走的模块了。
jarlyyn
发表于 2021-9-8 03:13:24
本帖最后由 jarlyyn 于 2021-9-8 03:55 PM 编辑
让我冷静一下……
hzlhzlhzlhzl
jarlyyn
发表于 2021-9-8 03:42:42
本帖最后由 jarlyyn 于 2021-9-8 04:24 PM 编辑
先把获取路径部分代码丢出来吧。
获取路径一般需要路径数据,通过简单的算法算出来。
寻路算法最有名的是dijkstra
介绍可以看https://www.jianshu.com/p/a235d9877d32
由于mud本身的特性,对性能要求不高,算法并不需要很完美的实现。
我10年前在北侠论坛放出的机器人里包含一个mush用的dll的实现,这次客户端里自带一个,其实用lua或js来实现也很简单。
就是把地图想象为一张白纸,从起点开始,按时间依次沿路径向外(白色的地方)扩散,只要有颜色了就不再覆盖,没轮扩散后检查是否有重点被染色了,有就是需要的路径,没有继续扩散。知道扩无可扩,说明找不到路径。
go语言的代码没用什么语言特性,可以很容易的迁移到其他语言,具体见:
https://github.com/jarlyyn/hellc ... es/mapper/mapper.go
以及
https://github.com/jarlyyn/hellc ... s/mapper/walking.go
我们现在做的很简单,就是把昨天我添加的几条路径,分解为 为去和来的路径,比如 yzgc到 yztj 的 e;e;s 和yzth到yzgc 的 n;w;ww 添加到房间信息里去
同时注册了一个ready事件,在机器人ready(所有模块记载完之后)将地图信息载入mapper。
然后把起点和目标地址列表传入,就能获取到路径信息了
具体来说
我现在的房间信息列表为
addroom("yzgc","扬州广场",{Landmark:"Rong shu"})
addroom("yzqz","扬州钱庄",{Station:"扬州钱庄"})
addroom("yzdp","扬州当铺",{Landmark:"Tang nan"})
addroom("yztj","扬州铁匠",{Landmark:"Wang tiejiang"})
addroom("yzzxl","扬州醉仙楼",{Station:"醉仙楼"})
addroom("yzcg","春来茶馆",{Station:"春来茶馆"})
addroom("yzyp","扬州药铺",{Landmark:"Ping yizhi"})
addroom("yzsy","扬州书院",{Landmark:"Fu zi"})
addroom("yzkd","扬州客店",{Landmark:"Song shengyi"})
addroom("yzdtpns","扬州打铁铺内室",{Station:"打铁铺内室"})
路径列表为
app.Info.Paths={
"yzqz":"yzgc|n;w|e;s",
"yzdp":"yzgc|s;e|w;n",
"yztj":"yzgc|e;e;s|n;w;w",
"yzzxl":"yzgc|n;n;e|w;s;s",
"yzzxl":"yzgc|s;s;w|e;n;n",
"yzyp":"yzgc|e;e;n|s;w;w",
"yzsy":"yzgc|e;e;n|s;w;w",
"yzkd":"yzgc|n;e|w;s",
"yzdtpns":"yztj|s|n",
}
我在扬州钱庄去了钱,想去铁匠铺内室买牛哄哄金闪闪的武器。
由于我有钱庄到广场,广场到铁匠铺,铁匠铺到内室的路径,能算出要走的命令
输入 /DumpPath("yzqz","yztjpns"),得到结果
{
"Delay": 6,
"Path": [
{
"command": "e;s",
"from": "yzqz",
"to": "yzgc",
"delay": 2
},
{
"command": "e;e;s",
"from": "yzgc",
"to": "yztj",
"delay": 3
},
{
"command": "s",
"from": "yztj",
"to": "yzdtpns",
"delay": 1
}
],
"Command": "e;s;e;e;s;s"
}
很明显,需要6步,总命令为“e;s;e;e;s;s”每一步要走的信息和时间在Path里。
主要变动的代码不多,主逻辑在
https://github.com/hellclient-sc ... cript/info/paths.js
里
注册了info.paths.loadpaths 回调,绑定到了ready事件上
同时注册了一个GetPath的API
好了。
今天就到这里了。
我需要缓一缓,去平复下我的心情。
xgg
发表于 2021-9-8 12:15:54
看了楼主的帖子,我只想把你拐来用 tintin++,对于普通用户来讲不会编程语言是个巨大障碍。tintin++ 的脚本语言贴合自然语言,能和游戏内容深度结合,现在就缺你这样思路清晰,论述简洁的人才来帮助普通玩家入门了(手动捂脸)。
jarlyyn
发表于 2021-9-8 16:09:25
接下来应该是更新行走模块。
但行走模块是侠客行类mud最复杂的模块(第二是战斗)
估计今晚写不出,咕一天
争取这周内能写出来。
jarlyyn
发表于 2021-9-8 16:11:56
另外今天看论坛发现 北侠还有个
hpbrief命令,score/hp有频率限制,hpbreif可能还会被吞。
所以要做个频率限制模块。
这个比较小,可能先做这个。
jarlyyn
发表于 2021-9-9 11:52:40
果然还是鸽了
昨天把原来的hp触发去掉了,加入了hpbrief。
hpbrief是典型的多行触发,唯一的特点是由于抓取点较多(18)个,超过了mush非lua脚本传递参数的上限
需要用GetTriggerWildcard去获取。同时用命名捕获组进行匹配。
最蛋疼的是发现我的客户端里GetTriggerWildcard这个api还没实现,所以昨天实现和测试了一下。
具体修改的代码是
https://github.com/hellclient-scripts/pkuxkx.noob/blob/def66a283e50680bd23743318ea0a0affda0273b/script/core/player.js
jarlyyn
发表于 2021-9-10 02:38:04
今晚的由于应要求尝试编译mac版本客户端,再咕一晚……
jarlyyn
发表于 2021-9-10 11:48:56
接下来先归纳下自动行走的形式。
自动行走,本质是一个移动模块,处理的是改变mud中的重要变量(位置)的处理。
一般来说,行走会有3种形式
[*]移动:按指定的路径,从出发点移动到终点。为了效率起见,往往会采用多步行走的形式
[*]遍历:按指定的路径,每移动一个房间,就执行一次命令,做判断。比如,按路径对所有看到的npc下一次偷窃命令
[*]定位:指不知道当前位置,没有路径,根据当前房间的出口,随即做布朗运动,直到遇到能够定位的房间为止。
其中 移动 和 遍历 是侠客行类很多任务的重点
比如
[*]去XXX位置(移动)购买XXX,然后送给XXX位置的(移动)的固定npc xxxx
[*]在XXX区域搜索(遍历)XXX道具,然后送给XXX区域(搜索)的npc xxxxx
[*]在XXX区域找到(遍历)xxxx npc,得到XXXX道具,并送给(移动)XXX位置的npc xxxx
注意搜索其实未必是遍历,移动也可以搜索,但这需要全地图或者特殊的可逆路径支持。
在移动中发现npc后,标记npc的当前位置(房间号 或 剩余路径)
在多步移动结束后,前往npc位置或逆运算出路径并前往,