Alt-F4 #55 - Mod 的黑暗小巷  2021-12-17

作者 stringweasel, MagmaMcFry, raiguard, Deadlock989, Anachrony, PFQNiet, Earendel, 编辑 Nanogamer7, Conor_, Therenas, MyNameIsTrez, Firerazer,
翻译 Ph.X

目录

在第55期Alt-F4中,stringweasel 为大家准备了一个非常特别的节目,让多位 Mod 作者谈论他们制作 Mod 时想出的最深层、最阴暗的黑科技。我们有MagmaMcFry、raiguard、Deadlock989、Anachrony、PFQNiet 和 Earendel 都在忏悔自己的罪过!

Mod 幕后 stringweasel

重申一遍异星工厂有着一个惊人的 Mod 社区。这就是说,你可能没有意识到一些 Mod 作者付出了多大的努力来创造他们的杰作,特别是当他们遇到引擎限制时。异星工厂的开发者确实尝试并扩展引擎以给 Mod 作者们提供更多的灵活性,但满足 Mod 作者的 一切需求 是不切实际的。所以,当 Mod 作者们遇到异星工厂所提供的极限时,他们需要发挥创造力来实现他们的愿景。通常他们想出的是有趣而疯狂的黑科技变通方法,但玩家却没有注意到。我总是觉得这些变通方法很吸引人,所以我联系了一些 Mod 作者,采访他们最喜欢的故事,即如何让异星工厂服从他们的意志。

厂房:区分你拾取的工厂 MagmaMcFry

在 0.13 版本中,异星工厂并不支持像现在这样的物品元数据,所以我认为唯一有可能在物品中存储数据(并在将物品作为机器放置时读取这些数据)的方法是使用它们的伤害值。因此,在 Factorissimo 1 中,当你拿起一个厂房时,该实体的伤害值会立即被改变为一个与建筑内部相关的唯一数字。当你把建筑放回原处时,伤害值被读取以计算出它应该连接到哪个内部,最后实体的伤害值被重置为你拿起它之前的样子。

在异星工厂 0.14 中,位于背包里的 Factorissimo 1 建筑的一个例子。请注意所有的建筑都有一点点的生命值。另外,请注意背景中的旧 Factorissimo 建筑。
在异星工厂 0.14 中,位于背包里的 Factorissimo 1 建筑的一个例子。请注意所有的建筑都有一点点的生命值。另外,请注意背景中的旧 Factorissimo 建筑。

当我在写 Factorissimo 2 时,异星工厂开发者暗示要让损坏的物品可以堆叠(以前不是这样的,而且会破坏我的系统),而 API 中的物品元数据处理在 0.14 中尚不完善,所以在 Factorissimo 2 中,使用的机制更加古怪:不是将建筑物的数据存储在损坏值中,而是存储在物品类型中。你没听错:每当你拿起一个厂房时,你实际上是拿起了一个具有新的独特内部类型的物品,而这个类型恰好与普通厂房具有相同的名称和精灵。由于另一个相关 API 功能的缺乏,只要你把一个厂房标记为拆除,厂房实体的类型也会改变,而不仅仅是在机器人实际拆除它的时候。由于你不能即时生成新的物品类型,每个工厂规模有一个固定的物品原型数量(我武断地选择了 90 个),所以如果你在重复使用厂房时行为不一致,或者更糟糕的是,以物品形式删除旧的建筑(这是不可以追踪的),你可能会遇到一个错误信息,说“不能一次拿起超过 90 个同一规模的厂房”。这也是厂房蓝箱子存在的原因:由于特殊实体在物流筛选器中被隐藏,你无法从物流系统中请求你的旧厂房。

这个解决方法在在右边异星工厂编辑器中清晰可见,其中每个物品都会单独显示。
这个解决方法在在右边异星工厂编辑器中清晰可见,其中每个物品都会单独显示。

一些目前和过去的黑科技荣誉提名还有:通过假管道实体检测与工厂建筑的流体连接,通过填充常量计算器在表面间传输信号,通过在蓄电器之间移动能量实现表面间传输能量(这就是为什么能量连接是单向的),通过字面上的旋转与辅助实体互动,放置隐形的采矿机以在 Alt 模式下提供连接指示箭头,隐形箱子里装有实际物品用于物品图标覆盖,等等。

目前为止,这些黑科技大部分都不用不着了,因为有 API 支持所需的功能(或者它至少提供了更干净的黑科技)。他们中的一些已成功地被删除,其他的则深深地纠缠在旧代码中。也许有一天我会把它全部清理掉,然后写出 Factorissimo 3。

Tapeline:拖动功能 raiguard

一个由玩家创建的规范分界线例子。
一个由玩家创建的规范分界线例子。

