Module:ItemTables: Difference between revisions

From The Deadlock Wiki
Jump to navigation Jump to search
moving function out to be accessible for other modules
cleanup, remove local functions in favor for main module passing functionality
Line 1: Line 1:
local p = {};
local p = {};
local data = mw.loadJsonData("Data:ItemData.json")
local data = mw.loadJsonData("Data:ItemData.json")
local get_cost = require("Module:ItemData")._get_cost


-- returns the table of a specific item
-- returns the table of a specific item
Line 42: Line 43:
end
end


 
local function get_type(item_name)
 
--{{#invoke:Sandbox/Sylphoid|get_prop|ITEM_NAME|PROPERTY}}--
--check Data:ItemData.json for properties
p.get_prop = function(frame)
local item_name = frame.args[1]
local property = frame.args[2]
local item = get_json_item(item_name)
if(item == nil) then return "Item Not Found" end
return Deepcopy(item[property])
end
 
local function get_cost(item_name)
local item = get_json_item(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 == nil) then return "<span style=\"color:red;\">Item Not Found.</span>" end
local cost = 0
if (item["Slot"] == "Weapon") then
local cur_item = item
return "Weapon"
repeat
elseif (item["Slot"] == "Armor") then
cost = cost + cur_item["Cost"]
return "Vitality"
if(cur_item["Components"] == nil) then
elseif (item["Slot"] == "Tech") then
break
return "Spirit"
end
else
cur_item = data[cur_item["Components"][1]]
return nil
until cur_item == nil
end
 
return Format(cost)
end
end


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


local link_patterns = {}
local link_patterns = {}
Line 110: Line 95:
local createTable = mw.html.create('table')
local createTable = mw.html.create('table')
:addClass('wikitable sortable')
:addClass('wikitable sortable')
:tag('caption'):wikitext("List of Items"):done()
local createTableRow = mw.html.create('tr')
local createTableRow = mw.html.create('tr')
Line 115: Line 101:
:tag('th'):wikitext('Name'):done()
:tag('th'):wikitext('Name'):done()
:tag('th'):wikitext('Cost'):done()
:tag('th'):wikitext('Cost'):done()
:tag('th'):wikitext('Category'):done()
createTable:node(createTableRow)
createTable:node(createTableRow)




for internalName, statName in pairs(data) do --statName is the key. go through whole table. in this case itemName can be upgrade_improved_stamina
for internalName, statName in pairs(data) do --statName is the key. go through whole table. in this case itemName can be upgrade_improved_stamina
Line 136: Line 122:
:tag('td'):wikitext(display):done()
:tag('td'):wikitext(display):done()
:tag('td'):wikitext(get_cost(statName["Name"])):done()
:tag('td'):wikitext(get_cost(statName["Name"])):done()
:tag('td'):wikitext(get_type(statName["Name"])):done()
table.insert(requirements, tableData)
table.insert(requirements, tableData)

Revision as of 23:03, 28 September 2024

Module used to create item tables with Template:Item stat table.

To add a new stat, add the name of the stat as "friendly to internal", followed by the property as listed on Data:ItemData.json, as well as adding the property to the "local unitSuffix" list corresponding to its suffix.


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

-- returns the table of a specific item
function get_json_item(name)
	for i,v in pairs(data) do
		if (v["Name"] == name) then
			return v
		end
	end
	return nil
end

-- Adds commas delimiter to the thousands place
function Format(amount)
    local formatted = amount
    while true do
        formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
        if (k == 0) then
            break
        end
    end
    return formatted
end

--- Copies original table with its children as deep as possible. Does not handle metatables. (Copy is needed because Lua passes by reference, not value)
-- @function   Deepcopy
-- @param      {n-D table}
-- @return     {n-D table}
function Deepcopy(orig)
    local orig_type = type(orig)
    local copy
    if orig_type == 'table' then
        copy = {}
        for orig_key, orig_value in next, orig, nil do
            copy[Deepcopy(orig_key)] = Deepcopy(orig_value)
        end
    else
        copy = orig
    end
    return copy
end

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

p.get_type = function(frame)
	local item_name = frame.args[1]
	return get_type(item_name)
end


local link_patterns = {}
link_patterns["BonusClipSizePercent"] = { "[Aa]mmo" }
link_patterns["BulletLifestealPercent"] = { "[Bb]ullet [Ll]ifesteal" }
link_patterns["BonusHealth"] = { "[Hh]ealth" }
link_patterns["BonusHealthRegen"] = { "[Hh]ealth [Rr]egen" }
link_patterns["BonusFireRate"] = { "[Ff]ire [Rr]ate" }

function FriendlyNames(desc)
	for link, patterns in pairs(link_patterns) do
		for i, v in ipairs(patterns) do
    		local a, b = desc:find(v)
				if a then
        			desc = link
        		break
    		end
    	end
	end
	return desc
end

p.itemPropTable = function(frame)
	local TableValues = {}
	local requirements = {}
	local listofItems = ""
	local property = frame.args[1] or mw.title.getCurrentTitle().text
	property = FriendlyNames(property)
	-- local item = get_json_item(item_name)
	-- if(item == nil) then return "Item Not Found what" end
	
	local createTable = mw.html.create('table')
			:addClass('wikitable sortable')
			:tag('caption'):wikitext("List of Items"):done()
			
	local createTableRow = mw.html.create('tr')
	createTableRow
		:tag('th'):wikitext('Name'):done()
		:tag('th'):wikitext('Cost'):done()
		:tag('th'):wikitext('Category'):done()
		
	createTable:node(createTableRow)


	for internalName, statName in pairs(data) do --statName is the key. go through whole table. in this case itemName can be upgrade_improved_stamina
		
		local display = frame:expandTemplate{
		title = 'ItemIcon',
		args = {
			statName["Name"]
			}
		}
		
			if(statName[property] ~= nil and statName["Name"] ~= nil) then
				listofItems = listofItems .. statName["Name"] .. "<br/>"
					
				local tableData = mw.html.create('tr')
				tableData
					:tag('td'):wikitext(display):done()
					:tag('td'):wikitext(get_cost(statName["Name"])):done()
					:tag('td'):wikitext(get_type(statName["Name"])):done()
					
				table.insert(requirements, tableData)
				--	TableValues = table.insert(TableValues, statName["Name"]) -- i may want to make a table first, so it includes weapon and cost to make it sortable.
			end
		
	end	
	
	for _, row in ipairs(requirements) do
		createTableRow:node(row)
	end
	--createTable:node(createTableRow)
	return tostring(createTable)
	--return listofItems -- this is just a string list, same thing as createTable. delete this when line when finished
	--return table.concat(TableValues, ", ")

end

return p