Files
fs25-adsmartpickup/FS25_ADSmartPickup/adNaming.lua
T

90 lines
4.0 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
-- Markmaskiner: navn efter rolle (høstere efter type: "beet" = roe-/kartoffeloptager, "forage" = finsnitter).
ADNaming.ROLE_PREFIX = {collector = "Læssevogn", mower = "Skårlægger", tedder = "Vender", rake = "River",
baler = "Ballepresser", baleCollector = "Ballesamler", seeder = "Såmaskine", roller = "Tromle",
weeder = "Ukrudtsmaskine", fertilizer = "Gødningsspreder", limer = "Kalkspreder", herbicide = "Sprøjte",
mulcher = "Stubhakker", cultivator = "Kultivator", plow = "Plov", unloader = "Tømmevogn"}
ADNaming.HARVESTER_PREFIX = {beet = "Roeoptager", forage = "Finsnitter"}
function ADNaming.fleetName(role, subtype, names)
local prefix
if role == "harvester" then
prefix = ADNaming.HARVESTER_PREFIX[subtype] or "Mejetærsker"
else
prefix = ADNaming.ROLE_PREFIX[role]
end
if prefix == nil then return nil end
return string.format("%s %d", prefix, ADNaming.nextNumber(names or {}, prefix))
end