本篇教程由作者设定使用 CC BY-NC 协议。

构成方块

粒子加速器机制详解-第1张图片一台可合成碰撞能量 500 J 的机器

粒子加速器:控制器,将粒子注入前面的导向环并开始移动,要进行粒子碰撞合成需要有两台粒子加速器。

粒子加速器导向环:可作为门,控制粒子移动的方向,右击可调整为 ±45° 方向,根据摆放时的朝向仅有一侧可以调节角度,接收到红石信号时方向变为直线。

粒子加速器直线型马达:可作为门,储能上限为 5M FE,当粒子经过时消耗能量加速粒子,消耗 当前速度 * 10 的能量使粒子速度 +1。

粒子加速器传感器:可作为门,粒子经过时根据其速度更新红石比较器信号强度,最多持续 4 刻。

速子吸收器:吸收粒子碰撞产生的速子,储能上限为 1M FE。

配置

配置文件位于 config/oritech-config.json5,以下为 0.14.3+ 版本的默认值。

int maxGateDist = 10(最大距离)

float bendFactor = 2.5(转弯系数,该值在 0.14.3 版本之前为 3,基于 2.5 系数的设计可用于 3)

int accelerationRFCost = 10(加速消耗的能量倍率)

int endPortalRequiredSpeed = 10000(末地入侵所需速度)

int netherPortalRequiredSpeed = 5000(下界入侵所需速度)

int blackHoleRequiredSpeed = 15000(黑洞所需速度)

int collectorEnergyStorage = 1000000(速子吸收器储能上限)

float tachyonCollisionEnergyFactor = 1.0(速子碰撞能量系数)

int pullTimeMultiplier = 8

int pullRange = 16

int idleWaitTicks = 200

int blackHoleTachyonEnergy = 50000

数据

最大距离 = clamp(sqrt(速度) / 2, 2, 10 maxGateDist)

碰撞能量 = 相撞粒子速度矢量差的模

最小转弯距离 = sqrt(速度) / 2.5 bendFactor

马达加速消耗能量 = 速度 * 10 accelerationRFCost

速子数量 = (int) (sqrt(碰撞能量) / 2 + 1)

int 每个速子能量 = (int) (((碰撞能量 / 2) ^ 2) * 3 * 1 tachyonCollisionEnergyFactor * 10 accelerationRFCost) / 速子数量

int 速子能达到的距离 = 速子数量 / 3

粒子加速器传感器

信号强度速度单加速耗能双加速耗能
00--
1>0--
2>10550300
3>5012.8 K6.5 K
4>7528.5 K14.5 K
5>10050.5 K25.5 K
6>150113.3 K57 K
7>250313.8 K157.5 K
8>5001.26 M627.5 K
9>7502.82 M1.41 M
10>10005 M2.5 M
11>250031.27 M15.64 M
12>5000125.3 M62.53 M
13>7500281.29 M140.67 M
14>10000500.05 M250.05 M
15>150001.125 G562.58 M

逻辑

粒子加速器机制详解-第2张图片

粒子不是实体,粒子的逻辑由控制器运行并在世界中具象化,在 TE (方块实体)刻执行。

当控制器的粒子不存在且输入槽非空、输出槽为空时,在前面的导向环处注入速度为 1 的粒子,移动方向为控制器的右边,该导向环为通过门并寻找下个门。注入粒子先于执行粒子逻辑。

