本帖最后由 1094822247 于 2020-3-29 00:24 编辑 
失落的城市
失落的城市是一个关于世界生成的模组。
内容
导言
模组有两个主要功能:
● 添加了一个新的世界类型,您可以用本模组生成新的主世界。
● 添加了一个新维度(默认 ID 111),您可以从正常的主世界(或者是一个失落的城市世界)到达这个维度。
它在世界中生成了一座废弃的城市,这里展示了游戏截图:
链接
基础结构
本页面主要介绍本模组的内部结构及其配置。在这一部分中解释了本模组的基础运行原理。
你将发现在这个世界上生成的大楼、桥梁、地铁系统和其他结构实际上并不是“结构”,而是通过真正的世界因子生成的自然产物。这意味着它们在区块生成的早期阶段就已经生成了。这使得模组的世界生成器运行得非常高效,并且可以让生成物很好的融入周围的世界。
需要注意的是,本模组不依赖于区块生成的任何特定方向。当一个区块生成时,它并不依赖于临近的已生成区块,因此它必须通过本身计算生成。不过,本模组维持着一些世界范围内的结构数据,可以在区块生成时查询其临近区块的信息,而不必实际生成这些区块。
在此阅读:基础结构(原文链接)
配置
资源系统
资源系统是一个非常强大的系统,你可以使用它定制属于你自己的建筑物、装饰风格,控制战利品的掉落、怪物的生成,以及建筑方块的选用等等。
在此阅读:资源系统(原文链接)
本帖说明
本帖完全译自原wiki,全文字数6000+
基础结构 描述了详细的描述了加载了本模组之后,世界是根据哪些规则如何一步一步生成的
配置 则应是本模组配置文件部分的内容,它并没有在Wiki中体现,后面楼主会继续完成本模组配置相关的教程,敬请期待
资源系统 是本模组的一大特色,它通过给指定的json文件添加规定的“条件(Conditions)”来高度自定义模组生成的“结构”,wiki中只提到了其中一部分基础内容,楼主在后面的教程中会进一步对其深入讨论
希望本译文能对你有所帮助,楼主能力有限,其中如有翻译不当之处,敬请谅解和指出!
失落的城市
失落的城市是一个关于世界生成的模组。
内容
1 导言
2 基础结构
3 配置
4 资源系统
导言
模组有两个主要功能:
● 添加了一个新的世界类型,您可以用本模组生成新的主世界。
● 添加了一个新维度(默认 ID 111),您可以从正常的主世界(或者是一个失落的城市世界)到达这个维度。
它在世界中生成了一座废弃的城市,这里展示了游戏截图:
链接
基础结构
本页面主要介绍本模组的内部结构及其配置。在这一部分中解释了本模组的基础运行原理。
你将发现在这个世界上生成的大楼、桥梁、地铁系统和其他结构实际上并不是“结构”,而是通过真正的世界因子生成的自然产物。这意味着它们在区块生成的早期阶段就已经生成了。这使得模组的世界生成器运行得非常高效,并且可以让生成物很好的融入周围的世界。
需要注意的是,本模组不依赖于区块生成的任何特定方向。当一个区块生成时,它并不依赖于临近的已生成区块,因此它必须通过本身计算生成。不过,本模组维持着一些世界范围内的结构数据,可以在区块生成时查询其临近区块的信息,而不必实际生成这些区块。
在此阅读:基础结构(原文链接)
配置
资源系统
资源系统是一个非常强大的系统,你可以使用它定制属于你自己的建筑物、装饰风格,控制战利品的掉落、怪物的生成,以及建筑方块的选用等等。
在此阅读:资源系统(原文链接)
本帖说明
本帖完全译自原wiki,全文字数6000+
基础结构 描述了详细的描述了加载了本模组之后,世界是根据哪些规则如何一步一步生成的
配置 则应是本模组配置文件部分的内容,它并没有在Wiki中体现,后面楼主会继续完成本模组配置相关的教程,敬请期待
资源系统 是本模组的一大特色,它通过给指定的json文件添加规定的“条件(Conditions)”来高度自定义模组生成的“结构”,wiki中只提到了其中一部分基础内容,楼主在后面的教程中会进一步对其深入讨论
希望本译文能对你有所帮助,楼主能力有限,其中如有翻译不当之处,敬请谅解和指出!
基础结构
内容
1 基础结构
1.1 高度
1.2 区块
1.3 生成一般区块
1.4 生成街道区块
1.5 生成大楼区块
1.6 高速公路
1.7 地铁
基础结构
高度
城市生成器以6的倍数来确定各种建筑物的高度。大楼的每层都是6格高,并且地铁和高速公路也是这个高度的倍数。这样会使得临近大楼的关联变得更加简单,并且可以使街道更好的与高速公路和地铁站融为一体。大楼总是在城市的0~4级别的高度上生成,而地铁系统生成在-3级别的高度上,默认情况下,高度级别0对应世界高度71。
区块
从生成算法上来看,在区块生成的过程中会生成三种类型的区块:
● 一个普通区块:这会给予你一个普通的世界生成因子(来自原版),然而即使是普通区块,也会发生一些改变:
○ 地铁和高速公路生成叠加在普通区块上
○ 城市区块发生的爆炸也会影响到其相邻普通区块的世界生成因子
○ 为了更好的与城市区块融为一体,普通区块的边缘有时会降低或抬升
● 一个包含大楼的城市区块。
● 一个不包含大楼的城市区块。它被称之为“街道”区块
生成一个普通区块
这里解释了创建一个普通区块的所有步骤:
● 首先常规区块生成器完成工作。这个工作生成了基础的景观外形(不包含树叶、泥土等等)
● 如果有必要的话,为了融入临近的城市区块,这个普通区块的边缘会被修饰平整。这意味着此区块的边缘将被降低或抬升
● 如果适合的话,将会在其中生成普通的桥梁
● 如果适合的话,将会在其中生成高速公路
● 如果适合的话,将会在其中生成地铁
● 如果该区块受到爆炸的影响,则会完成损毁部分的计算
● 如果该区块附近有一座被爆炸损毁的大楼,那么爆炸产生的碎片会散落在这个区块上
生成一个街道区块
当创建一个街道区块时,将完成以下步骤:
● 首先这个区块将被石头填充到当前的城市高度级别(6的倍数)
● 然后街道、公园、喷泉公园将被生成
● 如果需要的话会生成走廊(去往街道下方并且连接大楼地下部分的过道)
● 如果该区块与大楼相连接,它将可能生成一个“大楼装饰”部分
● “边界”被生成。这是一道你可以在城市边缘或街道边缘看见的石墙,它们比相邻的街道区块略高
● 如果启用了破坏生成器,此时将被应用
● 楼梯被生成
● 高速公路被生成
● 如果启用了“碎石(rubble)”,此时碎石层将被生成。这会添加一层石头(然后是泥土或者沙子)在街道上,也可以任意选择一层废弃方块
● 如果适合的话,地铁将被生成
● 如果适合的话,地铁附属的地牢将被生成
● 如果该区块受到爆炸的影响,则会完成损毁部分的计算
● 如果该区块附近有一座被爆炸损毁的大楼,那么爆炸产生的碎片会散落在这个区块上
生成一个大楼区块
当创建一个大楼区块时,将完成以下步骤:
● 首先这个区块将被石头填充到当前的城市高度级别(6的倍数)减去大楼最底层地下室的高度级别
● 然后大楼的每一层被生成
● 大楼的门口会连接大楼或街道。如果这个门口是通往外部的,则会生成真正的门,否则就会留空
● 大楼在地下部分的楼层外墙将被转换为“石头”方块(即 替换掉其中的玻璃方块)
● 如果这里有相邻的走廊则连接起来
● 如果启用了破坏生成器,此时将被应用
● 生成高速公路(即使这里有一栋大楼,高速公路也可以从这栋大楼地下的交通隧道穿过)
● 如果启用了“碎石(rubble)”,此时碎石层将被生成。这会添加一层石头(然后是泥土或者沙子)在街道上,也可以任意选择一层废弃方块
● 如果适合的话,地铁将被生成
● 如果适合的话,地铁附属的地牢将被生成
● 如果该区块受到爆炸的影响,则会完成损毁部分的计算
● 如果该区块附近有一座被爆炸损毁的大楼,那么爆炸产生的碎片会散落在这个区块上
高速公路
这里有两种高速公路:水平方向上的(沿着X轴线)和垂直方向上的(沿着Z轴线)。无论是这两个方向中的哪个,高速公路都只会生成在8的倍数的坐标上。这既是为了保证生成效率,也是为了避免生成的高速公路与其他的高速公路离得太近。
如果这里有一座高速公路(无论是沿哪个方向),那么模组是如何决定它生成在哪一个区块,然后又是如何决定这座高速公路的高度呢?下面是用来完成这项工作的步骤。这些说明适用于水平方向上的高速公路,但垂直方向上的高速公路也使用相同的算法:

