|
|
Line 1: |
Line 1: |
| local p = {}
| |
| local items_data = mw.loadJsonData("Data:ItemData.json")
| |
| 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
| |
| --With debug_mode off/unspecified, it processes the wikitext
| |
| local function process_debug_mode(wikitext, debug_mode)
| |
| if debug_mode == 'true' then
| |
| 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
| |
| return 'slot must be Weapon, Armor (Vitality), or Tech (Spirit)'
| |
| end
| |
|
| |
| local min_souls = tonumber(min_souls)
| |
| local max_souls = tonumber(max_souls)
| |
| 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 = ''
| |
| for index, item_name in ipairs(items) do
| |
| 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
| |
|
| |
| --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
| |
| 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
| |
| template_args["list" .. (i-1)] = list
| |
| end
| |
| end
| |
|
| |
| return frame:expandTemplate{title=template_title, args=template_args}
| |
| end
| |
|
| |
| return p
| |
Overview
Functions for creating navigation boxes/lists for items, grouped by a slot/category and souls
Functions
get_item_nav_bulletpoints
Gets a list of items that are each sent to the Template:ItemIcon template, separated by bullet points.
Filters down to a slot/specific category, and within a range of souls.
Parameters
- slot - Slot/category that the items should be, should be Weapon, Armor, or Tech
- min_souls - Minimum souls that the items should have
- max_souls - Maximum souls that the items should have
- debug_mode - (OPTIONAL) - if set to 'true', the wikitext is unprocessed, allowing for it to be read more clearly. Also used for showcasing the documentation examples more clearly.
Examples
With debug_mode on (for illustration purposes)
{{#invoke:ItemData/nav|get_item_nav_bulletpoints|Armor|1250|3000|debug_mode=true}}
Script error: The module returned a nil value. It is supposed to return an export table.
With debug_mode off
{{#invoke:ItemData/nav|get_item_nav_bulletpoints|Armor|1250|3000}}
Script error: The module returned a nil value. It is supposed to return an export table.
get_item_nav_cards
Gets a list of items that are each sent to the Template:ItemBox template, separated by space.
Filters down to a specific slot/category, and within a range of souls.
Parameters
Same as get_item_nav_bulletpoints
Examples
With debug_mode on (for illustration purposes)
{{#invoke:ItemData/nav|get_item_nav_bulletpoints|Armor|1250|3000|debug_mode=true}}
Script error: The module returned a nil value. It is supposed to return an export table.
With debug_mode off
{{#invoke:ItemData/nav|get_item_nav_bulletpoints|Armor|1250|3000}}
Script error: The module returned a nil value. It is supposed to return an export table.
write_item_slot_subgroup
Writes a sub group for the navbox on Template:Item Navbox and Template:Infobox ShopItems. The sub group contains all items in each price range from "ItemPricePerTier" in Data:GenericData.json
Parameters
- slot - Slot/category to create the subgroup for, ie Weapon, Armor, or Tech
- type - The subfunction to call that determines the list formatting style. Options are 'get_item_nav_bulletpoints' or 'get_item_nav_cards'
- debug_mode - (OPTIONAL) - if set to 'true', the wikitext is unprocessed, allowing for it to be read more clearly. Also used for showcasing the documentation examples more clearly.
Examples
With debug_mode on (for illustration purposes)
{{#invoke:ItemData/nav|write_item_slot_subgroup|Weapon|get_item_nav_bulletpoints|debug_mode=true}}
Script error: The module returned a nil value. It is supposed to return an export table.
With debug_mode off
{{#invoke:ItemData/nav|write_item_slot_subgroup|Weapon|get_item_nav_bulletpoints}}
Script error: The module returned a nil value. It is supposed to return an export table.
Recall that it creates subgroup parameters for the mentioned templates.