Module:Abilities: Difference between revisions

No edit summary
Tags: Mobile edit Mobile web edit
mNo edit summary
Tag: Undo
 
(12 intermediate revisions by 5 users not shown)
Line 24: Line 24:
end
end
-- If not found by key, loop through and search by the "Name" property as a fallback
-- If not found by key, search for key by ability name
for _, v in pairs(raw_ability_data) do
local resource_lookup = mw.loadJsonData("Data:ResourceLookup.json")
if (v["Name"] == identifier) then
local ability_resource = resource_lookup[identifier:lower()]
return v
end
if (ability_resource) then
return raw_ability_data[ability_resource.key]
end
end
 
-- If not found by either method, return nil
-- If not found by either method, return nil
return nil
return nil
end
end


--{{#invoke:AbilityData|get_ability_name|HERO_NAME|ABILITY_NUM|lang=LANG_CODE}}--
--{{#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]
Line 51: Line 52:
end
end


--{{#invoke:AbilityData|get_ability_prop|ability_key_or_name|prop}}--
-- 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)
p.get_ability_prop = function(frame)
local ability_identifier = frame.args[1]
local ability_identifier = frame.args[1]
Line 60: Line 84:
if(ability == nil) then return "Ability Not Found" end
if(ability == nil) then return "Ability Not Found" end


local element = ability[prop]
-- 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 element == nil then return "" end


Line 72: Line 107:
end
end


--{{#invoke:AbilityData|get_ability_upgrade_prop|ability_key_or_name|upgrade_num|prop}}--
--{{#invoke:Abilities|get_ability_upgrade_prop|ability_key_or_name|upgrade_num|prop}}--
-- Gets a specific property from a specific upgrade of an ability.
-- 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} frame.args[1] - The ability's key (e.g., "ability_afterburn") or name (e.g., "Afterburn").
Line 92: Line 127:
return "Ability Not Found"
return "Ability Not Found"
end
end
 
-- Get the list of upgrades for this ability
-- Get the list of upgrades for this ability
local upgrades = ability.Upgrades
local upgrades = ability.Upgrades
Line 113: Line 148:
-- Get the desired property from the specific upgrade
-- Get the desired property from the specific upgrade
local element = upgrade[prop]
local element = upgrade[prop]
if element == nil then
if prop and prop ~= "" then
return "" -- The property doesn't exist in this specific upgrade, which is a valid case. Return empty.
for segment in string.gmatch(prop, "[^%.]+") do
end
-- If upgrade is not a table, return value. If it is, check for segments
 
if type(element) ~= "table" then
-- If the property is a table (like a Damage object), return its Value field
return element or ""
if type(element) == "table" then
end
    return element.Value or ""
element = element[segment]
if element == nil then return "" end
end
end
end


Line 125: Line 162:
return element
return element
end
end


return p
return p