● 首先检查该区块的坐标是否是8的倍数。如果不是的话,它不能包含一条高速公路(在该方向上)
● 在垂直方向上,采用一个二维柏林噪声函数对一个更大的范围进行采样(因此在其附近毗邻的其他高速公路可能会变得很少)。如果该噪声函数的值(考虑该区块的X、Z坐标)高于一个确定的阙值,那么这个区块将会成为一条高速公路的备选区块(此时仍未最终确定)。如不符合上述条件,该区块则不能包含一条高速公路。上面的图片展示了一个按比例缩放的柏林噪声函数看起来是什么样子的,以及我们在哪个位置找到足够暗度的区域(假设暗色区域的值更高)并给予其一条高速公路。
● 考虑到该区块对于一条高速公路来说仍然是一个备选区块,我们将扫描它左侧水平方向上的所有区块,并找到其中的起始区块(即 那个柏林噪声函数值仍然很高的区块)
● 然后我们做同样的事情在右侧找到最后一个符合条件的区块
● 现在这两个区块从理论上划定了这条高速公路的范围
● 根据配置文件的设置,我们现在检查城市是否在高速公路的两侧或者在至少一个城市的一侧。如果这里没有足够的城市,那么这条高速公路将被废弃,并且不会被生成
● 如果上述条件都是有效的,那么我们仍然要检查这条高速公路是否至少跨越5个区块。如果不是的话,我们也不会生成该高速公路
● 此时我们确定这里有一条高速公路。那么我们必须检查它到底有多高。根据配置文件,我们使用高速公路两侧或其中一侧城市(起点和终点区块)的高度来计算其最终高度
地铁
地铁建立在每10个区块出现一次的地铁站所组成的地铁网的基础之上。之所以选择10而不是8(像高速公路那样),是因为地铁所经过路径的距离不总是与高速公路相同。地铁比高速公路更加的有规律,并且它总是来自于一个像这样的遍及世界的交错纵横的地铁网:

