This module allows you to display any misc. stats from the game's data files which can be found here Data:MiscData.json. For most uses, it is recommended to use the {{MiscData}} template.

How to Use

edit

To get data from the module, you use a command that looks like {{#invoke:MiscData|...}}. You will tell it which function to use and what information you need.

The basic format is: {{#invoke:MiscData|function_name|parameter1|parameter2|...}}

Available Functions

edit

Get a Single or Nested Stat (`get_misc_var`)

edit

This is the primary function for retrieving misc data. It can get a simple top-level stat or traverse deeply into nested objects and arrays (up to 6 levels deep via the template).

Syntax {{#invoke:MiscData|get_misc_var|Misc Name|Key 1|Key 2|...|Rounding}}

Parameters

  • Misc Name: The internal key for the misc stat.
  • Key 1, Key 2, ...: The path to the stat you want.
    • For a simple stat, this is one key (e.g., `MaxHealth`).
    • For nested data, provide each key in order (e.g., `RebirthModifier`, `RespawnDelay`).
    • For arrays (lists), use the position number as a key (e.g., `IntrinsicModifiers`, `1`, `BULLET_ARMOR_DAMAGE_RESIST`).
  • Rounding: (Optional) A number to round the result to that many significant figures. This should always be the last parameter.

Examples

    • Code: {{#invoke:MiscData|get_misc_var|medic_trooper_aoe_health_pickup_amber|RegenFixed|Base}}
    • Result: 150
  • If a path is incorrect, an error message will show the full path attempted:
    • Code: {{#invoke:MiscData|get_misc_var|medic_trooper_aoe_health_pickup_amber|InvalidKey|Stat}}
    • Result: Error: Key "InvalidKey" not found in path "medic_trooper_aoe_health_pickup_amber".

local p = {}

-- Load data and utility modules
local misc_data = mw.loadJsonData("Data:MiscData.json")
local util_module = require('Module:Utilities')

-- returns the entire data table for Misc data, used by other Lua modules
function p.get_misc_data(name)
    if not name or name == '' then
        return nil
    end
    return misc_data[name]
end

-- Retrieves a specific stat value for Misc. Handles both simple and nested calls.
-- {{#invoke:MiscData|get_misc_var|MISC_KEY|STAT_KEY_1|STAT_KEY_2|...|SIG_FIGS}}
p.get_misc_var = function(frame)
    -- Safer argument handling for both live and debug environments
    local args = {}
    if frame.getParent then
        local parent_args = frame:getParent().args
        for k, v in pairs(parent_args) do args[k] = v end
    end
    -- Direct args from #invoke or the debug table overwrite parent args
    for k, v in pairs(frame.args) do args[k] = v end

    local misc_name = args[1] and mw.text.trim(args[1]) or nil
    if not misc_name or misc_name == '' then
        return '<span class="error">Error: Misc name not provided.</span>'
    end

    local misc = misc_data[misc_name]
    if not misc then
        return '<span class="error">Error: misc "' .. misc_name .. '" not found.</span>'
    end

    local current_value = misc
    local last_key_index = 1
    local path = {misc_name} -- Track the path for better error messages

    -- Traverse through the arguments to find the nested value
    for i = 2, #args do
        local key = args[i] and mw.text.trim(args[i]) or nil
        if not key or key == '' then break end

        -- Check if this might be the sig_figs argument (numeric on a non-table)
        if tonumber(key) and type(current_value) ~= "table" then
            break
        end

        if type(current_value) ~= "table" then
            return '<span class="error">Error: Invalid path at "' .. table.concat(path, '.') .. '". Tried to index a ' .. type(current_value) .. ' value.</span>'
        end
        
        -- Try string key first
        local next_value = current_value[key]
        
        -- If nil, try numeric key
        if next_value == nil then
            local num_key = tonumber(key)
            if num_key then
                next_value = current_value[num_key]
            end
        end
        
        if next_value == nil then
            return '<span class="error">Error: Key "' .. key .. '" not found in path "' .. table.concat(path, '.') .. '".</span>'
        end
        
        current_value = next_value
        table.insert(path, key)
        last_key_index = i
    end

    -- Handle sig_figs if provided
    local sig_figs_arg = args[last_key_index + 1]
    local sig_figs = sig_figs_arg and tonumber(mw.text.trim(sig_figs_arg)) or nil
    
    if sig_figs then
        if type(current_value) ~= "number" then
            return '<span class="error">Error: Cannot apply sig_figs to non-numeric value at "' .. table.concat(path, '.') .. '" (type: ' .. type(current_value) .. ').</span>'
        end
        current_value = util_module.round_to_sig_fig(current_value, sig_figs)
        if current_value == nil then
            return '<span class="error">Error: Rounding failed for value at "' .. table.concat(path, '.') .. '".</span>'
        end
    end

    -- Convert tables/booleans to strings for display
    if type(current_value) == "table" then
        return '<span class="error">Error: Path "' .. table.concat(path, '.') .. '" points to a table/object. Specify a deeper path to get a value.</span>'
    elseif type(current_value) == "boolean" then
        return tostring(current_value)
    end

    return current_value
end

return p