Alt-F4 #33 - 原版:摇匀,不要搅拌  2021-04-30

作者 Villfuk02, redlabel, 编辑 stringweasel, Nanogamer7, Conor_, Therenas, Firerazer,
翻译 Ph.X

目录

在令人愉快的 Alt-F4 第 33 期中,Villfuk02 介绍了他们的最新 Mod 创作。配方随机器!聚焦在需要克服的设计问题上,以制作一个真正好用的配方随机器。之后,redlabel 宣布了最新的 COMFY 活动,这很可能是一个非常 炸裂 的活动。

原版:摇匀,不要搅拌 Villfuk02

Vill 的配方随机器(Vill’s Recipe Randomizer)的功能正如其名——它将配方随机化。乍一看,这感觉是一个非常愚蠢而且非常简单的主意。然而,一旦你试图让它变得不那么愚蠢,它很快就会变得非常复杂。

免费的意大利面样品
一个用掩护无人机,电闸和油料储罐制造生产科技包的工厂样例。

从哪里开始的

我是在 2020 年 9 月开始这个项目的。当时,我试图做一个既简单又独特的 Mod。它不需要是可玩的,也不强求是好玩的,只要做起来有趣就行。在遇到一些问题后,我清楚地意识到自己在做一个无论如何都不会有人玩的 Mod 时,我放弃了从此再也没有碰过编程

在另外两个失败的项目之后,我回到了异星工厂,这次是作为一个玩家。我先是玩了原版,然后是工业革命 2(Industrial Revolution 2),然后我又尝试了太空探索(Space Exploration)。我喜欢玩大改 Mod,因为它让我学习新的配方,发掘新的工厂布局,解决新的物流难题。但大多数大改 Mod 都很磨人,导致我很快就会感到厌烦。这时我意识到,随机器 Mod 其实是有用的:它就像一个无限量供应的大改 Mod,同时又保持了原版的味道!对我来说,最大的好处是我不需要制作任何新的机器或图形,因为它只在对数字和字母进行捣乱。

并非像看起来那么简单

该 Mod 可以简单地抓取每个配方再使其采取随机物品作为原料。但这将是非常无用的,例如,红色科研包可能需要核能燃料作为原料,但你还没能研究出它。所以我决定先让爬虫在科技树中搜索,对于解锁的配方,只取在在它之前解锁的物品作为潜在的原料。当然,在一些 Mod 中也有例外,有些配方允许你在能够实际制作其之前就先行解锁,所以我必须要更小心一些。

你可能不会希望用蒸汽机和研究中心做一个地下传送带。那可太贵了。我需要一种方法来使配方更平衡。所以我决定实施一种算法,根据你制造它所需的资源来计算每个物品的价值。我们可以很容易地算出,一个电路板需要 1 个铁矿石和 1.5 个铜矿石:

造物小百科:电路板
1.5 个铜矿石加 1 个铁矿石组成 1 个电路板。

比方说,铜矿和铁矿的价值都是 1,这意味着电子电路的价值是 2.5。现在随机器知道它可以使用例如一个运输带(价值 1.5)和一个铜矿石(价值 1)作为电子电路的新配方。最后的价值会有少许差异。这能使配方变得更加独特,但最重要的是,它便于找到有效的组合,加快了随机化的进程。

到此为止,我就发布了这个 Mod,从反馈和一些测试来看,明显有很多 Bug(肯定的)和两个“大”问题。 这个词是带引号的,因为这个 Mod 的可玩性仍然远超你对一格随机器的预期。然而,我希望玩家能够真正的享受它,而不是浅尝辄止。

最初的几个问题

第一个问题是木板。默认设置确保了木板不被随机化,但许多配方使用了木制电线杆作为原料!正如你所想象的,修复 本应 是非常简单的。我为不可随机的资源(如木板)添加了一个标志位,任何制作时依赖包含这个标志的原料的物品都会继承它。

第二个问题是,即便配方所需的资源总量合理,但它们往往过于复杂令人感觉不公平。该模型没有考虑到制作的步骤数或制作的时间。一个很好的例子是自动化(红色)科研包。它非常便宜,价值只有 3,但它需要 5 秒来制作。它被用在许多配方中,就像一个基本组件,类似于铁齿轮。它漫长的制作时间意味着你可能需要大量的组装机来制作红色科研包,而只是为了生产像地下传送带这样简单的东西。另一个有问题的例子是,像铁齿轮这样的简单物品可能需要很多步骤,比如用石砖制作,而石砖可以用铁棒制作,铁棒需要用管道制作,等等。所以我让 Mod 为每个物品计算第二个值,称为复杂度。复杂度考虑到了所需的制作步骤、各种原料(和产品)的数量以及制作时间。

