Editing Module:Abilities

Jump to navigation Jump to search
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")
-- EMPTY MODULE TO ENABLE DOCUMENTATION
local raw_ability_data = mw.loadJsonData("Data:AbilityData.json")
-- ANY CODE SHOULD BE ADDED TO A SUBMODULE "Module:Abilities/*"
local Lang = require('Module:Lang')
 
local p = {}
 
-- returns the table of a specific ability from Data:AbilityCards.json
function get_ability(hero_key, ability_num)
local ui_data = data[hero_key]
if(ui_data == nil) then return "Hero Not Found" end
return ui_data[tonumber(ability_num)]
end
 
-- 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)
local hero_name = frame.args[1]
local ability_num = frame.args[2]
local lang = frame.args.lang
local ability = get_ability(hero_name, ability_num)
if(ability == nil) then return "Ability Not Found" end
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
 
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