Module:NpcData: Difference between revisionsGive feedback
Jump to navigation
Jump to search
Removed obsolete get_ability_key; get_nested_var covers BoundAbilities access |
fix nested calls |
||
| Line 15: | Line 15: | ||
-- Retrieves a specific stat value for a given NPC. | -- Retrieves a specific stat value for a given NPC. | ||
--{{#invoke:NpcData|get_npc_var|NPC_KEY| | -- 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}}-- | |||
p.get_npc_var = function(frame) | p.get_npc_var = function(frame) | ||
-- | -- Use pcall to handle both template and module calls gracefully | ||
local args = frame.args | local parent_args = frame:getParent() and frame:getParent().args or {} | ||
local direct_args = frame.args | |||
local args = {} | |||
-- Merge args, giving direct #invoke args priority | |||
for k, v in pairs(parent_args) do args[k] = v end | |||
for k, v in pairs(direct_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] | local npc = npcs_data[npc_name] | ||
if not npc then | if not npc then | ||
| Line 37: | Line 36: | ||
end | end | ||
-- | local current_value = npc | ||
local | local last_key_index = 1 | ||
return '<span class="error">Error: | -- 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 | |||
-- Stop traversing if the next key looks like a number for rounding | |||
if tonumber(key) then | |||
break | |||
end | |||
if type(current_value) ~= "table" then | |||
return '<span class="error">Error: Invalid path. Tried to index a non-table value.</span>' | |||
end | |||
current_value = current_value[key] | |||
if current_value == nil then | |||
return '<span class="error">Error: Key "' .. key .. '" not found.</span>' | |||
end | |||
last_key_index = i | |||
end | end | ||
-- | -- Determine if a rounding value was 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 | |||
if sig_figs then | |||
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.</span>' | return '<span class="error">Error: Rounding failed for value.</span>' | ||
end | end | ||
end | end | ||
return | return current_value | ||
end | end | ||