每个红色的方形点都是地铁站的备选位置。只有当这个红点位置上有一个城市时,才会真正形成一个地铁站。如果上面没有城市的话,这个地铁站将被一段水平方向上的地铁路段取代,以便使地铁保持前后联通。一个地铁站在地铁网中可以被分配到一条、两条或三条轨道,它们都使用站点资源中相同的部分。未被使用的轨道将(在运行时)被地铁建筑方块取代。
注意,这里有一个选项可供封闭截断及移除附近没有地铁站的地铁路段。这被应用于“稀有的城市(rarecities)”配置文件中。对于这个选项的启用,通过上方图片中的网格可以看出将被截断及移除的部分。
整个地铁网都位于-3的高度级别(记住,最低的大楼在城市的高度级别中是0级)。地铁站既可以同样位于-3高度级别的地下,也可以在地表(位于城市所在的高度级别)。只有在城市不是特别高的情况下,才有可能在地表生成一个地铁站,因为地铁站需要从地表下行到-3高度级别,但每经过一个区块我们只能下行两个高度级别。
组成地铁系统的每一个区块都是建立在关键地铁站区块的基础之上。所有地铁区块的生成基础都是离它们最近的那个区块。举个例子,如果一个地铁站有三条轨道,那么其毗邻的水平区块也将有三条轨道。如果一个地铁站区块位于0高度级别,那么其毗邻的首个区块将把轨道降低一个高度级别,并下一个区块将把轨道降低两个高度级别,这样地铁轨道最后又重新回到-3高度级别。
资源系统
内容
1 资源系统
1.1 导言
1.2 条件
1.2.1 条件支持的项目
1.3 城市样式
1.4 世界样式
1.5 预设城市或城市球
2 资源加载
资源系统
导言
支持下列资源:
● 条件(Condition):一个条件基本上就是一条你可以在各种各样标准的基础上进行选择的随机字符串值。条件当前的作用是用于控制一个怪物刷怪笼拥有的怪物类型和箱子的战利品表。
● 世界样式(Worldstyle):根据世界样式,城市样式是在生物群系的基础上选定的。
● 城市样式(Citystyle):一种城市样式代表了一座城市是怎样被生成的。它控制着大楼、喷泉、公园、楼梯,以及街道的宽度、大楼高度和深度的限制,还有被用于世界生成器的各式各样的方块。城市样式也控制着调色板样式。
● 样式(Style):这是调色板的样式。它主要用于结合各式各样的色调,并且也有随机调色的能力使得不同的区块(共享相同样式的)无论如何看起来都是不同的。
● 调色板(Palette):一个调色板是用于描述一个部件(建筑结构中的)风格特征与真实世界中方块特征的映射。通过使用样式,让不同色调的联合变得可能。举个例子,在标准资源配置中,不仅城市大楼的砌砖有一个色调(被随机分配的那个),大楼上的玻璃也有一个独立于前者的色调,它们是被分开计算的。
● 部件(Part):每一个在世界中生成的建筑结构都是由一个或者多个部件构成的。对于大楼来说,每一个部件代表着一层楼(6格高),并且部件也被用于构成喷泉、地铁结构以及楼梯等等。部件可以被来自于调色板中的特性所定义,因此在生成建筑物期间被用到的建筑方块依赖于调色板,而该调色板的样式则是对建筑物所在区块生效的那个样式。
● 大楼(Building):一栋大楼是通过一个被选择的部件生成的。选择哪个部件取决于一组条件的设定。举个例子,一些部件可能只适合放在大楼的顶部(楼顶部件),那么它们就被限制只能生成在顶部的位置。你也拥有一些可以用于地下或者一楼的部件,以此类推。
● 复合大楼(Multibuilding):复合大楼是一座横跨多个区块的大楼。目前,复合大楼的实现被限制在2×2区块的范围内。复合大楼的每一个部分,就其本身而言被看作一栋大楼,但是使用复合大楼你可以确保这些被当作部件的大楼始终一起生成。
● 预定义城市(Predefined cities):预定义城市(和建筑物)对于想要在世界中特定位置生成特殊城市或建筑物的整合包制作者是非常有用的。如果你把这点与禁用城市在世界各地随机生成的功能结合起来,你可以确保你的世界只包含这一个城市,而不是更多。
条件
条件目前被用于刷怪笼怪物的选择和箱子战利品表的选择。另外,建筑物使用解析系统通过条件(但不是条件本身)来选择哪些部件被用于哪些楼层。这里是一个通过条件来指定战利品表的例子:
要使用上面这个条件,你需要在调色板里把它设定到一个箱子中。当生成器在调色板中遇到这样一个条件时,它将解析这个条件并据此返回对应结果。为了解析这样的一个条件,这里给出了一个上下文对象,该上下文对象包含正在生成区块或建筑物的信息。在上面的例子中,“chestloot(箱子战利品)”条件的第一小段告诉系统“lostcitychest(失落的城市箱子)”的战利品表被用于大楼的第4到第100楼层之间的战利品箱子生成,并且第二小段表示这也允许它们生成在低于-3的高度级别(在低层的地下室)。
第三和第四小段分别被用于表示“raildungeonchest(地铁轨道地牢箱子)”战利品箱子项目中的“rail_dungeon1(地铁轨道地牢1型)”和“rail_dungeon2(地铁轨道地牢2型)”部件对应的地铁轨道地牢战利品箱子。
剩下的各小段都是原版默认的战利品表。
在决定使用哪个战利品表的时候,系统将搜寻条件中有效的段落,然后在“factor(因子)”的数值的基础上随机选择其中一个。更高的因子数值意味着这个段落有更高的几率被选中(如果该条件为真)。
下面有一个类似的例子用来控制怪物刷怪笼:
条件支持的项目
● top(布尔值):位于一栋大楼的顶部时为真(顶部代表这个部件在大楼顶层的正上方)
● ground(布尔值):位于一栋大楼的地面高度级别时为真。这与城市里左上角的那栋大楼的高度级别级相关(关于假如这是一栋复合大楼,那么其中的有些区块可能位于城市高度级别不同的位置)
● range(字符串值):表示方法:“起始值,结束值”。如果当前的楼层介于这两个数值之间(含这两个数值本身),那么该条件为真。注意位于地面的这一层被计为0层。
● cellar(布尔值):如果楼层在地下,则为真
● floor(整数值):位于指定楼层时为真
● chunkx(整数值):位于一个特定X轴位置的区块时为真。如果你在某个特定地点上有一个预定义的建筑物,并且你想在里面设置非常精确的怪物刷怪笼或者战利品箱子,这将会非常有用
● chunkz(整数值):位于一个特定Z轴位置的区块时为真。
● inpart(字符串值):如果该刷怪笼或者箱子是给定“部件”的一部分,则为真
● isbuilding(布尔值):如果该刷怪笼或者箱子位于一栋大楼内,则为真
● inbuilding(字符串值):如果该刷怪笼或者箱子位于某栋特定的大楼内,则为真
● issphere(布尔值):如果该刷怪笼或者箱子位于一个城市球体内,则为真
● inbiome(字符串值):如果该刷怪笼或者箱子位于某个生物群系中,则为真
城市样式
下面是一个城市样式的示例:
注意这里的“citystyle_config”。城市样式可以从其他的城市样式继承。在这种情况下,这里有一个非常简单的“citystyle_config”,其中只配置了道路的宽度:
当你想要改变道路宽度时,你只需要修改此项资源,其他的城市样式都将自动应用它。
世界样式
下面是一个世界样式的示例,其中有一个不太一样的城市样式是在一些生物群系的基础上选择的:
预设城市或城市球
下面是一座预设城市的示例,其中有一栋复合大楼在该城市的中心:
把以上资源段落添加到资源系统中,将确保区块坐标(100,100)的位置上生成一座半径为200方块长的城市(将区块坐标乘以16换算为实际方块坐标)。它也将放置一栋复合大楼(名字叫“center”)在区块坐标(0,0)的位置上(这个坐标是根据城市中心区块坐标而确定的相对坐标)。你也可以使用“building”关键字取代“multibuilding”来放置一栋普通大楼。
在支持城市球的景观类型中,你也可以对城市球进行预设(并且可以选择关闭随机城市球的生成)。下面是预设城市球的代码段落:
资源加载
如果你查看名为“general.cfg”的配置文件,你可以在其中看到以下条目:
# List of asset libraries loaded in the specified order. If the path starts with '/' it is going to be loaded directly from the classpath. If the path starts with '$' it is loaded from the config directory [default: [/assets/lostcities/citydata/conditions.json], [/assets/lostcities/citydata/palette.json], [/assets/lostcities/citydata/palette_desert.json], [/assets/lostcities/citydata/palette_chisel.json], [/assets/lostcities/citydata/palette_chisel_desert.json], [/assets/lostcities/citydata/highwayparts.json], [/assets/lostcities/citydata/railparts.json], [/assets/lostcities/citydata/buildingparts.json], [/assets/lostcities/citydata/library.json], [$lostcities/userassets.json]]
S:assets <
/assets/lostcities/citydata/conditions.json
/assets/lostcities/citydata/palette.json
/assets/lostcities/citydata/palette_desert.json
/assets/lostcities/citydata/palette_chisel.json
/assets/lostcities/citydata/palette_chisel_desert.json
/assets/lostcities/citydata/highwayparts.json
/assets/lostcities/citydata/railparts.json
/assets/lostcities/citydata/buildingparts.json
/assets/lostcities/citydata/library.json
$lostcities/userassets.json
>
资源的加载是按照配置文件中指定的顺序进行的。这里有两条重要的规则,它们可以让你用自定义的资源覆盖掉模组內建的资源:
● 如果一个资源与预先加载的另一个资源拥有相同的类型和名称,那么最后加载的那个资源将被应用。即 如果你把叫作“building1”的aa大楼放入“userassets.json”资源文件中(因为“userassets.json”会被最后加载),那么它将取代先前已经加载的“building1”(在內建资源文件“buildingparts.json”中的那个)。
● 即使更早被加载的资源里引用到了这个资源,这也是可以的!举个例子,假如你用“userassets.json”资源文件中的“building1”替代了內建的“building1”,并且“building1”被用在了加载得更早的城市样式资源中,此时你的替换仍然会被应用。这是因为城市样式并不以大楼本身的资源参数作为参考,而是仅仅取用了该大楼的名称。因此,当你在后面用另一个“building1”替换早先加载的“building1”时,它也会被同样应用到城市样式中。
上面的规则使得(比如)更改箱子战利品规则变得非常简单,因为你可以直接在“userassets.json”中创建一个新的“chestloot(箱子战利品)”条件来替换现在已有的“chestloot”条件。
失落的城市
失落的城市是一个关于世界生成的模组。
内容
导言
模组有两个主要功能:
● 添加了一个新的世界类型,您可以用本模组生成新的主世界。
● 添加了一个新维度(默认 ID 111),您可以从正常的主世界(或者是一个失落的城市世界)到达这个维度。
它在世界中生成了一座废弃的城市,这里展示了游戏截图:
链接
基础结构
本页面主要介绍本模组的内部结构及其配置。在这一部分中解释了本模组的基础运行原理。
你将发现在这个世界上生成的大楼、桥梁、地铁系统和其他结构实际上并不是“结构”,而是通过真正的世界因子生成的自然产物。这意味着它们在区块生成的早期阶段就已经生成了。这使得模组的世界生成器运行得非常高效,并且可以让生成物很好的融入周围的世界。
需要注意的是,本模组不依赖于区块生成的任何特定方向。当一个区块生成时,它并不依赖于临近的已生成区块,因此它必须通过本身计算生成。不过,本模组维持着一些世界范围内的结构数据,可以在区块生成时查询其临近区块的信息,而不必实际生成这些区块。
在此阅读:基础结构(原文链接)
配置
资源系统
资源系统是一个非常强大的系统,你可以使用它定制属于你自己的建筑物、装饰风格,控制战利品的掉落、怪物的生成,以及建筑方块的选用等等。
在此阅读:资源系统(原文链接)
本帖说明
本帖完全译自原wiki,全文字数6000+
基础结构 描述了详细的描述了加载了本模组之后,世界是根据哪些规则如何一步一步生成的
配置 则应是本模组配置文件部分的内容,它并没有在Wiki中体现,后面楼主会继续完成本模组配置相关的教程,敬请期待
资源系统 是本模组的一大特色,它通过给指定的json文件添加规定的“条件(Conditions)”来高度自定义模组生成的“结构”,wiki中只提到了其中一部分基础内容,楼主在后面的教程中会进一步对其深入讨论
希望本译文能对你有所帮助,楼主能力有限,其中如有翻译不当之处,敬请谅解和指出!
2021.12 数据,可能有更多内容
失落的城市
失落的城市是一个关于世界生成的模组。
内容
1 导言
2 基础结构
3 配置
4 资源系统
导言
模组有两个主要功能:
● 添加了一个新的世界类型,您可以用本模组生成新的主世界。
● 添加了一个新维度(默认 ID 111),您可以从正常的主世界(或者是一个失落的城市世界)到达这个维度。
它在世界中生成了一座废弃的城市,这里展示了游戏截图:
链接
基础结构
本页面主要介绍本模组的内部结构及其配置。在这一部分中解释了本模组的基础运行原理。
你将发现在这个世界上生成的大楼、桥梁、地铁系统和其他结构实际上并不是“结构”,而是通过真正的世界因子生成的自然产物。这意味着它们在区块生成的早期阶段就已经生成了。这使得模组的世界生成器运行得非常高效,并且可以让生成物很好的融入周围的世界。
需要注意的是,本模组不依赖于区块生成的任何特定方向。当一个区块生成时,它并不依赖于临近的已生成区块,因此它必须通过本身计算生成。不过,本模组维持着一些世界范围内的结构数据,可以在区块生成时查询其临近区块的信息,而不必实际生成这些区块。
在此阅读:基础结构(原文链接)
配置
资源系统
资源系统是一个非常强大的系统,你可以使用它定制属于你自己的建筑物、装饰风格,控制战利品的掉落、怪物的生成,以及建筑方块的选用等等。
在此阅读:资源系统(原文链接)
本帖说明
本帖完全译自原wiki,全文字数6000+
基础结构 描述了详细的描述了加载了本模组之后,世界是根据哪些规则如何一步一步生成的
配置 则应是本模组配置文件部分的内容,它并没有在Wiki中体现,后面楼主会继续完成本模组配置相关的教程,敬请期待
资源系统 是本模组的一大特色,它通过给指定的json文件添加规定的“条件(Conditions)”来高度自定义模组生成的“结构”,wiki中只提到了其中一部分基础内容,楼主在后面的教程中会进一步对其深入讨论
希望本译文能对你有所帮助,楼主能力有限,其中如有翻译不当之处,敬请谅解和指出!
基础结构
内容
1 基础结构
1.1 高度
1.2 区块
1.3 生成一般区块
1.4 生成街道区块
1.5 生成大楼区块
1.6 高速公路
1.7 地铁
基础结构
高度
城市生成器以6的倍数来确定各种建筑物的高度。大楼的每层都是6格高,并且地铁和高速公路也是这个高度的倍数。这样会使得临近大楼的关联变得更加简单,并且可以使街道更好的与高速公路和地铁站融为一体。大楼总是在城市的0~4级别的高度上生成,而地铁系统生成在-3级别的高度上,默认情况下,高度级别0对应世界高度71。
区块
从生成算法上来看,在区块生成的过程中会生成三种类型的区块:
● 一个普通区块:这会给予你一个普通的世界生成因子(来自原版),然而即使是普通区块,也会发生一些改变:
○ 地铁和高速公路生成叠加在普通区块上
○ 城市区块发生的爆炸也会影响到其相邻普通区块的世界生成因子
○ 为了更好的与城市区块融为一体,普通区块的边缘有时会降低或抬升
● 一个包含大楼的城市区块。
● 一个不包含大楼的城市区块。它被称之为“街道”区块
生成一个普通区块
这里解释了创建一个普通区块的所有步骤:
● 首先常规区块生成器完成工作。这个工作生成了基础的景观外形(不包含树叶、泥土等等)
● 如果有必要的话,为了融入临近的城市区块,这个普通区块的边缘会被修饰平整。这意味着此区块的边缘将被降低或抬升
● 如果适合的话,将会在其中生成普通的桥梁
● 如果适合的话,将会在其中生成高速公路
● 如果适合的话,将会在其中生成地铁
● 如果该区块受到爆炸的影响,则会完成损毁部分的计算
● 如果该区块附近有一座被爆炸损毁的大楼,那么爆炸产生的碎片会散落在这个区块上
生成一个街道区块
当创建一个街道区块时,将完成以下步骤:
● 首先这个区块将被石头填充到当前的城市高度级别(6的倍数)
● 然后街道、公园、喷泉公园将被生成
● 如果需要的话会生成走廊(去往街道下方并且连接大楼地下部分的过道)
● 如果该区块与大楼相连接,它将可能生成一个“大楼装饰”部分
● “边界”被生成。这是一道你可以在城市边缘或街道边缘看见的石墙,它们比相邻的街道区块略高
● 如果启用了破坏生成器,此时将被应用
● 楼梯被生成
● 高速公路被生成
● 如果启用了“碎石(rubble)”,此时碎石层将被生成。这会添加一层石头(然后是泥土或者沙子)在街道上,也可以任意选择一层废弃方块
● 如果适合的话,地铁将被生成
● 如果适合的话,地铁附属的地牢将被生成
● 如果该区块受到爆炸的影响,则会完成损毁部分的计算
● 如果该区块附近有一座被爆炸损毁的大楼,那么爆炸产生的碎片会散落在这个区块上
生成一个大楼区块
当创建一个大楼区块时,将完成以下步骤:
● 首先这个区块将被石头填充到当前的城市高度级别(6的倍数)减去大楼最底层地下室的高度级别
● 然后大楼的每一层被生成
● 大楼的门口会连接大楼或街道。如果这个门口是通往外部的,则会生成真正的门,否则就会留空
● 大楼在地下部分的楼层外墙将被转换为“石头”方块(即 替换掉其中的玻璃方块)
● 如果这里有相邻的走廊则连接起来
● 如果启用了破坏生成器,此时将被应用
● 生成高速公路(即使这里有一栋大楼,高速公路也可以从这栋大楼地下的交通隧道穿过)
● 如果启用了“碎石(rubble)”,此时碎石层将被生成。这会添加一层石头(然后是泥土或者沙子)在街道上,也可以任意选择一层废弃方块
● 如果适合的话,地铁将被生成
● 如果适合的话,地铁附属的地牢将被生成
● 如果该区块受到爆炸的影响,则会完成损毁部分的计算
● 如果该区块附近有一座被爆炸损毁的大楼,那么爆炸产生的碎片会散落在这个区块上
高速公路
这里有两种高速公路:水平方向上的(沿着X轴线)和垂直方向上的(沿着Z轴线)。无论是这两个方向中的哪个,高速公路都只会生成在8的倍数的坐标上。这既是为了保证生成效率,也是为了避免生成的高速公路与其他的高速公路离得太近。
如果这里有一座高速公路(无论是沿哪个方向),那么模组是如何决定它生成在哪一个区块,然后又是如何决定这座高速公路的高度呢?下面是用来完成这项工作的步骤。这些说明适用于水平方向上的高速公路,但垂直方向上的高速公路也使用相同的算法:

