(fixed error with the rows used by mininfobox) |
(fixed error) |
||
| Line 60: | Line 60: | ||
p.view['Dry mass'] = dv.number{'dryMass', unit='kg'} | p.view['Dry mass'] = dv.number{'dryMass', unit='kg'} | ||
p.view['Dry mass (tons)'] = dv.number{'dryMass/1000 | p.view['Dry mass (tons)'] = dv.number{'dryMass'/1000, unit='t'} | ||
p.view['Cargo bay'] = dv.number{'cargoBay', unit='m^3'} | p.view['Cargo bay'] = dv.number{'cargoBay', unit='m^3'} | ||
p.view['EMP shielding'] = dv.number{'empShielding', unit='MJ', omitZero=true} | p.view['EMP shielding'] = dv.number{'empShielding', unit='MJ', omitZero=true} | ||
Revision as of 00:43, 19 November 2024
This ship module exists to present the data from Module:Ships/Data in tables of ships, ship variants, and ship info boxes.
Infobox
Lua error at line 62: attempt to perform arithmetic on a string value.
Usage
{{#invoke:Ships|infobox|K37
|image=[[File:K37-tntrl.png|200px]]
|caption=Top-down view of the K37}}
The image and its caption are optional.
The infobox floats to the side of other content. Example output is to the right. The float is cleared here to keep it from being confused with the next section of the documentation.
Ship list
Usage
{{#invoke:Ships|list}}
Example output
Lua error at line 62: attempt to perform arithmetic on a string value.
A list of columns to display can be specified as additional arguments
{{#invoke:Ships|list|Name
|Make
|Cargo bay
|Thrusters}}
Lua error at line 62: attempt to perform arithmetic on a string value.
Ship variants
Usage
{{#invoke:Ships|variants|K37}}
Example output
Lua error at line 62: attempt to perform arithmetic on a string value.
A list of columns to display can be specified as additional arguments
{{#invoke:Ships|variants|K37
|Name|Make
|Crew|Dry mass|Cargo|Processed cargo|EMP shielding
|Variant}}
Lua error at line 62: attempt to perform arithmetic on a string value.
local p = {}
local d = require('Module:Data')
local dv = require('Module:Data/View')
local capiunto = require 'capiunto'
local processedCargoTypes = 6
p.view = {}
p.view['Name'] = dv.title{'key', text='name'}
p.view['Make'] = dv.text{'make'}
local nonZero = function(n)
return n and n ~= 0
end
p.view['Processed cargo'] = {
format = function(ship)
local pc = dv.formatNum(ship.processedCargo, 'kg')
local pcc = dv.formatNum(ship.processedCargoCombined, 'kg (combined)')
if nonZero(ship.processedCargo) and nonZero(ship.processedCargoCombined) then
return pc .. ' + ' .. pcc
elseif nonZero(ship.processedCargoCombined) then
return pcc
elseif nonZero(ship.processedCargo) then
return pc
end
end,
sortType = 'number',
sortValue = function(ship)
return ship.processedCargo * processedCargoTypes + ship.processedCargoCombined
end
}
p.view['Processed cargo (tons)'] = {
format = function(ship)
local pc = dv.formatNum(ship.processedCargo/1000, 't')
local pcc = dv.formatNum(ship.processedCargoCombined/1000, 't (combined)')
if nonZero(ship.processedCargo) and nonZero(ship.processedCargoCombined) then
return pc .. ' + ' .. pcc
elseif nonZero(ship.processedCargoCombined) then
return pcc
elseif nonZero(ship.processedCargo) then
return pc
end
end,
sortType = 'number',
sortValue = function(ship)
return ship.processedCargo * processedCargoTypes + ship.processedCargoCombined
end
}
p.view['High-Stress'] = dv.number{'highStress'}
p.view['Low-Stress'] = dv.number{'lowStress'}
p.view['Drone hardpoints'] = dv.number{'droneHardpoints'}
p.view['Docking bays'] = dv.number{'dockingBays'}
p.view['Crew'] = dv.number{'crew'}
p.view['Engines'] = dv.number{'engines'}
p.view['Thrusters'] = dv.number{'thrusters'}
p.view['Dry mass'] = dv.number{'dryMass', unit='kg'}
p.view['Dry mass (tons)'] = dv.number{'dryMass'/1000, unit='t'}
p.view['Cargo bay'] = dv.number{'cargoBay', unit='m^3'}
p.view['EMP shielding'] = dv.number{'empShielding', unit='MJ', omitZero=true}
p.view['New price'] = dv.number{'priceNew', unit='E$'}
p.view['Stripped hull price'] = dv.number{'hullValue', unit='E$'}
p.view['Hull Width'] = dv.number{'width', unit='m'}
p.view['Hull Length'] = dv.number{'length', unit='m'}
p.view['Min. Cargo Bay Width'] = dv.number{'minBayWidth', unit='m'}
p.view['Variant'] = dv.text{'variant'}
for k,v in pairs(p.view) do
v.heading = v.heading or k
end
p.infoboxRows = {
'Make',
'High-Stress', 'Low-Stress', 'Drone hardpoints', 'Docking bays', 'Crew',
'Dry mass', 'Cargo bay', 'Processed cargo',
'New price',
'Hull Length',
'Hull Width',
'Min. Cargo Bay Width'
}
p.infobox = function(f)
local key = mw.text.trim(f.args[1])
local data = mw.loadData('Module:Ships/Data')
data = data[key]
local cap = capiunto.create{title=p.view.Name.format(data)}
if f.args.image then
cap:addImage(f.args.image, f.args.caption)
end
for i,viewKey in ipairs(p.infoboxRows) do
local view = p.view[viewKey]
local dataPoint = view.format(data)
-- Skip zeros
if view.sortType == 'number' then
local sortValue = view.sortValue(data)
if sortValue == 0 then
dataPoint = nil
end
end
if dataPoint then
cap:addRow(view.heading, dataPoint)
end
end
return cap
end
p.defaultColumns = {
'Name',
'High-Stress', 'Low-Stress', 'Drone hardpoints', 'Docking bays', 'Crew',
'Dry mass', 'Processed cargo',
'Engines', 'EMP shielding', 'New price',
'Hull Length',
'Hull Width',
'Min. Cargo Bay Width',
'Variant'
}
p.positionalArgs = function(f)
local posArgs = {}
for i,posArg in ipairs(f.args) do
-- positional arguments don't get trimmed
table.insert(posArgs, mw.text.trim(posArg))
end
return posArgs
end
p.list = function(f)
local columns = p.positionalArgs (f)
if table.getn(columns) == 0 then
columns = p.defaultColumns
end
local data = mw.loadData('Module:Ships/Data')
data = d.sort(data, {
d.on(d.path{'baseModelData', 'hullValue'}, d.asc),
d.on(d.path{'baseModelData', 'name'}, d.asc),
d.on(d.path{'isVariant'}, d.asc),
d.on(d.path{'hullValue'}, d.asc),
d.on(d.path{'name'}, d.asc),
})
return dv.displayTable(data, p.view, columns)
end
p.variants = function(f)
local posArgs = p.positionalArgs(f)
local baseModel = table.remove(posArgs, 1)
local columns = posArgs
if table.getn(columns) == 0 then
columns = p.defaultColumns
end
local data = mw.loadData('Module:Ships/Data')
data = d.filter(data, function (ship)
return ship.baseModel == baseModel
end)
data = d.sort(data, {
d.on(d.path{'isVariant'}, d.asc),
d.on(d.path{'hullValue'}, d.asc),
d.on(d.path{'name'}, d.asc),
})
return dv.displayTable(data, p.view, columns)
end
p.minInfoboxRows = {
'Make',
'High-Stress', 'Low-Stress', 'Drone hardpoints', 'Docking bays', 'Crew',
'Dry mass (tons)', 'Cargo bay', 'Processed cargo (tons)',
'New price'
}
p.minInfobox = function(f)
local key = mw.text.trim(f.args[1])
local data = mw.loadData('Module:Ships/Data')
data = data[key]
local cap = capiunto.create{title=p.view.Name.format(data)}
if f.args.image then
cap:addImage(f.args.image, f.args.caption)
end
for i,viewKey in ipairs(p.minInfoboxRows) do
local view = p.view[viewKey]
local dataPoint = view.format(data)
-- Skip zeros
if view.sortType == 'number' then
local sortValue = view.sortValue(data)
if sortValue == 0 then
dataPoint = nil
end
end
if dataPoint then
cap:addRow(view.heading, dataPoint)
end
end
return cap
end
return p