Editing Module:NpcDataGive feedback
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 7: | Line 7: | ||
-- 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 | |||
return nil | |||
end | |||
return npcs_data[name] | |||
end | end | ||
| Line 25: | Line 25: | ||
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 | |||
if not npc_name or npc_name == '' then | |||
return '<span class="error">Error: NPC name not provided.</span>' | |||
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 path = {npc_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 | |||
-- Legacy function for backwards compatibility | |||
-- Now just redirects to get_npc_var since it handles numeric indices | |||
p.get_list_elem = function(frame) | |||
return p.get_npc_var(frame) | |||
end | end | ||
return p | return p | ||