forked from Mirrorlandia_minetest/minetest
212 lines
5.1 KiB
Lua
212 lines
5.1 KiB
Lua
|
worldlist = {}
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.refresh()
|
||
|
worldlist.m_raw_worldlist = engine.get_worlds()
|
||
|
worldlist.process()
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.init()
|
||
|
worldlist.m_gamefilter = nil
|
||
|
worldlist.m_sortmode = "alphabetic"
|
||
|
|
||
|
worldlist.m_processed_worldlist = nil
|
||
|
worldlist.m_raw_worldlist = engine.get_worlds()
|
||
|
|
||
|
worldlist.process()
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.set_gamefilter(gameid)
|
||
|
if gameid == worldlist.m_gamefilter then
|
||
|
return
|
||
|
end
|
||
|
worldlist.m_gamefilter = gameid
|
||
|
worldlist.process()
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.get_gamefilter()
|
||
|
return worldlist.m_gamefilter
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
--supported sort mode "alphabetic|none"
|
||
|
function worldlist.set_sortmode(mode)
|
||
|
if (mode == worldlist.m_sortmode) then
|
||
|
return
|
||
|
end
|
||
|
worldlist.m_sortmode = mode
|
||
|
worldlist.process()
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.get_list()
|
||
|
return worldlist.m_processed_worldlist
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.get_raw_list()
|
||
|
return worldlist.m_raw_worldlist
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.get_raw_world(idx)
|
||
|
if type(idx) ~= "number" then
|
||
|
idx = tonumber(idx)
|
||
|
end
|
||
|
|
||
|
if idx ~= nil and idx > 0 and idx < #worldlist.m_raw_worldlist then
|
||
|
return worldlist.m_raw_worldlist[idx]
|
||
|
end
|
||
|
|
||
|
return nil
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.get_engine_index(worldlistindex)
|
||
|
assert(worldlist.m_processed_worldlist ~= nil)
|
||
|
|
||
|
if worldlistindex ~= nil and worldlistindex > 0 and
|
||
|
worldlistindex <= #worldlist.m_processed_worldlist then
|
||
|
local entry = worldlist.m_processed_worldlist[worldlistindex]
|
||
|
|
||
|
for i,v in ipairs(worldlist.m_raw_worldlist) do
|
||
|
|
||
|
if worldlist.compare(v,entry) then
|
||
|
return i
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.get_current_index(worldlistindex)
|
||
|
assert(worldlist.m_processed_worldlist ~= nil)
|
||
|
|
||
|
if worldlistindex ~= nil and worldlistindex > 0 and
|
||
|
worldlistindex <= #worldlist.m_raw_worldlist then
|
||
|
local entry = worldlist.m_raw_worldlist[worldlistindex]
|
||
|
|
||
|
for i,v in ipairs(worldlist.m_processed_worldlist) do
|
||
|
|
||
|
if worldlist.compare(v,entry) then
|
||
|
return i
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.process()
|
||
|
assert(worldlist.m_raw_worldlist ~= nil)
|
||
|
|
||
|
if worldlist.m_sortmode == "none" and
|
||
|
worldlist.m_gamefilter == nil then
|
||
|
worldlist.m_processed_worldlist = worldlist.m_raw_worldlist
|
||
|
return
|
||
|
end
|
||
|
|
||
|
worldlist.m_processed_worldlist = {}
|
||
|
|
||
|
for i,v in ipairs(worldlist.m_raw_worldlist) do
|
||
|
|
||
|
if worldlist.m_gamefilter == nil or
|
||
|
v.gameid == worldlist.m_gamefilter then
|
||
|
table.insert(worldlist.m_processed_worldlist,v)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if worldlist.m_sortmode == "none" then
|
||
|
return
|
||
|
end
|
||
|
|
||
|
if worldlist.m_sortmode == "alphabetic" then
|
||
|
worldlist.sort_alphabetic()
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.compare(world1,world2)
|
||
|
|
||
|
if world1.path ~= world2.path then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
if world1.name ~= world2.name then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
if world1.gameid ~= world2.gameid then
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
return true
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.size()
|
||
|
if worldlist.m_processed_worldlist == nil then
|
||
|
return 0
|
||
|
end
|
||
|
|
||
|
return #worldlist.m_processed_worldlist
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.exists(worldname)
|
||
|
for i,v in ipairs(worldlist.m_raw_worldlist) do
|
||
|
if v.name == worldname then
|
||
|
return true
|
||
|
end
|
||
|
end
|
||
|
return false
|
||
|
end
|
||
|
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.engine_index_by_name(worldname)
|
||
|
local worldcount = 0
|
||
|
local worldidx = 0
|
||
|
for i,v in ipairs(worldlist.m_raw_worldlist) do
|
||
|
if v.name == worldname then
|
||
|
worldcount = worldcount +1
|
||
|
worldidx = i
|
||
|
end
|
||
|
end
|
||
|
|
||
|
|
||
|
-- If there are more worlds than one with same name we can't decide which
|
||
|
-- one is meant. This shouldn't be possible but just for sure.
|
||
|
if worldcount > 1 then
|
||
|
worldidx=0
|
||
|
end
|
||
|
|
||
|
return worldidx
|
||
|
end
|
||
|
|
||
|
--------------------------------------------------------------------------------
|
||
|
function worldlist.sort_alphabetic()
|
||
|
|
||
|
table.sort(worldlist.m_processed_worldlist, function(a, b)
|
||
|
local n1 = a.name
|
||
|
local n2 = b.name
|
||
|
local count = math.min(#n1, #n2)
|
||
|
|
||
|
for i=1,count do
|
||
|
if n1:sub(i, i):lower() < n2:sub(i, i):lower() then
|
||
|
return true
|
||
|
elseif n1:sub(i, i):lower() > n2:sub(i, i):lower() then
|
||
|
return false
|
||
|
end
|
||
|
end
|
||
|
return (#n1 <= #n2)
|
||
|
end)
|
||
|
end
|