Editing Module:Abilities/cardGive feedback
Jump to navigation
Jump to search
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 2: | Line 2: | ||
local commonutils = require "Module:Utilities" | local commonutils = require "Module:Utilities" | ||
local utils = require "Module:Abilities/utils" | local utils = require "Module:Abilities/utils" | ||
local p = {} | local p = {} | ||
local data = mw.loadJsonData("Data:AbilityCards.json") | local data = mw.loadJsonData("Data:AbilityCards.json") | ||
-- Maps attr type to an appropriate image and page link | |||
-- Optional icon size, will be defaulted on the template | |||
local ATTR_TYPE_ICON_MAP = { | |||
bullet_armor_up = {img='Bullet_Armor.png', link='Damage_Resistance'}, | |||
bullet_armor_down = {img='Bullet_armor_down.png', link='Damage_Resistance', size='23px'}, | |||
cast = {img='AttributeIconMaxChargesIncrease.png', link=''}, | |||
charges = {img='AttributeIconMaxChargesIncrease.png', link=''}, | |||
damage = {img='Damage_heart.png', link='', color = 'NoColor'}, -- 'NoColor' will apply no icon color and use the original image | |||
bullet_damage = {img='Damage.png', link='Bullet_Damage', color = 'Brown'}, | |||
fire_rate = {img='Fire Rate.png', link='Fire_Rate'}, | |||
healing = {img='Health regen.png', link='Health_Regen'}, | |||
health = {img='Extra Health.png', link='Health'}, | |||
move_speed = {img='Move speed.png', link='Move Speed'}, | |||
range = {img='CastRange.png', link='Ability_Range'}, | |||
tech_armor_up = {img='Spirit_Armor.png', link='Damage_Resistance'}, | |||
tech_damage = {img='AttributeIconTechShieldHealth.png', link='Spirit_Damage', color = 'Purple',size = '12px'}, | |||
distance = {img='AttributeIconTechRange.png', link='Ability_Range'}, | |||
duration = {img='AttributeIconTechDuration.png', link='Ability Duration'}, | |||
slow = {img='MoveSlow.png', link=''} | |||
} | |||
function get_hero_key(hero_name) | function get_hero_key(hero_name) | ||
if | 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|ADD_LINK|NOTES}}-- | |||
--Simply calls get_ability_card_from_key with the same parameters, but with key | |||
--get_ability_card and invoke_get_ability_card_key will eventually be removed, and | |||
--get_ability_card_from_key will be renamed to get_ability_card | |||
--both routes exist temporarily as current hero pages use get_ability_card via hero name | |||
--and im currently testing via hero_key on [[User:Sur/Abrams]] | |||
--on the final version with fully automated pages, hero_key will be used. | |||
--for now, hero_name can suffice | |||
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 notes = frame.args[4] | |||
local hero_key = get_hero_key(hero_name) | |||
return p.get_ability_card_from_key(hero_key, ability_num, add_link, notes) | |||
end | |||
--from hero key* | |||
--notes parameter will eventually be removed, as notes_source_page would be sufficient or could even be determined from within this function | |||
function p.get_ability_card_from_key(hero_key, ability_num, add_link, notes, notes_source_page) | |||
if type(hero_key) == 'table' and hero_key.args then | |||
local frame = hero_key | |||
hero_key = frame.args[1] | |||
ability_num = frame.args[2] | |||
add_link = frame.args[3] | |||
notes = frame.args[4] | |||
notes_source_page = frame.args[5] | |||
end | |||
local ability = utils.get_ability_card_data(hero_key, ability_num) | |||
if(ability == nil) then | |||
return 'Ability data not found for hero ' ..hero_key.. ' and num ' .. ability_num | |||
end | |||
local ability_name_localized = lang.get_string(ability.Key) | |||
local name_link = nil | |||
if add_link == 'true' then | |||
name_link = ability_name_localized | |||
end | |||
if notes_source_page ~= nil and notes ~= "" then | |||
--Notes comes from a /Notes page, and the notes are not blank | |||
-- Confirm the notes source page exists, otherwise, don't display any notes | |||
local title = mw.title.new(notes_source_page) | |||
if not (title and title.exists) then | |||
notes = "" | |||
end | |||
end | |||
return mw.getCurrentFrame():expandTemplate{ | |||
title = "Ability card v2/Card", | |||
args = { | |||
hero_key = hero_key, | |||
ability_num = ability_num, | |||
name = ability_name_localized, | |||
name_link = name_link, | |||
icon = lang.get_string(ability.Key, 'en') .. '.png', | |||
description = mw.getCurrentFrame():preprocess(lang.get_string(ability.DescKey)), | |||
radius = ability.Radius and ability.Radius.Value, | |||
radius_ss = get_attr_ss(ability.Radius), | |||
range = ability.AbilityCastRange and ability.AbilityCastRange.Value, | |||
range_ss = get_attr_ss(ability.AbilityCastRange), | |||
duration = ability.AbilityDuration and ability.AbilityDuration.Value, | |||
duration_ss = get_attr_ss(ability.AbilityDuration), | |||
-- ability_width = format_value_with_prepost(width_key, ability[width_key]), | |||
cooldown =ability.AbilityCooldown and ability.AbilityCooldown.Value, | |||
cooldown_ss = get_attr_ss(ability.AbilityCooldown), | |||
charge_cooldown = ability.AbilityCooldownBetweenCharge and ability.AbilityCooldownBetweenCharge.Value, | |||
charge_cooldown_ss = get_attr_ss(ability.AbilityCooldownBetweenCharge), | |||
num_of_charges = ability.AbilityCharges and ability.AbilityCharges.Value, | |||
notes = notes, | |||
notes_source_page = notes_source_page | |||
} | |||
} | |||
end | end | ||
p.get_ability_card_test = function(frame) | |||
p. | |||
local hero_name = frame.args[1] | local hero_name = frame.args[1] | ||
local ability_num = frame.args[2] | local ability_num = frame.args[2] | ||
| Line 34: | Line 123: | ||
if (hero_key == nil) then return 'Hero with name' .. hero_name .. 'not found' end | if (hero_key == nil) then return 'Hero with name' .. hero_name .. 'not found' end | ||
return | return get_ability_card_test(hero_key, ability_num, add_link, notes) | ||
end | end | ||
-- Pulls data from Data:AbilityCards.json | -- Function for sandboxing workshopping potential update of entire ability card generation | ||
function | -- Pulls data from Data:AbilityCards.json for a defined hero and ability index | ||
function get_ability_card_test(hero_key, ability_num, add_link, notes, notes_source_page) | |||
local ability = utils.get_ability_card_data(hero_key, ability_num) | local ability = utils.get_ability_card_data(hero_key, ability_num) | ||
if(ability == nil) then | if(ability == nil) then | ||
| Line 51: | Line 141: | ||
if notes_source_page ~= nil and notes ~= "" then | if notes_source_page ~= nil and notes ~= "" then | ||
-- Notes comes from a /Notes page, and the notes are not blank | --Notes comes from a /Notes page, and the notes are not blank | ||
-- Confirm the notes source page exists, otherwise, don't display any notes | -- Confirm the notes source page exists, otherwise, don't display any notes | ||
local title = mw.title.new(notes_source_page) | local title = mw.title.new(notes_source_page) | ||
| Line 63: | Line 153: | ||
local info1_desc = get_info_desc(hero_key, ability_num, 1) | local info1_desc = get_info_desc(hero_key, ability_num, 1) | ||
local info1_main_boxes = get_main_boxes(hero_key, ability_num, 1) | local info1_main_boxes = get_main_boxes(hero_key, ability_num, 1) | ||
local info1_alt_boxes = get_alt_boxes(hero_key, ability_num, 1) | local info1_alt_boxes = get_alt_boxes(hero_key, ability_num, 1) | ||
local info2_desc = get_info_desc(hero_key, ability_num, 2) | local info2_desc = get_info_desc(hero_key, ability_num, 2) | ||
| Line 74: | Line 159: | ||
local info2_alt_boxes = get_alt_boxes(hero_key, ability_num, 2) | local info2_alt_boxes = get_alt_boxes(hero_key, ability_num, 2) | ||
local upgrades = get_upgrade_boxes(hero_key, ability_num) | local upgrades = get_upgrade_boxes(hero_key, ability_num) | ||
return frame:expandTemplate{ | return frame:expandTemplate{ | ||
title = " | title = "User:Saag/Sandbox/Ability card v2/manual card", | ||
args = { | args = { | ||
hero_key = hero_key, | hero_key = hero_key, | ||
ability_num = ability_num, | ability_num = ability_num, | ||
| Line 99: | Line 171: | ||
name_link = name_link, | name_link = name_link, | ||
icon = lang.get_string(ability.Key, 'en') .. '.png', | icon = lang.get_string(ability.Key, 'en') .. '.png', | ||
radius = ability.Radius and ability.Radius.Value, | radius = ability.Radius and ability.Radius.Value, | ||
radius_ss = get_attr_ss(ability.Radius), | |||
range = ability.AbilityCastRange and ability.AbilityCastRange.Value, | range = ability.AbilityCastRange and ability.AbilityCastRange.Value, | ||
range_ss = get_attr_ss(ability.AbilityCastRange), | |||
duration = ability.AbilityDuration and ability.AbilityDuration.Value, | duration = ability.AbilityDuration and ability.AbilityDuration.Value, | ||
duration_ss = get_attr_ss(ability.AbilityDuration), | |||
-- ability_width = format_value_with_prepost(width_key, ability[width_key]), | -- ability_width = format_value_with_prepost(width_key, ability[width_key]), | ||
cooldown =ability.AbilityCooldown and ability.AbilityCooldown.Value, | cooldown =ability.AbilityCooldown and ability.AbilityCooldown.Value, | ||
cooldown_ss = get_attr_ss(ability.AbilityCooldown), | |||
charge_cooldown = ability.AbilityCooldownBetweenCharge and ability.AbilityCooldownBetweenCharge.Value, | |||
charge_cooldown_ss = get_attr_ss(ability.AbilityCooldownBetweenCharge), | |||
charge_cooldown = ability.AbilityCooldownBetweenCharge and ability.AbilityCooldownBetweenCharge.Value | num_of_charges = ability.AbilityCharges and ability.AbilityCharges.Value, | ||
num_of_charges = ability.AbilityCharges and ability.AbilityCharges.Value | |||
-- Info section #1 defined in "Info1" attribute | -- Info section #1 defined in "Info1" attribute | ||
info1_desc = info1_desc, | info1_desc = info1_desc, | ||
info1_mainbox1 = info1_main_boxes[1], | info1_mainbox1 = info1_main_boxes[1], | ||
info1_mainbox2 = info1_main_boxes[2], | info1_mainbox2 = info1_main_boxes[2], | ||
info1_mainbox3 = info1_main_boxes[3], | info1_mainbox3 = info1_main_boxes[3], | ||
info1_altbox1 = info1_alt_boxes[1], | info1_altbox1 = info1_alt_boxes[1], | ||
info1_altbox2 = info1_alt_boxes[2], | info1_altbox2 = info1_alt_boxes[2], | ||
| Line 141: | Line 195: | ||
info1_altbox5 = info1_alt_boxes[5], | info1_altbox5 = info1_alt_boxes[5], | ||
info1_altbox6 = info1_alt_boxes[6], | info1_altbox6 = info1_alt_boxes[6], | ||
-- Info section #2 defined in "Info2" attribute | -- Info section #2 defined in "Info2" attribute | ||
info2_desc = info2_desc, | info2_desc = info2_desc, | ||
info2_mainbox1 = info2_main_boxes[1], | info2_mainbox1 = info2_main_boxes[1], | ||
info2_mainbox2 = info2_main_boxes[2], | info2_mainbox2 = info2_main_boxes[2], | ||
info2_mainbox3 = info2_main_boxes[3], | info2_mainbox3 = info2_main_boxes[3], | ||
info2_altbox1 = info2_alt_boxes[1], | info2_altbox1 = info2_alt_boxes[1], | ||
info2_altbox2 = info2_alt_boxes[2], | info2_altbox2 = info2_alt_boxes[2], | ||
| Line 157: | Line 207: | ||
info2_altbox5 = info2_alt_boxes[5], | info2_altbox5 = info2_alt_boxes[5], | ||
info2_altbox6 = info2_alt_boxes[6], | info2_altbox6 = info2_alt_boxes[6], | ||
-- Ability upgrades defined in "Upgrades" attribute | -- Ability upgrades defined in "Upgrades" attribute | ||
upgrade1 = upgrades[1], | upgrade1 = upgrades[1], | ||
| Line 187: | Line 220: | ||
end | end | ||
-- Get spirit scaling of attribute, return nil if none is found | |||
function get_attr_ss(attr) | |||
if not attr then | |||
return nil | |||
-- | |||
if not attr then | |||
return nil | |||
end | end | ||
local scale = attr.Scale | local scale = attr.Scale | ||
if | if not scale then | ||
return nil | return nil | ||
end | end | ||
if scale.Type ~= 'spirit' then | |||
if scale | return nil | ||
return nil | |||
end | end | ||
| Line 243: | Line 241: | ||
return commonutils.round_to_sig_fig(scale.Value, 3) | return commonutils.round_to_sig_fig(scale.Value, 3) | ||
end | end | ||
-- | --for use from an ability page (ability pages are WIP), not hero pages | ||
function | function p.write_ability_card_from_ability_key(frame) | ||
local | local ability_key = frame.args[1] | ||
if ability_key == nil then return "ability_key '" .. ability_key "' not provided" end | |||
-- Determine the hero and ability number | |||
local found_hero_key | |||
local found_ability_num | |||
for hero_key, card_data in pairs(data) do | |||
if found_hero_key == nil or found_ability_num == nil then | |||
for ability_num, ability_data in pairs(card_data) do | |||
if ability_num ~= "Name" then | |||
if ability_data['Key'] == ability_key then | |||
found_hero_key = hero_key | |||
found_ability_num = ability_num | |||
break | |||
end -- hero_key and ability_num found | |||
end | |||
end | |||
end | |||
end | end | ||
if | if found_ability_num == nil or found_hero_key == nil then return "ability_key " .. ability_key .. " is not used by any heroes" end | ||
-- Get notes for this ability | |||
local notes_source_page_name = utils.get_notes_source_page_name(ability_key) | |||
local notes_str = frame:preprocess("{{"..notes_source_page_name.."}}") | |||
return | -- Create the ability card | ||
return p.get_ability_card_from_key(found_hero_key, found_ability_num, true, notes_str, notes_source_page_name) | |||
end | end | ||
-- | -- Get all info sections for specified ability | ||
function | --{{#invoke:AbilityData|get_ability_card|HERO_KEY|ABILITY_NUM}}-- | ||
local | p.get_all_info_sections = function(frame) | ||
if | local hero_key = frame.args[1] | ||
local ability_num = frame.args[2] | |||
local ability = utils.get_ability_card_data(hero_key, ability_num) | |||
if(ability == nil) then return "Ability Not Found" end | |||
local output_template = '' | |||
for info_section_num=1, 10 do | |||
local info_section = ability['Info'..info_section_num] | |||
-- some abilities have no info sections | |||
if info_section == nil then break end | |||
local info_template = frame:expandTemplate{ | |||
title = "Ability_card_v2/Card/Info section", | |||
args = { | |||
hero_key = hero_key, | |||
ability_num = ability_num, | |||
info_section_num = info_section_num, | |||
} | |||
} | |||
output_template = output_template .. info_template | |||
end | end | ||
return | return output_template | ||
end | end | ||
| Line 276: | Line 310: | ||
local ability = utils.get_ability_card_data(hero_key, ability_num) | local ability = utils.get_ability_card_data(hero_key, ability_num) | ||
if(ability == nil) then return | if(ability == nil) then return "Ability Not Found" end | ||
local info_section = ability['Info'..info_section_num] | local info_section = ability['Info'..info_section_num] | ||
| Line 303: | Line 337: | ||
local frame = mw.getCurrentFrame() | local frame = mw.getCurrentFrame() | ||
return frame:preprocess(lang.get_string(info_section.DescKey)) | return frame:preprocess(lang.get_string(info_section.DescKey)) | ||
end | |||
--{{#invoke:AbilityData|get_info_main|HERO_KEY|ABILITY_NUM|INFO_SECTION_INDEX}}-- | |||
p.get_info_main = function(frame) | |||
local hero_key = frame.args[1] | |||
local ability_num = frame.args[2] | |||
local info_section_num = frame.args[3] | |||
local ability = utils.get_ability_card_data(hero_key, ability_num) | |||
if(ability == nil) then return "Ability Not Found" end | |||
local info_section = ability['Info'..info_section_num] | |||
-- some abilities have no info sections | |||
if info_section == nil then return '' end | |||
local main = info_section.Main | |||
if main == nil then | |||
return '' | |||
end | |||
local props = info_section.Main.Props | |||
-- Concatenate multiple section boxes into a single output template | |||
local info_box_template = '' | |||
for k, prop in pairs(props) do | |||
-- Exclude 0 values | |||
if prop.Value and prop.Value ~= 0 then | |||
local icon = get_icon(prop.Type) | |||
section_box = frame:expandTemplate{ | |||
title = "Ability_card_v2/Card/MainBox", | |||
args = { | |||
title = prop.Title, | |||
key = prop.Key, | |||
value = prop.Value, | |||
icon = icon.img, | |||
icon_link = icon.link, | |||
icon_color = icon.color, | |||
icon_size = icon.size, | |||
scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3), | |||
scale_type = prop.Scale and prop.Scale.Type | |||
} | |||
} | |||
info_box_template = info_box_template .. section_box .. '\n' | |||
end | |||
end | |||
return info_box_template | |||
end | end | ||
| Line 316: | Line 398: | ||
local main = info_section.Main | local main = info_section.Main | ||
if main == nil then | if main == nil then | ||
return | return '' | ||
end | end | ||
local frame = mw.getCurrentFrame() | local frame = mw.getCurrentFrame() | ||
local props = | local props = info_section.Main.Props | ||
local main_boxes = {} | local main_boxes = {} | ||
for k, prop in | for k, prop in pairs(props) do | ||
-- Exclude 0 values | |||
if prop.Value and prop.Value ~= 0 then | |||
-- | local icon = get_icon(prop.Type) | ||
if | local main_box = frame:expandTemplate{ | ||
title = "Ability_card_v2/Card/MainBox", | title = "Ability_card_v2/Card/MainBox", | ||
args = { | args = { | ||
title = prop.Title, | title = prop.Title, | ||
key = prop.Key, | key = prop.Key, | ||
value = | value = prop.Value, | ||
icon = | icon = icon.img, | ||
icon_link = | icon_link = icon.link, | ||
icon_color = | icon_color = icon.color, | ||
icon_size = | icon_size = icon.size, | ||
scale_value = | scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3), | ||
scale_type = | scale_type = prop.Scale and prop.Scale.Type | ||
} | } | ||
} | } | ||
table.insert(main_boxes, main_box) | |||
end | end | ||
end | end | ||
return main_boxes | return main_boxes | ||
end | end | ||
| Line 416: | Line 449: | ||
local alt_boxes = {} | local alt_boxes = {} | ||
for k, prop in pairs(props) do | |||
-- Some props don't have values, as those come from upgrades | |||
-- For now, we will ignore these and only show data for the base ability | |||
if prop.Value and prop.Value ~= 0 then | |||
local icon = get_icon(prop.Type) | |||
local alt_box = frame:expandTemplate{ | |||
title = "Ability_card_v2/Card/AltBox", | |||
args = { | |||
key = prop.Key, | |||
value = prop.Value, | |||
icon = icon.img, | |||
icon_link = icon.link, | |||
icon_color = icon.color, | |||
icon_size = icon.size, | |||
scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3), | |||
scale_type = prop.Scale and prop.Scale.Type | |||
} | |||
} | |||
table.insert(alt_boxes, alt_box) | |||
end | |||
end | |||
return alt_boxes | return alt_boxes | ||
| Line 452: | Line 475: | ||
local UPGRADE_COST_MAP = {1, 2, 5} | local UPGRADE_COST_MAP = {1, 2, 5} | ||
function get_upgrade_boxes(hero_key, ability_num) | function get_upgrade_boxes(hero_key, ability_num) | ||
local ability = utils.get_ability_card_data(hero_key, ability_num) | local ability = utils.get_ability_card_data(hero_key, ability_num) | ||
| Line 468: | Line 481: | ||
local frame = mw.getCurrentFrame() | local frame = mw.getCurrentFrame() | ||
local | local props = ability.Upgrades | ||
local upgrade_boxes = {} | local upgrade_boxes = {} | ||
for k, | for k, prop in pairs(props) do | ||
local description = lang.get_string( | local description = lang.get_string(prop.DescKey) | ||
-- Generate a description if there is no localized string | -- Generate a description if there is no localized string | ||
if (description == nil or description == '' | if (description == nil or description == '') then | ||
description = create_description( | description = create_description(prop, frame) | ||
end | end | ||
-- | -- Vary the font size based on the number of characters to prevent overflow | ||
local fontsize = '1rem' | |||
local | if #description > 60 and #description < 71 then | ||
fontsize = '0.95rem' | |||
elseif #description > 70 and #description < 91 then | |||
fontsize = '0.875rem' | |||
elseif #description > 90 then | |||
fontsize = '0.8rem' | |||
end | |||
local upgrade_box = frame:expandTemplate{ | local upgrade_box = frame:expandTemplate{ | ||
title = "Ability_card_v2/Card/UpgradeBox", | title = "Ability_card_v2/Card/UpgradeBox", | ||
args = { | args = { | ||
cost = UPGRADE_COST_MAP[k], | |||
description = frame:preprocess(description), | |||
scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3), | |||
scale_type = prop.Scale and prop.Scale.Type, | |||
fontsize = fontsize | |||
} | } | ||
} | } | ||
| Line 523: | Line 518: | ||
end | end | ||
--{{#invoke:AbilityData|get_info_alt|HERO_KEY|ABILITY_NUM|INFO_SECTION_INDEX}}-- | |||
function | p.get_info_alt = function(frame) | ||
local hero_key = frame.args[1] | |||
local ability_num = frame.args[2] | |||
local info_section_num = frame.args[3] | |||
local ability = utils.get_ability_card_data(hero_key, ability_num) | |||
if(ability == nil) then return "Ability Not Found" end | |||
local info_section = ability['Info'..info_section_num] | |||
-- some abilities have no info sections | |||
if info_section == nil then return '' end | |||
local props = info_section.Alt | |||
if props == nil then | |||
return '' | |||
end | |||
-- Concatenate multiple section boxes into a single output template | |||
local info_box_template = '' | |||
for k, prop in pairs(props) do | |||
-- Some props don't have values, as those come from upgrades | |||
-- For now, we will ignore these and only show data for the base ability | |||
if prop.Value and prop.Value ~= 0 then | |||
local icon = get_icon(prop.Type) | |||
section_box = frame:expandTemplate{ | |||
title = "Ability_card_v2/Card/AltBox", | |||
args = { | |||
key = prop.Key, | |||
value = prop.Value, | |||
icon = icon.img, | |||
icon_link = icon.link, | |||
icon_color = icon.color, | |||
icon_size = icon.size, | |||
scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3), | |||
scale_type = prop.Scale and prop.Scale.Type | |||
} | |||
} | |||
info_box_template = info_box_template .. section_box .. '\n' | |||
end | end | ||
end | end | ||
return | |||
return info_box_template | |||
end | end | ||
-- | --{{#invoke:AbilityData|get_upgrades|HERO_KEY|ABILITY_NUM}}-- | ||
p.get_upgrades = function(frame) | |||
local | local hero_key = frame.args[1] | ||
if | local ability_num = frame.args[2] | ||
local ability = utils.get_ability_card_data(hero_key, ability_num) | |||
if(ability == nil) then return "Ability Not Found" end | |||
local props = ability.Upgrades | |||
-- | -- Concatenate multiple section boxes into a single output template | ||
local | local upgrades_template = '' | ||
for k, prop in pairs(props) do | |||
for | local description = lang.get_string(prop.DescKey) | ||
if | |||
-- Generate a description if there is no localized string | |||
if (description == nil or description == '') then | |||
description = create_description(prop, frame) | |||
end | |||
-- Vary the font size based on the number of characters to prevent overflow | |||
local fontsize = '1rem' | |||
if #description > 60 and #description < 71 then | |||
fontsize = '0.95rem' | |||
elseif #description > 70 and #description < 91 then | |||
fontsize = '0.875rem' | |||
elseif #description > 90 then | |||
fontsize = '0.8rem' | |||
end | end | ||
box = frame:expandTemplate{ | |||
title = "Ability_card_v2/Card/UpgradeBox", | |||
args = { | |||
cost = UPGRADE_COST_MAP[k], | |||
description = frame:preprocess(description), | |||
scale_value = prop.Scale and commonutils.round_to_sig_fig(prop.Scale.Value, 3), | |||
scale_type = prop.Scale and prop.Scale.Type, | |||
fontsize = fontsize | |||
} | |||
} | |||
upgrades_template = upgrades_template .. box .. '\n' | |||
end | end | ||
return upgrades_template | |||
end | end | ||
function create_description(prop, frame) | |||
local description = '' | |||
function | for k, v in pairs(prop) do | ||
if type(v) ~= 'table' then | |||
local formatted_value = utils.format_value_with_prepost(k, v, frame) | |||
local attr_name = lang.get_string(k..'_label') | |||
description = description .. string.format('%s %s', formatted_value, attr_name) | |||
end | |||
end | end | ||
return description | |||
end | |||
end | p.get_attr_icon = function(frame) | ||
local attr_type = frame.args[1] | |||
local icon = get_icon(attr_type) | |||
return string.format('[[File:%s|%s|18px|link=%s]]', icon.img or '', icon.size or '', icon.link or '') | |||
end | |||
function get_icon(attr_type) | |||
local mappedAttr = ATTR_TYPE_ICON_MAP[attr_type] | |||
local img = 'GenericProperty.png' | |||
local link = '' | |||
local size = '' | |||
local color = 'Grey' | |||
if mappedAttr then | |||
img = mappedAttr.img | |||
link = mappedAttr.link | |||
size = mappedAttr.size | |||
color = mappedAttr.color or color | |||
end | |||
return {img=img, link=link, color=color, size=size} | |||
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 | |||
if | |||
end | end | ||
end | end | ||
return nil | |||
return | |||
end | end | ||
return p | return p | ||