DefineClass.PrefabPOI = { __parents = { "Preset", }, properties = { { category = "General", id = "PlaceModel", name = "Placement Model", editor = "choice", default = "", items = { "", "terrain", "spawn", "point" }}, { category = "General", id = "RadiusEstim", name = "Radius Estimate", editor = "choice", default = "excircle", items = function() return PrefabRadiusEstimItems() end }, { category = "General", id = "FillRadius", name = "Fill Radius", editor = "number", default = 0, min = 0, step = const.HeightTileSize, scale = "m", help = "Fill holes in the placement area to make the fitting of large prefabs easier" }, { category = "General", id = "MinCount", name = "Min Count", editor = "number", default = 0, help = "An error will be shown if the placed prefabs are less" }, { category = "General", id = "MaxCount", name = "Max Count", editor = "number", default = -1, help = "The maximum allowed prefabs form that POI type" }, { category = "General", id = "Tags", name = "Tags", editor = "set", default = empty_table, items = function() return PrefabTagsCombo() end, help = "Keywords used to define similar POI characteristics" }, { category = "General", id = "TagDist", name = "Dist To Tags", editor = "text", default = "", lines = 1, max_lines = 10, dont_save = true, read_only = true }, { category = "General", id = "DistToPlayable", name = "Dist To Playable Area", editor = "number", default = 0, scale = "m", help = "Limit placement distance to the playable area. Positive numbers are for the map border direction, while negative numbers are for the map center direction" }, { category = "General", id = "DistToSame", name = "Dist to Same", editor = "number", default = 0, min = 0, scale = "m", help = "Min distance between the bounderies of POI prefabs of the same type", no_edit = function(self) return self.PoiType == "" end }, { category = "General", id = "TerrainSlopeMin", name = "Min Terrain Slope", editor = "number", default = 0, scale = "deg", help = "Limit placement by terrain slope" }, { category = "General", id = "TerrainSlopeMax", name = "Max Terrain Slope", editor = "number", default = 90*60, scale = "deg", help = "Limit placement by terrain slope" }, { category = "General", id = "PrefabTypeGroups", name = "Prefab Type Areas", editor = "nested_list", default = empty_table, base_class = "PrefabTypeGroup", help = "Disregard the prefab type and use type groups (areas)." }, { category = "General", id = "CustomTypes", name = "Custom Prefab Types", editor = "preset_id_list", default = empty_table, preset_class = "PrefabType", help = "(deprecated) Disregard the POI prefab types and use a custom list for all", }, { category = "Editor", id = "OverlayColor", name = "Overlay Color", editor = "color", default = false, alpha = false }, }, EditorMenubarName = "Prefab POI", EditorMenubar = "Map.Generate", EditorIcon = "CommonAssets/UI/Icons/puzzle.png", EditorView = Untranslated(" "), StoreAsTable = false, GlobalMap = "PrefabPoiToPreset", HasSortKey = true, } function PrefabPOI:GetTagDist() local type_tile = const.TypeTileSize local min_dist_to, max_dist_to = {}, {} local tag_to_tag_limits = GetPrefabTagsLimits() for poi_tag in pairs(self.Tags) do for tag, limits in pairs(tag_to_tag_limits[poi_tag]) do local min_dist, max_dist = limits[1] or min_int, limits[2] or max_int if min_dist >= 0 then min_dist_to[tag] = Max(min_dist_to[tag] or 0, min_dist) end if max_dist < max_int then max_dist_to[tag] = Min(max_dist_to[tag] or max_int, max_dist) end end end local text = {} for tag, dist in sorted_pairs(min_dist_to) do text[#text + 1] = string.format("%s > %.1f m", tag, 1.0 * dist / guim) end for tag, dist in sorted_pairs(max_dist_to) do text[#text + 1] = string.format("%s < %.1f m", tag, 1.0 * dist / guim) end return table.concat(text, "\n") end function PrefabPOI:GetError() if self.PlaceModel == "" then return "Placement model must be specified" end if self.TerrainSlopeMax < self.TerrainSlopeMin then return "Invalid slope range" end if self.MaxCount >= 0 and self.MaxCount < self.MinCount then return "Invalid count range" end local ids = {} for _, area in ipairs(self.PrefabTypeGroups) do if ids[area.id] then return "Duplicated prefab type area " .. area.id end ids[area.id] = true end end ---- DefineClass.PrefabTypeGroup = { __parents = { "PropertyObject" }, properties = { { id = "id", name = "Id", editor = "text", default = "Default" }, { id = "types", name = "Types", editor = "preset_id_list", default = false, preset_class = "PrefabType", auto_expand = true, }, }, EditorView = Untranslated(" []"), } function PrefabTypeGroup:GetTypesCount() return #(self.types or "") end function PrefabTypeGroup:GetError() if (self.id or "") == "" then return "Group name expected." end if #(self.types or "") == 0 then return "At least one prefab type is required to form a group." end end