Tapeline 的原始版本非常简单:你用选择工具选择一个区域,它就会在地面上画出一个与你刚才选择的大小相同的尺子。然而,我希望能够在你拖动鼠标的时候就能画出带子。并没有方法可以直接做到这一点,所以我不得不发挥创意。

第一个实现是使用有两个 Tick 冷却时间的隐形手榴弹。按住你的鼠标会不断地扔出这些手榴弹,而 Mod 会接收这个事件来更新位置。当你停止以 2 Tick 间隔投掷这些手榴弹时,Mod 将检测到一个拖动完成。

然而,这也有问题。首先,你根本无法在地图视图中使用它,这严重限制了该 Mod 的效用。它也有多人延迟的问题,手榴弹投掷的时间不会像单人游戏那样 100% 一致。当地图编辑器中的时间暂停时,你也根本无法使用该 Mod。从本质上说,这是一个半生不熟的实现。

过了很久,我有了一个想法:如果我使用一个选择工具,但沿途放置实体来告诉我鼠标当前所在的位置呢?这能让我在拖动时更新分界线,并通过读取常规选择工具事件来检测你何时完成拖动。这也可以让我知道你在拖动时是否按住了 Shift。

可视化显示当你拖动一条分界线时被置于幕后的隐藏实体。
可视化显示当你拖动一条分界线时被置于幕后的隐藏实体。

我做了一个测试,简单地给选择工具分配了一个地方的结果,奇迹出现了,它成功了!该 Mod 现在 100% 可以在多人游戏中使用,甚至可以在地图视图中使用。仍有一些小问题——例如,Shift 拖动会使你的耳朵受到计划拜访噪音的影响——但使用选择工具使我能够完全消除 Mod 的 GUI,使 Mod 的使用更加直观。我一直对你能用异星工厂引擎完成多少事情印象深刻,即使引擎并不打算让这些事情成为可能。

Industrial Revolution 2:传送器 Deadlock989

我必须在传送器序列的传送过程中隐藏玩家,目前想实现这一点需要点疯狂的诡计,涉及到看不见的不可破坏的汽车,并且必须在多种突发情况下再次追踪和清理它们。 是因为玩家(和他们附带的角色)可以在表面之间传送,车辆可以在表面之间传送,但没有附带玩家的角色不能在表面之间传送,而且在过场期间,玩家并依附于角色。我想创建的序列需要角色在某些时候,但不是所有时候都是隐形的,而实现它的最不麻烦的方法是制作一辆隐形的非碰撞汽车,并把他们放在里面,然后在场景 POV 从一个地方移到另一个地方时,把它暂时传送到“边缘”表面。

