More actions
m concat card to ret earlier |
m Reverted edit by 149.28.42.29 (talk) to last revision by Sur Tag: Rollback |
||
(17 intermediate revisions by 2 users not shown) | |||
Line 2: | Line 2: | ||
local items_data = mw.loadJsonData("Data:ItemData.json") | local items_data = mw.loadJsonData("Data:ItemData.json") | ||
local lang_module = require('Module:Lang') | local lang_module = require('Module:Lang') | ||
local generic_module = require('Module:GenericData') | |||
local util_module = require('Module:Utilities') | |||
-- | --With debug_mode on, it outputs unprocessed wikitext | ||
function | --With debug_mode off/unspecified, it processes the wikitext | ||
local function process_debug_mode(wikitext, debug_mode) | |||
if debug_mode == 'true' then | |||
local max_souls | return wikitext | ||
elseif debug_mode == 'false' or debug_mode == nil then | |||
return mw.getCurrentFrame():preprocess(wikitext) | |||
else | |||
return "debug_mode must be 'true' or 'false'" | |||
end | |||
end | |||
--Writes list of items of a certain slot within the min and max soul bounds | |||
-- Each item is wrapped and separated. For example of wrapping/separator, see | |||
-- get_item_nav_bulletpoints. 'sep' should not be combined with 'right_wrap', | |||
-- as the trailing separator should also be removed from the string | |||
local function write_wrapped_item_list(slot, min_souls, max_souls, left_wrap, right_wrap, sep) | |||
if slot ~= 'Weapon' and slot ~= 'Armor' and slot ~= 'Tech' then | if slot ~= 'Weapon' and slot ~= 'Armor' and slot ~= 'Tech' then | ||
return 'slot must be Weapon, Armor (Vitality), or Tech (Spirit)' | return 'slot must be Weapon, Armor (Vitality), or Tech (Spirit)' | ||
end | end | ||
local min_souls = tonumber(min_souls) | local min_souls = tonumber(min_souls) | ||
local max_souls = tonumber(max_souls) | local max_souls = tonumber(max_souls) | ||
if min_souls == nil or max_souls == nil then return 'Min/Max souls must be numerical' end | if min_souls == nil or max_souls == nil then return 'Min/Max souls must be numerical' end | ||
--Retrieve all items that fit the bounds | |||
local items = {} | |||
for item_key, item_data in pairs(items_data) do | |||
--future proofing; Disabled will be renamed to IsDisabled soon | |||
local this_cost = tonumber(item_data["Cost"]) | |||
local this_slot = item_data["Slot"] | |||
if item_data["Name"] ~= nil and item_data["IsDisabled"] == 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 | |||
table.insert(items, lang_module.get_string(item_key)) | |||
end | |||
end | |||
end | |||
--Order list alphabetically | |||
table.sort(items) --O(nlogn) | |||
--Add each item to output | |||
-- Each item is surrounded by left and right wrap, and separated by sep | |||
local ret = '' | local ret = '' | ||
for | for index, item_name in ipairs(items) do | ||
local | ret = ret .. left_wrap .. item_name .. right_wrap .. sep | ||
end | |||
--Remove the last separator thats trailing after the last item | |||
ret = string.sub(ret, 1, -(string.len(sep))-1) | |||
return ret | |||
end | |||
-- for [[Template:Item Navbox]] | |||
function p.get_item_nav_bulletpoints(slot, min_souls, max_souls, debug_mode) | |||
-- If called internally (direct Lua call), args will be passed directly. | |||
-- If called from wikitext, `slot` will be the `frame` object, and we get args from `frame.args`. | |||
-- Handle the case where it's called via #invoke (i.e., from wikitext) | |||
if type(slot) == "table" and slot.args then | |||
local frame = slot | |||
slot = frame.args[1] | |||
min_souls = frame.args[2] | |||
max_souls = frame.args[3] | |||
debug_mode = frame.args["debug_mode"] | |||
end | |||
local left_wrap = '{{ItemIcon|' | |||
local right_wrap = '}}' | |||
local sep = ' • ' | |||
local item_list = write_wrapped_item_list(slot, min_souls, max_souls, left_wrap, right_wrap, sep) | |||
return process_debug_mode(item_list, debug_mode) | |||
end | |||
-- for [[Template:Infobox ShopItems]] | |||
function p.get_item_nav_cards(slot, min_souls, max_souls, debug_mode) | |||
-- If called internally (direct Lua call), args will be passed directly. | |||
-- If called from wikitext, `slot` will be the `frame` object, and we get args from `frame.args`. | |||
-- Handle the case where it's called via #invoke (i.e., from wikitext) | |||
if type(slot) == "table" and slot.args then | |||
local frame = slot | |||
slot = frame.args[1] | |||
min_souls = frame.args[2] | |||
max_souls = frame.args[3] | |||
debug_mode = frame.args["debug_mode"] | |||
end | |||
local left_wrap = '{{ItemBox|item_name=' | |||
local right_wrap = '}}' | |||
local sep = ' ' | |||
local item_list = write_wrapped_item_list(slot, min_souls, max_souls, left_wrap, right_wrap, sep) | |||
return process_debug_mode(item_list, debug_mode) | |||
end | |||
function p.write_item_slot_subgroup(frame) | |||
local slot = frame.args[1] | |||
local type = frame.args[2] | |||
local debug_mode = frame.args['debug_mode'] | |||
if slot == nil then return "'slot' parameter is required" end | |||
-- Define base args | |||
local template_title = "Navbox subgroup" | |||
local template_args = { | |||
["groupstyle"] = "background-color:" .. util_module.get_slot_color(slot) .. ";width:10%;min-width:70px;border-radius: 8px 0 0 8px", | |||
["grouppadding"] = "5px", | |||
["listpadding"] = "0 0.25rem", | |||
} | |||
local soul_style = "font-size: 12px; text-shadow: 1px 1px rgba(0, 0, 0, 0.3);" | |||
local prices = generic_module.get_item_price_per_tier() | |||
for i, souls in ipairs(prices) do | |||
--Determine lower bound for soul | |||
min_souls = souls | |||
if | --Skip 0 to i1 as no items cost less than 500 | ||
if min_souls ~= 0 then | |||
-- Determine upper bound | |||
max_souls = prices[i+1] | |||
if max_souls == nil then | |||
if | max_souls = min_souls * 10 --essentially have no upper bound | ||
end | |||
--Create the subgroup | |||
template_args["group" .. (i-1)] = frame:expandTemplate{title="Souls", args={[1] = min_souls, ["Shadow"] = soul_style}} | |||
local list | |||
if type=='get_item_nav_cards' then | |||
list = p.get_item_nav_cards(slot, min_souls, max_souls, debug_mode) | |||
elseif type=='get_item_nav_bulletpoints' then | |||
list = p.get_item_nav_bulletpoints(slot, min_souls, max_souls, debug_mode) | |||
else | |||
return "'type' should be get_item_nav_cards or get_item_nav_bulletpoints" | |||
end | end | ||
template_args["list" .. (i-1)] = list | |||
end | end | ||
end | end | ||
return frame:expandTemplate{title=template_title, args=template_args} | |||
return frame: | |||
end | end | ||
return p | return p |