Difference between revisions of "Module:WeaponData"
(Try a completely different approach) |
|||
| Line 3: | Line 3: | ||
local weaponData = mw.loadData('Module:WeaponData/data') | local weaponData = mw.loadData('Module:WeaponData/data') | ||
| − | local function | + | local function addCustomLabel(templateArgs, key, value, index) |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
if key then | if key then | ||
| − | + | templateArgs["customlabel"..index] = key | |
| + | templateArgs["customdata"..index] = value | ||
else | else | ||
| − | + | templateArgs["special"..index] = value | |
end | end | ||
| − | + | index = index + 1 | |
| − | |||
end | end | ||
| Line 37: | Line 22: | ||
if not result then result = '' end | if not result then result = '' end | ||
return result | return result | ||
| + | end | ||
| + | |||
| + | local function addSpecialDataToTemplate(templateArgs, frameArgs, wd) | ||
| + | local num = 0 | ||
| + | for index, entry in ipairs(wd.extraData) do | ||
| + | if type(entry) == 'table' then | ||
| + | if entry.type == 'shielddrain' then | ||
| + | addCustomLabel(templateArgs, "Shield drain (HP/shot)", entry.drain, num) | ||
| + | elseif entry.type == 'needs_link' then | ||
| + | addCustomLabel(templateArgs, "Grid needed", entry.power, num) | ||
| + | elseif entry.type == 'spawn' then | ||
| + | addCustomLabel(templateArgs, "Spawns Unit", "[[" .. entry.name .. "]]", num) | ||
| + | addCustomLabel(templateArgs, "Spawn Life (s)", entry.expire, num) | ||
| + | elseif entry.type == 'areadamage' then | ||
| + | local typeName = entry.grav and "Gravity Well" or "Ground Burn" | ||
| + | if not grav then | ||
| + | addCustomLabel(templateArgs, typeName .. " DPS", entry.dps, num) | ||
| + | end | ||
| + | addCustomLabel(templateArgs, typeName .. " radius (elmo)", entry.radius, num) | ||
| + | addCustomLabel(templateArgs, typeName .. " duration (s)", entry.duration, num) | ||
| + | |||
| + | elseif entry.type == 'stockpile' then | ||
| + | addCustomLabel(templateArgs, "Stockpile time (s)", entry.time, num) | ||
| + | if (entry.cost) then | ||
| + | addCustomLabel(templateArgs, "Stockpile cost (M)", entry.cost, num) | ||
| + | end | ||
| + | else | ||
| + | addCustomLabel(templateArgs, "Invalid table data", entry.type, num) | ||
| + | end | ||
| + | else | ||
| + | if entry == 'hitscan' then | ||
| + | addCustomLabel(templateArgs, nil, "Instantly hits", num) | ||
| + | elseif entry == 'ignoreshield' then | ||
| + | addCustomLabel(templateArgs, nil, "Ignores shields", num) | ||
| + | elseif entry == 'smoothsground' then | ||
| + | addCustomLabel(templateArgs, nil, "Smooths ground", num) | ||
| + | elseif entry == 'hightraj' then | ||
| + | addCustomLabel(templateArgs, nil, "High trajectory", num) | ||
| + | elseif entry == 'trajtoggle' then | ||
| + | addCustomLabel(templateArgs, nil, "Trajectory toggle", num) | ||
| + | elseif entry == 'watercapable' then | ||
| + | addCustomLabel(templateArgs, nil, "Water capable", num) | ||
| + | elseif entry == 'friendlyfire' then | ||
| + | addCustomLabel(templateArgs, nil, "Potential friendly fire", num) | ||
| + | elseif entry == 'nofriendlyfire' then | ||
| + | addCustomLabel(templateArgs, nil, "No friendly fire", num) | ||
| + | elseif entry == 'nogroundcollide' then | ||
| + | addCustomLabel(templateArgs, nil, "Passes through ground", num) | ||
| + | elseif entry == 'piercing' then | ||
| + | addCustomLabel(templateArgs, nil, "Damage increase vs large units", num) | ||
| + | elseif entry == 'damagefalloff' then | ||
| + | addCustomLabel(templateArgs, nil, "Damage falls off with range", num) | ||
| + | elseif entry == 'inaccuratevsmoving' then | ||
| + | addCustomLabel(templateArgs, nil, "Inaccuracy vs moving targets", num) | ||
| + | elseif entry == 'interceptedbyantinuke' then | ||
| + | addCustomLabel(templateArgs, nil, "Can be shot down by antinukes", num) | ||
| + | else | ||
| + | addCustomLabel(templateArgs, "Invalid tag data", entry, num) | ||
| + | end | ||
| + | end | ||
| + | end | ||
end | end | ||
| Line 44: | Line 90: | ||
local w = tbl.args | local w = tbl.args | ||
local wd = weaponData[args.defname] | local wd = weaponData[args.defname] | ||
| − | if not (wd) then return 'weapondef ' .. | + | if not (wd) then return 'weapondef ' .. args.defname .. ' not found' end |
| + | |||
| + | addSpecialDataToTemplate(w, args, wd) | ||
| − | for key, value in pairs( | + | for key, value in pairs(wd) do |
| − | w[key] = | + | w[key] = args[key] or value |
end | end | ||
| + | |||
return tbl | return tbl | ||
end | end | ||
Revision as of 06:32, 11 May 2024
This module is used to autogenerate the weapon infoboxes contained in unit infoboxes, by drawing data from Module:WeaponData/data. The intent is to ease updating of unit infoboxes on the wiki; ideally, only the one data page needing to be changed every release. The concept is taken from e.g. the Combat Card Data module on the Library of Ruina Wiki.
Unlike Module:UnitData, there is no template for this module. If it is desired to generate a weapon infobox outside its unit infobox, the module should be invoked directly, e.g.:
{{#invoke:WeaponData|printInfobox|defname=striderdetriment_gauss|name=Name override}}
Data page
Module:WeaponData/data is a central store of data used by Module:WeaponData to automatically populate weapon infoboxes.
The page is a Lua table written to the local file temp/weaponStats.lua by the Wiki Data Export (dbg_wiki_export.lua) widget in Zero-K. This widget should be run once each update and the data page on the wiki replaced accordingly. It should not be necessary to edit the data manually.
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
end
function weapon.getData(frame)
if not frame then return '' end
local weaponDefName = frame.args[1]
local wd = weaponData[weaponDefName]
if not (wd) then return 'weapondef ' .. weaponDefName .. ' not found' end
local property = frame.args[2]
local result = wd[property]
if not result then result = '' end
return result
end
local function addSpecialDataToTemplate(templateArgs, frameArgs, wd)
local num = 0
for index, entry in ipairs(wd.extraData) do
if type(entry) == 'table' then
if entry.type == 'shielddrain' then
addCustomLabel(templateArgs, "Shield drain (HP/shot)", entry.drain, num)
elseif entry.type == 'needs_link' then
addCustomLabel(templateArgs, "Grid needed", entry.power, num)
elseif entry.type == 'spawn' then
addCustomLabel(templateArgs, "Spawns Unit", "[[" .. entry.name .. "]]", num)
addCustomLabel(templateArgs, "Spawn Life (s)", entry.expire, num)
elseif entry.type == 'areadamage' then
local typeName = entry.grav and "Gravity Well" or "Ground Burn"
if not grav then
addCustomLabel(templateArgs, typeName .. " DPS", entry.dps, num)
end
addCustomLabel(templateArgs, typeName .. " radius (elmo)", entry.radius, num)
addCustomLabel(templateArgs, typeName .. " duration (s)", entry.duration, num)
elseif entry.type == 'stockpile' then
addCustomLabel(templateArgs, "Stockpile time (s)", entry.time, num)
if (entry.cost) then
addCustomLabel(templateArgs, "Stockpile cost (M)", entry.cost, num)
end
else
addCustomLabel(templateArgs, "Invalid table data", entry.type, num)
end
else
if entry == 'hitscan' then
addCustomLabel(templateArgs, nil, "Instantly hits", num)
elseif entry == 'ignoreshield' then
addCustomLabel(templateArgs, nil, "Ignores shields", num)
elseif entry == 'smoothsground' then
addCustomLabel(templateArgs, nil, "Smooths ground", num)
elseif entry == 'hightraj' then
addCustomLabel(templateArgs, nil, "High trajectory", num)
elseif entry == 'trajtoggle' then
addCustomLabel(templateArgs, nil, "Trajectory toggle", num)
elseif entry == 'watercapable' then
addCustomLabel(templateArgs, nil, "Water capable", num)
elseif entry == 'friendlyfire' then
addCustomLabel(templateArgs, nil, "Potential friendly fire", num)
elseif entry == 'nofriendlyfire' then
addCustomLabel(templateArgs, nil, "No friendly fire", num)
elseif entry == 'nogroundcollide' then
addCustomLabel(templateArgs, nil, "Passes through ground", num)
elseif entry == 'piercing' then
addCustomLabel(templateArgs, nil, "Damage increase vs large units", num)
elseif entry == 'damagefalloff' then
addCustomLabel(templateArgs, nil, "Damage falls off with range", num)
elseif entry == 'inaccuratevsmoving' then
addCustomLabel(templateArgs, nil, "Inaccuracy vs moving targets", num)
elseif entry == 'interceptedbyantinuke' then
addCustomLabel(templateArgs, nil, "Can be shot down by antinukes", num)
else
addCustomLabel(templateArgs, "Invalid tag data", entry, num)
end
end
end
end
function weapon.getInfoboxTemplate(frame)
local args = frame.args
local tbl = {title = "Infobox zkweapon", args = {}}
local w = tbl.args
local wd = weaponData[args.defname]
if not (wd) then return 'weapondef ' .. args.defname .. ' not found' end
addSpecialDataToTemplate(w, args, wd)
for key, value in pairs(wd) do
w[key] = args[key] or value
end
return tbl
end
function weapon.printInfobox(frame)
return frame:expandTemplate(weapon.getInfoboxTemplate(frame))
end
function weapon.printInfoboxCustomRows(frame)
local weaponDefName = frame.args[1]
local expanded = frame.args[2]
local wd = weaponData[weaponDefName]
if not wd then return 'weapondef ' .. weaponDefName .. ' not found' end
if not wd.extraData then return '' end
local str = ''
local count = 0
for index, entry in ipairs(wd.extraData) do
local append = ''
if type(entry) == 'table' then
if entry.type == 'shielddrain' then
append, count, str = writeCustomDataLine("Shield drain (HP/shot)", entry.drain, count, str)
elseif entry.type == 'needs_link' then
append, count, str = writeCustomDataLine("Grid needed", entry.power, count, str)
elseif entry.type == 'spawn' then
append, count, str = writeCustomDataLine("Spawns Unit", "[[" .. entry.name .. "]]", count, str)
append, count, str = writeCustomDataLine("Spawn Life (s)", entry.expire, count, str)
elseif entry.type == 'areadamage' then
local typeName = entry.grav and "Gravity Well" or "Ground Burn"
if not grav then
append, count, str = writeCustomDataLine(typeName .. " DPS", entry.dps, count, str)
end
append, count, str = writeCustomDataLine(typeName .. " radius (elmo)", entry.radius, count, str)
append, count, str = writeCustomDataLine(typeName .. " duration (s)", entry.duration, count, str)
elseif entry.type == 'stockpile' then
append, count, str = writeCustomDataLine("Stockpile time (s)", entry.time, count, str)
if (entry.cost) then
append, count, str = writeCustomDataLine("Stockpile cost (M)", entry.cost, count, str)
end
else
append, count, str = writeCustomDataLine("Invalid table data", entry.type, count, str)
end
else
if entry == 'hitscan' then
append, count, str = writeCustomDataLine(nil, "Instantly hits", count, str)
elseif entry == 'ignoreshield' then
append, count, str = writeCustomDataLine(nil, "Ignores shields", count, str)
elseif entry == 'smoothsground' then
append, count, str = writeCustomDataLine(nil, "Smooths ground", count, str)
elseif entry == 'hightraj' then
append, count, str = writeCustomDataLine(nil, "High trajectory", count, str)
elseif entry == 'trajtoggle' then
append, count, str = writeCustomDataLine(nil, "Trajectory toggle", count, str)
elseif entry == 'watercapable' then
append, count, str = writeCustomDataLine(nil, "Water capable", count, str)
elseif entry == 'friendlyfire' then
append, count, str = writeCustomDataLine(nil, "Potential friendly fire", count, str)
elseif entry == 'nofriendlyfire' then
append, count, str = writeCustomDataLine(nil, "No friendly fire", count, str)
elseif entry == 'nogroundcollide' then
append, count, str = writeCustomDataLine(nil, "Passes through ground", count, str)
elseif entry == 'piercing' then
append, count, str = writeCustomDataLine(nil, "Damage increase vs large units", count, str)
elseif entry == 'damagefalloff' then
append, count, str = writeCustomDataLine(nil, "Damage falls off with range", count, str)
elseif entry == 'inaccuratevsmoving' then
append, count, str = writeCustomDataLine(nil, "Inaccuracy vs moving targets", count, str)
elseif entry == 'interceptedbyantinuke' then
append, count, str = writeCustomDataLine(nil, "Can be shot down by antinukes", count, str)
else
append, count, str = writeCustomDataLine("Invalid tag data", entry, count, str)
end
end
end
return expanded and frame:preprocess(str) or str
end
return weapon