还有其他各种不涉及自定义无贴图载具的黑科技,但其中一些有非常讨厌的副作用(例如,如果被传送的角色恰好受到攻击,将角色暂时传送到同一表面上的一个非常遥远的位置,会对虫群寻路造成毁灭性的宕机)。在多人游戏中,它还必须对多人游戏的序列中断开连接有很强的鲁棒性,这使得破坏性克隆成为一个太大的难题(你不能把一个断开连接的角色传送到另一个表面,但你 可以 把角色克隆到另一个表面,然后破坏原来的,这在哲学上很有趣,但如果过场序列被断开连接打断或被其他 Mod 干扰,结果“清理”起来会很恼人。可能有更好的方法来解决这个问题,但就像很多异星工厂的 Mod 一样,这也是一个在黑暗中摸索的案例。

玩家使用 Industrial Revolution 2 里漂亮的传送器进行传送。

Nullius:间隔风力发电机 Anachrony

Nullius 风力涡轮机应当间隔 32 格。它们技术含量低,价格便宜,而且高效,但缺点是它们的输出波动且不可预测,而且由于间距要求,它们需要大片的土地。最重要的是,它们并不妨碍你在附近建造其他东西,除了其他风力发电机。游戏引擎并不容易实现这种细微的安置规则。在旧版本的 Mod 中,当涡轮机被建造时,一个脚本在涡轮机的中心添加了一个巨大的、看不见的正方形,它阻止了附近其他涡轮机的建造,但不会与其他东西发生碰撞。然而,这样做的一个主要缺陷是,这个无形的空气空间方块也会与原始涡轮机的位置发生碰撞,使其无法快速更换或升级为更高技术的涡轮机。 与升级其他结构不同的是,你必须先拆掉原来的涡轮机,然后再用一个单独的步骤重建它,这很尴尬也很混乱。解决办法是将大的单方块分解成四个矩形,两个水平的和两个垂直的,它们相互交错,形成一种模式,即建造新的涡轮机的唯一有效地点是 32 格之外或直接在旧的涡轮机上,允许它被快速替换/升级。下图显示了防止第二个涡轮机被放置得太近的碰撞矩形。

风力发电机组的隐形碰撞盒与另一个风力发电机组的位置碰撞的例子。
风力发电机组的隐形碰撞盒与另一个风力发电机组的位置碰撞的例子。

Satisfactorio:超赞回收器的速度 PFQNiet

很多大改 Mod 都有某种“虚空机器”来自动删除你可能不想要的物品。Angel/Bob 有燃烧堆来消除不需要的气体,Krastorio 有粉碎机,而 Industrial Revolution 使用焚化炉来消除不需要的物品。

Satisfactory 里有也一个,正是我需要在 Satisfactorio Mod 中重新创建“超赞回收器”。回收器接受(几乎)任何物品作为输入,并产生积分以获得优惠券,然后可以在超赞商店里消费。它消耗物品的速度和你喂给它的速度一样快,并消耗 30MW 的电力。

在异星工厂中,所有的“虚空机器”都遵循同样的原则:制造一个熔炉实体,并为每个现有的物品创建一个“配方”,消耗该物品而不生产。游戏引擎会处理剩下的部分。在我的例子中,我把配方设置得足够快,以至于它可以消耗 Mk.5 传送带上的物品(Mod中最快的)。然而,这导致了如果使用较慢的传送带,机器大部分时间都处于空闲状态,使其耗电量大大低于应有的水平。

电力图表中的尖峰

我花了一些时间来寻找解决方案,最终想到的是使配方的速度刚好够 Mk.1 传送带(最慢的!),然后利用一个隐藏的、看不见的插件效果分享塔。这种特殊的插件效果分享塔具有 100% 的效率(原版插件效果分享塔只能传输 50% 的效果),并且接受一种特殊类型的插件,可以免费提供 +100% 的速度。脚本会检查连接到机器上的传送带的速度,并根据需要向/从隐藏的信标中添加或删除插件。Mk.2 传送带的携带量是 Mk.1 的两倍,所以它们得到一个插件,以获得 +100% 的消耗速度。这适用于每种传送带。Mk.5 携带的物品有七倍多,所以有六个插件被添加到插件效果分享塔中。

带有 2 个插件的隐形插件效果分享塔的图像

这种设置意味着,无论你向“超赞回收器”输入哪一级的传送带,它都会调整其速度,以准确的速度消耗物品,从而产生一个完全平滑的功率图,没有尖峰,也没有令人讨厌的意外停电!

修好的电力图表

AAI Programmable Vehicles:虫子司机 Earendel

我需要我的车辆从 A 到 B,但它们不能总是走直线。他们需要找到一条绕过障碍物的路径。编写一个寻路算法并不难,但对于异星工厂 Mod 来说,寻路的问题是对地图有一个准确的表述。以一种有用的方式查询地图状态会慢得不切实际,而且当时还不能使用异星工厂的 C++ 寻路器,所以我需要一些更有创意的东西。游戏确实有一个用于虫族内置的“单位”类型,他们可以被告知使用内置的寻路器去一个目的地。问题是,单位不是车辆:它们不能容纳乘客,它们没有后备箱,也不能使用弹药。

Earendel’s Warden 车辆在悬崖边自动寻路。

我那略显疯狂的解决方法是在车辆前面放一个看不见的单位,我称之为“领航员”,它的大小和碰撞设置与车辆相同。我告诉它去某个地方,跟踪它的移动,并把它的路径作为车辆的路径。因此,你可以说,车辆是由一个看不见的虫子驾驶的。它的效果很好,但也有很多奇怪的副作用。例如,有时领航员会着火,所以作为不知道领航员存在的玩家,你会突然看到无缘无故地在地图上飞驰的离群火焰。有时,领航员会找不到路,或者分心,开始绕圈走,但由于无法判断那是一条正确的路,还是领航员出了故障,车辆只能跟着它走一段时间,直到发现它走了一个圈。

最终,Wube 实现了我的请求,将 C++ 寻路器暴露给 Mod 作者,所以整个“虫子司机”的事情已经成为过去,但对我来说,它依然作为最古怪和最有趣的 Mod 黑科技而引人注目。

分享你的故事!

你在上面读到的只是我听过的一小部分故事,我们将在未来发布另一篇文章,介绍其他 Mod 作者的更多恐怖故事。如果你是一个有着有趣黑客变通故事的 Mod 作者,或者与异星工厂有关的任何事情,那么请让我们知道!我们很愿意把它告诉全世界。谈论这样的创伤性事件是很重要的,因为把这一切藏在心里从来都不是好事。毕竟,它可能会减缓你的工厂的发展。而我们不希望这样。

征稿

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