Alt-F4 #55 - Mod 的黑暗小巷 2021-12-17
翻译 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 中,当你拿起一个厂房时,该实体的伤害值会立即被改变为一个与建筑内部相关的唯一数字。当你把建筑放回原处时,伤害值被读取以计算出它应该连接到哪个内部,最后实体的伤害值被重置为你拿起它之前的样子。
当我在写 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 一样,这也是一个在黑暗中摸索的案例。
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 携带的物品有七倍多,所以有六个插件被添加到插件效果分享塔中。
这种设置意味着,无论你向“超赞回收器”输入哪一级的传送带,它都会调整其速度,以准确的速度消耗物品,从而产生一个完全平滑的功率图,没有尖峰,也没有令人讨厌的意外停电!
AAI Programmable Vehicles:虫子司机 Earendel
我需要我的车辆从 A 到 B,但它们不能总是走直线。他们需要找到一条绕过障碍物的路径。编写一个寻路算法并不难,但对于异星工厂 Mod 来说,寻路的问题是对地图有一个准确的表述。以一种有用的方式查询地图状态会慢得不切实际,而且当时还不能使用异星工厂的 C++ 寻路器,所以我需要一些更有创意的东西。游戏确实有一个用于虫族内置的“单位”类型,他们可以被告知使用内置的寻路器去一个目的地。问题是,单位不是车辆:它们不能容纳乘客,它们没有后备箱,也不能使用弹药。
我那略显疯狂的解决方法是在车辆前面放一个看不见的单位,我称之为“领航员”,它的大小和碰撞设置与车辆相同。我告诉它去某个地方,跟踪它的移动,并把它的路径作为车辆的路径。因此,你可以说,车辆是由一个看不见的虫子驾驶的。它的效果很好,但也有很多奇怪的副作用。例如,有时领航员会着火,所以作为不知道领航员存在的玩家,你会突然看到无缘无故地在地图上飞驰的离群火焰。有时,领航员会找不到路,或者分心,开始绕圈走,但由于无法判断那是一条正确的路,还是领航员出了故障,车辆只能跟着它走一段时间,直到发现它走了一个圈。
最终,Wube 实现了我的请求,将 C++ 寻路器暴露给 Mod 作者,所以整个“虫子司机”的事情已经成为过去,但对我来说,它依然作为最古怪和最有趣的 Mod 黑科技而引人注目。
分享你的故事!
你在上面读到的只是我听过的一小部分故事,我们将在未来发布另一篇文章,介绍其他 Mod 作者的更多恐怖故事。如果你是一个有着有趣黑客变通故事的 Mod 作者,或者与异星工厂有关的任何事情,那么请让我们知道!我们很愿意把它告诉全世界。谈论这样的创伤性事件是很重要的,因为把这一切藏在心里从来都不是好事。毕竟,它可能会减缓你的工厂的发展。而我们不希望这样。
征稿
一如既往的,我们正在召集任何想要为 Alt-F4 做出贡献的人,无论是提交文章还是帮助翻译都可以。如果您有些有趣的想法,并乐于与社区分享,这里就是一个好地方。如果您没有太大把握,我们会很乐意帮助您讨论内容创意和结构问题。如果您有意参与,从加入 Discord 开始吧!