北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: jarlyyn

一步一步在北侠做机器人

[复制链接]
 楼主| 发表于 2021-9-6 10:19:49 | 显示全部楼层
在完善了基本信息的收集后,我们的接下去要做什么功能呢?


  • 数据发送
  • 当前位置判断
  • 忙判断
  • 路径行走

在这些问题都接完之后,才能让我那饿了几个月的id吃上热乎的饭菜。


北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2021-9-6 10:45:13 | 显示全部楼层
先让我们解决发送的问题。

mush里最简单的发送自然是world.Send里,填什么发什么,这不是很简单么?

当然没那么简单,发送要解决4个问题

  • 速率控制
  • 全局控制(如回显)
  • 命令标准化
  • 自定义功能

速率控制比较重要,单独开一个回复

全局控制很容易理解,是为了能同意的管理发送的表现。如果你要给所有的发送命令的地方价格命令统计,不全局控制是要改死人的。这是一个工程化的问题

命令标准化呢,略微复杂点

比如一个e,我可以直接发送e,也可以发送>e,也可以发送?e,最后实际发送到mud的可能都是e。

这个主要是用在路径里的。直接向东走可以直接发e,走过去有busy的可能发个e然后等busy结束,等等。

最后一个自定义功能么,很简单,有些控制性的变量可能不直接发送到mud,比如zmud经典的#wa 2000,又比如有些命令可能会进行展开,比如#study,通过变量和设置展开为 study fu zi literate



北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2021-9-6 11:12:19 | 显示全部楼层
然后是速率控制

正常mud都有速率控制的,不然就是比岁网速好,每秒能发更多的命令了。

超过限制往往会发生让人很痛苦的事,比如我玩的mud可能是被雷P,北侠据我测试似乎是吞命令。

那么怎么控制速率呢?

熟悉mush的人立刻会说,用Speedwalk。

您很聪明,学会了防御式开发的防呆式开发,可以跳过这个回复向后看了。

那么,如果不聪明的方式,应该怎么办?

或者说,speedwalk有什么问题吗?

主要是mud,至少侠客行类的mud是通过心跳来计算命令限制的。


在这个模式下,speedwalk其实只有三个问题

  • 在非均匀发送时的效率问题。(这个是小问题,主要在等>发送一堆命令>等的状态下效率看着没那么高)
  • 发送的两个命令的间隔时间的问题。(先open再行走容易遇到被门关住,对npc下kill后容易因为延时被npc先下pfm)
  • DiscardQueue后部分重要命令被吞的问题(切换技能,练技能,切换回来,结果刚切换过去就被团了,造成无法使用正常的技能)

要解决speedwalk的问题,我们需要自己接管命令的发送。

我先是在mush的机器里做了一个实现,然后在我的客户端引入了一个节拍器的概念

节拍器的逻辑很简单,设置一个周期和命令数

  • 维护一个待发送队列,储存需要发送的命令组(多个命令)列表
  • 支持按组发送命令,在要么一起发送,要么等下一个心跳一起发送
  • 维护一个类似令牌桶的已发送的历史,所以被发送内容的发送时间会放在里面
  • 设置一个高频计时器(mush支持0.1的timer),在发送和计时器触发时,先清理令牌桶里的过期令牌(超过周期),再看令牌桶的剩余空间(命令数-剩余令牌)。如果空间够,发送当前命令组。否则将令牌桶填满,等待下次清理后发送
  • 加入锁定命令,可以锁定当前队列里的所有命令,只有强制Discard才会清理,保证部分命令必定执行。



go语言的版本代码为

https://github.com/jarlyyn/hellc ... ronome/metronome.go

lua版本为

https://github.com/hellclient-sc ... ript/mods/queue.lua


js版本的代码为

https://github.com/hellclient-sc ... d53/script/queue.js

中被注释的部分。

我还写过一个mush机器人的 js 补丁,作为附件上传了



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
回复 支持 1 反对 0

