Editing Module:Abilities

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 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 raw_ability_data = mw.loadJsonData("Data:AbilityData.json")
local Lang = require('Module:Lang')


local p = {}
local p = {}


-- returns the table of a specific ability from Data:AbilityCards.json
-- returns the table of a specific ability
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 12: Line 11:
end
end


-- Returns the table of a specific ability from Data:AbilityData.json by its Key or Name
-- Returns the table of a specific ability from Data:AbilityData
-- It first attempts a direct lookup by key for efficiency. If that fails, it iterates
-- @function  get_json_ability
-- through the data to find a matching Name property.
-- @param      {string}
-- @function  find_json_ability
-- @return    {table}
-- @param      {string} identifier - The ability's key or name
local function get_json_ability(name)
-- @return    {table} or nil
for _, v in pairs(raw_ability_data) do
local function find_json_ability(identifier)
if (v["Name"] == name) then
-- First, try a direct lookup by key (most efficient method)
return v
if raw_ability_data[identifier] then
end
return raw_ability_data[identifier]
end
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
return nil
end
end


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


--{{#invoke:Abilities|get_ability_prop|ability_key_or_name|prop}}--
--{{#invoke:Abilities|get_ability_prop|ability_name|prop1|prop2|prop3}}--
p.get_ability_prop = function(frame)
p.get_ability_prop = function(frame)
local ability_identifier = frame.args[1]
local tableValues = {}
local prop = frame.args[2]
local ability_name = frame.args[1]
local prop1 = frame.args[2]
local prop2 = frame.args[3]
local prop3 = frame.args[4]
    -- Use the new, more flexible lookup function
local ability = get_json_ability(ability_name)
local ability = find_json_ability(ability_identifier)
if(ability == nil) then return "Ability Not Found" end
if(ability == nil) then return "Ability Not Found" end
 
-- Handle nested properties via dot notation (e.g., "MaxRage.Scale.Value")
if(type(ability[prop1]) == "table") then
local element = ability
for i,v in pairs(ability[prop1]) do
if prop and prop ~= "" then
local tableValues = table.insert(tableValues, v)
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
return table.concat(tableValues, ", ")
end
end
if element == nil then return "" end
return ability[prop1]
 
-- 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
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