##12 原木生长机制:树形与催熟
#12.1 树苗催熟
树苗生长有两个阶段 (蘑菇 / 下届菌),随机刻和骨粉 (45% 概率) 让树苗增加一个阶段
第二阶段的树苗再次尝试生长时就会尝试生成树
注意树苗最开始就已经在第一阶段, 所以最少只需要两个骨粉即可催熟
不同骨粉数量的催熟成功率如下图
| 骨粉数量 | 催熟成功率 | | 骨粉数量 | 催熟成功率 |
|---|
| 1 | 0.000% | | 11 | 98.611% |
| 2 | 20.250% | | 12 | 99.174% |
| 3 | 42.525% | | 13 | 99.513% |
| 4 | 60.902% | | 14 | 99.714% |
| 5 | 74.378% | | 15 | 99.832% |
| 6 | 83.643% | | 16 | 99.901% |
| 7 | 89.758% | | 17 | 99.943% |
| 8 | 93.682% | | 18 | 99.967% |
| 9 | 96.148% | | 19 | 99.981% |
| 10 | 97.677% | | 20 | 99.989% |
对于蘑菇/下届菌, 使用骨粉有 40% 概率尝试生成巨型蘑菇/巨型下届菌
#12.2 树的生成
所有树的生成都可以分为几个阶段, 其中准备阶段几乎一样, 其余阶段将在各自生成过程中解释
- 准备阶段:
- 计算树的高度 (或者说树干的长度):基础高度 + (0 到随机高度 1 的随机数) + (0 到随机高度 2 的随机数)
- 如果有树根生成, 那么将树干起点向上移动
- 检查空间与高度限制
- 确保树的最低点和最高点都在世界的有效高度范围内
- 从树干起点向上直到树干顶部往上一层,一层层地检查是否有足够的空间容纳树。有障碍物则生成失败
- 仅限奇异橡树:如果遇到障碍物, 返回障碍物的 y-2 作为最高可生长的高度, 尝试剪裁部分高度 (最多为 4) 然后生成, 裁剪后仍然不能生成则本次生成失败
- 树根生成 (目前仅红树有):生成树根
- 树干生成: 生成主干和分支以及对应的树叶附着点
- 树叶生成: 在每个树叶附着点按一定的规则生成树叶
- 装饰: 生成藤蔓, 蜂巢等等装饰物
| 基础高度 | 随机高度 1 | 随机高度 2 |
|---|
| 橡树 | 4 | 2 | 0 |
| 白桦 | 5 | 2 | 0 |
| 云杉 | 5 | 2 | 1 |
| 丛林 | 8 | 4 | 0 |
| 金合欢 | 5 | 2 | 2 |
| 樱花树 | 7 | 1 | 0 |
| 杜鹃 | 4 | 2 | 0 |
| 红树 | 2 | 1 | 4 |
| 高红树 | 4 | 1 | 9 |
| 深色橡树 | 6 | 2 | 1 |
| 巨型丛林 | 10 | 2 | 19 |
| 巨型云杉 | 13 | 2 | 14 |
#12.2.1 橡树, 白桦树, 丛林树, 云杉树, 丛林树的生成
-
检查空间与高度限制 除了云杉木检测 5×5 范围以外, 其余的都是每层检测 3×3,
-
树干生成: 这几种树都使用了StraightTrunkPlacer这个树干生成器, 会垂直放置相应高度的原木
-
树叶生成:
#12.2.2 樱花树的生成
#12.2.3 金合欢树的生成
#12.2.4 红树的生成
- 准备阶段: 将树干生成起点向上移动 1-3 格 (高红树 3 - 7 格)
- 树根生成
- 检查从树苗生长位置到树干底部下方一格能否满足树根放置条件 (空气或者有
REPLACEABLE_BY_TREES或MANGROVE_ROOTS_CAN_GROW_THROUGH标签)
- 以树干生成起点往外一格为起点开始生成树根 (四个方向, 顺序为北东南西)
- 依次向上垂直放置原木直到达到高度 树干顶端为树叶附着点
- 每次成功放置非顶端原木 (如果目标位置不是空气或者有
REPLACEABLE_BY_TREES标签则放置失败), 有 50% 概率生成一个分支 (分支长度 1-4, 高红树 1-6)
- 对于每个分支, 斜着 45 度放置原木, 分支上的每一个原木以及分支末端上下方一个方块为树叶附着点
//TODO 这里放个图
- 树叶生成
对于每个树叶附着点重复 70 次以下内容
从附着点开始, 将 x 和 z 坐标 + (两个 0-2 的随机数相减)
y 坐标 + (两个 0-1 随机数相减)
相当于 x 和 z 在距离附着点 2 格内, y 距离 1 格内随机
在得到的坐标处尝试放置树叶
- 装饰
- 蜂巢装饰 (红树有 1% 的概率触发蜂巢装饰)
- 如果树有树叶,选择最低树叶下方一格的 y 值用于生成蜂巢, 如果没有树叶, 最低树干的 y + 1 + (0 到 2 的随机数) 用于生成蜂巢
- 筛选出本次生成中所有位于目标高度的原木方块
- 获取这些原木水平相邻的所有位置(不包括北方, 因为蜂巢默认朝南)作为候选位置
- 将这些候选位置随机打乱
- 找一个满足以下两个条件的位置放置蜂巢 (
没有就不放)
- 往蜂巢中放入 2-3 只蜜蜂