diff --git a/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs b/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs index de661bcc33..fd86197aa6 100644 --- a/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs +++ b/OpenRA.Mods.Common/MapGenerator/MultiBrush.cs @@ -338,7 +338,8 @@ namespace OpenRA.Mods.Common.MapGenerator List actorPlans, CellLayer replace, IReadOnlyList availableBrushes, - MersenneTwister random) + MersenneTwister random, + bool alwaysPreferLargerBrushes = false) { var brushesByAreaDict = new Dictionary>(); foreach (var brush in availableBrushes) @@ -438,7 +439,7 @@ namespace OpenRA.Mods.Common.MapGenerator var brushWeights = brushes.Select(o => o.Weight).ToArray(); var brushWeightForArea = brushWeights.Sum(); var remainingQuota = - brushArea == 1 + (brushArea == 1 || alwaysPreferLargerBrushes) ? int.MaxValue : (int)(((long)replaceMposes.Count * brushWeightForArea + brushTotalWeight - 1) / brushTotalWeight); RefreshIndices(); diff --git a/OpenRA.Mods.Common/Traits/World/RaMapGenerator.cs b/OpenRA.Mods.Common/Traits/World/RaMapGenerator.cs index b941908dd4..4a740039dd 100644 --- a/OpenRA.Mods.Common/Traits/World/RaMapGenerator.cs +++ b/OpenRA.Mods.Common/Traits/World/RaMapGenerator.cs @@ -175,6 +175,8 @@ namespace OpenRA.Mods.Common.Traits [FieldLoader.Require] public readonly int CivilianBuildings = default; [FieldLoader.Require] + public readonly int CivilianBuildingDensity = default; + [FieldLoader.Require] public readonly int MinimumCivilianBuildingDensity = default; [FieldLoader.Require] public readonly int CivilianBuildingDensityRadius = default; @@ -440,6 +442,8 @@ namespace OpenRA.Mods.Common.Traits throw new MapGenerationException("MinimumBuildings must be <= maximumBuildings"); if (CivilianBuildings < 0 || CivilianBuildings > FractionMax) throw new MapGenerationException($"CivilianBuildings must be between 0 and {FractionMax} inclusive"); + if (CivilianBuildingDensity < 0 || CivilianBuildingDensity > FractionMax) + throw new MapGenerationException($"CivilianBuildingDensity 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) @@ -1679,13 +1683,26 @@ namespace OpenRA.Mods.Common.Traits param.CivilianBuildingsFeatureSize, wavelength => 1); + var densityNoise = new CellLayer(map); + NoiseUtils.SymmetricFractalNoiseIntoCellLayer( + decorationRandom, + densityNoise, + param.Rotations, + param.Mirror, + 1024, + NoiseUtils.PinkAmplitude); + CellLayerUtils.CalibrateQuantileInPlace( + densityNoise, + 0, + FractionMax - param.CivilianBuildingDensity, FractionMax); + var decorable = new CellLayer(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]; + && zoneable[mpos] && space[mpos] && !reserved[mpos] && densityNoise[mpos] >= 0; decorable[mpos] = isDecorable; if (isDecorable) totalDecorable++; @@ -1736,7 +1753,13 @@ namespace OpenRA.Mods.Common.Traits 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); + MultiBrush.PaintArea( + map, + actorPlans, + replace, + param.CivilianBuildingsObstacles, + decorationTilingRandom, + alwaysPreferLargerBrushes: true); } } diff --git a/mods/cnc/rules/map-generators.yaml b/mods/cnc/rules/map-generators.yaml index c3047c6ccf..3c7f0cf751 100644 --- a/mods/cnc/rules/map-generators.yaml +++ b/mods/cnc/rules/map-generators.yaml @@ -49,8 +49,9 @@ ExpansionInner: 2 ExpansionBorder: 1 CivilianBuildings: 125 - MinimumCivilianBuildingDensity: 50 - CivilianBuildingDensityRadius: 6 + CivilianBuildingDensity: 500 + MinimumCivilianBuildingDensity: 90 + CivilianBuildingDensityRadius: 3 DefaultResource: Tiberium ResourceSpawnSeeds: split2: Tiberium diff --git a/mods/cnc/tilesets/desert.yaml b/mods/cnc/tilesets/desert.yaml index eafe8f3f4c..0141818b43 100644 --- a/mods/cnc/tilesets/desert.yaml +++ b/mods/cnc/tilesets/desert.yaml @@ -3195,24 +3195,18 @@ MultiBrushCollections: 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: @@ -3221,16 +3215,12 @@ MultiBrushCollections: 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: diff --git a/mods/cnc/tilesets/jungle.yaml b/mods/cnc/tilesets/jungle.yaml index e2211f3f1e..bfe36d5094 100644 --- a/mods/cnc/tilesets/jungle.yaml +++ b/mods/cnc/tilesets/jungle.yaml @@ -2630,25 +2630,16 @@ MultiBrushCollections: 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: @@ -2657,17 +2648,3 @@ MultiBrushCollections: 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 diff --git a/mods/cnc/tilesets/snow.yaml b/mods/cnc/tilesets/snow.yaml index 387051a349..ac0bd2937a 100644 --- a/mods/cnc/tilesets/snow.yaml +++ b/mods/cnc/tilesets/snow.yaml @@ -2632,25 +2632,18 @@ MultiBrushCollections: 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: @@ -2661,15 +2654,7 @@ MultiBrushCollections: Actor: v11 MultiBrush@v12: Actor: v12 + Weight: 500 MultiBrush@v13: Actor: v13 - MultiBrush@v14: - Actor: v14 - MultiBrush@v15: - Actor: v15 - MultiBrush@v16: - Actor: v16 - MultiBrush@v17: - Actor: v17 - MultiBrush@v18: - Actor: v18 + Weight: 500 diff --git a/mods/cnc/tilesets/temperat.yaml b/mods/cnc/tilesets/temperat.yaml index 05f2eab828..47549b0537 100644 --- a/mods/cnc/tilesets/temperat.yaml +++ b/mods/cnc/tilesets/temperat.yaml @@ -2635,25 +2635,18 @@ MultiBrushCollections: 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: @@ -2662,14 +2655,6 @@ MultiBrushCollections: 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: diff --git a/mods/cnc/tilesets/winter.yaml b/mods/cnc/tilesets/winter.yaml index facb83895d..72c417ee20 100644 --- a/mods/cnc/tilesets/winter.yaml +++ b/mods/cnc/tilesets/winter.yaml @@ -2673,25 +2673,18 @@ MultiBrushCollections: 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: @@ -2702,15 +2695,13 @@ MultiBrushCollections: Actor: v11 MultiBrush@v12: Actor: v12 + Weight: 250 MultiBrush@v13: Actor: v13 - MultiBrush@v14: - Actor: v14 - MultiBrush@v15: - Actor: v15 - MultiBrush@v16: - Actor: v16 - MultiBrush@v17: - Actor: v17 - MultiBrush@v18: - Actor: v18 + Weight: 250 + MultiBrush@v12.husk: + Actor: v12.husk + Weight: 250 + MultiBrush@v13.husk: + Actor: v13.husk + Weight: 250 diff --git a/mods/ra/rules/map-generators.yaml b/mods/ra/rules/map-generators.yaml index 6649d79a69..1c84df758f 100644 --- a/mods/ra/rules/map-generators.yaml +++ b/mods/ra/rules/map-generators.yaml @@ -49,8 +49,9 @@ ExpansionInner: 2 ExpansionBorder: 1 CivilianBuildings: 125 - MinimumCivilianBuildingDensity: 50 - CivilianBuildingDensityRadius: 6 + CivilianBuildingDensity: 500 + MinimumCivilianBuildingDensity: 90 + CivilianBuildingDensityRadius: 3 DefaultResource: Ore ResourceSpawnSeeds: mine: Ore @@ -180,7 +181,6 @@ Settings: Water: 500 TerrainFeatureSize: 102400 - CivilianBuildings: 256 Choice@Wetlands: Label: label-ra-map-generator-choice-terrain-type-wetlands Settings: diff --git a/mods/ra/tilesets/desert.yaml b/mods/ra/tilesets/desert.yaml index d23e703d9b..1071eb2d7f 100644 --- a/mods/ra/tilesets/desert.yaml +++ b/mods/ra/tilesets/desert.yaml @@ -4169,24 +4169,18 @@ MultiBrushCollections: 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: @@ -4195,16 +4189,12 @@ MultiBrushCollections: 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: diff --git a/mods/ra/tilesets/snow.yaml b/mods/ra/tilesets/snow.yaml index 1adbaffa98..570ca443a7 100644 --- a/mods/ra/tilesets/snow.yaml +++ b/mods/ra/tilesets/snow.yaml @@ -4354,25 +4354,18 @@ MultiBrushCollections: 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: @@ -4383,18 +4376,10 @@ MultiBrushCollections: Actor: v11 MultiBrush@v12: Actor: v12 + Weight: 500 MultiBrush@v13: Actor: v13 - MultiBrush@v14: - Actor: v14 - MultiBrush@v15: - Actor: v15 - MultiBrush@v16: - Actor: v16 - MultiBrush@v17: - Actor: v17 - MultiBrush@v18: - Actor: v18 + Weight: 500 MultiBrush@railmine: Actor: railmine MultiBrush@snowhut: diff --git a/mods/ra/tilesets/temperat.yaml b/mods/ra/tilesets/temperat.yaml index ffc60d3a6e..1f49a22839 100644 --- a/mods/ra/tilesets/temperat.yaml +++ b/mods/ra/tilesets/temperat.yaml @@ -4841,25 +4841,18 @@ MultiBrushCollections: 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: @@ -4868,14 +4861,6 @@ MultiBrushCollections: 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: @@ -4884,6 +4869,7 @@ MultiBrushCollections: Actor: v18 MultiBrush@railmine: Actor: railmine + Weight: 250 MultiBrush@rice: Actor: rice MultiBrush@asianhut: