Module:AbilityData: Difference between revisions
Jump to navigation
Jump to search
load data from HeroData.json |
added handling of {s:sign} in descriptions |
||
(15 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
local p = {} | local lang = require "Module:Lang" | ||
local p = {} | |||
local data = mw.loadJsonData("Data:HeroData.json") | local data = mw.loadJsonData("Data:HeroData.json") | ||
-- returns the table of a specific item | -- returns the table of a specific item | ||
function get_ability(hero_name, | function get_ability(hero_name, ability_num) | ||
for i, | local hero_key = get_hero_key(hero_name) | ||
if | if(hero_key == nil) then return "Hero Not Found" end | ||
return | return data[hero_key]["BoundAbilities"][tonumber(ability_num)] | ||
end | |||
function get_hero_key(hero_name) | |||
for i, hero in pairs(data) do | |||
if hero["Name"] == hero_name then | |||
return i | |||
end | end | ||
end | end | ||
Line 12: | Line 19: | ||
end | end | ||
--{{#invoke:AbilityData|get_ability_card|HERO_NAME| | --{{#invoke:AbilityData|get_ability_card|HERO_NAME|ABILITY_NUM}}-- | ||
p.get_ability_card = function(frame) | p.get_ability_card = function(frame) | ||
local hero_name = frame.args[1] | |||
local ability_num = frame.args[2] | |||
local add_link = frame.args[3] | |||
local ability = get_ability(hero_name, ability_num) | |||
if(ability == nil) then return "Ability Not Found" end | |||
if ability then | |||
-- Pass the table fields to the template | |||
local width_key = find_width_key(ability) | |||
local used_keys = { | |||
'Key', 'Name', 'Description', 'Radius', 'AbilityCastRange', 'AbilityDuration', | |||
'AbilityDuration', 'AbilityCooldown', 'Upgrades', width_key | |||
} | |||
local effects = get_effects(ability, used_keys) | |||
local too_many_effects_warn = '' | |||
if #effects > 9 and effects[9] ~= nil then | |||
too_many_effects_warn = 'There are more effects than the ability card is able to display' | |||
effects[9] = effects[9] .. too_many_effects_warn | |||
end | |||
local name_link = string.format("%s#(%s)_%s", hero_name, ability_num, ability.Name) | |||
return frame:expandTemplate{ | |||
-- TODO - remove when testing is done | |||
title = "User:Saag/Ability card", | |||
args = { | |||
name = ability.Name, | |||
name_link = name_link, | |||
description = format_value_with_prepost("Description", ability.Description), | |||
radius = format_value_with_prepost("Radius", ability.Radius), | |||
range = format_value_with_prepost("AbilityCastRange", ability.AbilityCastRange), | |||
ability_width = format_value_with_prepost(width_key, ability[width_key]), | |||
duration = format_value_with_prepost("AbilityDuration", ability.AbilityDuration), | |||
cooldown = format_value_with_prepost("AbilityCooldown", ability.AbilityCooldown), | |||
effect1 = effects[1], | |||
effect2 = effects[2], | |||
effect3 = effects[3], | |||
effect4 = effects[4], | |||
effect5 = effects[5], | |||
effect6 = effects[6], | |||
effect7 = effects[7], | |||
effect8 = effects[8], | |||
effect9 = effects[9], | |||
upgrade1 = ability.Upgrades[1].Description, | |||
upgrade2 = ability.Upgrades[2].Description, | |||
upgrade3 = ability.Upgrades[3].Description | |||
} | |||
} | |||
else | |||
return "Ability data not found for hero " .. hero_name .. " and num " .. ability_num | |||
end | |||
end | |||
--{{#invoke:AbilityData|get_ability_name|HERO_NAME|ABILITY_NUM}}-- | |||
p.get_ability_name = function(frame) | |||
local hero_name = frame.args[1] | |||
local ability_num = frame.args[2] | |||
local ability = get_ability(hero_name, ability_num) | |||
if(ability == nil) then return "Ability Not Found" end | |||
return ability.Name | |||
end | |||
function get_effects(ability, used_keys) | |||
local effects = {} | |||
for key, value in pairs(ability) do | |||
if not string_in_list(key, used_keys) then | |||
local label = lang._get_string(string.format("%s_label", key)) | |||
if (label == nil) then | |||
table.insert(effects, string.format("Missing label for key '%s'", key)) | |||
else | |||
local effect_label= string.format("'''%s''': %s", label, format_value_with_prepost(key, value)) | |||
table.insert(effects, effect_label) | |||
end | |||
end | |||
end | |||
return effects | |||
end | |||
-- Add prefix and postfix labels to a value. Eg. "32" -> "32s" | |||
function format_value_with_prepost(key, value) | |||
if (value == nil) then return nil end | |||
local prefix = lang._get_string(string.format("%s_prefix",key)) | |||
local postfix = lang._get_string(string.format("%s_postfix",key)) | |||
-- Default pre/post fix to empty string, as they may not exist | |||
if (prefix == nil) then prefix = '' end | |||
if (postfix == nil) then postfix = '' end | |||
if (prefix == '{s:sign}') then | |||
if value < 0 then | |||
prefix = '-' | |||
else | |||
prefix = '+' | |||
end | |||
end | |||
return string.format("%s%s%s", prefix, value, postfix) | |||
end | |||
function find_width_key(ability) | |||
for key, value in pairs(ability) do | |||
if type(key) == "string" and key:sub(-5) == "Width" then | |||
return key | |||
end | |||
end | |||
return nil | |||
end | |||
function string_in_list(str, list) | |||
for _, value in ipairs(list) do | |||
if value == str then | |||
return true | |||
end | |||
end | |||
return false | |||
end | end | ||
return p | return p |
Latest revision as of 20:28, 19 September 2024
Documentation for this module may be created at Module:AbilityData/doc
local lang = require "Module:Lang"
local p = {}
local data = mw.loadJsonData("Data:HeroData.json")
-- returns the table of a specific item
function get_ability(hero_name, ability_num)
local hero_key = get_hero_key(hero_name)
if(hero_key == nil) then return "Hero Not Found" end
return data[hero_key]["BoundAbilities"][tonumber(ability_num)]
end
function get_hero_key(hero_name)
for i, hero in pairs(data) do
if hero["Name"] == hero_name then
return i
end
end
return nil
end
--{{#invoke:AbilityData|get_ability_card|HERO_NAME|ABILITY_NUM}}--
p.get_ability_card = function(frame)
local hero_name = frame.args[1]
local ability_num = frame.args[2]
local add_link = frame.args[3]
local ability = get_ability(hero_name, ability_num)
if(ability == nil) then return "Ability Not Found" end
if ability then
-- Pass the table fields to the template
local width_key = find_width_key(ability)
local used_keys = {
'Key', 'Name', 'Description', 'Radius', 'AbilityCastRange', 'AbilityDuration',
'AbilityDuration', 'AbilityCooldown', 'Upgrades', width_key
}
local effects = get_effects(ability, used_keys)
local too_many_effects_warn = ''
if #effects > 9 and effects[9] ~= nil then
too_many_effects_warn = 'There are more effects than the ability card is able to display'
effects[9] = effects[9] .. too_many_effects_warn
end
local name_link = string.format("%s#(%s)_%s", hero_name, ability_num, ability.Name)
return frame:expandTemplate{
-- TODO - remove when testing is done
title = "User:Saag/Ability card",
args = {
name = ability.Name,
name_link = name_link,
description = format_value_with_prepost("Description", ability.Description),
radius = format_value_with_prepost("Radius", ability.Radius),
range = format_value_with_prepost("AbilityCastRange", ability.AbilityCastRange),
ability_width = format_value_with_prepost(width_key, ability[width_key]),
duration = format_value_with_prepost("AbilityDuration", ability.AbilityDuration),
cooldown = format_value_with_prepost("AbilityCooldown", ability.AbilityCooldown),
effect1 = effects[1],
effect2 = effects[2],
effect3 = effects[3],
effect4 = effects[4],
effect5 = effects[5],
effect6 = effects[6],
effect7 = effects[7],
effect8 = effects[8],
effect9 = effects[9],
upgrade1 = ability.Upgrades[1].Description,
upgrade2 = ability.Upgrades[2].Description,
upgrade3 = ability.Upgrades[3].Description
}
}
else
return "Ability data not found for hero " .. hero_name .. " and num " .. ability_num
end
end
--{{#invoke:AbilityData|get_ability_name|HERO_NAME|ABILITY_NUM}}--
p.get_ability_name = function(frame)
local hero_name = frame.args[1]
local ability_num = frame.args[2]
local ability = get_ability(hero_name, ability_num)
if(ability == nil) then return "Ability Not Found" end
return ability.Name
end
function get_effects(ability, used_keys)
local effects = {}
for key, value in pairs(ability) do
if not string_in_list(key, used_keys) then
local label = lang._get_string(string.format("%s_label", key))
if (label == nil) then
table.insert(effects, string.format("Missing label for key '%s'", key))
else
local effect_label= string.format("'''%s''': %s", label, format_value_with_prepost(key, value))
table.insert(effects, effect_label)
end
end
end
return effects
end
-- Add prefix and postfix labels to a value. Eg. "32" -> "32s"
function format_value_with_prepost(key, value)
if (value == nil) then return nil end
local prefix = lang._get_string(string.format("%s_prefix",key))
local postfix = lang._get_string(string.format("%s_postfix",key))
-- Default pre/post fix to empty string, as they may not exist
if (prefix == nil) then prefix = '' end
if (postfix == nil) then postfix = '' end
if (prefix == '{s:sign}') then
if value < 0 then
prefix = '-'
else
prefix = '+'
end
end
return string.format("%s%s%s", prefix, value, postfix)
end
function find_width_key(ability)
for key, value in pairs(ability) do
if type(key) == "string" and key:sub(-5) == "Width" then
return key
end
end
return nil
end
function string_in_list(str, list)
for _, value in ipairs(list) do
if value == str then
return true
end
end
return false
end
return p