使用道具 举报

发表于 2021-9-6 15:06:45 | 显示全部楼层
几点建议
房间除了名字,还要给一个unique number id,因为有非常多的重名。
出口除了方向,还要加上该方向的room id,这样便于将来的遍历
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2021-9-6 15:55:59 | 显示全部楼层
windygreen 发表于 2021-9-6 03:06 PM
几点建议
房间除了名字,还要给一个unique number id,因为有非常多的重名。
出口除了方向,还要加上该方向 ...

谢谢你的建议。

因为北侠不支持全自动机器人

所以这次我并不准备做mapper信息。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2021-9-6 16:50:21 | 显示全部楼层
包神威武
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2021-9-6 22:33:27 | 显示全部楼层
高手风范
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2021-9-7 01:01:09 | 显示全部楼层
制作发送模块

因为是比较核心的模块,适当的加了备注。

主要提供3个功能

  • 发送命令,参数为分号分割的命令,和是否强制按组发送
  • 注册命令,可以将回调(重要部分,之后的回复会解释)注册为命令
  • 组合命令,将分号分割的命令转化为&&分割的命令

命令的特殊语法为
  • 英文句号[.] 和上标号[^]开头的,当作标志(命令),发送时去掉前置的标志位发送
  • &&分割的当作分组发送(必须一起发送)
  • 井号[#]开头的作为命令,如果将#和第一个空格之间的文字作为指令,第一个空格后的文字作为数据调用指令
  • #号开头的命令强制分割分组
  • 如果#之后是数字,正数,而且没注册,将数据作为重复发送的命令(zmud的 #5 e)

发送的代码为


https://github.com/hellclient-sc ... script/core/send.js

然后在游戏里进行测试

首先

/App.Send("#30 l")

会发现先发送 20个l(我设置的每秒发送限制),然后再断断续续的发送10个l

再测试分组

/App.Send("#15 l\;l&&l&&l&&l&&l&&l&&l&&l&&l&&l&&l&&l&&l&&l&&l")

发现命令分两次发送

第一次连续发送15个

等1秒

第二次还是连续发送15个

完成目标




北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2021-9-7 01:16:02 | 显示全部楼层
本帖最后由 jarlyyn 于 2021-9-8 04:10 PM 编辑

接下来看回调。

回调是什么

回调的用途是定义一个函数,在需要的时候进行执行

如发送命令,进入房间,不忙等。

我这里的特殊点是,所有的回调必须先用字符串形式注册到全局(App内),在使用的地方仅使用字符串

无他,方便debug。

比如你设置了进入房间调用的函数,如果是个字符串, 你至少还能打印出来,这个事件帮顶了多少回调。

如果是函数,完全无法debug。

回调通过App.RegisterCallback注册到App.Callbacks里

同时,我还建立了简单的 App.Bind和App.Rasie函数

实现了简单的事件机制

具体代码见

https://github.com/hellclient-sc ... d9677/script/app.js

很明显,通过/Bound()可以打印出所有监听的时间和对应回调

比如我现在就是

  1. {
  2.   "OnRoomObj": [
  3.     "info.room.objlocate"
  4.   ],
  5.   "OnRoomExits": [
  6.     "info.room.namelocate"
  7.   ]
  8. }
复制代码
很简单清晰



北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2021-9-7 01:34:01 | 显示全部楼层
今天还把 i2(道具),skills(技能),jifa(激发) 三个数据的也处理好了

https://github.com/hellclient-scripts/pkuxkx.noob/blob/c45bb9de2c31b456c2f01e523208eb9c91ad9677/script/core/player.js

具体的也没啥好说的,都是基本功

所以,现在只要/App.Send("l;score;hp;i2;cha;jifa")

就能 得到 mud中的所有基本信息了

通过/Debug() 命令打印如下

  1. {
  2.   "Room": {
  3.     "ID": "yzkd",
  4.     "Name": "客店",
  5.     "Desc": "",
  6.     "Tags": "[大宋国] [城市] [存盘点]",
  7.     "Objs": [
  8.       {
  9.         "ID": "Board",
  10.         "Name": "客店留言板"
  11.       },
  12.       {
  13.         "ID": "Tianshen suicong",
  14.         "Name": "节日使者 天神随从"
  15.       },
  16.       {
  17.         "ID": "Song shengyi",
  18.         "Name": "日月神教 引路人 宋生亦"
  19.       },
  20.       {
  21.         "ID": "Xiao er",
  22.         "Name": "店小二"
  23.       },
  24.       {
  25.         "ID": "Xxsmallthree",
  26.         "Name": "少林罗汉堂弟子 慧无"
  27.       },
  28.       {
  29.         "ID": "Marsh",
  30.         "Name": "武学大家 莫小贝"
  31.       },
  32.       {
  33.         "ID": "Xzg",
  34.         "Name": "武学大师 全真派 人仙 小猪哥"
  35.       },
  36.       {
  37.         "ID": "Dome",
  38.         "Name": "天眷者 金陵镖局总镖头「面面俱到╰._.╯牛气冲天」渡我"
  39.       },
  40.       {
  41.         "ID": "Azerob",
  42.         "Name": "天地会 堂主 无所谓"
  43.       },
  44.       {
  45.         "ID": "Bber",
  46.         "Name": "明教 教众 无忧"
  47.       },
  48.       {
  49.         "ID": "Shendu",
  50.         "Name": "天龙寺第十五代弟子 本慎"
  51.       },
  52.       {
  53.         "ID": "Jxyu",
  54.         "Name": "日月神教 香主 还是潇洒"
  55.       },
  56.       {
  57.         "ID": "Zues",
  58.         "Name": "叶绿风"
  59.       },
  60.       {
  61.         "ID": "Luzuo",
  62.         "Name": "五毒教山门弟子「有请金蚕蛊大人现身」陆左"
  63.       },
  64.       {
  65.         "ID": "Huke",
  66.         "Name": "五毒教山门弟子「四门馆在读学士大唐子爵大人」虎克"
  67.       },
  68.       {
  69.         "ID": "Sip",
  70.         "Name": "少林达摩院弟子 澄思"
  71.       },
  72.       {
  73.         "ID": "Ldyz",
  74.         "Name": "丐帮二袋弟子 雷迪亚兹"
  75.       },
  76.       {
  77.         "ID": "Shanzhaifuyi",
  78.         "Name": "丐帮一袋弟子 芐莒"
  79.       },
  80.       {
  81.         "ID": "Grobot",
  82.         "Name": "普通百姓「华丽转身」大高手"
  83.       },
  84.       {
  85.         "ID": "Turnleft",
  86.         "Name": "日月神教 香主 向左转"
  87.       },
  88.       {
  89.         "ID": "Phoenix",
  90.         "Name": "灵鹫宫首领 凤"
  91.       },
  92.       {
  93.         "ID": "Endless",
  94.         "Name": "绝情谷入室弟子 无尽"
  95.       },
  96.       {
  97.         "ID": "Dream",
  98.         "Name": "普通百姓 梦"
  99.       },
  100.       {
  101.         "ID": "Dragon",
  102.         "Name": "天地会 护法 龙"
  103.       },
  104.       {
  105.         "ID": "Veyron",
  106.         "Name": "大宋 忠武将军 威龙"
  107.       },
  108.       {
  109.         "ID": "Kickb",
  110.         "Name": "天龙寺第十五代弟子 本鬼"
  111.       },
  112.       {
  113.         "ID": "Raider",
  114.         "Name": "少林达摩院弟子 渡鬼"
  115.       },
  116.       {
  117.         "ID": "Walnut",
  118.         "Name": "明教 教众 核桃"
  119.       },
  120.       {
  121.         "ID": "Jsysj",
  122.         "Name": "普通百姓 宋江"
  123.       },
  124.       {
  125.         "ID": "Yqlljy",
  126.         "Name": "普通百姓 卢俊义"
  127.       },
  128.       {
  129.         "ID": "Luyoujiao",
  130.         "Name": "丐帮一袋弟子「请君试问东流水,别意与之谁短长!」鲁有角"
  131.       },
  132.       {
  133.         "ID": "Shotone",
  134.         "Name": "大宋 昭武校尉 一品"
  135.       },
  136.       {
  137.         "ID": "Lixchh",
  138.         "Name": "武当派真人「1743」眼前又黑"
  139.       }
  140.     ],
  141.     "Exits": [
  142.       "up",
  143.       "west"
  144.     ]
  145.   },
  146.   "HP": {
  147.     "eff_jing": 112,
  148.     "jing": 142,
  149.     "per_jing": 100,
  150.     "eff_jingli": 100,
  151.     "jingli": 100,
  152.     "jiajing": 0,
  153.     "eff_zhenqi": 0,
  154.     "zhengqi": 330,
  155.     "eff_jingqi": null,
  156.     "jingqi": 3475,
  157.     "eff_drink": 0,
  158.     "drink": 330,
  159.     "drink_status": "饥渴",
  160.     "exp": 131,
  161.     "status": "受伤"
  162.   },
  163.   "Score": {
  164.     "rank": "武当派第四代弟子",
  165.     "name": "杰林修",
  166.     "id": "Jarlyyn",
  167.     "bl": 23,
  168.     "wx": 17,
  169.     "gg": 21,
  170.     "sf": 19,
  171.     "fy": 15,
  172.     "rm": 18,
  173.     "lx": 30,
  174.     "ds": "?",
  175.     "country": "无国籍",
  176.     "family": "武当派",
  177.     "age": 16,
  178.     "teacher": "谷虚道长",
  179.     "gender": "男性",
  180.     "loyalty": 0,
  181.     "birthday": "戊子年十一月二十一日子时七刻",
  182.     "chushi": "无",
  183.     "marry": "未婚",
  184.     "panshi": "无",
  185.     "kill": 0,
  186.     "job": "未入职",
  187.     "saving": 0,
  188.     "killed": 0,
  189.     "morality": 0,
  190.     "wuxuepoint": 0,
  191.     "deaths": 1,
  192.     "reputation": 0,
  193.     "guojiapoint": 0,
  194.     "shaqi": "正常",
  195.     "wish": 0,
  196.     "shizhan": 0
  197.   },
  198.   "Skills": {
  199.     "All": []
  200.   },
  201.   "Jifa": [],
  202.   "Items": [
  203.       {
  204.         "ID": "Jiudai",
  205.         "Name": "牛皮酒袋"
  206.       },
  207.       {
  208.         "ID": "Gan liang",
  209.         "Name": "四块干粮"
  210.       },
  211.       {
  212.         "ID": "Silver",
  213.         "Name": "九两白银"
  214.       },
  215.       {
  216.         "ID": "Ma xie",
  217.         "Name": "麻鞋"
  218.       },
  219.       {
  220.         "ID": "Pao",
  221.         "Name": "青色道袍"
  222.       },
  223.       {
  224.         "ID": "Jin nang",
  225.         "Name": "锦囊"
  226.       }
  227.     ],
  228.   "Equipments": [
  229.       {
  230.         "ID": "Ma xie",
  231.         "Name": "麻鞋"
  232.       },
  233.       {
  234.         "ID": "Pao",
  235.         "Name": "青色道袍"
  236.       },
  237.       {
  238.         "ID": "Jin nang",
  239.         "Name": "锦囊"
  240.       }
  241.     ],
  242.   "Load": 9,
  243.   "Weapon": "",
  244.   "WeaponID": ""
  245. }
复制代码

主动获取内容部分告一段落

北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-28 07:32 AM , Processed in 0.009919 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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