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