-
任务编排和用户队列其实是同一生态位,类似的上层建筑。
任务编排和用户队列的区别是
- 任务编排是宏观战略层面的,用户队列是微观战术层面的。
- 任务编排是面向多行文字变量的,用户队列是面向单行用户命令行输出的。
- 任务编排属于长期任务有与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就是依次执行
- 灵感塔(一天一次)
- 秦岭(2分钟一次)
- 师门任务(无冷却)
当然,有时候也会用条件变量分阶段执行任务
比如新人任务
maxexp 2000>>tiejiang maxexp 10000>>peiyao !yueli 20>>beiqi maxexp 29999>>letter !yueli 2000>>beiqi maxexp 100000>>fish quit这个编排,是依次执行
- 经验不到2000做铁匠任务
- 经验不到10000做配药任务
- (经验超过10000时)阅历不足20就做背齐任务
- 经验不到30000(阅历超过20)就做送信任务
- 阅历不足2000(经验超过30000)时继续做备齐
- 经验不到100000(阅历超过2000)时,钓鱼
- (阅历超过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 }任务编排带来的新问题
任务编排,本身就是为了自由度,自由扩展,解决
怎么才能完成更复杂的任务,获得更好的回报?
这个问题
同样的,也会引来新的复杂度
就是既然使用任务编排时我们一定会倾向于细化多分任务
那其他的相关设置怎么办?不如不同任务中不同的战斗设置?
所以,我们在配置时,不得不对所有相关的设置都引入条件指令格式。
增加了配置的复杂度。
鱼和熊掌不可兼得,莫过于此。
-
J jarlyyn 在 引用了 此主题
-
J jarlyyn 从 中的 Hellclient软件 移动了该主题