Module:HeroDataArrays: Difference between revisionsGive feedback
Jump to navigation
Jump to search
Reload table alphabetical sort |
By default, sort all tables by english hero name |
||
| Line 57: | Line 57: | ||
-- Pull data | -- Pull data | ||
local heroHealthData = heroDataArray({"Name", "MaxHealth", "LevelScaling>MaxHealth"}) | local heroHealthData = heroDataArray({"Name", "MaxHealth", "LevelScaling>MaxHealth"}) | ||
local rows = {} | |||
for name, data in pairs(heroHealthData) do | |||
table.insert(rows, { | |||
name = name, | |||
maxHealth = tonumber(data["MaxHealth"]) or 0, | |||
scalingHealth = tonumber(data["LevelScaling>MaxHealth"]) or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
-- Input table will be called a, output wikitable will be called z | -- Input table will be called a, output wikitable will be called z | ||
| Line 64: | Line 74: | ||
-- Iterate over heroes adding a new row to the wikitable for each | -- Iterate over heroes adding a new row to the wikitable for each | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..maxHealth.." || +"..scalingHealth.." || ".. | " || "..r.maxHealth.." || +"..r.scalingHealth.." || ".. | ||
tostring(roundValue( | tostring(roundValue(r.maxHealth + r.scalingHealth * soul_unlock.get_max('PowerIncrease'))).." \n" | ||
end | end | ||
| Line 82: | Line 90: | ||
local heroRegenData = heroDataArray({"Name", "BaseHealthRegen"}) | local heroRegenData = heroDataArray({"Name", "BaseHealthRegen"}) | ||
local rows = {} | |||
for name, data in pairs(heroRegenData) do | |||
table.insert(rows, { | |||
name = name, | |||
baseHealthRegen = data["BaseHealthRegen"] or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
"|+ Hero Base Health Regen \n".. | "|+ Hero Base Health Regen \n".. | ||
"! Hero !! HP/s \n" | "! Hero !! HP/s \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..baseHealthRegen.." \n" | " || "..r.baseHealthRegen.." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
| Line 102: | Line 118: | ||
"ClipSize","RoundsPerSecond","BulletDamage","BulletsPerShot"}) | "ClipSize","RoundsPerSecond","BulletDamage","BulletsPerShot"}) | ||
local rows = {} | |||
for name, data in pairs(heroDpsData) do | |||
table.insert(rows, { | |||
name = name, | |||
reloadDelay = data["ReloadDelay"] or 0, | |||
reloadTime = data["ReloadTime"] or 0, | |||
clipSize = data["ClipSize"] or 0, | |||
roundsPerSecond = data["RoundsPerSecond"] or 0, | |||
bulletDamage = data["BulletDamage"] or 0, | |||
bulletsPerShot = data["BulletsPerShot"] or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
"|+ Hero Base Damage \n".. | "|+ Hero Base Damage \n".. | ||
"! Hero !! Reload Delay (s) !! Reload Time (s) !! Ammo !! Bullets per sec !! Bullet Damage !! Bullets Per Shot \n" | "! Hero !! Reload Delay (s) !! Reload Time (s) !! Ammo !! Bullets per sec !! Bullet Damage !! Bullets Per Shot \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..reloadDelay.." || "..reloadTime.." || "..clipSize.. | " || "..r.reloadDelay.." || "..r.reloadTime.." || "..r.clipSize.. | ||
" || "..roundsPerSecond.." || "..bulletDamage.." || "..bulletsPerShot.." \n" | " || "..r.roundsPerSecond.." || "..r.bulletDamage.." || "..r.bulletsPerShot.." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
| Line 127: | Line 151: | ||
local heroBulletSpeedData = heroDataArray({"Name", "BulletSpeed"}) | local heroBulletSpeedData = heroDataArray({"Name", "BulletSpeed"}) | ||
local rows = {} | |||
for name, data in pairs(heroBulletSpeedData) do | |||
table.insert(rows, { | |||
name = name, | |||
bulletSpeed = data["BulletSpeed"] or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
"|+ Base Bullet Velocity \n".. | "|+ Base Bullet Velocity \n".. | ||
"! Hero !! m/s \n" | "! Hero !! m/s \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..bulletSpeed.." \n" | " || "..r.bulletSpeed.." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
| Line 146: | Line 178: | ||
local heroClipSizeData = heroDataArray({"Name", "ClipSize"}) | local heroClipSizeData = heroDataArray({"Name", "ClipSize"}) | ||
local rows = {} | |||
for name, data in pairs(heroClipSizeData) do | |||
table.insert(rows, { | |||
name = name, | |||
clipSize = data["ClipSize"] or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
"|+ Base Ammo Count \n".. | "|+ Base Ammo Count \n".. | ||
"! Hero !! Ammo \n" | "! Hero !! Ammo \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..clipSize.." \n" | " || "..r.clipSize.." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
| Line 165: | Line 205: | ||
local heroMoveSpeedData = heroDataArray({"Name", "MoveSpeed"}) | local heroMoveSpeedData = heroDataArray({"Name", "MoveSpeed"}) | ||
local rows = {} | |||
for name, data in pairs(heroMoveSpeedData) do | |||
table.insert(rows, { | |||
name = name, | |||
moveSpeed = data["MoveSpeed"] or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
"|+ Base Movement Speed \n".. | "|+ Base Movement Speed \n".. | ||
"! Hero !! m/s \n" | "! Hero !! m/s \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..moveSpeed.." \n" | " || "..r.moveSpeed.." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
| Line 184: | Line 232: | ||
local heroRoundsPerSecondData = heroDataArray({"Name", "RoundsPerSecond"}) | local heroRoundsPerSecondData = heroDataArray({"Name", "RoundsPerSecond"}) | ||
local rows = {} | |||
for name, data in pairs(heroRoundsPerSecondData) do | |||
table.insert(rows, { | |||
name = name, | |||
roundsPerSecond = data["RoundsPerSecond"] or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
"|+ Base Fire Rate \n".. | "|+ Base Fire Rate \n".. | ||
"! Hero !! Rounds/s \n" | "! Hero !! Rounds/s \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..roundsPerSecond.." \n" | " || "..r.roundsPerSecond.." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
| Line 203: | Line 259: | ||
local heroFalloffRangeData = heroDataArray({"Name", "FalloffStartRange", "FalloffEndRange"}) | local heroFalloffRangeData = heroDataArray({"Name", "FalloffStartRange", "FalloffEndRange"}) | ||
local rows = {} | |||
for name, data in pairs(heroFalloffRangeData) do | |||
table.insert(rows, { | |||
name = name, | |||
falloffStartRange = data["FalloffStartRange"] or 0, | |||
falloffEndRange = data["FalloffEndRange"] or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
"|+ Base Falloff Range \n".. | "|+ Base Falloff Range \n".. | ||
"! Hero !! Minimum Range (m) !! Maximum Range (m) \n" | "! Hero !! Minimum Range (m) !! Maximum Range (m) \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..falloffStartRange.." || "..falloffEndRange.." \n" | " || "..r.falloffStartRange.." || "..r.falloffEndRange.." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
| Line 223: | Line 287: | ||
-- Pull data | -- Pull data | ||
local heroBulletDamageData = heroDataArray({"Name", "BulletDamage", "LevelScaling>BulletDamage"}) | local heroBulletDamageData = heroDataArray({"Name", "BulletDamage", "LevelScaling>BulletDamage"}) | ||
local rows = {} | |||
for name, data in pairs(heroBulletDamageData) do | |||
table.insert(rows, { | |||
name = name, | |||
bulletDamage = tonumber(data["BulletDamage"]) or 0, | |||
scalingDamage = tonumber(data["LevelScaling>BulletDamage"]) or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
| Line 229: | Line 303: | ||
-- Iterate over heroes adding a new row to the wikitable for each | -- Iterate over heroes adding a new row to the wikitable for each | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..r.bulletDamage.." || +"..r.scalingDamage.." || ".. | |||
" || "..bulletDamage.." || +"..scalingDamage.." || ".. | tostring(roundValue(r.bulletDamage + r.scalingDamage * soul_unlock.get_max('PowerIncrease'))).." \n" | ||
tostring(roundValue( | |||
end | end | ||
| Line 250: | Line 319: | ||
-- Pull data | -- Pull data | ||
local heroLightMeleeData = heroDataArray({"Name", "LightMeleeDamage", "LevelScaling>LightMeleeDamage"}) | local heroLightMeleeData = heroDataArray({"Name", "LightMeleeDamage", "LevelScaling>LightMeleeDamage"}) | ||
local rows = {} | |||
for name, data in pairs(heroLightMeleeData) do | |||
table.insert(rows, { | |||
name = name, | |||
lightMeleeDamage = tonumber(data["LightMeleeDamage"]) or 0, | |||
scalingDamage = tonumber(data["LevelScaling>LightMeleeDamage"]) or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
| Line 256: | Line 335: | ||
-- Iterate over heroes adding a new row to the wikitable for each | -- Iterate over heroes adding a new row to the wikitable for each | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..lightMeleeDamage.." || +"..scalingDamage.." || ".. | " || "..r.lightMeleeDamage.." || +"..r.scalingDamage.." || ".. | ||
tostring(roundValue( | tostring(roundValue(r.lightMeleeDamage + r.scalingDamage * soul_unlock.get_max('PowerIncrease'))).." \n" | ||
end | end | ||
| Line 274: | Line 351: | ||
-- Pull data | -- Pull data | ||
local heroHeavyMeleeData = heroDataArray({"Name", "HeavyMeleeDamage", "LevelScaling>HeavyMeleeDamage"}) | local heroHeavyMeleeData = heroDataArray({"Name", "HeavyMeleeDamage", "LevelScaling>HeavyMeleeDamage"}) | ||
local rows = {} | |||
for name, data in pairs(heroHeavyMeleeData) do | |||
table.insert(rows, { | |||
name = name, | |||
heavyMeleeDamage = tonumber(data["HeavyMeleeDamage"]) or 0, | |||
scalingDamage = tonumber(data["LevelScaling>HeavyMeleeDamage"]) or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
| Line 280: | Line 367: | ||
-- Iterate over heroes adding a new row to the wikitable for each | -- Iterate over heroes adding a new row to the wikitable for each | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..heavyMeleeDamage.." || +"..scalingDamage.." || ".. | " || "..r.heavyMeleeDamage.." || +"..r.scalingDamage.." || ".. | ||
tostring(roundValue( | tostring(roundValue(r.heavyMeleeDamage + r.scalingDamage * soul_unlock.get_max('PowerIncrease'))).." \n" | ||
end | end | ||
| Line 297: | Line 382: | ||
p.heroStaminaTable = function(frame) | p.heroStaminaTable = function(frame) | ||
local heroStaminaData = heroDataArray({"Name", "Stamina"}) | local heroStaminaData = heroDataArray({"Name", "Stamina"}) | ||
local rows = {} | |||
for name, data in pairs(heroStaminaData) do | |||
table.insert(rows, { | |||
name = name, | |||
stamina = data["Stamina"] or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
| Line 302: | Line 396: | ||
"! Hero !! Stamina Bars \n" | "! Hero !! Stamina Bars \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..stamina.." \n" | " || "..r.stamina.." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
| Line 369: | Line 462: | ||
p.heroMoveSpeedTable = function(frame) | p.heroMoveSpeedTable = function(frame) | ||
local heroMoveSpeedData = heroDataArray({"Name", "MaxMoveSpeed", "SprintSpeed"}) | local heroMoveSpeedData = heroDataArray({"Name", "MaxMoveSpeed", "SprintSpeed"}) | ||
local rows = {} | |||
for name, data in pairs(heroMoveSpeedData) do | |||
table.insert(rows, { | |||
name = name, | |||
moveSpeed = tonumber(data["MaxMoveSpeed"]) or 0, | |||
sprintSpeed = tonumber(data["SprintSpeed"]) or 0 | |||
}) | |||
end | |||
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end) | |||
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n".. | ||
| Line 374: | Line 477: | ||
"! Hero !! Move Speed !! Sprint Speed !! Total Sprint Speed \n" | "! Hero !! Move Speed !! Sprint Speed !! Total Sprint Speed \n" | ||
for | for _, r in ipairs(rows) do | ||
z = z.. | z = z.. | ||
"|- \n".. | "|- \n".. | ||
"| style=\"text-align:left;\" | ".. | "| style=\"text-align:left;\" | ".. | ||
frame:expandTemplate{title="PageRef", args={ | frame:expandTemplate{title="PageRef", args={r.name}}.. | ||
" || "..moveSpeed.." || "..sprintSpeed.." || ".. | " || "..r.moveSpeed.." || "..r.sprintSpeed.." || "..r.moveSpeed + r.sprintSpeed .." \n" | ||
end | end | ||
z = z.."|}" | z = z.."|}" | ||
Revision as of 21:26, 24 October 2025
Overview
This module consists of one generic function, heroDataArray, and a series of functions that create specific wikitables using the output from heroDataArray.
local p = {};
local util_module = require('Module:Utilities')
local allHeroData = mw.loadJsonData("Data:HeroData.json")
local soul_unlock = require('Module:SoulUnlock')
local inGameHeroData = {}
-- Just get heroes that are playable
for i, heroData in pairs(allHeroData) do
if heroData["InDevelopment"] == false then
if heroData["IsDisabled"] == false then
table.insert(inGameHeroData, heroData)
end
end
end
-- Helper function to round numeric values
local function roundValue(value)
if type(value) == "number" then
return util_module.round_to_sig_fig(value, 3)
end
return value
end
-- heroDataArray takes as argument a table of any length containing keys or
-- paths of keys in the HeroData JSON, e.g. {Name, MaxHealth, LevelScaling>Health}.
-- A path of keys should be specified as such, with the ">" character separating
-- subsequent keys.
local heroDataArray = function(args)
local outData = {}
for i, heroData in ipairs(inGameHeroData) do -- Iterate over each hero
local out = {} -- First creating a table to hold data
for j, key in pairs(args) do -- Iterate over each key:
if string.find(key, ">") ~= nil then -- If the key is actually a path of keys,
local node = heroData -- start with the biggest node heroData, and
for k in string.gmatch(key, "([^>]+)") do -- iterate over each key, splitting on ">",
if node and node[k] ~= nil then -- trying the key as a string e.g. "1", (Added 'node and' for safety)
node = node[k]
elseif node and node[tonumber(k)] ~= nil then -- else using the key as numeric, (Added 'node and' for safety)
node = node[tonumber(k)]
else -- If at any point the path breaks, the result is nil
node = nil
break
end -- drilling down the JSON node after node
end
out[key] = roundValue(node) -- until outputting the final node (rounded)
else
out[key] = roundValue(heroData[key]) -- or just grab the data if not a path (rounded)
end
end
outData[heroData["Name"]] = out -- Save data in the big table of heroes
end
return(outData)
end
p.heroHealthTable = function(frame)
-- Pull data
local heroHealthData = heroDataArray({"Name", "MaxHealth", "LevelScaling>MaxHealth"})
local rows = {}
for name, data in pairs(heroHealthData) do
table.insert(rows, {
name = name,
maxHealth = tonumber(data["MaxHealth"]) or 0,
scalingHealth = tonumber(data["LevelScaling>MaxHealth"]) or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
-- Input table will be called a, output wikitable will be called z
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Hero Base Health Stats \n"..
"! Hero !! Starting !! Added per Boon !! At Max Boon \n"
-- Iterate over heroes adding a new row to the wikitable for each
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.maxHealth.." || +"..r.scalingHealth.." || "..
tostring(roundValue(r.maxHealth + r.scalingHealth * soul_unlock.get_max('PowerIncrease'))).." \n"
end
z = z.."|}"
return z
end
p.heroRegenTable = function(frame)
local heroRegenData = heroDataArray({"Name", "BaseHealthRegen"})
local rows = {}
for name, data in pairs(heroRegenData) do
table.insert(rows, {
name = name,
baseHealthRegen = data["BaseHealthRegen"] or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Hero Base Health Regen \n"..
"! Hero !! HP/s \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.baseHealthRegen.." \n"
end
z = z.."|}"
return z
end
p.heroDpsTable = function(frame)
local heroDpsData = heroDataArray({"Name","ReloadSingle","ReloadDelay","ReloadTime",
"ClipSize","RoundsPerSecond","BulletDamage","BulletsPerShot"})
local rows = {}
for name, data in pairs(heroDpsData) do
table.insert(rows, {
name = name,
reloadDelay = data["ReloadDelay"] or 0,
reloadTime = data["ReloadTime"] or 0,
clipSize = data["ClipSize"] or 0,
roundsPerSecond = data["RoundsPerSecond"] or 0,
bulletDamage = data["BulletDamage"] or 0,
bulletsPerShot = data["BulletsPerShot"] or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Hero Base Damage \n"..
"! Hero !! Reload Delay (s) !! Reload Time (s) !! Ammo !! Bullets per sec !! Bullet Damage !! Bullets Per Shot \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.reloadDelay.." || "..r.reloadTime.." || "..r.clipSize..
" || "..r.roundsPerSecond.." || "..r.bulletDamage.." || "..r.bulletsPerShot.." \n"
end
z = z.."|}"
return z
end
p.heroBulletSpeedTable = function(frame)
local heroBulletSpeedData = heroDataArray({"Name", "BulletSpeed"})
local rows = {}
for name, data in pairs(heroBulletSpeedData) do
table.insert(rows, {
name = name,
bulletSpeed = data["BulletSpeed"] or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Base Bullet Velocity \n"..
"! Hero !! m/s \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.bulletSpeed.." \n"
end
z = z.."|}"
return z
end
p.heroClipSizeTable = function(frame)
local heroClipSizeData = heroDataArray({"Name", "ClipSize"})
local rows = {}
for name, data in pairs(heroClipSizeData) do
table.insert(rows, {
name = name,
clipSize = data["ClipSize"] or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Base Ammo Count \n"..
"! Hero !! Ammo \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.clipSize.." \n"
end
z = z.."|}"
return z
end
p.heroMoveSpeedTable = function(frame)
local heroMoveSpeedData = heroDataArray({"Name", "MoveSpeed"})
local rows = {}
for name, data in pairs(heroMoveSpeedData) do
table.insert(rows, {
name = name,
moveSpeed = data["MoveSpeed"] or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Base Movement Speed \n"..
"! Hero !! m/s \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.moveSpeed.." \n"
end
z = z.."|}"
return z
end
p.heroRoundsPerSecondTable = function(frame)
local heroRoundsPerSecondData = heroDataArray({"Name", "RoundsPerSecond"})
local rows = {}
for name, data in pairs(heroRoundsPerSecondData) do
table.insert(rows, {
name = name,
roundsPerSecond = data["RoundsPerSecond"] or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Base Fire Rate \n"..
"! Hero !! Rounds/s \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.roundsPerSecond.." \n"
end
z = z.."|}"
return z
end
p.heroFalloffRangeTable = function(frame)
local heroFalloffRangeData = heroDataArray({"Name", "FalloffStartRange", "FalloffEndRange"})
local rows = {}
for name, data in pairs(heroFalloffRangeData) do
table.insert(rows, {
name = name,
falloffStartRange = data["FalloffStartRange"] or 0,
falloffEndRange = data["FalloffEndRange"] or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Base Falloff Range \n"..
"! Hero !! Minimum Range (m) !! Maximum Range (m) \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.falloffStartRange.." || "..r.falloffEndRange.." \n"
end
z = z.."|}"
return z
end
p.heroBulletDamageTable = function(frame)
-- Pull data
local heroBulletDamageData = heroDataArray({"Name", "BulletDamage", "LevelScaling>BulletDamage"})
local rows = {}
for name, data in pairs(heroBulletDamageData) do
table.insert(rows, {
name = name,
bulletDamage = tonumber(data["BulletDamage"]) or 0,
scalingDamage = tonumber(data["LevelScaling>BulletDamage"]) or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Hero Base Bullet Damage Stats \n"..
"! Hero !! Starting !! Added per Boon !! At Max Boon \n"
-- Iterate over heroes adding a new row to the wikitable for each
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.bulletDamage.." || +"..r.scalingDamage.." || "..
tostring(roundValue(r.bulletDamage + r.scalingDamage * soul_unlock.get_max('PowerIncrease'))).." \n"
end
z = z.."|}"
return z
end
p.heroLightMeleeTable = function(frame)
-- Pull data
local heroLightMeleeData = heroDataArray({"Name", "LightMeleeDamage", "LevelScaling>LightMeleeDamage"})
local rows = {}
for name, data in pairs(heroLightMeleeData) do
table.insert(rows, {
name = name,
lightMeleeDamage = tonumber(data["LightMeleeDamage"]) or 0,
scalingDamage = tonumber(data["LevelScaling>LightMeleeDamage"]) or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Hero Base Light Melee Stats \n"..
"! Hero !! Starting !! Added per Boon !! At Max Boon \n"
-- Iterate over heroes adding a new row to the wikitable for each
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.lightMeleeDamage.." || +"..r.scalingDamage.." || "..
tostring(roundValue(r.lightMeleeDamage + r.scalingDamage * soul_unlock.get_max('PowerIncrease'))).." \n"
end
z = z.."|}"
return z
end
p.heroHeavyMeleeTable = function(frame)
-- Pull data
local heroHeavyMeleeData = heroDataArray({"Name", "HeavyMeleeDamage", "LevelScaling>HeavyMeleeDamage"})
local rows = {}
for name, data in pairs(heroHeavyMeleeData) do
table.insert(rows, {
name = name,
heavyMeleeDamage = tonumber(data["HeavyMeleeDamage"]) or 0,
scalingDamage = tonumber(data["LevelScaling>HeavyMeleeDamage"]) or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Hero Base Heavy Melee Stats \n"..
"! Hero !! Starting !! Added per Boon !! At Max Boon \n"
-- Iterate over heroes adding a new row to the wikitable for each
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.heavyMeleeDamage.." || +"..r.scalingDamage.." || "..
tostring(roundValue(r.heavyMeleeDamage + r.scalingDamage * soul_unlock.get_max('PowerIncrease'))).." \n"
end
z = z.."|}"
return z
end
p.heroStaminaTable = function(frame)
local heroStaminaData = heroDataArray({"Name", "Stamina"})
local rows = {}
for name, data in pairs(heroStaminaData) do
table.insert(rows, {
name = name,
stamina = data["Stamina"] or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Hero Base Stamina Stats \n"..
"! Hero !! Stamina Bars \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.stamina.." \n"
end
z = z.."|}"
return z
end
p.heroDashTable = function(frame)
local heroDashData = heroDataArray({"Name", "GroundDashDuration"})
local rows = {}
for name, data in pairs(heroDashData) do
table.insert(rows, {
name = name,
duration = tonumber(data.GroundDashDuration) or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = '{| class="wikitable sortable mw-collapsible" style="text-align:center"\n' ..
'|+ Hero Base Dash Speed Stats\n' ..
'! Hero !! Dash Speed (s)\n'
for _, r in ipairs(rows) do
z = z .. '|-\n| style="text-align:left;" | ' ..
frame:expandTemplate{title = 'PageRef', args = {r.name}} ..
' || ' .. r.duration .. '\n'
end
return z .. '|}'
end
p.heroReloadTable = function(frame)
local heroReloadData = heroDataArray({"Name", "ReloadTime"})
-- 1. collect rows
local rows = {}
for name, data in pairs(heroReloadData) do
table.insert(rows, {
name = name,
reloadTime = tonumber(data.ReloadTime) or 0
})
end
-- 2. alphabetical by hero name
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
-- 3. build table
local z = '{| class="wikitable sortable mw-collapsible" style="text-align:center"\n' ..
'|+ Hero Base Reload Time Stats\n' ..
'! Hero !! Reload Time (s)\n'
for _, r in ipairs(rows) do
z = z ..
'|-\n' ..
'| style="text-align:left;" | ' ..
frame:expandTemplate{title = 'PageRef', args = {r.name}} ..
' || ' .. r.reloadTime .. '\n'
end
return z .. '|}'
end
p.heroMoveSpeedTable = function(frame)
local heroMoveSpeedData = heroDataArray({"Name", "MaxMoveSpeed", "SprintSpeed"})
local rows = {}
for name, data in pairs(heroMoveSpeedData) do
table.insert(rows, {
name = name,
moveSpeed = tonumber(data["MaxMoveSpeed"]) or 0,
sprintSpeed = tonumber(data["SprintSpeed"]) or 0
})
end
table.sort(rows, function(a, b) return a.name:lower() < b.name:lower() end)
local z = "{| class=\"wikitable sortable mw-collapsible\" style=\"text-align:center\" \n"..
"|+ Hero Base Move Speed Stats \n"..
"! Hero !! Move Speed !! Sprint Speed !! Total Sprint Speed \n"
for _, r in ipairs(rows) do
z = z..
"|- \n"..
"| style=\"text-align:left;\" | "..
frame:expandTemplate{title="PageRef", args={r.name}}..
" || "..r.moveSpeed.." || "..r.sprintSpeed.." || "..r.moveSpeed + r.sprintSpeed .." \n"
end
z = z.."|}"
return z
end
return p