Module:ItemData: Difference between revisions

From The Deadlock Wiki
Jump to navigation Jump to search
cleanup iters, fix the count
"verified testing", just removed param so function has no user input
Line 151: Line 151:
end
end


function p.get_headcount(frame)
function p.get_headcount()
local iter = 0
local iter = 0
local propertyName = frame.args[1]
local tbl = get_similar_items("Disabled")
local tbl = get_similar_items(propertyName)
for _, v in ipairs(tbl) do
for _, v in ipairs(tbl) do
if (v["Disabled"] == false and v["Name"] ~= nil) then
if (v["Disabled"] == false and v["Name"] ~= nil) then

Revision as of 22:06, 3 October 2024

Loads data from Data:ItemData.json

Usage

{{#invoke:ItemData|FUNCTION_NAME|PARAMETER1|PARAMETER2}}

Functions

  • get_cost|ITEM_NAME
    • Returns the total cost including components.
  • get_type|ITEM_NAME
    • The ItemData.json has different names for each category: Weapon = Weapon, Vitality = Armor, Spirit = Tech. This function will return Weapon, Vitality, or Spirit
  • is_active|ITEM_NAME
    • returns true/false
  • get_prop|ITEM_NAME|PROPERTY
    • Returns the value of one of the item's properties. Check the json file for item properties.
    • Automatically appends "%" to percentage-based properties and shows scaling templates (Boon/Ss) when applicable.
  • get_codename|ITEM_NAME
    • Returns the item's codename in game files
  • get_component_name|ITEM_NAME
    • Returns the display name of the item's first component (if any)
  • get_headcount
    • Returns the number of items that are not disabled
  • get_builds_into|ITEM_NAME
    • Returns a formatted list of items that use this item as a component, rendered with ItemIcon templates (e.g., "ItemIcon templates separated by commas and 'and'")
  • get_builds_into_count|ITEM_NAME
    • Returns the number of items that use this item as a component
  • get_builds_into_name|ITEM_NAME|INDEX
    • Returns the display name of the nth item (1-indexed) that uses this item as a component

Example

To get the total cost of Boundless Spirit you'd type:

{{#invoke:ItemData|get_cost|Boundless Spirit}}

and it would return:

8,800

To get Boundless Spirit's Spirit Power:

{{#invoke:ItemData|get_prop|Boundless Spirit|TechPower}}

and it would return:

30

If an item key (English name) has been provided, the item name can be replaced by:

{{#var:item_key_or_en}}

for example:

{{#invoke:ItemData|get_prop|{{#var:item_key_or_en}}|TechPower}}

To get Boundless Spirit's codename:

{{#invoke:ItemData|get_codename|Boundless Spirit}}

and it would return:

Script error: The function "get_codename" does not exist.

To find what items Debuff Reducer builds into:

{{#invoke:ItemData|get_builds_into|Debuff Reducer}}

and it would return:

Script error: The function "get_builds_into" does not exist.


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

---------------------------------------- Utility functions

-- Returns the table of a specific item
-- @function   get_json_item
-- @param      {string}
-- @return     {table}
local function get_json_item(name)
	for _, v in pairs(data) do
		if (v["Name"] == name) then
			return v
		end
	end
	return nil
end

-- Returns an array of item tables that have the same properties
-- @function   get_similar_items
-- @param      {string}
-- @return     {array of tables}
local function get_similar_items(property)
	local similarItems = {}
	for _, v in pairs(data) do
		if (v[property] ~= nil) then
			table.insert(similarItems, v)
		end
	end
	return similarItems
end

-- Adds commas delimiter to the thousands place
local lang = mw.language.getContentLanguage()
local function Format(amount)
    local formatted = amount
    return lang:formatNum(tonumber(formatted))
end

--- Get cost of an item 
-- @function   get_cost
-- @param      {string}
-- @return     {number}
local function get_cost(item_name)
	local item = get_json_item(item_name)
	if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
	
	local cost = 0
	local cur_item = item
	repeat
		cost = cost + cur_item["Cost"]
		if(cur_item["Components"] == nil) then
			break
		end
		cur_item = data[cur_item["Components"][1]]
	until cur_item == nil

	return Format(cost)
end

--- Get type/slot/category of an item 
-- @function   get_type
-- @param      {string}
-- @return     {string}
local function get_type(item_name)
	local item = get_json_item(item_name)
	if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
	
	if (item["Slot"] == "Weapon") then
		return "Weapon"
	elseif (item["Slot"] == "Armor") then
		return "Vitality"
	elseif (item["Slot"] == "Tech") then
		return "Spirit"
	else 
		return nil
	end

end

---------------------------------------- Invocable functions

--- {{#invoke:ItemData|get_cost|ITEM_NAME}} access point
p.get_cost = function(frame)
	local item_name = frame.args[1]
	return get_cost(item_name)
end

-- Module access point
function p._get_cost(a)
	a = tostring(a) or '0'
	return get_cost(a)
end

-- {{#invoke:ItemData|get_type|ITEM_NAME}} access point
p.get_type = function(frame)
	local item_name = frame.args[1]
	return get_type(item_name)
end

function p._get_type(a)
	a = tostring(a) or ""
	return get_type(a)
end

--{{#invoke:ItemData|is_active|ITEM_NAME}}--
p.is_active = function(frame)
	local item_name = frame.args[1]
	local item = get_json_item(item_name)
	if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
	
	if (item["Activation"] == "Passive") then
		return	false
	else 
		return true
	end
end

--{{#invoke:ItemData|get_prop|ITEM_NAME|PROPERTY}}--
--check Data:ItemData.json for properties
p.get_prop = function(frame)
	local tableValues = {}
	local item_name = frame.args[1]
	local property = frame.args[2]
	local item = get_json_item(item_name)
	if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
	if(type(item[property]) == "table") then
		for i,v in pairs(item[property]) do
			local tableValues = table.insert(tableValues, v)
		end
		return table.concat(tableValues, ", ")
	end
	return item[property]
end


p.get_component_name = function(frame)
	local item_name = frame.args[1]
	local item = get_json_item(item_name)
	if(item == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
	
	local components = item['Components']
	--return empty string if no component found
	if(components == nil) then return nil end
	
	local component_key = components[1]
	local component = data[component_key]
	if (component == nil) then return nil end
	
	return component['Name']
end

function p.get_headcount()
	local iter = 0
	local tbl = get_similar_items("Disabled")
	for _, v in ipairs(tbl) do
		if (v["Disabled"] == false and v["Name"] ~= nil) then
			iter = iter + 1	
		end
	end
	return iter
end

return p