Refine civilian building placement and multibrushes

This commit is contained in:
Ashley Newson
2025-02-09 02:35:30 +00:00
committed by Gustas Kažukauskas
parent cc632660eb
commit 98fe3c98ab
12 changed files with 47 additions and 133 deletions

View File

@@ -338,7 +338,8 @@ namespace OpenRA.Mods.Common.MapGenerator
List<ActorPlan> actorPlans,
CellLayer<Replaceability> replace,
IReadOnlyList<MultiBrush> availableBrushes,
MersenneTwister random)
MersenneTwister random,
bool alwaysPreferLargerBrushes = false)
{
var brushesByAreaDict = new Dictionary<int, List<MultiBrush>>();
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();

View File

@@ -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<int>(map);
NoiseUtils.SymmetricFractalNoiseIntoCellLayer(
decorationRandom,
densityNoise,
param.Rotations,
param.Mirror,
1024,
NoiseUtils.PinkAmplitude);
CellLayerUtils.CalibrateQuantileInPlace(
densityNoise,
0,
FractionMax - param.CivilianBuildingDensity, FractionMax);
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];
&& 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);
}
}

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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: