Module:Abilities: Difference between revisions

m Added get_ability_name function
mNo edit summary
Tag: Undo
 
(24 intermediate revisions by 5 users not shown)
Line 1: Line 1:
local data = mw.loadJsonData("Data:AbilityCards.json")
local data = mw.loadJsonData("Data:AbilityCards.json")
local raw_ability_data = mw.loadJsonData("Data:AbilityData.json")
local Lang = require('Module:Lang')


local p = {}
local p = {}


-- returns the table of a specific item
-- returns the table of a specific ability from Data:AbilityCards.json
function get_ability(hero_key, ability_num)
function get_ability(hero_key, ability_num)
local ui_data = data[hero_key]
local ui_data = data[hero_key]
Line 10: Line 12:
end
end


--{{#invoke:AbilityData|get_ability_name|HERO_NAME|ABILITY_NUM}}--
-- Returns the table of a specific ability from Data:AbilityData.json by its Key or Name
-- It first attempts a direct lookup by key for efficiency. If that fails, it iterates
-- through the data to find a matching Name property.
-- @function  find_json_ability
-- @param      {string} identifier - The ability's key or name
-- @return    {table} or nil
local function find_json_ability(identifier)
-- First, try a direct lookup by key (most efficient method)
if raw_ability_data[identifier] then
return raw_ability_data[identifier]
end
-- If not found by key, search for key by ability name
local resource_lookup = mw.loadJsonData("Data:ResourceLookup.json")
local ability_resource = resource_lookup[identifier:lower()]
if (ability_resource) then
return raw_ability_data[ability_resource.key]
end
 
-- If not found by either method, return nil
return nil
end
 
--{{#invoke:Abilities|get_ability_name|HERO_NAME|ABILITY_NUM|lang=LANG_CODE}}--
p.get_ability_name = function(frame)
p.get_ability_name = function(frame)
local hero_name = frame.args[1]
local hero_name = frame.args[1]
local ability_num = frame.args[2]
local ability_num = frame.args[2]
local lang = frame.args.lang
local ability = get_ability(hero_name, ability_num)
local ability = get_ability(hero_name, ability_num)
if(ability == nil) then return "Ability Not Found" end
if(ability == nil) then return "Ability Not Found" end
return ability.Name
if lang and lang ~= "" then
return Lang.get_string(ability.Key, tostring(lang))
end
 
return Lang.get_string(ability.Key)
end
 
-- Reverse function of get_ability_name
--{{#invoke:Abilities|get_ability_number|HERO_NAME|ABILITY_NAME}}--
p.get_ability_number = function(frame)
local hero_name = frame.args[1]
local ability_name = frame.args[2]
local ui_data = data[hero_name]
if(ui_data == nil) then return "Hero Not Found" end
-- Normalize input for case-insensitive comparison
local normalized_input = string.lower(ability_name)
-- Iterate through the hero's abilities to find matching name
for ability_num, ability in pairs(ui_data) do
local current_name = Lang.get_string(ability.Key)
if string.lower(current_name) == normalized_input then
return ability_num
end
end
return "Ability Not Found"
end
 
--{{#invoke:Abilities|get_ability_prop|ability_key_or_name|prop}}--
p.get_ability_prop = function(frame)
local ability_identifier = frame.args[1]
local prop = frame.args[2]
    -- Use the new, more flexible lookup function
local ability = find_json_ability(ability_identifier)
if(ability == nil) then return "Ability Not Found" end
 
-- Handle nested properties via dot notation (e.g., "MaxRage.Scale.Value")
local element = ability
if prop and prop ~= "" then
for segment in string.gmatch(prop, "[^%.]+") do
if type(element) ~= "table" then
return "" -- Can't traverse further
end
element = element[segment]
if element == nil then return "" end
end
end
if element == nil then return "" end
 
-- if the property is a table, return its Value field
if type(element) == "table" then
    return element.Value or ""
end
 
-- otherwise return the scalar value
return element
end
 
--{{#invoke:Abilities|get_ability_upgrade_prop|ability_key_or_name|upgrade_num|prop}}--
-- Gets a specific property from a specific upgrade of an ability.
-- @param {string} frame.args[1] - The ability's key (e.g., "ability_afterburn") or name (e.g., "Afterburn").
-- @param {string|number} frame.args[2] - The upgrade number (1, 2, or 3).
-- @param {string} frame.args[3] - The name of the property to retrieve.
p.get_ability_upgrade_prop = function(frame)
local ability_identifier = frame.args[1]
local upgrade_num_str = frame.args[2]
local prop = frame.args[3]
-- Check for missing arguments
if not (ability_identifier and upgrade_num_str and prop) then
return "Missing Arguments" -- Or return ""
end
 
-- Find the base ability data
local ability = find_json_ability(ability_identifier)
if not ability then
return "Ability Not Found"
end
-- Get the list of upgrades for this ability
local upgrades = ability.Upgrades
if not upgrades or type(upgrades) ~= "table" then
return "No Upgrades Found"
end
 
-- Convert the upgrade number from a string to an integer
local upgrade_num = tonumber(upgrade_num_str)
if not upgrade_num then
return "Invalid Upgrade Number"
end
-- Get the specific upgrade table from the list (Lua tables are 1-indexed)
local upgrade = upgrades[upgrade_num]
if not upgrade or type(upgrade) ~= "table" then
return "Upgrade Not Found"
end
-- Get the desired property from the specific upgrade
local element = upgrade[prop]
if prop and prop ~= "" then
for segment in string.gmatch(prop, "[^%.]+") do
-- If upgrade is not a table, return value. If it is, check for segments
if type(element) ~= "table" then
return element or ""
end
element = element[segment]
if element == nil then return "" end
end
end
 
-- Otherwise, return the direct value
return element
end
end


return p
return p