Module:MiscData

From The Deadlock Wiki
Jump to navigation Jump to search

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 source]

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 source]

Get a Single or Nested Stat (`get_misc_var`)

[edit source]

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