北大侠客行MUD论坛

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

一步一步在北侠做机器人

[复制链接]
 楼主| 发表于 2021-10-12 18:44:46 | 显示全部楼层
本帖最后由 jarlyyn 于 2021-10-12 06:50 PM 编辑

再次提到任务(task)了。

在51楼的任务队列已经使用过task了。再详细解释下


任务(task)是什么。

指当前正在执行的非瞬时动作。比如买东西,移动等等。

任务有以下特点
  • 通过唯一ID注册到全局。这样才能快速Debug
  • 每次只能执行一个任务。执行多个任务的话会报错
  • 任务有3个关键属性,数据(Data),成功回调(OnFihish),失败回调(OnFail)


北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-10-13 01:54:36 | 显示全部楼层
接下来,就是定义道具文档的格式了。

初步的格式我定为 || 分隔的字符串,每个一行

分别为

道具ID||道具Name||道具Label||道具Type||道具Location||道具Command||道具Interval||道具注释

比如

  1. gan liang||Gan liang||干粮||goods||yz-zxl||buy gan liang ||||
  2. jiudai||Jiudai||牛皮酒袋||goods||yz-zxl||buy jiudai||||
  3. niurou tang||Niurou tang||牛皮酒袋||goods||ly-wxl||buy niurou tang||||
复制代码

然后我们定义3个接口

App.API.GetItem(id) 通过id获取道具,能找到返回第一个,找不到返回空
App.API.GetItemsByName(name,ignorecase) 根据Name获取道具,返回所有匹配的道具列表。ignorecase为true则忽略大小写
App.API.GetItemsByLabel(label) 根据Label获取获取道具,返回所有匹配的道具列表。

代码见


https://github.com/hellclient-sc ... script/info/item.js

再设置一个全局的Produce生产道具的方法,传入道具id,成功回调,失败回调,然后执行一次尝试生产一个道具

代码大概为

  1.     app.Produce=function(id,onFinish,onFail){
  2.         let item=App.API.GetItem(id)
  3.         if (item==null){
  4.             throw "item "+id +" not found"
  5.         }
  6.         let taskid=""
  7.         switch(item.Type){
  8.             case "goods":
  9.                 taskid="produce.goods"
  10.                 break;
  11.             default:
  12.                 throw "unknown item type"+item.Type
  13.         }
  14.         app.ExecuteTask(taskid,id,onFinish,onFail)
  15.     }
复制代码

https://github.com/hellclient-sc ... ipt/core/produce.js

很明显。我根据取回的道具类型创建不同的任务获取道具。同时定义了一个购买的任务

任务内容为

  1.     app.RegisterCallback("core.produce.goods.arrive",function(){
  2.         if (app.GetTaskID() =="produce.goods"){
  3.             app.Send(app.CurrentTask.Item.Command)
  4.             app.Send("i")
  5.             app.CheckBusy("core.produce.goods.finish")
  6.         }
  7.     })
  8.     app.RegisterCallback("core.produce.goods.finish",function(){
  9.         if (app.GetTaskID() =="produce.goods"){
  10.             app.CurrentTask.Finish(app.CurrentTask.Item)
  11.         }
  12.     })   
  13.     let Goods=function(){
  14.         produce.call(this, "produce.goods")
  15.         this.Execute = function (data, onFinish, onFail) {
  16.             produce.prototype.Execute.call(this, data, onFinish, onFail)
  17.             let move=app.NewMove("walk",this.Item.Location,"core.produce.goods.arrive",{})
  18.             move.onFail=onFail
  19.             move.Start()
  20.         }
  21.     }
复制代码

就是加了两个回调,一个在到达位置后执行命令,一个执行好命令,忙结束后调用结束回调

https://github.com/hellclient-sc ... re/produce/goods.js

然后再加了一个#item别名,可以通过 #item gan liang ,#item gourou tang  的形式自动去补充物品


北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-10-13 01:57:41 | 显示全部楼层
本帖最后由 jarlyyn 于 2021-10-13 01:59 AM 编辑

好了,老规矩,看看效果

先是#item gan liang

再是#item niurou tang


效果很好,这样就不用担心挨饿了。



