地形基础类型
rtg/world/gen/terrain/ 下共 415 个 .java 文件,构成:
| 分组 | 数量 | 说明 |
|---|---|---|
| 根目录共享地形 | 23 | Terrain* 且不含 TerrainBase |
根目录 TerrainBase |
1 | 所有地形类的根基类 |
根目录 FunctionalTerrainBase |
1 | 带 HeightEffect 的地形基类 |
| 根目录地形修饰器 | 15 | *Effect 文件,其中 HeightEffect.java 是抽象基类 |
根目录 HeightVariation |
1 | 同样 extends HeightEffect,但文件名不以 Effect 结尾 |
| 群系包专属地形 | 374 | 与 374 个群系严格 1:1 |
23 + 1 + 1 + 15 + 1 + 374 = 415。
(find world/gen/terrain -name '*.java' | wc -l = 415;根目录 41 + 25 个包目录 374。)
「374 个专属地形与 374 个群系 1:1」是逐类比对得出的:把
world/gen/terrain/<pack>/ 下的类按包计数,与 群系包 各页的群系数相加,
两者相等。地形包目录没有额外的 Terrain<Pack>Base 共享类,所以计数是干净的。
根目录共享地形(23)
Terrain* 前缀,全部 extends TerrainBase 或 extends FunctionalTerrainBase:
| 类 | 对应地貌 |
|---|---|
TerrainBeach |
海滩 |
TerrainCanyon |
峡谷 |
TerrainDuneValley |
沙丘谷地 |
TerrainDunes |
沙丘 |
TerrainFlatLakes |
平坦湖泊 |
TerrainForest |
森林 |
TerrainGrasslandFlats |
草原平地 |
TerrainGrasslandHills |
草原丘陵 |
TerrainGrasslandMountains |
草原山地 |
TerrainHighland |
高地 |
TerrainLonelyMountain |
孤山 |
TerrainMarsh |
沼泽 |
TerrainMesa |
方山(台地) |
TerrainMountain |
山地 |
TerrainMountainRiver |
山地河流 |
TerrainMountainSpikes |
山地尖峰 |
TerrainOcean |
海洋 |
TerrainOceanCanyon |
海洋峡谷 |
TerrainPlains |
平原 |
TerrainPolar |
极地 |
TerrainRollingHills |
起伏丘陵 |
TerrainSwampMountain |
沼泽山地 |
TerrainVolcano |
火山 |
另有 VariableRuggednessEffect 一类,见下节。
地形修饰器(16 个 HeightEffect 子类)
*Effect 类不是地貌本身,而是对已经算出的高度做加减 / 混合的后处理单元。
基类 HeightEffect(HeightEffect.java)是抽象类,只有一个抽象方法
added(OpenSimplexNoise, CellNoise, float, float),外加一个 plus(HeightEffect)
工厂(内部类 SummedHeightEffects 把两个修饰器相加)。
16 个子类全部 extends HeightEffect:
| 类 | 作用 |
|---|---|
HeightVariation |
高度变化(唯一不以 Effect 结尾的修饰器) |
JitterEffect |
抖动 |
BumpyHillsEffect |
颠簸丘陵 |
HillsEverywhereEffect |
全域丘陵 |
HillockEffect |
小丘 |
BlendedHillEffect |
混合丘陵 |
PlateauEffect |
抬升为高原 |
RaiseEffect |
抬升 |
SpikeEffect |
尖刺 |
AdjustableSpikeEffect |
可调尖刺 |
ScatteredMountainsEffect |
散布山峰 |
MountainsWithPassesEffect |
带垭口的山脉 |
LonelyMountainEffect |
孤山 |
GroundEffect |
地表修正 |
VariableRuggednessEffect |
可变崎岖度控制 |
其中 15 个的文件名以 Effect 结尾(find terrain -maxdepth 1 -name '*Effect*.java'
= 15,含 HeightEffect.java 本身),HeightVariation 是第 16 个。
核心:TerrainBase
rtg.world.gen.terrain.TerrainBase,全部地形类的根。两个常量:
| 常量 | 值 | 含义 |
|---|---|---|
minimumOceanFloor |
30.01f |
海床允许的最低 Y 坐标(注释:The lowest Y coord an ocean floor is allowed to be) |
minimumDuneHeight |
21f |
沙丘高度配置项的强度因子下限 |
FunctionalTerrainBase extends TerrainBase,只加一个字段 protected HeightEffect height,
并把 generateNoise 实现成
riverized(height.added(simplex, cell, x, y) + base, river)——
即「高度修饰器结果 + 地形基底高度,再做河道压平」。大部分具体地形走这条路径。
TerrainBase 另有一批 static 函数供各包复用。它为几乎每一个具体地形都提供了
同名 terrain* 静态实现(不是抽象方法,是可复用的现成算法):
- 通用数学工具:
blendedHillHeight(2 个重载)/borderAdjusted/above/stretched/unsignedPower/hills/groundNoise(2 个重载) /getTerrainBase(2 个重载)/riverized - 逐地形的
terrain*实现(27 个):terrainBeach、terrainBryce、terrainCanyon、terrainDuneValley、terrainDunes、terrainFlatLakes、terrainForest、terrainGrasslandFlats、terrainGrasslandHills、terrainGrasslandMountains、terrainHighland、terrainLonelyMountain、terrainMarsh、terrainMesa、terrainMountainRiver、terrainMountainSpikes、terrainOcean、terrainOceanCanyon、terrainPlains、terrainPlateau、terrainPolar(2 个重载)、terrainRollingHills(2 个重载)、terrainSwampMountain、terrainVolcano
唯一的实例方法是 generateNoise(...)(TerrainBase.java:89)。
噪声来源
高度计算只依赖两个噪声对象,由 generateNoise 的签名传入:
| 参数 | 类型 | 实现 |
|---|---|---|
simplex |
rtg.util.OpenSimplexNoise |
RTG 自带的 OpenSimplex 实现(rtg/util/OpenSimplexNoise.java) |
cell |
rtg.util.CellNoise |
细胞噪声,用于圆盘/斑块类地貌 |
rtg/util/ 下另有 SimplexOctave / SimplexCellularNoise / SimplexCellularOctave /
CellOctave 等多层包装,以及 SnowHeightCalculator / CliffCalculator /
BoulderUtil 等专用计算器。