Module:ItemTables: Difference between revisionsGive feedback
Jump to navigation
Jump to search
Gammaton32 (talk | contribs) No edit summary |
Instead of removing duplicates, keep all stats and use rowspan to merge the item info across multiple rows. Added FervorMovespeed to move speed |
||
| Line 4: | Line 4: | ||
local get_type = require("Module:ItemData")._get_type | local get_type = require("Module:ItemData")._get_type | ||
local commas = require("Module:Addcommas") | local commas = require("Module:Addcommas") | ||
--- Copies original table with its children as deep as possible. Does not handle metatables. (Copy is needed because Lua passes by reference, not value) | --- Copies original table with its children as deep as possible. Does not handle metatables. (Copy is needed because Lua passes by reference, not value) | ||
| Line 73: | Line 46: | ||
friendly_to_internal["bullet lifesteal"] = { "BulletLifestealPercent", "ActiveBonusLifesteal" } | friendly_to_internal["bullet lifesteal"] = { "BulletLifestealPercent", "ActiveBonusLifesteal" } | ||
friendly_to_internal["spirit lifesteal"] = { "AbilityLifestealPercentHero" } | friendly_to_internal["spirit lifesteal"] = { "AbilityLifestealPercentHero" } | ||
friendly_to_internal["move speed"] = { "BonusMoveSpeed", "ActiveBonusMoveSpeed" } | friendly_to_internal["move speed"] = { "BonusMoveSpeed", "ActiveBonusMoveSpeed", "FervorMovespeed"} | ||
friendly_to_internal["sprint speed"] = { "BonusSprintSpeed" } | friendly_to_internal["sprint speed"] = { "BonusSprintSpeed" } | ||
friendly_to_internal["movement slow"] = { "SlowPercent", "MovementSpeedSlow" } | friendly_to_internal["movement slow"] = { "SlowPercent", "MovementSpeedSlow" } | ||
| Line 138: | Line 111: | ||
"GroundDashReductionPercent" | "GroundDashReductionPercent" | ||
}, | }, | ||
["m/s"] = { "BonusMoveSpeed", "ActiveBonusMoveSpeed", "BonusSprintSpeed" }, | ["m/s"] = { "BonusMoveSpeed", "ActiveBonusMoveSpeed", "BonusSprintSpeed", "FervorMovespeed"}, | ||
[" HP"] = {"CombatBarrier", "GuardianWardCombatBarrier", "VexBarrierCombatBarrier"} | [" HP"] = {"CombatBarrier", "GuardianWardCombatBarrier", "VexBarrierCombatBarrier"} | ||
} | } | ||
| Line 172: | Line 145: | ||
-- @return {string} The formatted wikitext string. | -- @return {string} The formatted wikitext string. | ||
local function signPrefix(value) | local function signPrefix(value) | ||
if value == nil then | if value == nil then | ||
return "" | return "" | ||
end | end | ||
value = tostring(value) | value = tostring(value) | ||
value = value:gsub("m", "") | value = value:gsub("m", "") | ||
value = tonumber(value) | value = tonumber(value) | ||
if not value then | if not value then | ||
return "" | return "" | ||
end | end | ||
if (value >= 0) then | if (value >= 0) then | ||
return "+<b>" .. value .. "</b>" | return "+<b>" .. value .. "</b>" | ||
| Line 207: | Line 169: | ||
local requirements = {} | local requirements = {} | ||
local listofKeysTable = {} | local listofKeysTable = {} | ||
local property = frame:getParent().args[1] or mw.title.getCurrentTitle().text | local property = frame:getParent().args[1] or mw.title.getCurrentTitle().text | ||
local copyVar = property | local copyVar = property | ||
-- Get internal keys corresponding to the friendly property name | |||
listofKeysTable = friendlyNames(property) | listofKeysTable = friendlyNames(property) | ||
local filteredData = {} | local filteredData = {} | ||
for _, v in pairs(data) do | |||
for _, t in ipairs(listofKeysTable) do | |||
if v[t] ~= nil and v["IsDisabled"] == false and v["Name"] ~= nil and v[t] ~= "0" and v[t] ~= "0m" and v[t] ~= "" then | |||
table.insert(filteredData, v) | |||
break | |||
end | |||
end | |||
end | |||
table.sort(filteredData, defaultSort()) | table.sort(filteredData, defaultSort()) | ||
local createTable = mw.html.create('table') | local createTable = mw.html.create('table') | ||
:addClass('wikitable sortable') | |||
:tag('caption'):wikitext("List of items"):done() | |||
local soulIcon = frame:expandTemplate{ title = 'Souls' } | local soulIcon = frame:expandTemplate{ title = 'Souls' } | ||
local createTableHeader = mw.html.create('tr') | local createTableHeader = mw.html.create('tr') | ||
createTableHeader | createTableHeader | ||
| Line 227: | Line 199: | ||
:tag('th'):wikitext('Category'):done() | :tag('th'):wikitext('Category'):done() | ||
:tag('th'):wikitext('Stat change'):done() | :tag('th'):wikitext('Stat change'):done() | ||
createTable:node(createTableHeader) | createTable:node(createTableHeader) | ||
-- | -- Track rowspans for items with multiple stats | ||
for | local rowspanTracker = {} | ||
for _, itemName in ipairs(filteredData) do | |||
local display = frame:expandTemplate{ | |||
title = 'ItemIcon', | |||
args = { itemName["Name"] } | |||
} | |||
local statCount = 0 | |||
for _, t in pairs(listofKeysTable) do | |||
if(itemName[t] ~= nil and itemName[t] ~= "0" ) then | if(itemName[t] ~= nil and itemName[t] ~= "0") then | ||
statCount = statCount + 1 | |||
end | |||
end | |||
if statCount == 0 then statCount = 1 end | |||
rowspanTracker[itemName["Name"]] = statCount | |||
local firstStat = true | |||
for _, t in pairs(listofKeysTable) do | |||
if(itemName[t] ~= nil and itemName[t] ~= "0") then | |||
-- Handles complex stat values from the JSON data. | -- Handles complex stat values from the JSON data. | ||
-- A stat can be a simple value (e.g., "BonusMoveSpeed": "1") or a table containing | -- A stat can be a simple value (e.g., "BonusMoveSpeed": "1") or a table containing | ||
-- scaling info (e.g., "BonusFireRate": { "Value": 10, "Scale": ... }). | -- scaling info (e.g., "BonusFireRate": { "Value": 10, "Scale": ... }). | ||
-- This code checks if the stat is a table and extracts the base numerical value from its 'Value' key. | -- This code checks if the stat is a table and extracts the base numerical value from its 'Value' key. | ||
local statValue = itemName[t] | |||
if type(statValue) == 'table' and statValue.Value ~= nil then | |||
statValue = statValue.Value | |||
end | |||
copyVar = copyVar:gsub("^%l", string.upper) | |||
local categoryDisplay | |||
if itemName["Slot"] == "Armor" then | |||
categoryDisplay = frame:expandTemplate{ | |||
title = 'ItemType', | |||
args = { "Armor", "Vitality" } | |||
} | |||
elseif itemName["Slot"] == "Tech" then | |||
categoryDisplay = frame:expandTemplate{ | |||
title = 'ItemType', | |||
args = { "Tech", "Spirit" } | |||
} | |||
else | |||
categoryDisplay = frame:expandTemplate{ | |||
title = 'ItemType', | |||
args = { "Weapon", "Weapon" } | |||
} | |||
end | |||
local tableData = mw.html.create('tr') | |||
if firstStat then | |||
tableData | tableData | ||
:tag('td'):wikitext(display):done() | :tag('td'):attr('rowspan', statCount):wikitext(display):done() | ||
:tag('td'):wikitext(commas._add(get_cost(itemName["Name"]))):done() | :tag('td'):attr('rowspan', statCount):wikitext(commas._add(get_cost(itemName["Name"]))):done() | ||
:tag('td'): | :tag('td'):attr('rowspan', statCount):wikitext(categoryDisplay):done() | ||
firstStat = false | |||
end | end | ||
tableData:tag('td'):wikitext(signPrefix(statValue) .. appendSuffix(t) .. " " .. copyVar):done() | |||
table.insert(requirements, tableData) | |||
end | end | ||
end | end | ||
end | |||
for _, row in ipairs(requirements) do | for _, row in ipairs(requirements) do | ||
createTable:node(row) | createTable:node(row) | ||
end | end | ||
return tostring(createTable) | return tostring(createTable) | ||
end | end | ||
return p | return p | ||