From cc632660eb8bd7b86efad3d5a555ab6c9e65c8fb Mon Sep 17 00:00:00 2001 From: Ashley Newson Date: Fri, 7 Feb 2025 23:55:16 +0000 Subject: [PATCH] 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 --- .../Traits/World/RaMapGenerator.cs | 110 ++++++++++++++++++ mods/cnc/fluent/rules.ftl | 9 ++ mods/cnc/rules/map-generators.yaml | 38 ++++++ mods/cnc/tilesets/desert.yaml | 45 +++++++ mods/cnc/tilesets/jungle.yaml | 44 +++++++ mods/cnc/tilesets/snow.yaml | 44 +++++++ mods/cnc/tilesets/temperat.yaml | 44 +++++++ mods/cnc/tilesets/winter.yaml | 44 +++++++ mods/ra/fluent/rules.ftl | 9 ++ mods/ra/rules/map-generators.yaml | 39 +++++++ mods/ra/tilesets/desert.yaml | 45 +++++++ mods/ra/tilesets/snow.yaml | 48 ++++++++ mods/ra/tilesets/temperat.yaml | 50 ++++++++ 13 files changed, 569 insertions(+) diff --git a/OpenRA.Mods.Common/Traits/World/RaMapGenerator.cs b/OpenRA.Mods.Common/Traits/World/RaMapGenerator.cs index a6f0f7f96d..b941908dd4 100644 --- a/OpenRA.Mods.Common/Traits/World/RaMapGenerator.cs +++ b/OpenRA.Mods.Common/Traits/World/RaMapGenerator.cs @@ -83,6 +83,8 @@ namespace OpenRA.Mods.Common.Traits [FieldLoader.Require] public readonly int ResourceFeatureSize = default; [FieldLoader.Require] + public readonly int CivilianBuildingsFeatureSize = default; + [FieldLoader.Require] public readonly int Water = default; [FieldLoader.Require] public readonly int Mountains = default; @@ -170,6 +172,12 @@ namespace OpenRA.Mods.Common.Traits public readonly int MaximumBuildings = default; [FieldLoader.LoadUsing(nameof(BuildingWeightsLoader))] public readonly IReadOnlyDictionary 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] public readonly ushort LandTile = default; @@ -180,6 +188,8 @@ namespace OpenRA.Mods.Common.Traits [FieldLoader.Ignore] public readonly IReadOnlyList UnplayableObstacles; [FieldLoader.Ignore] + public readonly IReadOnlyList CivilianBuildingsObstacles; + [FieldLoader.Ignore] public readonly IReadOnlyDictionary> RepaintTiles; [FieldLoader.Ignore] @@ -230,6 +240,7 @@ namespace OpenRA.Mods.Common.Traits TemplatedTerrainInfo = Map.Rules.TerrainInfo as ITemplatedTerrainInfo; ForestObstacles = MultiBrush.LoadCollection(map, my.NodeWithKey("ForestObstacles").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( k => { @@ -351,6 +362,8 @@ namespace OpenRA.Mods.Common.Traits throw new MapGenerationException("ForestFeatureSize must be >= 1"); if (ResourceFeatureSize < 1) throw new MapGenerationException("ResourceFeatureSize must be >= 1"); + if (CivilianBuildingsFeatureSize < 1) + throw new MapGenerationException("CivilianBuildingsFeatureSize must be >= 1"); if (TerrainSmoothing < 0 || TerrainSmoothing > MatrixUtils.MaxBinomialKernelRadius) throw new MapGenerationException($"TerrainSmoothing must be between 0 and {MatrixUtils.MaxBinomialKernelRadius} inclusive"); if (SmoothingThreshold < (FractionMax + 1) / 2 || SmoothingThreshold > FractionMax) @@ -425,6 +438,12 @@ namespace OpenRA.Mods.Common.Traits throw new MapGenerationException("MaximumBuildings must be >= 0"); if (MinimumBuildings > 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) throw new MapGenerationException("ResourcesPerPlayer must be >= 0"); if (OreUniformity < 0) @@ -582,6 +601,8 @@ namespace OpenRA.Mods.Common.Traits var buildingRandom = new MersenneTwister(random.Next()); var topologyRandom = 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) { @@ -1601,6 +1622,7 @@ namespace OpenRA.Mods.Common.Traits { var mpos = cpos.ToMPos(gridType); priorities[PriorityIndex(mpos)] = int.MaxValue; + zoneable[mpos] = false; // Generally shouldn't happen, but perhaps a rotation/mirror related inaccuracy. if (map.Resources[mpos].Type != 0) @@ -1628,6 +1650,94 @@ namespace OpenRA.Mods.Common.Traits remaining -= AddResource(cpos); } } + + // CivilianBuildings + if (param.CivilianBuildings > 0) + { + var space = new CellLayer(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(2, 2).Fill(true); + var reservedMatrix = MatrixUtils.KernelDilateOrErode(deflated.Map(v => v != 0), kernel, new int2(0, 0), true); + var reserved = new CellLayer(map); + CellLayerUtils.FromMatrix(reserved, reservedMatrix, true); + + var decorationNoise = new CellLayer(map); + NoiseUtils.SymmetricFractalNoiseIntoCellLayer( + decorationRandom, + decorationNoise, + param.Rotations, + param.Mirror, + param.CivilianBuildingsFeatureSize, + wavelength => 1); + + 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]; + 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(map); + CellLayerUtils.FromMatrix(densityFilter, blurred); + + foreach (var mpos in map.AllCells.MapCoords) + if (!densityFilter[mpos]) + decorable[mpos] = false; + } + + // Improve symmetry. + { + var newDecorable = new CellLayer(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(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 diff --git a/mods/cnc/fluent/rules.ftl b/mods/cnc/fluent/rules.ftl index e469177f0c..86926cca4d 100644 --- a/mods/cnc/fluent/rules.ftl +++ b/mods/cnc/fluent/rules.ftl @@ -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-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 diff --git a/mods/cnc/rules/map-generators.yaml b/mods/cnc/rules/map-generators.yaml index cd29a258e3..c3047c6ccf 100644 --- a/mods/cnc/rules/map-generators.yaml +++ b/mods/cnc/rules/map-generators.yaml @@ -9,6 +9,7 @@ TerrainFeatureSize: 20480 ForestFeatureSize: 20480 ResourceFeatureSize: 20480 + CivilianBuildingsFeatureSize: 10240 Water: 0 Mountains: 100 Forests: 25 @@ -47,6 +48,9 @@ MaximumExpansionSize: 12 ExpansionInner: 2 ExpansionBorder: 1 + CivilianBuildings: 125 + MinimumCivilianBuildingDensity: 50 + CivilianBuildingDensityRadius: 6 DefaultResource: Tiberium ResourceSpawnSeeds: split2: Tiberium @@ -65,6 +69,7 @@ RoadSegmentTypes: Road,RoadIn,RoadOut ForestObstacles: Trees UnplayableObstacles: Obstructions + CivilianBuildingsObstacles: CivilianBuildings Option@hidden_tileset_overrides: Choice@common: Tileset: DESERT,JUNGLE,SNOW,TEMPERAT @@ -114,11 +119,13 @@ Label: label-cnc-map-generator-choice-terrain-type-plains Settings: Water: 0 + CivilianBuildings: 100 Choice@Parks: Label: label-cnc-map-generator-choice-terrain-type-parks Settings: Water: 0 Forests: 100 + CivilianBuildings: 100 Choice@Woodlands: Label: label-cnc-map-generator-choice-terrain-type-woodlands Settings: @@ -368,6 +375,37 @@ Checkbox: Roads Default: True 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: Type: clear Name: map-generator-clear diff --git a/mods/cnc/tilesets/desert.yaml b/mods/cnc/tilesets/desert.yaml index 8c3175b40d..eafe8f3f4c 100644 --- a/mods/cnc/tilesets/desert.yaml +++ b/mods/cnc/tilesets/desert.yaml @@ -3192,3 +3192,48 @@ MultiBrushCollections: Template: 76 MultiBrush@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 diff --git a/mods/cnc/tilesets/jungle.yaml b/mods/cnc/tilesets/jungle.yaml index 3587d70d15..e2211f3f1e 100644 --- a/mods/cnc/tilesets/jungle.yaml +++ b/mods/cnc/tilesets/jungle.yaml @@ -2627,3 +2627,47 @@ MultiBrushCollections: Template: 76 MultiBrush@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 diff --git a/mods/cnc/tilesets/snow.yaml b/mods/cnc/tilesets/snow.yaml index 75c3cef7ca..387051a349 100644 --- a/mods/cnc/tilesets/snow.yaml +++ b/mods/cnc/tilesets/snow.yaml @@ -2629,3 +2629,47 @@ MultiBrushCollections: Template: 76 MultiBrush@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 diff --git a/mods/cnc/tilesets/temperat.yaml b/mods/cnc/tilesets/temperat.yaml index aeca913e4f..05f2eab828 100644 --- a/mods/cnc/tilesets/temperat.yaml +++ b/mods/cnc/tilesets/temperat.yaml @@ -2632,3 +2632,47 @@ MultiBrushCollections: Template: 76 MultiBrush@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 diff --git a/mods/cnc/tilesets/winter.yaml b/mods/cnc/tilesets/winter.yaml index 0b07f959e3..facb83895d 100644 --- a/mods/cnc/tilesets/winter.yaml +++ b/mods/cnc/tilesets/winter.yaml @@ -2670,3 +2670,47 @@ MultiBrushCollections: Template: 76 MultiBrush@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 diff --git a/mods/ra/fluent/rules.ftl b/mods/ra/fluent/rules.ftl index 019a17a0e8..4534da9234 100644 --- a/mods/ra/fluent/rules.ftl +++ b/mods/ra/fluent/rules.ftl @@ -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-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 diff --git a/mods/ra/rules/map-generators.yaml b/mods/ra/rules/map-generators.yaml index 49e2952493..6649d79a69 100644 --- a/mods/ra/rules/map-generators.yaml +++ b/mods/ra/rules/map-generators.yaml @@ -9,6 +9,7 @@ TerrainFeatureSize: 20480 ForestFeatureSize: 20480 ResourceFeatureSize: 20480 + CivilianBuildingsFeatureSize: 10240 Water: 200 Mountains: 100 Forests: 25 @@ -47,6 +48,9 @@ MaximumExpansionSize: 12 ExpansionInner: 2 ExpansionBorder: 1 + CivilianBuildings: 125 + MinimumCivilianBuildingDensity: 50 + CivilianBuildingDensityRadius: 6 DefaultResource: Ore ResourceSpawnSeeds: mine: Ore @@ -64,6 +68,7 @@ RoadSegmentTypes: Road,RoadIn,RoadOut ForestObstacles: Trees UnplayableObstacles: Obstructions + CivilianBuildingsObstacles: CivilianBuildings Option@hidden_tileset_overrides: Choice@desert: Tileset: DESERT @@ -109,11 +114,13 @@ Label: label-ra-map-generator-choice-terrain-type-plains Settings: Water: 0 + CivilianBuildings: 100 Choice@Parks: Label: label-ra-map-generator-choice-terrain-type-parks Settings: Water: 0 Forests: 100 + CivilianBuildings: 100 Choice@Woodlands: Label: label-ra-map-generator-choice-terrain-type-woodlands Settings: @@ -173,6 +180,7 @@ Settings: Water: 500 TerrainFeatureSize: 102400 + CivilianBuildings: 256 Choice@Wetlands: Label: label-ra-map-generator-choice-terrain-type-wetlands Settings: @@ -387,6 +395,37 @@ Checkbox: Roads Default: True 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: Type: clear Name: map-generator-clear diff --git a/mods/ra/tilesets/desert.yaml b/mods/ra/tilesets/desert.yaml index 10053bafbb..d23e703d9b 100644 --- a/mods/ra/tilesets/desert.yaml +++ b/mods/ra/tilesets/desert.yaml @@ -4166,3 +4166,48 @@ MultiBrushCollections: Actor: tc01.husk BackingTile: 255,0 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 diff --git a/mods/ra/tilesets/snow.yaml b/mods/ra/tilesets/snow.yaml index 894b72145a..1adbaffa98 100644 --- a/mods/ra/tilesets/snow.yaml +++ b/mods/ra/tilesets/snow.yaml @@ -4351,3 +4351,51 @@ MultiBrushCollections: Actor: t17 BackingTile: 255,0 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 diff --git a/mods/ra/tilesets/temperat.yaml b/mods/ra/tilesets/temperat.yaml index 9c53c0b0b3..ffc60d3a6e 100644 --- a/mods/ra/tilesets/temperat.yaml +++ b/mods/ra/tilesets/temperat.yaml @@ -4838,3 +4838,53 @@ MultiBrushCollections: MultiBrush@588: Template: 588 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