每刻执行粒子逻辑:

  • 取粒子当前速度计算该刻可达距离,即 可达距离 = 当前速度 / 20;

  • 当 可达距离 > 0.001 时,循环:

    • 未找到门时粒子退出;

    • 移动距离 = min(距下个门路径距离,可达距离);

    • 检测是否与其它粒子碰撞并计算 碰撞能量,检测碰撞的逻辑如下:

      • 从 HashMap 检查 下个门(存在时优先) 或 通过门 的方块位置是否有其它粒子;

      • 将该门位置和控制器方块位置加入 HashMap;

      • 在每刻结束阶段清空 HashMap;

      • 方向由两个粒子当前方向决定,即使发生碰撞时两个粒子并不在同一个位置;

      • 产物在检测到碰撞(后运行)的控制器生成。

    • 可达距离 -= 移动距离,并根据 移动距离 更新粒子位置;

    • 转弯距离 += 移动距离;

    • 检查粒子所在方块位置是否与生物碰撞(即仅在通过门或路径终点与生物碰撞),对每个碰撞的生物获取其当前生命值并造成等同于速度的魔法伤害,损失 min(速度,当前生命值) 速度,速度 <= 0.1 时不再判定。最终粒子的速度不会低于 1;

    • 当粒子距离 下个门 距离 < 0.1 时:

      • 寻找 下个门,当 (int) 门距 <= 最大距离 时从缓存中获取门;

      • 否则重新寻找门,寻找格数为最大距离,此时在斜线方向上的长度会超过最大距离但仍然为 有效门;

      • 未找到门时粒子退出;

      • 当前进方向改变时,检查转弯距离:

        • 最后转弯距离 = 转弯距离 + 上次转弯距离 + min(转弯距离, 上次转弯距离);

        • 最后转弯距离 <= 最小转弯距离 时粒子退出。

      • 若该门为马达则加速,为传感器则更新测量值;

      • 更新 通过门 和 下个门。

粒子加速器机制详解-第3张图片该布局 最后转弯距离 = 2√2 + 4 + min(2√2, 4) ≈ 9.657。

粒子加速器机制详解-第4张图片碰撞产生的速子

粒子碰撞设计

常见的碰撞思路有两种:

  • 高速+低速:1000 + 1 = 1001,所需能量约 5M FE;

  • 双向同时加速:500 + 500 = 1000,所需能量约 2.5M FE。

双向加速所耗的能量是单向的一半,但碰撞的方向不一定对,如下图,蓝色表示粒子当前位置及其运动方向,右上角的粒子在本刻先进行了移动,用棕色表示其轨迹,而后左下角的粒子开始移动,发现 HashMap 里已经有下个门了并且来自另一个控制器,在下方粒子特效处发生了碰撞,其碰撞速度及其矢量和如橙色和绿色所示,碰撞后的能量 1 + 1 < 1。

粒子加速器机制详解-第5张图片粒子加速器机制详解-第6张图片碰撞门;通过门,下个门,速度矢量;碰撞能量

当粒子速度足够快时,双向加速只能用于固定情况,马达缺能量导致位置不一致或弯道过大都会失效,故本文仅讨论单加速。

1000J设计

粒子加速器机制详解-第7张图片

最大距离的最小值为 2,即直线上最多空一格,斜向上最多空一格,且均可以从缓存中获取门,此时摆放间隔如上图所示。

若要用单环单加速设计碰撞能量为 1000 J 的机器,可求得参数如下:

速度 = 1000

至少需要能量 = (1 + 速度) * (速度 / 2) * 10 ≈ 5 M FE

转弯系数 = 2.5 [3.0] 注:方括号为系数为 3.0 时的结果

最小转弯距离 = sqrt(速度) / 转弯系数 = sqrt(1000) / 2.5 ≈ 12.65 [10.541]

最后转弯距离 = 转弯距离 + 上次转弯距离 + min(转弯距离, 上次转弯距离) = 2√2 + 2√2 + 直线距离 ≈ 5.656 + 直线距离

最后转弯距离 >= 最小转弯距离

直线距离 >= 最小转弯距离 - 5.656 = 6.994 [4.885]

直线方块长度 = ceil(直线距离) + 1 = 8 [6](包含直线两端)

传感器强度变化时粒子已经走完了本刻的路程,红石比较器有 2 刻的延迟,漏斗到粒子加速器到粒子有 0-1 刻延迟,粒子碰撞有 0-1 刻延迟,故延迟为 3~5 刻。

延迟和更多马达会使粒子速度超过额定速度,故设计时可增加容差,此时直线方块长度为 9 [7]。

查表得 1000 速度时比较器强度为 10,这里使用减法模式减去合成器的 9。

粒子加速器机制详解-第8张图片图示基于 2.5 系数,可用于 3粒子加速器机制详解-第9张图片左:成功;右:脱轨速度

15000J及以内通用设计

使用单环单加速设计至少需要能量 ≈ 1125 M FE(更多的马达数和能量传输速率会提高此值)。

若采用单环设计需要大量的导向环,此处可用多环设计节省材料。

外环速度为 15000,最小转弯距离 ≈ 48.99 [40.825]。

根据 最后转弯距离 可知,斜线和直线距离等长时效率最高,故此处斜线方块长度(含两端)应取最大 10 + 1 = 11。

