Module:AbilityData

From Deadlock Wiki
Revision as of 13:46, 23 September 2024 by Saag (talk | contribs) (added localization of names and descriptions)
Jump to navigation Jump to search

Deprecated

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


local lang = require "Module:Lang"
local utils = require "Module:Utilities"

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

local ATTR_TYPE_ICON_MAP = {
	charges = 'AttributeIconMaxChargesIncrease.png',
	fire_rate = 'Fire Rate.png',
	healing = 'Health regen.png',
	health = 'Extra Health.png',
	tech_damage = 'AttributeIconTechShieldHealth.png',
	distance = 'AttributeIconTechRange.png',
	duration = 'AttributeIconTechDuration.png',
	slow = 'MoveSlow.png'
}
-- 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][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|ADD_LINK}}--
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 data not found for hero ' ..hero_name.. ' and num ' .. ability_num
	end

	local name_link = string.format("%s#(%s)_%s", hero_name, ability_num, ability.Name)
	return frame:expandTemplate{
		title = "User:Saag/Sandbox/AbilityCard",
		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,
			-- 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
		}
	}
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)
	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.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 = "User:Saag/Sandbox/AbilityCard/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

--{{#invoke:AbilityData|get_info_alt|HERO_NAME|ABILITY_NUM|INFO_SECTION_INDEX}}--
p.get_info_alt = 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)
	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
	
	-- 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 then
			section_box = frame:expandTemplate{
				title = "User:Saag/Sandbox/AbilityCard/AltBox",
				args = {
				  key = prop.Key,
				  value = prop.Value,
				  icon = ATTR_TYPE_ICON_MAP[prop.Type] or 'GenericProperty.png',
				  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

local UPGRADE_COST_MAP = {1, 2, 5}
--{{#invoke:AbilityData|get_upgrades|HERO_NAME|ABILITY_NUM}}--
p.get_upgrades = 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
	
	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)
		box = frame:expandTemplate{
			title = "User:Saag/Sandbox/AbilityCard/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
			}
		}
		upgrades_template = upgrades_template .. box .. '\n'
	end
	
	return upgrades_template
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)
	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