跳转至内容
  • 欢迎
  • 版块
  • 最新
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(不使用皮肤)
  • 不使用皮肤
折叠
品牌标识

Hellclient 社区

  1. 主页
  2. Script脚本
  3. 深入浅出制作全自动Mud机器人-任务编排

深入浅出制作全自动Mud机器人-任务编排

已定时 已固定 已锁定 已移动 Script脚本
机器人全自动代码范例
1 帖子 1 发布者 30 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • jarlyynJ 离线
    jarlyynJ 离线
    jarlyyn
    写于 最后由 jarlyyn 编辑
    #1

    任务编排和用户队列其实是同一生态位,类似的上层建筑。

    任务编排和用户队列的区别是

    • 任务编排是宏观战略层面的,用户队列是微观战术层面的。
    • 任务编排是面向多行文字变量的,用户队列是面向单行用户命令行输出的。
    • 任务编排属于长期任务有与UI的交互,用户队列是临时任务基本与UI无交互。

    任务定义

    任务Quest,其实是一个很轻的元素。

        class Quest {
            constructor(id) {
                this.ID = id
            }
            InCooldown() {
                return (new Date()).getTime() < this.CooldownTo
            }
            Cooldown(interval) {
                this.CooldownTo = (new Date()).getTime() + (interval ? interval : 0)
            }
            CooldownTo = 0
            ID = ""
            Name = ""
            Desc = ""
            Intro = ""
            Help = ""
            Group = ""
            Start = null
            GetReady = DefaultGetReady
            OnHUD = DefaultOnHUD
            OnSummary = DefaultOnSummary
            OnReport = DefaultOnReport
        }
    

    可以看到,除了Cooldown相关的,以及GetReady和Start两个入口,全都是和界面交互的内容。

    任务编排

    在理解了任务是什么时候,我们接着看任务编排。

    任务编排是通过条件指令格式,在任务变量中(newhelljs为了方便使用定义了多个任务变量)设置的规划。

    任务会从上向下,依次判断

    • 如果任务不符合条件指令的条件,则跳过
    • 如果任务在冷却中,则跳过
    • 如果所有任务都在冷却,等1秒重头循环

    典型的任务编排,可能是把收益最高的,冷却最常的任务编排在最前。

    比如

    lgt
    qinling
    mq
    

    就是依次执行

    1. 灵感塔(一天一次)
    2. 秦岭(2分钟一次)
    3. 师门任务(无冷却)

    当然,有时候也会用条件变量分阶段执行任务

    比如新人任务

    maxexp 2000>>tiejiang
    maxexp 10000>>peiyao
    !yueli 20>>beiqi
    maxexp 29999>>letter
    !yueli 2000>>beiqi
    maxexp 100000>>fish
    quit
    

    这个编排,是依次执行

    1. 经验不到2000做铁匠任务
    2. 经验不到10000做配药任务
    3. (经验超过10000时)阅历不足20就做背齐任务
    4. 经验不到30000(阅历超过20)就做送信任务
    5. 阅历不足2000(经验超过30000)时继续做备齐
    6. 经验不到100000(阅历超过2000)时,钓鱼
    7. (阅历超过2000,经验超过100000)都做完了,下线喽

    任务冷却

    任务的核心其实就是冷却,就是有冷却的函数。理论上,只靠冷却就能实现主要的任务编排工作。

    在任务实现时,可以在接任务或者完成任务时,调用Quest.Cooldown(xxxx)来为任务设置冷却。

    如果有任务联动,可以清楚别的任务的冷却时,也可以从全局注册函数Quests中获取对应变量,进行Cooldown(0)清零。

    任务预分配

    这是我在实际使用时,引入的新概念。

    具体来说,就是由于任务是基于编排模式运行的。

    所以,当前任务执行完后,下一个任务是否还是当前任务是不可知的。

    这时候我们可以预分配一下下一个任务,调用下一个任务的GetReady,如果下一个任务 Ready了,返回了入口函数,同时ID和当前任务不一样,我们就可以执行当前任务的清理工作。

    典型的就是师门任务如果要换任务了,就不再等信接下一个师门了

    详见mq任务的mq.CanAccept方法

            let ready = App.Quests.GetReady()
            if (ready && ready.RunningQuest && ready.RunningQuest.ID != Quest.ID) {
                return false
            }
    

    任务编排带来的新问题

    任务编排,本身就是为了自由度,自由扩展,解决

    怎么才能完成更复杂的任务,获得更好的回报?

    这个问题

    同样的,也会引来新的复杂度

    就是既然使用任务编排时我们一定会倾向于细化多分任务

    那其他的相关设置怎么办?不如不同任务中不同的战斗设置?

    所以,我们在配置时,不得不对所有相关的设置都引入条件指令格式。

    增加了配置的复杂度。

    鱼和熊掌不可兼得,莫过于此。

    1 条回复 最后回复
    • jarlyynJ jarlyyn 在 引用了 此主题
    • jarlyynJ jarlyyn 从 中的 Hellclient软件 移动了该主题
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    • 登录

    • 没有帐号? 注册

    • 登录或注册以进行搜索。
    Powered by Herbrhythm.
    • 第一个帖子
      最后一个帖子
    0
    • 欢迎
    • 版块
    • 最新
    • 标签
    • 热门
    • 用户
    • 群组