本帖子中包含更多资源

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

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2021-10-13 15:50:57 | 显示全部楼层
两耳嗡嗡,不行了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-10-14 13:23:42 | 显示全部楼层
按惯例,加入管理界面




本帖子中包含更多资源

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

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-10-19 22:56:26 | 显示全部楼层
加入吃喝部分


  1. (function(app){
  2.     let check=Include("core/check/check.js")
  3.     app.Data.LastEat=0
  4.     app.EatCmd=function(){
  5.         return "eat "+app.GetParam("food")+";drink "+app.GetParam("drink")
  6.     }
  7.     app.Eat=function(){
  8.         app.Data.LastEat=Now()
  9.         app.Send(app.EatCmd())
  10.     }
  11.     app.Bind("Check","core.food.eat")
  12.     let checkFood=(new check("food")).WithLevel(app.CheckLevelBrief).WithIntervalParam("eatinterval").WithLastID("LastEat")
  13.     checkFood.Send=function(){
  14.         app.Eat()
  15.     }
  16.     app.RegisterCallback("core.food.eat",checkFood.Callback())
  17.     })(App)
复制代码
每次检查的时候会先吃喝下

默认有10秒冷却


北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2021-10-19 23:27:59 | 显示全部楼层
对emoji和ascii特殊字符的显示支持的怎么样?
比如下面两个图:

本帖子中包含更多资源

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

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-10-20 10:46:38 | 显示全部楼层
icer 发表于 2021-10-19 11:27 PM
对emoji和ascii特殊字符的显示支持的怎么样?
比如下面两个图:

客户端不负责显示,显示全靠浏览器,所以一般没什么问题



本帖子中包含更多资源

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

x
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-10-20 11:10:43 | 显示全部楼层
继续

接下去我们引入 提案proposal的概念

proposal就是一个需要判断是否要去处理的事情,比如检查钱少,是否要去取钱,检查食物是否够,检查饮水是否够,不够去买。

proposal有两个方法,一个是submit,即提交判断是否可以实行,一个是Execute,即去进行相应操作

  1. (function (app) {
  2.     let Proposal=function(id){
  3.         if (!id) {
  4.             throw "Proposal的id不能为空"
  5.         }
  6.         this.ID=id
  7.         this.OnFinish=""
  8.         this.OnExecute=function(){

  9.         }
  10.         this.Execute=function(onFinish){
  11.             this.OnFinish=onFinish
  12.             this.OnExecute()
  13.         }
  14.         this.Submit=function(){
  15.             return false
  16.         }
  17.     }
  18.     return Proposal
  19. })(App)
复制代码
https://github.com/hellclient-scripts/pkuxkx.noob/blob/bbae4ab351568ac9a9df70d2bb249ebc91251c5b/script/core/proposal/proposal.js



proposal的管理代码如下

  1. (function (app) {

  2.     app.Proposals = {}
  3.     app.ProposalGroups = {}
  4.     app.RegisterProposal = function (proposal) {
  5.         if (proposal.ID == "") {
  6.             throw "Proposal id不可为空"
  7.         }
  8.         app.Proposals[proposal.ID] = proposal
  9.     }
  10.     app.RegisterProposalGroup = function (groupid, proposals) {
  11.         app.ProposalGroups[groupid] = proposals
  12.     }

  13.     let try_proposals = function (proposals, onfinish) {
  14.         for (var i in proposals) {
  15.             let proposal = app.Proposals[proposals[i]]
  16.             if (!proposal) {
  17.                 throw "提案 [" + proposals[i] + "] 没找到"
  18.             }
  19.             if (proposal.Submit()) {
  20.                 proposal.Execute(onfinish)
  21.                 return true
  22.             }
  23.         }
  24.         return false
  25.     }
  26.     let try_proposalgroup = function (groupid, onfinish) {
  27.         let group = app.ProposalGroups[groupid]
  28.         if (!group) {
  29.             throw "提案组 [" + groupid + "] 没找到"
  30.         }
  31.         return try_proposals(group, onfinish)

  32.     }
  33.     let try_proposalgroups = function (groups, onfinish) {
  34.         for (var i in groups) {
  35.             let group=groups[i]
  36.             if (try_proposalgroup(group,onfinish)){
  37.                 return true
  38.             }
  39.         }
  40.         return false
  41.     }
  42.     app.TryProposalGroups = function (groups, onfinish, onrejected) {
  43.         if (try_proposalgroups(groups, onfinish)) {
  44.             return true
  45.         }
  46.         app.ExecuteCallback(onrejected)
  47.         return false

  48.     }
  49.     app.TryProposalGroup = function (groupid, onfinish, onrejected) {
  50.         if (try_proposalgroup(groupid, onfinish)) {
  51.             return true
  52.         }
  53.         app.ExecuteCallback(onrejected)
  54.         return false
  55.     }
  56.     app.TryProposals = function (proposals, onfinish, onrejected) {
  57.         if (try_proposals(proposals, onfinish)) {
  58.             return true
  59.         }
  60.         app.ExecuteCallback(onrejected)
  61.         return false
  62.     }

  63.     Include("core/proposal/cash.js")
  64.     Include("core/proposal/food.js")
  65.     Include("core/proposal/drink.js")
  66.     Include("core/proposal/prepare.js")

  67. })(App)
