| 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 item |
| 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
| | --{{#invoke:AbilityData|get_ability_name|HERO_NAME|ABILITY_NUM}}-- |
| -- 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 | | end |
|
| |
|
| -- Reverse function of get_ability_name
| | --{{#invoke:Abilities|get_ability_prop|ability_name|prop1|prop2|prop3}}-- |
| --{{#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 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 |