-- 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