Editing Module:NpcData

Warning: You are not logged in. Once you make an edit, a temporary account will be created for you. Learn more. Log in or create an account to continue receiving notifications after this account expires, and to access other features.
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision Your text
Line 4: Line 4:
local npcs_data = mw.loadJsonData("Data:NpcData.json")
local npcs_data = mw.loadJsonData("Data:NpcData.json")
local util_module = require('Module:Utilities')
local util_module = require('Module:Utilities')
local lang_module = require('Module:Lang')


-- returns the entire data table for a specific NPC, used by other Lua modules
-- returns the entire data table for a specific NPC, used by other Lua modules
function p.get_npc_data(name)
function p.get_npc_data(name)
    if not name or name == '' then
if not name or name == '' then
        return nil
return nil
    end
end
    return npcs_data[name]
return npcs_data[name]
end
end


-- Retrieves a specific stat value for a given NPC. Handles both simple and nested calls.
-- Retrieves a specific stat value for a given NPC. Handles both simple and nested calls.
-- {{#invoke:NpcData|get_npc_var|NPC_KEY|STAT_KEY_1|STAT_KEY_2|...|SIG_FIGS}}
--{{#invoke:NpcData|get_npc_var|NPC_KEY|STAT_KEY_1|STAT_KEY_2|...|SIG_FIGS}}--
p.get_npc_var = function(frame)
p.get_npc_var = function(frame)
     -- Safer argument handling for both live and debug environments
     -- Safer argument handling for both live and debug environments
Line 25: Line 26:
     for k, v in pairs(frame.args) do args[k] = v end
     for k, v in pairs(frame.args) do args[k] = v end


    local npc_name = args[1] and mw.text.trim(args[1]) or nil
local npc_name = args[1] and mw.text.trim(args[1]) or nil
    if not npc_name or npc_name == '' then
if not npc_name or npc_name == '' then
        return '<span class="error">Error: NPC name not provided.</span>'
return '<span class="error">Error: NPC name not provided.</span>'
    end
end
 
local npc = npcs_data[npc_name]
if not npc then
return '<span class="error">Error: NPC "' .. npc_name .. '" not found.</span>'
end
 
local current_value = npc
local last_key_index = 1


    local npc = npcs_data[npc_name]
-- Traverse through the arguments to find the nested value
    if not npc then
for i = 2, #args do
        return '<span class="error">Error: NPC "' .. npc_name .. '" not found.</span>'
local key = args[i] and mw.text.trim(args[i]) or nil
    end
if not key or key == '' then break end


    local current_value = npc
if tonumber(key) and type(current_value) == "number" then
    local last_key_index = 1
break
    local path = {npc_name} -- Track the path for better error messages
end


    -- Traverse through the arguments to find the nested value
if type(current_value) ~= "table" then
    for i = 2, #args do
return '<span class="error">Error: Invalid path. Tried to index a non-table value.</span>'
        local key = args[i] and mw.text.trim(args[i]) or nil
end
        if not key or key == '' then break end
local next_value = current_value[key]
if next_value == nil then
local num_key = tonumber(key)
if num_key then
next_value = current_value[num_key]
end
end
current_value = next_value


        -- Check if this might be the sig_figs argument (numeric on a non-table)
if current_value == nil then
        if tonumber(key) and type(current_value) ~= "table" then
return '<span class="error">Error: Key "' .. key .. '" not found.</span>'
            break
end
        end
last_key_index = i
end


        if type(current_value) ~= "table" then
local sig_figs_arg = args[last_key_index + 1]
            return '<span class="error">Error: Invalid path at "' .. table.concat(path, '.') .. '". Tried to index a ' .. type(current_value) .. ' value.</span>'
local sig_figs = sig_figs_arg and tonumber(mw.text.trim(sig_figs_arg)) or nil
        end
       
if sig_figs then
        -- Try string key first
current_value = util_module.round_to_sig_fig(current_value, sig_figs)
        local next_value = current_value[key]
if current_value == nil then
       
return '<span class="error">Error: Rounding failed for value.</span>'
        -- If nil, try numeric key
end
        if next_value == nil then
end
            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
return current_value
    local sig_figs_arg = args[last_key_index + 1]
end
    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
-- Retrieves an element from a list (array) within an NPC's data.
    if type(current_value) == "table" then
--{{#invoke:NpcData|get_list_elem|NPC_KEY|LIST_KEY|INDEX}}--
        return '<span class="error">Error: Path "' .. table.concat(path, '.') .. '" points to a table/object. Specify a deeper path to get a value.</span>'
p.get_list_elem = function(frame)
    elseif type(current_value) == "boolean" then
local npc_name = frame.args[1] and mw.text.trim(frame.args[1]) or nil
        return tostring(current_value)
local var = frame.args[2] and mw.text.trim(frame.args[2]) or nil
    end
local number_str = frame.args[3] and mw.text.trim(frame.args[3]) or nil
if not npc_name or npc_name == '' then return '<span class="error">Error: NPC name not provided.</span>' end
if not var or var == '' then return '<span class="error">Error: List variable name not provided.</span>' end
if not number_str or number_str == '' then return '<span class="error">Error: Index not provided.</span>' end
local number_int = tonumber(number_str)
if not number_int then return '<span class="error">Error: Invalid index provided. Must be a number.</span>' end


    return current_value
local npc = npcs_data[npc_name]
if not npc then return '<span class="error">Error: NPC "' .. npc_name .. '" not found.</span>' end
local list = npc[var]
if list == nil or type(list) ~= "table" then return "" end
local element = list[number_int]
if element == nil then return "" end
return element
end
end


return p
return p
Please note that all contributions to The Deadlock Wiki are considered to be released under the Creative Commons Attribution-NonCommercial-ShareAlike (see Deadlock:Copyrights for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource. Do not submit copyrighted work without permission!
Cancel Editing help (opens in new window)
Preview page with this template

Pages included on this page: