Download CommonLua/MapGen/PrefabPOI.lua from sirnii/myspace: direct link, hf CLI and curl.
- Browser
- Download file 5.36 kB
-
https://huggingface.co/spaces/sirnii/myspace/resolve/main/CommonLua/MapGen/PrefabPOI.lua
- Command line
-
hf download hf://spaces/sirnii/myspace/CommonLua/MapGen/PrefabPOI.lua
-
curl -L -o PrefabPOI.lua https://huggingface.co/spaces/sirnii/myspace/resolve/main/CommonLua/MapGen/PrefabPOI.lua
5.36 kB
| 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("<Id> <style GedConsole>[<SortKey>] <PlaceModel></style> <color 0 128 0><opt(u(Comment),' ','')>"), | |
| 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("<id> [<TypesCount>]"), | |
| } | |
| 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 | |