Add decorative civilian buildings to random maps

Allows the random map generator to optionally place civilian buildings
around the map for extra decoration. Buildings are placed last with
lowest priority to avoid competing for play area and resources.

Depends on #21738
This commit is contained in:
Ashley Newson
2025-02-07 23:55:16 +00:00
committed by Gustas Kažukauskas
parent 1f65fd234b
commit cc632660eb
13 changed files with 569 additions and 0 deletions

View File

@@ -83,6 +83,8 @@ namespace OpenRA.Mods.Common.Traits
[FieldLoader.Require] [FieldLoader.Require]
public readonly int ResourceFeatureSize = default; public readonly int ResourceFeatureSize = default;
[FieldLoader.Require] [FieldLoader.Require]
public readonly int CivilianBuildingsFeatureSize = default;
[FieldLoader.Require]
public readonly int Water = default; public readonly int Water = default;
[FieldLoader.Require] [FieldLoader.Require]
public readonly int Mountains = default; public readonly int Mountains = default;
@@ -170,6 +172,12 @@ namespace OpenRA.Mods.Common.Traits
public readonly int MaximumBuildings = default; public readonly int MaximumBuildings = default;
[FieldLoader.LoadUsing(nameof(BuildingWeightsLoader))] [FieldLoader.LoadUsing(nameof(BuildingWeightsLoader))]
public readonly IReadOnlyDictionary<string, int> BuildingWeights = default; public readonly IReadOnlyDictionary<string, int> BuildingWeights = default;
[FieldLoader.Require]
public readonly int CivilianBuildings = default;
[FieldLoader.Require]
public readonly int MinimumCivilianBuildingDensity = default;
[FieldLoader.Require]
public readonly int CivilianBuildingDensityRadius = default;
[FieldLoader.Require] [FieldLoader.Require]
public readonly ushort LandTile = default; public readonly ushort LandTile = default;
@@ -180,6 +188,8 @@ namespace OpenRA.Mods.Common.Traits
[FieldLoader.Ignore] [FieldLoader.Ignore]
public readonly IReadOnlyList<MultiBrush> UnplayableObstacles; public readonly IReadOnlyList<MultiBrush> UnplayableObstacles;
[FieldLoader.Ignore] [FieldLoader.Ignore]
public readonly IReadOnlyList<MultiBrush> CivilianBuildingsObstacles;
[FieldLoader.Ignore]
public readonly IReadOnlyDictionary<ushort, IReadOnlyList<MultiBrush>> RepaintTiles; public readonly IReadOnlyDictionary<ushort, IReadOnlyList<MultiBrush>> RepaintTiles;
[FieldLoader.Ignore] [FieldLoader.Ignore]
@@ -230,6 +240,7 @@ namespace OpenRA.Mods.Common.Traits
TemplatedTerrainInfo = Map.Rules.TerrainInfo as ITemplatedTerrainInfo; TemplatedTerrainInfo = Map.Rules.TerrainInfo as ITemplatedTerrainInfo;
ForestObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("ForestObstacles").Value.Value); ForestObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("ForestObstacles").Value.Value);
UnplayableObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("UnplayableObstacles").Value.Value); UnplayableObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("UnplayableObstacles").Value.Value);
CivilianBuildingsObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("CivilianBuildingsObstacles").Value.Value);
RepaintTiles = my.NodeWithKeyOrDefault("RepaintTiles")?.Value.ToDictionary( RepaintTiles = my.NodeWithKeyOrDefault("RepaintTiles")?.Value.ToDictionary(
k => k =>
{ {
@@ -351,6 +362,8 @@ namespace OpenRA.Mods.Common.Traits
throw new MapGenerationException("ForestFeatureSize must be >= 1"); throw new MapGenerationException("ForestFeatureSize must be >= 1");
if (ResourceFeatureSize < 1) if (ResourceFeatureSize < 1)
throw new MapGenerationException("ResourceFeatureSize must be >= 1"); throw new MapGenerationException("ResourceFeatureSize must be >= 1");
if (CivilianBuildingsFeatureSize < 1)
throw new MapGenerationException("CivilianBuildingsFeatureSize must be >= 1");
if (TerrainSmoothing < 0 || TerrainSmoothing > MatrixUtils.MaxBinomialKernelRadius) if (TerrainSmoothing < 0 || TerrainSmoothing > MatrixUtils.MaxBinomialKernelRadius)
throw new MapGenerationException($"TerrainSmoothing must be between 0 and {MatrixUtils.MaxBinomialKernelRadius} inclusive"); throw new MapGenerationException($"TerrainSmoothing must be between 0 and {MatrixUtils.MaxBinomialKernelRadius} inclusive");
if (SmoothingThreshold < (FractionMax + 1) / 2 || SmoothingThreshold > FractionMax) if (SmoothingThreshold < (FractionMax + 1) / 2 || SmoothingThreshold > FractionMax)
@@ -425,6 +438,12 @@ namespace OpenRA.Mods.Common.Traits
throw new MapGenerationException("MaximumBuildings must be >= 0"); throw new MapGenerationException("MaximumBuildings must be >= 0");
if (MinimumBuildings > MaximumBuildings) if (MinimumBuildings > MaximumBuildings)
throw new MapGenerationException("MinimumBuildings must be <= maximumBuildings"); throw new MapGenerationException("MinimumBuildings must be <= maximumBuildings");
if (CivilianBuildings < 0 || CivilianBuildings > FractionMax)
throw new MapGenerationException($"CivilianBuildings must be between 0 and {FractionMax} inclusive");
if (MinimumCivilianBuildingDensity < 0 || MinimumCivilianBuildingDensity > FractionMax)
throw new MapGenerationException($"MinimumCivilianBuildingDensity must be between 0 and {FractionMax} inclusive");
if (CivilianBuildingDensityRadius < 0)
throw new MapGenerationException("CivilianBuildingDensityRadius must be >= 0");
if (ResourcesPerPlayer < 0) if (ResourcesPerPlayer < 0)
throw new MapGenerationException("ResourcesPerPlayer must be >= 0"); throw new MapGenerationException("ResourcesPerPlayer must be >= 0");
if (OreUniformity < 0) if (OreUniformity < 0)
@@ -582,6 +601,8 @@ namespace OpenRA.Mods.Common.Traits
var buildingRandom = new MersenneTwister(random.Next()); var buildingRandom = new MersenneTwister(random.Next());
var topologyRandom = new MersenneTwister(random.Next()); var topologyRandom = new MersenneTwister(random.Next());
var repaintRandom = new MersenneTwister(random.Next()); var repaintRandom = new MersenneTwister(random.Next());
var decorationRandom = new MersenneTwister(random.Next());
var decorationTilingRandom = new MersenneTwister(random.Next());
TerrainTile PickTile(ushort tileType) TerrainTile PickTile(ushort tileType)
{ {
@@ -1601,6 +1622,7 @@ namespace OpenRA.Mods.Common.Traits
{ {
var mpos = cpos.ToMPos(gridType); var mpos = cpos.ToMPos(gridType);
priorities[PriorityIndex(mpos)] = int.MaxValue; priorities[PriorityIndex(mpos)] = int.MaxValue;
zoneable[mpos] = false;
// Generally shouldn't happen, but perhaps a rotation/mirror related inaccuracy. // Generally shouldn't happen, but perhaps a rotation/mirror related inaccuracy.
if (map.Resources[mpos].Type != 0) if (map.Resources[mpos].Type != 0)
@@ -1628,6 +1650,94 @@ namespace OpenRA.Mods.Common.Traits
remaining -= AddResource(cpos); remaining -= AddResource(cpos);
} }
} }
// CivilianBuildings
if (param.CivilianBuildings > 0)
{
var space = new CellLayer<bool>(map);
foreach (var mpos in map.AllCells.MapCoords)
space[mpos] = param.PlayableTerrain.Contains(tileset.GetTerrainIndex(map.Tiles[mpos]));
foreach (var actorPlan in actorPlans)
foreach (var (cpos, _) in actorPlan.Footprint())
if (space.Contains(cpos))
space[cpos] = false;
var matrixSpace = CellLayerUtils.ToMatrix(space, true);
var deflated = MatrixUtils.DeflateSpace(matrixSpace, false);
var kernel = new Matrix<bool>(2, 2).Fill(true);
var reservedMatrix = MatrixUtils.KernelDilateOrErode(deflated.Map(v => v != 0), kernel, new int2(0, 0), true);
var reserved = new CellLayer<bool>(map);
CellLayerUtils.FromMatrix(reserved, reservedMatrix, true);
var decorationNoise = new CellLayer<int>(map);
NoiseUtils.SymmetricFractalNoiseIntoCellLayer(
decorationRandom,
decorationNoise,
param.Rotations,
param.Mirror,
param.CivilianBuildingsFeatureSize,
wavelength => 1);
var decorable = new CellLayer<bool>(map);
var totalDecorable = 0;
foreach (var mpos in map.AllCells.MapCoords)
{
var isDecorable =
map.Tiles[mpos].Type == param.LandTile
&& zoneable[mpos] && space[mpos] && !reserved[mpos];
decorable[mpos] = isDecorable;
if (isDecorable)
totalDecorable++;
else
decorationNoise[mpos] = -1024 * 1024;
}
var mapArea = map.MapSize.X * map.MapSize.Y;
CellLayerUtils.CalibrateQuantileInPlace(
decorationNoise,
0,
mapArea - totalDecorable * param.CivilianBuildings / FractionMax, mapArea);
foreach (var mpos in map.AllCells.MapCoords)
if (decorationNoise[mpos] < 0)
decorable[mpos] = false;
for (var i = 0; i < 8; i++)
{
var (blurred, changes) = MatrixUtils.BooleanBlur(
CellLayerUtils.ToMatrix(decorable, false),
param.CivilianBuildingDensityRadius,
FractionMax - param.MinimumCivilianBuildingDensity, FractionMax);
if (changes == 0)
break;
var densityFilter = new CellLayer<bool>(map);
CellLayerUtils.FromMatrix(densityFilter, blurred);
foreach (var mpos in map.AllCells.MapCoords)
if (!densityFilter[mpos])
decorable[mpos] = false;
}
// Improve symmetry.
{
var newDecorable = new CellLayer<bool>(map);
Symmetry.RotateAndMirrorOverCPos(
decorable,
param.Rotations,
param.Mirror,
(sources, destination)
=> newDecorable[destination] =
sources.All(source => decorable.TryGetValue(source, out var value) && value));
decorable = newDecorable;
}
var replace = new CellLayer<MultiBrush.Replaceability>(map);
foreach (var mpos in map.AllCells.MapCoords)
replace[mpos] = decorable[mpos] ? MultiBrush.Replaceability.Actor : MultiBrush.Replaceability.None;
MultiBrush.PaintArea(map, actorPlans, replace, param.CivilianBuildingsObstacles, decorationTilingRandom);
}
} }
// Cosmetically repaint tiles // Cosmetically repaint tiles

View File

@@ -841,3 +841,12 @@ label-cnc-map-generator-choice-density-area-very-high = Scale with area (very hi
label-cnc-map-generator-option-roads = Roads label-cnc-map-generator-option-roads = Roads
label-cnc-map-generator-option-deny-walled-areas = Obstruct walled areas label-cnc-map-generator-option-deny-walled-areas = Obstruct walled areas
label-cnc-map-generator-option-civilian-density = Civilian Density
label-cnc-map-generator-choice-civilian-density-default = Default
label-cnc-map-generator-choice-civilian-density-none = None
label-cnc-map-generator-choice-civilian-density-low = Low
label-cnc-map-generator-choice-civilian-density-medium = Medium
label-cnc-map-generator-choice-civilian-density-high = High
label-cnc-map-generator-choice-civilian-density-very-high = Very High
label-cnc-map-generator-choice-civilian-density-max = Maximum

View File

@@ -9,6 +9,7 @@
TerrainFeatureSize: 20480 TerrainFeatureSize: 20480
ForestFeatureSize: 20480 ForestFeatureSize: 20480
ResourceFeatureSize: 20480 ResourceFeatureSize: 20480
CivilianBuildingsFeatureSize: 10240
Water: 0 Water: 0
Mountains: 100 Mountains: 100
Forests: 25 Forests: 25
@@ -47,6 +48,9 @@
MaximumExpansionSize: 12 MaximumExpansionSize: 12
ExpansionInner: 2 ExpansionInner: 2
ExpansionBorder: 1 ExpansionBorder: 1
CivilianBuildings: 125
MinimumCivilianBuildingDensity: 50
CivilianBuildingDensityRadius: 6
DefaultResource: Tiberium DefaultResource: Tiberium
ResourceSpawnSeeds: ResourceSpawnSeeds:
split2: Tiberium split2: Tiberium
@@ -65,6 +69,7 @@
RoadSegmentTypes: Road,RoadIn,RoadOut RoadSegmentTypes: Road,RoadIn,RoadOut
ForestObstacles: Trees ForestObstacles: Trees
UnplayableObstacles: Obstructions UnplayableObstacles: Obstructions
CivilianBuildingsObstacles: CivilianBuildings
Option@hidden_tileset_overrides: Option@hidden_tileset_overrides:
Choice@common: Choice@common:
Tileset: DESERT,JUNGLE,SNOW,TEMPERAT Tileset: DESERT,JUNGLE,SNOW,TEMPERAT
@@ -114,11 +119,13 @@
Label: label-cnc-map-generator-choice-terrain-type-plains Label: label-cnc-map-generator-choice-terrain-type-plains
Settings: Settings:
Water: 0 Water: 0
CivilianBuildings: 100
Choice@Parks: Choice@Parks:
Label: label-cnc-map-generator-choice-terrain-type-parks Label: label-cnc-map-generator-choice-terrain-type-parks
Settings: Settings:
Water: 0 Water: 0
Forests: 100 Forests: 100
CivilianBuildings: 100
Choice@Woodlands: Choice@Woodlands:
Label: label-cnc-map-generator-choice-terrain-type-woodlands Label: label-cnc-map-generator-choice-terrain-type-woodlands
Settings: Settings:
@@ -368,6 +375,37 @@
Checkbox: Roads Checkbox: Roads
Default: True Default: True
Priority: 1 Priority: 1
Option@CivilianDensity:
Label: label-cnc-map-generator-option-civilian-density
Default: Default
Priority: 3
Choice@Default:
Label: label-cnc-map-generator-choice-civilian-density-default
Settings:
Choice@None:
Label: label-cnc-map-generator-choice-civilian-density-none
Settings:
CivilianBuildings: 0
Choice@Low:
Label: label-cnc-map-generator-choice-civilian-density-low
Settings:
CivilianBuildings: 75
Choice@Medium:
Label: label-cnc-map-generator-choice-civilian-density-medium
Settings:
CivilianBuildings: 125
Choice@High:
Label: label-cnc-map-generator-choice-civilian-density-high
Settings:
CivilianBuildings: 250
Choice@VeryHigh:
Label: label-cnc-map-generator-choice-civilian-density-very-high
Settings:
CivilianBuildings: 500
Choice@Max:
Label: label-cnc-map-generator-choice-civilian-density-max
Settings:
CivilianBuildings: 1000
ClearMapGenerator@clear: ClearMapGenerator@clear:
Type: clear Type: clear
Name: map-generator-clear Name: map-generator-clear

View File

@@ -3192,3 +3192,48 @@ MultiBrushCollections:
Template: 76 Template: 76
MultiBrush@77: MultiBrush@77:
Template: 77 Template: 77
CivilianBuildings:
MultiBrush@v20:
Actor: v20
Weight: 25000
MultiBrush@v21:
Actor: v21
Weight: 25000
MultiBrush@v22:
Actor: v22
Weight: 10000
MultiBrush@v23:
Actor: v23
MultiBrush@v24:
Actor: v24
Weight: 25000
MultiBrush@v25:
Actor: v25
Weight: 25000
MultiBrush@v26:
Actor: v26
Weight: 10000
MultiBrush@v27:
Actor: v27
MultiBrush@v28:
Actor: v28
MultiBrush@v29:
Actor: v29
MultiBrush@v30:
Actor: v30
Weight: 10000
MultiBrush@v31:
Actor: v31
Weight: 10000
MultiBrush@v32:
Actor: v32
Weight: 10000
MultiBrush@v33:
Actor: v33
Weight: 10000
MultiBrush@v34:
Actor: v34
MultiBrush@v35:
Actor: v35
MultiBrush@v36:
Actor: v36

View File

@@ -2627,3 +2627,47 @@ MultiBrushCollections:
Template: 76 Template: 76
MultiBrush@77: MultiBrush@77:
Template: 77 Template: 77
CivilianBuildings:
MultiBrush@v01:
Actor: v01
Weight: 25000
MultiBrush@v02:
Actor: v02
Weight: 25000
MultiBrush@v03:
Actor: v03
Weight: 25000
MultiBrush@v04:
Actor: v04
Weight: 25000
MultiBrush@v05:
Actor: v05
Weight: 10000
MultiBrush@v06:
Actor: v06
Weight: 10000
MultiBrush@v07:
Actor: v07
Weight: 10000
MultiBrush@v08:
Actor: v08
MultiBrush@v09:
Actor: v09
MultiBrush@v10:
Actor: v10
MultiBrush@v11:
Actor: v11
MultiBrush@v12:
Actor: v12
MultiBrush@v13:
Actor: v13
MultiBrush@v14:
Actor: v14
MultiBrush@v15:
Actor: v15
MultiBrush@v16:
Actor: v16
MultiBrush@v17:
Actor: v17
MultiBrush@v18:
Actor: v18

View File

@@ -2629,3 +2629,47 @@ MultiBrushCollections:
Template: 76 Template: 76
MultiBrush@77: MultiBrush@77:
Template: 77 Template: 77
CivilianBuildings:
MultiBrush@v01:
Actor: v01
Weight: 25000
MultiBrush@v02:
Actor: v02
Weight: 25000
MultiBrush@v03:
Actor: v03
Weight: 25000
MultiBrush@v04:
Actor: v04
Weight: 25000
MultiBrush@v05:
Actor: v05
Weight: 10000
MultiBrush@v06:
Actor: v06
Weight: 10000
MultiBrush@v07:
Actor: v07
Weight: 10000
MultiBrush@v08:
Actor: v08
MultiBrush@v09:
Actor: v09
MultiBrush@v10:
Actor: v10
MultiBrush@v11:
Actor: v11
MultiBrush@v12:
Actor: v12
MultiBrush@v13:
Actor: v13
MultiBrush@v14:
Actor: v14
MultiBrush@v15:
Actor: v15
MultiBrush@v16:
Actor: v16
MultiBrush@v17:
Actor: v17
MultiBrush@v18:
Actor: v18

View File

@@ -2632,3 +2632,47 @@ MultiBrushCollections:
Template: 76 Template: 76
MultiBrush@77: MultiBrush@77:
Template: 77 Template: 77
CivilianBuildings:
MultiBrush@v01:
Actor: v01
Weight: 25000
MultiBrush@v02:
Actor: v02
Weight: 25000
MultiBrush@v03:
Actor: v03
Weight: 25000
MultiBrush@v04:
Actor: v04
Weight: 25000
MultiBrush@v05:
Actor: v05
Weight: 10000
MultiBrush@v06:
Actor: v06
Weight: 10000
MultiBrush@v07:
Actor: v07
Weight: 10000
MultiBrush@v08:
Actor: v08
MultiBrush@v09:
Actor: v09
MultiBrush@v10:
Actor: v10
MultiBrush@v11:
Actor: v11
MultiBrush@v12:
Actor: v12
MultiBrush@v13:
Actor: v13
MultiBrush@v14:
Actor: v14
MultiBrush@v15:
Actor: v15
MultiBrush@v16:
Actor: v16
MultiBrush@v17:
Actor: v17
MultiBrush@v18:
Actor: v18

View File

@@ -2670,3 +2670,47 @@ MultiBrushCollections:
Template: 76 Template: 76
MultiBrush@77: MultiBrush@77:
Template: 77 Template: 77
CivilianBuildings:
MultiBrush@v01:
Actor: v01
Weight: 25000
MultiBrush@v02:
Actor: v02
Weight: 25000
MultiBrush@v03:
Actor: v03
Weight: 25000
MultiBrush@v04:
Actor: v04
Weight: 25000
MultiBrush@v05:
Actor: v05
Weight: 10000
MultiBrush@v06:
Actor: v06
Weight: 10000
MultiBrush@v07:
Actor: v07
Weight: 10000
MultiBrush@v08:
Actor: v08
MultiBrush@v09:
Actor: v09
MultiBrush@v10:
Actor: v10
MultiBrush@v11:
Actor: v11
MultiBrush@v12:
Actor: v12
MultiBrush@v13:
Actor: v13
MultiBrush@v14:
Actor: v14
MultiBrush@v15:
Actor: v15
MultiBrush@v16:
Actor: v16
MultiBrush@v17:
Actor: v17
MultiBrush@v18:
Actor: v18

View File

@@ -1012,3 +1012,12 @@ label-ra-map-generator-choice-density-area-very-high = Scale with area (very hig
label-ra-map-generator-option-roads = Roads label-ra-map-generator-option-roads = Roads
label-ra-map-generator-option-deny-walled-areas = Obstruct walled areas label-ra-map-generator-option-deny-walled-areas = Obstruct walled areas
label-ra-map-generator-option-civilian-density = Civilian Density
label-ra-map-generator-choice-civilian-density-default = Default
label-ra-map-generator-choice-civilian-density-none = None
label-ra-map-generator-choice-civilian-density-low = Low
label-ra-map-generator-choice-civilian-density-medium = Medium
label-ra-map-generator-choice-civilian-density-high = High
label-ra-map-generator-choice-civilian-density-very-high = Very High
label-ra-map-generator-choice-civilian-density-max = Maximum

View File

@@ -9,6 +9,7 @@
TerrainFeatureSize: 20480 TerrainFeatureSize: 20480
ForestFeatureSize: 20480 ForestFeatureSize: 20480
ResourceFeatureSize: 20480 ResourceFeatureSize: 20480
CivilianBuildingsFeatureSize: 10240
Water: 200 Water: 200
Mountains: 100 Mountains: 100
Forests: 25 Forests: 25
@@ -47,6 +48,9 @@
MaximumExpansionSize: 12 MaximumExpansionSize: 12
ExpansionInner: 2 ExpansionInner: 2
ExpansionBorder: 1 ExpansionBorder: 1
CivilianBuildings: 125
MinimumCivilianBuildingDensity: 50
CivilianBuildingDensityRadius: 6
DefaultResource: Ore DefaultResource: Ore
ResourceSpawnSeeds: ResourceSpawnSeeds:
mine: Ore mine: Ore
@@ -64,6 +68,7 @@
RoadSegmentTypes: Road,RoadIn,RoadOut RoadSegmentTypes: Road,RoadIn,RoadOut
ForestObstacles: Trees ForestObstacles: Trees
UnplayableObstacles: Obstructions UnplayableObstacles: Obstructions
CivilianBuildingsObstacles: CivilianBuildings
Option@hidden_tileset_overrides: Option@hidden_tileset_overrides:
Choice@desert: Choice@desert:
Tileset: DESERT Tileset: DESERT
@@ -109,11 +114,13 @@
Label: label-ra-map-generator-choice-terrain-type-plains Label: label-ra-map-generator-choice-terrain-type-plains
Settings: Settings:
Water: 0 Water: 0
CivilianBuildings: 100
Choice@Parks: Choice@Parks:
Label: label-ra-map-generator-choice-terrain-type-parks Label: label-ra-map-generator-choice-terrain-type-parks
Settings: Settings:
Water: 0 Water: 0
Forests: 100 Forests: 100
CivilianBuildings: 100
Choice@Woodlands: Choice@Woodlands:
Label: label-ra-map-generator-choice-terrain-type-woodlands Label: label-ra-map-generator-choice-terrain-type-woodlands
Settings: Settings:
@@ -173,6 +180,7 @@
Settings: Settings:
Water: 500 Water: 500
TerrainFeatureSize: 102400 TerrainFeatureSize: 102400
CivilianBuildings: 256
Choice@Wetlands: Choice@Wetlands:
Label: label-ra-map-generator-choice-terrain-type-wetlands Label: label-ra-map-generator-choice-terrain-type-wetlands
Settings: Settings:
@@ -387,6 +395,37 @@
Checkbox: Roads Checkbox: Roads
Default: True Default: True
Priority: 1 Priority: 1
Option@CivilianDensity:
Label: label-ra-map-generator-option-civilian-density
Default: Default
Priority: 3
Choice@Default:
Label: label-ra-map-generator-choice-civilian-density-default
Settings:
Choice@None:
Label: label-ra-map-generator-choice-civilian-density-none
Settings:
CivilianBuildings: 0
Choice@Low:
Label: label-ra-map-generator-choice-civilian-density-low
Settings:
CivilianBuildings: 75
Choice@Medium:
Label: label-ra-map-generator-choice-civilian-density-medium
Settings:
CivilianBuildings: 125
Choice@High:
Label: label-ra-map-generator-choice-civilian-density-high
Settings:
CivilianBuildings: 250
Choice@VeryHigh:
Label: label-ra-map-generator-choice-civilian-density-very-high
Settings:
CivilianBuildings: 500
Choice@Max:
Label: label-ra-map-generator-choice-civilian-density-max
Settings:
CivilianBuildings: 1000
ClearMapGenerator@clear: ClearMapGenerator@clear:
Type: clear Type: clear
Name: map-generator-clear Name: map-generator-clear

View File

@@ -4166,3 +4166,48 @@ MultiBrushCollections:
Actor: tc01.husk Actor: tc01.husk
BackingTile: 255,0 BackingTile: 255,0
Weight: 100 Weight: 100
CivilianBuildings:
MultiBrush@v20:
Actor: v20
Weight: 25000
MultiBrush@v21:
Actor: v21
Weight: 25000
MultiBrush@v22:
Actor: v22
Weight: 10000
MultiBrush@v23:
Actor: v23
MultiBrush@v24:
Actor: v24
Weight: 25000
MultiBrush@v25:
Actor: v25
Weight: 25000
MultiBrush@v26:
Actor: v26
Weight: 10000
MultiBrush@v27:
Actor: v27
MultiBrush@v28:
Actor: v28
MultiBrush@v29:
Actor: v29
MultiBrush@v30:
Actor: v30
Weight: 10000
MultiBrush@v31:
Actor: v31
Weight: 10000
MultiBrush@v32:
Actor: v32
Weight: 10000
MultiBrush@v33:
Actor: v33
Weight: 10000
MultiBrush@v34:
Actor: v34
MultiBrush@v35:
Actor: v35
MultiBrush@v36:
Actor: v36

View File

@@ -4351,3 +4351,51 @@ MultiBrushCollections:
Actor: t17 Actor: t17
BackingTile: 255,0 BackingTile: 255,0
Weight: 100 Weight: 100
CivilianBuildings:
MultiBrush@v01:
Actor: v01
Weight: 25000
MultiBrush@v02:
Actor: v02
Weight: 25000
MultiBrush@v03:
Actor: v03
Weight: 25000
MultiBrush@v04:
Actor: v04
Weight: 25000
MultiBrush@v05:
Actor: v05
Weight: 10000
MultiBrush@v06:
Actor: v06
Weight: 10000
MultiBrush@v07:
Actor: v07
Weight: 10000
MultiBrush@v08:
Actor: v08
MultiBrush@v09:
Actor: v09
MultiBrush@v10:
Actor: v10
MultiBrush@v11:
Actor: v11
MultiBrush@v12:
Actor: v12
MultiBrush@v13:
Actor: v13
MultiBrush@v14:
Actor: v14
MultiBrush@v15:
Actor: v15
MultiBrush@v16:
Actor: v16
MultiBrush@v17:
Actor: v17
MultiBrush@v18:
Actor: v18
MultiBrush@railmine:
Actor: railmine
MultiBrush@snowhut:
Actor: snowhut

View File

@@ -4838,3 +4838,53 @@ MultiBrushCollections:
MultiBrush@588: MultiBrush@588:
Template: 588 Template: 588
Weight: 100 Weight: 100
CivilianBuildings:
MultiBrush@v01:
Actor: v01
Weight: 25000
MultiBrush@v02:
Actor: v02
Weight: 25000
MultiBrush@v03:
Actor: v03
Weight: 25000
MultiBrush@v04:
Actor: v04
Weight: 25000
MultiBrush@v05:
Actor: v05
Weight: 10000
MultiBrush@v06:
Actor: v06
Weight: 10000
MultiBrush@v07:
Actor: v07
Weight: 10000
MultiBrush@v08:
Actor: v08
MultiBrush@v09:
Actor: v09
MultiBrush@v10:
Actor: v10
MultiBrush@v11:
Actor: v11
MultiBrush@v12:
Actor: v12
MultiBrush@v13:
Actor: v13
MultiBrush@v14:
Actor: v14
MultiBrush@v15:
Actor: v15
MultiBrush@v16:
Actor: v16
MultiBrush@v17:
Actor: v17
MultiBrush@v18:
Actor: v18
MultiBrush@railmine:
Actor: railmine
MultiBrush@rice:
Actor: rice
MultiBrush@asianhut:
Actor: asianhut