Module:WeaponData: Difference between revisions
From Fightorder
More actions
Created page with "local getArgs = require('Module:Arguments').getArgs local weapon = {} local weaponData = mw.loadData('Module:WeaponData/data') local function addCustomLabel(templateArgs, key, value, index) if key then templateArgs["customlabel"..index] = key templateArgs["customdata"..index] = value else templateArgs["special"..index] = value end index = index + 1 return index end function weapon.getData(frame) if not frame then return '' end local weaponDefName = frame.a..." |
(No difference)
|
Latest revision as of 22:11, 11 November 2025
Documentation for this module may be created at Module:WeaponData/doc
local getArgs = require('Module:Arguments').getArgs
local weapon = {}
local weaponData = mw.loadData('Module:WeaponData/data')
local function addCustomLabel(templateArgs, key, value, index)
if key then
templateArgs["customlabel"..index] = key
templateArgs["customdata"..index] = value
else
templateArgs["special"..index] = value
end
index = index + 1
return index
end
function weapon.getData(frame)
if not frame then return '' end
local weaponDefName = frame.args.defname or frame.args[1] or "<no name specified>"
local wd = weaponData[weaponDefName]
if not (wd) then return 'weapondef ' .. weaponDefName .. ' not found' end
local property = (frame.args.defname == nil) and frame.args[2] or frame.args[1]
local result = wd[property]
if not result then result = '' end
return result
end
local function addSpecialDataToTemplate(templateArgs, wd)
local num = 1
for index, entry in ipairs(wd.extraData or {}) do
if type(entry) == 'table' then
if entry.type == 'shielddrain' then
num = addCustomLabel(templateArgs, "Shield drain (HP/shot)", entry.drain, num)
elseif entry.type == 'needs_link' then
num = addCustomLabel(templateArgs, "Grid needed", entry.power, num)
elseif entry.type == 'spawn' then
num = addCustomLabel(templateArgs, "Spawns Unit", "[[" .. entry.name .. "]]", num)
num = addCustomLabel(templateArgs, "Spawn Life (s)", entry.expire, num)
elseif entry.type == 'areadamage' then
local typeName = entry.grav and "Gravity Well" or wd.slowdamage and "Ground Slow" or "Ground Burn"
if not grav then
num = addCustomLabel(templateArgs, typeName .. " DPS", entry.dps, num)
end
num = addCustomLabel(templateArgs, typeName .. " radius (elmo)", entry.radius, num)
num = addCustomLabel(templateArgs, typeName .. " duration (s)", entry.duration, num)
elseif entry.type == 'stockpile' then
num = addCustomLabel(templateArgs, "Stockpile time (s)", entry.time, num)
if (entry.cost) then
num = addCustomLabel(templateArgs, "Stockpile cost (M)", entry.cost, num)
end
end
else
if entry == 'hitscan' then
num = addCustomLabel(templateArgs, nil, "Instantly hits", num)
elseif entry == 'ignoreshield' then
num = addCustomLabel(templateArgs, nil, "Ignores shields", num)
elseif entry == 'smoothsground' then
num = addCustomLabel(templateArgs, nil, "Smooths ground", num)
elseif entry == 'hightraj' then
num = addCustomLabel(templateArgs, nil, "High trajectory", num)
elseif entry == 'trajtoggle' then
num = addCustomLabel(templateArgs, nil, "Trajectory toggle", num)
elseif entry == 'watercapable' then
num = addCustomLabel(templateArgs, nil, "Water capable", num)
elseif entry == 'friendlyfire' then
num = addCustomLabel(templateArgs, nil, "Potential friendly fire", num)
elseif entry == 'nofriendlyfire' then
num = addCustomLabel(templateArgs, nil, "No friendly fire", num)
elseif entry == 'nogroundcollide' then
num = addCustomLabel(templateArgs, nil, "Passes through ground", num)
elseif entry == 'piercing' then
num = addCustomLabel(templateArgs, nil, "Damage increase vs large units", num)
elseif entry == 'damagefalloff' then
num = addCustomLabel(templateArgs, nil, "Damage falls off with range", num)
elseif entry == 'inaccuratevsmoving' then
num = addCustomLabel(templateArgs, nil, "Inaccuracy vs moving targets", num)
elseif entry == 'interceptedbyantinuke' then
num = addCustomLabel(templateArgs, nil, "Can be shot down by antinukes", num)
end
end
end
end
function weapon.getInfoboxTemplate(frame)
local args = frame.args
local tbl = {title = "Infobox zkweapon", args = {}}
local w = tbl.args
local defName = args.defname or args[1] or "<no name specified>"
local wd = weaponData[defName]
if not (wd) then return 'weapondef ' .. defName .. ' not found' end
addSpecialDataToTemplate(w, wd)
for key, value in pairs(wd) do
w[key] = args[key] or value
end
w.extraData = nil
if (w.count and w.count > 1) then
w.name = w.name .. " × " .. w.count
end
if (w.projectiles and w.projectiles > 1) then
local append = " × " .. w.projectiles
if w.damage then w.damage = w.damage .. append end
if w.empdamage then w.empdamage = w.empdamage .. append end
if w.slowdamage then w.slowdamage = w.slowdamage .. append end
if w.disarmdamage then w.disarmdamage = w.disarmdamage .. append end
if w.shielddamage then w.shielddamage = w.shielddamage .. append end
end
return tbl
end
function weapon.printInfobox(frame)
return frame:expandTemplate(weapon.getInfoboxTemplate(frame))
end
return weapon