1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
--[[
-- @brief Fetches an array of systems from min to max jumps away from the given
-- system sys.
--
-- The following example gets a random Sirius M class planet between 1 to 6 jumps away.
--
-- @code
-- local planets = {}
-- getsysatdistance( system.cur(), 1, 6,
-- function(s)
-- for i, v in ipairs(s:planets()) do
-- if v:faction() == faction.get("Sirius") and v:class() == "M" then
-- return true
-- end
-- end
-- return false
-- end )
--
-- if #planets == 0 then abort() end -- In case no suitable planets are in range.
--
-- local index = rnd.rnd(1, #planets)
-- destplanet = planets[index][1]
-- destsys = planets[index][2]
-- @endcode
--
-- @param sys System to calculate distance from or nil to use current system
-- @param min Min distance to check for.
-- @param max Maximum distance to check for.
-- @param filter Optional filter function to use for more details.
-- @param data Data to pass to filter
-- @param hidden Whether or not to consider hidden jumps (off by default)
-- @return The table of systems n jumps away from sys
--]]
function getsysatdistance( sys, min, max, filter, data, hidden )
-- Get default parameters
if sys == nil then
sys = system.cur()
end
if max == nil then
max = min
end
open = { sys }
close = { [sys:nameRaw()]=sys }
dist = { [sys:nameRaw()]=0 }
-- Run max times
for i=1,max do
nopen = {}
-- Get all the adjacent system of the current set
for _,s in ipairs(open) do
adjsys = s:adjacentSystems( hidden ) -- Get them all
for _,a in ipairs(adjsys) do
-- Must not have been explored previously
if close[ a:nameRaw() ] == nil then
nopen[ #nopen+1 ] = a
close[ a:nameRaw() ] = a
dist[ a:nameRaw() ] = i
end
end
end
open = nopen -- New table becomes the old
end
-- Now we filter the solutions
finalset = {}
for i,s in pairs(close) do
if dist[i] >= min and dist[i] <= max and
(filter == nil or filter(s,data)) then
finalset[ #finalset+1 ] = s
end
end
return finalset
end
|