summaryrefslogtreecommitdiff
path: root/builtin/mainmenu_worldlist.lua
diff options
context:
space:
mode:
Diffstat (limited to 'builtin/mainmenu_worldlist.lua')
-rw-r--r--builtin/mainmenu_worldlist.lua211
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