● 首先检查该区块的坐标是否是8的倍数。如果不是的话,它不能包含一条高速公路(在该方向上)
● 在垂直方向上,采用一个二维柏林噪声函数对一个更大的范围进行采样(因此在其附近毗邻的其他高速公路可能会变得很少)。如果该噪声函数的值(考虑该区块的X、Z坐标)高于一个确定的阙值,那么这个区块将会成为一条高速公路的备选区块(此时仍未最终确定)。如不符合上述条件,该区块则不能包含一条高速公路。上面的图片展示了一个按比例缩放的柏林噪声函数看起来是什么样子的,以及我们在哪个位置找到足够暗度的区域(假设暗色区域的值更高)并给予其一条高速公路。
● 考虑到该区块对于一条高速公路来说仍然是一个备选区块,我们将扫描它左侧水平方向上的所有区块,并找到其中的起始区块(即 那个柏林噪声函数值仍然很高的区块)
● 然后我们做同样的事情在右侧找到最后一个符合条件的区块
● 现在这两个区块从理论上划定了这条高速公路的范围
● 根据配置文件的设置,我们现在检查城市是否在高速公路的两侧或者在至少一个城市的一侧。如果这里没有足够的城市,那么这条高速公路将被废弃,并且不会被生成
● 如果上述条件都是有效的,那么我们仍然要检查这条高速公路是否至少跨越5个区块。如果不是的话,我们也不会生成该高速公路
● 此时我们确定这里有一条高速公路。那么我们必须检查它到底有多高。根据配置文件,我们使用高速公路两侧或其中一侧城市(起点和终点区块)的高度来计算其最终高度
地铁
地铁建立在每10个区块出现一次的地铁站所组成的地铁网的基础之上。之所以选择10而不是8(像高速公路那样),是因为地铁所经过路径的距离不总是与高速公路相同。地铁比高速公路更加的有规律,并且它总是来自于一个像这样的遍及世界的交错纵横的地铁网:

