Jump to content

The wiki is in the process of updating to the latest major game changes. Any contributions are appreciated!
Start here to learn how to edit and join our Discord server to make suggestions.

Module:AbilityData: Difference between revisions

From The Deadlock Wiki
No edit summary
Added pre and postfix strings to all values
Line 1: Line 1:
local lang_module = require "Module:Lang"
local lang = require "Module:Lang"
local p = {}
local p = {}
local data = mw.loadJsonData("Data:HeroData.json")
local data = mw.loadJsonData("Data:HeroData.json")
Line 43: Line 43:
name = ability.Name,
name = ability.Name,
name_link = name_link,
name_link = name_link,
description = ability.Description,
description = format_value_with_prepost("Description", ability.Description),
radius = ability.Radius,
radius = format_value_with_prepost("Radius", ability.Radius),
range = ability.AbilityCastRange,
range = format_value_with_prepost("AbilityCastRange", ability.AbilityCastRange),
ability_width = ability[width_key],
ability_width = format_value_with_prepost(width_key, ability[width_key]),
duration = ability.AbilityDuration,
duration = format_value_with_prepost("AbilityDuration", ability.AbilityDuration),
cooldown = ability.AbilityCooldown,
cooldown = format_value_with_prepost("AbilityCooldown", ability.AbilityCooldown),
effect1 = effects[1],
effect1 = effects[1],
effect2 = effects[2],
effect2 = effects[2],
Line 82: Line 82:
for key, value in pairs(ability) do
for key, value in pairs(ability) do
if not string_in_list(key, used_keys) then
if not string_in_list(key, used_keys) then
local frame = {}
local label = lang._get_string(string.format("%s_label",key))
frame.args = {string.format("%s_label", key), ""}
local label = lang_module.get_string(frame)
-- If response from lang_module includes "not found", it is an error.
if (label == nil) then  
-- So we should ignore that attribute (until we have a valid label)
return string.format("Missing label for key '%s'", key)
if (not string.find(label, 'not found')) then
local effect_value = string.format("'''%s''': %s", label, value)
table.insert(effects, effect_value)
end
end
local effect_label= string.format("'''%s''': %s", label, format_value_with_prepost(key, value))
table.insert(effects, effect_label)
end
end
end
end
return effects
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
return string.format("%s%s%s", prefix, value, postfix)
end
end



Revision as of 21:49, 15 September 2024

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 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 = {
			'Name', 'Description', 'Radius', 'AbilityCastRange', 'AbilityDuration',
			'AbilityDuration', 'AbilityCooldown', 'Upgrades', width_key
		}

		local effects = get_effects(ability, used_keys)
		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)
	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 
				return string.format("Missing label for key '%s'", key)
			end
			
			local effect_label= string.format("'''%s''': %s", label, format_value_with_prepost(key, value))
			table.insert(effects, effect_label)
		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
	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