Module:AbilityData: Difference between revisions

From Deadlock Wiki
Jump to navigation Jump to search
Saag (talk | contribs)
No edit summary
Saag (talk | contribs)
m Fixed get_ability_name
 
(43 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local lang = require "Module:Lang"
local data = mw.loadJsonData("Data:AbilityCards.json")
local utils = require "Module:Utilities"


local p = {}
local p = {}
local data = mw.loadJsonData("Data:AbilityCards.json")


local ATTR_TYPE_ICON_MAP = {
bullet_armor_up = 'Bullet_Armor.png',
charges = 'AttributeIconMaxChargesIncrease.png',
fire_rate = 'Fire Rate.png',
healing = 'Health regen.png',
health = 'Extra Health.png',
range = 'CastRange.png',
tech_armor_up = 'Spirit_Armor.png',
tech_damage = 'AttributeIconTechShieldHealth.png',
distance = 'AttributeIconTechRange.png',
duration = 'AttributeIconTechDuration.png',
slow = 'MoveSlow.png'
}
-- returns the table of a specific item
-- returns the table of a specific item
function get_ability(hero_name, ability_num)
function get_ability(hero_key, ability_num)
local hero_key = get_hero_key(hero_name)
local ui_data = data[hero_key]
if(hero_key == nil) then return "Hero Not Found" end
if(ui_data == nil) then return "Hero Not Found" end
return data[hero_key][tonumber(ability_num)]
return ui_data[tonumber(ability_num)]
end
end


function get_hero_key(hero_name)
--{{#invoke:AbilityData|get_ability_name|HERO_NAME|ABILITY_NUM}}--
for i, hero in pairs(data) do
p.get_ability_name = function(frame)
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}}--
p.get_ability_card = 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 add_link = frame.args[3]
local notes = frame.args[4]
local ability = get_ability(hero_name, ability_num)
if(ability == nil) then
return 'Ability data not found for hero ' ..hero_name.. ' and num ' .. ability_num
end
local name_link = nil
if add_link == 'true' then
name_link = string.format("%s#(%s)_%s", hero_name, ability_num, ability.Name)
end
return frame:expandTemplate{
title = "Ability card v2",
args = {
hero_name = hero_name,
ability_num = ability_num,
name = lang._get_string(ability.Key),
name_link = name_link,
description = lang._get_string(ability.DescKey),
radius = ability.Radius and ability.Radius.Value,
range = ability.AbilityCastRange and ability.AbilityCastRange.Value,
duration = ability.AbilityDuration and ability.AbilityDuration.Value,
-- ability_width = format_value_with_prepost(width_key, ability[width_key]),
cooldown =ability.AbilityCooldown and ability.AbilityCooldown.Value,
charge_cooldown = ability.AbilityCooldownBetweenCharge and ability.AbilityCooldownBetweenCharge.Value,
num_of_charges = ability.AbilityCharges and ability.AbilityCharges.Value,
notes = notes
}
}
end
--{{#invoke:AbilityData|get_info_main|HERO_NAME|ABILITY_NUM|INFO_SECTION_INDEX}}--
p.get_info_main = function(frame)
local hero_name = frame.args[1]
local ability_num = frame.args[2]
local info_section_num = frame.args[3]
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
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.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 ~= 0 then
section_box = frame:expandTemplate{
title = "Ability_card_v2/MainBox",
args = {
  key = prop.Key,
  value = prop.Value,
  icon = ATTR_TYPE_ICON_MAP[prop.Type] or 'GenericProperty.png',
  icon_color = prop.Type == 'tech_damage' and 'Purple' or 'Grey',
  scale_value = prop.Scale and utils.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


--{{#invoke:AbilityData|get_info_alt|HERO_NAME|ABILITY_NUM|INFO_SECTION_INDEX}}--
--Write's an ability link for a given ability name in english
p.get_info_alt = function(frame)
--Siphon Life --> Abrams#(1)_Siphon_Life
local hero_name = frame.args[1]
function ability_to_hyperlink(ability_name_to_search)
local ability_num = frame.args[2]
if (ability_name_to_search == nil) then return "No ability name provided" end
local info_section_num = frame.args[3]
local hero_name
local ability_name
local ability = get_ability(hero_name, ability_num)
if(ability == nil) then return "Ability Not Found" end
local info_section = ability['Info'..info_section_num]
-- Iterate heros
for hero_key, hero_data in pairs(data) do
-- some abilities have no info sections
-- Iterate abilities
if info_section == nil then return '' end
hero_name = hero_data["Name"]
for ability_num, ability_data in pairs(hero_data) do
local props = info_section.Alt
if (ability_num ~= "Name") then
ability_name = ability_data["Name"]
-- Concatenate multiple section boxes into a single output template
if (ability_name == ability_name_to_search) then
local info_box_template = ''
-- Ability number and hero found
for k, prop in pairs(props) do
-- "Siphon Life" > "Siphon_Life"
-- Some props don't have values, as those come from upgrades
ability_name = ability_name:gsub(" ", "_")
-- For now, we will ignore these and only show data for the base ability
return hero_name .. "#(" .. ability_num .. ")_" .. ability_name
if prop.Value then
end
section_box = frame:expandTemplate{
end
title = "Ability_card_v2/AltBox",
args = {
  key = prop.Key,
  value = prop.Value,
  icon = ATTR_TYPE_ICON_MAP[prop.Type] or 'GenericProperty.png',
    icon_color = prop.Type == 'tech_damage' and 'Purple' or 'Grey',
  scale_value = prop.Scale and utils.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 info_box_template
return nil
end
end


local UPGRADE_COST_MAP = {1, 2, 5}
--Writes an ability's icon from its name
--{{#invoke:AbilityData|get_upgrades|HERO_NAME|ABILITY_NUM}}--
--Shoulder Charge --> [[File:Shoulder Charge.png|link=Abrams#(1)_Shoulder_Charge|size=20px]] [[Abrams...|Shoulder Charge]]
p.get_upgrades = function(frame)
p.write_ability_icon = function(frame)
local hero_name = frame.args[1]
local ability_name = frame.args[1]
local ability_num = frame.args[2]
local custom_display_text = frame.args[2]
local ability = get_ability(hero_name, ability_num)
if (custom_display_text == nil or custom_display_text == "") then custom_display_text = ability_name end
if(ability == nil) then return "Ability Not Found" end
local props = ability.Upgrades
-- Concatenate multiple section boxes into a single output template
local upgrades_template = ''
for k, prop in pairs(props) do
local description = lang._get_string(prop.DescKey)
-- Generate a description if there is no localized string
if description == nil then
description = create_description(prop, frame)
end
local fontsize = '1rem'
if #description > 70 and #description < 91 then
fontsize = '0.875rem'
elseif #description > 90 then
fontsize = '0.8rem'
end
box = frame:expandTemplate{
title = "Ability_card_v2/UpgradeBox",
args = {
  cost = UPGRADE_COST_MAP[k],
  description = description,
  scale_value = prop.Scale and utils.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
return upgrades_template
end
 
function create_description(prop, frame)
local description = ''
for k, v in pairs(prop) do
local formatted_value = 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
return description
local size = 20
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
 
-- Add prefix and postfix labels to a value. Eg. "32" -> "32s"
function format_value_with_prepost(key, value, frame)
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
local hyperlink = ability_to_hyperlink(ability_name)
if (prefix == nil) then prefix = '' end
if (hyperlink == nil) then return "Ability " .. ability_name .. " not found" end
if (postfix == nil) then postfix = '' end
-- If string ends with 'm', then set the postfix to 'm' and remove it
local icon = "[[File:" .. ability_name .. ".png|link=" .. hyperlink .. "|" .. size .. "px]]"
if utils.string_endswith(tostring(value), 'm') then
icon = '<span style="position: relative; bottom: 2px; filter: brightness(0) saturate(100%);">' .. icon .. '</span>'
value = tonumber(value:sub(1, -2))
postfix = 'm'
end
if (prefix == '{s:sign}') then
local link = "[[" .. hyperlink .. "|" .. custom_display_text .. "]]"
if value < 0 then
prefix = '-'
else
prefix = '+'
end
-- if no prefix on positive value, add a '+'
else
if value > 0 then
prefix = '+'
end
end
value_and_uom = frame:expandTemplate{
return icon .. " " .. link
title = 'Template:ValueAndUom',
args = {
prefix..value,
postfix,
uom_style = 'font-size: 12px; color: #9C9C9C'
}
}
 
return value_and_uom
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 17:25, 26 October 2024

Deprecated[edit source]

This module is being replaced by multiple modules in Module:Abilities. Any new functions should be created there


local data = mw.loadJsonData("Data:AbilityCards.json")

local p = {}

-- returns the table of a specific item
function get_ability(hero_key, ability_num)
	local ui_data = data[hero_key]
	if(ui_data == nil) then return "Hero Not Found" end
	return ui_data[tonumber(ability_num)]
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

--Write's an ability link for a given ability name in english
--Siphon Life --> Abrams#(1)_Siphon_Life
function ability_to_hyperlink(ability_name_to_search)
	if (ability_name_to_search == nil) then return "No ability name provided" end
	local hero_name
	local ability_name
	
	-- Iterate heros
	for hero_key, hero_data in pairs(data) do
		-- Iterate abilities
		hero_name = hero_data["Name"]
		for ability_num, ability_data in pairs(hero_data) do
			if (ability_num ~= "Name") then
				ability_name = ability_data["Name"]
				if (ability_name == ability_name_to_search) then
					-- Ability number and hero found
					-- "Siphon Life" > "Siphon_Life"
					ability_name = ability_name:gsub(" ", "_")
					return hero_name .. "#(" .. ability_num .. ")_" .. ability_name
				end
			end
		end
	end
	
	return nil
end

--Writes an ability's icon from its name
--Shoulder Charge --> [[File:Shoulder Charge.png|link=Abrams#(1)_Shoulder_Charge|size=20px]] [[Abrams...|Shoulder Charge]]
p.write_ability_icon = function(frame)
	local ability_name = frame.args[1]
	local custom_display_text = frame.args[2]
	if (custom_display_text == nil or custom_display_text == "") then custom_display_text = ability_name end
	
	local size = 20
	
	local hyperlink = ability_to_hyperlink(ability_name)
	if (hyperlink == nil) then return "Ability " .. ability_name .. " not found" end
	
	local icon = "[[File:" .. ability_name .. ".png|link=" .. hyperlink .. "|" .. size .. "px]]"
	icon = '<span style="position: relative; bottom: 2px; filter: brightness(0) saturate(100%);">' .. icon .. '</span>'
	
	local link = "[[" .. hyperlink .. "|" .. custom_display_text .. "]]"
	
	return icon .. " " .. link
end

return p