延时响应是Mud解密中很常见的一个状态。
指当你发出指令后,游戏中的NPC或者场景会在一定时间后,或者断断续续的做出响应。
一般来说,延迟响应为了考虑到玩家的体验,服务器的响应需要进行特别复杂的处理,使用简单的匹配和Mode标记就可以处理。
之所以单独作为一个课题讨论,是因为延时响应的核心处理点是 失效管理。
普通解密,触发器一般是即用即关的,不需要考虑太多的意外状态,通过触发组就能很好的解决了。
而延时解密,因为要考虑到可能会有终止/意外/并行的情况,需要手动的对出发考虑失效和重复生效、计时器延时等状况,触发器组就很捉襟见肘了,一般需要更多的代码工具去进行管理。
我这里是通过自己的Task/Plan模块,将所有的触发/计时器/事件处理封装在一个Task对象内,并强制使用一个作用范围强制失效来解决这个问题的。
参考代码:
let baohuwait = 28 * 1000
let matcherKill = /^你对(.+)的(黑衣人|邪派高手|绝世高手)喝道:大胆狂徒,竟敢在这撒野!!/
//等待NPC出现的计划
let PlanProtect = new App.Plan(
App.Positions["Quest"],
(task) => {
task.AddTrigger(matcherKill, (tri, result) => {
if (result[1] != App.Data.Player.Score.名字) {
return true;
}
App.Send("halt")
let id
switch (result[2]) {
case "黑衣人":
id = "heiyi ren"
break
case "邪派高手":
id = "xiepai gaoshou"
break
case "绝世高手":
id = "jueshi gaoshou"
break
}
Baohu.Data.ID = id
Baohu.Data.Type = result[2]
}).WithName("ok")
let wait = Baohu.Data.Start + baohuwait - $.Now()
if (wait > 0) {
task.AddTimer(wait, (timer) => {
Note("准备迎敌")
App.Send("halt")
App.Core.Heal.TryTouch()
$.RaiseStage("prepare")
$.RaiseStage("baohu-ready")
return true
}).WithNoRepeat(true)
}
task.AddTimer(1100, () => {
if (App.Core.Weapon.Touch) {
if (($.Now() - Baohu.Data.Start) < baohuwait) {
App.Send("halt")
App.Core.Heal.TryTouch()
$.RaiseStage("pause")
$.RaiseStage("wait")
}
}
return true
})
task.AddTimer(3000, () => {
let d = (($.Now() - Baohu.Data.Start) / 1000).toFixed(0)
Note(`保护开始${d}秒`)
return true
})
task.AddTimer(60000, () => {
App.Log("保护等待超时")
return false
}).WithName("timeout")
$.RaiseStage("wait")
},
(result) => {
if (result.Name == "ok") {
$.PushCommands(
$.CounterAttack(`${GetVariable("id")}'s ${Baohu.Data.ID}`, App.NewCombat("baohu").WithTags(`baohu-${Baohu.Data.Type}`).WithPlan(PlanCombat)),
$.Function(Baohu.Finish),
)
$.Next()
return
}
App.Send("halt")
App.Log(`保护NPC${Baohu.Data.NPC.ID}失败`)
Baohu.Fail()
}
)
代码地址
可以看到,我使用了一个叫做PlanProtect的计划(task工厂),创建了一个基于Quest的封装,所有的触发和计时器都绑定在这个Task封装上,并在Quest发生变化时强制失效。
预期管理工具Plan/Task的详细介绍
由于我一直认为Mud机器人是一个工程问题,难点在于可维护性和代码失控。所以,我认为,选用或者开发一个触发失效工具,是十分重要的,也应该是整个机器人的核心驱动逻辑之一。