Sleep & Trigger
进程模块 - 进程休眠与触发
由于 Screeps 本身是一个资源、建筑、等级等都动态变化的游戏 🎮,所以其实是有必要支持进程的休眠💤与触发✋。
这就比较类似于操作系统里面,驱动程序的触发✋与休眠💤。只有当相关硬件对于操作系统来说可访问时,才会有相关驱动程序启动来操作该硬件。
而为了支持进程的休眠💤与触发✋,首先,我们需要添加特殊的休眠返回值。即,在进程返回休眠之后,加入休眠队列,只有在触发时唤醒。
而对于进程的触发,则需要增加触发条件。触发条件本身需要增加监视功能。此外,需要对进程有所标识。
一种选择是在进程休眠的同时,返回一定的触发条件。但是有一些进程初始时即是休眠状态,而且休眠后的触发条件可能很复杂,这种返回休眠与相应的触发条件本身比较耦合。所以我倾向于采用另一种方法,即休眠与触发条件分开。
而至于进程的标识,考虑到进程有描述,则就可以用进程的描述来标识。但是,考虑到一个模块可能会拆分成几个进程,而这几个进程可能同时休眠或触发,所以可能需要对进程增加一个额外的可选标识,即模块名。
但是,对于模块名的设计,是比较难以处理当其中一个进程想要休眠时,其他的进程是否需要休眠。因此,进程的标识仍然是采用描述。但是,描述又无法保证唯一,仍然会出现类似采用模块名的问题,所以最好还是采用进程 Id。
注意:进程休眠时, 也应当释放所有的资源。
🏹 触发器设计
对于触发器,我们其实可以设计的比较灵活。对标数电里面的触发器,我们可以有 满足特定条件触发, 某条件变化到另一个条件触发, 以及在我们的场景中,特定函数返回特定值后触发。
所以,我们可以期望写出这样的代码:
// 之前返回假,变化为真时触发
A.proc.trigger('watch', () => ..., [ 唤醒进程 Id ])
// 在特定函数执行后, 执行
// 一般必须为 prototype 上的函数
A.proc.trigger('after', Creep.prototype.claimController, (returnValue, target) => ...)
Last updated