-- AD Naming -- Regler for automatiske navne på bygninger uden eget navn (rene funktioner; spil-delen samler input i adNames). -- Stalde efter dyretype, siloer efter gårdens klynge/nærmeste mark, palleskure nummereret, fabrikker efter -- butiksnavnet. Numrene fortsætter fra de navne, der allerede findes ("Svinestald 1-5" -> "Svinestald 6"). ADNaming = {} ADNaming.ANIMAL_PREFIX = {COW = "Kostald", PIG = "Svinestald", SHEEP = "Fårestald", GOAT = "Gedestald", CHICKEN = "Hønsehus", HORSE = "Hestestald"} ADNaming.FIELD_SILO_DISTANCE = 200 local function escape(text) return (tostring(text):gsub("[%^%$%(%)%%%.%[%]%*%+%-%?]", "%%%0")) end -- Højeste "prefix N" blandt navnene + 1. function ADNaming.nextNumber(names, prefix) local highest, pattern = 0, "^" .. escape(prefix) .. " (%d+)$" for _, name in ipairs(names) do local number = tonumber(tostring(name):match(pattern)) if number ~= nil and number > highest then highest = number end end return highest + 1 end local function contains(names, wanted) for _, name in ipairs(names) do if name == wanted then return true end end return false end -- Et fast navn der kan være brugt: "X", ellers "X 2", "X 3" ... local function uniqueFixed(names, base) if not contains(names, base) then return base end return string.format("%s %d", base, math.max(2, ADNaming.nextNumber(names, base))) end -- Navn for én bygning (nil = navngives ikke, fx salgssteder). -- b = {kind, animal, storeName, inFarmCluster, nearestField = {name, distance}} local function nameFor(b, names) if b.kind == "husbandry" then local prefix = ADNaming.ANIMAL_PREFIX[tostring(b.animal or ""):upper()] or "Stald" return string.format("%s %d", prefix, ADNaming.nextNumber(names, prefix)) elseif b.kind == "silo" then if b.inFarmCluster then return string.format("Gårdsilo %d", ADNaming.nextNumber(names, "Gårdsilo")) end local field = b.nearestField if field ~= nil and field.name ~= nil and (field.distance or math.huge) <= ADNaming.FIELD_SILO_DISTANCE then return uniqueFixed(names, field.name .. " marksilo") end return string.format("Silo %d", ADNaming.nextNumber(names, "Silo")) elseif b.kind == "objectStorage" then return string.format("Palleskur %d", ADNaming.nextNumber(names, "Palleskur")) elseif b.kind == "sell" then return nil end if b.storeName == nil or b.storeName == "" then return nil end return uniqueFixed(names, b.storeName) end -- Navne til bygninger der ikke har et endnu. existing = {[id] = navn}; returnerer kun de nye {[id] = navn}. function ADNaming.assign(buildings, existing) local names, result = {}, {} for _, name in pairs(existing or {}) do table.insert(names, name) end for _, b in ipairs(buildings or {}) do if b.id ~= nil and (existing or {})[b.id] == nil then local name = nameFor(b, names) if name ~= nil then result[b.id] = name table.insert(names, name) end end end return result end