复制代码
https://github.com/hellclient-scripts/pkuxkx.noob/blob/bbae4ab351568ac9a9df70d2bb249ebc91251c5b/script/core/proposal.js

引入三个全局函数

  • TryProposals,尝试执行执行多个提案
  • TryProposalGroup 尝试执行预先定义的提案组
  • app.TryProposalGroups 尝试执行预先定义的多个提案组



北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2021-10-20 11:16:21 | 显示全部楼层
jarlyyn 发表于 2021-10-20 11:10 AM
继续

接下去我们引入 提案proposal的概念

接着引入3个预设的提案和一个提案组

取现金的 Cash提案

  1. (function (app) {
  2.     let proposal=Include("core/proposal/proposal.js")
  3.     let Cash= function(){
  4.         proposal.call(this,"cash")
  5.         this.Submit=function(){
  6.             return app.GetCash()
  7.         }
  8.         this.OnExecute=function(){
  9.             let move=app.NewMove("walk",app.GetParam("bank_location"),"core.proposal.cash.arrive",{})
  10.             move.Start()
  11.         }
  12.     }
  13.     app.RegisterCallback("core.proposal.cash.arrive",function(){
  14.         app.Send("qu "+app.GetParam("gold_withdraw")+" gold")
  15.         app.Send("i2")
  16.         app.CheckBusy(this.OnFinish)
  17.     })
  18.     app.RegisterProposal(new Cash())
  19. })(App)
复制代码

买食物的Food提案

  1. (function (app) {
  2.     let proposal=Include("core/proposal/proposal.js")
  3.     let Food= function(){
  4.         proposal.call(this,"food")
  5.         this.Submit=function(){
  6.             
  7.             return app.GetItemNumber(App.API.GetItem(app.GetParam("food")).Name,true)
  8.         }
  9.         this.OnExecute=function(){
  10.             app.Produce(app.GetParam("food"),this.OnFinish)
  11.         }
  12.     }
  13.     app.RegisterProposal(new Food())
  14. })(App)
复制代码




买饮水的Drink提案

  1. (function (app) {
  2.     let proposal=Include("core/proposal/proposal.js")
  3.     let Drink= function(){
  4.         proposal.call(this,"drink")
  5.         this.Submit=function(){
  6.             
  7.             return app.GetItemNumber(App.API.GetItem(app.GetParam("drink")).Name,true)
  8.         }
  9.         this.OnExecute=function(){
  10.             app.Produce(app.GetParam("drink"),this.OnFinish)
  11.         }
  12.     }
  13.     app.RegisterProposal(new Drink())
  14. })(App)
复制代码

然后是准备阶段的prepare提案组

  1. (function (app) {
  2.     app.RegisterProposalGroup("prepare",["cash","food","drink"])
  3. })(App)
复制代码

再把队列服务加入#check命令

好了,一个简单的自动任务队列机器实现了




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

本版积分规则

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

GMT+8, 2024-4-27 11:31 PM , Processed in 0.010686 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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