大家好,
请把你压箱底的润滑油取出来,我们现在要讲流体了!
运力临界点
众所周知,异星工厂的流体系统既不容易量化,也没法直观了解,甚至某种意义上来说是个痛点。
管道流量会随着距离增加以非线性方式降低,只有靠wiki上的表格才能知道不同长度管道的实际流量。
而且建造的先后顺序也对流量有影响,总的来说,这并不是一个有趣的系统。
我们曾多次尝试重写流体系统,但都以失败告终。现有的算法非常快,适用于标准游戏,我们已经尽可能地将其单独使用。然而,在我们对太空时代的游戏测试中,很明显现有的系统已经过时。新机器提供的生产规模和质量会使流量算法陷入瘫痪。
星期五周报#416-流体2.0 视频#01
为了避免完全重写代码,我们首先尝试通过增加管道体积来增加流量。这“解决”了低流量的主要问题,同时还需要大量增加缓冲区大小。储罐实际上变得毫无用处,配备火焰喷射器炮塔的防御墙储存了数万单位的液体,吸干了基地。最终,我们未能就如何进行达成协议;重写被认为过于复杂,但没有人有更好的想法。这个问题被搁置一边,以便“稍后再讨论”。
我对这个结论极为不满。增加管道容量是治标不治本。有时候请求原谅比请求许可更容易,所以我冒着风险开始重写流体系统。
新算法
在一次流体讨论中,Rseding提出了一种算法,该算法与他多次使用过的算法非常接近,这是CoFH团队的我的世界 mod Thermal Expansion中的一种算法:
⚙ 管道、地下管道和储罐合并为流体“段”。
⚙ 每个分段的体积都继承自组成它的流体盒,并且可以容纳一种流体。
⚙ 机器可以以无限的速率将流体推入一个分段,并可以以与分段的满度成比例的速率从分段中抽出。换句话说,如果分段是半满的,则抽出速率是最大值的一半。
⚙ 作为一种特殊情况,如果将泵直接连接到储罐,则泵可以以更快的速度泵动流体。
管道中不再存在真实的流体“流动”;被推动到分段的流体将在沿着分段的任何点处立即可用。这就是之前FFF中讨论过的“核电网络型解决方案”。结果是管道“正常工作”,几乎不必担心吞吐量。
星期五周报#416-流体2.0 视频#02
演示
请注意看可视化的调试效果:
⚙ 绿色表示实体中的流体量。
⚙ 蓝色表示在该刻通过实体的流量。
流体流淌动画并非最终效果。
长管道
在旧系统中,管道越长,流量就会越低。问题不在于这种状态的存在,而是它无法量化。
星期五周报#416-流体2.0 视频#03
在新系统中,管段是一个单元,因此流体不再在管道中传播。较长的管道具有更高的吞吐量,但需要更长的时间才能完全排空。确切的流量数字可能会根据进一步的测试而变化。
星期五周报#416-流体2.0 视频#04
节点
旧的系统在直管道的情况下运行相对良好,但一旦形成连接节点,一切都会分崩离析。根据管道的构建顺序,流向连接处每一侧的流体量都有所不同。
星期五周报#416-流体2.0 视频#05
在新体系中,交叉节点不会再产生多余影响;一个分段只关心连接到它的机器。当一台机器更新时,它的最大拉动率是根据连接分段的填充率来限制的。这让流体分配更加均匀,虽然仍然不完美,但非常接近。
星期五周报#416-流体2.0 视频#06
输入原料短缺
在旧的系统中,当机器缺乏输入流体时,节点会变得特别糟糕。燃料厂比氧化厂获得的水流量要大得多。
星期五周报#416-流体2.0 视频#07
在新的系统中,两种厂子获得的液体份额要接近相等得多。
星期五周报#416-流体2.0 视频#08
泵
在旧的系统中,为了保持更高的流量需要泵。然而,它几乎从未像大家所期望的那样奏效:
星期五周报#416-流体2.0 视频#09
在新系统中,不再需要为了增大流量使用泵。泵仍然可以用来强制流体定向流动,充当具有电路网络的条件阀,以及装载/卸载列车,但大家将不需要像以前那样放置太多泵。
星期五周报#416-流体2.0 视频#10
大后期工厂布置
最后,我们回到我们最喜欢的化工厂布置。这种布置会让工厂无法正常运作,因为石油被困在了输出管道中。
星期五周报#416-流体2.0 视频#11
在新系统中,产能将会到达理论水平,所有化工厂都能输出其生产的石油。
星期五周报#416-流体2.0 视频#12
游戏性压过了真实性
就Factorio中流体模拟的“真实性”而言,新系统做出了很大的让步。但作为游戏设计师,你总是必须在真实性和游戏性做出权衡。组装机器将大量的工作抽象出来,以自动化的形式将其放在一个整洁的小盒子里。同样,新的流体系统为您提供了大家期望的管道行为,同时提取了真实流体流动的所有细节。
这是一个非常有趣的系统。这个系统有很多我们没有预测到的有趣的可能性,我们将在未来的FFF中分享我们的一些故事。我还可以详细介绍这个新系统的体系结构,以及我在其他时候是如何进行重构的。
有一些细节仍在处理中,但新系统作为一个整体运行得很好。我们等不及大家动手尝试了!