72 lines
3.1 KiB
Lua
72 lines
3.1 KiB
Lua
-- 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
|