每个红色的方形点都是地铁站的备选位置。只有当这个红点位置上有一个城市时,才会真正形成一个地铁站。如果上面没有城市的话,这个地铁站将被一段水平方向上的地铁路段取代,以便使地铁保持前后联通。一个地铁站在地铁网中可以被分配到一条、两条或三条轨道,它们都使用站点资源中相同的部分。未被使用的轨道将(在运行时)被地铁建筑方块取代。
注意,这里有一个选项可供封闭截断及移除附近没有地铁站的地铁路段。这被应用于“稀有的城市(rarecities)”配置文件中。对于这个选项的启用,通过上方图片中的网格可以看出将被截断及移除的部分。
整个地铁网都位于-3的高度级别(记住,最低的大楼在城市的高度级别中是0级)。地铁站既可以同样位于-3高度级别的地下,也可以在地表(位于城市所在的高度级别)。只有在城市不是特别高的情况下,才有可能在地表生成一个地铁站,因为地铁站需要从地表下行到-3高度级别,但每经过一个区块我们只能下行两个高度级别。
组成地铁系统的每一个区块都是建立在关键地铁站区块的基础之上。所有地铁区块的生成基础都是离它们最近的那个区块。举个例子,如果一个地铁站有三条轨道,那么其毗邻的水平区块也将有三条轨道。如果一个地铁站区块位于0高度级别,那么其毗邻的首个区块将把轨道降低一个高度级别,并下一个区块将把轨道降低两个高度级别,这样地铁轨道最后又重新回到-3高度级别。
资源系统
内容
1 资源系统
1.1 导言
1.2 条件
1.2.1 条件支持的项目
1.3 城市样式
1.4 世界样式
1.5 预设城市或城市球
2 资源加载
资源系统
导言
支持下列资源:
● 条件(Condition):一个条件基本上就是一条你可以在各种各样标准的基础上进行选择的随机字符串值。条件当前的作用是用于控制一个怪物刷怪笼拥有的怪物类型和箱子的战利品表。
● 世界样式(Worldstyle):根据世界样式,城市样式是在生物群系的基础上选定的。
● 城市样式(Citystyle):一种城市样式代表了一座城市是怎样被生成的。它控制着大楼、喷泉、公园、楼梯,以及街道的宽度、大楼高度和深度的限制,还有被用于世界生成器的各式各样的方块。城市样式也控制着调色板样式。
● 样式(Style):这是调色板的样式。它主要用于结合各式各样的色调,并且也有随机调色的能力使得不同的区块(共享相同样式的)无论如何看起来都是不同的。
● 调色板(Palette):一个调色板是用于描述一个部件(建筑结构中的)风格特征与真实世界中方块特征的映射。通过使用样式,让不同色调的联合变得可能。举个例子,在标准资源配置中,不仅城市大楼的砌砖有一个色调(被随机分配的那个),大楼上的玻璃也有一个独立于前者的色调,它们是被分开计算的。
● 部件(Part):每一个在世界中生成的建筑结构都是由一个或者多个部件构成的。对于大楼来说,每一个部件代表着一层楼(6格高),并且部件也被用于构成喷泉、地铁结构以及楼梯等等。部件可以被来自于调色板中的特性所定义,因此在生成建筑物期间被用到的建筑方块依赖于调色板,而该调色板的样式则是对建筑物所在区块生效的那个样式。
● 大楼(Building):一栋大楼是通过一个被选择的部件生成的。选择哪个部件取决于一组条件的设定。举个例子,一些部件可能只适合放在大楼的顶部(楼顶部件),那么它们就被限制只能生成在顶部的位置。你也拥有一些可以用于地下或者一楼的部件,以此类推。
● 复合大楼(Multibuilding):复合大楼是一座横跨多个区块的大楼。目前,复合大楼的实现被限制在2×2区块的范围内。复合大楼的每一个部分,就其本身而言被看作一栋大楼,但是使用复合大楼你可以确保这些被当作部件的大楼始终一起生成。
● 预定义城市(Predefined cities):预定义城市(和建筑物)对于想要在世界中特定位置生成特殊城市或建筑物的整合包制作者是非常有用的。如果你把这点与禁用城市在世界各地随机生成的功能结合起来,你可以确保你的世界只包含这一个城市,而不是更多。
条件
条件目前被用于刷怪笼怪物的选择和箱子战利品表的选择。另外,建筑物使用解析系统通过条件(但不是条件本身)来选择哪些部件被用于哪些楼层。这里是一个通过条件来指定战利品表的例子:
代码:
- [
 
- {
 
-     "type": "condition",
 
-     "name": "chestloot",
 
-     "values": [
 
-     {
 
-    "factor": 8,
 
-    "value": "lostcities:chests/lostcitychest",
 
-    "range": "4,100"
 
-     },
 
-     {
 
-    "factor": 8,
 
-    "value": "lostcities:chests/lostcitychest",
 
-    "range": "-100,-3"
 
-     },
 
-     {
 
-    "factor": 20,
 
-    "value": "lostcities:chests/raildungeonchest",
 
-    "inpart": "rail_dungeon1"
 
-     },
 
-     {
 
-    "factor": 20,
 
-    "value": "lostcities:chests/raildungeonchest",
 
-    "inpart": "rail_dungeon2"
 
-     },
 
-     {
 
-    "factor": 2,
 
-    "value": "minecraft:chests/nether_bridge"
 
-     },
 
-     {
 
-    "factor": 2,
 
-    "value": "minecraft:chests/abandoned_mineshaft"
 
-     },
 
-     {
 
-    "factor": 2,
 
-    "value": "minecraft:chests/village_blacksmith"
 
-     },
 
-     {
 
-    "factor": 2,
 
-    "value": "minecraft:chests/desert_pyramid"
 
-     },
 
-     {
 
-    "factor": 2,
 
-    "value": "minecraft:chests/jungle_temple"
 
-     },
 
-     {
 
-    "factor": 20,
 
-    "value": "minecraft:chests/simple_dungeon"
 
-     }
 
-     ]
 
- }
 
- ]
要使用上面这个条件,你需要在调色板里把它设定到一个箱子中。当生成器在调色板中遇到这样一个条件时,它将解析这个条件并据此返回对应结果。为了解析这样的一个条件,这里给出了一个上下文对象,该上下文对象包含正在生成区块或建筑物的信息。在上面的例子中,“chestloot(箱子战利品)”条件的第一小段告诉系统“lostcitychest(失落的城市箱子)”的战利品表被用于大楼的第4到第100楼层之间的战利品箱子生成,并且第二小段表示这也允许它们生成在低于-3的高度级别(在低层的地下室)。
第三和第四小段分别被用于表示“raildungeonchest(地铁轨道地牢箱子)”战利品箱子项目中的“rail_dungeon1(地铁轨道地牢1型)”和“rail_dungeon2(地铁轨道地牢2型)”部件对应的地铁轨道地牢战利品箱子。
剩下的各小段都是原版默认的战利品表。
在决定使用哪个战利品表的时候,系统将搜寻条件中有效的段落,然后在“factor(因子)”的数值的基础上随机选择其中一个。更高的因子数值意味着这个段落有更高的几率被选中(如果该条件为真)。
下面有一个类似的例子用来控制怪物刷怪笼:
代码:
- [
 
- {
 
-     "type": "condition",
 
-     "name": "easymobs",
 
-     "values": [
 
-     {
 
-    "factor": 1,
 
-    "value": "Zombie"
 
-     },
 
-     {
 
-    "factor": 1,
 
-    "value": "Skeleton"
 
-     },
 
-     {
 
-    "factor": 1,
 
-    "value": "Spider"
 
-     }
 
-     ]
 
- }
 
- ]
条件支持的项目
● top(布尔值):位于一栋大楼的顶部时为真(顶部代表这个部件在大楼顶层的正上方)
● ground(布尔值):位于一栋大楼的地面高度级别时为真。这与城市里左上角的那栋大楼的高度级别级相关(关于假如这是一栋复合大楼,那么其中的有些区块可能位于城市高度级别不同的位置)
● range(字符串值):表示方法:“起始值,结束值”。如果当前的楼层介于这两个数值之间(含这两个数值本身),那么该条件为真。注意位于地面的这一层被计为0层。
● cellar(布尔值):如果楼层在地下,则为真
● floor(整数值):位于指定楼层时为真
● chunkx(整数值):位于一个特定X轴位置的区块时为真。如果你在某个特定地点上有一个预定义的建筑物,并且你想在里面设置非常精确的怪物刷怪笼或者战利品箱子,这将会非常有用
● chunkz(整数值):位于一个特定Z轴位置的区块时为真。
● inpart(字符串值):如果该刷怪笼或者箱子是给定“部件”的一部分,则为真
● isbuilding(布尔值):如果该刷怪笼或者箱子位于一栋大楼内,则为真
● inbuilding(字符串值):如果该刷怪笼或者箱子位于某栋特定的大楼内,则为真
● issphere(布尔值):如果该刷怪笼或者箱子位于一个城市球体内,则为真
● inbiome(字符串值):如果该刷怪笼或者箱子位于某个生物群系中,则为真
城市样式
下面是一个城市样式的示例:
代码:
- {
 
-     "type": "citystyle",
 
-     "name": "citystyle_common",
 
-     "inherit": "citystyle_config",
 
-     "streetblocks": {
 
-     "border": "y",
 
-     "wall": "w",
 
-     "street": "S",
 
-     "streetbase": "b",
 
-     "streetvariant": "B"
 
-     },
 
-     "parkblocks": {
 
-     "elevation": "x"
 
-     },
 
-     "corridorblocks": {
 
-     "roof": "x",
 
-     "glass": "+"
 
-     },
 
-     "railblocks": {
 
-     "railmain": "y"
 
-     },
 
-     "buildings": [
 
-     {
 
-    "factor": 0.4,
 
-    "building": "building1"
 
-     },
 
-     {
 
-    "factor": 0.4,
 
-    "building": "building2"
 
-     },
 
-     {
 
-    "factor": 0.2,
 
-    "building": "building3"
 
-     },
 
-     {
 
-    "factor": 0.2,
 
-    "building": "building4"
 
-     },
 
-     {
 
-    "factor": 0.3,
 
-    "building": "building5"
 
-     }
 
-     ],
 
- ...
注意这里的“citystyle_config”。城市样式可以从其他的城市样式继承。在这种情况下,这里有一个非常简单的“citystyle_config”,其中只配置了道路的宽度:
代码:
- {
 
-     "type": "citystyle",
 
-     "name": "citystyle_config",
 
-     "streetblocks": {
 
-     "width": 8
 
-     }
 
- }
当你想要改变道路宽度时,你只需要修改此项资源,其他的城市样式都将自动应用它。
世界样式
下面是一个世界样式的示例,其中有一个不太一样的城市样式是在一些生物群系的基础上选择的:
代码:
- {
 
-     "type": "worldstyle",
 
-     "name": "standard",
 
-     "outsidestyle": "outside",
 
-     "citystyles": [
 
-     {
 
-    "factor": 0.5,
 
-    "citystyle": "citystyle_standard"
 
-     },
 
-     {
 
-    "factor": 9.0,
 
-    "biomes": [
 
-       "desert",
 
-       "desert_hills",
 
-       "mesa",
 
-       "mesa_rock",
 
-       "mesa_clear_rock"
 
-    ],
 
-    "citystyle": "citystyle_desert"
 
-     }
 
-     ]
 
- }
预设城市或城市球
下面是一座预设城市的示例,其中有一栋复合大楼在该城市的中心:
代码:
- {
 
-     "type": "city",
 
-     "name": "Big City",
 
-     "dimension": 0,
 
-     "chunkx": 100,
 
-     "chunkz": 100,
 
-     "radius": 200,
 
-     "buildings": [
 
-     {
 
-    "multibuilding": "center",
 
-    "chunkx": 0,
 
-    "chunkz": 0
 
-     }
 
-     ]
 
- }
把以上资源段落添加到资源系统中,将确保区块坐标(100,100)的位置上生成一座半径为200方块长的城市(将区块坐标乘以16换算为实际方块坐标)。它也将放置一栋复合大楼(名字叫“center”)在区块坐标(0,0)的位置上(这个坐标是根据城市中心区块坐标而确定的相对坐标)。你也可以使用“building”关键字取代“multibuilding”来放置一栋普通大楼。
在支持城市球的景观类型中,你也可以对城市球进行预设(并且可以选择关闭随机城市球的生成)。下面是预设城市球的代码段落:
代码:
- {
 
-     "type": "sphere",
 
-     "name": "Big Spheres",
 
-     "dimension": 0,
 
-     "chunkx": 100,
 
-     "chunkz": 100,
 
-     "centerx": 1608,
 
-     "centerz": 1608,
 
-     "radius": 200,
 
-     "biome": "jungle"
 
- }
资源加载
如果你查看名为“general.cfg”的配置文件,你可以在其中看到以下条目:
# List of asset libraries loaded in the specified order. If the path starts with '/' it is going to be loaded directly from the classpath. If the path starts with '$' it is loaded from the config directory [default: [/assets/lostcities/citydata/conditions.json], [/assets/lostcities/citydata/palette.json], [/assets/lostcities/citydata/palette_desert.json], [/assets/lostcities/citydata/palette_chisel.json], [/assets/lostcities/citydata/palette_chisel_desert.json], [/assets/lostcities/citydata/highwayparts.json], [/assets/lostcities/citydata/railparts.json], [/assets/lostcities/citydata/buildingparts.json], [/assets/lostcities/citydata/library.json], [$lostcities/userassets.json]]
S:assets <
/assets/lostcities/citydata/conditions.json
/assets/lostcities/citydata/palette.json
/assets/lostcities/citydata/palette_desert.json
/assets/lostcities/citydata/palette_chisel.json
/assets/lostcities/citydata/palette_chisel_desert.json
/assets/lostcities/citydata/highwayparts.json
/assets/lostcities/citydata/railparts.json
/assets/lostcities/citydata/buildingparts.json
/assets/lostcities/citydata/library.json
$lostcities/userassets.json
>
资源的加载是按照配置文件中指定的顺序进行的。这里有两条重要的规则,它们可以让你用自定义的资源覆盖掉模组內建的资源:
● 如果一个资源与预先加载的另一个资源拥有相同的类型和名称,那么最后加载的那个资源将被应用。即 如果你把叫作“building1”的aa大楼放入“userassets.json”资源文件中(因为“userassets.json”会被最后加载),那么它将取代先前已经加载的“building1”(在內建资源文件“buildingparts.json”中的那个)。
● 即使更早被加载的资源里引用到了这个资源,这也是可以的!举个例子,假如你用“userassets.json”资源文件中的“building1”替代了內建的“building1”,并且“building1”被用在了加载得更早的城市样式资源中,此时你的替换仍然会被应用。这是因为城市样式并不以大楼本身的资源参数作为参考,而是仅仅取用了该大楼的名称。因此,当你在后面用另一个“building1”替换早先加载的“building1”时,它也会被同样应用到城市样式中。
上面的规则使得(比如)更改箱子战利品规则变得非常简单,因为你可以直接在“userassets.json”中创建一个新的“chestloot(箱子战利品)”条件来替换现在已有的“chestloot”条件。
谢谢大佬
懂66666666666
6666666的是的是啥事
这个需要搭建传送门。一个床下面放钻石块,床周围放头颅,点睡觉才能传送到城市世界
66666666666
谢谢,苦恼了好久了