54 lines
2.1 KiB
Lua
54 lines
2.1 KiB
Lua
-- AD Field Fleet
|
|
-- Markflåden som ren logik: hvilken rolle et sæt har ud fra redskabernes specs, og hvilket ledigt sæt
|
|
-- der sendes til en mark. Kun sæt med flueben bruges; et sæt spilleren sidder i, røres aldrig.
|
|
|
|
ADFieldFleet = {}
|
|
|
|
-- Rækkefølge = prioritet når et køretøj har flere (læssevogn med egen pickup m.m.)
|
|
ADFieldFleet.ROLE_SPECS = {
|
|
{role = "collector", spec = "spec_forageWagon"},
|
|
{role = "rake", spec = "spec_windrower"},
|
|
{role = "tedder", spec = "spec_tedder"},
|
|
{role = "mower", spec = "spec_mower"},
|
|
}
|
|
|
|
function ADFieldFleet.roleFromSpecs(specs)
|
|
for _, entry in ipairs(ADFieldFleet.ROLE_SPECS) do
|
|
if specs[entry.spec] then return entry.role end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- Nærmeste brugbare sæt til rollen. Grund når intet passer: noRig (ingen med flueben og rollen),
|
|
-- allBusy (alle optaget/i brug af spilleren), tooWide/tooNarrow (bredden, med tal fra den første).
|
|
function ADFieldFleet.pick(candidates, role, x, z, mowWidth)
|
|
local best, bestDistance = nil, math.huge
|
|
local sawRole, widthReason, widthArgs = false, nil, nil
|
|
for _, candidate in ipairs(candidates) do
|
|
if candidate.role == role and candidate.enabled then
|
|
sawRole = true
|
|
if not candidate.busy and not candidate.controlled then
|
|
local ok, reason, args = ADFieldModel.checkWidth(role, candidate.width or 0, mowWidth)
|
|
if ok then
|
|
local dx, dz = candidate.x - x, candidate.z - z
|
|
local distance = dx * dx + dz * dz
|
|
if distance < bestDistance then best, bestDistance = candidate, distance end
|
|
elseif widthReason == nil then
|
|
widthReason, widthArgs = reason, args
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if best ~= nil then return best end
|
|
if not sawRole then return nil, "noRig" end
|
|
if widthReason ~= nil then return nil, widthReason, widthArgs end
|
|
return nil, "allBusy"
|
|
end
|
|
|
|
function ADFieldFleet.toggle(enabledIds, id)
|
|
local copy = {}
|
|
for key, value in pairs(enabledIds or {}) do copy[key] = value end
|
|
copy[id] = (not copy[id]) or nil
|
|
return copy
|
|
end
|