Module:ItemData/nav: Difference between revisions

Jump to navigation Jump to search
Sur (talk | contribs)
m extracted logic to write_wrapped_item_list; get_item_nav_bulletpoints and get_item_nav_cards now more streamlined
Sur (talk | contribs)
m testing ordering by soul count first again
Line 29: Line 29:
--Retrieve all items that fit the bounds
--Retrieve all items that fit the bounds
local items = {}
local items = {}
--1st layer: souls
--2nd layer: list of items with that soul count
for item_key, item_data in pairs(items_data) do
for item_key, item_data in pairs(items_data) do
--future proofing; Disabled will be renamed to IsDisabled soon
if item_data['Disabled'] == nil and item_data['IsDisabled'] ~= nil then  
if item_data['Disabled'] == nil and item_data['IsDisabled'] ~= nil then  
return "REMINDER: 'Disabled' was renamed to 'IsDisabled'"
return "REMINDER: 'Disabled' was renamed to 'IsDisabled'"
Line 37: Line 38:
local this_cost = tonumber(item_data["Cost"])
local this_cost = tonumber(item_data["Cost"])
local this_slot = item_data["Slot"]
local this_slot = item_data["Slot"]
if item_data["Name"] ~= nil and item_data["Disabled"] == false and this_cost ~= nil and this_slot ~= nil then
if item_data["Name"] ~= nil and item_data["Disabled"] == false and this_cost ~= nil and this_slot ~= nil then
if slot == this_slot and this_cost>=min_souls and this_cost<max_souls then
if slot == this_slot and this_cost>=min_souls and this_cost<max_souls then
table.insert(items, lang_module.get_string(item_key))
if items[this_cost] == nil then
items[this_cost] = {} --list, ensure it exists before inserting to it
end
table.insert(items[this_cost], lang_module.get_string(item_key))
end
end
end
end
end
end
--Order list alphabetically
--Order each list of items for that cost by item name alphabetically
table.sort(items) --O(nlogn)
for cost, items_within_souls in pairs(items) do
table.sort(items[cost])
end
--Order the lists by souls
table.sort(items)
--2 level hash is now ordered first by cost, second by name alphabetically
--Add each item to output
--Add each item to output
-- Each item is surrounded by left and right wrap, and separated by sep
local ret = ''
local ret = ''
for index, item_name in ipairs(items) do
for cost, items_within_souls in pairs(items) do
ret = ret .. left_wrap .. item_name .. right_wrap .. sep
for index, item_name in ipairs(items_within_souls) do
ret = ret .. left_wrap .. item_name .. right_wrap .. sep
end
end
end