Editing Module:Abilities-test/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 4: | Line 4: | ||
local p = {} | local p = {} | ||
local data = mw.loadJsonData(" | local data = mw.loadJsonData("User:Saag/AbilityCards.json") | ||
-- Maps attr type to an appropriate image and page link | -- Maps attr type to an appropriate image and page link | ||
| Line 12: | Line 12: | ||
bullet_armor_down = {img='Bullet_Armor.png', link='Damage_Resistance', color = 'NoColor'}, | bullet_armor_down = {img='Bullet_Armor.png', link='Damage_Resistance', color = 'NoColor'}, | ||
cast = {img='AttributeIconMaxChargesIncrease.png', link=''}, | cast = {img='AttributeIconMaxChargesIncrease.png', link=''}, | ||
charges = {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 | damage = {img='Damage_heart.png', link='', color = 'NoColor'}, -- 'NoColor' will apply no icon color and use the original image | ||
bullet_damage = {img='Bullet_damage.png', link='Bullet_Damage', color = 'NoColor'}, | bullet_damage = {img='Bullet_damage.png', link='Bullet_Damage', color = 'NoColor'}, | ||
| Line 19: | Line 19: | ||
health = {img='Health.png', link='Health', color = 'Green'}, | health = {img='Health.png', link='Health', color = 'Green'}, | ||
move_speed = {img='Move speed.png', link='Move Speed', color = 'Green'}, | move_speed = {img='Move speed.png', link='Move Speed', color = 'Green'}, | ||
range = {img='CastRange.png', link='Ability_Range | range = {img='CastRange.png', link='Ability_Range'}, | ||
tech_armor_up = {img='Spirit_Armor.png', link='Damage_Resistance', color = 'NoColor'}, | tech_armor_up = {img='Spirit_Armor.png', link='Damage_Resistance', color = 'NoColor'}, | ||
tech_damage = {img='AttributeIconTechShieldHealth.png', link='Spirit_Damage', color = 'NoColor',size = '12px'}, | tech_damage = {img='AttributeIconTechShieldHealth.png', link='Spirit_Damage', color = 'NoColor',size = '12px'}, | ||
distance = {img='AttributeIconTechRange.png', link='Ability_Range'}, | distance = {img='AttributeIconTechRange.png', link='Ability_Range'}, | ||
duration = {img='AttributeIconTechDuration.png', link='Ability Duration | duration = {img='AttributeIconTechDuration.png', link='Ability Duration'}, | ||
slow = {img='MoveSlow.png', link=' | slow = {img='MoveSlow.png', link=''}, | ||
melee_damage = {img='Melee damage.png', link='Melee Damage'}, | melee_damage = {img='Melee damage.png', link='Melee Damage'}, | ||
cooldown = {img='AttributeIconTechDuration.png', link='Ability Cooldown'}, | cooldown = {img='AttributeIconTechDuration.png', link='Ability Cooldown'}, | ||
combat_barrier = {img='Barrier.png', link='Barrier', color = 'Green'}, | combat_barrier = {img='Barrier.png', link='Barrier', color = 'Green'}, | ||
} | } | ||
-- TODO - replace this with utils file | -- TODO - replace this with utils file | ||
function | function get_ability_card_data(hero_key, ability_num) | ||
if(hero_key == nil) then return nil end | if(hero_key == nil) then return nil end | ||
return data[hero_key][tonumber(ability_num)] | return data[hero_key][tonumber(ability_num)] | ||
| Line 40: | Line 38: | ||
function get_hero_key(hero_name) | function get_hero_key(hero_name) | ||
for i, hero in pairs(data) do | for i, hero in pairs(data) do | ||
if hero["Name"] == hero_name then | if hero["Name"] == hero_name then | ||
| Line 73: | Line 66: | ||
-- Pulls data from Data:AbilityCards.json to populate Template:Ability card v2 | -- Pulls data from Data:AbilityCards.json to populate Template:Ability card v2 | ||
function build_ability_card(hero_key, ability_num, add_link, notes, notes_source_page) | function build_ability_card(hero_key, ability_num, add_link, notes, notes_source_page) | ||
local ability = | local ability = get_ability_card_data(hero_key, ability_num) | ||
if(ability == nil) then | if(ability == nil) then | ||
return 'Ability data not found for hero ' ..hero_key.. ' and num ' .. ability_num | return 'Ability data not found for hero ' ..hero_key.. ' and num ' .. ability_num | ||
| Line 106: | Line 99: | ||
table.insert(info1_main_boxes, 1, | table.insert(info1_main_boxes, 1, | ||
frame:expandTemplate{ | frame:expandTemplate{ | ||
title = " | title = "Ability_card_v2/Card/MainBox", | ||
args = { | args = { | ||
key = "HexDuration", | key = "HexDuration", | ||
| Line 144: | Line 137: | ||
title = "User:Saag/Sandbox/Ability_card_v2/Card", | title = "User:Saag/Sandbox/Ability_card_v2/Card", | ||
args = { | args = { | ||
id = | id = ability.Key, | ||
hero_key = hero_key, | hero_key = hero_key, | ||
ability_num = ability_num, | ability_num = ability_num, | ||
| Line 153: | Line 146: | ||
icon = lang.get_string(ability.Key, 'en') .. '.png', | icon = lang.get_string(ability.Key, 'en') .. '.png', | ||
channel_time = ability.Cast and ability.Cast.AbilityChannelTime | channel_time = ability.Cast and ability.Cast.AbilityChannelTime and ability.Cast.AbilityChannelTime.Value, | ||
channel_time_ss = ability.Cast and get_attr_ss(ability.Cast.AbilityChannelTime), | channel_time_ss = ability.Cast and get_attr_ss(ability.Cast.AbilityChannelTime), | ||
radius = ability.Radius and ability.Radius.Value, | radius = ability.Radius and ability.Radius.Value, | ||
| Line 164: | Line 157: | ||
cooldown =ability.AbilityCooldown and ability.AbilityCooldown.Value, | cooldown =ability.AbilityCooldown and ability.AbilityCooldown.Value, | ||
cooldown_ss = get_attr_ss(ability.AbilityCooldown), | cooldown_ss = get_attr_ss(ability.AbilityCooldown), | ||
charge_cooldown = ability.AbilityCooldownBetweenCharge | charge_cooldown = ability.AbilityCooldownBetweenCharge and ability.AbilityCooldownBetweenCharge.Value, | ||
charge_cooldown_ss = get_attr_ss(ability.AbilityCooldownBetweenCharge), | charge_cooldown_ss = get_attr_ss(ability.AbilityCooldownBetweenCharge), | ||
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], | ||
| Line 184: | Line 176: | ||
-- 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], | ||
| Line 199: | Line 190: | ||
-- Info section #3 defined in "Info3" attribute | -- Info section #3 defined in "Info3" attribute | ||
info3_desc = info3_desc, | info3_desc = info3_desc, | ||
info3_mainbox1 = info3_main_boxes[1], | info3_mainbox1 = info3_main_boxes[1], | ||
| Line 223: | Line 213: | ||
} | } | ||
} | } | ||
end | end | ||
| Line 262: | Line 244: | ||
local info_section_num = frame.args[3] | local info_section_num = frame.args[3] | ||
local ability = | local ability = 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 277: | Line 259: | ||
function get_info_desc(hero_key, ability_num, info_section_num) | function get_info_desc(hero_key, ability_num, info_section_num) | ||
local ability = | local ability = get_ability_card_data(hero_key, ability_num) | ||
if(ability == nil) then return "Ability Not Found" end | 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 293: | Line 275: | ||
function get_main_boxes(hero_key, ability_num, info_section_num) | function get_main_boxes(hero_key, ability_num, info_section_num) | ||
local ability = | local ability = get_ability_card_data(hero_key, ability_num) | ||
if(ability == nil) then return "Ability Not Found" end | if(ability == nil) then return "Ability Not Found" end | ||
| Line 299: | Line 281: | ||
-- some abilities have no info sections | -- some abilities have no info sections | ||
if info_section == nil then return '' end | if info_section == nil or info_section.Main == nil then return '' end | ||
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 | ||
local value = prop.Value | local value = prop.Value | ||
-- If it scales with melee damage, set the value using the hero's base melee to match in game visuals | -- If it scales with melee damage, set the value using the hero's base melee to match in game visuals | ||
| Line 328: | Line 302: | ||
local icon = get_icon(prop.Type) | local icon = get_icon(prop.Type) | ||
local main_box = frame:expandTemplate{ | |||
local | title = "User:Saag/Sandbox/Ability_card_v2/Card/MainBox", | ||
args = { | |||
title = prop.Title, | |||
key = prop.Key, | |||
value = 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, | |||
hide = value == 0 and "true" or "false", | |||
} | } | ||
} | |||
table.insert(main_boxes, main_box) | table.insert(main_boxes, main_box) | ||
end | end | ||
| Line 379: | Line 331: | ||
function get_alt_boxes(hero_key, ability_num, info_section_num) | function get_alt_boxes(hero_key, ability_num, info_section_num) | ||
local ability = | local ability = get_ability_card_data(hero_key, ability_num) | ||
if(ability == nil) then return "Ability Not Found" end | if(ability == nil) then return "Ability Not Found" end | ||
| Line 424: | Line 376: | ||
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 = | local ability = get_ability_card_data(hero_key, ability_num) | ||
if(ability == nil) then return "Ability Not Found" end | if(ability == nil) then return "Ability Not Found" end | ||
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 | ||
| Line 466: | Line 405: | ||
title = "User:Saag/Sandbox/Ability_card_v2/Card/UpgradeBox", | title = "User:Saag/Sandbox/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 479: | Line 417: | ||
return upgrade_boxes | return upgrade_boxes | ||
end | end | ||
function create_description(prop, frame) | function create_description(prop, frame) | ||
| Line 487: | Line 424: | ||
for k, v in pairs(prop) do | for k, v in pairs(prop) do | ||
if type(v) | if type(v) ~= 'table' then | ||
local formatted_value = utils.format_value_with_prepost(k, v, frame) | |||
local attr_name = lang.get_string(k..'_label') | |||
local key = formatted_value .. '|' .. attr_name -- Unique identifier | |||
-- Skip if this combination has already been added | |||
if not seen[key] then | |||
-- Add line break if this is not the first item | |||
if not first then | |||
description = description .. '<br>' | |||
end | |||
description = description .. string.format('%s %s', formatted_value, attr_name) | |||
first = false | |||
seen[key] = true -- Mark this combination as added | |||
end | |||
end | end | ||
end | end | ||
| Line 535: | Line 466: | ||
size = mappedAttr.size | size = mappedAttr.size | ||
color = mappedAttr.color or color | color = mappedAttr.color or color | ||
end | end | ||
return {img=img, link=link, color=color, size=size} | return {img=img, link=link, color=color, size=size} | ||
| Line 593: | Line 524: | ||
end | end | ||
local ability = | local ability = get_ability_card_data(hero_key, ability_num) | ||
if(ability == nil) then | if(ability == nil) then | ||
return 'Ability data not found for hero ' ..hero_key.. ' and num ' .. ability_num | return 'Ability data not found for hero ' ..hero_key.. ' and num ' .. ability_num | ||
| Line 614: | Line 545: | ||
return mw.getCurrentFrame():expandTemplate{ | return mw.getCurrentFrame():expandTemplate{ | ||
title = " | title = "Template:Ability card v2/Card", | ||
args = { | args = { | ||
hero_key = hero_key, | hero_key = hero_key, | ||
| Line 635: | Line 566: | ||
num_of_charges = ability.AbilityCharges and ability.AbilityCharges.Value, | num_of_charges = ability.AbilityCharges and ability.AbilityCharges.Value, | ||
notes = notes, | notes = notes, | ||
notes_source_page = notes_source_page | notes_source_page = notes_source_page | ||
} | } | ||
} | } | ||