平衡原始资源

我似乎已经找到了完美的随机器,但一些新的问题(和 Bug)再次暴露出来。通常情况下,许多配方主要使用一种原始资源(通常是铁矿或石矿),这有点乏味而且你不得不去远处寻找矿区,因为你需要超多的特定原始资源。另外,发射火箭往往不需要用到石油。对于一个给定的配方,所有有效的物品被选中的可能性都是相同的,因此无需石油的物品大量地超过了少量的精炼产物。我尝试了一些策略来推动算法向正确的方向发展,但没有一个真正有效。我可以告诉它使用更多的塑料或固体燃料之类的东西,但是如果你想带其他 Mod 来玩,有更多的物品需要优先考虑呢?我得想一个通用的解决方案。

我已经知道有一种方法可以解决这个问题,但我不敢实施它,因为这将使一切变得更加复杂。这意味着更多的开发时间,更多的错误和可能更慢的加载时间。在试图想出一些更简单的方法来实现类似的结果但未能成功之后,我最终决定采用这个复杂的解决方案。

主要的思路是使用原始资源的数量,而不仅仅是总价值。这意味着模型可以确保每个随机配方需要适量的原始资源,确保所有的原始资源都被使用。与总价值类似,每个配方所需的原始资源量可能会有一些差异,或者它们可以根据 Mod 的设置完全随机。很简单,对吗?好吧,现在我不是在做一个未知数的数学题,而是要用好多个未知数,并且逻辑要也复杂得多。幸运的是,通过一些优化和严格的测试,这个模型工作得不错,而且速度很快。

这就是 Vill 的配方随机器 的全部历史!

我们需要更深入

除了一些在最初就出现但我没有谈及的问题(注意这个大没有引号且加粗)。其中之一是配方循环。当试图评估这种配方的价值时,算法可能会卡住,或者计算不当。当循环包含在一个配方中时,处理起来很简单。在评估时,算法会将既作为成分又作为结果出现的物品切掉来删除循环。然后,它可以把被切掉的物品加回来,因为它们的价值现在是已知的,使配方准备好进行随机化。这适用于原版的铀增殖处理和煤液化。

清理干净!
40 个铀-235 和 2 个 U-238 可以从铀增殖处理中移除,25 单位重油可以从煤液化中移除。

通过一个以上配方产生的循环依然有问题。在原版中并不存在超过一个配方的循环(除了流体装桶和倾倒,这些在默认情况下是不随机的),所以它们很容易被错过,但在 Mod 中,它们无处不在!在某些情况下,随机器也可能意外地创造循环。为了说明这个问题,我们需要一个例子。让我们以工业革命 2 中的合成蓝宝石为例。你需要纯镍矿、硅石和蓝宝石粉来制造蓝宝石,然而,蓝宝石粉是通过粉碎蓝宝石来制造的,创造了一个循环:

蓝宝石循环

我解决这个问题的方法是,当检测到一个循环时,它在一个点被切开,然后所有配方被合并成一个配方。这个新的配方用于计算,而不是被循环结束时的直接配方。在这里,两个配方通过去除中间的三个蓝宝石尘而合并,然后我们可以去除既是原料又是产品的两个蓝宝石:

蓝宝石去循环

我们得到了一个制作蓝宝石的配方,同时省去了有问题的细节!但是,当有循环有分支或循环位于循环中时,会发生什么?

循环图
这并非基于任何实际的配方,但我确信在某些 Mod 中至少存在像这个图一样复杂的东西。

我们只能说,这玩意儿会让人 头晕。我想我在 Mod 中多少解决了这个问题,但我不会在这里讨论细节,这不是一个图论课程,我甚至不确定这个解决方案是否足够可靠。

我的克星

现在,是时候看看最大的问题了:有多种产品的配方。让我们以高等原油分馏为例来看看。

高等原油分馏

