Difference between revisions of "Module:WeaponData"

From Zero-K
Jump to navigation Jump to search
m (Fix crash when no extraData)
(2 intermediate revisions by the same user not shown)
Line 25: Line 25:
  
 
local function addSpecialDataToTemplate(templateArgs, frameArgs, wd)
 
local function addSpecialDataToTemplate(templateArgs, frameArgs, wd)
local num = 0
+
local num = 1
for index, entry in ipairs(wd.extraData) do
+
for index, entry in ipairs(wd.extraData or {}) do
 
if type(entry) == 'table' then
 
if type(entry) == 'table' then
 
if entry.type == 'shielddrain' then
 
if entry.type == 'shielddrain' then
Line 48: Line 48:
 
addCustomLabel(templateArgs, "Stockpile cost (M)", entry.cost, num)
 
addCustomLabel(templateArgs, "Stockpile cost (M)", entry.cost, num)
 
end
 
end
else
 
addCustomLabel(templateArgs, "Invalid table data", entry.type, num)
 
 
end
 
end
 
else
 
else
Line 78: Line 76:
 
elseif entry == 'interceptedbyantinuke' then
 
elseif entry == 'interceptedbyantinuke' then
 
addCustomLabel(templateArgs, nil, "Can be shot down by antinukes", num)
 
addCustomLabel(templateArgs, nil, "Can be shot down by antinukes", num)
else
 
addCustomLabel(templateArgs, "Invalid tag data", entry, num)
 
 
end
 
end
 
end
 
end
Line 97: Line 93:
 
w[key] = args[key] or value
 
w[key] = args[key] or value
 
end
 
end
 +
w.extraData = nil
 
 
 
return tbl
 
return tbl
Line 103: Line 100:
 
function weapon.printInfobox(frame)
 
function weapon.printInfobox(frame)
 
return frame:expandTemplate(weapon.getInfoboxTemplate(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
 
end
  
 
return weapon
 
return weapon

Revision as of 06:49, 11 May 2024

Documentation

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 = 1
	for index, entry in ipairs(wd.extraData or {}) 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
			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)
			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
	w.extraData = nil
	
	return tbl
end

function weapon.printInfobox(frame)
	return frame:expandTemplate(weapon.getInfoboxTemplate(frame))
end

return weapon