SYS.READ_STREAM | UTF-8
PATH: TreeFarm/03-尝试设计一台全树种树场.md
WORDS:2,863
EST_TIME:10 MIN

#03 尝试设计一台全树种树场

在上一节中,我们已经完成了一台最简单的树场。但这台树场有个很严重的问题:只能处理白桦树,而对于其他树种无能为力。为了解决这个问题,这一节我们尝试设计一台全树种树场。

对于全树种树场,我们需要架构能够满足所有需要处理的树种的生长需求。这意味着取并集,我们需要在架构设计的某个方面上满足要求最高的树种的要求。这里我们暂时只涉及最传统的五个树种:白桦 橡树 丛林 云杉 金合欢。我们按照设计的一般顺序,逐一讲解。

其中白桦是生长限制最小的树种,我们从云杉开始。

云杉要求以树苗为中心,5x5的范围内没有阻挡生长的方块。对此,我们可以在主干处理上选择三次递推伪二次递归,和蜜绿二次递归等方式

示例架构:

4TF_Layout

主推设计会极大影响橡树限高的方案,请谨慎选择

金合欢会在同一y值上,沿x或z轴,距离树苗至多4格,长出至多2个原木,其中包含直线、拐角等各种情况,如图。

Acacia_Straight
Acacia_L

这意味着我们无法通过主推移走所有的原木,对此我们需要增加侧枝处理。其有两种设计方案:归中处理增加原木输出

归中处理而言,我们需要先将主推侧的原木推到中间,再将左侧的原木推到中间,由主推移出中心,最后将右侧原木推到中间,由主推移出中心

HSUTF

增加原木输出的典型案例是nutstory的架构,相信你们能通过动图理解它的工作方式。

Nutstory_Acacia

@Dreaming_Galaxy, XJH_Jorhai, Feng_Bl, Bright_Observer PUTF standard

在一些架构中,我们会同时见到这两种处理方式,如PUTF -2。另外PUTF//给出了另一种处理思路:增加一格主推,将侧枝归中到中间2格后直接推出。但这种方式不能用于樱花树,在GTMC所处的1.20.1并没有显著的价值

丛林的树干高度最高为12格,我们需要有足够高度的主推,以尽可能处理所有的原木

事实上存在不处理全高的全树种树场,一般有8高(方便橡树限高)和10高(方便布线),但我们不提倡这种行为

丛林的树苗掉落概率为1/40,因此我们需要为丛林木设计额外的树叶处理。最简单的方式是使用二次递推,或者蜜绿墙尽可能处理所有可能长出的位置。一般而言,俯视情况下,5x5范围内不超过5列树叶无法处理,则这台树场可以获得足够的丛林树苗。

Leave_Crasher

@nutstory 5列无法处理

其实这种估算方式并不严谨,丛林树叶在靠近主干的位置分布的更密集。严格意义上讲需要计算每种树叶生长情况下处理量的平均值,一般而言大于42即可获得足够的丛林树苗

由于橡树会随机地长出大橡树俗称鸡腿树,我们需要对橡树进行限高,以避免这种情况。限高方块位于泥土上第9格

事实上能直接处理鸡腿树的架构和树场是存在的,但是目前为止我们无法使其获取足够的丛林树苗,因而不在全树种树场的讨论范围内

这里我们举例采用主推蜜绿三次递推、侧枝归中处理、树叶处理蜜绿墙、限高手放黑曜石

熟悉老树场的同学应该会发现,这几乎就是PTHSUTF的架构。事实上,由于械电设计方式繁杂,最好的学习某种设计的方式就是“模仿”。某种意义上,可以说在械电的学习阶段,不要忌讳“抄”,能够抄一遍优秀作品的布线,你都可以学到很多

由于全树种树场较为特殊的方块流输出,我们需要对方块流进行重组,再送入特殊设计的爆炸室

我们举例的设计而言,所有的原木都会被输出到主干正面,每一个运行周期至多输出两格。

