diff options
Diffstat (limited to 'builtin/mainmenu_worldlist.lua')
-rw-r--r-- | builtin/mainmenu_worldlist.lua | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/builtin/mainmenu_worldlist.lua b/builtin/mainmenu_worldlist.lua new file mode 100644 index 000000000..4f7ba097c --- /dev/null +++ b/builtin/mainmenu_worldlist.lua @@ -0,0 +1,211 @@ +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 |