feat(navne): nye bygninger navngives automatisk (stald efter dyretype, gårdsilo/marksilo, palleskur, fabrik efter butiksnavn; numre fortsætter) + Omdøb bygning-knap i bygningsfanerne (v1.40.0.0)
This commit is contained in:
@@ -0,0 +1,71 @@
|
||||
-- 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
|
||||
Reference in New Issue
Block a user