Module:Abilities: Difference between revisionsGive feedback
get_ability_prop can now lookup abilities by their name or by their key |
mNo edit summary Tag: Undo |
||
| (18 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 raw_ability_data = mw.loadJsonData("Data:AbilityData.json") | ||
local Lang = require('Module:Lang') | |||
local p = {} | local p = {} | ||
| Line 23: | Line 24: | ||
end | end | ||
-- If not found by key, | -- 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 | end | ||
-- If not found by either method, return nil | -- If not found by either method, return nil | ||
return nil | return nil | ||
end | end | ||
--{{#invoke: | --{{#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. | |||
if lang and lang ~= "" then | |||
return Lang.get_string(ability.Key, tostring(lang)) | |||
end | |||
return Lang.get_string(ability.Key) | |||
end | end | ||
--{{#invoke: | -- 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 53: | Line 84: | ||
if(ability == nil) then return "Ability Not Found" end | if(ability == nil) then return "Ability Not Found" end | ||
local element = ability[ | -- 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 62: | Line 104: | ||
-- otherwise return the scalar value | -- 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 | return element | ||
end | end | ||
return p | return p | ||