默认情况下,原油的价值为 0.4(我们暂时不考虑水)。这意味着配方的总价值为 40。所以我们知道,25 个重油 + 45 个轻油 + 55 个石油气的总价值应该是 40,但每个产品要包含多少价值?这个问题有很多解法而且解决这个令人头疼问题让花掉了我大部分的时间。让我们来看看两种差异最大的选项。

最简单的:只要让每个产品的价值相等即可。这在很大程度上是合理的,但当你引入废品时,它就失效了。例如,铀增殖处理产生了 41 个铀-235 和 2 个铀-238,该算法会认为它们具有相同的价值,但你估计明白铀-235 的价值更高。因此,这种方法其实没用的。

最“好”的:只要让每个成分都有完整的价值,但要记录下副产品,让你可以在之后减去。例如,在高等原油分馏过程中,重油有轻油和石油气作为副产品。这意味着润滑油也有它们作为副产品,因为它只由重油制成。如果我们想制造一个快递分拣机,除其他一些成分外,我们需要润滑油和集成电路。集成电路需要石油,但我们有一些作为润滑油的副产品,所以我们可以减去它。剩下的唯一副产品是轻油。我们如何处理这些轻油?当然,我们可以将其裂解,以节省更多的石油。但这需要一些水。是使用更多的水还是更多的石油更便宜呢?好吧,让我们计算一下这两个选项,以防万一。

正如你所见的,这种方法非常复杂。有许多边缘情况和问题需要回答。例如,当其他配方的成分不想要这些副产品时,我该如何处理多余的副产品?我试图实现这种方法的一个版本而且我必须说,我干得还不错。只花了大约 100 个小时并修复大约一百万个 Bug。那么回报是什么呢?嗯,这个解决方案仍然不完美,尽管它已经很接近完美。我也不再能理解自己的代码了。每当我试图调整某些东西时都会导致崩溃。最重要的是,用原版的异星工厂加载 Mod 需要 10 秒到 10 分钟不等。由于我希望这个 Mod 能与很多其他 Mod 兼容(能兼容原版也不错),我决定不走这条路。

最后,经过更多的思考,我得出了我现在使用的算法。它基本上是上述两种方法的妥协。它的效果很好,而且相当简单。尽管对我来说还不够简单,因为我还需要解释这个评估算法的许多其他怪癖。它并不能在所有情况下都很好地评估所有的多输出配方,但它也不会在边缘情况下崩溃(我希望)。

最后的想法

这就结束了我们对 配方随机器 内部运作的窥探。如果你有任何问题或建议,你可以在我的 Discord 服务器上给我留言。说到这里,我想感谢所有加入它并在开发过程中发布错误、想法、测试东西以及用其他方式支持我的人。没有你们,这个 Mod 就不会走到今天!

COMFY 扫雷! redlabel

为了庆祝传奇地图制作者 mewmew 的新作品和由 Gerkiz 提供的崭新 Ryzen 9 5950X,COMFY 异星工厂将在 5 月 2 日凌晨 1 点组织一场特别活动。每个人及其家属均受邀参加,无需回复。

异星工厂里的扫雷

如果有人想知道扫雷是怎么回事,啊哈,这是一张新地图,通过解决 扫雷 谜题来扩张基地。要清除一个地雷,必须在它上面放置一个熔炉。若把它放在一个没有地雷的地方会发生爆炸,而不先排雷就踏上去也会产生同样的效果。错误的代价将非常惨重,因为它们会释放出邪恶的虫群并引发核爆炸。玩家还可以根据自己的表现获得(或失去)点数,并可以在互联网积分排行榜上与他人比较。

COMFY 是异星工厂多人社区的领军者之一,我们的作品包括山地要塞(Mountain Fortress),虫群大战(Biter Battles),鱼防(Fish Defense),超时空列车(Chronotrain)和洞穴矿工(Cave Miner)。很快还将有一张有着海盗和帆船的新图!敬请期待。

你可以在 Discord 上加入我们这个近 3500 人的社区。

倒计时已逾期

征稿

一如既往的,我们正在召集任何想要为 Alt-F4 做出贡献的人,无论是提交文章还是帮助翻译都可以。如果您有些有趣的想法,并乐于与社区分享,这里就是一个好地方。如果您没有太大把握,我们会很乐意帮助您讨论内容创意和结构问题。如果您有意参与,从加入 Discord 开始吧!