LAB设计
LAB设计
布局
这里的布局可以参考hoho建筑布局教程中的内容,不同的布局方式将应用不同的工作流程,例如,你也可以规划出一种多级布局,即上一级化工厂使用下一级化工厂作为底物化工厂进行合成。
在
Venture
中,我选择使用常规的中心布局以及固定底物化工厂的模式,将中间两个化工厂作为底物化工厂,其他化工厂处理合成和BOOST工作,优点是设计简单,流程清晰。
生命周期
当有三个及以上化工厂时便可以开始化合物合成工作,首先我们需要明确我们需要合成哪些化合物:
- 冗余资源——合成化合物出售
- 战斗化合物——战斗相关化合物
- 用户指定——用于特殊任务的化合物
在不同阶段指定何种化合物也是一项大工程,所以这里只介绍化工厂的工作流程,化合物任务指派将在单独的运维篇中介绍。
我们将化工厂的化合物合成分为4个阶段,此外我们还单独使用一个字段来控制化工厂集群是否运行。
整个数据结构设计如下
lab?: { // 化工厂信息 open: boolean, // 是否工作 index?: number, // 索引 state: number, // 工作阶段 labA?: Id<StructureLab>, // 底物化工厂A labB?: Id<StructureLab>, // 底物化工厂B labAType?: MineralConstant | MineralCompoundConstant, // 底物B类型 labBType?: MineralConstant | MineralCompoundConstant, // 底物B类型 labAmount?: number, // 底物数量 nextRunTime?: number, // 下次运行时间 BOOST?: { // 强化任务 [labId: Id<StructureLab>]: { // 化工厂ID mineral: MineralBoostConstant, // 化合物类型 amount: number // 可强化数量 } }, boostQueue?: { // 强化等待队列 [m: MineralBoostConstant]: number // 化合物类型:需求数量 }, autoQueue?: { // 合成队列 target: MineralCompoundConstant, // 化合物类型 amount: number, // 合成阈值 manual?: boolean, // 是否手动设置(不会被自动清理) }[] },
初始化
- 当开启化工厂集群工作时,首先寻找中心两个化工厂作为底物化工厂,如果顺利寻找到便开启化工厂集群工作。
寻找任务
此时首先查看
autoQueue
中用户指定的合成任务是否已达到阈值,若没有则将对应任务的化合物合成底料分别指派给两个底物化工厂,统计计算能够合成的最大底物数量。 否则则查看index
索引对应的化合物列表阈值是否已达到,若无法合成或已达到则移动索引,重新执行这一步。完成这一步骤之后便进入
装填底物
阶段。
装填底物
查看两个底物化工厂是否装填完毕,若没有则发布传输任务装填对应底物。
同时这里还应检查化工厂矿物类型是否为指定类型,若不是指定类型先搬走剩余矿物。
完成这一步骤之后便进入
反应合成
阶段。
反应合成
运行前检查底物化工厂是否类型正确,不正确则回到
装填底物
状态选择其他非底物化工厂且非BOOST指定化工厂进行合成,同时若遇到冷却未完成则记录下冷却完成时间,等待冷却完成再进行反应,减少CPU无用消耗。
当返回底物不足时则反应完毕,完成这一步骤之后便进入
取走资源
阶段。
取走资源
- 遍历所有非底物化工厂,如果存在资源则发布传输任务取走资源。
强化任务
- 安装合成化合物的思路,强化任务也可以分解成装填化合物和强化爬爬两个步骤,同时强化还需要给化工厂装填能量,不过能量流转将不由LAB模块负责,会在单独的能量篇介绍,并且具体要使用何种化合物进行强化同样将在运维篇幅中介绍。
指定任务
BOOST任务不关心使用哪一个化工厂进行强化(底物化工厂除外),当我们发布了一个BOOST任务后,只会检查是否有空闲的化工厂,如果有则使用一个空闲的化工厂作为该任务的工作化工厂。
如果没有则将任务添加到
boostQueue
中,将在后续运维期间轮询检查boostQueue
一旦有空闲化工厂则重新指定任务并。
装填化合物
- 当一个化工厂被指定BOOST任务之后,将会发布搬运任务,将指定数量的化合物搬运至化工厂。
强化爬爬
- 强化爬爬不由化工厂模块触发,而是由爬爬需要被强化时被动触发,当爬爬成功被强化时将会减少化合物可强化数量,当可强化数量降至0则取消当前化工厂BOOST任务。