熟悉DLHSUTF/PTHSUTF/DLPTUTF的同学应该能立刻想到直接使用两排并排的活塞,将目前还不知道间隔的两次原木输出转化为一个2宽的原木输出。另外我们可以用一个类似侧吸底座的结构,将不确定间隔的两次原木输出转化为确定间隔的两次原木输出(一般为6gt

BlockStream

BlockStream2

@Dawnemo DLPTUTF

由于金合欢同y的两个原木可以分布在中心与其周围1格(如下图),即便增加原木输出,主干也需要使用这类重组。对于额外的原木输出,我们可以简单的添加爆炸室解决它们的方块流转掉落物问题

这里我们先随便挂一些爆炸室处理方块流,不过我们尽量不同时推出两格厚的方块流,因为这样会极大地影响爆炸室的处理效率和最后的掉落物回收率

事实上对于全树种,我们可以引入纯牛奶爆炸室(俗称“奶爆”)和b36爆炸室(俗称“推爆”)两种较为特殊的爆炸结构,以应付大量不甚规则的方块流。这种方式已经在现代高速全树种得到了广泛应用,但是由于没人给我们的例子改爆炸室,我们在提速章节统一讲解(

奶爆:
Explosion_Chamber

@从来只喝纯牛奶

@Qonctrol, Dreaming_Galaxy, BFladderbean, Feng_Bl PUTF std2

推爆:
Explosion_Chamber2

@嘟了个嘟噜

其实在设计好时序之后,你只需要尽可能严格地按照你设计的时序激活各组活塞就可以了,这里我们想特别讨论模式切换的相关布线

如果你有认真观察,一定可以发现:除了金合欢,对于其他所有树种,我们都可以使两个侧面蜜绿墙(后简称侧墙)同时推出,从而缩短处理周期,更进一步,我们可以让主推也同时推出,进一步缩短处理周期。这时,就产生了不同的运行时序

处理方案并不算复杂。你可以注意到,从常规的运行时序切换到金合欢运行时序,实质上等同于为两个侧墙增加延迟,因此我们只需要另外连一条延迟更大的线激活侧墙,并设计一个在两条线路之间切换的装置,就可以了

Acacia_Timing

很多人会说手放黑曜石太麻烦了。这当然是有解决方案的:自动限高

由于不同树场自动限高的方式有很大差别,这里只讲解我们举例的架构使用的自动限高

可以发现,我们只需要将一个不能被主推推动的方块放到对应的位置,就可以达成限高的效果,但为了通过某种方式(一般是飞行器)将这个方块送下去,我们只能使用可推动的方块。解决方案是,在主推的推动方向上填满原木,在重组那边塞入一个激活的活塞从而阻碍主推方向上这个方块的移动。

Oak_Limit1

当然也有一些其它方案,在这里举个例子:
切史莱姆棒子的:

Oak_Limit2

@Jellie_

飞陶瓦的:

Oak_Limit3

@XJH_Jorhai

切墙主推飞飞行器下去直接塞的:

Oak_Limit4

@Feng_Bl

在1.14及以下版本中,丛林与金合欢的生长检测为树干3x3,树冠5x5,因此我们可以在某个高度以下(一般是泥土以上5格),向5x5以内塞入一些方块,从而使低于一定高度的丛林和金合欢被强制增高到一定高度,从而提升这两种树的效率

由于增高的机制事实上是禁止低于一定高度的丛林或金合欢长出,所以它会增加骨粉消耗。另外,即便在1.20.1中,深色橡木也保留了相同的生长要求(以西北角树苗为中心),因此我们依然可以“增高”深色橡木

其实到这里还有个问题,因为树有可能在我们的架构完全复位之前就长出来,然后触发检测结构,这样会把我们的树场搞坏,所以我们需要给检测结构添加限速器,同时,限速器的工作时间也要依据每个模式树场其他部分的运行时序(复位时间)来确定

对于qc检测,我们可以直接充能回推活塞,或者在检测后推出的结构上粘住些什么,让检测结构在某个时刻之前无法推出,比如PTHSUTF的方案

考虑到qc检测的限速很难模块化,你自己做一个比什么都强(

对于比较器检测,我们可以采用类似的方案,即在某个节点之前切断信号输出

对于推动上限检测,我们可以切断检测结构与泥土的连接

PldLimit
PldLimit

对于bud检测,如果你要保证稳定,你必须采用4gt复位的bud,然后在信号输出端做延迟。如果采用6gt复位的bud,就有可能出现提前在4gt长树无法触发的情况,比如菜逼星河早年的几台无粉完美时序橡树模式和TT的6gt丛林树场就是这么炸的

至此,我们就完成了一台相对简单的全树种树场。

[[这里是我们做的例子!|TreeFarm/exampleworld/#03 尝试设计一台全树种树场.zip]]