DefineClass.EnrichBrushObjectSet = { __parents = { "PropertyObject", }, properties = { { id = "Name", editor = "text", default = "", translate = false, }, { id = "Objects", editor = "string_list", default = {}, items = ClassDescendantsCombo("CObject"), }, { id = "Weight", editor = "number", default = 100, min = 1, max = 1000, step = 1, slider = true, }, { id = "AngleDeviation", name = "Angle deviation", editor = "number", default = 0, min = 0, max = 180, step = 1, slider = true, }, { id = "Scale", editor = "number", default = 100, min = 10, max = 250, step = 1, slider = true, }, { id = "ScaleDeviation", name = "Scale deviation", editor = "number", default = 0, min = 0, max = 100, step = 1, slider = true, }, { id = "ColorMin", name = "Color min", editor = "color", default = RGB(100, 100, 100), }, { id = "ColorMax", name = "Color max", editor = "color", default = RGB(100, 100, 100), }, }, EditorName = "Object Set", } function EnrichBrushObjectSet:GetEditorView() local name = self.Name local count = #self.Objects local weight = self.Weight return string.format("%s (%s objects, weight %s)", name, count, weight) end DefineClass.EnrichBrushRule = { __parents = { "PropertyObject" }, properties = { { id = "Terrains", editor = "texture_picker", default = {}, thumb_size = 100, small_font = true, max_rows = 3, multiple = true, items = GetTerrainTexturesItems, }, { id = "ObjectSets", name = "Object Sets", editor = "nested_list", base_class = "EnrichBrushObjectSet", default = {}, inclusive = true, }, }, } function EnrichBrushRule:GetEditorView() local objects = {} for _, set in ipairs(self.ObjectSets) do objects = table.union(objects, set.Objects) end if #objects ~= 0 then table.sort(objects) end return string.format("Terrains: %s\nObjects: %s", table.concat(self.Terrains, ", "), table.concat(objects, ", ")) end DefineClass.EnrichTerrainPreset = { __parents = { "Preset" }, EditorMenubarName = "Enrich Terrain Presets", EditorMenubar = "Map", ContainerClass = "EnrichBrushRule", GlobalMap = "EnrichTerrainPresets", PresetClass = "EnrichTerrainPreset", } function EnrichTerrainPreset:GetError() local terrains = {} for _, rule in ipairs(self or empty_table) do for i, ter in ipairs(rule.Terrains) do if terrains[ter] then return string.format("Terrain '%s' is already used by another rule.", ter) else terrains[ter] = true end end end end DefineClass.XEnrichTerrainTool = { __parents = { "XPlaceMultipleObjectsToolBase" }, properties = { { id = "Preset", name = "Enrich preset", editor = "preset_id", default = "", preset_class = "EnrichTerrainPreset", }, }, ToolTitle = "Enrich terrain", Description = { "Adds randomized objects according to predefined presets.", }, classes = false, terrains = false, ToolSection = "Terrain", ActionIcon = "CommonAssets/UI/Editor/Tools/EnrichTerrain.tga", ActionShortcut = "Ctrl-T", } function XEnrichTerrainTool:OnEditorSetProperty(prop_id) if prop_id == "Preset" then local preset = EnrichTerrainPresets[self:GetPreset()] self.classes, self.terrains = {}, {} if not preset then return end for _, rule in ipairs(preset) do local terrains = rule.Terrains local sets = rule.ObjectSets for _, ter in ipairs(terrains) do if not self.terrains[ter] then self.terrains[ter] = sets end end for _, set in ipairs(sets) do self.classes = table.union(self.classes, set.Objects) end end end end function XEnrichTerrainTool:GetObjSet(pt) if not self:GetPreset() or self:GetPreset() == "" then return end local ter = pt and TerrainTextures[terrain.GetTerrainType(pt)] return self.terrains[ter.id] and table.weighted_rand(self.terrains[ter.id], "Weight") end function XEnrichTerrainTool:GetParams(pt) local set = self:GetObjSet(pt) if set then return self.terrain_normal, set.Scale, set.ScaleDeviation, set.AngleDeviation, set.ColorMin, set.ColorMax end end function XEnrichTerrainTool:GetClassesForPlace(pt) local set = self:GetObjSet(pt) return set and set.Objects end function XEnrichTerrainTool:GetClassesForDelete() return self.classes end