斜线长 = (11 - 1) * √2 ≈ 14.142,求得外环直线方块长度为 22 [14],增加容差后为 24 [15],此时外环边长为 11 * 2 + 24 - 2 = 44 [35],此时粒子脱轨速度 = ((14.142 + (24 - 1) + 14.142) * 2.5) ^ 2 ≈ 16438 [15984] m/s。

最大距离的最大值为 10,所需速度 = (10 * 2) ^ 2 = 400,传感器最接近的速度为 500,先按 500 速度设计。

求得直线方块长度为 4 [3],增加容差后为 5 [4],内外环共用马达可以节省材料和方便连电线,此时也可考虑增加内环直线长度。

500 速度和 15000 速度对应比较器强度分别为 8 和 15。

外环周长 = (14.142 + 24 - 1) * 4 = 148.568 [112.568],500 速度 1 刻移动距离 = 500 / 20 = 25,红石信号所需保持时间为 celi(148.568 / 25) = 6 [5] 刻,使用简单的比较器延长电路即可。

关于该设计最多能放置的马达数(实际可放置的马达数可以略微超过此值):

平均速度 = (16438 + 15000) / 2 = 15719(实际平均速度低于此值)

移动距离 = 15719 / 20 * 5 = 3929.75(延迟 3~5 刻,此处取 5 计算)

最多经过圈数 = celi(3929.75 / 148.568) = 27

每刻最多经过圈数 = celi(27 / 5) = 6

每个马达最多需要能量 = 15000 * 10 * 6 < 5 M(此时马达的储能不是瓶颈,每圈经过都可以获得加速,反之也可利用传输上限限制加速度并节能)

允许超过的速度 = 16438 - 15000 = 1438

一定安全的马达数 = floor(1438 / 27) = 53

粒子加速器机制详解-第10张图片粒子加速器机制详解-第11张图片粒子加速器机制详解-第12张图片
粒子加速器机制详解-第13张图片粒子加速器机制详解-第14张图片粒子加速器机制详解-第15张图片粒子加速器机制详解-第16张图片

根据所需碰撞能量调整图示处红石强度,如 5000 速度的比较器强度为 12,则此处红石强度调整为 12,搭配集成动力写入红石信号、AE2 等模组可完全自动化。

合成器搭配红石比较器不是必须的,用合成器只是方便调整比较器强度,最终目的是为了输出特定强度的红石信号并与传感器的比较器比较或作差。

图二数字为间隔,且平滑石头围起来是一个区块大小。

从右侧控制器启动,达到速度后左侧控制器加入第二个粒子并发生碰撞,根据方块实体更新顺序,产物不一定在右边,有可能在左边,最好两边都抽取产物

传感器测量速度是大于,且检测并注入第二个粒子的过程有延迟,即使第二个粒子与第一个粒子同向也有足额碰撞能量。

超导体需要多个输入以维持满加速能量消耗,每个连接不同位置超导体的输入可传输 4 M/t。

使用黏性活塞而不是红石火把,活塞在 BE 阶段推动,同一游戏刻内 TE 阶段漏斗完成物品传输,而红石火把有 2 游戏刻延迟。

搭配  2 档红石中继器是为了锁定漏斗,防止漏斗再次传输物品。传感器 4 刻,比较器 2 刻,活塞 2 刻,刚好 8 刻会导致漏斗再次传输物品。

维度碰撞

当两个火焰弹以 >5000 J netherPortalRequiredSpeed 碰撞能量相撞时,产生下界传送门

粒子加速器机制详解-第17张图片当两个末影珍珠以 >10000 J endPortalRequiredSpeed 碰撞能量相撞时,产生末地传送门

粒子加速器机制详解-第18张图片

单个粒子以 >15000 blackHoleRequiredSpeed 速度撞击传送门方块(下界传送门、末地传送门、末地折跃门等)时,产生黑洞(方块),黑洞会吞噬周围的一切,包括不可破坏的方块、任何实体、创造模式玩家(此处源码注释:是的,这将杀死创造模式的玩家。这是有意为之,不要上报该错误或发起 PR。看看你,jshipley。),每次吸收方块后向反方向放出黑洞速子,每个黑洞速子被吸收时提供 50k FE 能量。

粒子加速器机制详解-第19张图片